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,770 @@
1
+ // ============================================
2
+ // SESSION DETAIL VIEW
3
+ // ============================================
4
+ // Standard workflow session detail page rendering
5
+
6
+ function showSessionDetailPage(sessionKey) {
7
+ const session = sessionDataStore[sessionKey];
8
+ if (!session) return;
9
+
10
+ currentView = 'sessionDetail';
11
+ currentSessionDetailKey = sessionKey;
12
+ updateContentTitle();
13
+
14
+ // Hide stats grid and carousel on detail pages
15
+ hideStatsAndCarousel();
16
+
17
+ const container = document.getElementById('mainContent');
18
+ const sessionType = session.type || 'workflow';
19
+
20
+ // Render specialized pages for review and test-fix sessions
21
+ if (sessionType === 'review' || sessionType === 'review-cycle') {
22
+ container.innerHTML = renderReviewSessionDetailPage(session);
23
+ initReviewSessionPage(session);
24
+ return;
25
+ }
26
+
27
+ if (sessionType === 'test-fix' || sessionType === 'fix') {
28
+ container.innerHTML = renderFixSessionDetailPage(session);
29
+ initFixSessionPage(session);
30
+ return;
31
+ }
32
+
33
+ // Default workflow session detail page
34
+ const tasks = session.tasks || [];
35
+ const completed = tasks.filter(t => t.status === 'completed').length;
36
+ const inProgress = tasks.filter(t => t.status === 'in_progress').length;
37
+ const pending = tasks.filter(t => t.status === 'pending').length;
38
+ const isActive = session._isActive !== false;
39
+
40
+ container.innerHTML = `
41
+ <div class="session-detail-page">
42
+ <!-- Header -->
43
+ <div class="detail-header">
44
+ <button class="btn-back" onclick="goBackToSessions()">
45
+ <span class="back-icon">←</span>
46
+ <span>Back to Sessions</span>
47
+ </button>
48
+ <div class="detail-title-row">
49
+ <h2 class="detail-session-id">${escapeHtml(session.session_id)}</h2>
50
+ <div class="detail-badges">
51
+ <span class="session-type-badge ${session.type || 'workflow'}">${session.type || 'workflow'}</span>
52
+ <span class="session-status ${isActive ? 'active' : 'archived'}">
53
+ ${isActive ? 'ACTIVE' : 'ARCHIVED'}
54
+ </span>
55
+ </div>
56
+ </div>
57
+ </div>
58
+
59
+ <!-- Session Info Bar -->
60
+ <div class="detail-info-bar">
61
+ <div class="info-item">
62
+ <span class="info-label">Created:</span>
63
+ <span class="info-value">${formatDate(session.created_at)}</span>
64
+ </div>
65
+ ${session.archived_at ? `
66
+ <div class="info-item">
67
+ <span class="info-label">Archived:</span>
68
+ <span class="info-value">${formatDate(session.archived_at)}</span>
69
+ </div>
70
+ ` : ''}
71
+ <div class="info-item">
72
+ <span class="info-label">Project:</span>
73
+ <span class="info-value">${escapeHtml(session.project || '-')}</span>
74
+ </div>
75
+ <div class="info-item">
76
+ <span class="info-label">Tasks:</span>
77
+ <span class="info-value">${completed}/${tasks.length} completed</span>
78
+ </div>
79
+ </div>
80
+
81
+ <!-- Tab Navigation -->
82
+ <div class="detail-tabs">
83
+ <button class="detail-tab active" data-tab="tasks" onclick="switchDetailTab('tasks')">
84
+ <span class="tab-icon">📋</span>
85
+ <span class="tab-text">Tasks</span>
86
+ <span class="tab-count">${tasks.length}</span>
87
+ </button>
88
+ <button class="detail-tab" data-tab="context" onclick="switchDetailTab('context')">
89
+ <span class="tab-icon">📦</span>
90
+ <span class="tab-text">Context</span>
91
+ </button>
92
+ <button class="detail-tab" data-tab="summary" onclick="switchDetailTab('summary')">
93
+ <span class="tab-icon">📝</span>
94
+ <span class="tab-text">Summary</span>
95
+ </button>
96
+ <button class="detail-tab" data-tab="impl-plan" onclick="switchDetailTab('impl-plan')">
97
+ <span class="tab-icon">📐</span>
98
+ <span class="tab-text">IMPL Plan</span>
99
+ </button>
100
+ <button class="detail-tab" data-tab="conflict" onclick="switchDetailTab('conflict')"> <span class="tab-icon">⚖️</span> <span class="tab-text">Conflict</span> </button>
101
+ ${session.hasReview ? `
102
+ <button class="detail-tab" data-tab="review" onclick="switchDetailTab('review')">
103
+ <span class="tab-icon">🔍</span>
104
+ <span class="tab-text">Review</span>
105
+ </button>
106
+ ` : ''}
107
+ </div>
108
+
109
+ <!-- Tab Content -->
110
+ <div class="detail-tab-content" id="detailTabContent">
111
+ ${renderTasksTab(session, tasks, completed, inProgress, pending)}
112
+ </div>
113
+ </div>
114
+ `;
115
+ }
116
+
117
+ function goBackToSessions() {
118
+ currentView = 'sessions';
119
+ currentSessionDetailKey = null;
120
+ updateContentTitle();
121
+ showStatsAndSearch();
122
+ renderSessions();
123
+ }
124
+
125
+ function switchDetailTab(tabName) {
126
+ // Update active tab
127
+ document.querySelectorAll('.detail-tab').forEach(tab => {
128
+ tab.classList.toggle('active', tab.dataset.tab === tabName);
129
+ });
130
+
131
+ const session = sessionDataStore[currentSessionDetailKey];
132
+ if (!session) return;
133
+
134
+ const contentArea = document.getElementById('detailTabContent');
135
+ const tasks = session.tasks || [];
136
+ const completed = tasks.filter(t => t.status === 'completed').length;
137
+ const inProgress = tasks.filter(t => t.status === 'in_progress').length;
138
+ const pending = tasks.filter(t => t.status === 'pending').length;
139
+
140
+ switch (tabName) {
141
+ case 'tasks':
142
+ contentArea.innerHTML = renderTasksTab(session, tasks, completed, inProgress, pending);
143
+ break;
144
+ case 'context':
145
+ loadAndRenderContextTab(session, contentArea);
146
+ break;
147
+ case 'summary':
148
+ loadAndRenderSummaryTab(session, contentArea);
149
+ break;
150
+ case 'impl-plan':
151
+ loadAndRenderImplPlanTab(session, contentArea);
152
+ break;
153
+ case 'review':
154
+ loadAndRenderReviewTab(session, contentArea);
155
+ break;
156
+ case 'conflict': loadAndRenderConflictTab(session, contentArea); break;
157
+ }
158
+ }
159
+
160
+ function renderTasksTab(session, tasks, completed, inProgress, pending) {
161
+ // Populate drawer tasks for click-to-open functionality
162
+ currentDrawerTasks = tasks;
163
+
164
+ // Auto-load full task details in server mode
165
+ if (window.SERVER_MODE && session.path) {
166
+ // Schedule auto-load after DOM render
167
+ setTimeout(() => loadFullTaskDetails(), 50);
168
+ }
169
+
170
+ // Show task list with loading state or basic list
171
+ const showLoading = window.SERVER_MODE && session.path;
172
+
173
+ return `
174
+ <div class="tasks-tab-content">
175
+ <!-- Combined Stats & Actions Bar -->
176
+ <div class="task-toolbar">
177
+ <div class="task-stats-bar">
178
+ <span class="task-stat completed">✓ ${completed} completed</span>
179
+ <span class="task-stat in-progress">⟳ ${inProgress} in progress</span>
180
+ <span class="task-stat pending">○ ${pending} pending</span>
181
+ </div>
182
+ <div class="toolbar-divider"></div>
183
+ <div class="task-bulk-actions">
184
+ <span class="bulk-label">Quick Actions:</span>
185
+ <button class="bulk-action-btn" onclick="bulkSetAllStatus('pending')" title="Set all tasks to pending">
186
+ <span class="bulk-icon">○</span> All Pending
187
+ </button>
188
+ <button class="bulk-action-btn" onclick="bulkSetAllStatus('in_progress')" title="Set all tasks to in progress">
189
+ <span class="bulk-icon">⟳</span> All In Progress
190
+ </button>
191
+ <button class="bulk-action-btn completed" onclick="bulkSetAllStatus('completed')" title="Set all tasks to completed">
192
+ <span class="bulk-icon">✓</span> All Completed
193
+ </button>
194
+ </div>
195
+ </div>
196
+
197
+ <div class="tasks-list" id="tasksListContent">
198
+ ${showLoading ? `
199
+ <div class="tab-loading">Loading task details...</div>
200
+ ` : (tasks.length === 0 ? `
201
+ <div class="tab-empty-state">
202
+ <div class="empty-icon">📋</div>
203
+ <div class="empty-title">No Tasks</div>
204
+ <div class="empty-text">This session has no tasks defined.</div>
205
+ </div>
206
+ ` : tasks.map(task => renderDetailTaskItem(task)).join(''))}
207
+ </div>
208
+ </div>
209
+ `;
210
+ }
211
+
212
+ async function loadFullTaskDetails() {
213
+ const session = sessionDataStore[currentSessionDetailKey];
214
+ if (!session || !window.SERVER_MODE || !session.path) return;
215
+
216
+ const tasksContainer = document.getElementById('tasksListContent');
217
+ tasksContainer.innerHTML = '<div class="tab-loading">Loading full task details...</div>';
218
+
219
+ try {
220
+ const response = await fetch(`/api/session-detail?path=${encodeURIComponent(session.path)}&type=tasks`);
221
+ if (response.ok) {
222
+ const data = await response.json();
223
+ if (data.tasks && data.tasks.length > 0) {
224
+ // Populate drawer tasks for click-to-open functionality
225
+ currentDrawerTasks = data.tasks;
226
+ tasksContainer.innerHTML = data.tasks.map(task => renderDetailTaskItem(task)).join('');
227
+ } else {
228
+ tasksContainer.innerHTML = `
229
+ <div class="tab-empty-state">
230
+ <div class="empty-icon">📋</div>
231
+ <div class="empty-title">No Task Files</div>
232
+ <div class="empty-text">No IMPL-*.json files found in .task/</div>
233
+ </div>
234
+ `;
235
+ }
236
+ }
237
+ } catch (err) {
238
+ tasksContainer.innerHTML = `<div class="tab-error">Failed to load tasks: ${err.message}</div>`;
239
+ }
240
+ }
241
+
242
+ function renderDetailTaskItem(task) {
243
+ const taskId = task.task_id || task.id || 'Unknown';
244
+ const status = task.status || 'pending';
245
+
246
+ // Status options for dropdown
247
+ const statusOptions = ['pending', 'in_progress', 'completed'];
248
+
249
+ return `
250
+ <div class="detail-task-item ${status} status-${status}" data-task-id="${escapeHtml(taskId)}">
251
+ <div class="task-item-header">
252
+ <span class="task-id-badge">${escapeHtml(taskId)}</span>
253
+ <span class="task-title" onclick="openTaskDrawer('${escapeHtml(taskId)}')" style="cursor: pointer; flex: 1;">
254
+ ${escapeHtml(task.title || task.meta?.title || 'Untitled')}
255
+ </span>
256
+ <div class="task-status-control" onclick="event.stopPropagation()">
257
+ <select class="task-status-select ${status}" onchange="updateSingleTaskStatus('${escapeHtml(taskId)}', this.value)" data-current="${status}">
258
+ ${statusOptions.map(opt => `
259
+ <option value="${opt}" ${opt === status ? 'selected' : ''}>${formatStatusLabel(opt)}</option>
260
+ `).join('')}
261
+ </select>
262
+ </div>
263
+ </div>
264
+ </div>
265
+ `;
266
+ }
267
+
268
+ function formatStatusLabel(status) {
269
+ const labels = {
270
+ 'pending': '○ Pending',
271
+ 'in_progress': '⟳ In Progress',
272
+ 'completed': '✓ Completed'
273
+ };
274
+ return labels[status] || status;
275
+ }
276
+
277
+ function getMetaPreview(task) {
278
+ const meta = task.meta || {};
279
+ const parts = [];
280
+ if (meta.type) parts.push(meta.type);
281
+ if (meta.action) parts.push(meta.action);
282
+ if (meta.scope) parts.push(meta.scope);
283
+ return parts.join(' | ') || 'No meta';
284
+ }
285
+
286
+ function getTaskContextPreview(task) {
287
+ const items = [];
288
+ const ctx = task.context || {};
289
+ if (ctx.requirements?.length) items.push(`${ctx.requirements.length} reqs`);
290
+ if (ctx.focus_paths?.length) items.push(`${ctx.focus_paths.length} paths`);
291
+ if (task.modification_points?.length) items.push(`${task.modification_points.length} mods`);
292
+ if (task.description) items.push('desc');
293
+ return items.join(' | ') || 'No context';
294
+ }
295
+
296
+ function getFlowPreview(task) {
297
+ const steps = task.flow_control?.implementation_approach?.length || task.implementation?.length || 0;
298
+ return steps > 0 ? `${steps} steps` : 'No steps';
299
+ }
300
+
301
+ function renderTaskContext(task) {
302
+ const sections = [];
303
+ const ctx = task.context || {};
304
+
305
+ // Description
306
+ if (task.description) {
307
+ sections.push(`
308
+ <div class="context-field">
309
+ <label>description:</label>
310
+ <p>${escapeHtml(task.description)}</p>
311
+ </div>
312
+ `);
313
+ }
314
+
315
+ // Requirements
316
+ if (ctx.requirements?.length) {
317
+ sections.push(`
318
+ <div class="context-field">
319
+ <label>requirements:</label>
320
+ <ul>${ctx.requirements.map(r => `<li>${escapeHtml(r)}</li>`).join('')}</ul>
321
+ </div>
322
+ `);
323
+ }
324
+
325
+ // Focus paths
326
+ if (ctx.focus_paths?.length) {
327
+ sections.push(`
328
+ <div class="context-field">
329
+ <label>focus_paths:</label>
330
+ <div class="path-tags">${ctx.focus_paths.map(p => `<span class="path-tag">${escapeHtml(p)}</span>`).join('')}</div>
331
+ </div>
332
+ `);
333
+ }
334
+
335
+ // Modification points
336
+ if (task.modification_points?.length) {
337
+ sections.push(`
338
+ <div class="context-field">
339
+ <label>modification_points:</label>
340
+ <div class="mod-points">
341
+ ${task.modification_points.map(m => `
342
+ <div class="mod-point">
343
+ <span class="array-item path-item">${escapeHtml(m.file || m)}</span>
344
+ ${m.target ? `<span class="mod-target">→ ${escapeHtml(m.target)}</span>` : ''}
345
+ ${m.change ? `<p class="mod-change">${escapeHtml(m.change)}</p>` : ''}
346
+ </div>
347
+ `).join('')}
348
+ </div>
349
+ </div>
350
+ `);
351
+ }
352
+
353
+ // Acceptance criteria
354
+ const acceptance = ctx.acceptance || task.acceptance || [];
355
+ if (acceptance.length) {
356
+ sections.push(`
357
+ <div class="context-field">
358
+ <label>acceptance:</label>
359
+ <ul>${acceptance.map(a => `<li>${escapeHtml(a)}</li>`).join('')}</ul>
360
+ </div>
361
+ `);
362
+ }
363
+
364
+ return sections.length > 0
365
+ ? `<div class="context-fields">${sections.join('')}</div>`
366
+ : '<div class="field-value json-value-null">No context data</div>';
367
+ }
368
+
369
+ function renderFlowControl(task) {
370
+ const sections = [];
371
+ const fc = task.flow_control || {};
372
+
373
+ // Implementation approach
374
+ const steps = fc.implementation_approach || task.implementation || [];
375
+ if (steps.length) {
376
+ sections.push(`
377
+ <div class="context-field">
378
+ <label>implementation_approach:</label>
379
+ <ol class="impl-steps">
380
+ ${steps.map(s => `<li>${escapeHtml(typeof s === 'string' ? s : s.step || s.action || JSON.stringify(s))}</li>`).join('')}
381
+ </ol>
382
+ </div>
383
+ `);
384
+ }
385
+
386
+ // Pre-analysis
387
+ const preAnalysis = fc.pre_analysis || task.pre_analysis || [];
388
+ if (preAnalysis.length) {
389
+ sections.push(`
390
+ <div class="context-field">
391
+ <label>pre_analysis:</label>
392
+ <ul>${preAnalysis.map(p => `<li>${escapeHtml(p)}</li>`).join('')}</ul>
393
+ </div>
394
+ `);
395
+ }
396
+
397
+ // Target files
398
+ const targetFiles = fc.target_files || task.target_files || [];
399
+ if (targetFiles.length) {
400
+ sections.push(`
401
+ <div class="context-field">
402
+ <label>target_files:</label>
403
+ <div class="path-tags">${targetFiles.map(f => `<span class="path-tag">${escapeHtml(f)}</span>`).join('')}</div>
404
+ </div>
405
+ `);
406
+ }
407
+
408
+ return sections.length > 0
409
+ ? `<div class="context-fields">${sections.join('')}</div>`
410
+ : '<div class="field-value json-value-null">No flow control data</div>';
411
+ }
412
+
413
+ async function loadAndRenderContextTab(session, contentArea) {
414
+ contentArea.innerHTML = '<div class="tab-loading">Loading context data...</div>';
415
+
416
+ try {
417
+ // Try to load context data from server (includes context, explorations, conflictResolution)
418
+ if (window.SERVER_MODE && session.path) {
419
+ const response = await fetch(`/api/session-detail?path=${encodeURIComponent(session.path)}&type=context`);
420
+ if (response.ok) {
421
+ const data = await response.json();
422
+ contentArea.innerHTML = renderSessionContextContent(data.context, data.explorations, data.conflictResolution);
423
+
424
+ // Initialize collapsible sections for explorations
425
+ initCollapsibleSections(contentArea);
426
+ return;
427
+ }
428
+ }
429
+ // Fallback: show placeholder
430
+ contentArea.innerHTML = `
431
+ <div class="tab-empty-state">
432
+ <div class="empty-icon">📦</div>
433
+ <div class="empty-title">Context Data</div>
434
+ <div class="empty-text">Context data will be loaded from context-package.json</div>
435
+ </div>
436
+ `;
437
+ } catch (err) {
438
+ contentArea.innerHTML = `<div class="tab-error">Failed to load context: ${err.message}</div>`;
439
+ }
440
+ }
441
+
442
+ async function loadAndRenderSummaryTab(session, contentArea) {
443
+ contentArea.innerHTML = '<div class="tab-loading">Loading summaries...</div>';
444
+
445
+ try {
446
+ if (window.SERVER_MODE && session.path) {
447
+ const response = await fetch(`/api/session-detail?path=${encodeURIComponent(session.path)}&type=summary`);
448
+ if (response.ok) {
449
+ const data = await response.json();
450
+ contentArea.innerHTML = renderSummaryContent(data.summaries);
451
+ return;
452
+ }
453
+ }
454
+ contentArea.innerHTML = `
455
+ <div class="tab-empty-state">
456
+ <div class="empty-icon">📝</div>
457
+ <div class="empty-title">Summaries</div>
458
+ <div class="empty-text">Session summaries will be loaded from .summaries/</div>
459
+ </div>
460
+ `;
461
+ } catch (err) {
462
+ contentArea.innerHTML = `<div class="tab-error">Failed to load summaries: ${err.message}</div>`;
463
+ }
464
+ }
465
+
466
+ async function loadAndRenderImplPlanTab(session, contentArea) {
467
+ contentArea.innerHTML = '<div class="tab-loading">Loading IMPL plan...</div>';
468
+
469
+ try {
470
+ if (window.SERVER_MODE && session.path) {
471
+ const response = await fetch(`/api/session-detail?path=${encodeURIComponent(session.path)}&type=impl-plan`);
472
+ if (response.ok) {
473
+ const data = await response.json();
474
+ contentArea.innerHTML = renderImplPlanContent(data.implPlan);
475
+ return;
476
+ }
477
+ }
478
+ contentArea.innerHTML = `
479
+ <div class="tab-empty-state">
480
+ <div class="empty-icon">📐</div>
481
+ <div class="empty-title">IMPL Plan</div>
482
+ <div class="empty-text">IMPL plan will be loaded from IMPL_PLAN.md</div>
483
+ </div>
484
+ `;
485
+ } catch (err) {
486
+ contentArea.innerHTML = `<div class="tab-error">Failed to load IMPL plan: ${err.message}</div>`;
487
+ }
488
+ }
489
+
490
+ async function loadAndRenderReviewTab(session, contentArea) {
491
+ contentArea.innerHTML = '<div class="tab-loading">Loading review data...</div>';
492
+
493
+ try {
494
+ if (window.SERVER_MODE && session.path) {
495
+ const response = await fetch(`/api/session-detail?path=${encodeURIComponent(session.path)}&type=review`);
496
+ if (response.ok) {
497
+ const data = await response.json();
498
+ contentArea.innerHTML = renderReviewContent(data.review);
499
+ return;
500
+ }
501
+ }
502
+ contentArea.innerHTML = `
503
+ <div class="tab-empty-state">
504
+ <div class="empty-icon">🔍</div>
505
+ <div class="empty-title">Review Data</div>
506
+ <div class="empty-text">Review data will be loaded from review files</div>
507
+ </div>
508
+ `;
509
+ } catch (err) {
510
+ contentArea.innerHTML = `<div class="tab-error">Failed to load review: ${err.message}</div>`;
511
+ }
512
+ }
513
+
514
+ function showRawSessionJson(sessionKey) {
515
+ const session = sessionDataStore[sessionKey];
516
+ if (!session) return;
517
+
518
+ // Close current modal
519
+ const currentModal = document.querySelector('.session-modal-overlay');
520
+ if (currentModal) currentModal.remove();
521
+
522
+ // Show JSON modal
523
+ const overlay = document.createElement('div');
524
+ overlay.className = 'json-modal-overlay active';
525
+ overlay.innerHTML = `
526
+ <div class="json-modal">
527
+ <div class="json-modal-header">
528
+ <div class="json-modal-title">
529
+ <span class="session-id-badge">${escapeHtml(session.session_id)}</span>
530
+ <span>Session JSON</span>
531
+ </div>
532
+ <button class="json-modal-close" onclick="closeJsonModal(this)">&times;</button>
533
+ </div>
534
+ <div class="json-modal-body">
535
+ <pre class="json-modal-content">${escapeHtml(JSON.stringify(session, null, 2))}</pre>
536
+ </div>
537
+ <div class="json-modal-footer">
538
+ <button class="json-modal-copy" onclick="copyJsonToClipboard(this)">Copy to Clipboard</button>
539
+ </div>
540
+ </div>
541
+ `;
542
+ document.body.appendChild(overlay);
543
+
544
+ // Close on overlay click
545
+ overlay.addEventListener('click', (e) => {
546
+ if (e.target === overlay) closeJsonModal();
547
+ });
548
+ }
549
+
550
+ // ==========================================
551
+ // TASK STATUS MANAGEMENT
552
+ // ==========================================
553
+
554
+ async function updateSingleTaskStatus(taskId, newStatus) {
555
+ const session = sessionDataStore[currentSessionDetailKey];
556
+ if (!session || !window.SERVER_MODE || !session.path) {
557
+ showToast('Status update requires server mode', 'error');
558
+ return;
559
+ }
560
+
561
+ try {
562
+ const response = await fetch('/api/update-task-status', {
563
+ method: 'POST',
564
+ headers: { 'Content-Type': 'application/json' },
565
+ body: JSON.stringify({
566
+ sessionPath: session.path,
567
+ taskId: taskId,
568
+ newStatus: newStatus
569
+ })
570
+ });
571
+
572
+ const result = await response.json();
573
+ if (result.success) {
574
+ // Update UI
575
+ updateTaskItemUI(taskId, newStatus);
576
+ updateTaskStatsBar();
577
+ showToast(`Task ${taskId} → ${formatStatusLabel(newStatus)}`, 'success');
578
+ } else {
579
+ showToast(result.error || 'Failed to update status', 'error');
580
+ // Revert select
581
+ revertTaskSelect(taskId);
582
+ }
583
+ } catch (error) {
584
+ showToast('Error updating status: ' + error.message, 'error');
585
+ revertTaskSelect(taskId);
586
+ }
587
+ }
588
+
589
+ async function bulkSetAllStatus(newStatus) {
590
+ const session = sessionDataStore[currentSessionDetailKey];
591
+ if (!session || !window.SERVER_MODE || !session.path) {
592
+ showToast('Bulk update requires server mode', 'error');
593
+ return;
594
+ }
595
+
596
+ const taskIds = currentDrawerTasks.map(t => t.task_id || t.id);
597
+ if (taskIds.length === 0) return;
598
+
599
+ if (!confirm(`Set all ${taskIds.length} tasks to "${formatStatusLabel(newStatus)}"?`)) {
600
+ return;
601
+ }
602
+
603
+ try {
604
+ const response = await fetch('/api/bulk-update-task-status', {
605
+ method: 'POST',
606
+ headers: { 'Content-Type': 'application/json' },
607
+ body: JSON.stringify({
608
+ sessionPath: session.path,
609
+ taskIds: taskIds,
610
+ newStatus: newStatus
611
+ })
612
+ });
613
+
614
+ const result = await response.json();
615
+ if (result.success) {
616
+ // Update all task UIs
617
+ taskIds.forEach(id => updateTaskItemUI(id, newStatus));
618
+ updateTaskStatsBar();
619
+ showToast(`All ${taskIds.length} tasks → ${formatStatusLabel(newStatus)}`, 'success');
620
+ } else {
621
+ showToast(result.error || 'Failed to bulk update', 'error');
622
+ }
623
+ } catch (error) {
624
+ showToast('Error in bulk update: ' + error.message, 'error');
625
+ }
626
+ }
627
+
628
+ async function bulkSetPendingToInProgress() {
629
+ const session = sessionDataStore[currentSessionDetailKey];
630
+ if (!session || !window.SERVER_MODE || !session.path) {
631
+ showToast('Bulk update requires server mode', 'error');
632
+ return;
633
+ }
634
+
635
+ const pendingTaskIds = currentDrawerTasks
636
+ .filter(t => (t.status || 'pending') === 'pending')
637
+ .map(t => t.task_id || t.id);
638
+
639
+ if (pendingTaskIds.length === 0) {
640
+ showToast('No pending tasks to start', 'info');
641
+ return;
642
+ }
643
+
644
+ try {
645
+ const response = await fetch('/api/bulk-update-task-status', {
646
+ method: 'POST',
647
+ headers: { 'Content-Type': 'application/json' },
648
+ body: JSON.stringify({
649
+ sessionPath: session.path,
650
+ taskIds: pendingTaskIds,
651
+ newStatus: 'in_progress'
652
+ })
653
+ });
654
+
655
+ const result = await response.json();
656
+ if (result.success) {
657
+ pendingTaskIds.forEach(id => updateTaskItemUI(id, 'in_progress'));
658
+ updateTaskStatsBar();
659
+ showToast(`${pendingTaskIds.length} tasks: Pending → In Progress`, 'success');
660
+ } else {
661
+ showToast(result.error || 'Failed to update', 'error');
662
+ }
663
+ } catch (error) {
664
+ showToast('Error: ' + error.message, 'error');
665
+ }
666
+ }
667
+
668
+ async function bulkSetInProgressToCompleted() {
669
+ const session = sessionDataStore[currentSessionDetailKey];
670
+ if (!session || !window.SERVER_MODE || !session.path) {
671
+ showToast('Bulk update requires server mode', 'error');
672
+ return;
673
+ }
674
+
675
+ const inProgressTaskIds = currentDrawerTasks
676
+ .filter(t => t.status === 'in_progress')
677
+ .map(t => t.task_id || t.id);
678
+
679
+ if (inProgressTaskIds.length === 0) {
680
+ showToast('No in-progress tasks to complete', 'info');
681
+ return;
682
+ }
683
+
684
+ try {
685
+ const response = await fetch('/api/bulk-update-task-status', {
686
+ method: 'POST',
687
+ headers: { 'Content-Type': 'application/json' },
688
+ body: JSON.stringify({
689
+ sessionPath: session.path,
690
+ taskIds: inProgressTaskIds,
691
+ newStatus: 'completed'
692
+ })
693
+ });
694
+
695
+ const result = await response.json();
696
+ if (result.success) {
697
+ inProgressTaskIds.forEach(id => updateTaskItemUI(id, 'completed'));
698
+ updateTaskStatsBar();
699
+ showToast(`${inProgressTaskIds.length} tasks: In Progress → Completed`, 'success');
700
+ } else {
701
+ showToast(result.error || 'Failed to update', 'error');
702
+ }
703
+ } catch (error) {
704
+ showToast('Error: ' + error.message, 'error');
705
+ }
706
+ }
707
+
708
+ function updateTaskItemUI(taskId, newStatus) {
709
+ const taskItem = document.querySelector(`.detail-task-item[data-task-id="${taskId}"]`);
710
+ if (!taskItem) return;
711
+
712
+ // Update classes
713
+ taskItem.className = `detail-task-item ${newStatus} status-${newStatus}`;
714
+
715
+ // Update select
716
+ const select = taskItem.querySelector('.task-status-select');
717
+ if (select) {
718
+ select.value = newStatus;
719
+ select.className = `task-status-select ${newStatus}`;
720
+ select.dataset.current = newStatus;
721
+ }
722
+
723
+ // Update drawer tasks data
724
+ const task = currentDrawerTasks.find(t => (t.task_id || t.id) === taskId);
725
+ if (task) {
726
+ task.status = newStatus;
727
+ }
728
+ }
729
+
730
+ function updateTaskStatsBar() {
731
+ const completed = currentDrawerTasks.filter(t => t.status === 'completed').length;
732
+ const inProgress = currentDrawerTasks.filter(t => t.status === 'in_progress').length;
733
+ const pending = currentDrawerTasks.filter(t => (t.status || 'pending') === 'pending').length;
734
+
735
+ const statsBar = document.querySelector('.task-stats-bar');
736
+ if (statsBar) {
737
+ statsBar.innerHTML = `
738
+ <span class="task-stat completed">✓ ${completed} completed</span>
739
+ <span class="task-stat in-progress">⟳ ${inProgress} in progress</span>
740
+ <span class="task-stat pending">○ ${pending} pending</span>
741
+ `;
742
+ }
743
+ }
744
+
745
+ function revertTaskSelect(taskId) {
746
+ const taskItem = document.querySelector(`.detail-task-item[data-task-id="${taskId}"]`);
747
+ if (!taskItem) return;
748
+
749
+ const select = taskItem.querySelector('.task-status-select');
750
+ if (select) {
751
+ select.value = select.dataset.current;
752
+ }
753
+ }
754
+
755
+ function showToast(message, type = 'info') {
756
+ // Remove existing toast
757
+ const existing = document.querySelector('.status-toast');
758
+ if (existing) existing.remove();
759
+
760
+ const toast = document.createElement('div');
761
+ toast.className = `status-toast ${type}`;
762
+ toast.textContent = message;
763
+ document.body.appendChild(toast);
764
+
765
+ // Auto-remove after 3 seconds
766
+ setTimeout(() => {
767
+ toast.classList.add('fade-out');
768
+ setTimeout(() => toast.remove(), 300);
769
+ }, 3000);
770
+ }