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.
Files changed (336) hide show
  1. package/CHANGELOG.md +2513 -0
  2. package/LICENSE +21 -0
  3. package/README.md +765 -0
  4. package/README.zh.md +630 -0
  5. package/bin/kiro-spec-engine.js +796 -0
  6. package/bin/kse.js +3 -0
  7. package/bin/sce.js +3 -0
  8. package/bin/sco.js +3 -0
  9. package/docs/331-poc-adaptation-roadmap.md +156 -0
  10. package/docs/331-poc-dual-track-integration-guide.md +120 -0
  11. package/docs/331-poc-weekly-delivery-checklist.md +52 -0
  12. package/docs/OFFLINE_INSTALL.md +96 -0
  13. package/docs/README.md +279 -0
  14. package/docs/adopt-migration-guide.md +599 -0
  15. package/docs/adoption-guide.md +616 -0
  16. package/docs/agent-hooks-analysis.md +815 -0
  17. package/docs/architecture.md +733 -0
  18. package/docs/articles/ai-driven-development-philosophy-and-practice-review.md +208 -0
  19. package/docs/articles/ai-driven-development-philosophy-and-practice.en.md +459 -0
  20. package/docs/articles/ai-driven-development-philosophy-and-practice.md +492 -0
  21. package/docs/autonomous-control-guide.md +851 -0
  22. package/docs/command-reference.md +1368 -0
  23. package/docs/community.md +115 -0
  24. package/docs/cross-tool-guide.md +555 -0
  25. package/docs/developer-guide.md +619 -0
  26. package/docs/document-governance.md +865 -0
  27. package/docs/environment-management-guide.md +526 -0
  28. package/docs/examples/add-export-command/design.md +194 -0
  29. package/docs/examples/add-export-command/requirements.md +110 -0
  30. package/docs/examples/add-export-command/tasks.md +88 -0
  31. package/docs/examples/add-rest-api/design.md +855 -0
  32. package/docs/examples/add-rest-api/requirements.md +323 -0
  33. package/docs/examples/add-rest-api/tasks.md +355 -0
  34. package/docs/examples/add-user-dashboard/design.md +192 -0
  35. package/docs/examples/add-user-dashboard/requirements.md +143 -0
  36. package/docs/examples/add-user-dashboard/tasks.md +91 -0
  37. package/docs/faq.md +697 -0
  38. package/docs/handoffs/evidence/ontology/moqui-template-baseline-2026-02-17-232922.json +156 -0
  39. package/docs/handoffs/evidence/ontology/moqui-template-baseline-2026-02-17-232922.md +24 -0
  40. package/docs/images/wechat-qr.png +0 -0
  41. package/docs/integration-modes.md +529 -0
  42. package/docs/integration-philosophy.md +313 -0
  43. package/docs/knowledge-management-guide.md +263 -0
  44. package/docs/manual-workflows-guide.md +418 -0
  45. package/docs/moqui-capability-matrix.md +73 -0
  46. package/docs/moqui-template-core-library-playbook.md +109 -0
  47. package/docs/multi-agent-coordination-guide.md +553 -0
  48. package/docs/multi-repo-management-guide.md +1344 -0
  49. package/docs/quick-start-with-ai-tools.md +375 -0
  50. package/docs/quick-start.md +146 -0
  51. package/docs/release-checklist.md +121 -0
  52. package/docs/releases/README.md +13 -0
  53. package/docs/releases/v1.46.2-validation.md +45 -0
  54. package/docs/releases/v1.46.2.md +50 -0
  55. package/docs/scene-runtime-guide.md +347 -0
  56. package/docs/spec-collaboration-guide.md +369 -0
  57. package/docs/spec-locking-guide.md +225 -0
  58. package/docs/spec-numbering-guide.md +348 -0
  59. package/docs/spec-workflow.md +519 -0
  60. package/docs/steering-strategy-guide.md +196 -0
  61. package/docs/team-collaboration-guide.md +465 -0
  62. package/docs/testing-strategy.md +272 -0
  63. package/docs/tools/claude-guide.md +654 -0
  64. package/docs/tools/cursor-guide.md +706 -0
  65. package/docs/tools/generic-guide.md +446 -0
  66. package/docs/tools/kiro-guide.md +308 -0
  67. package/docs/tools/vscode-guide.md +445 -0
  68. package/docs/tools/windsurf-guide.md +391 -0
  69. package/docs/troubleshooting.md +1135 -0
  70. package/docs/upgrade-guide.md +639 -0
  71. package/docs/value-observability-guide.md +127 -0
  72. package/docs/zh/README.md +341 -0
  73. package/docs/zh/quick-start.md +764 -0
  74. package/docs/zh/release-checklist.md +121 -0
  75. package/docs/zh/releases/README.md +13 -0
  76. package/docs/zh/releases/v1.46.2-validation.md +45 -0
  77. package/docs/zh/releases/v1.46.2.md +50 -0
  78. package/docs/zh/spec-numbering-guide.md +348 -0
  79. package/docs/zh/tools/claude-guide.md +349 -0
  80. package/docs/zh/tools/cursor-guide.md +281 -0
  81. package/docs/zh/tools/generic-guide.md +499 -0
  82. package/docs/zh/tools/kiro-guide.md +342 -0
  83. package/docs/zh/tools/vscode-guide.md +449 -0
  84. package/docs/zh/tools/windsurf-guide.md +378 -0
  85. package/docs/zh/value-observability-guide.md +127 -0
  86. package/docs//344/272/244/344/273/230/346/270/205/345/215/225.md +75 -0
  87. package/lib/adoption/adoption-logger.js +487 -0
  88. package/lib/adoption/adoption-strategy.js +538 -0
  89. package/lib/adoption/backup-manager.js +420 -0
  90. package/lib/adoption/conflict-resolver.js +410 -0
  91. package/lib/adoption/detection-engine.js +275 -0
  92. package/lib/adoption/diff-viewer.js +226 -0
  93. package/lib/adoption/error-formatter.js +509 -0
  94. package/lib/adoption/file-classifier.js +385 -0
  95. package/lib/adoption/progress-reporter.js +534 -0
  96. package/lib/adoption/smart-orchestrator.js +470 -0
  97. package/lib/adoption/strategy-selector.js +218 -0
  98. package/lib/adoption/summary-generator.js +493 -0
  99. package/lib/adoption/template-sync.js +605 -0
  100. package/lib/auto/autonomous-engine.js +485 -0
  101. package/lib/auto/checkpoint-manager.js +300 -0
  102. package/lib/auto/close-loop-runner.js +2476 -0
  103. package/lib/auto/config-schema.js +176 -0
  104. package/lib/auto/decision-engine.js +344 -0
  105. package/lib/auto/error-recovery-manager.js +580 -0
  106. package/lib/auto/goal-decomposer.js +278 -0
  107. package/lib/auto/progress-tracker.js +502 -0
  108. package/lib/auto/safety-manager.js +186 -0
  109. package/lib/auto/semantic-decomposer.js +137 -0
  110. package/lib/auto/state-manager.js +126 -0
  111. package/lib/auto/task-queue-manager.js +340 -0
  112. package/lib/backup/backup-system.js +372 -0
  113. package/lib/backup/selective-backup.js +207 -0
  114. package/lib/collab/agent-registry.js +240 -0
  115. package/lib/collab/collab-manager.js +285 -0
  116. package/lib/collab/contract-manager.js +320 -0
  117. package/lib/collab/coordinator.js +370 -0
  118. package/lib/collab/dependency-manager.js +280 -0
  119. package/lib/collab/index.js +20 -0
  120. package/lib/collab/integration-manager.js +202 -0
  121. package/lib/collab/merge-coordinator.js +252 -0
  122. package/lib/collab/metadata-manager.js +233 -0
  123. package/lib/collab/multi-agent-config.js +120 -0
  124. package/lib/collab/spec-lifecycle-manager.js +304 -0
  125. package/lib/collab/sync-barrier.js +88 -0
  126. package/lib/collab/visualizer.js +208 -0
  127. package/lib/commands/adopt.js +749 -0
  128. package/lib/commands/auto.js +19559 -0
  129. package/lib/commands/collab.js +275 -0
  130. package/lib/commands/context.js +99 -0
  131. package/lib/commands/docs.js +808 -0
  132. package/lib/commands/doctor.js +273 -0
  133. package/lib/commands/env.js +420 -0
  134. package/lib/commands/knowledge.js +309 -0
  135. package/lib/commands/lock.js +235 -0
  136. package/lib/commands/ops.js +409 -0
  137. package/lib/commands/orchestrate.js +446 -0
  138. package/lib/commands/prompt.js +105 -0
  139. package/lib/commands/repo.js +118 -0
  140. package/lib/commands/rollback.js +219 -0
  141. package/lib/commands/scene.js +15549 -0
  142. package/lib/commands/spec-bootstrap.js +147 -0
  143. package/lib/commands/spec-gate.js +157 -0
  144. package/lib/commands/spec-pipeline.js +205 -0
  145. package/lib/commands/status.js +321 -0
  146. package/lib/commands/task.js +199 -0
  147. package/lib/commands/templates.js +654 -0
  148. package/lib/commands/upgrade.js +231 -0
  149. package/lib/commands/value.js +569 -0
  150. package/lib/commands/watch.js +684 -0
  151. package/lib/commands/workflows.js +240 -0
  152. package/lib/commands/workspace-multi.js +325 -0
  153. package/lib/commands/workspace.js +189 -0
  154. package/lib/context/context-exporter.js +378 -0
  155. package/lib/context/prompt-generator.js +482 -0
  156. package/lib/data/moqui-capability-lexicon.json +45 -0
  157. package/lib/environment/backup-system.js +189 -0
  158. package/lib/environment/environment-manager.js +379 -0
  159. package/lib/environment/environment-registry.js +168 -0
  160. package/lib/gitignore/gitignore-backup.js +229 -0
  161. package/lib/gitignore/gitignore-detector.js +239 -0
  162. package/lib/gitignore/gitignore-integration.js +267 -0
  163. package/lib/gitignore/gitignore-transformer.js +193 -0
  164. package/lib/gitignore/layered-rules-template.js +42 -0
  165. package/lib/governance/archive-tool.js +284 -0
  166. package/lib/governance/cleanup-tool.js +237 -0
  167. package/lib/governance/config-manager.js +186 -0
  168. package/lib/governance/diagnostic-engine.js +271 -0
  169. package/lib/governance/doc-reference-checker.js +200 -0
  170. package/lib/governance/execution-logger.js +243 -0
  171. package/lib/governance/file-scanner.js +285 -0
  172. package/lib/governance/hooks-manager.js +333 -0
  173. package/lib/governance/reporter.js +337 -0
  174. package/lib/governance/validation-engine.js +181 -0
  175. package/lib/i18n.js +79 -0
  176. package/lib/knowledge/entry-manager.js +208 -0
  177. package/lib/knowledge/index-manager.js +261 -0
  178. package/lib/knowledge/knowledge-manager.js +273 -0
  179. package/lib/knowledge/template-manager.js +191 -0
  180. package/lib/lock/index.js +21 -0
  181. package/lib/lock/lock-file.js +192 -0
  182. package/lib/lock/lock-manager.js +321 -0
  183. package/lib/lock/machine-identifier.js +135 -0
  184. package/lib/lock/steering-file-lock.js +207 -0
  185. package/lib/lock/task-lock-manager.js +345 -0
  186. package/lib/operations/audit-logger.js +293 -0
  187. package/lib/operations/feedback-manager.js +1147 -0
  188. package/lib/operations/index.js +23 -0
  189. package/lib/operations/models/index.js +170 -0
  190. package/lib/operations/operations-manager.js +151 -0
  191. package/lib/operations/operations-validator.js +280 -0
  192. package/lib/operations/permission-manager.js +354 -0
  193. package/lib/operations/template-loader.js +143 -0
  194. package/lib/orchestrator/agent-spawner.js +629 -0
  195. package/lib/orchestrator/bootstrap-prompt-builder.js +236 -0
  196. package/lib/orchestrator/index.js +19 -0
  197. package/lib/orchestrator/orchestration-engine.js +1270 -0
  198. package/lib/orchestrator/orchestrator-config.js +173 -0
  199. package/lib/orchestrator/status-monitor.js +591 -0
  200. package/lib/python-checker.js +209 -0
  201. package/lib/repo/config-manager.js +580 -0
  202. package/lib/repo/errors/config-error.js +13 -0
  203. package/lib/repo/errors/git-error.js +15 -0
  204. package/lib/repo/errors/repo-error.js +14 -0
  205. package/lib/repo/git-operations.js +181 -0
  206. package/lib/repo/handlers/.gitkeep +1 -0
  207. package/lib/repo/handlers/exec-handler.js +155 -0
  208. package/lib/repo/handlers/health-handler.js +169 -0
  209. package/lib/repo/handlers/init-handler.js +197 -0
  210. package/lib/repo/handlers/status-handler.js +176 -0
  211. package/lib/repo/output-formatter.js +184 -0
  212. package/lib/repo/path-resolver.js +178 -0
  213. package/lib/repo/repo-manager.js +514 -0
  214. package/lib/scene-runtime/audit-emitter.js +59 -0
  215. package/lib/scene-runtime/binding-plugin-loader.js +351 -0
  216. package/lib/scene-runtime/binding-registry.js +349 -0
  217. package/lib/scene-runtime/eval-bridge.js +44 -0
  218. package/lib/scene-runtime/index.js +19 -0
  219. package/lib/scene-runtime/moqui-adapter.js +620 -0
  220. package/lib/scene-runtime/moqui-client.js +606 -0
  221. package/lib/scene-runtime/moqui-extractor.js +2029 -0
  222. package/lib/scene-runtime/plan-compiler.js +208 -0
  223. package/lib/scene-runtime/policy-gate.js +58 -0
  224. package/lib/scene-runtime/runtime-executor.js +358 -0
  225. package/lib/scene-runtime/scene-loader.js +96 -0
  226. package/lib/scene-runtime/scene-ontology.js +959 -0
  227. package/lib/scene-runtime/scene-template-linter.js +852 -0
  228. package/lib/scene-runtime/templates/scene-template-erp-query-v0.1.yaml +28 -0
  229. package/lib/scene-runtime/templates/scene-template-hybrid-shadow-v0.1.yaml +34 -0
  230. package/lib/spec/bootstrap/context-collector.js +48 -0
  231. package/lib/spec/bootstrap/draft-generator.js +158 -0
  232. package/lib/spec/bootstrap/questionnaire-engine.js +70 -0
  233. package/lib/spec/bootstrap/trace-emitter.js +59 -0
  234. package/lib/spec/multi-spec-orchestrate.js +93 -0
  235. package/lib/spec/pipeline/constants.js +6 -0
  236. package/lib/spec/pipeline/stage-adapters.js +118 -0
  237. package/lib/spec/pipeline/stage-runner.js +146 -0
  238. package/lib/spec/pipeline/state-store.js +119 -0
  239. package/lib/spec-gate/engine/gate-engine.js +165 -0
  240. package/lib/spec-gate/policy/default-policy.js +22 -0
  241. package/lib/spec-gate/policy/policy-loader.js +103 -0
  242. package/lib/spec-gate/result-emitter.js +81 -0
  243. package/lib/spec-gate/rules/default-rules.js +156 -0
  244. package/lib/spec-gate/rules/rule-registry.js +51 -0
  245. package/lib/steering/adoption-config.js +164 -0
  246. package/lib/steering/compliance-auto-fixer.js +204 -0
  247. package/lib/steering/compliance-cache.js +99 -0
  248. package/lib/steering/compliance-error-reporter.js +70 -0
  249. package/lib/steering/context-sync-manager.js +273 -0
  250. package/lib/steering/index.js +92 -0
  251. package/lib/steering/spec-steering.js +230 -0
  252. package/lib/steering/steering-compliance-checker.js +73 -0
  253. package/lib/steering/steering-loader.js +144 -0
  254. package/lib/steering/steering-manager.js +289 -0
  255. package/lib/task/index.js +12 -0
  256. package/lib/task/task-claimer.js +489 -0
  257. package/lib/task/task-status-store.js +418 -0
  258. package/lib/templates/cache-manager.js +440 -0
  259. package/lib/templates/content-generalizer.js +247 -0
  260. package/lib/templates/frontmatter-generator.js +128 -0
  261. package/lib/templates/git-handler.js +471 -0
  262. package/lib/templates/metadata-collector.js +328 -0
  263. package/lib/templates/path-utils.js +144 -0
  264. package/lib/templates/registry-parser.js +505 -0
  265. package/lib/templates/spec-reader.js +216 -0
  266. package/lib/templates/template-applicator.js +249 -0
  267. package/lib/templates/template-creator.js +256 -0
  268. package/lib/templates/template-error.js +143 -0
  269. package/lib/templates/template-exporter.js +502 -0
  270. package/lib/templates/template-manager.js +782 -0
  271. package/lib/templates/template-validator.js +361 -0
  272. package/lib/upgrade/migration-engine.js +382 -0
  273. package/lib/upgrade/migrations/.gitkeep +52 -0
  274. package/lib/upgrade/migrations/1.0.0-to-1.1.0.js +78 -0
  275. package/lib/utils/file-diff.js +177 -0
  276. package/lib/utils/fs-utils.js +274 -0
  277. package/lib/utils/tool-detector.js +383 -0
  278. package/lib/utils/validation.js +324 -0
  279. package/lib/value/gate-summary-emitter.js +99 -0
  280. package/lib/value/metric-contract-loader.js +210 -0
  281. package/lib/value/risk-evaluator.js +117 -0
  282. package/lib/value/weekly-snapshot-builder.js +61 -0
  283. package/lib/version/version-checker.js +156 -0
  284. package/lib/version/version-manager.js +327 -0
  285. package/lib/watch/action-executor.js +458 -0
  286. package/lib/watch/event-debouncer.js +323 -0
  287. package/lib/watch/execution-logger.js +550 -0
  288. package/lib/watch/file-watcher.js +499 -0
  289. package/lib/watch/presets.js +266 -0
  290. package/lib/watch/watch-manager.js +533 -0
  291. package/lib/workspace/multi/global-config.js +150 -0
  292. package/lib/workspace/multi/index.js +22 -0
  293. package/lib/workspace/multi/path-utils.js +173 -0
  294. package/lib/workspace/multi/workspace-context-resolver.js +244 -0
  295. package/lib/workspace/multi/workspace-registry.js +196 -0
  296. package/lib/workspace/multi/workspace-state-manager.js +537 -0
  297. package/lib/workspace/multi/workspace.js +90 -0
  298. package/lib/workspace/workspace-manager.js +370 -0
  299. package/lib/workspace/workspace-sync.js +356 -0
  300. package/locales/en.json +114 -0
  301. package/locales/zh.json +114 -0
  302. package/package.json +102 -0
  303. package/template/.kiro/README.md +247 -0
  304. package/template/.kiro/hooks/check-spec-on-create.kiro.hook +17 -0
  305. package/template/.kiro/hooks/run-tests-on-save.kiro.hook +13 -0
  306. package/template/.kiro/hooks/sync-tasks-on-edit.kiro.hook +16 -0
  307. package/template/.kiro/specs/SPEC_WORKFLOW_GUIDE.md +134 -0
  308. package/template/.kiro/steering/CORE_PRINCIPLES.md +133 -0
  309. package/template/.kiro/steering/CURRENT_CONTEXT.md +30 -0
  310. package/template/.kiro/steering/ENVIRONMENT.md +35 -0
  311. package/template/.kiro/steering/RULES_GUIDE.md +46 -0
  312. package/template/.kiro/templates/operations/default/change-impact.md +112 -0
  313. package/template/.kiro/templates/operations/default/deployment.md +91 -0
  314. package/template/.kiro/templates/operations/default/feedback-response.md +269 -0
  315. package/template/.kiro/templates/operations/default/migration-plan.md +172 -0
  316. package/template/.kiro/templates/operations/default/monitoring.md +135 -0
  317. package/template/.kiro/templates/operations/default/operations.md +135 -0
  318. package/template/.kiro/templates/operations/default/rollback.md +143 -0
  319. package/template/.kiro/templates/operations/default/tools.yaml +364 -0
  320. package/template/.kiro/templates/operations/default/troubleshooting.md +123 -0
  321. package/template/.kiro/tools/backup_manager.py +295 -0
  322. package/template/.kiro/tools/configuration_manager.py +218 -0
  323. package/template/.kiro/tools/document_evaluator.py +550 -0
  324. package/template/.kiro/tools/enhancement_logger.py +168 -0
  325. package/template/.kiro/tools/error_handler.py +335 -0
  326. package/template/.kiro/tools/improvement_identifier.py +444 -0
  327. package/template/.kiro/tools/modification_applicator.py +737 -0
  328. package/template/.kiro/tools/quality_gate_enforcer.py +207 -0
  329. package/template/.kiro/tools/quality_scorer.py +305 -0
  330. package/template/.kiro/tools/report_generator.py +154 -0
  331. package/template/.kiro/tools/ultrawork_enhancer.py +676 -0
  332. package/template/.kiro/tools/ultrawork_enhancer_refactored.py +0 -0
  333. package/template/.kiro/tools/ultrawork_enhancer_v2.py +463 -0
  334. package/template/.kiro/tools/ultrawork_enhancer_v3.py +606 -0
  335. package/template/.kiro/tools/workflow_quality_gate.py +100 -0
  336. 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
+ };