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,321 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Status Command
|
|
3
|
+
*
|
|
4
|
+
* Displays project status including specs, tasks, and team activity
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const chalk = require('chalk');
|
|
8
|
+
const path = require('path');
|
|
9
|
+
const fs = require('fs-extra');
|
|
10
|
+
const TaskClaimer = require('../task/task-claimer');
|
|
11
|
+
const WorkspaceManager = require('../workspace/workspace-manager');
|
|
12
|
+
const DiagnosticEngine = require('../governance/diagnostic-engine');
|
|
13
|
+
const ConfigManager = require('../governance/config-manager');
|
|
14
|
+
const { LockManager } = require('../lock');
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Executes the status command
|
|
18
|
+
*
|
|
19
|
+
* @param {Object} options - Command options
|
|
20
|
+
* @param {boolean} options.verbose - Show detailed information
|
|
21
|
+
* @param {boolean} options.team - Show team activity
|
|
22
|
+
* @returns {Promise<void>}
|
|
23
|
+
*/
|
|
24
|
+
async function statusCommand(options = {}) {
|
|
25
|
+
const { verbose = false, team = false } = options;
|
|
26
|
+
const projectPath = process.cwd();
|
|
27
|
+
|
|
28
|
+
console.log(chalk.red('🔥') + ' SCE Project Status');
|
|
29
|
+
console.log();
|
|
30
|
+
|
|
31
|
+
try {
|
|
32
|
+
// 1. Check if .kiro/ exists
|
|
33
|
+
const kiroPath = path.join(projectPath, '.kiro');
|
|
34
|
+
const kiroExists = await fs.pathExists(kiroPath);
|
|
35
|
+
|
|
36
|
+
if (!kiroExists) {
|
|
37
|
+
console.log(chalk.yellow('⚠️ No .kiro/ directory found'));
|
|
38
|
+
console.log();
|
|
39
|
+
console.log('This project has not been adopted yet.');
|
|
40
|
+
console.log('Run ' + chalk.cyan('sce adopt') + ' to get started.');
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// 2. Check multi-user mode
|
|
45
|
+
const workspaceManager = new WorkspaceManager();
|
|
46
|
+
const isMultiUser = await workspaceManager.isMultiUserMode(projectPath);
|
|
47
|
+
|
|
48
|
+
console.log(chalk.blue('📊 Project Information'));
|
|
49
|
+
console.log(` Mode: ${isMultiUser ? chalk.cyan('Multi-User') : chalk.gray('Single-User')}`);
|
|
50
|
+
|
|
51
|
+
if (isMultiUser) {
|
|
52
|
+
const workspaces = await workspaceManager.listWorkspaces(projectPath);
|
|
53
|
+
console.log(` Active Users: ${chalk.cyan(workspaces.length)}`);
|
|
54
|
+
if (verbose) {
|
|
55
|
+
workspaces.forEach(username => {
|
|
56
|
+
console.log(` • ${username}`);
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
console.log();
|
|
62
|
+
|
|
63
|
+
// 3. Document compliance status
|
|
64
|
+
await displayDocumentCompliance(projectPath);
|
|
65
|
+
|
|
66
|
+
// 4. List specs
|
|
67
|
+
const specsPath = path.join(projectPath, '.kiro/specs');
|
|
68
|
+
const specsExist = await fs.pathExists(specsPath);
|
|
69
|
+
|
|
70
|
+
if (!specsExist) {
|
|
71
|
+
console.log(chalk.yellow('📁 No specs found'));
|
|
72
|
+
console.log();
|
|
73
|
+
console.log('Create your first spec: ' + chalk.cyan('sce create-spec my-feature'));
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const entries = await fs.readdir(specsPath, { withFileTypes: true });
|
|
78
|
+
const specDirs = entries.filter(entry =>
|
|
79
|
+
entry.isDirectory() && !entry.name.startsWith('.')
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
if (specDirs.length === 0) {
|
|
83
|
+
console.log(chalk.yellow('📁 No specs found'));
|
|
84
|
+
console.log();
|
|
85
|
+
console.log('Create your first spec: ' + chalk.cyan('sce create-spec my-feature'));
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
console.log(chalk.blue(`📁 Specs (${specDirs.length})`));
|
|
90
|
+
console.log();
|
|
91
|
+
|
|
92
|
+
// 5. Analyze each spec
|
|
93
|
+
const taskClaimer = new TaskClaimer();
|
|
94
|
+
const lockManager = new LockManager(projectPath);
|
|
95
|
+
const allClaimedTasks = [];
|
|
96
|
+
|
|
97
|
+
for (const specDir of specDirs) {
|
|
98
|
+
const specName = specDir.name;
|
|
99
|
+
const specPath = path.join(specsPath, specName);
|
|
100
|
+
|
|
101
|
+
// Check lock status
|
|
102
|
+
const lockStatus = await lockManager.getLockStatus(specName);
|
|
103
|
+
let lockIndicator = '';
|
|
104
|
+
if (lockStatus.locked) {
|
|
105
|
+
if (lockStatus.isOwnedByMe) {
|
|
106
|
+
lockIndicator = chalk.green(' 🔒 (you)');
|
|
107
|
+
} else if (lockStatus.isStale) {
|
|
108
|
+
lockIndicator = chalk.red(' 🔒 [STALE]');
|
|
109
|
+
} else {
|
|
110
|
+
lockIndicator = chalk.yellow(` 🔒 (${lockStatus.lock.owner})`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Check for tasks.md
|
|
115
|
+
const tasksPath = path.join(specPath, 'tasks.md');
|
|
116
|
+
const tasksExist = await fs.pathExists(tasksPath);
|
|
117
|
+
|
|
118
|
+
if (!tasksExist) {
|
|
119
|
+
console.log(chalk.gray(` ${specName}${lockIndicator}`));
|
|
120
|
+
console.log(chalk.gray(' No tasks.md found'));
|
|
121
|
+
console.log();
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Parse tasks
|
|
126
|
+
const tasks = await taskClaimer.parseTasks(tasksPath, { preferStatusMarkers: true });
|
|
127
|
+
const totalTasks = tasks.length;
|
|
128
|
+
const completedTasks = tasks.filter(t => t.status === 'completed').length;
|
|
129
|
+
const inProgressTasks = tasks.filter(t => t.status === 'in-progress').length;
|
|
130
|
+
const claimedTasks = tasks.filter(t => t.claimedBy);
|
|
131
|
+
|
|
132
|
+
// Calculate completion percentage
|
|
133
|
+
const completionPercent = totalTasks > 0
|
|
134
|
+
? Math.round((completedTasks / totalTasks) * 100)
|
|
135
|
+
: 0;
|
|
136
|
+
|
|
137
|
+
// Display spec info
|
|
138
|
+
console.log(chalk.cyan(` ${specName}${lockIndicator}`));
|
|
139
|
+
console.log(` Tasks: ${chalk.green(completedTasks)}/${totalTasks} completed (${completionPercent}%)`);
|
|
140
|
+
|
|
141
|
+
if (lockStatus.locked && verbose) {
|
|
142
|
+
console.log(` Lock: ${lockStatus.lock.owner} (${lockStatus.duration})`);
|
|
143
|
+
if (lockStatus.lock.reason) {
|
|
144
|
+
console.log(` Reason: ${lockStatus.lock.reason}`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
if (inProgressTasks > 0) {
|
|
149
|
+
console.log(` In Progress: ${chalk.yellow(inProgressTasks)}`);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
if (claimedTasks.length > 0) {
|
|
153
|
+
console.log(` Claimed: ${chalk.blue(claimedTasks.length)}`);
|
|
154
|
+
|
|
155
|
+
if (verbose || team) {
|
|
156
|
+
claimedTasks.forEach(task => {
|
|
157
|
+
const staleMarker = task.isStale ? chalk.red(' [STALE]') : '';
|
|
158
|
+
console.log(` • ${task.taskId} ${task.title}`);
|
|
159
|
+
console.log(` ${chalk.gray(`@${task.claimedBy}, ${new Date(task.claimedAt).toLocaleDateString()}`)}${staleMarker}`);
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Collect for team view
|
|
164
|
+
claimedTasks.forEach(task => {
|
|
165
|
+
allClaimedTasks.push({
|
|
166
|
+
...task,
|
|
167
|
+
specName
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
console.log();
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// 6. Team activity view
|
|
176
|
+
if (team && allClaimedTasks.length > 0) {
|
|
177
|
+
console.log(chalk.blue('👥 Team Activity'));
|
|
178
|
+
console.log();
|
|
179
|
+
|
|
180
|
+
// Group by user
|
|
181
|
+
const tasksByUser = {};
|
|
182
|
+
allClaimedTasks.forEach(task => {
|
|
183
|
+
if (!tasksByUser[task.claimedBy]) {
|
|
184
|
+
tasksByUser[task.claimedBy] = [];
|
|
185
|
+
}
|
|
186
|
+
tasksByUser[task.claimedBy].push(task);
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
// Display by user
|
|
190
|
+
Object.keys(tasksByUser).sort().forEach(username => {
|
|
191
|
+
const userTasks = tasksByUser[username];
|
|
192
|
+
const staleTasks = userTasks.filter(t => t.isStale);
|
|
193
|
+
|
|
194
|
+
console.log(chalk.cyan(` ${username}`));
|
|
195
|
+
console.log(` Active Tasks: ${userTasks.length}`);
|
|
196
|
+
|
|
197
|
+
if (staleTasks.length > 0) {
|
|
198
|
+
console.log(` ${chalk.red(`Stale Claims: ${staleTasks.length}`)}`);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
if (verbose) {
|
|
202
|
+
userTasks.forEach(task => {
|
|
203
|
+
const staleMarker = task.isStale ? chalk.red(' [STALE]') : '';
|
|
204
|
+
const statusColor = task.status === 'completed' ? chalk.green :
|
|
205
|
+
task.status === 'in-progress' ? chalk.yellow :
|
|
206
|
+
chalk.gray;
|
|
207
|
+
console.log(` • [${task.specName}] ${task.taskId} ${task.title}`);
|
|
208
|
+
console.log(` ${statusColor(task.status)} • ${chalk.gray(new Date(task.claimedAt).toLocaleDateString())}${staleMarker}`);
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
console.log();
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// 7. Summary
|
|
217
|
+
if (allClaimedTasks.length > 0) {
|
|
218
|
+
const staleClaims = allClaimedTasks.filter(t => t.isStale);
|
|
219
|
+
|
|
220
|
+
if (staleClaims.length > 0) {
|
|
221
|
+
console.log(chalk.yellow('⚠️ Warning'));
|
|
222
|
+
console.log(` ${staleClaims.length} task(s) have stale claims (>7 days old)`);
|
|
223
|
+
console.log();
|
|
224
|
+
|
|
225
|
+
if (!verbose && !team) {
|
|
226
|
+
console.log(chalk.gray(' Run with --team or --verbose to see details'));
|
|
227
|
+
console.log();
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// 8. Next steps
|
|
233
|
+
console.log(chalk.blue('💡 Commands'));
|
|
234
|
+
console.log(' View team activity: ' + chalk.cyan('sce status --team'));
|
|
235
|
+
console.log(' Detailed view: ' + chalk.cyan('sce status --verbose'));
|
|
236
|
+
console.log(' Lock a spec: ' + chalk.cyan('sce lock acquire <spec-name>'));
|
|
237
|
+
console.log(' View locks: ' + chalk.cyan('sce lock status'));
|
|
238
|
+
|
|
239
|
+
if (isMultiUser) {
|
|
240
|
+
console.log(' Claim a task: ' + chalk.cyan('sce task claim <spec-name> <task-id>'));
|
|
241
|
+
console.log(' Sync workspace: ' + chalk.cyan('sce workspace sync'));
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
} catch (error) {
|
|
245
|
+
console.log();
|
|
246
|
+
console.log(chalk.red('❌ Error:'), error.message);
|
|
247
|
+
console.log();
|
|
248
|
+
console.log(chalk.gray('If you need help, please report this issue:'));
|
|
249
|
+
console.log(chalk.cyan('https://github.com/heguangyong/scene-capability-engine/issues'));
|
|
250
|
+
process.exit(1);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Display document compliance status
|
|
256
|
+
*
|
|
257
|
+
* @param {string} projectPath - Project root path
|
|
258
|
+
* @returns {Promise<void>}
|
|
259
|
+
*/
|
|
260
|
+
async function displayDocumentCompliance(projectPath) {
|
|
261
|
+
try {
|
|
262
|
+
// Load configuration
|
|
263
|
+
const configManager = new ConfigManager(projectPath);
|
|
264
|
+
await configManager.load();
|
|
265
|
+
|
|
266
|
+
// Run diagnostic scan
|
|
267
|
+
const diagnosticEngine = new DiagnosticEngine(projectPath, configManager.config);
|
|
268
|
+
const report = await diagnosticEngine.scan();
|
|
269
|
+
|
|
270
|
+
// Display compliance status
|
|
271
|
+
console.log(chalk.blue('📄 Document Compliance'));
|
|
272
|
+
|
|
273
|
+
if (report.compliant) {
|
|
274
|
+
console.log(` Status: ${chalk.green('✅ Compliant')}`);
|
|
275
|
+
console.log(` ${chalk.gray('All documents follow lifecycle management rules')}`);
|
|
276
|
+
} else {
|
|
277
|
+
const errorCount = report.violations.filter(v => v.severity === 'error').length;
|
|
278
|
+
const warningCount = report.violations.filter(v => v.severity === 'warning').length;
|
|
279
|
+
|
|
280
|
+
console.log(` Status: ${chalk.red('❌ Non-Compliant')}`);
|
|
281
|
+
console.log(` Violations: ${chalk.red(errorCount)} error(s), ${chalk.yellow(warningCount)} warning(s)`);
|
|
282
|
+
|
|
283
|
+
// Show violation breakdown by type
|
|
284
|
+
const byType = {};
|
|
285
|
+
report.violations.forEach(v => {
|
|
286
|
+
byType[v.type] = (byType[v.type] || 0) + 1;
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
const typeNames = {
|
|
290
|
+
'root_violation': 'Root directory',
|
|
291
|
+
'spec_violation': 'Spec structure',
|
|
292
|
+
'missing_file': 'Missing files',
|
|
293
|
+
'misplaced_artifact': 'Misplaced artifacts',
|
|
294
|
+
'temporary_document': 'Temporary documents'
|
|
295
|
+
};
|
|
296
|
+
|
|
297
|
+
Object.entries(byType).forEach(([type, count]) => {
|
|
298
|
+
const name = typeNames[type] || type;
|
|
299
|
+
console.log(` • ${name}: ${count}`);
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
console.log();
|
|
303
|
+
console.log(chalk.cyan(' Quick Fix Commands:'));
|
|
304
|
+
console.log(` ${chalk.gray('•')} Run diagnostics: ${chalk.cyan('sce doctor --docs')}`);
|
|
305
|
+
console.log(` ${chalk.gray('•')} Clean temporary files: ${chalk.cyan('sce cleanup')}`);
|
|
306
|
+
console.log(` ${chalk.gray('•')} Validate structure: ${chalk.cyan('sce validate --all')}`);
|
|
307
|
+
console.log(` ${chalk.gray('•')} Archive artifacts: ${chalk.cyan('sce docs archive --spec <name>')}`);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
console.log();
|
|
311
|
+
} catch (error) {
|
|
312
|
+
// Silently skip if governance components not available
|
|
313
|
+
// This allows status to work even if governance is not fully set up
|
|
314
|
+
if (error.code !== 'MODULE_NOT_FOUND') {
|
|
315
|
+
console.log(chalk.gray(' (Document compliance check skipped)'));
|
|
316
|
+
console.log();
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
module.exports = statusCommand;
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task Command Group
|
|
3
|
+
*
|
|
4
|
+
* Manages task claiming and status updates
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const chalk = require('chalk');
|
|
8
|
+
const TaskClaimer = require('../task/task-claimer');
|
|
9
|
+
const WorkspaceManager = require('../workspace/workspace-manager');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Claim a task
|
|
13
|
+
*
|
|
14
|
+
* @param {string} specName - Spec name
|
|
15
|
+
* @param {string} taskId - Task ID
|
|
16
|
+
* @param {Object} options - Command options
|
|
17
|
+
* @param {string} options.user - Override username
|
|
18
|
+
* @param {boolean} options.force - Force claim even if already claimed
|
|
19
|
+
* @returns {Promise<void>}
|
|
20
|
+
*/
|
|
21
|
+
async function claimTask(specName, taskId, options = {}) {
|
|
22
|
+
const projectPath = process.cwd();
|
|
23
|
+
const taskClaimer = new TaskClaimer();
|
|
24
|
+
const workspaceManager = new WorkspaceManager();
|
|
25
|
+
|
|
26
|
+
console.log(chalk.red('🔥') + ' Claiming Task');
|
|
27
|
+
console.log();
|
|
28
|
+
|
|
29
|
+
try {
|
|
30
|
+
const username = options.user || await workspaceManager.detectUsername();
|
|
31
|
+
|
|
32
|
+
if (!username) {
|
|
33
|
+
console.log(chalk.red('❌ Could not detect username'));
|
|
34
|
+
console.log();
|
|
35
|
+
console.log('Please configure git or use --user flag');
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
console.log(`Spec: ${chalk.cyan(specName)}`);
|
|
40
|
+
console.log(`Task: ${chalk.cyan(taskId)}`);
|
|
41
|
+
console.log(`User: ${chalk.cyan(username)}`);
|
|
42
|
+
console.log();
|
|
43
|
+
|
|
44
|
+
const result = await taskClaimer.claimTask(
|
|
45
|
+
projectPath,
|
|
46
|
+
specName,
|
|
47
|
+
taskId,
|
|
48
|
+
username,
|
|
49
|
+
options.force
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
if (result.success) {
|
|
53
|
+
console.log(chalk.green('✅ Task claimed successfully'));
|
|
54
|
+
console.log();
|
|
55
|
+
console.log(`Task: ${result.taskTitle}`);
|
|
56
|
+
console.log(`Claimed by: ${chalk.cyan(username)}`);
|
|
57
|
+
console.log(`Claimed at: ${chalk.gray(result.claimedAt)}`);
|
|
58
|
+
|
|
59
|
+
if (result.previousClaim) {
|
|
60
|
+
console.log();
|
|
61
|
+
console.log(chalk.yellow('⚠️ Previous claim overridden:'));
|
|
62
|
+
console.log(` User: ${result.previousClaim.username}`);
|
|
63
|
+
console.log(` Time: ${result.previousClaim.timestamp}`);
|
|
64
|
+
}
|
|
65
|
+
} else {
|
|
66
|
+
console.log(chalk.red('❌ Failed to claim task'));
|
|
67
|
+
console.log();
|
|
68
|
+
console.log(`Error: ${result.error}`);
|
|
69
|
+
|
|
70
|
+
if (result.existingClaim) {
|
|
71
|
+
console.log();
|
|
72
|
+
console.log('Task is already claimed by:');
|
|
73
|
+
console.log(` User: ${chalk.cyan(result.existingClaim.username)}`);
|
|
74
|
+
console.log(` Time: ${chalk.gray(result.existingClaim.timestamp)}`);
|
|
75
|
+
console.log();
|
|
76
|
+
console.log('Use ' + chalk.cyan('--force') + ' to override the claim');
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
} catch (error) {
|
|
80
|
+
console.log(chalk.red('❌ Error:'), error.message);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Unclaim a task
|
|
86
|
+
*
|
|
87
|
+
* @param {string} specName - Spec name
|
|
88
|
+
* @param {string} taskId - Task ID
|
|
89
|
+
* @param {Object} options - Command options
|
|
90
|
+
* @param {string} options.user - Override username
|
|
91
|
+
* @returns {Promise<void>}
|
|
92
|
+
*/
|
|
93
|
+
async function unclaimTask(specName, taskId, options = {}) {
|
|
94
|
+
const projectPath = process.cwd();
|
|
95
|
+
const taskClaimer = new TaskClaimer();
|
|
96
|
+
const workspaceManager = new WorkspaceManager();
|
|
97
|
+
|
|
98
|
+
console.log(chalk.red('🔥') + ' Unclaiming Task');
|
|
99
|
+
console.log();
|
|
100
|
+
|
|
101
|
+
try {
|
|
102
|
+
const username = options.user || await workspaceManager.detectUsername();
|
|
103
|
+
|
|
104
|
+
if (!username) {
|
|
105
|
+
console.log(chalk.red('❌ Could not detect username'));
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
console.log(`Spec: ${chalk.cyan(specName)}`);
|
|
110
|
+
console.log(`Task: ${chalk.cyan(taskId)}`);
|
|
111
|
+
console.log(`User: ${chalk.cyan(username)}`);
|
|
112
|
+
console.log();
|
|
113
|
+
|
|
114
|
+
const result = await taskClaimer.unclaimTask(
|
|
115
|
+
projectPath,
|
|
116
|
+
specName,
|
|
117
|
+
taskId,
|
|
118
|
+
username
|
|
119
|
+
);
|
|
120
|
+
|
|
121
|
+
if (result.success) {
|
|
122
|
+
console.log(chalk.green('✅ Task unclaimed successfully'));
|
|
123
|
+
console.log();
|
|
124
|
+
console.log(`Task: ${result.taskTitle}`);
|
|
125
|
+
} else {
|
|
126
|
+
console.log(chalk.red('❌ Failed to unclaim task'));
|
|
127
|
+
console.log();
|
|
128
|
+
console.log(`Error: ${result.error}`);
|
|
129
|
+
}
|
|
130
|
+
} catch (error) {
|
|
131
|
+
console.log(chalk.red('❌ Error:'), error.message);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* List claimed tasks
|
|
137
|
+
*
|
|
138
|
+
* @param {string} specName - Spec name (optional)
|
|
139
|
+
* @param {Object} options - Command options
|
|
140
|
+
* @param {string} options.user - Filter by username
|
|
141
|
+
* @returns {Promise<void>}
|
|
142
|
+
*/
|
|
143
|
+
async function listClaimedTasks(specName, options = {}) {
|
|
144
|
+
const projectPath = process.cwd();
|
|
145
|
+
const taskClaimer = new TaskClaimer();
|
|
146
|
+
|
|
147
|
+
console.log(chalk.red('🔥') + ' Claimed Tasks');
|
|
148
|
+
console.log();
|
|
149
|
+
|
|
150
|
+
try {
|
|
151
|
+
if (specName) {
|
|
152
|
+
// List claimed tasks for specific spec
|
|
153
|
+
const tasks = await taskClaimer.getClaimedTasks(projectPath, specName);
|
|
154
|
+
|
|
155
|
+
if (tasks.length === 0) {
|
|
156
|
+
console.log(chalk.gray('No claimed tasks found'));
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
console.log(`Spec: ${chalk.cyan(specName)}`);
|
|
161
|
+
console.log();
|
|
162
|
+
|
|
163
|
+
// Group by user
|
|
164
|
+
const byUser = {};
|
|
165
|
+
for (const task of tasks) {
|
|
166
|
+
if (!byUser[task.claimedBy]) {
|
|
167
|
+
byUser[task.claimedBy] = [];
|
|
168
|
+
}
|
|
169
|
+
byUser[task.claimedBy].push(task);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
for (const [user, userTasks] of Object.entries(byUser)) {
|
|
173
|
+
if (options.user && user !== options.user) {
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
console.log(chalk.cyan(`${user} (${userTasks.length} task(s))`));
|
|
178
|
+
for (const task of userTasks) {
|
|
179
|
+
const staleMarker = task.isStale ? chalk.yellow(' [STALE]') : '';
|
|
180
|
+
console.log(` ${chalk.gray('•')} ${task.taskId} ${task.taskTitle}${staleMarker}`);
|
|
181
|
+
console.log(` ${chalk.gray(task.claimedAt)}`);
|
|
182
|
+
}
|
|
183
|
+
console.log();
|
|
184
|
+
}
|
|
185
|
+
} else {
|
|
186
|
+
console.log(chalk.gray('Please specify a spec name'));
|
|
187
|
+
console.log();
|
|
188
|
+
console.log('Usage: ' + chalk.cyan('kse task list <spec-name>'));
|
|
189
|
+
}
|
|
190
|
+
} catch (error) {
|
|
191
|
+
console.log(chalk.red('❌ Error:'), error.message);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
module.exports = {
|
|
196
|
+
claimTask,
|
|
197
|
+
unclaimTask,
|
|
198
|
+
listClaimedTasks
|
|
199
|
+
};
|