claude-code-workflow 6.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 (350) hide show
  1. package/.claude/agents/action-planning-agent.md +778 -0
  2. package/.claude/agents/cli-execution-agent.md +270 -0
  3. package/.claude/agents/cli-explore-agent.md +182 -0
  4. package/.claude/agents/cli-lite-planning-agent.md +396 -0
  5. package/.claude/agents/cli-planning-agent.md +558 -0
  6. package/.claude/agents/code-developer.md +310 -0
  7. package/.claude/agents/conceptual-planning-agent.md +308 -0
  8. package/.claude/agents/context-search-agent.md +582 -0
  9. package/.claude/agents/doc-generator.md +330 -0
  10. package/.claude/agents/memory-bridge.md +94 -0
  11. package/.claude/agents/test-context-search-agent.md +399 -0
  12. package/.claude/agents/test-fix-agent.md +343 -0
  13. package/.claude/agents/ui-design-agent.md +593 -0
  14. package/.claude/agents/universal-executor.md +131 -0
  15. package/.claude/commands/cli/cli-init.md +440 -0
  16. package/.claude/commands/enhance-prompt.md +93 -0
  17. package/.claude/commands/memory/code-map-memory.md +687 -0
  18. package/.claude/commands/memory/docs-full-cli.md +471 -0
  19. package/.claude/commands/memory/docs-related-cli.md +386 -0
  20. package/.claude/commands/memory/docs.md +615 -0
  21. package/.claude/commands/memory/load-skill-memory.md +182 -0
  22. package/.claude/commands/memory/load.md +240 -0
  23. package/.claude/commands/memory/skill-memory.md +525 -0
  24. package/.claude/commands/memory/style-skill-memory.md +396 -0
  25. package/.claude/commands/memory/tech-research.md +477 -0
  26. package/.claude/commands/memory/update-full.md +332 -0
  27. package/.claude/commands/memory/update-related.md +332 -0
  28. package/.claude/commands/memory/workflow-skill-memory.md +517 -0
  29. package/.claude/commands/task/breakdown.md +204 -0
  30. package/.claude/commands/task/create.md +152 -0
  31. package/.claude/commands/task/execute.md +270 -0
  32. package/.claude/commands/task/replan.md +437 -0
  33. package/.claude/commands/version.md +254 -0
  34. package/.claude/commands/workflow/action-plan-verify.md +447 -0
  35. package/.claude/commands/workflow/brainstorm/api-designer.md +585 -0
  36. package/.claude/commands/workflow/brainstorm/artifacts.md +452 -0
  37. package/.claude/commands/workflow/brainstorm/auto-parallel.md +443 -0
  38. package/.claude/commands/workflow/brainstorm/data-architect.md +220 -0
  39. package/.claude/commands/workflow/brainstorm/product-manager.md +200 -0
  40. package/.claude/commands/workflow/brainstorm/product-owner.md +200 -0
  41. package/.claude/commands/workflow/brainstorm/scrum-master.md +200 -0
  42. package/.claude/commands/workflow/brainstorm/subject-matter-expert.md +200 -0
  43. package/.claude/commands/workflow/brainstorm/synthesis.md +398 -0
  44. package/.claude/commands/workflow/brainstorm/system-architect.md +387 -0
  45. package/.claude/commands/workflow/brainstorm/ui-designer.md +221 -0
  46. package/.claude/commands/workflow/brainstorm/ux-expert.md +221 -0
  47. package/.claude/commands/workflow/execute.md +460 -0
  48. package/.claude/commands/workflow/init.md +164 -0
  49. package/.claude/commands/workflow/lite-execute.md +686 -0
  50. package/.claude/commands/workflow/lite-fix.md +621 -0
  51. package/.claude/commands/workflow/lite-plan.md +592 -0
  52. package/.claude/commands/workflow/plan.md +551 -0
  53. package/.claude/commands/workflow/replan.md +515 -0
  54. package/.claude/commands/workflow/review-fix.md +646 -0
  55. package/.claude/commands/workflow/review-module-cycle.md +795 -0
  56. package/.claude/commands/workflow/review-session-cycle.md +805 -0
  57. package/.claude/commands/workflow/review.md +291 -0
  58. package/.claude/commands/workflow/session/complete.md +500 -0
  59. package/.claude/commands/workflow/session/list.md +96 -0
  60. package/.claude/commands/workflow/session/resume.md +61 -0
  61. package/.claude/commands/workflow/session/start.md +200 -0
  62. package/.claude/commands/workflow/status.md +352 -0
  63. package/.claude/commands/workflow/tdd-plan.md +460 -0
  64. package/.claude/commands/workflow/tdd-verify.md +386 -0
  65. package/.claude/commands/workflow/test-cycle-execute.md +498 -0
  66. package/.claude/commands/workflow/test-fix-gen.md +699 -0
  67. package/.claude/commands/workflow/test-gen.md +529 -0
  68. package/.claude/commands/workflow/tools/conflict-resolution.md +680 -0
  69. package/.claude/commands/workflow/tools/context-gather.md +434 -0
  70. package/.claude/commands/workflow/tools/task-generate-agent.md +291 -0
  71. package/.claude/commands/workflow/tools/task-generate-tdd.md +518 -0
  72. package/.claude/commands/workflow/tools/tdd-coverage-analysis.md +309 -0
  73. package/.claude/commands/workflow/tools/test-concept-enhanced.md +163 -0
  74. package/.claude/commands/workflow/tools/test-context-gather.md +235 -0
  75. package/.claude/commands/workflow/tools/test-task-generate.md +256 -0
  76. package/.claude/commands/workflow/ui-design/animation-extract.md +1150 -0
  77. package/.claude/commands/workflow/ui-design/codify-style.md +652 -0
  78. package/.claude/commands/workflow/ui-design/design-sync.md +454 -0
  79. package/.claude/commands/workflow/ui-design/explore-auto.md +678 -0
  80. package/.claude/commands/workflow/ui-design/generate.md +504 -0
  81. package/.claude/commands/workflow/ui-design/imitate-auto.md +745 -0
  82. package/.claude/commands/workflow/ui-design/import-from-code.md +537 -0
  83. package/.claude/commands/workflow/ui-design/layout-extract.md +788 -0
  84. package/.claude/commands/workflow/ui-design/reference-page-generator.md +356 -0
  85. package/.claude/commands/workflow/ui-design/style-extract.md +773 -0
  86. package/.claude/scripts/classify-folders.sh +35 -0
  87. package/.claude/scripts/convert_tokens_to_css.sh +225 -0
  88. package/.claude/scripts/detect_changed_modules.sh +157 -0
  89. package/.claude/scripts/discover-design-files.sh +83 -0
  90. package/.claude/scripts/extract-animations.js +243 -0
  91. package/.claude/scripts/extract-computed-styles.js +118 -0
  92. package/.claude/scripts/extract-layout-structure.js +411 -0
  93. package/.claude/scripts/generate_module_docs.sh +713 -0
  94. package/.claude/scripts/get_modules_by_depth.sh +166 -0
  95. package/.claude/scripts/ui-generate-preview.sh +391 -0
  96. package/.claude/scripts/ui-instantiate-prototypes.sh +811 -0
  97. package/.claude/scripts/update_module_claude.sh +333 -0
  98. package/.claude/skills/command-guide/SKILL.md +388 -0
  99. package/.claude/skills/command-guide/UPDATE-GUIDELINE.md +592 -0
  100. package/.claude/skills/command-guide/guides/cli-tools-guide.md +410 -0
  101. package/.claude/skills/command-guide/guides/examples.md +537 -0
  102. package/.claude/skills/command-guide/guides/getting-started.md +242 -0
  103. package/.claude/skills/command-guide/guides/implementation-details.md +1010 -0
  104. package/.claude/skills/command-guide/guides/index-structure.md +326 -0
  105. package/.claude/skills/command-guide/guides/troubleshooting.md +92 -0
  106. package/.claude/skills/command-guide/guides/ui-design-workflow-guide.md +316 -0
  107. package/.claude/skills/command-guide/guides/workflow-patterns.md +662 -0
  108. package/.claude/skills/command-guide/index/all-commands.json +783 -0
  109. package/.claude/skills/command-guide/index/by-category.json +811 -0
  110. package/.claude/skills/command-guide/index/by-use-case.json +797 -0
  111. package/.claude/skills/command-guide/index/command-relationships.json +307 -0
  112. package/.claude/skills/command-guide/index/essential-commands.json +123 -0
  113. package/.claude/skills/command-guide/reference/agents/action-planning-agent.md +722 -0
  114. package/.claude/skills/command-guide/reference/agents/cli-execution-agent.md +270 -0
  115. package/.claude/skills/command-guide/reference/agents/cli-explore-agent.md +182 -0
  116. package/.claude/skills/command-guide/reference/agents/cli-lite-planning-agent.md +396 -0
  117. package/.claude/skills/command-guide/reference/agents/cli-planning-agent.md +558 -0
  118. package/.claude/skills/command-guide/reference/agents/code-developer.md +310 -0
  119. package/.claude/skills/command-guide/reference/agents/conceptual-planning-agent.md +328 -0
  120. package/.claude/skills/command-guide/reference/agents/context-search-agent.md +577 -0
  121. package/.claude/skills/command-guide/reference/agents/doc-generator.md +330 -0
  122. package/.claude/skills/command-guide/reference/agents/memory-bridge.md +94 -0
  123. package/.claude/skills/command-guide/reference/agents/test-context-search-agent.md +399 -0
  124. package/.claude/skills/command-guide/reference/agents/test-fix-agent.md +343 -0
  125. package/.claude/skills/command-guide/reference/agents/ui-design-agent.md +593 -0
  126. package/.claude/skills/command-guide/reference/agents/universal-executor.md +131 -0
  127. package/.claude/skills/command-guide/reference/commands/cli/cli-init.md +440 -0
  128. package/.claude/skills/command-guide/reference/commands/enhance-prompt.md +93 -0
  129. package/.claude/skills/command-guide/reference/commands/memory/code-map-memory.md +687 -0
  130. package/.claude/skills/command-guide/reference/commands/memory/docs-full-cli.md +471 -0
  131. package/.claude/skills/command-guide/reference/commands/memory/docs-related-cli.md +386 -0
  132. package/.claude/skills/command-guide/reference/commands/memory/docs.md +610 -0
  133. package/.claude/skills/command-guide/reference/commands/memory/load-skill-memory.md +182 -0
  134. package/.claude/skills/command-guide/reference/commands/memory/load.md +240 -0
  135. package/.claude/skills/command-guide/reference/commands/memory/skill-memory.md +525 -0
  136. package/.claude/skills/command-guide/reference/commands/memory/style-skill-memory.md +396 -0
  137. package/.claude/skills/command-guide/reference/commands/memory/tech-research.md +477 -0
  138. package/.claude/skills/command-guide/reference/commands/memory/update-full.md +332 -0
  139. package/.claude/skills/command-guide/reference/commands/memory/update-related.md +332 -0
  140. package/.claude/skills/command-guide/reference/commands/memory/workflow-skill-memory.md +517 -0
  141. package/.claude/skills/command-guide/reference/commands/task/breakdown.md +204 -0
  142. package/.claude/skills/command-guide/reference/commands/task/create.md +152 -0
  143. package/.claude/skills/command-guide/reference/commands/task/execute.md +270 -0
  144. package/.claude/skills/command-guide/reference/commands/task/replan.md +437 -0
  145. package/.claude/skills/command-guide/reference/commands/version.md +254 -0
  146. package/.claude/skills/command-guide/reference/commands/workflow/action-plan-verify.md +447 -0
  147. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/api-designer.md +585 -0
  148. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/artifacts.md +604 -0
  149. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/auto-parallel.md +466 -0
  150. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/data-architect.md +220 -0
  151. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-manager.md +200 -0
  152. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-owner.md +200 -0
  153. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/scrum-master.md +200 -0
  154. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/subject-matter-expert.md +200 -0
  155. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/synthesis.md +496 -0
  156. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/system-architect.md +387 -0
  157. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ui-designer.md +221 -0
  158. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ux-expert.md +221 -0
  159. package/.claude/skills/command-guide/reference/commands/workflow/execute.md +460 -0
  160. package/.claude/skills/command-guide/reference/commands/workflow/init.md +164 -0
  161. package/.claude/skills/command-guide/reference/commands/workflow/lite-execute.md +634 -0
  162. package/.claude/skills/command-guide/reference/commands/workflow/lite-fix.md +602 -0
  163. package/.claude/skills/command-guide/reference/commands/workflow/lite-plan.md +582 -0
  164. package/.claude/skills/command-guide/reference/commands/workflow/plan.md +551 -0
  165. package/.claude/skills/command-guide/reference/commands/workflow/replan.md +515 -0
  166. package/.claude/skills/command-guide/reference/commands/workflow/review-fix.md +646 -0
  167. package/.claude/skills/command-guide/reference/commands/workflow/review-module-cycle.md +795 -0
  168. package/.claude/skills/command-guide/reference/commands/workflow/review-session-cycle.md +805 -0
  169. package/.claude/skills/command-guide/reference/commands/workflow/review.md +291 -0
  170. package/.claude/skills/command-guide/reference/commands/workflow/session/complete.md +500 -0
  171. package/.claude/skills/command-guide/reference/commands/workflow/session/list.md +96 -0
  172. package/.claude/skills/command-guide/reference/commands/workflow/session/resume.md +61 -0
  173. package/.claude/skills/command-guide/reference/commands/workflow/session/start.md +180 -0
  174. package/.claude/skills/command-guide/reference/commands/workflow/status.md +352 -0
  175. package/.claude/skills/command-guide/reference/commands/workflow/tdd-plan.md +460 -0
  176. package/.claude/skills/command-guide/reference/commands/workflow/tdd-verify.md +386 -0
  177. package/.claude/skills/command-guide/reference/commands/workflow/test-cycle-execute.md +498 -0
  178. package/.claude/skills/command-guide/reference/commands/workflow/test-fix-gen.md +699 -0
  179. package/.claude/skills/command-guide/reference/commands/workflow/test-gen.md +529 -0
  180. package/.claude/skills/command-guide/reference/commands/workflow/tools/conflict-resolution.md +680 -0
  181. package/.claude/skills/command-guide/reference/commands/workflow/tools/context-gather.md +434 -0
  182. package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-agent.md +151 -0
  183. package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-tdd.md +518 -0
  184. package/.claude/skills/command-guide/reference/commands/workflow/tools/tdd-coverage-analysis.md +309 -0
  185. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-concept-enhanced.md +163 -0
  186. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-context-gather.md +235 -0
  187. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-task-generate.md +256 -0
  188. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/animation-extract.md +1150 -0
  189. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/codify-style.md +652 -0
  190. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/design-sync.md +454 -0
  191. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/explore-auto.md +678 -0
  192. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/generate.md +504 -0
  193. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/imitate-auto.md +745 -0
  194. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/import-from-code.md +537 -0
  195. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/layout-extract.md +788 -0
  196. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/reference-page-generator.md +356 -0
  197. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/style-extract.md +773 -0
  198. package/.claude/skills/command-guide/scripts/analyze_commands.py +502 -0
  199. package/.claude/skills/command-guide/scripts/update-index.sh +130 -0
  200. package/.claude/skills/command-guide/templates/issue-bug.md +104 -0
  201. package/.claude/skills/command-guide/templates/issue-diagnosis.md +275 -0
  202. package/.claude/skills/command-guide/templates/issue-feature.md +97 -0
  203. package/.claude/skills/command-guide/templates/issue-question.md +141 -0
  204. package/.claude/skills/prompt-enhancer/SKILL.md +124 -0
  205. package/.claude/workflows/_template-compare-matrix.html +692 -0
  206. package/.claude/workflows/cli-templates/fix-plan-template.json +75 -0
  207. package/.claude/workflows/cli-templates/fix-progress-template.json +48 -0
  208. package/.claude/workflows/cli-templates/memory/style-skill-memory/skill-md-template.md +299 -0
  209. package/.claude/workflows/cli-templates/planning-roles/data-architect.md +120 -0
  210. package/.claude/workflows/cli-templates/planning-roles/product-manager.md +119 -0
  211. package/.claude/workflows/cli-templates/planning-roles/product-owner.md +261 -0
  212. package/.claude/workflows/cli-templates/planning-roles/scrum-master.md +186 -0
  213. package/.claude/workflows/cli-templates/planning-roles/subject-matter-expert.md +281 -0
  214. package/.claude/workflows/cli-templates/planning-roles/synthesis-role.md +414 -0
  215. package/.claude/workflows/cli-templates/planning-roles/system-architect.md +106 -0
  216. package/.claude/workflows/cli-templates/planning-roles/test-strategist.md +124 -0
  217. package/.claude/workflows/cli-templates/planning-roles/ui-designer.md +379 -0
  218. package/.claude/workflows/cli-templates/planning-roles/ux-expert.md +240 -0
  219. package/.claude/workflows/cli-templates/prompts/analysis/01-diagnose-bug-root-cause.txt +127 -0
  220. package/.claude/workflows/cli-templates/prompts/analysis/01-trace-code-execution.txt +115 -0
  221. package/.claude/workflows/cli-templates/prompts/analysis/02-analyze-code-patterns.txt +37 -0
  222. package/.claude/workflows/cli-templates/prompts/analysis/02-analyze-technical-document.txt +33 -0
  223. package/.claude/workflows/cli-templates/prompts/analysis/02-review-architecture.txt +29 -0
  224. package/.claude/workflows/cli-templates/prompts/analysis/02-review-code-quality.txt +28 -0
  225. package/.claude/workflows/cli-templates/prompts/analysis/03-analyze-performance.txt +29 -0
  226. package/.claude/workflows/cli-templates/prompts/analysis/03-assess-security-risks.txt +29 -0
  227. package/.claude/workflows/cli-templates/prompts/analysis/03-review-quality-standards.txt +29 -0
  228. package/.claude/workflows/cli-templates/prompts/development/02-generate-tests.txt +70 -0
  229. package/.claude/workflows/cli-templates/prompts/development/02-implement-component-ui.txt +55 -0
  230. package/.claude/workflows/cli-templates/prompts/development/02-implement-feature.txt +58 -0
  231. package/.claude/workflows/cli-templates/prompts/development/02-refactor-codebase.txt +55 -0
  232. package/.claude/workflows/cli-templates/prompts/development/03-debug-runtime-issues.txt +55 -0
  233. package/.claude/workflows/cli-templates/prompts/documentation/api.txt +15 -0
  234. package/.claude/workflows/cli-templates/prompts/documentation/folder-navigation.txt +27 -0
  235. package/.claude/workflows/cli-templates/prompts/documentation/module-readme.txt +49 -0
  236. package/.claude/workflows/cli-templates/prompts/documentation/project-architecture.txt +41 -0
  237. package/.claude/workflows/cli-templates/prompts/documentation/project-examples.txt +35 -0
  238. package/.claude/workflows/cli-templates/prompts/documentation/project-readme.txt +35 -0
  239. package/.claude/workflows/cli-templates/prompts/memory/02-document-module-structure.txt +165 -0
  240. package/.claude/workflows/cli-templates/prompts/planning/01-plan-architecture-design.txt +109 -0
  241. package/.claude/workflows/cli-templates/prompts/planning/02-breakdown-task-steps.txt +30 -0
  242. package/.claude/workflows/cli-templates/prompts/planning/02-design-component-spec.txt +28 -0
  243. package/.claude/workflows/cli-templates/prompts/planning/03-evaluate-concept-feasibility.txt +127 -0
  244. package/.claude/workflows/cli-templates/prompts/planning/03-plan-migration-strategy.txt +30 -0
  245. package/.claude/workflows/cli-templates/prompts/tech/tech-module-format.txt +359 -0
  246. package/.claude/workflows/cli-templates/prompts/tech/tech-skill-index.txt +185 -0
  247. package/.claude/workflows/cli-templates/prompts/test/test-concept-analysis.txt +179 -0
  248. package/.claude/workflows/cli-templates/prompts/universal/00-universal-creative-style.txt +95 -0
  249. package/.claude/workflows/cli-templates/prompts/universal/00-universal-rigorous-style.txt +92 -0
  250. package/.claude/workflows/cli-templates/prompts/verification/codex-technical.txt +28 -0
  251. package/.claude/workflows/cli-templates/prompts/verification/cross-validation.txt +28 -0
  252. package/.claude/workflows/cli-templates/prompts/verification/gemini-strategic.txt +27 -0
  253. package/.claude/workflows/cli-templates/prompts/workflow/analysis-results-structure.txt +224 -0
  254. package/.claude/workflows/cli-templates/prompts/workflow/codex-feasibility-validation.txt +176 -0
  255. package/.claude/workflows/cli-templates/prompts/workflow/gemini-solution-design.txt +131 -0
  256. package/.claude/workflows/cli-templates/prompts/workflow/impl-plan-template.txt +286 -0
  257. package/.claude/workflows/cli-templates/prompts/workflow/skill-aggregation.txt +172 -0
  258. package/.claude/workflows/cli-templates/prompts/workflow/skill-conflict-patterns.txt +98 -0
  259. package/.claude/workflows/cli-templates/prompts/workflow/skill-index.txt +224 -0
  260. package/.claude/workflows/cli-templates/prompts/workflow/skill-lessons-learned.txt +98 -0
  261. package/.claude/workflows/cli-templates/prompts/workflow/skill-sessions-timeline.txt +53 -0
  262. package/.claude/workflows/cli-templates/prompts/workflow/task-json-agent-mode.txt +123 -0
  263. package/.claude/workflows/cli-templates/prompts/workflow/task-json-cli-mode.txt +182 -0
  264. package/.claude/workflows/cli-templates/schemas/diagnosis-json-schema.json +234 -0
  265. package/.claude/workflows/cli-templates/schemas/explore-json-schema.json +124 -0
  266. package/.claude/workflows/cli-templates/schemas/fix-plan-json-schema.json +273 -0
  267. package/.claude/workflows/cli-templates/schemas/plan-json-schema.json +219 -0
  268. package/.claude/workflows/cli-templates/schemas/project-json-schema.json +221 -0
  269. package/.claude/workflows/cli-templates/schemas/review-deep-dive-results-schema.json +82 -0
  270. package/.claude/workflows/cli-templates/schemas/review-dimension-results-schema.json +51 -0
  271. package/.claude/workflows/cli-templates/tech-stacks/go-dev.md +91 -0
  272. package/.claude/workflows/cli-templates/tech-stacks/java-dev.md +107 -0
  273. package/.claude/workflows/cli-templates/tech-stacks/javascript-dev.md +58 -0
  274. package/.claude/workflows/cli-templates/tech-stacks/python-dev.md +79 -0
  275. package/.claude/workflows/cli-templates/tech-stacks/react-dev.md +103 -0
  276. package/.claude/workflows/cli-templates/tech-stacks/typescript-dev.md +83 -0
  277. package/.claude/workflows/cli-templates/ui-design/systems/animation-tokens.json +247 -0
  278. package/.claude/workflows/cli-templates/ui-design/systems/design-tokens.json +342 -0
  279. package/.claude/workflows/cli-templates/ui-design/systems/layout-templates.json +145 -0
  280. package/.claude/workflows/context-search-strategy.md +77 -0
  281. package/.claude/workflows/intelligent-tools-strategy.md +662 -0
  282. package/.claude/workflows/review-directory-specification.md +336 -0
  283. package/.claude/workflows/task-core.md +214 -0
  284. package/.claude/workflows/tool-strategy.md +71 -0
  285. package/.claude/workflows/workflow-architecture.md +942 -0
  286. package/.codex/AGENTS.md +330 -0
  287. package/.gemini/GEMINI.md +164 -0
  288. package/.qwen/QWEN.md +164 -0
  289. package/CLAUDE.md +91 -0
  290. package/LICENSE +21 -0
  291. package/README.md +219 -0
  292. package/ccw/README.md +121 -0
  293. package/ccw/bin/ccw.js +10 -0
  294. package/ccw/src/cli.js +100 -0
  295. package/ccw/src/commands/install.js +324 -0
  296. package/ccw/src/commands/list.js +37 -0
  297. package/ccw/src/commands/serve.js +67 -0
  298. package/ccw/src/commands/uninstall.js +238 -0
  299. package/ccw/src/commands/upgrade.js +307 -0
  300. package/ccw/src/commands/view.js +14 -0
  301. package/ccw/src/core/dashboard-generator-patch.js +29 -0
  302. package/ccw/src/core/dashboard-generator.js +667 -0
  303. package/ccw/src/core/data-aggregator.js +409 -0
  304. package/ccw/src/core/lite-scanner.js +290 -0
  305. package/ccw/src/core/manifest.js +201 -0
  306. package/ccw/src/core/server.js +1327 -0
  307. package/ccw/src/core/server.js.bak +385 -0
  308. package/ccw/src/core/server_original.bak +385 -0
  309. package/ccw/src/core/session-scanner.js +235 -0
  310. package/ccw/src/index.js +9 -0
  311. package/ccw/src/templates/dashboard-js/api.js +200 -0
  312. package/ccw/src/templates/dashboard-js/components/_conflict_tab.js +112 -0
  313. package/ccw/src/templates/dashboard-js/components/_exp_helpers.js +54 -0
  314. package/ccw/src/templates/dashboard-js/components/_review_tab.js +640 -0
  315. package/ccw/src/templates/dashboard-js/components/carousel.js +398 -0
  316. package/ccw/src/templates/dashboard-js/components/flowchart.js +493 -0
  317. package/ccw/src/templates/dashboard-js/components/hook-manager.js +273 -0
  318. package/ccw/src/templates/dashboard-js/components/mcp-manager.js +506 -0
  319. package/ccw/src/templates/dashboard-js/components/modals.js +260 -0
  320. package/ccw/src/templates/dashboard-js/components/navigation.js +239 -0
  321. package/ccw/src/templates/dashboard-js/components/notifications.js +194 -0
  322. package/ccw/src/templates/dashboard-js/components/sidebar.js +31 -0
  323. package/ccw/src/templates/dashboard-js/components/tabs-context.js +1093 -0
  324. package/ccw/src/templates/dashboard-js/components/tabs-other.js +273 -0
  325. package/ccw/src/templates/dashboard-js/components/task-drawer-core.js +477 -0
  326. package/ccw/src/templates/dashboard-js/components/task-drawer-renderers.js +447 -0
  327. package/ccw/src/templates/dashboard-js/components/theme.js +21 -0
  328. package/ccw/src/templates/dashboard-js/main.js +57 -0
  329. package/ccw/src/templates/dashboard-js/state.js +37 -0
  330. package/ccw/src/templates/dashboard-js/utils.js +153 -0
  331. package/ccw/src/templates/dashboard-js/views/fix-session.js +180 -0
  332. package/ccw/src/templates/dashboard-js/views/home.js +193 -0
  333. package/ccw/src/templates/dashboard-js/views/hook-manager.js +387 -0
  334. package/ccw/src/templates/dashboard-js/views/lite-tasks.js +390 -0
  335. package/ccw/src/templates/dashboard-js/views/mcp-manager.js +271 -0
  336. package/ccw/src/templates/dashboard-js/views/project-overview.js +246 -0
  337. package/ccw/src/templates/dashboard-js/views/review-session.js +711 -0
  338. package/ccw/src/templates/dashboard-js/views/session-detail.js +770 -0
  339. package/ccw/src/templates/dashboard.css +7660 -0
  340. package/ccw/src/templates/dashboard.html +630 -0
  341. package/ccw/src/templates/dashboard_tailwind.html +42 -0
  342. package/ccw/src/templates/dashboard_test.html +37 -0
  343. package/ccw/src/templates/review-cycle-dashboard.html +1930 -0
  344. package/ccw/src/templates/tailwind-base.css +212 -0
  345. package/ccw/src/templates/workflow-dashboard.html +401 -0
  346. package/ccw/src/utils/browser-launcher.js +49 -0
  347. package/ccw/src/utils/file-utils.js +48 -0
  348. package/ccw/src/utils/path-resolver.js +279 -0
  349. package/ccw/src/utils/ui.js +148 -0
  350. package/package.json +66 -0
@@ -0,0 +1,385 @@
1
+ import http from 'http';
2
+ import { URL } from 'url';
3
+ import { readFileSync, existsSync, readdirSync } from 'fs';
4
+ import { join } from 'path';
5
+ import { scanSessions } from './session-scanner.js';
6
+ import { aggregateData } from './data-aggregator.js';
7
+ import { resolvePath, getRecentPaths, trackRecentPath, normalizePathForDisplay, getWorkflowDir } from '../utils/path-resolver.js';
8
+
9
+ const TEMPLATE_PATH = join(import.meta.dirname, '../templates/dashboard.html');
10
+ const CSS_FILE = join(import.meta.dirname, '../templates/dashboard.css');
11
+ const JS_FILE = join(import.meta.dirname, '../templates/dashboard.js');
12
+
13
+ /**
14
+ * Create and start the dashboard server
15
+ * @param {Object} options - Server options
16
+ * @param {number} options.port - Port to listen on (default: 3456)
17
+ * @param {string} options.initialPath - Initial project path
18
+ * @returns {Promise<http.Server>}
19
+ */
20
+ export async function startServer(options = {}) {
21
+ const port = options.port || 3456;
22
+ const initialPath = options.initialPath || process.cwd();
23
+
24
+ const server = http.createServer(async (req, res) => {
25
+ const url = new URL(req.url, `http://localhost:${port}`);
26
+ const pathname = url.pathname;
27
+
28
+ // CORS headers for API requests
29
+ res.setHeader('Access-Control-Allow-Origin', '*');
30
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
31
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
32
+
33
+ if (req.method === 'OPTIONS') {
34
+ res.writeHead(200);
35
+ res.end();
36
+ return;
37
+ }
38
+
39
+ try {
40
+ // API: Get workflow data for a path
41
+ if (pathname === '/api/data') {
42
+ const projectPath = url.searchParams.get('path') || initialPath;
43
+ const data = await getWorkflowData(projectPath);
44
+
45
+ res.writeHead(200, { 'Content-Type': 'application/json' });
46
+ res.end(JSON.stringify(data));
47
+ return;
48
+ }
49
+
50
+ // API: Get recent paths
51
+ if (pathname === '/api/recent-paths') {
52
+ const paths = getRecentPaths();
53
+ res.writeHead(200, { 'Content-Type': 'application/json' });
54
+ res.end(JSON.stringify({ paths }));
55
+ return;
56
+ }
57
+
58
+ // API: Get session detail data (context, summaries, impl-plan, review)
59
+ if (pathname === '/api/session-detail') {
60
+ const sessionPath = url.searchParams.get('path');
61
+ const dataType = url.searchParams.get('type') || 'all';
62
+
63
+ if (!sessionPath) {
64
+ res.writeHead(400, { 'Content-Type': 'application/json' });
65
+ res.end(JSON.stringify({ error: 'Session path is required' }));
66
+ return;
67
+ }
68
+
69
+ const detail = await getSessionDetailData(sessionPath, dataType);
70
+ res.writeHead(200, { 'Content-Type': 'application/json' });
71
+ res.end(JSON.stringify(detail));
72
+ return;
73
+ }
74
+
75
+ // Serve dashboard HTML
76
+ if (pathname === '/' || pathname === '/index.html') {
77
+ const html = generateServerDashboard(initialPath);
78
+ res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
79
+ res.end(html);
80
+ return;
81
+ }
82
+
83
+ // 404
84
+ res.writeHead(404, { 'Content-Type': 'text/plain' });
85
+ res.end('Not Found');
86
+
87
+ } catch (error) {
88
+ console.error('Server error:', error);
89
+ res.writeHead(500, { 'Content-Type': 'application/json' });
90
+ res.end(JSON.stringify({ error: error.message }));
91
+ }
92
+ });
93
+
94
+ return new Promise((resolve, reject) => {
95
+ server.listen(port, () => {
96
+ console.log(`Dashboard server running at http://localhost:${port}`);
97
+ resolve(server);
98
+ });
99
+ server.on('error', reject);
100
+ });
101
+ }
102
+
103
+ /**
104
+ * Get workflow data for a project path
105
+ * @param {string} projectPath
106
+ * @returns {Promise<Object>}
107
+ */
108
+ async function getWorkflowData(projectPath) {
109
+ const resolvedPath = resolvePath(projectPath);
110
+ const workflowDir = join(resolvedPath, '.workflow');
111
+
112
+ // Track this path
113
+ trackRecentPath(resolvedPath);
114
+
115
+ // Check if .workflow exists
116
+ if (!existsSync(workflowDir)) {
117
+ return {
118
+ generatedAt: new Date().toISOString(),
119
+ activeSessions: [],
120
+ archivedSessions: [],
121
+ liteTasks: { litePlan: [], liteFix: [] },
122
+ reviewData: { dimensions: {} },
123
+ projectOverview: null,
124
+ statistics: {
125
+ totalSessions: 0,
126
+ activeSessions: 0,
127
+ totalTasks: 0,
128
+ completedTasks: 0,
129
+ reviewFindings: 0,
130
+ litePlanCount: 0,
131
+ liteFixCount: 0
132
+ },
133
+ projectPath: normalizePathForDisplay(resolvedPath),
134
+ recentPaths: getRecentPaths()
135
+ };
136
+ }
137
+
138
+ // Scan and aggregate data
139
+ const sessions = await scanSessions(workflowDir);
140
+ const data = await aggregateData(sessions, workflowDir);
141
+
142
+ data.projectPath = normalizePathForDisplay(resolvedPath);
143
+ data.recentPaths = getRecentPaths();
144
+
145
+ return data;
146
+ }
147
+
148
+ /**
149
+ * Get session detail data (context, summaries, impl-plan, review)
150
+ * @param {string} sessionPath - Path to session directory
151
+ * @param {string} dataType - Type of data to load: context, summary, impl-plan, review, or all
152
+ * @returns {Promise<Object>}
153
+ */
154
+ async function getSessionDetailData(sessionPath, dataType) {
155
+ const result = {};
156
+
157
+ // Normalize path
158
+ const normalizedPath = sessionPath.replace(/\\/g, '/');
159
+
160
+ try {
161
+ // Load context-package.json (in .process/ subfolder)
162
+ if (dataType === 'context' || dataType === 'all') {
163
+ // Try .process/context-package.json first (common location)
164
+ let contextFile = join(normalizedPath, '.process', 'context-package.json');
165
+ if (!existsSync(contextFile)) {
166
+ // Fallback to session root
167
+ contextFile = join(normalizedPath, 'context-package.json');
168
+ }
169
+ if (existsSync(contextFile)) {
170
+ try {
171
+ result.context = JSON.parse(readFileSync(contextFile, 'utf8'));
172
+ } catch (e) {
173
+ result.context = null;
174
+ }
175
+ }
176
+ }
177
+
178
+ // Load task JSONs from .task/ folder
179
+ if (dataType === 'tasks' || dataType === 'all') {
180
+ const taskDir = join(normalizedPath, '.task');
181
+ result.tasks = [];
182
+ if (existsSync(taskDir)) {
183
+ const files = readdirSync(taskDir).filter(f => f.endsWith('.json') && f.startsWith('IMPL-'));
184
+ for (const file of files) {
185
+ try {
186
+ const content = JSON.parse(readFileSync(join(taskDir, file), 'utf8'));
187
+ result.tasks.push({
188
+ filename: file,
189
+ task_id: file.replace('.json', ''),
190
+ ...content
191
+ });
192
+ } catch (e) {
193
+ // Skip unreadable files
194
+ }
195
+ }
196
+ // Sort by task ID
197
+ result.tasks.sort((a, b) => a.task_id.localeCompare(b.task_id));
198
+ }
199
+ }
200
+
201
+ // Load summaries from .summaries/
202
+ if (dataType === 'summary' || dataType === 'all') {
203
+ const summariesDir = join(normalizedPath, '.summaries');
204
+ result.summaries = [];
205
+ if (existsSync(summariesDir)) {
206
+ const files = readdirSync(summariesDir).filter(f => f.endsWith('.md'));
207
+ for (const file of files) {
208
+ try {
209
+ const content = readFileSync(join(summariesDir, file), 'utf8');
210
+ result.summaries.push({ name: file.replace('.md', ''), content });
211
+ } catch (e) {
212
+ // Skip unreadable files
213
+ }
214
+ }
215
+ }
216
+ }
217
+
218
+ // Load plan.json (for lite tasks)
219
+ if (dataType === 'plan' || dataType === 'all') {
220
+ const planFile = join(normalizedPath, 'plan.json');
221
+ if (existsSync(planFile)) {
222
+ try {
223
+ result.plan = JSON.parse(readFileSync(planFile, 'utf8'));
224
+ } catch (e) {
225
+ result.plan = null;
226
+ }
227
+ }
228
+ }
229
+
230
+ // Load IMPL_PLAN.md
231
+ if (dataType === 'impl-plan' || dataType === 'all') {
232
+ const implPlanFile = join(normalizedPath, 'IMPL_PLAN.md');
233
+ if (existsSync(implPlanFile)) {
234
+ try {
235
+ result.implPlan = readFileSync(implPlanFile, 'utf8');
236
+ } catch (e) {
237
+ result.implPlan = null;
238
+ }
239
+ }
240
+ }
241
+
242
+ // Load review data from .review/
243
+ if (dataType === 'review' || dataType === 'all') {
244
+ const reviewDir = join(normalizedPath, '.review');
245
+ result.review = {
246
+ state: null,
247
+ dimensions: [],
248
+ severityDistribution: null,
249
+ totalFindings: 0
250
+ };
251
+
252
+ if (existsSync(reviewDir)) {
253
+ // Load review-state.json
254
+ const stateFile = join(reviewDir, 'review-state.json');
255
+ if (existsSync(stateFile)) {
256
+ try {
257
+ const state = JSON.parse(readFileSync(stateFile, 'utf8'));
258
+ result.review.state = state;
259
+ result.review.severityDistribution = state.severity_distribution || {};
260
+ result.review.totalFindings = state.total_findings || 0;
261
+ result.review.phase = state.phase || 'unknown';
262
+ result.review.dimensionSummaries = state.dimension_summaries || {};
263
+ result.review.crossCuttingConcerns = state.cross_cutting_concerns || [];
264
+ result.review.criticalFiles = state.critical_files || [];
265
+ } catch (e) {
266
+ // Skip unreadable state
267
+ }
268
+ }
269
+
270
+ // Load dimension findings
271
+ const dimensionsDir = join(reviewDir, 'dimensions');
272
+ if (existsSync(dimensionsDir)) {
273
+ const files = readdirSync(dimensionsDir).filter(f => f.endsWith('.json'));
274
+ for (const file of files) {
275
+ try {
276
+ const dimName = file.replace('.json', '');
277
+ const data = JSON.parse(readFileSync(join(dimensionsDir, file), 'utf8'));
278
+
279
+ // Handle array structure: [ { findings: [...] } ]
280
+ let findings = [];
281
+ let summary = null;
282
+
283
+ if (Array.isArray(data) && data.length > 0) {
284
+ const dimData = data[0];
285
+ findings = dimData.findings || [];
286
+ summary = dimData.summary || null;
287
+ } else if (data.findings) {
288
+ findings = data.findings;
289
+ summary = data.summary || null;
290
+ }
291
+
292
+ result.review.dimensions.push({
293
+ name: dimName,
294
+ findings: findings,
295
+ summary: summary,
296
+ count: findings.length
297
+ });
298
+ } catch (e) {
299
+ // Skip unreadable files
300
+ }
301
+ }
302
+ }
303
+ }
304
+ }
305
+
306
+ } catch (error) {
307
+ console.error('Error loading session detail:', error);
308
+ result.error = error.message;
309
+ }
310
+
311
+ return result;
312
+ }
313
+
314
+ /**
315
+ * Generate dashboard HTML for server mode
316
+ * @param {string} initialPath
317
+ * @returns {string}
318
+ */
319
+ function generateServerDashboard(initialPath) {
320
+ let html = readFileSync(TEMPLATE_PATH, 'utf8');
321
+
322
+ // Read CSS and JS files
323
+ const cssContent = existsSync(CSS_FILE) ? readFileSync(CSS_FILE, 'utf8') : '';
324
+ let jsContent = existsSync(JS_FILE) ? readFileSync(JS_FILE, 'utf8') : '';
325
+
326
+ // Inject CSS content
327
+ html = html.replace('{{CSS_CONTENT}}', cssContent);
328
+
329
+ // Prepare JS content with empty initial data (will be loaded dynamically)
330
+ const emptyData = {
331
+ generatedAt: new Date().toISOString(),
332
+ activeSessions: [],
333
+ archivedSessions: [],
334
+ liteTasks: { litePlan: [], liteFix: [] },
335
+ reviewData: { dimensions: {} },
336
+ projectOverview: null,
337
+ statistics: { totalSessions: 0, activeSessions: 0, totalTasks: 0, completedTasks: 0, reviewFindings: 0, litePlanCount: 0, liteFixCount: 0 }
338
+ };
339
+
340
+ // Replace JS placeholders
341
+ jsContent = jsContent.replace('{{WORKFLOW_DATA}}', JSON.stringify(emptyData, null, 2));
342
+ jsContent = jsContent.replace(/\{\{PROJECT_PATH\}\}/g, normalizePathForDisplay(initialPath).replace(/\\/g, '/'));
343
+ jsContent = jsContent.replace('{{RECENT_PATHS}}', JSON.stringify(getRecentPaths()));
344
+
345
+ // Add server mode flag and dynamic loading functions at the start of JS
346
+ const serverModeScript = `
347
+ // Server mode - load data dynamically
348
+ window.SERVER_MODE = true;
349
+ window.INITIAL_PATH = '${normalizePathForDisplay(initialPath).replace(/\\/g, '/')}';
350
+
351
+ async function loadDashboardData(path) {
352
+ try {
353
+ const res = await fetch('/api/data?path=' + encodeURIComponent(path));
354
+ if (!res.ok) throw new Error('Failed to load data');
355
+ return await res.json();
356
+ } catch (err) {
357
+ console.error('Error loading data:', err);
358
+ return null;
359
+ }
360
+ }
361
+
362
+ async function loadRecentPaths() {
363
+ try {
364
+ const res = await fetch('/api/recent-paths');
365
+ if (!res.ok) return [];
366
+ const data = await res.json();
367
+ return data.paths || [];
368
+ } catch (err) {
369
+ return [];
370
+ }
371
+ }
372
+
373
+ `;
374
+
375
+ // Prepend server mode script to JS content
376
+ jsContent = serverModeScript + jsContent;
377
+
378
+ // Inject JS content
379
+ html = html.replace('{{JS_CONTENT}}', jsContent);
380
+
381
+ // Replace any remaining placeholders in HTML
382
+ html = html.replace(/\{\{PROJECT_PATH\}\}/g, normalizePathForDisplay(initialPath).replace(/\\/g, '/'));
383
+
384
+ return html;
385
+ }
@@ -0,0 +1,235 @@
1
+ import { glob } from 'glob';
2
+ import { readFileSync, existsSync, statSync, readdirSync } from 'fs';
3
+ import { join, basename } from 'path';
4
+
5
+ /**
6
+ * Scan .workflow directory for active and archived sessions
7
+ * @param {string} workflowDir - Path to .workflow directory
8
+ * @returns {Promise<{active: Array, archived: Array, hasReviewData: boolean}>}
9
+ */
10
+ export async function scanSessions(workflowDir) {
11
+ const result = {
12
+ active: [],
13
+ archived: [],
14
+ hasReviewData: false
15
+ };
16
+
17
+ if (!existsSync(workflowDir)) {
18
+ return result;
19
+ }
20
+
21
+ // Scan active sessions
22
+ const activeDir = join(workflowDir, 'active');
23
+ if (existsSync(activeDir)) {
24
+ const activeSessions = await findWfsSessions(activeDir);
25
+ for (const sessionName of activeSessions) {
26
+ const sessionPath = join(activeDir, sessionName);
27
+ const sessionData = readSessionData(sessionPath);
28
+ if (sessionData) {
29
+ result.active.push({
30
+ ...sessionData,
31
+ path: sessionPath,
32
+ isActive: true
33
+ });
34
+ // Check for review data
35
+ if (existsSync(join(sessionPath, '.review'))) {
36
+ result.hasReviewData = true;
37
+ }
38
+ }
39
+ }
40
+ }
41
+
42
+ // Scan archived sessions
43
+ const archivesDir = join(workflowDir, 'archives');
44
+ if (existsSync(archivesDir)) {
45
+ const archivedSessions = await findWfsSessions(archivesDir);
46
+ for (const sessionName of archivedSessions) {
47
+ const sessionPath = join(archivesDir, sessionName);
48
+ const sessionData = readSessionData(sessionPath);
49
+ if (sessionData) {
50
+ result.archived.push({
51
+ ...sessionData,
52
+ path: sessionPath,
53
+ isActive: false
54
+ });
55
+ }
56
+ }
57
+ }
58
+
59
+ // Sort by creation date (newest first)
60
+ result.active.sort((a, b) => new Date(b.created_at || 0) - new Date(a.created_at || 0));
61
+ result.archived.sort((a, b) => new Date(b.archived_at || b.created_at || 0) - new Date(a.archived_at || a.created_at || 0));
62
+
63
+ return result;
64
+ }
65
+
66
+ /**
67
+ * Find WFS-* directories in a given path
68
+ * @param {string} dir - Directory to search
69
+ * @returns {Promise<string[]>} - Array of session directory names
70
+ */
71
+ async function findWfsSessions(dir) {
72
+ try {
73
+ // Use glob for cross-platform pattern matching
74
+ const sessions = await glob('WFS-*', {
75
+ cwd: dir,
76
+ onlyDirectories: true,
77
+ absolute: false
78
+ });
79
+ return sessions;
80
+ } catch {
81
+ // Fallback: manual directory listing
82
+ try {
83
+ const entries = readdirSync(dir, { withFileTypes: true });
84
+ return entries
85
+ .filter(e => e.isDirectory() && e.name.startsWith('WFS-'))
86
+ .map(e => e.name);
87
+ } catch {
88
+ return [];
89
+ }
90
+ }
91
+ }
92
+
93
+ /**
94
+ * Parse timestamp from session name
95
+ * Supports formats: WFS-xxx-20251128172537 or WFS-xxx-20251120-170640
96
+ * @param {string} sessionName - Session directory name
97
+ * @returns {string|null} - ISO date string or null
98
+ */
99
+ function parseTimestampFromName(sessionName) {
100
+ // Format: 14-digit timestamp (YYYYMMDDHHmmss)
101
+ const match14 = sessionName.match(/(\d{14})$/);
102
+ if (match14) {
103
+ const ts = match14[1];
104
+ return `${ts.slice(0,4)}-${ts.slice(4,6)}-${ts.slice(6,8)}T${ts.slice(8,10)}:${ts.slice(10,12)}:${ts.slice(12,14)}Z`;
105
+ }
106
+
107
+ // Format: 8-digit date + 6-digit time separated by hyphen (YYYYMMDD-HHmmss)
108
+ const match8_6 = sessionName.match(/(\d{8})-(\d{6})$/);
109
+ if (match8_6) {
110
+ const d = match8_6[1];
111
+ const t = match8_6[2];
112
+ return `${d.slice(0,4)}-${d.slice(4,6)}-${d.slice(6,8)}T${t.slice(0,2)}:${t.slice(2,4)}:${t.slice(4,6)}Z`;
113
+ }
114
+
115
+ return null;
116
+ }
117
+
118
+ /**
119
+ * Infer session type from session name pattern
120
+ * @param {string} sessionName - Session directory name
121
+ * @returns {string} - Inferred type
122
+ */
123
+ function inferTypeFromName(sessionName) {
124
+ const name = sessionName.toLowerCase();
125
+
126
+ if (name.includes('-review-') || name.includes('-code-review-')) {
127
+ return 'review';
128
+ }
129
+ if (name.includes('-test-')) {
130
+ return 'test';
131
+ }
132
+ if (name.includes('-docs-')) {
133
+ return 'docs';
134
+ }
135
+ if (name.includes('-tdd-')) {
136
+ return 'tdd';
137
+ }
138
+
139
+ return 'workflow';
140
+ }
141
+
142
+ /**
143
+ * Read session data from workflow-session.json or create minimal from directory
144
+ * @param {string} sessionPath - Path to session directory
145
+ * @returns {Object|null} - Session data object or null if invalid
146
+ */
147
+ function readSessionData(sessionPath) {
148
+ const sessionFile = join(sessionPath, 'workflow-session.json');
149
+ const sessionName = basename(sessionPath);
150
+
151
+ if (existsSync(sessionFile)) {
152
+ try {
153
+ const data = JSON.parse(readFileSync(sessionFile, 'utf8'));
154
+
155
+ // Multi-level type detection: JSON type > workflow_type > infer from name
156
+ let type = data.type || data.workflow_type || inferTypeFromName(sessionName);
157
+
158
+ // Normalize workflow_type values
159
+ if (type === 'test_session') type = 'test';
160
+ if (type === 'implementation') type = 'workflow';
161
+
162
+ return {
163
+ session_id: data.session_id || sessionName,
164
+ project: data.project || data.description || '',
165
+ status: data.status || 'active',
166
+ created_at: data.created_at || data.initialized_at || data.timestamp || null,
167
+ archived_at: data.archived_at || null,
168
+ type: type,
169
+ workflow_type: data.workflow_type || null // Keep original for reference
170
+ };
171
+ } catch {
172
+ // Fall through to minimal session
173
+ }
174
+ }
175
+
176
+ // Fallback: create minimal session from directory info
177
+ // Try to extract timestamp from session name first
178
+ const timestampFromName = parseTimestampFromName(sessionName);
179
+ const inferredType = inferTypeFromName(sessionName);
180
+
181
+ try {
182
+ const stats = statSync(sessionPath);
183
+ return {
184
+ session_id: sessionName,
185
+ project: '',
186
+ status: 'unknown',
187
+ created_at: timestampFromName || stats.birthtime.toISOString(),
188
+ archived_at: null,
189
+ type: inferredType,
190
+ workflow_type: null
191
+ };
192
+ } catch {
193
+ // Even if stat fails, return with name-extracted data
194
+ if (timestampFromName) {
195
+ return {
196
+ session_id: sessionName,
197
+ project: '',
198
+ status: 'unknown',
199
+ created_at: timestampFromName,
200
+ archived_at: null,
201
+ type: inferredType,
202
+ workflow_type: null
203
+ };
204
+ }
205
+ return null;
206
+ }
207
+ }
208
+
209
+ /**
210
+ * Check if session has review data
211
+ * @param {string} sessionPath - Path to session directory
212
+ * @returns {boolean}
213
+ */
214
+ export function hasReviewData(sessionPath) {
215
+ const reviewDir = join(sessionPath, '.review');
216
+ return existsSync(reviewDir);
217
+ }
218
+
219
+ /**
220
+ * Get list of task files in session
221
+ * @param {string} sessionPath - Path to session directory
222
+ * @returns {Promise<string[]>}
223
+ */
224
+ export async function getTaskFiles(sessionPath) {
225
+ const taskDir = join(sessionPath, '.task');
226
+ if (!existsSync(taskDir)) {
227
+ return [];
228
+ }
229
+
230
+ try {
231
+ return await glob('IMPL-*.json', { cwd: taskDir, absolute: false });
232
+ } catch {
233
+ return [];
234
+ }
235
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * CCW - Claude Code Workflow CLI
3
+ * Main exports for programmatic usage
4
+ */
5
+
6
+ export { run } from './cli.js';
7
+ export { scanSessions } from './core/session-scanner.js';
8
+ export { aggregateData } from './core/data-aggregator.js';
9
+ export { generateDashboard } from './core/dashboard-generator.js';