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,1093 @@
1
+ // ==========================================
2
+ // Tab Content Renderers - Context Tab
3
+ // ==========================================
4
+ // Functions for rendering Context tab content in the dashboard
5
+ // Note: getRelevanceColor and getRoleBadgeClass are defined in utils.js
6
+
7
+ // ==========================================
8
+ // Context Tab Rendering
9
+ // ==========================================
10
+
11
+ function renderContextContent(context) {
12
+ if (!context) {
13
+ return `
14
+ <div class="tab-empty-state">
15
+ <div class="empty-icon">📦</div>
16
+ <div class="empty-title">No Context Data</div>
17
+ <div class="empty-text">No context-package.json found for this session.</div>
18
+ </div>
19
+ `;
20
+ }
21
+
22
+ const contextJson = JSON.stringify(context, null, 2);
23
+ // Store in global variable for modal access
24
+ window._currentContextJson = contextJson;
25
+
26
+ // Parse context structure
27
+ const metadata = context.metadata || {};
28
+ const projectContext = context.project_context || {};
29
+ const techStack = projectContext.tech_stack || metadata.tech_stack || {};
30
+ const codingConventions = projectContext.coding_conventions || {};
31
+ const architecturePatterns = projectContext.architecture_patterns || [];
32
+ const assets = context.assets || {};
33
+ const dependencies = context.dependencies || {};
34
+ const testContext = context.test_context || {};
35
+ const conflictDetection = context.conflict_detection || {};
36
+
37
+ return `
38
+ <div class="context-tab-content">
39
+ <!-- Header Card -->
40
+ <div class="ctx-header-card">
41
+ <div class="ctx-header-content">
42
+ <h3 class="ctx-main-title">📦 Context Package</h3>
43
+ <button class="btn-view-modal" onclick="openMarkdownModal('context-package.json', window._currentContextJson, 'json')">
44
+ 👁️ View JSON
45
+ </button>
46
+ </div>
47
+ </div>
48
+
49
+ <!-- Metadata Card -->
50
+ ${metadata.task_description || metadata.session_id ? `
51
+ <div class="ctx-card">
52
+ <div class="ctx-card-header">
53
+ <span class="ctx-card-icon">📋</span>
54
+ <h4 class="ctx-card-title">Task Metadata</h4>
55
+ </div>
56
+ <div class="ctx-card-body">
57
+ ${metadata.task_description ? `
58
+ <p class="ctx-description">${escapeHtml(metadata.task_description)}</p>
59
+ ` : ''}
60
+ <div class="ctx-meta-row">
61
+ ${metadata.session_id ? `
62
+ <div class="ctx-meta-chip">
63
+ <span class="ctx-meta-chip-label">SESSION</span>
64
+ <code class="ctx-meta-chip-value">${escapeHtml(metadata.session_id)}</code>
65
+ </div>
66
+ ` : ''}
67
+ ${metadata.complexity ? `
68
+ <div class="ctx-meta-chip">
69
+ <span class="ctx-meta-chip-label">COMPLEXITY</span>
70
+ <span class="ctx-complexity-badge ctx-complexity-${metadata.complexity}">${escapeHtml(metadata.complexity.toUpperCase())}</span>
71
+ </div>
72
+ ` : ''}
73
+ ${metadata.timestamp ? `
74
+ <div class="ctx-meta-chip">
75
+ <span class="ctx-meta-chip-label">CREATED</span>
76
+ <span class="ctx-meta-chip-value">${formatDate(metadata.timestamp)}</span>
77
+ </div>
78
+ ` : ''}
79
+ </div>
80
+ ${metadata.keywords && metadata.keywords.length > 0 ? `
81
+ <div class="ctx-keywords-row">
82
+ ${metadata.keywords.map(kw => `<span class="ctx-keyword-tag">${escapeHtml(kw)}</span>`).join('')}
83
+ </div>
84
+ ` : ''}
85
+ </div>
86
+ </div>
87
+ ` : ''}
88
+
89
+ <!-- Architecture Patterns Card -->
90
+ ${architecturePatterns.length > 0 ? `
91
+ <div class="ctx-card">
92
+ <div class="ctx-card-header">
93
+ <span class="ctx-card-icon">🏛️</span>
94
+ <h4 class="ctx-card-title">Architecture Patterns</h4>
95
+ <span class="ctx-count-badge">${architecturePatterns.length}</span>
96
+ </div>
97
+ <div class="ctx-card-body">
98
+ <div class="ctx-pattern-tags">
99
+ ${architecturePatterns.map(p => `<span class="ctx-pattern-tag">${escapeHtml(p)}</span>`).join('')}
100
+ </div>
101
+ </div>
102
+ </div>
103
+ ` : ''}
104
+
105
+ <!-- Tech Stack Card -->
106
+ ${Object.keys(techStack).length > 0 ? `
107
+ <div class="ctx-card">
108
+ <div class="ctx-card-header">
109
+ <span class="ctx-card-icon">💻</span>
110
+ <h4 class="ctx-card-title">Technology Stack</h4>
111
+ </div>
112
+ <div class="ctx-card-body">
113
+ ${renderTechStackCards(techStack)}
114
+ </div>
115
+ </div>
116
+ ` : ''}
117
+
118
+ <!-- Coding Conventions Card -->
119
+ ${Object.keys(codingConventions).length > 0 ? `
120
+ <div class="ctx-card">
121
+ <div class="ctx-card-header">
122
+ <span class="ctx-card-icon">📝</span>
123
+ <h4 class="ctx-card-title">Coding Conventions</h4>
124
+ </div>
125
+ <div class="ctx-card-body">
126
+ ${renderCodingConventionsCards(codingConventions)}
127
+ </div>
128
+ </div>
129
+ ` : ''}
130
+
131
+ <!-- Assets Section -->
132
+ ${Object.keys(assets).length > 0 ? `
133
+ <div class="ctx-card">
134
+ <div class="ctx-card-header">
135
+ <span class="ctx-card-icon">📚</span>
136
+ <h4 class="ctx-card-title">Assets & Resources</h4>
137
+ </div>
138
+ <div class="ctx-card-body">
139
+ ${renderAssetsCards(assets)}
140
+ </div>
141
+ </div>
142
+ ` : ''}
143
+
144
+ <!-- Dependencies Section -->
145
+ ${(dependencies.internal && dependencies.internal.length > 0) || (dependencies.external && dependencies.external.length > 0) ? `
146
+ <div class="ctx-card">
147
+ <div class="ctx-card-header">
148
+ <span class="ctx-card-icon">🔗</span>
149
+ <h4 class="ctx-card-title">Dependencies</h4>
150
+ </div>
151
+ <div class="ctx-card-body">
152
+ ${renderDependenciesCards(dependencies)}
153
+ </div>
154
+ </div>
155
+ ` : ''}
156
+
157
+ <!-- Test Context Section -->
158
+ ${Object.keys(testContext).length > 0 ? `
159
+ <div class="ctx-card">
160
+ <div class="ctx-card-header">
161
+ <span class="ctx-card-icon">🧪</span>
162
+ <h4 class="ctx-card-title">Test Context</h4>
163
+ </div>
164
+ <div class="ctx-card-body">
165
+ ${renderTestContextCards(testContext)}
166
+ </div>
167
+ </div>
168
+ ` : ''}
169
+
170
+ <!-- Conflict Detection Section -->
171
+ ${Object.keys(conflictDetection).length > 0 ? `
172
+ <div class="ctx-card ctx-card-warning">
173
+ <div class="ctx-card-header">
174
+ <span class="ctx-card-icon">⚠️</span>
175
+ <h4 class="ctx-card-title">Risk Analysis</h4>
176
+ ${conflictDetection.risk_level ? `
177
+ <span class="ctx-risk-badge ctx-risk-${conflictDetection.risk_level}">${escapeHtml(conflictDetection.risk_level.toUpperCase())}</span>
178
+ ` : ''}
179
+ </div>
180
+ <div class="ctx-card-body">
181
+ ${renderConflictCards(conflictDetection)}
182
+ </div>
183
+ </div>
184
+ ` : ''}
185
+ </div>
186
+ `;
187
+ }
188
+
189
+ // New card-based renderers
190
+ function renderTechStackCards(techStack) {
191
+ const sections = [];
192
+
193
+ if (techStack.languages) {
194
+ const langs = Array.isArray(techStack.languages) ? techStack.languages : [techStack.languages];
195
+ sections.push(`
196
+ <div class="ctx-stack-section">
197
+ <span class="ctx-stack-label">Languages</span>
198
+ <div class="ctx-stack-tags">
199
+ ${langs.map(l => `<span class="ctx-lang-tag">${escapeHtml(String(l))}</span>`).join('')}
200
+ </div>
201
+ </div>
202
+ `);
203
+ }
204
+
205
+ if (techStack.frameworks) {
206
+ const frameworks = Array.isArray(techStack.frameworks) ? techStack.frameworks : [techStack.frameworks];
207
+ sections.push(`
208
+ <div class="ctx-stack-section">
209
+ <span class="ctx-stack-label">Frameworks</span>
210
+ <div class="ctx-stack-tags">
211
+ ${frameworks.map(f => `<span class="ctx-framework-tag">${escapeHtml(String(f))}</span>`).join('')}
212
+ </div>
213
+ </div>
214
+ `);
215
+ }
216
+
217
+ if (techStack.frontend_frameworks) {
218
+ const ff = Array.isArray(techStack.frontend_frameworks) ? techStack.frontend_frameworks : [techStack.frontend_frameworks];
219
+ sections.push(`
220
+ <div class="ctx-stack-section">
221
+ <span class="ctx-stack-label">Frontend</span>
222
+ <div class="ctx-stack-tags">
223
+ ${ff.map(f => `<span class="ctx-frontend-tag">${escapeHtml(String(f))}</span>`).join('')}
224
+ </div>
225
+ </div>
226
+ `);
227
+ }
228
+
229
+ if (techStack.backend_frameworks) {
230
+ const bf = Array.isArray(techStack.backend_frameworks) ? techStack.backend_frameworks : [techStack.backend_frameworks];
231
+ sections.push(`
232
+ <div class="ctx-stack-section">
233
+ <span class="ctx-stack-label">Backend</span>
234
+ <div class="ctx-stack-tags">
235
+ ${bf.map(f => `<span class="ctx-backend-tag">${escapeHtml(String(f))}</span>`).join('')}
236
+ </div>
237
+ </div>
238
+ `);
239
+ }
240
+
241
+ if (techStack.libraries && typeof techStack.libraries === 'object') {
242
+ Object.entries(techStack.libraries).forEach(([category, libList]) => {
243
+ if (Array.isArray(libList) && libList.length > 0) {
244
+ sections.push(`
245
+ <div class="ctx-stack-section">
246
+ <span class="ctx-stack-label">${escapeHtml(category)}</span>
247
+ <div class="ctx-stack-tags">
248
+ ${libList.map(lib => `<span class="ctx-lib-tag">${escapeHtml(String(lib))}</span>`).join('')}
249
+ </div>
250
+ </div>
251
+ `);
252
+ }
253
+ });
254
+ }
255
+
256
+ return sections.join('');
257
+ }
258
+
259
+ function renderCodingConventionsCards(conventions) {
260
+ const sections = [];
261
+
262
+ // Helper to format leaf values
263
+ const formatLeafValue = (val) => {
264
+ if (val === null || val === undefined) return '-';
265
+ if (Array.isArray(val)) return val.map(v => escapeHtml(String(v))).join(', ');
266
+ return escapeHtml(String(val));
267
+ };
268
+
269
+ // Helper to render items (handles nested objects like {backend: ..., frontend: ...})
270
+ const renderItems = (data) => {
271
+ return Object.entries(data).map(([key, val]) => {
272
+ // Check if val is a nested object (like {backend: {...}, frontend: {...}})
273
+ if (val && typeof val === 'object' && !Array.isArray(val)) {
274
+ // Render sub-items for nested structure
275
+ return Object.entries(val).map(([subKey, subVal]) => `
276
+ <div class="ctx-conv-item">
277
+ <span class="ctx-conv-key">${escapeHtml(key)}</span>
278
+ <span class="ctx-conv-value">${formatLeafValue(subVal)}</span>
279
+ </div>
280
+ `).join('');
281
+ }
282
+ return `
283
+ <div class="ctx-conv-item">
284
+ <span class="ctx-conv-key">${escapeHtml(key)}</span>
285
+ <span class="ctx-conv-value">${formatLeafValue(val)}</span>
286
+ </div>
287
+ `;
288
+ }).join('');
289
+ };
290
+
291
+ // Render all convention sections
292
+ Object.entries(conventions).forEach(([key, val]) => {
293
+ if (val && typeof val === 'object' && !Array.isArray(val) && Object.keys(val).length > 0) {
294
+ const label = key.replace(/_/g, ' ').replace(/\b\w/g, c => c.toUpperCase());
295
+ sections.push(`
296
+ <div class="ctx-conv-section">
297
+ <span class="ctx-conv-label">${escapeHtml(label)}</span>
298
+ <div class="ctx-conv-items">
299
+ ${renderItems(val)}
300
+ </div>
301
+ </div>
302
+ `);
303
+ }
304
+ });
305
+
306
+ return sections.length > 0 ? sections.join('') : '';
307
+ }
308
+
309
+ function renderAssetsCards(assets) {
310
+ const sections = [];
311
+
312
+ // Documentation section - card grid layout
313
+ if (assets.documentation && assets.documentation.length > 0) {
314
+ sections.push(`
315
+ <div class="ctx-assets-category">
316
+ <div class="ctx-assets-cat-header">
317
+ <span class="ctx-assets-cat-icon">📄</span>
318
+ <span class="ctx-assets-cat-title">Documentation</span>
319
+ <span class="ctx-assets-cat-count">${assets.documentation.length}</span>
320
+ </div>
321
+ <div class="ctx-assets-card-grid">
322
+ ${assets.documentation.map(doc => `
323
+ <div class="ctx-asset-card ctx-asset-doc">
324
+ <span class="ctx-asset-card-path">${escapeHtml(doc.path)}</span>
325
+ <span class="ctx-asset-card-badge ctx-relevance-badge">${(doc.relevance_score * 100).toFixed(0)}%</span>
326
+ </div>
327
+ `).join('')}
328
+ </div>
329
+ </div>
330
+ `);
331
+ }
332
+
333
+ // Source Code section - card grid layout
334
+ if (assets.source_code && assets.source_code.length > 0) {
335
+ sections.push(`
336
+ <div class="ctx-assets-category">
337
+ <div class="ctx-assets-cat-header">
338
+ <span class="ctx-assets-cat-icon">💻</span>
339
+ <span class="ctx-assets-cat-title">Source Code</span>
340
+ <span class="ctx-assets-cat-count">${assets.source_code.length}</span>
341
+ </div>
342
+ <div class="ctx-assets-card-grid">
343
+ ${assets.source_code.map(src => `
344
+ <div class="ctx-asset-card ctx-asset-src">
345
+ <span class="ctx-asset-card-path">${escapeHtml(src.path)}</span>
346
+ ${src.role ? `<span class="ctx-asset-card-badge ctx-role-badge">${escapeHtml(src.role.replace(/-/g, ' '))}</span>` : ''}
347
+ </div>
348
+ `).join('')}
349
+ </div>
350
+ </div>
351
+ `);
352
+ }
353
+
354
+ // Tests section - card grid layout
355
+ if (assets.tests && assets.tests.length > 0) {
356
+ sections.push(`
357
+ <div class="ctx-assets-category">
358
+ <div class="ctx-assets-cat-header">
359
+ <span class="ctx-assets-cat-icon">🧪</span>
360
+ <span class="ctx-assets-cat-title">Tests</span>
361
+ <span class="ctx-assets-cat-count">${assets.tests.length}</span>
362
+ </div>
363
+ <div class="ctx-assets-card-grid">
364
+ ${assets.tests.map(test => `
365
+ <div class="ctx-asset-card ctx-asset-test">
366
+ <span class="ctx-asset-card-path">${escapeHtml(test.path)}</span>
367
+ ${test.test_count ? `<span class="ctx-asset-card-badge ctx-test-badge">${test.test_count} tests</span>` : ''}
368
+ </div>
369
+ `).join('')}
370
+ </div>
371
+ </div>
372
+ `);
373
+ }
374
+
375
+ return sections.join('');
376
+ }
377
+
378
+ function renderDependenciesCards(dependencies) {
379
+ const sections = [];
380
+
381
+ if (dependencies.internal && dependencies.internal.length > 0) {
382
+ sections.push(`
383
+ <div class="ctx-deps-section">
384
+ <div class="ctx-deps-header">
385
+ <span class="ctx-deps-label">Internal Dependencies</span>
386
+ <span class="ctx-deps-count">${dependencies.internal.length}</span>
387
+ </div>
388
+ <div class="ctx-deps-table">
389
+ <div class="ctx-deps-table-header">
390
+ <span class="ctx-deps-col-from">From</span>
391
+ <span class="ctx-deps-col-type">Type</span>
392
+ <span class="ctx-deps-col-to">To</span>
393
+ </div>
394
+ <div class="ctx-deps-table-body">
395
+ ${dependencies.internal.map(dep => `
396
+ <div class="ctx-deps-row">
397
+ <span class="ctx-deps-col-from">${escapeHtml(dep.from)}</span>
398
+ <span class="ctx-deps-col-type">
399
+ <span class="ctx-deps-type-badge ctx-deps-type-${dep.type}">${escapeHtml(dep.type)}</span>
400
+ </span>
401
+ <span class="ctx-deps-col-to">${escapeHtml(dep.to)}</span>
402
+ </div>
403
+ `).join('')}
404
+ </div>
405
+ </div>
406
+ </div>
407
+ `);
408
+ }
409
+
410
+ if (dependencies.external && dependencies.external.length > 0) {
411
+ sections.push(`
412
+ <div class="ctx-deps-section">
413
+ <div class="ctx-deps-header">
414
+ <span class="ctx-deps-label">External Packages</span>
415
+ <span class="ctx-deps-count">${dependencies.external.length}</span>
416
+ </div>
417
+ <div class="ctx-deps-packages">
418
+ ${dependencies.external.map(dep => `
419
+ <span class="ctx-pkg-tag">${escapeHtml(dep.package)}${dep.version ? `@${escapeHtml(dep.version)}` : ''}</span>
420
+ `).join('')}
421
+ </div>
422
+ </div>
423
+ `);
424
+ }
425
+
426
+ return sections.join('');
427
+ }
428
+
429
+ function renderTestContextCards(testContext) {
430
+ const sections = [];
431
+
432
+ // Stats row
433
+ const tests = testContext.existing_tests || {};
434
+ let totalTests = 0;
435
+ if (tests.backend) {
436
+ if (tests.backend.integration) totalTests += tests.backend.integration.tests || 0;
437
+ if (tests.backend.api_endpoints) totalTests += tests.backend.api_endpoints.tests || 0;
438
+ }
439
+
440
+ sections.push(`
441
+ <div class="ctx-test-stats">
442
+ <div class="ctx-stat-box">
443
+ <span class="ctx-stat-value">${totalTests}</span>
444
+ <span class="ctx-stat-label">Total Tests</span>
445
+ </div>
446
+ ${testContext.coverage_config?.target ? `
447
+ <div class="ctx-stat-box">
448
+ <span class="ctx-stat-value">${escapeHtml(testContext.coverage_config.target)}</span>
449
+ <span class="ctx-stat-label">Coverage Target</span>
450
+ </div>
451
+ ` : ''}
452
+ </div>
453
+ `);
454
+
455
+ if (testContext.frameworks) {
456
+ const fw = testContext.frameworks;
457
+ sections.push(`
458
+ <div class="ctx-test-frameworks">
459
+ ${fw.backend ? `
460
+ <div class="ctx-fw-card ctx-fw-installed">
461
+ <span class="ctx-fw-type">Backend</span>
462
+ <span class="ctx-fw-name">${escapeHtml(fw.backend.name || 'N/A')}</span>
463
+ </div>
464
+ ` : ''}
465
+ ${fw.frontend ? `
466
+ <div class="ctx-fw-card ${fw.frontend.name?.includes('NONE') ? 'ctx-fw-missing' : 'ctx-fw-installed'}">
467
+ <span class="ctx-fw-type">Frontend</span>
468
+ <span class="ctx-fw-name">${escapeHtml(fw.frontend.name || 'N/A')}</span>
469
+ </div>
470
+ ` : ''}
471
+ </div>
472
+ `);
473
+ }
474
+
475
+ return sections.join('');
476
+ }
477
+
478
+ function renderConflictCards(conflictDetection) {
479
+ const sections = [];
480
+
481
+ if (conflictDetection.mitigation_strategy) {
482
+ // Parse numbered items like "(1) ... (2) ..." into list
483
+ const strategy = conflictDetection.mitigation_strategy;
484
+ const items = strategy.split(/\(\d+\)/).filter(s => s.trim());
485
+
486
+ if (items.length > 1) {
487
+ sections.push(`
488
+ <div class="ctx-mitigation">
489
+ <span class="ctx-mitigation-label">Mitigation Strategy</span>
490
+ <ol class="ctx-mitigation-list">
491
+ ${items.map(item => `<li>${escapeHtml(item.trim())}</li>`).join('')}
492
+ </ol>
493
+ </div>
494
+ `);
495
+ } else {
496
+ sections.push(`
497
+ <div class="ctx-mitigation">
498
+ <span class="ctx-mitigation-label">Mitigation Strategy</span>
499
+ <p class="ctx-mitigation-text">${escapeHtml(strategy)}</p>
500
+ </div>
501
+ `);
502
+ }
503
+ }
504
+
505
+ if (conflictDetection.risk_factors) {
506
+ const factors = conflictDetection.risk_factors;
507
+ if (factors.test_gaps?.length > 0) {
508
+ sections.push(`
509
+ <div class="ctx-risk-section">
510
+ <span class="ctx-risk-label">Test Gaps</span>
511
+ <ul class="ctx-risk-list">
512
+ ${factors.test_gaps.map(gap => `<li>${escapeHtml(gap)}</li>`).join('')}
513
+ </ul>
514
+ </div>
515
+ `);
516
+ }
517
+ }
518
+
519
+ if (conflictDetection.affected_modules?.length > 0) {
520
+ sections.push(`
521
+ <div class="ctx-affected">
522
+ <span class="ctx-affected-label">Affected Modules</span>
523
+ <div class="ctx-affected-tags">
524
+ ${conflictDetection.affected_modules.map(mod => `<span class="ctx-affected-tag">${escapeHtml(mod)}</span>`).join('')}
525
+ </div>
526
+ </div>
527
+ `);
528
+ }
529
+
530
+ return sections.join('');
531
+ }
532
+
533
+ function renderTechStackSection(techStack) {
534
+ const sections = [];
535
+
536
+ if (techStack.languages) {
537
+ const langs = Array.isArray(techStack.languages) ? techStack.languages : [techStack.languages];
538
+ sections.push(`
539
+ <div class="context-field">
540
+ <span class="context-label">Languages:</span>
541
+ <div class="flex flex-wrap gap-1 mt-1">
542
+ ${langs.map(l => `<span class="badge badge-primary text-xs">${escapeHtml(String(l))}</span>`).join('')}
543
+ </div>
544
+ </div>
545
+ `);
546
+ }
547
+
548
+ if (techStack.frameworks) {
549
+ const frameworks = Array.isArray(techStack.frameworks) ? techStack.frameworks : [techStack.frameworks];
550
+ sections.push(`
551
+ <div class="context-field">
552
+ <span class="context-label">Frameworks:</span>
553
+ <div class="flex flex-wrap gap-1 mt-1">
554
+ ${frameworks.map(f => `<span class="badge badge-secondary text-xs">${escapeHtml(String(f))}</span>`).join('')}
555
+ </div>
556
+ </div>
557
+ `);
558
+ }
559
+
560
+ if (techStack.frontend_frameworks) {
561
+ const ff = Array.isArray(techStack.frontend_frameworks) ? techStack.frontend_frameworks : [techStack.frontend_frameworks];
562
+ sections.push(`
563
+ <div class="context-field">
564
+ <span class="context-label">Frontend:</span>
565
+ <div class="flex flex-wrap gap-1 mt-1">
566
+ ${ff.map(f => `<span class="badge badge-secondary text-xs">${escapeHtml(String(f))}</span>`).join('')}
567
+ </div>
568
+ </div>
569
+ `);
570
+ }
571
+
572
+ if (techStack.backend_frameworks) {
573
+ const bf = Array.isArray(techStack.backend_frameworks) ? techStack.backend_frameworks : [techStack.backend_frameworks];
574
+ sections.push(`
575
+ <div class="context-field">
576
+ <span class="context-label">Backend:</span>
577
+ <div class="flex flex-wrap gap-1 mt-1">
578
+ ${bf.map(f => `<span class="badge badge-secondary text-xs">${escapeHtml(String(f))}</span>`).join('')}
579
+ </div>
580
+ </div>
581
+ `);
582
+ }
583
+
584
+ if (techStack.libraries) {
585
+ const libs = techStack.libraries;
586
+ if (typeof libs === 'object' && !Array.isArray(libs)) {
587
+ Object.entries(libs).forEach(([category, libList]) => {
588
+ if (Array.isArray(libList) && libList.length > 0) {
589
+ sections.push(`
590
+ <div class="context-field">
591
+ <span class="context-label">${escapeHtml(category)}:</span>
592
+ <ul class="list-disc list-inside ml-4 mt-1 text-sm text-muted-foreground">
593
+ ${libList.map(lib => `<li>${escapeHtml(String(lib))}</li>`).join('')}
594
+ </ul>
595
+ </div>
596
+ `);
597
+ }
598
+ });
599
+ }
600
+ }
601
+
602
+ return sections.join('');
603
+ }
604
+
605
+ function renderCodingConventions(conventions) {
606
+ const sections = [];
607
+
608
+ if (conventions.naming) {
609
+ sections.push(`
610
+ <div class="context-field">
611
+ <span class="context-label">Naming:</span>
612
+ <ul class="list-disc list-inside ml-4 mt-1 text-sm text-muted-foreground">
613
+ ${Object.entries(conventions.naming).map(([key, val]) =>
614
+ `<li><strong>${escapeHtml(key)}:</strong> ${escapeHtml(String(val))}</li>`
615
+ ).join('')}
616
+ </ul>
617
+ </div>
618
+ `);
619
+ }
620
+
621
+ if (conventions.error_handling) {
622
+ sections.push(`
623
+ <div class="context-field">
624
+ <span class="context-label">Error Handling:</span>
625
+ <ul class="list-disc list-inside ml-4 mt-1 text-sm text-muted-foreground">
626
+ ${Object.entries(conventions.error_handling).map(([key, val]) =>
627
+ `<li><strong>${escapeHtml(key)}:</strong> ${escapeHtml(String(val))}</li>`
628
+ ).join('')}
629
+ </ul>
630
+ </div>
631
+ `);
632
+ }
633
+
634
+ if (conventions.testing) {
635
+ sections.push(`
636
+ <div class="context-field">
637
+ <span class="context-label">Testing:</span>
638
+ <ul class="list-disc list-inside ml-4 mt-1 text-sm text-muted-foreground">
639
+ ${Object.entries(conventions.testing).map(([key, val]) => {
640
+ if (Array.isArray(val)) {
641
+ return `<li><strong>${escapeHtml(key)}:</strong> ${val.map(v => escapeHtml(String(v))).join(', ')}</li>`;
642
+ }
643
+ return `<li><strong>${escapeHtml(key)}:</strong> ${escapeHtml(String(val))}</li>`;
644
+ }).join('')}
645
+ </ul>
646
+ </div>
647
+ `);
648
+ }
649
+
650
+ return sections.join('');
651
+ }
652
+
653
+ function renderAssetsSection(assets) {
654
+ const sections = [];
655
+
656
+ // Documentation
657
+ if (assets.documentation && assets.documentation.length > 0) {
658
+ sections.push(`
659
+ <div class="asset-category">
660
+ <h5 class="asset-category-title">📄 Documentation</h5>
661
+ <div class="asset-grid">
662
+ ${assets.documentation.map(doc => `
663
+ <div class="asset-card">
664
+ <div class="asset-card-header">
665
+ <span class="asset-path">${escapeHtml(doc.path)}</span>
666
+ <span class="relevance-score" style="background: ${getRelevanceColor(doc.relevance_score)}">${(doc.relevance_score * 100).toFixed(0)}%</span>
667
+ </div>
668
+ <div class="asset-card-body">
669
+ <div class="asset-scope">${escapeHtml(doc.scope || '')}</div>
670
+ ${doc.contains && doc.contains.length > 0 ? `
671
+ <div class="asset-tags">
672
+ ${doc.contains.map(tag => `<span class="asset-tag">${escapeHtml(tag)}</span>`).join('')}
673
+ </div>
674
+ ` : ''}
675
+ </div>
676
+ </div>
677
+ `).join('')}
678
+ </div>
679
+ </div>
680
+ `);
681
+ }
682
+
683
+ // Source Code
684
+ if (assets.source_code && assets.source_code.length > 0) {
685
+ sections.push(`
686
+ <div class="asset-category">
687
+ <h5 class="asset-category-title">💻 Source Code</h5>
688
+ <div class="asset-grid">
689
+ ${assets.source_code.map(src => `
690
+ <div class="asset-card">
691
+ <div class="asset-card-header">
692
+ <span class="asset-path">${escapeHtml(src.path)}</span>
693
+ <span class="relevance-score" style="background: ${getRelevanceColor(src.relevance_score)}">${(src.relevance_score * 100).toFixed(0)}%</span>
694
+ </div>
695
+ <div class="asset-card-body">
696
+ <div class="asset-role-badge badge-${getRoleBadgeClass(src.role)}">${escapeHtml(src.role || '')}</div>
697
+ ${src.exports && src.exports.length > 0 ? `
698
+ <div class="asset-meta"><strong>Exports:</strong> ${src.exports.map(e => `<code class="inline-code">${escapeHtml(e)}</code>`).join(', ')}</div>
699
+ ` : ''}
700
+ ${src.features && src.features.length > 0 ? `
701
+ <div class="asset-features">${src.features.map(f => `<span class="feature-tag">${escapeHtml(f)}</span>`).join('')}</div>
702
+ ` : ''}
703
+ </div>
704
+ </div>
705
+ `).join('')}
706
+ </div>
707
+ </div>
708
+ `);
709
+ }
710
+
711
+ // Tests
712
+ if (assets.tests && assets.tests.length > 0) {
713
+ sections.push(`
714
+ <div class="asset-category">
715
+ <h5 class="asset-category-title">🧪 Tests</h5>
716
+ <div class="asset-grid">
717
+ ${assets.tests.map(test => `
718
+ <div class="asset-card">
719
+ <div class="asset-card-header">
720
+ <span class="asset-path">${escapeHtml(test.path)}</span>
721
+ ${test.test_count ? `<span class="test-count-badge">${test.test_count} tests</span>` : ''}
722
+ </div>
723
+ <div class="asset-card-body">
724
+ <div class="asset-type">${escapeHtml(test.type || '')}</div>
725
+ ${test.test_classes ? `<div class="asset-meta"><strong>Classes:</strong> ${escapeHtml(test.test_classes.join(', '))}</div>` : ''}
726
+ ${test.coverage ? `<div class="asset-meta"><strong>Coverage:</strong> ${escapeHtml(test.coverage)}</div>` : ''}
727
+ </div>
728
+ </div>
729
+ `).join('')}
730
+ </div>
731
+ </div>
732
+ `);
733
+ }
734
+
735
+ return sections.join('');
736
+ }
737
+
738
+ function renderDependenciesSection(dependencies) {
739
+ const sections = [];
740
+
741
+ // Internal Dependencies
742
+ if (dependencies.internal && dependencies.internal.length > 0) {
743
+ sections.push(`
744
+ <div class="dep-category">
745
+ <h5 class="dep-category-title">🔄 Internal Dependencies</h5>
746
+ <div class="dep-graph">
747
+ ${dependencies.internal.slice(0, 10).map(dep => `
748
+ <div class="dep-item">
749
+ <div class="dep-from">${escapeHtml(dep.from)}</div>
750
+ <div class="dep-arrow">
751
+ <span class="dep-type-badge badge-${dep.type}">${escapeHtml(dep.type)}</span>
752
+
753
+ </div>
754
+ <div class="dep-to">${escapeHtml(dep.to)}</div>
755
+ </div>
756
+ `).join('')}
757
+ ${dependencies.internal.length > 10 ? `<div class="dep-more">... and ${dependencies.internal.length - 10} more</div>` : ''}
758
+ </div>
759
+ </div>
760
+ `);
761
+ }
762
+
763
+ // External Dependencies
764
+ if (dependencies.external && dependencies.external.length > 0) {
765
+ sections.push(`
766
+ <div class="dep-category">
767
+ <h5 class="dep-category-title">📦 External Dependencies</h5>
768
+ <div class="dep-grid">
769
+ ${dependencies.external.map(dep => `
770
+ <div class="dep-external-card">
771
+ <div class="dep-package-name">${escapeHtml(dep.package)}</div>
772
+ <div class="dep-version">${escapeHtml(dep.version || '')}</div>
773
+ <div class="dep-usage">${escapeHtml(dep.usage || '')}</div>
774
+ </div>
775
+ `).join('')}
776
+ </div>
777
+ </div>
778
+ `);
779
+ }
780
+
781
+ return sections.join('');
782
+ }
783
+
784
+ function renderTestContextSection(testContext) {
785
+ const sections = [];
786
+
787
+ // Test Frameworks
788
+ if (testContext.frameworks) {
789
+ const frameworks = testContext.frameworks;
790
+ sections.push(`
791
+ <div class="test-category">
792
+ <h5 class="test-category-title">🛠️ Test Frameworks</h5>
793
+ <div class="test-frameworks-grid">
794
+ ${frameworks.backend ? `
795
+ <div class="framework-card framework-installed">
796
+ <div class="framework-header">
797
+ <span class="framework-label">Backend</span>
798
+ <span class="framework-name">${escapeHtml(frameworks.backend.name || 'N/A')}</span>
799
+ </div>
800
+ ${frameworks.backend.plugins ? `
801
+ <div class="framework-plugins">${frameworks.backend.plugins.map(p => `<span class="plugin-tag">${escapeHtml(p)}</span>`).join('')}</div>
802
+ ` : ''}
803
+ </div>
804
+ ` : ''}
805
+ ${frameworks.frontend ? `
806
+ <div class="framework-card ${frameworks.frontend.name && frameworks.frontend.name.includes('NONE') ? 'framework-missing' : 'framework-installed'}">
807
+ <div class="framework-header">
808
+ <span class="framework-label">Frontend</span>
809
+ <span class="framework-name">${escapeHtml(frameworks.frontend.name || 'N/A')}</span>
810
+ </div>
811
+ ${frameworks.frontend.recommended ? `<div class="framework-recommended">Recommended: ${escapeHtml(frameworks.frontend.recommended)}</div>` : ''}
812
+ ${frameworks.frontend.gap ? `<div class="framework-gap">⚠️ ${escapeHtml(frameworks.frontend.gap)}</div>` : ''}
813
+ </div>
814
+ ` : ''}
815
+ </div>
816
+ </div>
817
+ `);
818
+ }
819
+
820
+ // Existing Tests Statistics
821
+ if (testContext.existing_tests) {
822
+ const tests = testContext.existing_tests;
823
+ let totalTests = 0;
824
+ let totalClasses = 0;
825
+
826
+ if (tests.backend) {
827
+ if (tests.backend.integration) {
828
+ totalTests += tests.backend.integration.tests || 0;
829
+ totalClasses += tests.backend.integration.classes || 0;
830
+ }
831
+ if (tests.backend.api_endpoints) {
832
+ totalTests += tests.backend.api_endpoints.tests || 0;
833
+ totalClasses += tests.backend.api_endpoints.classes || 0;
834
+ }
835
+ }
836
+
837
+ sections.push(`
838
+ <div class="test-category">
839
+ <h5 class="test-category-title">📊 Test Statistics</h5>
840
+ <div class="test-stats-grid">
841
+ <div class="stat-card">
842
+ <div class="stat-value">${totalTests}</div>
843
+ <div class="stat-label">Total Tests</div>
844
+ </div>
845
+ <div class="stat-card">
846
+ <div class="stat-value">${totalClasses}</div>
847
+ <div class="stat-label">Test Classes</div>
848
+ </div>
849
+ ${testContext.coverage_config && testContext.coverage_config.target ? `
850
+ <div class="stat-card">
851
+ <div class="stat-value">${escapeHtml(testContext.coverage_config.target)}</div>
852
+ <div class="stat-label">Coverage Target</div>
853
+ </div>
854
+ ` : ''}
855
+ </div>
856
+ </div>
857
+ `);
858
+ }
859
+
860
+ // Test Markers
861
+ if (testContext.test_markers) {
862
+ sections.push(`
863
+ <div class="test-category">
864
+ <h5 class="test-category-title">🏷️ Test Markers</h5>
865
+ <div class="test-markers-grid">
866
+ ${Object.entries(testContext.test_markers).map(([marker, desc]) => `
867
+ <div class="marker-card">
868
+ <span class="marker-name">@${escapeHtml(marker)}</span>
869
+ <span class="marker-desc">${escapeHtml(desc)}</span>
870
+ </div>
871
+ `).join('')}
872
+ </div>
873
+ </div>
874
+ `);
875
+ }
876
+
877
+ return sections.join('');
878
+ }
879
+
880
+ function renderConflictDetectionSection(conflictDetection) {
881
+ const sections = [];
882
+
883
+ // Risk Level Indicator
884
+ if (conflictDetection.risk_level) {
885
+ const riskLevel = conflictDetection.risk_level;
886
+ const riskColor = riskLevel === 'high' ? '#ef4444' : riskLevel === 'medium' ? '#f59e0b' : '#10b981';
887
+ sections.push(`
888
+ <div class="risk-indicator" style="border-color: ${riskColor}">
889
+ <div class="risk-level" style="background: ${riskColor}">
890
+ ${escapeHtml(riskLevel.toUpperCase())} RISK
891
+ </div>
892
+ ${conflictDetection.mitigation_strategy ? `
893
+ <div class="risk-mitigation">
894
+ <strong>Mitigation Strategy:</strong> ${escapeHtml(conflictDetection.mitigation_strategy)}
895
+ </div>
896
+ ` : ''}
897
+ </div>
898
+ `);
899
+ }
900
+
901
+ // Risk Factors
902
+ if (conflictDetection.risk_factors) {
903
+ const factors = conflictDetection.risk_factors;
904
+ sections.push(`
905
+ <div class="conflict-category">
906
+ <h5 class="conflict-category-title">⚠️ Risk Factors</h5>
907
+ <div class="risk-factors-list">
908
+ ${factors.test_gaps && factors.test_gaps.length > 0 ? `
909
+ <div class="risk-factor">
910
+ <strong class="risk-factor-title">Test Gaps:</strong>
911
+ <ul class="risk-factor-items">
912
+ ${factors.test_gaps.map(gap => `<li>${escapeHtml(gap)}</li>`).join('')}
913
+ </ul>
914
+ </div>
915
+ ` : ''}
916
+ ${factors.existing_implementations && factors.existing_implementations.length > 0 ? `
917
+ <div class="risk-factor">
918
+ <strong class="risk-factor-title">Existing Implementations:</strong>
919
+ <ul class="risk-factor-items">
920
+ ${factors.existing_implementations.map(impl => `<li>${escapeHtml(impl)}</li>`).join('')}
921
+ </ul>
922
+ </div>
923
+ ` : ''}
924
+ </div>
925
+ </div>
926
+ `);
927
+ }
928
+
929
+ // Affected Modules
930
+ if (conflictDetection.affected_modules && conflictDetection.affected_modules.length > 0) {
931
+ sections.push(`
932
+ <div class="conflict-category">
933
+ <h5 class="conflict-category-title">📦 Affected Modules</h5>
934
+ <div class="affected-modules-grid">
935
+ ${conflictDetection.affected_modules.map(mod => `
936
+ <span class="affected-module-tag">${escapeHtml(mod)}</span>
937
+ `).join('')}
938
+ </div>
939
+ </div>
940
+ `);
941
+ }
942
+
943
+ // Historical Conflicts
944
+ if (conflictDetection.historical_conflicts && conflictDetection.historical_conflicts.length > 0) {
945
+ sections.push(`
946
+ <div class="conflict-category">
947
+ <h5 class="conflict-category-title">📜 Historical Lessons</h5>
948
+ <div class="historical-conflicts-list">
949
+ ${conflictDetection.historical_conflicts.map(conflict => `
950
+ <div class="historical-conflict-card">
951
+ <div class="conflict-source">Source: ${escapeHtml(conflict.source || 'Unknown')}</div>
952
+ ${conflict.lesson ? `<div class="conflict-lesson"><strong>Lesson:</strong> ${escapeHtml(conflict.lesson)}</div>` : ''}
953
+ ${conflict.recommendation ? `<div class="conflict-recommendation"><strong>Recommendation:</strong> ${escapeHtml(conflict.recommendation)}</div>` : ''}
954
+ ${conflict.challenge ? `<div class="conflict-challenge"><strong>Challenge:</strong> ${escapeHtml(conflict.challenge)}</div>` : ''}
955
+ </div>
956
+ `).join('')}
957
+ </div>
958
+ </div>
959
+ `);
960
+ }
961
+
962
+ return sections.join('');
963
+ }
964
+
965
+ // ==========================================
966
+ // Session Context Tab Rendering (Standard Sessions)
967
+ // ==========================================
968
+ // Combines context-package, explorations, and conflict resolution
969
+
970
+ function renderSessionContextContent(context, explorations, conflictResolution) {
971
+ let sections = [];
972
+
973
+
974
+ // Render explorations if available (from exploration-*.json files)
975
+ if (explorations && explorations.manifest) {
976
+ sections.push(renderExplorationContext(explorations));
977
+ }
978
+
979
+ // Render context-package.json content
980
+ if (context) {
981
+ const contextJson = JSON.stringify(context, null, 2);
982
+ window._currentContextJson = contextJson;
983
+
984
+ // Use existing renderContextContent for detailed rendering
985
+ sections.push(`
986
+ <div class="session-context-section">
987
+ ${renderContextContent(context)}
988
+ </div>
989
+ `);
990
+ }
991
+
992
+ // If we have any sections, wrap them
993
+ if (sections.length > 0) {
994
+ return `<div class="context-tab-content session-context-combined">${sections.join('')}</div>`;
995
+ }
996
+
997
+ return `
998
+ <div class="tab-empty-state">
999
+ <div class="empty-icon">📦</div>
1000
+ <div class="empty-title">No Context Data</div>
1001
+ <div class="empty-text">No context-package.json or exploration files found for this session.</div>
1002
+ </div>
1003
+ `;
1004
+ }
1005
+
1006
+ // ==========================================
1007
+ // Conflict Resolution Context Rendering
1008
+ // ==========================================
1009
+
1010
+ function renderConflictResolutionContext(conflictResolution) {
1011
+ if (!conflictResolution) {
1012
+ return '';
1013
+ }
1014
+
1015
+ let sections = [];
1016
+
1017
+ // Header
1018
+ sections.push(`
1019
+ <div class="conflict-resolution-header">
1020
+ <h4>⚖️ Conflict Resolution Decisions</h4>
1021
+ <div class="conflict-meta">
1022
+ <span class="meta-item">Session: <strong>${escapeHtml(conflictResolution.session_id || 'N/A')}</strong></span>
1023
+ ${conflictResolution.resolved_at ? `<span class="meta-item">Resolved: <strong>${formatDate(conflictResolution.resolved_at)}</strong></span>` : ''}
1024
+ </div>
1025
+ </div>
1026
+ `);
1027
+
1028
+ // User decisions
1029
+ if (conflictResolution.user_decisions && Object.keys(conflictResolution.user_decisions).length > 0) {
1030
+ const decisions = Object.entries(conflictResolution.user_decisions);
1031
+
1032
+ sections.push(`
1033
+ <div class="conflict-decisions-section collapsible-section">
1034
+ <div class="collapsible-header">
1035
+ <span class="collapse-icon">▶</span>
1036
+ <span class="section-label">🎯 User Decisions (${decisions.length})</span>
1037
+ </div>
1038
+ <div class="collapsible-content collapsed">
1039
+ <div class="decisions-list">
1040
+ ${decisions.map(([key, decision]) => `
1041
+ <div class="decision-item">
1042
+ <div class="decision-header">
1043
+ <span class="decision-key">${escapeHtml(key.replace(/_/g, ' '))}</span>
1044
+ <span class="decision-choice">${escapeHtml(decision.choice || 'N/A')}</span>
1045
+ </div>
1046
+ ${decision.description ? `<p class="decision-description">${escapeHtml(decision.description)}</p>` : ''}
1047
+ ${decision.implications && decision.implications.length > 0 ? `
1048
+ <div class="decision-implications">
1049
+ <span class="implications-label">Implications:</span>
1050
+ <ul class="implications-list">
1051
+ ${decision.implications.map(impl => `<li>${escapeHtml(impl)}</li>`).join('')}
1052
+ </ul>
1053
+ </div>
1054
+ ` : ''}
1055
+ </div>
1056
+ `).join('')}
1057
+ </div>
1058
+ </div>
1059
+ </div>
1060
+ `);
1061
+ }
1062
+
1063
+ // Resolved conflicts
1064
+ if (conflictResolution.resolved_conflicts && conflictResolution.resolved_conflicts.length > 0) {
1065
+ sections.push(`
1066
+ <div class="resolved-conflicts-section collapsible-section">
1067
+ <div class="collapsible-header">
1068
+ <span class="collapse-icon">▶</span>
1069
+ <span class="section-label">✅ Resolved Conflicts (${conflictResolution.resolved_conflicts.length})</span>
1070
+ </div>
1071
+ <div class="collapsible-content collapsed">
1072
+ <div class="conflicts-list">
1073
+ ${conflictResolution.resolved_conflicts.map(conflict => `
1074
+ <div class="resolved-conflict-item">
1075
+ <div class="conflict-row">
1076
+ <span class="conflict-id">${escapeHtml(conflict.id || 'N/A')}</span>
1077
+ <span class="conflict-category-badge">${escapeHtml(conflict.category || 'General')}</span>
1078
+ </div>
1079
+ <div class="conflict-brief">${escapeHtml(conflict.brief || '')}</div>
1080
+ <div class="conflict-strategy">
1081
+ <span class="strategy-label">Strategy:</span>
1082
+ <span class="strategy-value">${escapeHtml(conflict.strategy || 'N/A')}</span>
1083
+ </div>
1084
+ </div>
1085
+ `).join('')}
1086
+ </div>
1087
+ </div>
1088
+ </div>
1089
+ `);
1090
+ }
1091
+
1092
+ return `<div class="conflict-resolution-context">${sections.join('')}</div>`;
1093
+ }