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,267 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitignoreIntegration - Integrates .gitignore auto-fix with adopt/upgrade flows
|
|
3
|
+
*
|
|
4
|
+
* Coordinates detection, backup, transformation, and reporting for .gitignore fixes.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const fs = require('fs-extra');
|
|
8
|
+
const path = require('path');
|
|
9
|
+
const chalk = require('chalk');
|
|
10
|
+
const GitignoreDetector = require('./gitignore-detector');
|
|
11
|
+
const GitignoreTransformer = require('./gitignore-transformer');
|
|
12
|
+
const GitignoreBackup = require('./gitignore-backup');
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @typedef {Object} GitignoreFixResult
|
|
16
|
+
* @property {boolean} success - Fix succeeded
|
|
17
|
+
* @property {string} action - 'created' | 'updated' | 'skipped'
|
|
18
|
+
* @property {string} backupId - Backup ID (if created)
|
|
19
|
+
* @property {string[]} added - Rules added
|
|
20
|
+
* @property {string[]} removed - Rules removed
|
|
21
|
+
* @property {string} message - User-friendly message
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
class GitignoreIntegration {
|
|
25
|
+
constructor(dependencies = {}) {
|
|
26
|
+
this.detector = dependencies.detector || new GitignoreDetector();
|
|
27
|
+
this.transformer = dependencies.transformer || new GitignoreTransformer();
|
|
28
|
+
this.backup = dependencies.backup || new GitignoreBackup();
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Runs .gitignore check and fix
|
|
33
|
+
*
|
|
34
|
+
* @param {string} projectPath - Project root path
|
|
35
|
+
* @param {Object} options - Integration options
|
|
36
|
+
* @param {boolean} options.skipBackup - Skip backup creation (dangerous)
|
|
37
|
+
* @param {boolean} options.dryRun - Preview without executing
|
|
38
|
+
* @returns {Promise<GitignoreFixResult>}
|
|
39
|
+
*/
|
|
40
|
+
async checkAndFix(projectPath, options = {}) {
|
|
41
|
+
const { skipBackup = false, dryRun = false } = options;
|
|
42
|
+
|
|
43
|
+
try {
|
|
44
|
+
// Stage 1: Detect .gitignore status
|
|
45
|
+
const status = await this.detector.analyzeGitignore(projectPath);
|
|
46
|
+
|
|
47
|
+
// If compliant, no action needed
|
|
48
|
+
if (status.strategy === 'skip') {
|
|
49
|
+
return {
|
|
50
|
+
success: true,
|
|
51
|
+
action: 'skipped',
|
|
52
|
+
backupId: null,
|
|
53
|
+
added: [],
|
|
54
|
+
removed: [],
|
|
55
|
+
message: '.gitignore already optimal'
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Stage 2: Transform content
|
|
60
|
+
const transformResult = this.transformer.transform(status.content, status);
|
|
61
|
+
|
|
62
|
+
// Dry run mode - stop here
|
|
63
|
+
if (dryRun) {
|
|
64
|
+
return {
|
|
65
|
+
success: true,
|
|
66
|
+
action: status.strategy === 'add' ? 'would-create' : 'would-update',
|
|
67
|
+
backupId: null,
|
|
68
|
+
added: transformResult.added,
|
|
69
|
+
removed: transformResult.removed,
|
|
70
|
+
message: 'Dry run - no changes made'
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Stage 3: Create backup (if file exists and not skipped)
|
|
75
|
+
let backupId = null;
|
|
76
|
+
if (status.exists && !skipBackup) {
|
|
77
|
+
const backupInfo = await this.backup.createBackup(projectPath);
|
|
78
|
+
backupId = backupInfo.id;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Stage 4: Write new .gitignore
|
|
82
|
+
const gitignorePath = path.join(projectPath, '.gitignore');
|
|
83
|
+
await fs.writeFile(gitignorePath, transformResult.content, 'utf8');
|
|
84
|
+
|
|
85
|
+
// Stage 5: Return result
|
|
86
|
+
return {
|
|
87
|
+
success: true,
|
|
88
|
+
action: status.strategy === 'add' ? 'created' : 'updated',
|
|
89
|
+
backupId,
|
|
90
|
+
added: transformResult.added,
|
|
91
|
+
removed: transformResult.removed,
|
|
92
|
+
message: this.generateSuccessMessage(status, backupId)
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
} catch (error) {
|
|
96
|
+
return {
|
|
97
|
+
success: false,
|
|
98
|
+
action: 'failed',
|
|
99
|
+
backupId: null,
|
|
100
|
+
added: [],
|
|
101
|
+
removed: [],
|
|
102
|
+
message: `Failed to fix .gitignore: ${error.message}`
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Integrates with adoption flow
|
|
109
|
+
*
|
|
110
|
+
* @param {string} projectPath - Project root path
|
|
111
|
+
* @returns {Promise<GitignoreFixResult>}
|
|
112
|
+
*/
|
|
113
|
+
async integrateWithAdopt(projectPath) {
|
|
114
|
+
return await this.checkAndFix(projectPath);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Integrates with upgrade flow
|
|
119
|
+
*
|
|
120
|
+
* @param {string} projectPath - Project root path
|
|
121
|
+
* @returns {Promise<GitignoreFixResult>}
|
|
122
|
+
*/
|
|
123
|
+
async integrateWithUpgrade(projectPath) {
|
|
124
|
+
return await this.checkAndFix(projectPath);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Standalone doctor command
|
|
129
|
+
*
|
|
130
|
+
* @param {string} projectPath - Project root path
|
|
131
|
+
* @returns {Promise<GitignoreFixResult>}
|
|
132
|
+
*/
|
|
133
|
+
async runDoctor(projectPath) {
|
|
134
|
+
console.log(chalk.blue('🔍 Checking .gitignore configuration...'));
|
|
135
|
+
console.log();
|
|
136
|
+
|
|
137
|
+
const result = await this.checkAndFix(projectPath);
|
|
138
|
+
|
|
139
|
+
// Display detailed result
|
|
140
|
+
this.displayDoctorResult(result);
|
|
141
|
+
|
|
142
|
+
return result;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Generates success message
|
|
147
|
+
*
|
|
148
|
+
* @param {Object} status - Detection status
|
|
149
|
+
* @param {string} backupId - Backup ID
|
|
150
|
+
* @returns {string}
|
|
151
|
+
*/
|
|
152
|
+
generateSuccessMessage(status, backupId) {
|
|
153
|
+
if (status.strategy === 'add') {
|
|
154
|
+
return '.gitignore created with layered strategy';
|
|
155
|
+
} else if (status.strategy === 'update') {
|
|
156
|
+
return `.gitignore updated for team collaboration${backupId ? ` (backup: ${backupId})` : ''}`;
|
|
157
|
+
}
|
|
158
|
+
return '.gitignore already optimal';
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Displays doctor command result
|
|
163
|
+
*
|
|
164
|
+
* @param {GitignoreFixResult} result - Fix result
|
|
165
|
+
*/
|
|
166
|
+
displayDoctorResult(result) {
|
|
167
|
+
if (result.action === 'skipped') {
|
|
168
|
+
console.log(chalk.green('✅ .gitignore is already optimal'));
|
|
169
|
+
console.log();
|
|
170
|
+
console.log(chalk.gray(' Current strategy: Layered .kiro/ management'));
|
|
171
|
+
console.log(chalk.gray(' - Specs are committable'));
|
|
172
|
+
console.log(chalk.gray(' - Personal state is excluded'));
|
|
173
|
+
console.log();
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
if (!result.success) {
|
|
178
|
+
console.log(chalk.red('❌ Failed to fix .gitignore'));
|
|
179
|
+
console.log();
|
|
180
|
+
console.log(chalk.red(` ${result.message}`));
|
|
181
|
+
console.log();
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
console.log(chalk.green(`✅ .gitignore ${result.action}`));
|
|
186
|
+
console.log();
|
|
187
|
+
|
|
188
|
+
if (result.backupId) {
|
|
189
|
+
console.log(chalk.blue('📦 Backup created:'), result.backupId);
|
|
190
|
+
console.log(chalk.gray(' Location:'), `.kiro/backups/${result.backupId}`);
|
|
191
|
+
console.log();
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
if (result.removed.length > 0) {
|
|
195
|
+
console.log(chalk.yellow('Removed old patterns:'));
|
|
196
|
+
result.removed.forEach(pattern => {
|
|
197
|
+
console.log(chalk.red(` - ${pattern}`));
|
|
198
|
+
});
|
|
199
|
+
console.log();
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
if (result.added.length > 0) {
|
|
203
|
+
console.log(chalk.green('Added layered rules:'));
|
|
204
|
+
console.log(chalk.gray(` + ${result.added.length} exclusion rules`));
|
|
205
|
+
console.log();
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
console.log(chalk.blue('💡 What this means:'));
|
|
209
|
+
console.log(' ✅ Spec documents are now committable');
|
|
210
|
+
console.log(' ✅ Team can see requirements, design, and tasks');
|
|
211
|
+
console.log(' ✅ Personal state is excluded (no merge conflicts)');
|
|
212
|
+
console.log();
|
|
213
|
+
|
|
214
|
+
console.log(chalk.gray(' Learn more:'), chalk.cyan('docs/team-collaboration-guide.md'));
|
|
215
|
+
|
|
216
|
+
if (result.backupId) {
|
|
217
|
+
console.log();
|
|
218
|
+
console.log(chalk.gray(' To rollback:'), chalk.cyan(`kse doctor --restore-gitignore ${result.backupId}`));
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
console.log();
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Displays integration result (for adopt/upgrade flows)
|
|
226
|
+
*
|
|
227
|
+
* @param {GitignoreFixResult} result - Fix result
|
|
228
|
+
*/
|
|
229
|
+
displayIntegrationResult(result) {
|
|
230
|
+
if (result.action === 'skipped') {
|
|
231
|
+
return; // No output for compliant .gitignore
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
if (!result.success) {
|
|
235
|
+
console.log(chalk.yellow('⚠️ .gitignore fix failed:'), result.message);
|
|
236
|
+
console.log(chalk.gray(' Run'), chalk.cyan('kse doctor --fix-gitignore'), chalk.gray('to fix manually'));
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
console.log(chalk.blue('📝 .gitignore updated for team collaboration'));
|
|
241
|
+
|
|
242
|
+
if (result.backupId) {
|
|
243
|
+
console.log(chalk.gray(' Backup:'), result.backupId);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
if (result.removed.length > 0) {
|
|
247
|
+
console.log(chalk.gray(' Changes:'));
|
|
248
|
+
console.log(chalk.yellow(` - Removed ${result.removed.length} old pattern(s)`));
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
console.log(chalk.green(' + Added layered .kiro/ exclusion rules'));
|
|
252
|
+
console.log(chalk.green(' + Specs are now committable'));
|
|
253
|
+
console.log(chalk.green(' + Personal state is excluded'));
|
|
254
|
+
console.log();
|
|
255
|
+
|
|
256
|
+
console.log(chalk.blue('💡 Why this matters:'));
|
|
257
|
+
console.log(' - Team can see Spec documents (requirements, design, tasks)');
|
|
258
|
+
console.log(' - No merge conflicts on personal state');
|
|
259
|
+
console.log(' - Follows best practices for team collaboration');
|
|
260
|
+
console.log();
|
|
261
|
+
|
|
262
|
+
console.log(chalk.gray(' Learn more:'), chalk.cyan('docs/team-collaboration-guide.md'));
|
|
263
|
+
console.log();
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
module.exports = GitignoreIntegration;
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitignoreTransformer - Transforms .gitignore to use layered strategy
|
|
3
|
+
*
|
|
4
|
+
* Removes old blanket exclusion patterns and adds layered exclusion rules
|
|
5
|
+
* while preserving user customizations.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const LAYERED_RULES_TEMPLATE = require('./layered-rules-template');
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @typedef {Object} TransformResult
|
|
12
|
+
* @property {string} content - New .gitignore content
|
|
13
|
+
* @property {string[]} added - Rules added
|
|
14
|
+
* @property {string[]} removed - Rules removed
|
|
15
|
+
* @property {string[]} preserved - User rules preserved
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
class GitignoreTransformer {
|
|
19
|
+
constructor() {
|
|
20
|
+
// Old patterns to remove
|
|
21
|
+
this.OLD_PATTERNS = [
|
|
22
|
+
/^\.kiro\/?\s*$/,
|
|
23
|
+
/^\.kiro\/\*\s*$/,
|
|
24
|
+
/^\.kiro\/\*\*\s*$/
|
|
25
|
+
];
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Applies layered strategy to .gitignore
|
|
30
|
+
*
|
|
31
|
+
* @param {string} currentContent - Current .gitignore content (or empty)
|
|
32
|
+
* @param {Object} status - Detection status
|
|
33
|
+
* @returns {TransformResult}
|
|
34
|
+
*/
|
|
35
|
+
transform(currentContent, status) {
|
|
36
|
+
const result = {
|
|
37
|
+
content: '',
|
|
38
|
+
added: [],
|
|
39
|
+
removed: [],
|
|
40
|
+
preserved: []
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
if (status.strategy === 'skip') {
|
|
44
|
+
// Already compliant, no changes needed
|
|
45
|
+
result.content = currentContent;
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (status.strategy === 'add') {
|
|
50
|
+
// Missing .gitignore, create new one
|
|
51
|
+
result.content = LAYERED_RULES_TEMPLATE;
|
|
52
|
+
result.added = this.extractRulePatterns(LAYERED_RULES_TEMPLATE);
|
|
53
|
+
return result;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (status.strategy === 'update') {
|
|
57
|
+
// Remove old patterns and add layered rules
|
|
58
|
+
const cleaned = this.removeOldPatterns(currentContent, result);
|
|
59
|
+
result.content = this.addLayeredRules(cleaned);
|
|
60
|
+
result.added = this.extractRulePatterns(LAYERED_RULES_TEMPLATE);
|
|
61
|
+
|
|
62
|
+
// Track preserved rules
|
|
63
|
+
const lines = currentContent.split(/\r?\n/);
|
|
64
|
+
lines.forEach(line => {
|
|
65
|
+
const trimmed = line.trim();
|
|
66
|
+
if (trimmed && !trimmed.startsWith('#') && !this.isOldPattern(trimmed)) {
|
|
67
|
+
if (!trimmed.includes('.kiro')) {
|
|
68
|
+
result.preserved.push(trimmed);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return result;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Removes old blanket exclusion patterns
|
|
79
|
+
*
|
|
80
|
+
* @param {string} content - .gitignore content
|
|
81
|
+
* @param {TransformResult} result - Result object to track removed patterns
|
|
82
|
+
* @returns {string} - Content with old patterns removed
|
|
83
|
+
*/
|
|
84
|
+
removeOldPatterns(content, result) {
|
|
85
|
+
// Detect line ending style
|
|
86
|
+
const lineEnding = content.includes('\r\n') ? '\r\n' : '\n';
|
|
87
|
+
|
|
88
|
+
const lines = content.split(/\r?\n/);
|
|
89
|
+
const filtered = [];
|
|
90
|
+
let inManagedSection = false;
|
|
91
|
+
|
|
92
|
+
for (const line of lines) {
|
|
93
|
+
const trimmed = line.trim();
|
|
94
|
+
|
|
95
|
+
// Track kse-managed section
|
|
96
|
+
if (trimmed.includes('kse - DO NOT EDIT THIS SECTION')) {
|
|
97
|
+
inManagedSection = true;
|
|
98
|
+
continue; // Skip managed section start
|
|
99
|
+
} else if (trimmed.includes('End of kse-managed section')) {
|
|
100
|
+
inManagedSection = false;
|
|
101
|
+
continue; // Skip managed section end
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Skip lines in managed section
|
|
105
|
+
if (inManagedSection) {
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Check if line is old pattern
|
|
110
|
+
if (this.isOldPattern(trimmed)) {
|
|
111
|
+
result.removed.push(trimmed);
|
|
112
|
+
continue; // Skip old pattern
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Preserve line
|
|
116
|
+
filtered.push(line);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
return filtered.join(lineEnding);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Checks if pattern is an old blanket exclusion
|
|
124
|
+
*
|
|
125
|
+
* @param {string} pattern - Pattern to check
|
|
126
|
+
* @returns {boolean}
|
|
127
|
+
*/
|
|
128
|
+
isOldPattern(pattern) {
|
|
129
|
+
for (const regex of this.OLD_PATTERNS) {
|
|
130
|
+
if (regex.test(pattern)) {
|
|
131
|
+
return true;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Adds layered exclusion rules
|
|
139
|
+
*
|
|
140
|
+
* @param {string} content - .gitignore content
|
|
141
|
+
* @returns {string} - Content with layered rules added
|
|
142
|
+
*/
|
|
143
|
+
addLayeredRules(content) {
|
|
144
|
+
// Detect line ending style from existing content
|
|
145
|
+
const lineEnding = content.includes('\r\n') ? '\r\n' : '\n';
|
|
146
|
+
|
|
147
|
+
// Ensure content ends with newline
|
|
148
|
+
let result = content.trim();
|
|
149
|
+
|
|
150
|
+
if (result) {
|
|
151
|
+
result += lineEnding + lineEnding;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Convert template to match line ending style
|
|
155
|
+
const template = LAYERED_RULES_TEMPLATE.replace(/\n/g, lineEnding);
|
|
156
|
+
|
|
157
|
+
// Add layered rules section
|
|
158
|
+
result += template;
|
|
159
|
+
|
|
160
|
+
return result;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Generates layered rules section
|
|
165
|
+
*
|
|
166
|
+
* @returns {string}
|
|
167
|
+
*/
|
|
168
|
+
generateLayeredSection() {
|
|
169
|
+
return LAYERED_RULES_TEMPLATE;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Extracts rule patterns from template (for reporting)
|
|
174
|
+
*
|
|
175
|
+
* @param {string} template - Template content
|
|
176
|
+
* @returns {string[]} - Rule patterns
|
|
177
|
+
*/
|
|
178
|
+
extractRulePatterns(template) {
|
|
179
|
+
const lines = template.split(/\r?\n/);
|
|
180
|
+
const patterns = [];
|
|
181
|
+
|
|
182
|
+
for (const line of lines) {
|
|
183
|
+
const trimmed = line.trim();
|
|
184
|
+
if (trimmed && !trimmed.startsWith('#') && !trimmed.startsWith('=')) {
|
|
185
|
+
patterns.push(trimmed);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
return patterns;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
module.exports = GitignoreTransformer;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layered .gitignore rules template
|
|
3
|
+
*
|
|
4
|
+
* This template defines the layered strategy for .kiro/ directory:
|
|
5
|
+
* - Commit Specs and shared content
|
|
6
|
+
* - Exclude personal state and temporary files
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
const LAYERED_RULES_TEMPLATE = `# ========================================
|
|
10
|
+
# .kiro/ Directory - Layered Management
|
|
11
|
+
# ========================================
|
|
12
|
+
# Generated by kse - DO NOT EDIT THIS SECTION
|
|
13
|
+
# See: docs/team-collaboration-guide.md
|
|
14
|
+
|
|
15
|
+
# Personal state files (DO NOT commit)
|
|
16
|
+
.kiro/steering/CURRENT_CONTEXT.md
|
|
17
|
+
.kiro/contexts/.active
|
|
18
|
+
.kiro/contexts/*/CURRENT_CONTEXT.md
|
|
19
|
+
|
|
20
|
+
# Environment configuration (DO NOT commit)
|
|
21
|
+
.kiro/environments.json
|
|
22
|
+
.kiro/env-backups/
|
|
23
|
+
|
|
24
|
+
# Temporary files and backups (DO NOT commit)
|
|
25
|
+
.kiro/backups/
|
|
26
|
+
.kiro/logs/
|
|
27
|
+
.kiro/reports/
|
|
28
|
+
|
|
29
|
+
# Spec artifacts (COMMIT - but exclude temporary files)
|
|
30
|
+
.kiro/specs/**/SESSION-*.md
|
|
31
|
+
.kiro/specs/**/*-SUMMARY.md
|
|
32
|
+
.kiro/specs/**/*-COMPLETE.md
|
|
33
|
+
.kiro/specs/**/TEMP-*.md
|
|
34
|
+
.kiro/specs/**/WIP-*.md
|
|
35
|
+
.kiro/specs/**/MVP-*.md
|
|
36
|
+
|
|
37
|
+
# ========================================
|
|
38
|
+
# End of kse-managed section
|
|
39
|
+
# ========================================
|
|
40
|
+
`;
|
|
41
|
+
|
|
42
|
+
module.exports = LAYERED_RULES_TEMPLATE;
|