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,711 @@
1
+ // ==========================================
2
+ // REVIEW SESSION DETAIL PAGE
3
+ // ==========================================
4
+ // Enhanced with multi-select, filters, split preview panel, and export fix JSON
5
+
6
+ // Review session state
7
+ let reviewSessionState = {
8
+ allFindings: [],
9
+ filteredFindings: [],
10
+ selectedFindings: new Set(),
11
+ currentFilters: {
12
+ dimension: 'all',
13
+ severities: new Set(),
14
+ search: ''
15
+ },
16
+ sortConfig: {
17
+ field: 'severity',
18
+ order: 'desc'
19
+ },
20
+ previewFinding: null,
21
+ dimensions: [],
22
+ session: null
23
+ };
24
+
25
+ function renderReviewSessionDetailPage(session) {
26
+ const isActive = session._isActive !== false;
27
+ const dimensions = session.reviewDimensions || [];
28
+
29
+ // Store session and dimensions
30
+ reviewSessionState.session = session;
31
+ reviewSessionState.dimensions = dimensions;
32
+
33
+ // Build flat findings array with dimension info
34
+ const allFindings = [];
35
+ let findingIndex = 0;
36
+ dimensions.forEach(dim => {
37
+ (dim.findings || []).forEach(f => {
38
+ allFindings.push({
39
+ id: f.id || `finding-${findingIndex++}`,
40
+ title: f.title || 'Finding',
41
+ description: f.description || '',
42
+ severity: (f.severity || 'medium').toLowerCase(),
43
+ dimension: dim.name || 'unknown',
44
+ category: f.category || '',
45
+ file: f.file || '',
46
+ line: f.line || '',
47
+ code_context: f.code_context || f.snippet || '',
48
+ recommendations: f.recommendations || (f.recommendation ? [f.recommendation] : []),
49
+ root_cause: f.root_cause || '',
50
+ impact: f.impact || '',
51
+ references: f.references || [],
52
+ metadata: f.metadata || {},
53
+ fix_status: f.fix_status || null
54
+ });
55
+ });
56
+ });
57
+
58
+ reviewSessionState.allFindings = allFindings;
59
+ reviewSessionState.filteredFindings = [...allFindings];
60
+ reviewSessionState.selectedFindings.clear();
61
+ reviewSessionState.previewFinding = null;
62
+
63
+ // Calculate statistics
64
+ const totalFindings = allFindings.length;
65
+ const severityCounts = {
66
+ critical: allFindings.filter(f => f.severity === 'critical').length,
67
+ high: allFindings.filter(f => f.severity === 'high').length,
68
+ medium: allFindings.filter(f => f.severity === 'medium').length,
69
+ low: allFindings.filter(f => f.severity === 'low').length
70
+ };
71
+
72
+ return `
73
+ <div class="session-detail-page session-type-review">
74
+ <!-- Header -->
75
+ <div class="detail-header">
76
+ <button class="btn-back" onclick="goBackToSessions()">
77
+ <span class="back-icon">←</span>
78
+ <span>Back to Sessions</span>
79
+ </button>
80
+ <div class="detail-title-row">
81
+ <h2 class="detail-session-id">🔍 ${escapeHtml(session.session_id)}</h2>
82
+ <div class="detail-badges">
83
+ <span class="session-type-badge review">Review</span>
84
+ <span class="session-status ${isActive ? 'active' : 'archived'}">
85
+ ${isActive ? 'ACTIVE' : 'ARCHIVED'}
86
+ </span>
87
+ </div>
88
+ </div>
89
+ </div>
90
+
91
+ <!-- Review Progress Section -->
92
+ <div class="review-progress-section">
93
+ <div class="review-progress-header">
94
+ <h3>📊 Review Progress</h3>
95
+ <span class="phase-badge ${session.phase || 'in-progress'}">${(session.phase || 'In Progress').toUpperCase()}</span>
96
+ </div>
97
+
98
+ <!-- Summary Cards -->
99
+ <div class="review-summary-grid">
100
+ <div class="summary-card">
101
+ <div class="summary-icon">📊</div>
102
+ <div class="summary-value">${totalFindings}</div>
103
+ <div class="summary-label">Total Findings</div>
104
+ </div>
105
+ <div class="summary-card critical">
106
+ <div class="summary-icon">🔴</div>
107
+ <div class="summary-value">${severityCounts.critical}</div>
108
+ <div class="summary-label">Critical</div>
109
+ </div>
110
+ <div class="summary-card high">
111
+ <div class="summary-icon">🟠</div>
112
+ <div class="summary-value">${severityCounts.high}</div>
113
+ <div class="summary-label">High</div>
114
+ </div>
115
+ <div class="summary-card">
116
+ <div class="summary-icon">📋</div>
117
+ <div class="summary-value">${dimensions.length}</div>
118
+ <div class="summary-label">Dimensions</div>
119
+ </div>
120
+ </div>
121
+
122
+ </div>
123
+
124
+ <!-- Enhanced Findings Section -->
125
+ <div class="review-enhanced-container">
126
+ <!-- Header with Stats & Controls -->
127
+ <div class="review-header-bar">
128
+ <div class="review-severity-stats">
129
+ <span class="severity-stat critical" onclick="toggleReviewSessionSeverity('critical')" title="Filter Critical">
130
+ 🔴 ${severityCounts.critical}
131
+ </span>
132
+ <span class="severity-stat high" onclick="toggleReviewSessionSeverity('high')" title="Filter High">
133
+ 🟠 ${severityCounts.high}
134
+ </span>
135
+ <span class="severity-stat medium" onclick="toggleReviewSessionSeverity('medium')" title="Filter Medium">
136
+ 🟡 ${severityCounts.medium}
137
+ </span>
138
+ <span class="severity-stat low" onclick="toggleReviewSessionSeverity('low')" title="Filter Low">
139
+ 🟢 ${severityCounts.low}
140
+ </span>
141
+ </div>
142
+
143
+ <div class="review-search-box">
144
+ <input type="text"
145
+ id="reviewSessionSearchInput"
146
+ placeholder="Search findings..."
147
+ oninput="onReviewSessionSearch(this.value)">
148
+ </div>
149
+
150
+ <div class="review-selection-controls">
151
+ <span class="selection-counter" id="reviewSessionSelectionCounter">0 selected</span>
152
+ <button class="btn-mini" onclick="selectAllReviewSessionFindings()">Select All</button>
153
+ <button class="btn-mini" onclick="selectVisibleReviewSessionFindings()">Visible</button>
154
+ <button class="btn-mini" onclick="selectReviewSessionBySeverity('critical')">Critical</button>
155
+ <button class="btn-mini" onclick="clearReviewSessionSelection()">Clear</button>
156
+ </div>
157
+
158
+ <button class="btn-export-fix" id="reviewSessionExportBtn" onclick="exportReviewSessionFixJson()" disabled>
159
+ 🔧 Export Fix JSON
160
+ </button>
161
+ </div>
162
+
163
+ <!-- Filter Bar -->
164
+ <div class="review-filter-bar">
165
+ <div class="filter-group">
166
+ <span class="filter-label">Severity:</span>
167
+ <div class="filter-chips">
168
+ <label class="filter-chip" id="rs-filter-critical">
169
+ <input type="checkbox" onchange="toggleReviewSessionSeverity('critical')">
170
+ <span>Critical</span>
171
+ </label>
172
+ <label class="filter-chip" id="rs-filter-high">
173
+ <input type="checkbox" onchange="toggleReviewSessionSeverity('high')">
174
+ <span>High</span>
175
+ </label>
176
+ <label class="filter-chip" id="rs-filter-medium">
177
+ <input type="checkbox" onchange="toggleReviewSessionSeverity('medium')">
178
+ <span>Medium</span>
179
+ </label>
180
+ <label class="filter-chip" id="rs-filter-low">
181
+ <input type="checkbox" onchange="toggleReviewSessionSeverity('low')">
182
+ <span>Low</span>
183
+ </label>
184
+ </div>
185
+ </div>
186
+
187
+ <div class="filter-group">
188
+ <span class="filter-label">Sort:</span>
189
+ <select id="reviewSessionSortSelect" class="sort-select" onchange="sortReviewSessionFindings()">
190
+ <option value="severity">By Severity</option>
191
+ <option value="dimension">By Dimension</option>
192
+ <option value="file">By File</option>
193
+ </select>
194
+ <button class="btn-sort-order" id="reviewSessionSortOrderBtn" onclick="toggleReviewSessionSortOrder()">
195
+ <span id="reviewSessionSortOrderIcon">↓</span>
196
+ </button>
197
+ </div>
198
+
199
+ <button class="btn-mini" onclick="resetReviewSessionFilters()">Reset</button>
200
+ </div>
201
+
202
+ <!-- Dimension Tabs -->
203
+ <div class="review-dimension-tabs">
204
+ <button class="dim-tab active" data-dimension="all" onclick="filterReviewSessionByDimension('all')">
205
+ All (${totalFindings})
206
+ </button>
207
+ ${dimensions.map(dim => `
208
+ <button class="dim-tab" data-dimension="${dim.name}" onclick="filterReviewSessionByDimension('${dim.name}')">
209
+ ${escapeHtml(dim.name)} (${dim.findings?.length || 0})
210
+ </button>
211
+ `).join('')}
212
+ </div>
213
+
214
+ <!-- Split Panel: List + Preview -->
215
+ <div class="review-split-panel">
216
+ <!-- Left: Findings List -->
217
+ <div class="review-findings-panel">
218
+ <div class="findings-list-header">
219
+ <span id="reviewSessionFindingsCount">${totalFindings} findings</span>
220
+ </div>
221
+ <div class="review-findings-list" id="reviewSessionFindingsList">
222
+ ${renderReviewSessionFindingsList(allFindings)}
223
+ </div>
224
+ </div>
225
+
226
+ <!-- Right: Preview Panel -->
227
+ <div class="review-preview-panel" id="reviewSessionPreviewPanel">
228
+ <div class="preview-empty-state">
229
+ <div class="preview-icon">👆</div>
230
+ <div class="preview-text">Click on a finding to preview details</div>
231
+ </div>
232
+ </div>
233
+ </div>
234
+ </div>
235
+
236
+ <!-- Session Info -->
237
+ <div class="detail-info-bar">
238
+ <div class="info-item">
239
+ <span class="info-label">Created:</span>
240
+ <span class="info-value">${formatDate(session.created_at)}</span>
241
+ </div>
242
+ ${session.archived_at ? `
243
+ <div class="info-item">
244
+ <span class="info-label">Archived:</span>
245
+ <span class="info-value">${formatDate(session.archived_at)}</span>
246
+ </div>
247
+ ` : ''}
248
+ <div class="info-item">
249
+ <span class="info-label">Project:</span>
250
+ <span class="info-value">${escapeHtml(session.project || '-')}</span>
251
+ </div>
252
+ </div>
253
+ </div>
254
+ `;
255
+ }
256
+
257
+ // ==========================================
258
+ // Findings List Rendering
259
+ // ==========================================
260
+
261
+ function renderReviewSessionFindingsList(findings) {
262
+ if (findings.length === 0) {
263
+ return `
264
+ <div class="findings-empty">
265
+ <span class="empty-icon">✨</span>
266
+ <span>No findings match your filters</span>
267
+ </div>
268
+ `;
269
+ }
270
+
271
+ return findings.map(finding => `
272
+ <div class="review-finding-item ${finding.severity} ${reviewSessionState.selectedFindings.has(finding.id) ? 'selected' : ''}"
273
+ data-finding-id="${finding.id}"
274
+ onclick="previewReviewSessionFinding('${finding.id}')">
275
+ <input type="checkbox"
276
+ class="finding-checkbox"
277
+ ${reviewSessionState.selectedFindings.has(finding.id) ? 'checked' : ''}
278
+ onclick="toggleReviewSessionFindingSelection('${finding.id}', event)">
279
+ <div class="finding-content">
280
+ <div class="finding-top-row">
281
+ <span class="severity-badge ${finding.severity}">${finding.severity}</span>
282
+ <span class="dimension-badge">${escapeHtml(finding.dimension)}</span>
283
+ ${finding.fix_status ? `<span class="fix-status-mini status-${finding.fix_status}">${finding.fix_status}</span>` : ''}
284
+ </div>
285
+ <div class="finding-title">${escapeHtml(finding.title)}</div>
286
+ ${finding.file ? `<div class="finding-file">📄 ${escapeHtml(finding.file)}${finding.line ? ':' + finding.line : ''}</div>` : ''}
287
+ </div>
288
+ </div>
289
+ `).join('');
290
+ }
291
+
292
+ // ==========================================
293
+ // Preview Panel
294
+ // ==========================================
295
+
296
+ function previewReviewSessionFinding(findingId) {
297
+ const finding = reviewSessionState.allFindings.find(f => f.id === findingId);
298
+ if (!finding) return;
299
+
300
+ reviewSessionState.previewFinding = finding;
301
+
302
+ // Update active state in list
303
+ document.querySelectorAll('.review-finding-item').forEach(item => {
304
+ item.classList.toggle('previewing', item.dataset.findingId === findingId);
305
+ });
306
+
307
+ const previewPanel = document.getElementById('reviewSessionPreviewPanel');
308
+ if (!previewPanel) return;
309
+
310
+ previewPanel.innerHTML = `
311
+ <div class="preview-content">
312
+ <div class="preview-header">
313
+ <div class="preview-badges">
314
+ <span class="severity-badge ${finding.severity}">${finding.severity}</span>
315
+ <span class="dimension-badge">${escapeHtml(finding.dimension)}</span>
316
+ ${finding.category ? `<span class="category-badge">${escapeHtml(finding.category)}</span>` : ''}
317
+ ${finding.fix_status ? `<span class="fix-status-badge status-${finding.fix_status}">${finding.fix_status}</span>` : ''}
318
+ </div>
319
+ <button class="btn-select-finding ${reviewSessionState.selectedFindings.has(finding.id) ? 'selected' : ''}"
320
+ onclick="toggleReviewSessionFindingSelection('${finding.id}', event)">
321
+ ${reviewSessionState.selectedFindings.has(finding.id) ? '✓ Selected' : '+ Select for Fix'}
322
+ </button>
323
+ </div>
324
+
325
+ <h3 class="preview-title">${escapeHtml(finding.title)}</h3>
326
+
327
+ ${finding.file ? `
328
+ <div class="preview-section">
329
+ <div class="preview-section-title">📄 Location</div>
330
+ <div class="preview-location">
331
+ <code>${escapeHtml(finding.file)}${finding.line ? ':' + finding.line : ''}</code>
332
+ </div>
333
+ </div>
334
+ ` : ''}
335
+
336
+ <div class="preview-section">
337
+ <div class="preview-section-title">📝 Description</div>
338
+ <div class="preview-description">${escapeHtml(finding.description)}</div>
339
+ </div>
340
+
341
+ ${finding.code_context ? `
342
+ <div class="preview-section">
343
+ <div class="preview-section-title">💻 Code Context</div>
344
+ <pre class="preview-code">${escapeHtml(finding.code_context)}</pre>
345
+ </div>
346
+ ` : ''}
347
+
348
+ ${finding.recommendations && finding.recommendations.length > 0 ? `
349
+ <div class="preview-section">
350
+ <div class="preview-section-title">✅ Recommendations</div>
351
+ <ul class="preview-recommendations">
352
+ ${finding.recommendations.map(r => `<li>${escapeHtml(r)}</li>`).join('')}
353
+ </ul>
354
+ </div>
355
+ ` : ''}
356
+
357
+ ${finding.root_cause ? `
358
+ <div class="preview-section">
359
+ <div class="preview-section-title">🔍 Root Cause</div>
360
+ <div class="preview-root-cause">${escapeHtml(finding.root_cause)}</div>
361
+ </div>
362
+ ` : ''}
363
+
364
+ ${finding.impact ? `
365
+ <div class="preview-section">
366
+ <div class="preview-section-title">⚠️ Impact</div>
367
+ <div class="preview-impact">${escapeHtml(finding.impact)}</div>
368
+ </div>
369
+ ` : ''}
370
+
371
+ ${finding.references && finding.references.length > 0 ? `
372
+ <div class="preview-section">
373
+ <div class="preview-section-title">🔗 References</div>
374
+ <ul class="preview-references">
375
+ ${finding.references.map(ref => {
376
+ const isUrl = ref.startsWith('http');
377
+ return `<li>${isUrl ? `<a href="${ref}" target="_blank">${ref}</a>` : ref}</li>`;
378
+ }).join('')}
379
+ </ul>
380
+ </div>
381
+ ` : ''}
382
+
383
+ ${finding.metadata && Object.keys(finding.metadata).length > 0 ? `
384
+ <div class="preview-section">
385
+ <div class="preview-section-title">ℹ️ Metadata</div>
386
+ <div class="preview-metadata">
387
+ ${Object.entries(finding.metadata).map(([key, value]) => `
388
+ <div class="metadata-item">
389
+ <span class="meta-key">${escapeHtml(key)}:</span>
390
+ <span class="meta-value">${escapeHtml(String(value))}</span>
391
+ </div>
392
+ `).join('')}
393
+ </div>
394
+ </div>
395
+ ` : ''}
396
+ </div>
397
+ `;
398
+ }
399
+
400
+ // ==========================================
401
+ // Selection Management
402
+ // ==========================================
403
+
404
+ function toggleReviewSessionFindingSelection(findingId, event) {
405
+ if (event) {
406
+ event.stopPropagation();
407
+ }
408
+
409
+ if (reviewSessionState.selectedFindings.has(findingId)) {
410
+ reviewSessionState.selectedFindings.delete(findingId);
411
+ } else {
412
+ reviewSessionState.selectedFindings.add(findingId);
413
+ }
414
+
415
+ updateReviewSessionSelectionUI();
416
+
417
+ // Update preview panel button if this finding is being previewed
418
+ if (reviewSessionState.previewFinding && reviewSessionState.previewFinding.id === findingId) {
419
+ previewReviewSessionFinding(findingId);
420
+ }
421
+ }
422
+
423
+ function selectAllReviewSessionFindings() {
424
+ reviewSessionState.allFindings.forEach(f => reviewSessionState.selectedFindings.add(f.id));
425
+ updateReviewSessionSelectionUI();
426
+ }
427
+
428
+ function selectVisibleReviewSessionFindings() {
429
+ reviewSessionState.filteredFindings.forEach(f => reviewSessionState.selectedFindings.add(f.id));
430
+ updateReviewSessionSelectionUI();
431
+ }
432
+
433
+ function selectReviewSessionBySeverity(severity) {
434
+ reviewSessionState.allFindings
435
+ .filter(f => f.severity === severity)
436
+ .forEach(f => reviewSessionState.selectedFindings.add(f.id));
437
+ updateReviewSessionSelectionUI();
438
+ }
439
+
440
+ function clearReviewSessionSelection() {
441
+ reviewSessionState.selectedFindings.clear();
442
+ updateReviewSessionSelectionUI();
443
+ }
444
+
445
+ function updateReviewSessionSelectionUI() {
446
+ // Update counter
447
+ const counter = document.getElementById('reviewSessionSelectionCounter');
448
+ if (counter) {
449
+ counter.textContent = `${reviewSessionState.selectedFindings.size} selected`;
450
+ }
451
+
452
+ // Update export button
453
+ const exportBtn = document.getElementById('reviewSessionExportBtn');
454
+ if (exportBtn) {
455
+ exportBtn.disabled = reviewSessionState.selectedFindings.size === 0;
456
+ }
457
+
458
+ // Update checkbox states in list
459
+ document.querySelectorAll('.review-finding-item').forEach(item => {
460
+ const findingId = item.dataset.findingId;
461
+ const isSelected = reviewSessionState.selectedFindings.has(findingId);
462
+ item.classList.toggle('selected', isSelected);
463
+ const checkbox = item.querySelector('.finding-checkbox');
464
+ if (checkbox) {
465
+ checkbox.checked = isSelected;
466
+ }
467
+ });
468
+ }
469
+
470
+ // ==========================================
471
+ // Filtering & Sorting
472
+ // ==========================================
473
+
474
+ function filterReviewSessionByDimension(dimension) {
475
+ reviewSessionState.currentFilters.dimension = dimension;
476
+
477
+ // Update tab active state
478
+ document.querySelectorAll('.dim-tab').forEach(tab => {
479
+ tab.classList.toggle('active', tab.dataset.dimension === dimension);
480
+ });
481
+
482
+ // Update dimension timeline highlight
483
+ document.querySelectorAll('.dimension-item').forEach(item => {
484
+ item.classList.toggle('active', dimension === 'all' || item.dataset.dimension === dimension);
485
+ });
486
+
487
+ applyReviewSessionFilters();
488
+ }
489
+
490
+ function toggleReviewSessionSeverity(severity) {
491
+ if (reviewSessionState.currentFilters.severities.has(severity)) {
492
+ reviewSessionState.currentFilters.severities.delete(severity);
493
+ } else {
494
+ reviewSessionState.currentFilters.severities.add(severity);
495
+ }
496
+
497
+ // Update filter chip UI
498
+ const filterChip = document.getElementById(`rs-filter-${severity}`);
499
+ if (filterChip) {
500
+ filterChip.classList.toggle('active', reviewSessionState.currentFilters.severities.has(severity));
501
+ const checkbox = filterChip.querySelector('input[type="checkbox"]');
502
+ if (checkbox) {
503
+ checkbox.checked = reviewSessionState.currentFilters.severities.has(severity);
504
+ }
505
+ }
506
+
507
+ applyReviewSessionFilters();
508
+ }
509
+
510
+ function onReviewSessionSearch(searchText) {
511
+ reviewSessionState.currentFilters.search = searchText.toLowerCase();
512
+ applyReviewSessionFilters();
513
+ }
514
+
515
+ function applyReviewSessionFilters() {
516
+ reviewSessionState.filteredFindings = reviewSessionState.allFindings.filter(finding => {
517
+ // Dimension filter
518
+ if (reviewSessionState.currentFilters.dimension !== 'all') {
519
+ if (finding.dimension !== reviewSessionState.currentFilters.dimension) {
520
+ return false;
521
+ }
522
+ }
523
+
524
+ // Severity filter (multi-select)
525
+ if (reviewSessionState.currentFilters.severities.size > 0) {
526
+ if (!reviewSessionState.currentFilters.severities.has(finding.severity)) {
527
+ return false;
528
+ }
529
+ }
530
+
531
+ // Search filter
532
+ if (reviewSessionState.currentFilters.search) {
533
+ const searchText = `${finding.title} ${finding.description} ${finding.file} ${finding.category}`.toLowerCase();
534
+ if (!searchText.includes(reviewSessionState.currentFilters.search)) {
535
+ return false;
536
+ }
537
+ }
538
+
539
+ return true;
540
+ });
541
+
542
+ sortReviewSessionFindings();
543
+ }
544
+
545
+ function sortReviewSessionFindings() {
546
+ const sortBy = document.getElementById('reviewSessionSortSelect')?.value || 'severity';
547
+ reviewSessionState.sortConfig.field = sortBy;
548
+
549
+ const severityOrder = { critical: 0, high: 1, medium: 2, low: 3 };
550
+
551
+ reviewSessionState.filteredFindings.sort((a, b) => {
552
+ let comparison = 0;
553
+
554
+ if (sortBy === 'severity') {
555
+ comparison = severityOrder[a.severity] - severityOrder[b.severity];
556
+ } else if (sortBy === 'dimension') {
557
+ comparison = a.dimension.localeCompare(b.dimension);
558
+ } else if (sortBy === 'file') {
559
+ comparison = (a.file || '').localeCompare(b.file || '');
560
+ }
561
+
562
+ return reviewSessionState.sortConfig.order === 'asc' ? comparison : -comparison;
563
+ });
564
+
565
+ renderFilteredReviewSessionFindings();
566
+ }
567
+
568
+ function toggleReviewSessionSortOrder() {
569
+ reviewSessionState.sortConfig.order = reviewSessionState.sortConfig.order === 'asc' ? 'desc' : 'asc';
570
+
571
+ const icon = document.getElementById('reviewSessionSortOrderIcon');
572
+ if (icon) {
573
+ icon.textContent = reviewSessionState.sortConfig.order === 'asc' ? '↑' : '↓';
574
+ }
575
+
576
+ sortReviewSessionFindings();
577
+ }
578
+
579
+ function resetReviewSessionFilters() {
580
+ // Reset state
581
+ reviewSessionState.currentFilters.dimension = 'all';
582
+ reviewSessionState.currentFilters.severities.clear();
583
+ reviewSessionState.currentFilters.search = '';
584
+ reviewSessionState.sortConfig.field = 'severity';
585
+ reviewSessionState.sortConfig.order = 'desc';
586
+
587
+ // Reset UI
588
+ document.querySelectorAll('.dim-tab').forEach(tab => {
589
+ tab.classList.toggle('active', tab.dataset.dimension === 'all');
590
+ });
591
+
592
+ document.querySelectorAll('.filter-chip').forEach(chip => {
593
+ chip.classList.remove('active');
594
+ const checkbox = chip.querySelector('input[type="checkbox"]');
595
+ if (checkbox) checkbox.checked = false;
596
+ });
597
+
598
+ document.querySelectorAll('.dimension-item').forEach(item => {
599
+ item.classList.remove('active');
600
+ });
601
+
602
+ const searchInput = document.getElementById('reviewSessionSearchInput');
603
+ if (searchInput) searchInput.value = '';
604
+
605
+ const sortSelect = document.getElementById('reviewSessionSortSelect');
606
+ if (sortSelect) sortSelect.value = 'severity';
607
+
608
+ const sortIcon = document.getElementById('reviewSessionSortOrderIcon');
609
+ if (sortIcon) sortIcon.textContent = '↓';
610
+
611
+ // Re-apply filters
612
+ reviewSessionState.filteredFindings = [...reviewSessionState.allFindings];
613
+ sortReviewSessionFindings();
614
+ }
615
+
616
+ function renderFilteredReviewSessionFindings() {
617
+ const listContainer = document.getElementById('reviewSessionFindingsList');
618
+ const countEl = document.getElementById('reviewSessionFindingsCount');
619
+
620
+ if (listContainer) {
621
+ listContainer.innerHTML = renderReviewSessionFindingsList(reviewSessionState.filteredFindings);
622
+ }
623
+
624
+ if (countEl) {
625
+ countEl.textContent = `${reviewSessionState.filteredFindings.length} findings`;
626
+ }
627
+ }
628
+
629
+ // ==========================================
630
+ // Export Fix JSON
631
+ // ==========================================
632
+
633
+ function exportReviewSessionFixJson() {
634
+ if (reviewSessionState.selectedFindings.size === 0) {
635
+ showToast('Please select at least one finding to export', 'error');
636
+ return;
637
+ }
638
+
639
+ const selectedFindingsData = reviewSessionState.allFindings.filter(f =>
640
+ reviewSessionState.selectedFindings.has(f.id)
641
+ );
642
+
643
+ const session = reviewSessionState.session;
644
+ const sessionId = session?.session_id || 'unknown';
645
+ const exportId = `fix-${Date.now()}`;
646
+
647
+ const exportData = {
648
+ export_id: exportId,
649
+ export_timestamp: new Date().toISOString(),
650
+ review_id: `review-${sessionId}`,
651
+ session_id: sessionId,
652
+ findings_count: selectedFindingsData.length,
653
+ findings: selectedFindingsData.map(f => ({
654
+ id: f.id,
655
+ title: f.title,
656
+ description: f.description,
657
+ severity: f.severity,
658
+ dimension: f.dimension,
659
+ category: f.category || 'uncategorized',
660
+ file: f.file,
661
+ line: f.line,
662
+ code_context: f.code_context || null,
663
+ recommendations: f.recommendations || [],
664
+ root_cause: f.root_cause || null
665
+ }))
666
+ };
667
+
668
+ // Convert to JSON and download
669
+ const jsonStr = JSON.stringify(exportData, null, 2);
670
+ const blob = new Blob([jsonStr], { type: 'application/json' });
671
+ const url = URL.createObjectURL(blob);
672
+ const a = document.createElement('a');
673
+ const filename = `fix-export-${exportId}.json`;
674
+ a.href = url;
675
+ a.download = filename;
676
+ document.body.appendChild(a);
677
+ a.click();
678
+ document.body.removeChild(a);
679
+ URL.revokeObjectURL(url);
680
+
681
+ // Show success notification
682
+ const severityCounts = {
683
+ critical: selectedFindingsData.filter(f => f.severity === 'critical').length,
684
+ high: selectedFindingsData.filter(f => f.severity === 'high').length,
685
+ medium: selectedFindingsData.filter(f => f.severity === 'medium').length,
686
+ low: selectedFindingsData.filter(f => f.severity === 'low').length
687
+ };
688
+
689
+ showToast(`Exported ${selectedFindingsData.length} findings (Critical: ${severityCounts.critical}, High: ${severityCounts.high}, Medium: ${severityCounts.medium}, Low: ${severityCounts.low})`, 'success');
690
+ }
691
+
692
+ // ==========================================
693
+ // Page Initialization
694
+ // ==========================================
695
+
696
+ function initReviewSessionPage(session) {
697
+ // Reset state when page loads
698
+ reviewSessionState.session = session;
699
+ // Event handlers are inline onclick - no additional setup needed
700
+ }
701
+
702
+ // Legacy filter function for compatibility
703
+ function filterReviewFindings(severity) {
704
+ if (severity === 'all') {
705
+ reviewSessionState.currentFilters.severities.clear();
706
+ } else {
707
+ reviewSessionState.currentFilters.severities.clear();
708
+ reviewSessionState.currentFilters.severities.add(severity);
709
+ }
710
+ applyReviewSessionFilters();
711
+ }