cc-devflow 1.0.1

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 (277) hide show
  1. package/.claude/CLAUDE.md +83 -0
  2. package/.claude/agents/architecture-designer.md +443 -0
  3. package/.claude/agents/bug-analyzer.md +382 -0
  4. package/.claude/agents/checklist-agent.md +175 -0
  5. package/.claude/agents/clarify-analyst.md +50 -0
  6. package/.claude/agents/code-reviewer.md +71 -0
  7. package/.claude/agents/codex-analyzer.md +39 -0
  8. package/.claude/agents/compatibility-checker.md +580 -0
  9. package/.claude/agents/consistency-checker.md +532 -0
  10. package/.claude/agents/impact-analyzer.md +441 -0
  11. package/.claude/agents/planner.md +230 -0
  12. package/.claude/agents/prd-writer.md +320 -0
  13. package/.claude/agents/project-guidelines-generator.md +1329 -0
  14. package/.claude/agents/qa-tester.md +313 -0
  15. package/.claude/agents/release-manager.md +295 -0
  16. package/.claude/agents/security-reviewer.md +314 -0
  17. package/.claude/agents/style-guide-generator.md +458 -0
  18. package/.claude/agents/tech-architect.md +516 -0
  19. package/.claude/agents/ui-designer.md +485 -0
  20. package/.claude/commands/code-review-high.md +58 -0
  21. package/.claude/commands/core-architecture.md +429 -0
  22. package/.claude/commands/core-guidelines.md +486 -0
  23. package/.claude/commands/core-roadmap.md +439 -0
  24. package/.claude/commands/core-style.md +293 -0
  25. package/.claude/commands/flow-archive.md +245 -0
  26. package/.claude/commands/flow-checklist.md +260 -0
  27. package/.claude/commands/flow-clarify.md +136 -0
  28. package/.claude/commands/flow-constitution.md +82 -0
  29. package/.claude/commands/flow-dev.md +134 -0
  30. package/.claude/commands/flow-epic.md +150 -0
  31. package/.claude/commands/flow-fix.md +104 -0
  32. package/.claude/commands/flow-ideate.md +214 -0
  33. package/.claude/commands/flow-init.md +313 -0
  34. package/.claude/commands/flow-new.md +394 -0
  35. package/.claude/commands/flow-prd.md +131 -0
  36. package/.claude/commands/flow-qa.md +93 -0
  37. package/.claude/commands/flow-release.md +92 -0
  38. package/.claude/commands/flow-restart.md +98 -0
  39. package/.claude/commands/flow-status.md +64 -0
  40. package/.claude/commands/flow-tech.md +142 -0
  41. package/.claude/commands/flow-ui.md +189 -0
  42. package/.claude/commands/flow-update.md +111 -0
  43. package/.claude/commands/flow-upgrade.md +115 -0
  44. package/.claude/commands/flow-verify.md +96 -0
  45. package/.claude/commands/problem-analyzer.md +60 -0
  46. package/.claude/config/quality-rules.yml +161 -0
  47. package/.claude/docs/SPEC_KIT_CONSTITUTION_ANALYSIS.md +426 -0
  48. package/.claude/docs/design/consistency-conflict-detection-algorithms.md +658 -0
  49. package/.claude/docs/design/intent-driven-input-design.md +380 -0
  50. package/.claude/docs/design/prd-version-management-design.md +437 -0
  51. package/.claude/docs/guides/INIT_TROUBLESHOOTING.md +117 -0
  52. package/.claude/docs/guides/NEW_TROUBLESHOOTING.md +151 -0
  53. package/.claude/docs/guides/ROADMAP_TROUBLESHOOTING.md +188 -0
  54. package/.claude/docs/guides/TASK_COMPLETION_MARKING.md +338 -0
  55. package/.claude/docs/templates/ARCHITECTURE_TEMPLATE.md +633 -0
  56. package/.claude/docs/templates/BACKLOG_TEMPLATE.md +261 -0
  57. package/.claude/docs/templates/CHECKLIST_TEMPLATE.md +52 -0
  58. package/.claude/docs/templates/CLARIFICATION_REPORT_TEMPLATE.md +206 -0
  59. package/.claude/docs/templates/CODE_REVIEW_TEMPLATE.md +71 -0
  60. package/.claude/docs/templates/EPIC_TEMPLATE.md +805 -0
  61. package/.claude/docs/templates/INIT_FLOW_TEMPLATE.md +213 -0
  62. package/.claude/docs/templates/INTENT_CLARIFICATION_TEMPLATE.md +57 -0
  63. package/.claude/docs/templates/NEW_ORCHESTRATION_TEMPLATE.md +148 -0
  64. package/.claude/docs/templates/PRD_TEMPLATE.md +562 -0
  65. package/.claude/docs/templates/RESEARCH_TEMPLATE.md +276 -0
  66. package/.claude/docs/templates/REVIEW-HIGH.md +57 -0
  67. package/.claude/docs/templates/ROADMAP_DIALOGUE_TEMPLATE.md +198 -0
  68. package/.claude/docs/templates/ROADMAP_TEMPLATE.md +310 -0
  69. package/.claude/docs/templates/STYLE_TEMPLATE.md +1266 -0
  70. package/.claude/docs/templates/TASKS_TEMPLATE.md +523 -0
  71. package/.claude/docs/templates/TECH_DESIGN_TEMPLATE.md +1019 -0
  72. package/.claude/docs/templates/UI_PROTOTYPE_TEMPLATE.md +1436 -0
  73. package/.claude/guides/agent-guides/agent-coordination-guide.md +459 -0
  74. package/.claude/guides/project-guidelines-system.md +463 -0
  75. package/.claude/guides/technical-guides/datetime-handling-guide.md +563 -0
  76. package/.claude/guides/technical-guides/git-github-guide.md +642 -0
  77. package/.claude/guides/technical-guides/test-execution-guide.md +618 -0
  78. package/.claude/guides/workflow-guides/bug-fix-orchestrator.md +217 -0
  79. package/.claude/guides/workflow-guides/flow-orchestrator.md +282 -0
  80. package/.claude/hooks/checklist-gate.js +397 -0
  81. package/.claude/hooks/error-handling-reminder.sh +12 -0
  82. package/.claude/hooks/error-handling-reminder.ts +459 -0
  83. package/.claude/hooks/post-tool-use-tracker.sh +280 -0
  84. package/.claude/hooks/pre-tool-use-guardrail.sh +36 -0
  85. package/.claude/hooks/pre-tool-use-guardrail.ts +342 -0
  86. package/.claude/hooks/skill-activation-prompt.sh +36 -0
  87. package/.claude/hooks/skill-activation-prompt.ts +214 -0
  88. package/.claude/hooks/state/skills-used-test-guard.json +3 -0
  89. package/.claude/rules/devflow-conventions.md +305 -0
  90. package/.claude/rules/project-constitution.md +748 -0
  91. package/.claude/schemas/constitution.schema.json +43 -0
  92. package/.claude/scripts/analyze-upgrade-impact.sh +200 -0
  93. package/.claude/scripts/archive-requirement.sh +351 -0
  94. package/.claude/scripts/calculate-checklist-completion.sh +243 -0
  95. package/.claude/scripts/calculate-quarter.sh +206 -0
  96. package/.claude/scripts/check-dependencies.sh +409 -0
  97. package/.claude/scripts/check-prerequisites.sh +232 -0
  98. package/.claude/scripts/check-task-status.sh +264 -0
  99. package/.claude/scripts/checklist-errors.sh +131 -0
  100. package/.claude/scripts/common.sh +570 -0
  101. package/.claude/scripts/consolidate-research.sh +182 -0
  102. package/.claude/scripts/create-requirement.sh +426 -0
  103. package/.claude/scripts/export-contracts.sh +117 -0
  104. package/.claude/scripts/extract-data-model.sh +78 -0
  105. package/.claude/scripts/generate-clarification-questions.sh +377 -0
  106. package/.claude/scripts/generate-clarification-report.sh +463 -0
  107. package/.claude/scripts/generate-quickstart.sh +146 -0
  108. package/.claude/scripts/generate-research-tasks.sh +157 -0
  109. package/.claude/scripts/generate-status-report.sh +523 -0
  110. package/.claude/scripts/generate-tech-analysis.sh +46 -0
  111. package/.claude/scripts/locate-requirement-in-roadmap.sh +233 -0
  112. package/.claude/scripts/manage-constitution.sh +602 -0
  113. package/.claude/scripts/mark-task-complete.sh +198 -0
  114. package/.claude/scripts/populate-research-tasks.sh +259 -0
  115. package/.claude/scripts/recover-workflow.sh +460 -0
  116. package/.claude/scripts/run-clarify-scan.sh +601 -0
  117. package/.claude/scripts/run-high-review.sh +62 -0
  118. package/.claude/scripts/run-problem-analysis.sh +68 -0
  119. package/.claude/scripts/setup-epic.sh +173 -0
  120. package/.claude/scripts/sync-roadmap-progress.sh +300 -0
  121. package/.claude/scripts/sync-task-marks.sh +199 -0
  122. package/.claude/scripts/test-clarify-scan.sh +515 -0
  123. package/.claude/scripts/update-agent-context.sh +806 -0
  124. package/.claude/scripts/validate-constitution.sh +567 -0
  125. package/.claude/scripts/validate-hooks.sh +487 -0
  126. package/.claude/scripts/validate-research.sh +332 -0
  127. package/.claude/scripts/validate-scope-boundary.sh +493 -0
  128. package/.claude/scripts/verify-setup.sh +37 -0
  129. package/.claude/settings.json +76 -0
  130. package/.claude/skills/_reference-implementations/README.md +96 -0
  131. package/.claude/skills/_reference-implementations/backend-express-prisma/SKILL.md +302 -0
  132. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/architecture-overview.md +451 -0
  133. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/async-and-errors.md +307 -0
  134. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/complete-examples.md +638 -0
  135. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/configuration.md +275 -0
  136. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/database-patterns.md +224 -0
  137. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/middleware-guide.md +213 -0
  138. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/routing-and-controllers.md +756 -0
  139. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/sentry-and-monitoring.md +336 -0
  140. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/services-and-repositories.md +789 -0
  141. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/testing-guide.md +235 -0
  142. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/validation-patterns.md +754 -0
  143. package/.claude/skills/_reference-implementations/frontend-react-mui/SKILL.md +399 -0
  144. package/.claude/skills/_reference-implementations/frontend-react-mui/resources/common-patterns.md +331 -0
  145. package/.claude/skills/_reference-implementations/frontend-react-mui/resources/complete-examples.md +872 -0
  146. package/.claude/skills/_reference-implementations/frontend-react-mui/resources/component-patterns.md +502 -0
  147. package/.claude/skills/_reference-implementations/frontend-react-mui/resources/data-fetching.md +767 -0
  148. package/.claude/skills/_reference-implementations/frontend-react-mui/resources/file-organization.md +502 -0
  149. package/.claude/skills/_reference-implementations/frontend-react-mui/resources/loading-and-error-states.md +501 -0
  150. package/.claude/skills/_reference-implementations/frontend-react-mui/resources/performance.md +406 -0
  151. package/.claude/skills/_reference-implementations/frontend-react-mui/resources/routing-guide.md +364 -0
  152. package/.claude/skills/_reference-implementations/frontend-react-mui/resources/styling-guide.md +428 -0
  153. package/.claude/skills/_reference-implementations/frontend-react-mui/resources/typescript-standards.md +418 -0
  154. package/.claude/skills/cc-devflow-orchestrator/SKILL.md +229 -0
  155. package/.claude/skills/constitution-guardian/SKILL.md +306 -0
  156. package/.claude/skills/devflow-constitution-quick-ref/SKILL.md +374 -0
  157. package/.claude/skills/devflow-file-standards/SKILL.md +353 -0
  158. package/.claude/skills/devflow-tdd-enforcer/SKILL.md +192 -0
  159. package/.claude/skills/skill-developer/ADVANCED.md +197 -0
  160. package/.claude/skills/skill-developer/HOOK_MECHANISMS.md +306 -0
  161. package/.claude/skills/skill-developer/PATTERNS_LIBRARY.md +152 -0
  162. package/.claude/skills/skill-developer/SKILL.md +426 -0
  163. package/.claude/skills/skill-developer/SKILL_RULES_REFERENCE.md +315 -0
  164. package/.claude/skills/skill-developer/TRIGGER_TYPES.md +305 -0
  165. package/.claude/skills/skill-developer/TROUBLESHOOTING.md +514 -0
  166. package/.claude/skills/skill-rules.json +213 -0
  167. package/.claude/tests/README.md +300 -0
  168. package/.claude/tests/TODO.md +69 -0
  169. package/.claude/tests/__pycache__/test_analyze_upgrade_impact.cpython-311-pytest-7.2.2.pyc +0 -0
  170. package/.claude/tests/__pycache__/test_consolidate_research.cpython-311-pytest-7.2.2.pyc +0 -0
  171. package/.claude/tests/__pycache__/test_export_contracts.cpython-311-pytest-7.2.2.pyc +0 -0
  172. package/.claude/tests/__pycache__/test_extract_data_model.cpython-311-pytest-7.2.2.pyc +0 -0
  173. package/.claude/tests/__pycache__/test_generate_quickstart.cpython-311-pytest-7.2.2.pyc +0 -0
  174. package/.claude/tests/__pycache__/test_generate_research_tasks.cpython-311-pytest-7.2.2.pyc +0 -0
  175. package/.claude/tests/constitution/run_all_constitution_tests.sh +111 -0
  176. package/.claude/tests/constitution/test_agent_assignment.sh +207 -0
  177. package/.claude/tests/constitution/test_article_coverage.sh +201 -0
  178. package/.claude/tests/constitution/test_template_completeness.sh +150 -0
  179. package/.claude/tests/constitution/test_version_consistency.sh +120 -0
  180. package/.claude/tests/fixtures/spec_delta_full.md +16 -0
  181. package/.claude/tests/fixtures/tasks_progress_sample.md +5 -0
  182. package/.claude/tests/run-all-tests.sh +229 -0
  183. package/.claude/tests/scripts/run.sh +30 -0
  184. package/.claude/tests/scripts/test-framework.sh +128 -0
  185. package/.claude/tests/scripts/test_check_prerequisites.sh +511 -0
  186. package/.claude/tests/scripts/test_check_prerequisites.sh.bak +504 -0
  187. package/.claude/tests/scripts/test_check_prerequisites.sh.bak2 +505 -0
  188. package/.claude/tests/scripts/test_check_prerequisites.sh.bak3 +506 -0
  189. package/.claude/tests/scripts/test_check_prerequisites.sh.bak4 +507 -0
  190. package/.claude/tests/scripts/test_check_prerequisites.sh.bak5 +508 -0
  191. package/.claude/tests/scripts/test_check_task_status.sh +499 -0
  192. package/.claude/tests/scripts/test_common.sh +244 -0
  193. package/.claude/tests/scripts/test_generate_status_report.sh +71 -0
  194. package/.claude/tests/scripts/test_mark_task_complete.sh +441 -0
  195. package/.claude/tests/scripts/test_mark_task_complete.sh.backup +410 -0
  196. package/.claude/tests/scripts/test_recover_workflow.sh +304 -0
  197. package/.claude/tests/scripts/test_setup_epic.sh +437 -0
  198. package/.claude/tests/scripts/test_sync_task_marks.sh +196 -0
  199. package/.claude/tests/scripts/test_validate_constitution.sh +74 -0
  200. package/.claude/tests/scripts/test_validate_research.sh +462 -0
  201. package/.claude/tests/slugify.bats +82 -0
  202. package/.claude/tests/test-framework.sh +732 -0
  203. package/.claude/tests/test_analyze_upgrade_impact.py +34 -0
  204. package/.claude/tests/test_consolidate_research.py +48 -0
  205. package/.claude/tests/test_export_contracts.py +43 -0
  206. package/.claude/tests/test_extract_data_model.py +33 -0
  207. package/.claude/tests/test_generate_quickstart.py +50 -0
  208. package/.claude/tests/test_generate_research_tasks.py +52 -0
  209. package/.claude/tsc-cache/6e64f818-6398-49ca-8623-581a9af85c44/edited-files.log +1 -0
  210. package/.claude/tsc-cache/795ba6e3-b98a-423b-bab2-51aa62812569/affected-repos.txt +1 -0
  211. package/.claude/tsc-cache/795ba6e3-b98a-423b-bab2-51aa62812569/edited-files.log +1 -0
  212. package/.claude/tsc-cache/ae335694-be5a-4ba4-a1a0-b676c09a7906/affected-repos.txt +1 -0
  213. package/.claude/tsc-cache/ae335694-be5a-4ba4-a1a0-b676c09a7906/edited-files.log +1 -0
  214. package/CHANGELOG.md +507 -0
  215. package/LICENSE +21 -0
  216. package/README.md +534 -0
  217. package/README.zh-CN.md +530 -0
  218. package/bin/adapt.js +240 -0
  219. package/bin/cc-devflow-cli.js +185 -0
  220. package/bin/cc-devflow.js +78 -0
  221. package/config/adapters.yml +5 -0
  222. package/config/schema/adapters.schema.json +44 -0
  223. package/docs/CLAUDE.md +26 -0
  224. package/docs/commands/README.md +61 -0
  225. package/docs/commands/README.zh-CN.md +55 -0
  226. package/docs/commands/core-roadmap.md +106 -0
  227. package/docs/commands/core-roadmap.zh-CN.md +102 -0
  228. package/docs/commands/core-style.md +405 -0
  229. package/docs/commands/core-style.zh-CN.md +405 -0
  230. package/docs/commands/flow-init.md +134 -0
  231. package/docs/commands/flow-init.zh-CN.md +163 -0
  232. package/docs/commands/flow-new.md +274 -0
  233. package/docs/commands/flow-new.zh-CN.md +270 -0
  234. package/docs/guides/getting-started.md +204 -0
  235. package/docs/guides/getting-started.zh-CN.md +152 -0
  236. package/lib/adapters/adapter-interface.js +57 -0
  237. package/lib/adapters/claude-adapter.js +74 -0
  238. package/lib/adapters/codex-adapter.js +40 -0
  239. package/lib/adapters/config-validator.js +68 -0
  240. package/lib/adapters/logger.js +42 -0
  241. package/lib/adapters/registry.js +153 -0
  242. package/lib/compiler/CLAUDE.md +92 -0
  243. package/lib/compiler/__tests__/drift.test.js +215 -0
  244. package/lib/compiler/__tests__/errors.test.js +184 -0
  245. package/lib/compiler/__tests__/incremental.test.js +174 -0
  246. package/lib/compiler/__tests__/integration.test.js +174 -0
  247. package/lib/compiler/__tests__/manifest.test.js +233 -0
  248. package/lib/compiler/__tests__/parser.test.js +456 -0
  249. package/lib/compiler/__tests__/schemas.test.js +301 -0
  250. package/lib/compiler/__tests__/skills-registry.test.js +125 -0
  251. package/lib/compiler/__tests__/transformer.test.js +286 -0
  252. package/lib/compiler/emitters/antigravity-emitter.js +171 -0
  253. package/lib/compiler/emitters/base-emitter.js +73 -0
  254. package/lib/compiler/emitters/codex-emitter.js +52 -0
  255. package/lib/compiler/emitters/cursor-emitter.js +31 -0
  256. package/lib/compiler/emitters/index.js +50 -0
  257. package/lib/compiler/emitters/qwen-emitter.js +39 -0
  258. package/lib/compiler/errors.js +119 -0
  259. package/lib/compiler/index.js +256 -0
  260. package/lib/compiler/manifest.js +242 -0
  261. package/lib/compiler/parser.js +258 -0
  262. package/lib/compiler/platforms.js +113 -0
  263. package/lib/compiler/resource-copier.js +320 -0
  264. package/lib/compiler/rules-emitters/__tests__/antigravity-rules-emitter.test.js +191 -0
  265. package/lib/compiler/rules-emitters/__tests__/codex-rules-emitter.test.js +109 -0
  266. package/lib/compiler/rules-emitters/__tests__/cursor-rules-emitter.test.js +123 -0
  267. package/lib/compiler/rules-emitters/__tests__/qwen-rules-emitter.test.js +123 -0
  268. package/lib/compiler/rules-emitters/antigravity-rules-emitter.js +253 -0
  269. package/lib/compiler/rules-emitters/base-rules-emitter.js +83 -0
  270. package/lib/compiler/rules-emitters/codex-rules-emitter.js +116 -0
  271. package/lib/compiler/rules-emitters/cursor-rules-emitter.js +98 -0
  272. package/lib/compiler/rules-emitters/index.js +71 -0
  273. package/lib/compiler/rules-emitters/qwen-rules-emitter.js +70 -0
  274. package/lib/compiler/schemas.js +144 -0
  275. package/lib/compiler/skills-registry.js +225 -0
  276. package/lib/compiler/transformer.js +236 -0
  277. package/package.json +50 -0
@@ -0,0 +1,563 @@
1
+ # 日期时间处理规则
2
+
3
+ ## 概述
4
+
5
+ cc-devflow 系统中的所有日期时间操作都必须遵循统一的处理规则,确保时间信息的准确性和一致性。
6
+
7
+ ## 核心原则
8
+
9
+ ### 1. 始终使用真实系统时间
10
+ **必须从系统获取真实的当前日期时间,而不是估算或使用占位符**
11
+
12
+ ```bash
13
+ # ✅ 正确做法 - 获取真实系统时间
14
+ get_current_timestamp() {
15
+ # 使用 UTC 时间,ISO 8601 格式
16
+ date -u +%Y-%m-%dT%H:%M:%SZ
17
+ }
18
+
19
+ # ❌ 错误做法 - 使用占位符或估算
20
+ use_placeholder_time() {
21
+ echo "2024-01-01T00:00:00Z" # 不要这样做
22
+ }
23
+
24
+ # ❌ 错误做法 - 手动估算时间
25
+ manual_estimate() {
26
+ echo "大概是下午3点左右" # 不要这样做
27
+ }
28
+ ```
29
+
30
+ ### 2. 标准时间格式
31
+ **优先使用 ISO 8601 格式: YYYY-MM-DDTHH:MM:SSZ**
32
+
33
+ ```bash
34
+ # 标准时间格式函数
35
+ format_iso8601_utc() {
36
+ date -u +%Y-%m-%dT%H:%M:%SZ
37
+ }
38
+
39
+ format_iso8601_local() {
40
+ date +%Y-%m-%dT%H:%M:%S%z
41
+ }
42
+
43
+ # 文件名安全的时间格式
44
+ format_filename_safe() {
45
+ date -u +%Y%m%d_%H%M%S
46
+ }
47
+
48
+ # 可读的时间格式
49
+ format_human_readable() {
50
+ date -u "+%Y-%m-%d %H:%M:%S UTC"
51
+ }
52
+
53
+ # 使用示例
54
+ create_timestamped_file() {
55
+ local content="$1"
56
+ local timestamp=$(format_filename_safe)
57
+ local filename="backup_${timestamp}.md"
58
+
59
+ echo "$content" > "$filename"
60
+ echo "✅ 文件已创建: $filename"
61
+ }
62
+ ```
63
+
64
+ ### 3. 跨平台兼容性
65
+ **支持 Linux、macOS 和 Windows 的时间获取**
66
+
67
+ ```bash
68
+ # 跨平台时间获取
69
+ get_current_datetime_cross_platform() {
70
+ local format="${1:-%Y-%m-%dT%H:%M:%SZ}"
71
+
72
+ # 检测操作系统
73
+ case "$(uname -s)" in
74
+ Darwin)
75
+ # macOS
76
+ date -u +"$format"
77
+ ;;
78
+ Linux)
79
+ # Linux
80
+ date -u +"$format"
81
+ ;;
82
+ CYGWIN*|MINGW*|MSYS*)
83
+ # Windows (Git Bash, MSYS2, etc.)
84
+ date -u +"$format"
85
+ ;;
86
+ *)
87
+ # 未知系统,尝试标准命令
88
+ if command -v date >/dev/null 2>&1; then
89
+ date -u +"$format"
90
+ else
91
+ echo "❌ 无法获取系统时间"
92
+ return 1
93
+ fi
94
+ ;;
95
+ esac
96
+ }
97
+
98
+ # 高精度时间戳(包含毫秒)
99
+ get_precise_timestamp() {
100
+ if command -v python3 >/dev/null 2>&1; then
101
+ python3 -c "from datetime import datetime; print(datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%fZ'))"
102
+ elif command -v node >/dev/null 2>&1; then
103
+ node -e "console.log(new Date().toISOString())"
104
+ else
105
+ # 后备方案
106
+ get_current_datetime_cross_platform
107
+ fi
108
+ }
109
+ ```
110
+
111
+ ## 文档前言中的时间处理
112
+
113
+ ### Frontmatter 时间字段
114
+ ```bash
115
+ # 更新文档前言中的时间字段
116
+ update_frontmatter_datetime() {
117
+ local file_path="$1"
118
+ local field_name="$2"
119
+ local current_time=$(get_current_datetime_cross_platform)
120
+
121
+ if [ ! -f "$file_path" ]; then
122
+ echo "❌ 文件不存在: $file_path"
123
+ return 1
124
+ fi
125
+
126
+ # 检查文件是否有 frontmatter
127
+ if ! head -1 "$file_path" | grep -q "^---$"; then
128
+ echo "❌ 文件没有 YAML frontmatter"
129
+ return 1
130
+ fi
131
+
132
+ # 使用 yq 更新时间字段
133
+ if command -v yq >/dev/null 2>&1; then
134
+ yq eval ".${field_name} = \"${current_time}\"" -i "$file_path"
135
+ echo "✅ 已更新 $field_name: $current_time"
136
+ else
137
+ # 后备方案:使用 sed 更新
138
+ update_frontmatter_with_sed "$file_path" "$field_name" "$current_time"
139
+ fi
140
+ }
141
+
142
+ # 使用 sed 更新 frontmatter(后备方案)
143
+ update_frontmatter_with_sed() {
144
+ local file_path="$1"
145
+ local field_name="$2"
146
+ local new_value="$3"
147
+
148
+ # 创建临时文件
149
+ local temp_file=$(mktemp)
150
+
151
+ # 检查字段是否存在
152
+ if grep -q "^${field_name}:" "$file_path"; then
153
+ # 更新现有字段
154
+ sed "s/^${field_name}:.*/${field_name}: \"${new_value}\"/" "$file_path" > "$temp_file"
155
+ else
156
+ # 在 frontmatter 结束前添加字段
157
+ awk -v field="$field_name" -v value="$new_value" '
158
+ /^---$/ && NR > 1 { print field ": \"" value "\"" }
159
+ { print }
160
+ ' "$file_path" > "$temp_file"
161
+ fi
162
+
163
+ # 替换原文件
164
+ mv "$temp_file" "$file_path"
165
+ echo "✅ 已更新 $field_name: $new_value"
166
+ }
167
+
168
+ # 标准 frontmatter 时间字段
169
+ add_standard_timestamps() {
170
+ local file_path="$1"
171
+ local current_time=$(get_current_datetime_cross_platform)
172
+
173
+ # 添加创建时间(如果不存在)
174
+ if ! grep -q "^created:" "$file_path"; then
175
+ update_frontmatter_datetime "$file_path" "created" "$current_time"
176
+ fi
177
+
178
+ # 总是更新修改时间
179
+ update_frontmatter_datetime "$file_path" "updated" "$current_time"
180
+ }
181
+ ```
182
+
183
+ ### 文档生成时的时间处理
184
+ ```bash
185
+ # 生成带时间戳的文档
186
+ generate_document_with_timestamp() {
187
+ local template_file="$1"
188
+ local output_file="$2"
189
+ local req_id="$3"
190
+ local title="$4"
191
+
192
+ local current_time=$(get_current_datetime_cross_platform)
193
+ local creation_date=$(date -u +%Y-%m-%d)
194
+
195
+ # 处理模板变量
196
+ sed "s/{{DATE}}/$creation_date/g; s/{{TIMESTAMP}}/$current_time/g; s/{{REQ_ID}}/$req_id/g; s/{{TITLE}}/$title/g" "$template_file" > "$output_file"
197
+
198
+ # 添加标准时间戳
199
+ add_standard_timestamps "$output_file"
200
+
201
+ echo "✅ 文档已生成: $output_file"
202
+ }
203
+ ```
204
+
205
+ ## 日志记录中的时间处理
206
+
207
+ ### 结构化日志时间
208
+ ```bash
209
+ # 结构化日志记录
210
+ log_with_timestamp() {
211
+ local level="$1"
212
+ local component="$2"
213
+ local message="$3"
214
+ local context="$4"
215
+
216
+ local timestamp=$(get_precise_timestamp)
217
+ local log_file=".claude/logs/system.log"
218
+
219
+ # 确保日志目录存在
220
+ mkdir -p "$(dirname "$log_file")"
221
+
222
+ # 创建结构化日志条目
223
+ local log_entry=$(jq -n \
224
+ --arg timestamp "$timestamp" \
225
+ --arg level "$level" \
226
+ --arg component "$component" \
227
+ --arg message "$message" \
228
+ --arg context "$context" \
229
+ '{
230
+ timestamp: $timestamp,
231
+ level: $level,
232
+ component: $component,
233
+ message: $message,
234
+ context: $context
235
+ }'
236
+ )
237
+
238
+ # 写入日志文件
239
+ echo "$log_entry" >> "$log_file"
240
+
241
+ # 控制台输出(带时间)
242
+ local readable_time=$(date -d "$timestamp" "+%H:%M:%S" 2>/dev/null || echo "${timestamp: -8:8}")
243
+ echo "[$readable_time] $level - $component: $message"
244
+ }
245
+
246
+ # 性能计时
247
+ time_operation() {
248
+ local operation_name="$1"
249
+ shift
250
+ local command=("$@")
251
+
252
+ local start_time=$(get_precise_timestamp)
253
+ local start_epoch=$(date +%s.%N)
254
+
255
+ echo "⏱️ 开始操作: $operation_name ($start_time)"
256
+
257
+ # 执行命令
258
+ "${command[@]}"
259
+ local exit_code=$?
260
+
261
+ local end_time=$(get_precise_timestamp)
262
+ local end_epoch=$(date +%s.%N)
263
+ local duration=$(echo "$end_epoch - $start_epoch" | bc -l 2>/dev/null || echo "0")
264
+
265
+ echo "⏱️ 操作完成: $operation_name ($end_time) - 用时 ${duration}s"
266
+
267
+ # 记录性能日志
268
+ log_with_timestamp "INFO" "PERF" "Operation '$operation_name' completed in ${duration}s" "exit_code=$exit_code"
269
+
270
+ return $exit_code
271
+ }
272
+ ```
273
+
274
+ ### 审计日志时间
275
+ ```bash
276
+ # 审计日志记录
277
+ audit_log() {
278
+ local action="$1"
279
+ local resource="$2"
280
+ local user="$3"
281
+ local details="$4"
282
+
283
+ local timestamp=$(get_precise_timestamp)
284
+ local audit_file=".claude/logs/audit.log"
285
+
286
+ # 确保审计日志目录存在
287
+ mkdir -p "$(dirname "$audit_file")"
288
+
289
+ # 创建审计日志条目
290
+ local audit_entry=$(jq -n \
291
+ --arg timestamp "$timestamp" \
292
+ --arg action "$action" \
293
+ --arg resource "$resource" \
294
+ --arg user "$user" \
295
+ --arg details "$details" \
296
+ '{
297
+ timestamp: $timestamp,
298
+ action: $action,
299
+ resource: $resource,
300
+ user: $user,
301
+ details: $details
302
+ }'
303
+ )
304
+
305
+ echo "$audit_entry" >> "$audit_file"
306
+ echo "📝 审计日志: $action on $resource by $user"
307
+ }
308
+ ```
309
+
310
+ ## Git 操作中的时间处理
311
+
312
+ ### 提交时间信息
313
+ ```bash
314
+ # Git 提交带时间信息
315
+ commit_with_timestamp() {
316
+ local req_id="$1"
317
+ local message="$2"
318
+ local commit_time=$(get_current_datetime_cross_platform)
319
+
320
+ # 构建提交消息
321
+ local full_message="$message
322
+
323
+ Timestamp: $commit_time
324
+ Requirement: $req_id"
325
+
326
+ git commit -m "$full_message"
327
+
328
+ echo "✅ 提交完成 ($commit_time)"
329
+ }
330
+
331
+ # 获取 Git 提交时间
332
+ get_commit_timestamp() {
333
+ local commit_hash="${1:-HEAD}"
334
+
335
+ # 获取 ISO 8601 格式的提交时间
336
+ git show -s --format="%aI" "$commit_hash"
337
+ }
338
+
339
+ # 分析提交历史时间
340
+ analyze_commit_timeline() {
341
+ local req_id="$1"
342
+ local output_file="devflow/requirements/${req_id}/timeline.md"
343
+
344
+ cat > "$output_file" << EOF
345
+ # 需求开发时间线
346
+
347
+ ## 分析时间
348
+ $(get_current_datetime_cross_platform)
349
+
350
+ ## 提交历史
351
+ $(git log --grep="$req_id" --oneline --format="%aI %h %s" | head -20)
352
+
353
+ ## 开发统计
354
+ - 总提交数: $(git log --grep="$req_id" --oneline | wc -l)
355
+ - 开发周期: $(calculate_development_cycle "$req_id")
356
+ EOF
357
+
358
+ echo "📊 时间线分析已生成: $output_file"
359
+ }
360
+ ```
361
+
362
+ ## 时区处理
363
+
364
+ ### UTC 时间优先
365
+ ```bash
366
+ # UTC 时间处理
367
+ convert_to_utc() {
368
+ local local_time="$1"
369
+
370
+ if command -v date >/dev/null 2>&1; then
371
+ # 尝试转换为 UTC
372
+ date -u -d "$local_time" +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || echo "$local_time"
373
+ else
374
+ echo "$local_time"
375
+ fi
376
+ }
377
+
378
+ # 本地时间转换
379
+ convert_utc_to_local() {
380
+ local utc_time="$1"
381
+ local timezone="${2:-$(date +%Z)}"
382
+
383
+ if command -v date >/dev/null 2>&1; then
384
+ # 转换为本地时间
385
+ date -d "$utc_time" "+%Y-%m-%d %H:%M:%S $timezone" 2>/dev/null || echo "$utc_time"
386
+ else
387
+ echo "$utc_time"
388
+ fi
389
+ }
390
+
391
+ # 时区感知的时间显示
392
+ display_time_with_timezone() {
393
+ local utc_time="$1"
394
+
395
+ echo "UTC: $utc_time"
396
+
397
+ # 显示常见时区
398
+ local timezones=("America/New_York" "Europe/London" "Asia/Shanghai" "Asia/Tokyo")
399
+
400
+ for tz in "${timezones[@]}"; do
401
+ if command -v python3 >/dev/null 2>&1; then
402
+ local local_time=$(python3 -c "
403
+ from datetime import datetime
404
+ import pytz
405
+ utc_dt = datetime.fromisoformat('$utc_time'.replace('Z', '+00:00'))
406
+ local_dt = utc_dt.astimezone(pytz.timezone('$tz'))
407
+ print(f'$tz: {local_dt.strftime(\"%Y-%m-%d %H:%M:%S\")}')
408
+ " 2>/dev/null)
409
+ echo "$local_time"
410
+ fi
411
+ done
412
+ }
413
+ ```
414
+
415
+ ## 时间验证和解析
416
+
417
+ ### 时间格式验证
418
+ ```bash
419
+ # 验证 ISO 8601 格式
420
+ validate_iso8601() {
421
+ local timestamp="$1"
422
+
423
+ # 基本格式检查
424
+ if echo "$timestamp" | grep -qE "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z?$"; then
425
+ # 尝试解析验证
426
+ if date -d "$timestamp" >/dev/null 2>&1; then
427
+ return 0
428
+ fi
429
+ fi
430
+
431
+ echo "❌ 时间格式无效: $timestamp"
432
+ echo " 期望格式: YYYY-MM-DDTHH:MM:SSZ"
433
+ return 1
434
+ }
435
+
436
+ # 解析相对时间
437
+ parse_relative_time() {
438
+ local relative_time="$1"
439
+
440
+ case "$relative_time" in
441
+ "now")
442
+ get_current_datetime_cross_platform
443
+ ;;
444
+ "1h ago"|"1 hour ago")
445
+ date -u -d "1 hour ago" +%Y-%m-%dT%H:%M:%SZ 2>/dev/null ||
446
+ date -u -v-1H +%Y-%m-%dT%H:%M:%SZ 2>/dev/null
447
+ ;;
448
+ "1d ago"|"1 day ago")
449
+ date -u -d "1 day ago" +%Y-%m-%dT%H:%M:%SZ 2>/dev/null ||
450
+ date -u -v-1d +%Y-%m-%dT%H:%M:%SZ 2>/dev/null
451
+ ;;
452
+ *)
453
+ echo "❌ 不支持的相对时间: $relative_time"
454
+ return 1
455
+ ;;
456
+ esac
457
+ }
458
+ ```
459
+
460
+ ### 时间计算
461
+ ```bash
462
+ # 计算时间差
463
+ calculate_time_difference() {
464
+ local start_time="$1"
465
+ local end_time="$2"
466
+
467
+ if command -v python3 >/dev/null 2>&1; then
468
+ python3 -c "
469
+ from datetime import datetime
470
+ start = datetime.fromisoformat('$start_time'.replace('Z', '+00:00'))
471
+ end = datetime.fromisoformat('$end_time'.replace('Z', '+00:00'))
472
+ diff = end - start
473
+ print(f'{diff.total_seconds():.2f} seconds')
474
+ print(f'{diff.total_seconds()/60:.2f} minutes')
475
+ print(f'{diff.total_seconds()/3600:.2f} hours')
476
+ "
477
+ else
478
+ # 后备计算方案
479
+ echo "需要 Python 3 来计算精确时间差"
480
+ fi
481
+ }
482
+
483
+ # 时间范围检查
484
+ is_within_time_range() {
485
+ local check_time="$1"
486
+ local start_time="$2"
487
+ local end_time="$3"
488
+
489
+ if command -v python3 >/dev/null 2>&1; then
490
+ python3 -c "
491
+ from datetime import datetime
492
+ check = datetime.fromisoformat('$check_time'.replace('Z', '+00:00'))
493
+ start = datetime.fromisoformat('$start_time'.replace('Z', '+00:00'))
494
+ end = datetime.fromisoformat('$end_time'.replace('Z', '+00:00'))
495
+ print('true' if start <= check <= end else 'false')
496
+ " 2>/dev/null | grep -q "true"
497
+ else
498
+ # 简单的字符串比较
499
+ [[ "$check_time" > "$start_time" && "$check_time" < "$end_time" ]]
500
+ fi
501
+ }
502
+ ```
503
+
504
+ ## 最佳实践
505
+
506
+ ### ✅ 时间处理清单
507
+ - [ ] 始终使用系统真实时间
508
+ - [ ] 优先使用 UTC 时间
509
+ - [ ] 使用 ISO 8601 格式
510
+ - [ ] 考虑跨平台兼容性
511
+ - [ ] 验证时间格式正确性
512
+ - [ ] 记录时区信息(如需要)
513
+
514
+ ### 🔧 工具函数库
515
+ ```bash
516
+ # 时间工具函数集合
517
+ datetime_utils() {
518
+ case "$1" in
519
+ "now")
520
+ get_current_datetime_cross_platform
521
+ ;;
522
+ "precise")
523
+ get_precise_timestamp
524
+ ;;
525
+ "filename")
526
+ format_filename_safe
527
+ ;;
528
+ "readable")
529
+ format_human_readable
530
+ ;;
531
+ "validate")
532
+ validate_iso8601 "$2"
533
+ ;;
534
+ *)
535
+ echo "时间工具函数用法:"
536
+ echo " datetime_utils now - 获取当前 UTC 时间"
537
+ echo " datetime_utils precise - 获取高精度时间戳"
538
+ echo " datetime_utils filename - 获取文件名安全格式"
539
+ echo " datetime_utils readable - 获取可读格式"
540
+ echo " datetime_utils validate <time> - 验证时间格式"
541
+ ;;
542
+ esac
543
+ }
544
+ ```
545
+
546
+ ### 📋 常用时间格式
547
+ ```bash
548
+ # 常用时间格式示例
549
+ show_time_formats() {
550
+ local current_time=$(get_current_datetime_cross_platform)
551
+
552
+ echo "时间格式示例 (当前时间):"
553
+ echo " ISO 8601 UTC: $current_time"
554
+ echo " 文件名安全: $(format_filename_safe)"
555
+ echo " 可读格式: $(format_human_readable)"
556
+ echo " Unix 时间戳: $(date +%s)"
557
+ echo " 毫秒时间戳: $(date +%s%3N 2>/dev/null || echo $(date +%s)000)"
558
+ }
559
+ ```
560
+
561
+ ---
562
+
563
+ **关键原则**: 任何需要当前日期时间的命令都必须从系统获取真实时间,而不是估算或使用占位符。时间信息必须准确、一致且可跨平台使用。