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,385 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File Classifier
|
|
3
|
+
*
|
|
4
|
+
* Automatically classifies files for smart conflict resolution.
|
|
5
|
+
* Determines file categories based on path patterns to apply
|
|
6
|
+
* appropriate resolution strategies.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
const path = require('path');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* File categories for classification
|
|
13
|
+
*/
|
|
14
|
+
const FileCategory = {
|
|
15
|
+
TEMPLATE: 'template', // steering/, tools/, README.md
|
|
16
|
+
USER_CONTENT: 'user-content', // specs/, custom files
|
|
17
|
+
CONFIG: 'config', // version.json, adoption-config.json
|
|
18
|
+
GENERATED: 'generated' // backups/, logs/, node_modules/
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Resolution actions for each category
|
|
23
|
+
*/
|
|
24
|
+
const ResolutionAction = {
|
|
25
|
+
PRESERVE: 'preserve', // Keep existing file
|
|
26
|
+
UPDATE: 'update', // Backup + update to latest
|
|
27
|
+
MERGE: 'merge', // Backup + merge changes
|
|
28
|
+
SKIP: 'skip' // Skip (regenerate if needed)
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* File Classifier
|
|
33
|
+
*
|
|
34
|
+
* Classifies files based on path patterns and applies
|
|
35
|
+
* appropriate resolution rules.
|
|
36
|
+
*/
|
|
37
|
+
class FileClassifier {
|
|
38
|
+
constructor() {
|
|
39
|
+
// Template file patterns (relative to .kiro/)
|
|
40
|
+
this.templatePatterns = [
|
|
41
|
+
'steering/CORE_PRINCIPLES.md',
|
|
42
|
+
'steering/ENVIRONMENT.md',
|
|
43
|
+
'steering/RULES_GUIDE.md',
|
|
44
|
+
'tools/ultrawork_enhancer.py',
|
|
45
|
+
'README.md',
|
|
46
|
+
'ultrawork-application-guide.md',
|
|
47
|
+
'ultrawork-integration-summary.md',
|
|
48
|
+
'sisyphus-deep-dive.md'
|
|
49
|
+
];
|
|
50
|
+
|
|
51
|
+
// Template directory patterns
|
|
52
|
+
this.templateDirs = [
|
|
53
|
+
'steering',
|
|
54
|
+
'tools'
|
|
55
|
+
];
|
|
56
|
+
|
|
57
|
+
// User content directory patterns
|
|
58
|
+
this.userContentDirs = [
|
|
59
|
+
'specs'
|
|
60
|
+
];
|
|
61
|
+
|
|
62
|
+
// Config file patterns
|
|
63
|
+
this.configPatterns = [
|
|
64
|
+
'version.json',
|
|
65
|
+
'adoption-config.json'
|
|
66
|
+
];
|
|
67
|
+
|
|
68
|
+
// Generated directory patterns
|
|
69
|
+
this.generatedDirs = [
|
|
70
|
+
'backups',
|
|
71
|
+
'logs',
|
|
72
|
+
'node_modules',
|
|
73
|
+
'.git'
|
|
74
|
+
];
|
|
75
|
+
|
|
76
|
+
// Special cases that always preserve
|
|
77
|
+
this.alwaysPreserve = [
|
|
78
|
+
'steering/CURRENT_CONTEXT.md'
|
|
79
|
+
];
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Classify a file based on its path
|
|
84
|
+
*
|
|
85
|
+
* @param {string} filePath - File path relative to .kiro/
|
|
86
|
+
* @returns {string} FileCategory
|
|
87
|
+
*/
|
|
88
|
+
classifyFile(filePath) {
|
|
89
|
+
// Normalize path separators
|
|
90
|
+
const normalizedPath = this.normalizePath(filePath);
|
|
91
|
+
|
|
92
|
+
// Check special cases first (always preserve)
|
|
93
|
+
if (this.isAlwaysPreserve(normalizedPath)) {
|
|
94
|
+
return FileCategory.USER_CONTENT;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Check if it's a generated file/directory
|
|
98
|
+
if (this.isGenerated(normalizedPath)) {
|
|
99
|
+
return FileCategory.GENERATED;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Check if it's a config file
|
|
103
|
+
if (this.isConfig(normalizedPath)) {
|
|
104
|
+
return FileCategory.CONFIG;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Check if it's user content
|
|
108
|
+
if (this.isUserContent(normalizedPath)) {
|
|
109
|
+
return FileCategory.USER_CONTENT;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Check if it's a template file
|
|
113
|
+
if (this.isTemplate(normalizedPath)) {
|
|
114
|
+
return FileCategory.TEMPLATE;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Default: treat unknown files as user content (safer)
|
|
118
|
+
return FileCategory.USER_CONTENT;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Get resolution rule for a file
|
|
123
|
+
*
|
|
124
|
+
* @param {string} filePath - File path relative to .kiro/
|
|
125
|
+
* @returns {Object} Resolution rule
|
|
126
|
+
*/
|
|
127
|
+
getResolutionRule(filePath) {
|
|
128
|
+
const category = this.classifyFile(filePath);
|
|
129
|
+
const normalizedPath = this.normalizePath(filePath);
|
|
130
|
+
|
|
131
|
+
// Special case: CURRENT_CONTEXT.md always preserve
|
|
132
|
+
if (this.isAlwaysPreserve(normalizedPath)) {
|
|
133
|
+
return {
|
|
134
|
+
category: FileCategory.USER_CONTENT,
|
|
135
|
+
action: ResolutionAction.PRESERVE,
|
|
136
|
+
requiresBackup: false,
|
|
137
|
+
reason: 'User-specific context file'
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
switch (category) {
|
|
142
|
+
case FileCategory.TEMPLATE:
|
|
143
|
+
return {
|
|
144
|
+
category,
|
|
145
|
+
action: ResolutionAction.UPDATE,
|
|
146
|
+
requiresBackup: true,
|
|
147
|
+
reason: 'Template file should be updated to latest version'
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
case FileCategory.USER_CONTENT:
|
|
151
|
+
return {
|
|
152
|
+
category,
|
|
153
|
+
action: ResolutionAction.PRESERVE,
|
|
154
|
+
requiresBackup: false,
|
|
155
|
+
reason: 'User content should always be preserved'
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
case FileCategory.CONFIG:
|
|
159
|
+
return {
|
|
160
|
+
category,
|
|
161
|
+
action: ResolutionAction.MERGE,
|
|
162
|
+
requiresBackup: true,
|
|
163
|
+
reason: 'Config file should be merged with updates'
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
case FileCategory.GENERATED:
|
|
167
|
+
return {
|
|
168
|
+
category,
|
|
169
|
+
action: ResolutionAction.SKIP,
|
|
170
|
+
requiresBackup: false,
|
|
171
|
+
reason: 'Generated file can be recreated'
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
default:
|
|
175
|
+
// Fallback: preserve unknown files
|
|
176
|
+
return {
|
|
177
|
+
category: FileCategory.USER_CONTENT,
|
|
178
|
+
action: ResolutionAction.PRESERVE,
|
|
179
|
+
requiresBackup: false,
|
|
180
|
+
reason: 'Unknown file type, preserving for safety'
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Check if file should always be preserved
|
|
187
|
+
*
|
|
188
|
+
* @param {string} normalizedPath - Normalized file path
|
|
189
|
+
* @returns {boolean}
|
|
190
|
+
*/
|
|
191
|
+
isAlwaysPreserve(normalizedPath) {
|
|
192
|
+
return this.alwaysPreserve.some(pattern =>
|
|
193
|
+
normalizedPath === pattern || normalizedPath.endsWith('/' + pattern)
|
|
194
|
+
);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Check if file is a template
|
|
199
|
+
*
|
|
200
|
+
* @param {string} normalizedPath - Normalized file path
|
|
201
|
+
* @returns {boolean}
|
|
202
|
+
*/
|
|
203
|
+
isTemplate(normalizedPath) {
|
|
204
|
+
// Check exact template file patterns
|
|
205
|
+
if (this.templatePatterns.some(pattern =>
|
|
206
|
+
normalizedPath === pattern || normalizedPath.endsWith('/' + pattern)
|
|
207
|
+
)) {
|
|
208
|
+
return true;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// Check if file is in a template directory
|
|
212
|
+
const parts = normalizedPath.split('/');
|
|
213
|
+
if (parts.length > 0) {
|
|
214
|
+
const firstDir = parts[0];
|
|
215
|
+
if (this.templateDirs.includes(firstDir)) {
|
|
216
|
+
return true;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
return false;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Check if file is user content
|
|
225
|
+
*
|
|
226
|
+
* @param {string} normalizedPath - Normalized file path
|
|
227
|
+
* @returns {boolean}
|
|
228
|
+
*/
|
|
229
|
+
isUserContent(normalizedPath) {
|
|
230
|
+
const parts = normalizedPath.split('/');
|
|
231
|
+
if (parts.length > 0) {
|
|
232
|
+
const firstDir = parts[0];
|
|
233
|
+
if (this.userContentDirs.includes(firstDir)) {
|
|
234
|
+
return true;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// Files not in any known directory are treated as user content
|
|
239
|
+
return false;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Check if file is a config file
|
|
244
|
+
*
|
|
245
|
+
* @param {string} normalizedPath - Normalized file path
|
|
246
|
+
* @returns {boolean}
|
|
247
|
+
*/
|
|
248
|
+
isConfig(normalizedPath) {
|
|
249
|
+
return this.configPatterns.some(pattern =>
|
|
250
|
+
normalizedPath === pattern || normalizedPath.endsWith('/' + pattern)
|
|
251
|
+
);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Check if file is generated
|
|
256
|
+
*
|
|
257
|
+
* @param {string} normalizedPath - Normalized file path
|
|
258
|
+
* @returns {boolean}
|
|
259
|
+
*/
|
|
260
|
+
isGenerated(normalizedPath) {
|
|
261
|
+
const parts = normalizedPath.split('/');
|
|
262
|
+
if (parts.length > 0) {
|
|
263
|
+
const firstDir = parts[0];
|
|
264
|
+
if (this.generatedDirs.includes(firstDir)) {
|
|
265
|
+
return true;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
return false;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Normalize path separators to forward slashes
|
|
274
|
+
*
|
|
275
|
+
* @param {string} filePath - File path
|
|
276
|
+
* @returns {string} Normalized path
|
|
277
|
+
*/
|
|
278
|
+
normalizePath(filePath) {
|
|
279
|
+
if (!filePath) {
|
|
280
|
+
return '';
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
// Convert backslashes to forward slashes
|
|
284
|
+
let normalized = filePath.replace(/\\/g, '/');
|
|
285
|
+
|
|
286
|
+
// Remove leading .kiro/ if present
|
|
287
|
+
if (normalized.startsWith('.kiro/')) {
|
|
288
|
+
normalized = normalized.substring(6);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// Remove leading slash
|
|
292
|
+
if (normalized.startsWith('/')) {
|
|
293
|
+
normalized = normalized.substring(1);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
return normalized;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* Classify multiple files at once
|
|
301
|
+
*
|
|
302
|
+
* @param {string[]} filePaths - Array of file paths
|
|
303
|
+
* @returns {Object} Map of file paths to categories
|
|
304
|
+
*/
|
|
305
|
+
classifyFiles(filePaths) {
|
|
306
|
+
const result = {};
|
|
307
|
+
|
|
308
|
+
for (const filePath of filePaths) {
|
|
309
|
+
result[filePath] = this.classifyFile(filePath);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
return result;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* Get resolution rules for multiple files
|
|
317
|
+
*
|
|
318
|
+
* @param {string[]} filePaths - Array of file paths
|
|
319
|
+
* @returns {Object} Map of file paths to resolution rules
|
|
320
|
+
*/
|
|
321
|
+
getResolutionRules(filePaths) {
|
|
322
|
+
const result = {};
|
|
323
|
+
|
|
324
|
+
for (const filePath of filePaths) {
|
|
325
|
+
result[filePath] = this.getResolutionRule(filePath);
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
return result;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* Get files by category
|
|
333
|
+
*
|
|
334
|
+
* @param {string[]} filePaths - Array of file paths
|
|
335
|
+
* @param {string} category - FileCategory to filter by
|
|
336
|
+
* @returns {string[]} Files matching the category
|
|
337
|
+
*/
|
|
338
|
+
getFilesByCategory(filePaths, category) {
|
|
339
|
+
return filePaths.filter(filePath =>
|
|
340
|
+
this.classifyFile(filePath) === category
|
|
341
|
+
);
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
/**
|
|
345
|
+
* Get files by action
|
|
346
|
+
*
|
|
347
|
+
* @param {string[]} filePaths - Array of file paths
|
|
348
|
+
* @param {string} action - ResolutionAction to filter by
|
|
349
|
+
* @returns {string[]} Files matching the action
|
|
350
|
+
*/
|
|
351
|
+
getFilesByAction(filePaths, action) {
|
|
352
|
+
return filePaths.filter(filePath => {
|
|
353
|
+
const rule = this.getResolutionRule(filePath);
|
|
354
|
+
return rule.action === action;
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
/**
|
|
359
|
+
* Check if file requires backup
|
|
360
|
+
*
|
|
361
|
+
* @param {string} filePath - File path
|
|
362
|
+
* @returns {boolean}
|
|
363
|
+
*/
|
|
364
|
+
requiresBackup(filePath) {
|
|
365
|
+
const rule = this.getResolutionRule(filePath);
|
|
366
|
+
return rule.requiresBackup;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
/**
|
|
370
|
+
* Get all files that require backup
|
|
371
|
+
*
|
|
372
|
+
* @param {string[]} filePaths - Array of file paths
|
|
373
|
+
* @returns {string[]} Files that require backup
|
|
374
|
+
*/
|
|
375
|
+
getFilesRequiringBackup(filePaths) {
|
|
376
|
+
return filePaths.filter(filePath => this.requiresBackup(filePath));
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
// Export classes and constants
|
|
381
|
+
module.exports = {
|
|
382
|
+
FileClassifier,
|
|
383
|
+
FileCategory,
|
|
384
|
+
ResolutionAction
|
|
385
|
+
};
|