@lavralabs/lavra 0.7.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 (452) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +159 -0
  3. package/bin/install.js +302 -0
  4. package/bin/plan-export.js +300 -0
  5. package/bin/plan-view.js +695 -0
  6. package/install.sh +136 -0
  7. package/package.json +28 -0
  8. package/plugins/lavra/.claude-plugin/plugin.json +22 -0
  9. package/plugins/lavra/.mcp.json +8 -0
  10. package/plugins/lavra/README.md +125 -0
  11. package/plugins/lavra/agents/design/design-implementation-reviewer.md +123 -0
  12. package/plugins/lavra/agents/design/design-iterator.md +219 -0
  13. package/plugins/lavra/agents/design/figma-design-sync.md +212 -0
  14. package/plugins/lavra/agents/docs/ankane-readme-writer.md +90 -0
  15. package/plugins/lavra/agents/research/best-practices-researcher.md +131 -0
  16. package/plugins/lavra/agents/research/framework-docs-researcher.md +111 -0
  17. package/plugins/lavra/agents/research/git-history-analyzer.md +73 -0
  18. package/plugins/lavra/agents/research/learnings-researcher.md +255 -0
  19. package/plugins/lavra/agents/research/repo-research-analyst.md +157 -0
  20. package/plugins/lavra/agents/review/agent-native-reviewer.md +274 -0
  21. package/plugins/lavra/agents/review/architecture-strategist.md +82 -0
  22. package/plugins/lavra/agents/review/code-simplicity-reviewer.md +109 -0
  23. package/plugins/lavra/agents/review/data-integrity-guardian.md +89 -0
  24. package/plugins/lavra/agents/review/data-migration-expert.md +118 -0
  25. package/plugins/lavra/agents/review/deployment-verification-agent.md +178 -0
  26. package/plugins/lavra/agents/review/dhh-rails-reviewer.md +94 -0
  27. package/plugins/lavra/agents/review/goal-verifier.md +109 -0
  28. package/plugins/lavra/agents/review/julik-frontend-races-reviewer.md +239 -0
  29. package/plugins/lavra/agents/review/kieran-python-reviewer.md +148 -0
  30. package/plugins/lavra/agents/review/kieran-rails-reviewer.md +130 -0
  31. package/plugins/lavra/agents/review/kieran-typescript-reviewer.md +139 -0
  32. package/plugins/lavra/agents/review/migration-drift-detector.md +307 -0
  33. package/plugins/lavra/agents/review/pattern-recognition-specialist.md +87 -0
  34. package/plugins/lavra/agents/review/performance-oracle.md +154 -0
  35. package/plugins/lavra/agents/review/security-sentinel.md +125 -0
  36. package/plugins/lavra/agents/workflow/bug-reproduction-validator.md +119 -0
  37. package/plugins/lavra/agents/workflow/every-style-editor.md +97 -0
  38. package/plugins/lavra/agents/workflow/lint.md +30 -0
  39. package/plugins/lavra/agents/workflow/pr-comment-resolver.md +95 -0
  40. package/plugins/lavra/agents/workflow/spec-flow-analyzer.md +156 -0
  41. package/plugins/lavra/commands/changelog.md +149 -0
  42. package/plugins/lavra/commands/heal-skill.md +130 -0
  43. package/plugins/lavra/commands/lavra-brainstorm.md +388 -0
  44. package/plugins/lavra/commands/lavra-ceo-review.md +388 -0
  45. package/plugins/lavra/commands/lavra-checkpoint.md +162 -0
  46. package/plugins/lavra/commands/lavra-design.md +621 -0
  47. package/plugins/lavra/commands/lavra-eng-review.md +262 -0
  48. package/plugins/lavra/commands/lavra-import.md +194 -0
  49. package/plugins/lavra/commands/lavra-learn.md +176 -0
  50. package/plugins/lavra/commands/lavra-plan.md +515 -0
  51. package/plugins/lavra/commands/lavra-qa.md +357 -0
  52. package/plugins/lavra/commands/lavra-quick.md +178 -0
  53. package/plugins/lavra/commands/lavra-recall.md +279 -0
  54. package/plugins/lavra/commands/lavra-research.md +267 -0
  55. package/plugins/lavra/commands/lavra-retro.md +400 -0
  56. package/plugins/lavra/commands/lavra-review.md +401 -0
  57. package/plugins/lavra/commands/lavra-ship.md +330 -0
  58. package/plugins/lavra/commands/lavra-triage.md +159 -0
  59. package/plugins/lavra/commands/lavra-work-ralph.md +521 -0
  60. package/plugins/lavra/commands/lavra-work-teams.md +504 -0
  61. package/plugins/lavra/commands/lavra-work.md +1019 -0
  62. package/plugins/lavra/commands/optional/agent-native-audit.md +282 -0
  63. package/plugins/lavra/commands/optional/feature-video.md +262 -0
  64. package/plugins/lavra/commands/optional/generate-command.md +146 -0
  65. package/plugins/lavra/commands/optional/reproduce-bug.md +97 -0
  66. package/plugins/lavra/commands/optional/xcode-test.md +287 -0
  67. package/plugins/lavra/commands/report-bug.md +155 -0
  68. package/plugins/lavra/commands/test-browser.md +305 -0
  69. package/plugins/lavra/cortex/agents/design/design-implementation-reviewer.md +127 -0
  70. package/plugins/lavra/cortex/agents/design/design-iterator.md +222 -0
  71. package/plugins/lavra/cortex/agents/design/figma-design-sync.md +215 -0
  72. package/plugins/lavra/cortex/agents/docs/ankane-readme-writer.md +93 -0
  73. package/plugins/lavra/cortex/agents/research/best-practices-researcher.md +135 -0
  74. package/plugins/lavra/cortex/agents/research/framework-docs-researcher.md +115 -0
  75. package/plugins/lavra/cortex/agents/research/git-history-analyzer.md +77 -0
  76. package/plugins/lavra/cortex/agents/research/learnings-researcher.md +259 -0
  77. package/plugins/lavra/cortex/agents/research/repo-research-analyst.md +161 -0
  78. package/plugins/lavra/cortex/agents/review/agent-native-reviewer.md +278 -0
  79. package/plugins/lavra/cortex/agents/review/architecture-strategist.md +86 -0
  80. package/plugins/lavra/cortex/agents/review/code-simplicity-reviewer.md +113 -0
  81. package/plugins/lavra/cortex/agents/review/data-integrity-guardian.md +93 -0
  82. package/plugins/lavra/cortex/agents/review/data-migration-expert.md +122 -0
  83. package/plugins/lavra/cortex/agents/review/deployment-verification-agent.md +182 -0
  84. package/plugins/lavra/cortex/agents/review/dhh-rails-reviewer.md +98 -0
  85. package/plugins/lavra/cortex/agents/review/goal-verifier.md +113 -0
  86. package/plugins/lavra/cortex/agents/review/julik-frontend-races-reviewer.md +243 -0
  87. package/plugins/lavra/cortex/agents/review/kieran-python-reviewer.md +152 -0
  88. package/plugins/lavra/cortex/agents/review/kieran-rails-reviewer.md +134 -0
  89. package/plugins/lavra/cortex/agents/review/kieran-typescript-reviewer.md +143 -0
  90. package/plugins/lavra/cortex/agents/review/migration-drift-detector.md +311 -0
  91. package/plugins/lavra/cortex/agents/review/pattern-recognition-specialist.md +91 -0
  92. package/plugins/lavra/cortex/agents/review/performance-oracle.md +158 -0
  93. package/plugins/lavra/cortex/agents/review/security-sentinel.md +129 -0
  94. package/plugins/lavra/cortex/agents/workflow/bug-reproduction-validator.md +123 -0
  95. package/plugins/lavra/cortex/agents/workflow/every-style-editor.md +101 -0
  96. package/plugins/lavra/cortex/agents/workflow/lint.md +33 -0
  97. package/plugins/lavra/cortex/agents/workflow/pr-comment-resolver.md +98 -0
  98. package/plugins/lavra/cortex/agents/workflow/spec-flow-analyzer.md +160 -0
  99. package/plugins/lavra/cortex/commands/agent-native-audit.md +286 -0
  100. package/plugins/lavra/cortex/commands/changelog.md +153 -0
  101. package/plugins/lavra/cortex/commands/create-agent-skill.md +21 -0
  102. package/plugins/lavra/cortex/commands/deploy-docs.md +69 -0
  103. package/plugins/lavra/cortex/commands/feature-video.md +266 -0
  104. package/plugins/lavra/cortex/commands/generate-command.md +150 -0
  105. package/plugins/lavra/cortex/commands/heal-skill.md +134 -0
  106. package/plugins/lavra/cortex/commands/lavra-brainstorm.md +392 -0
  107. package/plugins/lavra/cortex/commands/lavra-ceo-review.md +392 -0
  108. package/plugins/lavra/cortex/commands/lavra-checkpoint.md +166 -0
  109. package/plugins/lavra/cortex/commands/lavra-compound.md +168 -0
  110. package/plugins/lavra/cortex/commands/lavra-deepen.md +389 -0
  111. package/plugins/lavra/cortex/commands/lavra-design.md +625 -0
  112. package/plugins/lavra/cortex/commands/lavra-eng-review.md +266 -0
  113. package/plugins/lavra/cortex/commands/lavra-import.md +198 -0
  114. package/plugins/lavra/cortex/commands/lavra-learn.md +180 -0
  115. package/plugins/lavra/cortex/commands/lavra-parallel.md +910 -0
  116. package/plugins/lavra/cortex/commands/lavra-plan.md +519 -0
  117. package/plugins/lavra/cortex/commands/lavra-qa.md +361 -0
  118. package/plugins/lavra/cortex/commands/lavra-quick.md +182 -0
  119. package/plugins/lavra/cortex/commands/lavra-recall.md +283 -0
  120. package/plugins/lavra/cortex/commands/lavra-research.md +271 -0
  121. package/plugins/lavra/cortex/commands/lavra-retro.md +404 -0
  122. package/plugins/lavra/cortex/commands/lavra-review.md +405 -0
  123. package/plugins/lavra/cortex/commands/lavra-ship.md +334 -0
  124. package/plugins/lavra/cortex/commands/lavra-triage.md +163 -0
  125. package/plugins/lavra/cortex/commands/lavra-work-ralph.md +525 -0
  126. package/plugins/lavra/cortex/commands/lavra-work-teams.md +508 -0
  127. package/plugins/lavra/cortex/commands/lavra-work.md +1023 -0
  128. package/plugins/lavra/cortex/commands/lfg.md +30 -0
  129. package/plugins/lavra/cortex/commands/release-docs.md +148 -0
  130. package/plugins/lavra/cortex/commands/report-bug.md +159 -0
  131. package/plugins/lavra/cortex/commands/reproduce-bug.md +101 -0
  132. package/plugins/lavra/cortex/commands/resolve-pr-parallel.md +58 -0
  133. package/plugins/lavra/cortex/commands/resolve-todo-parallel.md +56 -0
  134. package/plugins/lavra/cortex/commands/test-browser.md +309 -0
  135. package/plugins/lavra/cortex/commands/xcode-test.md +291 -0
  136. package/plugins/lavra/cortex/skills/agent-browser/SKILL.md +227 -0
  137. package/plugins/lavra/cortex/skills/agent-native-architecture/SKILL.md +439 -0
  138. package/plugins/lavra/cortex/skills/andrew-kane-gem-writer/SKILL.md +188 -0
  139. package/plugins/lavra/cortex/skills/brainstorming/SKILL.md +197 -0
  140. package/plugins/lavra/cortex/skills/create-agent-skills/SKILL.md +304 -0
  141. package/plugins/lavra/cortex/skills/dhh-rails-style/SKILL.md +189 -0
  142. package/plugins/lavra/cortex/skills/dspy-ruby/SKILL.md +741 -0
  143. package/plugins/lavra/cortex/skills/every-style-editor/SKILL.md +138 -0
  144. package/plugins/lavra/cortex/skills/file-todos/SKILL.md +256 -0
  145. package/plugins/lavra/cortex/skills/frontend-design/SKILL.md +46 -0
  146. package/plugins/lavra/cortex/skills/gemini-imagegen/SKILL.md +242 -0
  147. package/plugins/lavra/cortex/skills/git-worktree/SKILL.md +307 -0
  148. package/plugins/lavra/cortex/skills/lavra-knowledge/SKILL.md +464 -0
  149. package/plugins/lavra/cortex/skills/project-setup/SKILL.md +418 -0
  150. package/plugins/lavra/cortex/skills/rclone/SKILL.md +155 -0
  151. package/plugins/lavra/docs/quickstart.md +267 -0
  152. package/plugins/lavra/examples/example-plan.md +197 -0
  153. package/plugins/lavra/gemini/agents/design/design-implementation-reviewer.md +130 -0
  154. package/plugins/lavra/gemini/agents/design/design-iterator.md +225 -0
  155. package/plugins/lavra/gemini/agents/design/figma-design-sync.md +218 -0
  156. package/plugins/lavra/gemini/agents/docs/ankane-readme-writer.md +96 -0
  157. package/plugins/lavra/gemini/agents/research/best-practices-researcher.md +138 -0
  158. package/plugins/lavra/gemini/agents/research/framework-docs-researcher.md +118 -0
  159. package/plugins/lavra/gemini/agents/research/git-history-analyzer.md +80 -0
  160. package/plugins/lavra/gemini/agents/research/learnings-researcher.md +262 -0
  161. package/plugins/lavra/gemini/agents/research/repo-research-analyst.md +164 -0
  162. package/plugins/lavra/gemini/agents/review/agent-native-reviewer.md +281 -0
  163. package/plugins/lavra/gemini/agents/review/architecture-strategist.md +89 -0
  164. package/plugins/lavra/gemini/agents/review/code-simplicity-reviewer.md +116 -0
  165. package/plugins/lavra/gemini/agents/review/data-integrity-guardian.md +96 -0
  166. package/plugins/lavra/gemini/agents/review/data-migration-expert.md +125 -0
  167. package/plugins/lavra/gemini/agents/review/deployment-verification-agent.md +185 -0
  168. package/plugins/lavra/gemini/agents/review/dhh-rails-reviewer.md +101 -0
  169. package/plugins/lavra/gemini/agents/review/goal-verifier.md +116 -0
  170. package/plugins/lavra/gemini/agents/review/julik-frontend-races-reviewer.md +246 -0
  171. package/plugins/lavra/gemini/agents/review/kieran-python-reviewer.md +155 -0
  172. package/plugins/lavra/gemini/agents/review/kieran-rails-reviewer.md +137 -0
  173. package/plugins/lavra/gemini/agents/review/kieran-typescript-reviewer.md +146 -0
  174. package/plugins/lavra/gemini/agents/review/migration-drift-detector.md +314 -0
  175. package/plugins/lavra/gemini/agents/review/pattern-recognition-specialist.md +94 -0
  176. package/plugins/lavra/gemini/agents/review/performance-oracle.md +161 -0
  177. package/plugins/lavra/gemini/agents/review/security-sentinel.md +132 -0
  178. package/plugins/lavra/gemini/agents/workflow/bug-reproduction-validator.md +126 -0
  179. package/plugins/lavra/gemini/agents/workflow/every-style-editor.md +103 -0
  180. package/plugins/lavra/gemini/agents/workflow/lint.md +36 -0
  181. package/plugins/lavra/gemini/agents/workflow/pr-comment-resolver.md +101 -0
  182. package/plugins/lavra/gemini/agents/workflow/spec-flow-analyzer.md +163 -0
  183. package/plugins/lavra/gemini/commands/agent-native-audit.toml +284 -0
  184. package/plugins/lavra/gemini/commands/beads-brainstorm.toml +292 -0
  185. package/plugins/lavra/gemini/commands/beads-checkpoint.toml +145 -0
  186. package/plugins/lavra/gemini/commands/beads-compound.toml +167 -0
  187. package/plugins/lavra/gemini/commands/beads-deepen.toml +388 -0
  188. package/plugins/lavra/gemini/commands/beads-design.toml +295 -0
  189. package/plugins/lavra/gemini/commands/beads-import.toml +197 -0
  190. package/plugins/lavra/gemini/commands/beads-parallel.toml +909 -0
  191. package/plugins/lavra/gemini/commands/beads-plan-review.toml +201 -0
  192. package/plugins/lavra/gemini/commands/beads-plan.toml +391 -0
  193. package/plugins/lavra/gemini/commands/beads-quick.toml +134 -0
  194. package/plugins/lavra/gemini/commands/beads-recall.toml +281 -0
  195. package/plugins/lavra/gemini/commands/beads-review.toml +338 -0
  196. package/plugins/lavra/gemini/commands/beads-triage.toml +161 -0
  197. package/plugins/lavra/gemini/commands/beads-work.toml +347 -0
  198. package/plugins/lavra/gemini/commands/changelog.toml +151 -0
  199. package/plugins/lavra/gemini/commands/create-agent-skill.toml +18 -0
  200. package/plugins/lavra/gemini/commands/deploy-docs.toml +68 -0
  201. package/plugins/lavra/gemini/commands/feature-video.toml +264 -0
  202. package/plugins/lavra/gemini/commands/generate-command.toml +148 -0
  203. package/plugins/lavra/gemini/commands/heal-skill.toml +131 -0
  204. package/plugins/lavra/gemini/commands/lavra-brainstorm.toml +391 -0
  205. package/plugins/lavra/gemini/commands/lavra-ceo-review.toml +391 -0
  206. package/plugins/lavra/gemini/commands/lavra-checkpoint.toml +165 -0
  207. package/plugins/lavra/gemini/commands/lavra-design.toml +624 -0
  208. package/plugins/lavra/gemini/commands/lavra-eng-review.toml +265 -0
  209. package/plugins/lavra/gemini/commands/lavra-import.toml +197 -0
  210. package/plugins/lavra/gemini/commands/lavra-learn.toml +179 -0
  211. package/plugins/lavra/gemini/commands/lavra-plan-review.toml +201 -0
  212. package/plugins/lavra/gemini/commands/lavra-plan.toml +518 -0
  213. package/plugins/lavra/gemini/commands/lavra-qa.toml +360 -0
  214. package/plugins/lavra/gemini/commands/lavra-quick.toml +181 -0
  215. package/plugins/lavra/gemini/commands/lavra-recall.toml +281 -0
  216. package/plugins/lavra/gemini/commands/lavra-research.toml +270 -0
  217. package/plugins/lavra/gemini/commands/lavra-retro.toml +403 -0
  218. package/plugins/lavra/gemini/commands/lavra-review.toml +404 -0
  219. package/plugins/lavra/gemini/commands/lavra-ship.toml +333 -0
  220. package/plugins/lavra/gemini/commands/lavra-triage.toml +161 -0
  221. package/plugins/lavra/gemini/commands/lavra-work-ralph.toml +523 -0
  222. package/plugins/lavra/gemini/commands/lavra-work-teams.toml +507 -0
  223. package/plugins/lavra/gemini/commands/lavra-work.toml +1022 -0
  224. package/plugins/lavra/gemini/commands/lfg.toml +28 -0
  225. package/plugins/lavra/gemini/commands/release-docs.toml +146 -0
  226. package/plugins/lavra/gemini/commands/report-bug.toml +157 -0
  227. package/plugins/lavra/gemini/commands/reproduce-bug.toml +99 -0
  228. package/plugins/lavra/gemini/commands/resolve-pr-parallel.toml +56 -0
  229. package/plugins/lavra/gemini/commands/resolve-todo-parallel.toml +54 -0
  230. package/plugins/lavra/gemini/commands/test-browser.toml +307 -0
  231. package/plugins/lavra/gemini/commands/xcode-test.toml +289 -0
  232. package/plugins/lavra/gemini/docs/MCP_SETUP.md +41 -0
  233. package/plugins/lavra/gemini/skills/agent-browser/SKILL.md +227 -0
  234. package/plugins/lavra/gemini/skills/agent-native-architecture/SKILL.md +439 -0
  235. package/plugins/lavra/gemini/skills/andrew-kane-gem-writer/SKILL.md +188 -0
  236. package/plugins/lavra/gemini/skills/beads-knowledge/SKILL.md +464 -0
  237. package/plugins/lavra/gemini/skills/brainstorming/SKILL.md +197 -0
  238. package/plugins/lavra/gemini/skills/create-agent-skills/SKILL.md +304 -0
  239. package/plugins/lavra/gemini/skills/dhh-rails-style/SKILL.md +189 -0
  240. package/plugins/lavra/gemini/skills/dspy-ruby/SKILL.md +741 -0
  241. package/plugins/lavra/gemini/skills/every-style-editor/SKILL.md +138 -0
  242. package/plugins/lavra/gemini/skills/file-todos/SKILL.md +256 -0
  243. package/plugins/lavra/gemini/skills/frontend-design/SKILL.md +46 -0
  244. package/plugins/lavra/gemini/skills/gemini-imagegen/SKILL.md +242 -0
  245. package/plugins/lavra/gemini/skills/git-worktree/SKILL.md +307 -0
  246. package/plugins/lavra/gemini/skills/lavra-knowledge/SKILL.md +464 -0
  247. package/plugins/lavra/gemini/skills/project-setup/SKILL.md +418 -0
  248. package/plugins/lavra/gemini/skills/rclone/SKILL.md +155 -0
  249. package/plugins/lavra/gemini-extension.json +50 -0
  250. package/plugins/lavra/gemini-src/settings.json +37 -0
  251. package/plugins/lavra/hooks/auto-recall.sh +210 -0
  252. package/plugins/lavra/hooks/check-memory.sh +169 -0
  253. package/plugins/lavra/hooks/hooks.json +47 -0
  254. package/plugins/lavra/hooks/knowledge-db.sh +255 -0
  255. package/plugins/lavra/hooks/memory-capture.sh +132 -0
  256. package/plugins/lavra/hooks/provision-memory.sh +144 -0
  257. package/plugins/lavra/hooks/recall.sh +152 -0
  258. package/plugins/lavra/hooks/subagent-wrapup.sh +44 -0
  259. package/plugins/lavra/hooks/teammate-idle-check.sh +29 -0
  260. package/plugins/lavra/opencode/agents/design/design-implementation-reviewer.md +127 -0
  261. package/plugins/lavra/opencode/agents/design/design-iterator.md +222 -0
  262. package/plugins/lavra/opencode/agents/design/figma-design-sync.md +215 -0
  263. package/plugins/lavra/opencode/agents/docs/ankane-readme-writer.md +93 -0
  264. package/plugins/lavra/opencode/agents/research/best-practices-researcher.md +135 -0
  265. package/plugins/lavra/opencode/agents/research/framework-docs-researcher.md +115 -0
  266. package/plugins/lavra/opencode/agents/research/git-history-analyzer.md +77 -0
  267. package/plugins/lavra/opencode/agents/research/learnings-researcher.md +259 -0
  268. package/plugins/lavra/opencode/agents/research/repo-research-analyst.md +161 -0
  269. package/plugins/lavra/opencode/agents/review/agent-native-reviewer.md +278 -0
  270. package/plugins/lavra/opencode/agents/review/architecture-strategist.md +86 -0
  271. package/plugins/lavra/opencode/agents/review/code-simplicity-reviewer.md +113 -0
  272. package/plugins/lavra/opencode/agents/review/data-integrity-guardian.md +93 -0
  273. package/plugins/lavra/opencode/agents/review/data-migration-expert.md +122 -0
  274. package/plugins/lavra/opencode/agents/review/deployment-verification-agent.md +182 -0
  275. package/plugins/lavra/opencode/agents/review/dhh-rails-reviewer.md +98 -0
  276. package/plugins/lavra/opencode/agents/review/goal-verifier.md +113 -0
  277. package/plugins/lavra/opencode/agents/review/julik-frontend-races-reviewer.md +243 -0
  278. package/plugins/lavra/opencode/agents/review/kieran-python-reviewer.md +152 -0
  279. package/plugins/lavra/opencode/agents/review/kieran-rails-reviewer.md +134 -0
  280. package/plugins/lavra/opencode/agents/review/kieran-typescript-reviewer.md +143 -0
  281. package/plugins/lavra/opencode/agents/review/migration-drift-detector.md +311 -0
  282. package/plugins/lavra/opencode/agents/review/pattern-recognition-specialist.md +91 -0
  283. package/plugins/lavra/opencode/agents/review/performance-oracle.md +158 -0
  284. package/plugins/lavra/opencode/agents/review/security-sentinel.md +129 -0
  285. package/plugins/lavra/opencode/agents/workflow/bug-reproduction-validator.md +123 -0
  286. package/plugins/lavra/opencode/agents/workflow/every-style-editor.md +100 -0
  287. package/plugins/lavra/opencode/agents/workflow/lint.md +33 -0
  288. package/plugins/lavra/opencode/agents/workflow/pr-comment-resolver.md +98 -0
  289. package/plugins/lavra/opencode/agents/workflow/spec-flow-analyzer.md +160 -0
  290. package/plugins/lavra/opencode/commands/agent-native-audit.md +286 -0
  291. package/plugins/lavra/opencode/commands/changelog.md +153 -0
  292. package/plugins/lavra/opencode/commands/create-agent-skill.md +21 -0
  293. package/plugins/lavra/opencode/commands/deploy-docs.md +69 -0
  294. package/plugins/lavra/opencode/commands/feature-video.md +266 -0
  295. package/plugins/lavra/opencode/commands/generate-command.md +150 -0
  296. package/plugins/lavra/opencode/commands/heal-skill.md +134 -0
  297. package/plugins/lavra/opencode/commands/lavra-brainstorm.md +392 -0
  298. package/plugins/lavra/opencode/commands/lavra-ceo-review.md +392 -0
  299. package/plugins/lavra/opencode/commands/lavra-checkpoint.md +166 -0
  300. package/plugins/lavra/opencode/commands/lavra-compound.md +168 -0
  301. package/plugins/lavra/opencode/commands/lavra-deepen.md +389 -0
  302. package/plugins/lavra/opencode/commands/lavra-design.md +625 -0
  303. package/plugins/lavra/opencode/commands/lavra-eng-review.md +266 -0
  304. package/plugins/lavra/opencode/commands/lavra-import.md +198 -0
  305. package/plugins/lavra/opencode/commands/lavra-learn.md +180 -0
  306. package/plugins/lavra/opencode/commands/lavra-parallel.md +910 -0
  307. package/plugins/lavra/opencode/commands/lavra-plan.md +519 -0
  308. package/plugins/lavra/opencode/commands/lavra-qa.md +361 -0
  309. package/plugins/lavra/opencode/commands/lavra-quick.md +182 -0
  310. package/plugins/lavra/opencode/commands/lavra-recall.md +283 -0
  311. package/plugins/lavra/opencode/commands/lavra-research.md +271 -0
  312. package/plugins/lavra/opencode/commands/lavra-retro.md +404 -0
  313. package/plugins/lavra/opencode/commands/lavra-review.md +405 -0
  314. package/plugins/lavra/opencode/commands/lavra-ship.md +334 -0
  315. package/plugins/lavra/opencode/commands/lavra-triage.md +163 -0
  316. package/plugins/lavra/opencode/commands/lavra-work-ralph.md +525 -0
  317. package/plugins/lavra/opencode/commands/lavra-work-teams.md +508 -0
  318. package/plugins/lavra/opencode/commands/lavra-work.md +1023 -0
  319. package/plugins/lavra/opencode/commands/lfg.md +30 -0
  320. package/plugins/lavra/opencode/commands/release-docs.md +148 -0
  321. package/plugins/lavra/opencode/commands/report-bug.md +159 -0
  322. package/plugins/lavra/opencode/commands/reproduce-bug.md +101 -0
  323. package/plugins/lavra/opencode/commands/resolve-pr-parallel.md +58 -0
  324. package/plugins/lavra/opencode/commands/resolve-todo-parallel.md +56 -0
  325. package/plugins/lavra/opencode/commands/test-browser.md +309 -0
  326. package/plugins/lavra/opencode/commands/xcode-test.md +291 -0
  327. package/plugins/lavra/opencode/docs/MCP_SETUP.md +48 -0
  328. package/plugins/lavra/opencode/skills/agent-browser/SKILL.md +227 -0
  329. package/plugins/lavra/opencode/skills/agent-native-architecture/SKILL.md +439 -0
  330. package/plugins/lavra/opencode/skills/andrew-kane-gem-writer/SKILL.md +188 -0
  331. package/plugins/lavra/opencode/skills/brainstorming/SKILL.md +197 -0
  332. package/plugins/lavra/opencode/skills/create-agent-skills/SKILL.md +304 -0
  333. package/plugins/lavra/opencode/skills/dhh-rails-style/SKILL.md +189 -0
  334. package/plugins/lavra/opencode/skills/dspy-ruby/SKILL.md +741 -0
  335. package/plugins/lavra/opencode/skills/every-style-editor/SKILL.md +138 -0
  336. package/plugins/lavra/opencode/skills/file-todos/SKILL.md +256 -0
  337. package/plugins/lavra/opencode/skills/frontend-design/SKILL.md +46 -0
  338. package/plugins/lavra/opencode/skills/gemini-imagegen/SKILL.md +242 -0
  339. package/plugins/lavra/opencode/skills/git-worktree/SKILL.md +307 -0
  340. package/plugins/lavra/opencode/skills/lavra-knowledge/SKILL.md +464 -0
  341. package/plugins/lavra/opencode/skills/project-setup/SKILL.md +418 -0
  342. package/plugins/lavra/opencode/skills/rclone/SKILL.md +155 -0
  343. package/plugins/lavra/opencode-src/package.json +13 -0
  344. package/plugins/lavra/opencode-src/plugin.ts +176 -0
  345. package/plugins/lavra/scripts/import-plan.sh +141 -0
  346. package/plugins/lavra/skills/agent-browser/SKILL.md +223 -0
  347. package/plugins/lavra/skills/agent-native-architecture/SKILL.md +435 -0
  348. package/plugins/lavra/skills/agent-native-architecture/references/action-parity-discipline.md +353 -0
  349. package/plugins/lavra/skills/agent-native-architecture/references/agent-execution-patterns.md +362 -0
  350. package/plugins/lavra/skills/agent-native-architecture/references/agent-native-testing.md +508 -0
  351. package/plugins/lavra/skills/agent-native-architecture/references/architecture-patterns.md +478 -0
  352. package/plugins/lavra/skills/agent-native-architecture/references/dynamic-context-injection.md +281 -0
  353. package/plugins/lavra/skills/agent-native-architecture/references/files-universal-interface.md +301 -0
  354. package/plugins/lavra/skills/agent-native-architecture/references/from-primitives-to-domain-tools.md +227 -0
  355. package/plugins/lavra/skills/agent-native-architecture/references/mcp-tool-design.md +427 -0
  356. package/plugins/lavra/skills/agent-native-architecture/references/mobile-patterns.md +410 -0
  357. package/plugins/lavra/skills/agent-native-architecture/references/product-implications.md +341 -0
  358. package/plugins/lavra/skills/agent-native-architecture/references/refactoring-to-prompt-native.md +317 -0
  359. package/plugins/lavra/skills/agent-native-architecture/references/self-modification.md +269 -0
  360. package/plugins/lavra/skills/agent-native-architecture/references/shared-workspace-architecture.md +517 -0
  361. package/plugins/lavra/skills/agent-native-architecture/references/system-prompt-design.md +250 -0
  362. package/plugins/lavra/skills/brainstorming/SKILL.md +193 -0
  363. package/plugins/lavra/skills/create-agent-skills/SKILL.md +300 -0
  364. package/plugins/lavra/skills/create-agent-skills/references/api-security.md +60 -0
  365. package/plugins/lavra/skills/create-agent-skills/references/be-clear-and-direct.md +84 -0
  366. package/plugins/lavra/skills/create-agent-skills/references/best-practices.md +404 -0
  367. package/plugins/lavra/skills/create-agent-skills/references/common-patterns.md +121 -0
  368. package/plugins/lavra/skills/create-agent-skills/references/core-principles.md +103 -0
  369. package/plugins/lavra/skills/create-agent-skills/references/executable-code.md +92 -0
  370. package/plugins/lavra/skills/create-agent-skills/references/iteration-and-testing.md +164 -0
  371. package/plugins/lavra/skills/create-agent-skills/references/official-spec.md +185 -0
  372. package/plugins/lavra/skills/create-agent-skills/references/recommended-structure.md +168 -0
  373. package/plugins/lavra/skills/create-agent-skills/references/skill-structure.md +215 -0
  374. package/plugins/lavra/skills/create-agent-skills/references/using-scripts.md +113 -0
  375. package/plugins/lavra/skills/create-agent-skills/references/using-templates.md +112 -0
  376. package/plugins/lavra/skills/create-agent-skills/references/workflows-and-validation.md +122 -0
  377. package/plugins/lavra/skills/create-agent-skills/templates/router-skill.md +73 -0
  378. package/plugins/lavra/skills/create-agent-skills/templates/simple-skill.md +33 -0
  379. package/plugins/lavra/skills/create-agent-skills/workflows/add-reference.md +55 -0
  380. package/plugins/lavra/skills/create-agent-skills/workflows/add-script.md +59 -0
  381. package/plugins/lavra/skills/create-agent-skills/workflows/add-template.md +51 -0
  382. package/plugins/lavra/skills/create-agent-skills/workflows/add-workflow.md +54 -0
  383. package/plugins/lavra/skills/create-agent-skills/workflows/audit-skill.md +63 -0
  384. package/plugins/lavra/skills/create-agent-skills/workflows/create-domain-expertise-skill.md +68 -0
  385. package/plugins/lavra/skills/create-agent-skills/workflows/create-new-skill.md +92 -0
  386. package/plugins/lavra/skills/create-agent-skills/workflows/get-guidance.md +70 -0
  387. package/plugins/lavra/skills/create-agent-skills/workflows/upgrade-to-router.md +68 -0
  388. package/plugins/lavra/skills/create-agent-skills/workflows/verify-skill.md +63 -0
  389. package/plugins/lavra/skills/file-todos/SKILL.md +252 -0
  390. package/plugins/lavra/skills/file-todos/assets/todo-template.md +155 -0
  391. package/plugins/lavra/skills/git-worktree/SKILL.md +303 -0
  392. package/plugins/lavra/skills/git-worktree/scripts/worktree-manager.sh +345 -0
  393. package/plugins/lavra/skills/lavra-knowledge/SKILL.md +460 -0
  394. package/plugins/lavra/skills/lavra-knowledge/references/jsonl-schema.md +104 -0
  395. package/plugins/lavra/skills/optional/andrew-kane-gem-writer/SKILL.md +184 -0
  396. package/plugins/lavra/skills/optional/andrew-kane-gem-writer/references/database-adapters.md +231 -0
  397. package/plugins/lavra/skills/optional/andrew-kane-gem-writer/references/module-organization.md +121 -0
  398. package/plugins/lavra/skills/optional/andrew-kane-gem-writer/references/rails-integration.md +183 -0
  399. package/plugins/lavra/skills/optional/andrew-kane-gem-writer/references/resources.md +119 -0
  400. package/plugins/lavra/skills/optional/andrew-kane-gem-writer/references/testing-patterns.md +261 -0
  401. package/plugins/lavra/skills/optional/dhh-rails-style/SKILL.md +185 -0
  402. package/plugins/lavra/skills/optional/dhh-rails-style/references/architecture.md +653 -0
  403. package/plugins/lavra/skills/optional/dhh-rails-style/references/controllers.md +303 -0
  404. package/plugins/lavra/skills/optional/dhh-rails-style/references/frontend.md +510 -0
  405. package/plugins/lavra/skills/optional/dhh-rails-style/references/gems.md +266 -0
  406. package/plugins/lavra/skills/optional/dhh-rails-style/references/models.md +359 -0
  407. package/plugins/lavra/skills/optional/dhh-rails-style/references/testing.md +338 -0
  408. package/plugins/lavra/skills/optional/dspy-ruby/SKILL.md +737 -0
  409. package/plugins/lavra/skills/optional/dspy-ruby/assets/config-template.rb +187 -0
  410. package/plugins/lavra/skills/optional/dspy-ruby/assets/module-template.rb +300 -0
  411. package/plugins/lavra/skills/optional/dspy-ruby/assets/signature-template.rb +221 -0
  412. package/plugins/lavra/skills/optional/dspy-ruby/references/core-concepts.md +674 -0
  413. package/plugins/lavra/skills/optional/dspy-ruby/references/observability.md +366 -0
  414. package/plugins/lavra/skills/optional/dspy-ruby/references/optimization.md +603 -0
  415. package/plugins/lavra/skills/optional/dspy-ruby/references/providers.md +418 -0
  416. package/plugins/lavra/skills/optional/dspy-ruby/references/toolsets.md +502 -0
  417. package/plugins/lavra/skills/optional/every-style-editor/SKILL.md +134 -0
  418. package/plugins/lavra/skills/optional/every-style-editor/references/EVERY_WRITE_STYLE.md +529 -0
  419. package/plugins/lavra/skills/optional/frontend-design/SKILL.md +42 -0
  420. package/plugins/lavra/skills/optional/gemini-imagegen/SKILL.md +238 -0
  421. package/plugins/lavra/skills/optional/gemini-imagegen/requirements.txt +2 -0
  422. package/plugins/lavra/skills/optional/gemini-imagegen/scripts/compose_images.py +157 -0
  423. package/plugins/lavra/skills/optional/gemini-imagegen/scripts/edit_image.py +144 -0
  424. package/plugins/lavra/skills/optional/gemini-imagegen/scripts/gemini_images.py +263 -0
  425. package/plugins/lavra/skills/optional/gemini-imagegen/scripts/generate_image.py +133 -0
  426. package/plugins/lavra/skills/optional/gemini-imagegen/scripts/multi_turn_chat.py +216 -0
  427. package/plugins/lavra/skills/optional/rclone/SKILL.md +151 -0
  428. package/plugins/lavra/skills/optional/rclone/scripts/check_setup.sh +60 -0
  429. package/plugins/lavra/skills/project-setup/SKILL.md +414 -0
  430. package/plugins/lavra/tests/build-index.sh +116 -0
  431. package/plugins/lavra/tests/recall-bench.sh +224 -0
  432. package/plugins/lavra/tests/search-fts5.sh +65 -0
  433. package/plugins/lavra/tests/search-grep.sh +54 -0
  434. package/plugins/lavra/tests/test-queries.jsonl +25 -0
  435. package/scripts/apply-context-optimizations.py +345 -0
  436. package/scripts/convert-cortex.ts +257 -0
  437. package/scripts/convert-gemini.ts +369 -0
  438. package/scripts/convert-opencode.ts +313 -0
  439. package/scripts/package.json +27 -0
  440. package/scripts/pre-release-check.sh +176 -0
  441. package/scripts/select-opencode-models.sh +178 -0
  442. package/scripts/shared/model-config.json +17 -0
  443. package/scripts/shared/model-mapping.ts +129 -0
  444. package/scripts/shared/security.ts +97 -0
  445. package/scripts/shared/yaml-parser.ts +55 -0
  446. package/scripts/sqlite-to-jsonl.py +207 -0
  447. package/scripts/test-compatibility.ts +539 -0
  448. package/scripts/test-features.sh +342 -0
  449. package/scripts/test-installation.sh +514 -0
  450. package/scripts/test-security.ts +275 -0
  451. package/scripts/trim-agent-descriptions.py +177 -0
  452. package/uninstall.sh +133 -0
@@ -0,0 +1,695 @@
1
+ #!/usr/bin/env node
2
+
3
+ "use strict";
4
+
5
+ const { execFileSync } = require("child_process");
6
+
7
+ const BEAD_ID_RE = /^[a-zA-Z0-9][a-zA-Z0-9._-]*$/;
8
+
9
+ function validateBeadId(id) {
10
+ if (!BEAD_ID_RE.test(id)) {
11
+ console.error(` Error: invalid bead ID: ${JSON.stringify(id)}`);
12
+ process.exit(1);
13
+ }
14
+ }
15
+ const readline = require("readline");
16
+
17
+ // ---------------------------------------------------------------------------
18
+ // ANSI Colors
19
+ // ---------------------------------------------------------------------------
20
+
21
+ const C = {
22
+ reset: "\x1b[0m",
23
+ bold: "\x1b[1m",
24
+ dim: "\x1b[2m",
25
+ underline: "\x1b[4m",
26
+ // Foreground
27
+ black: "\x1b[30m",
28
+ red: "\x1b[31m",
29
+ green: "\x1b[32m",
30
+ yellow: "\x1b[33m",
31
+ blue: "\x1b[34m",
32
+ magenta: "\x1b[35m",
33
+ cyan: "\x1b[36m",
34
+ white: "\x1b[37m",
35
+ gray: "\x1b[90m",
36
+ // Background
37
+ bgBlack: "\x1b[40m",
38
+ bgBlue: "\x1b[44m",
39
+ bgCyan: "\x1b[46m",
40
+ bgWhite: "\x1b[47m",
41
+ };
42
+
43
+ // ---------------------------------------------------------------------------
44
+ // Status indicators
45
+ // ---------------------------------------------------------------------------
46
+
47
+ const STATUS_ICON = {
48
+ closed: `${C.green}[x]${C.reset}`,
49
+ in_progress: `${C.yellow}[>]${C.reset}`,
50
+ open: `${C.gray}[ ]${C.reset}`,
51
+ blocked: `${C.red}[!]${C.reset}`,
52
+ };
53
+
54
+ function statusIcon(status) {
55
+ return STATUS_ICON[status] || STATUS_ICON.open;
56
+ }
57
+
58
+ // ---------------------------------------------------------------------------
59
+ // Data fetching via bd CLI
60
+ // ---------------------------------------------------------------------------
61
+
62
+ function bdExecFile(args) {
63
+ try {
64
+ return execFileSync("bd", args, {
65
+ encoding: "utf8",
66
+ timeout: 30000,
67
+ stdio: ["pipe", "pipe", "pipe"],
68
+ }).trim();
69
+ } catch (err) {
70
+ return "";
71
+ }
72
+ }
73
+
74
+ function bdShowJson(beadId) {
75
+ const raw = bdExecFile(["show", beadId, "--json"]);
76
+ if (!raw) return null;
77
+ try {
78
+ return JSON.parse(raw);
79
+ } catch {
80
+ return null;
81
+ }
82
+ }
83
+
84
+ function bdListChildren(parentId) {
85
+ const raw = bdExecFile(["list", "--parent", parentId, "--json"]);
86
+ if (!raw) return [];
87
+ try {
88
+ const parsed = JSON.parse(raw);
89
+ return Array.isArray(parsed) ? parsed : [];
90
+ } catch {
91
+ return [];
92
+ }
93
+ }
94
+
95
+ function bdCommentsList(beadId) {
96
+ const raw = bdExecFile(["comments", "list", beadId]);
97
+ if (!raw) return [];
98
+ return raw.split("\n").filter((line) => line.trim());
99
+ }
100
+
101
+ function extractDecisions(comments) {
102
+ return comments.filter((line) => {
103
+ const upper = line.toUpperCase();
104
+ return upper.includes("DECISION:");
105
+ });
106
+ }
107
+
108
+ // ---------------------------------------------------------------------------
109
+ // Tree model
110
+ // ---------------------------------------------------------------------------
111
+
112
+ /**
113
+ * Each tree node:
114
+ * {
115
+ * id: string,
116
+ * title: string,
117
+ * status: string,
118
+ * type: "epic" | "phase" | "task",
119
+ * depth: number,
120
+ * expanded: boolean,
121
+ * children: TreeNode[],
122
+ * data: object, // raw bd show data
123
+ * comments: string[],
124
+ * decisions: string[],
125
+ * }
126
+ */
127
+
128
+ function buildTree(rootId) {
129
+ const rootData = bdShowJson(rootId);
130
+ if (!rootData) {
131
+ die(`Could not find bead: ${rootId}`);
132
+ }
133
+
134
+ const rootComments = bdCommentsList(rootId);
135
+ const root = {
136
+ id: rootId,
137
+ title: rootData.title || rootId,
138
+ status: rootData.status || "open",
139
+ type: "epic",
140
+ depth: 0,
141
+ expanded: true,
142
+ children: [],
143
+ data: rootData,
144
+ comments: rootComments,
145
+ decisions: extractDecisions(rootComments),
146
+ };
147
+
148
+ // Load phases (direct children)
149
+ const phases = bdListChildren(rootId);
150
+ for (const phase of phases) {
151
+ const phaseId = phase.id || phase.bead_id;
152
+ if (!phaseId) continue;
153
+
154
+ const phaseData = bdShowJson(phaseId) || phase;
155
+ const phaseComments = bdCommentsList(phaseId);
156
+ const phaseChildren = bdListChildren(phaseId);
157
+
158
+ const phaseNode = {
159
+ id: phaseId,
160
+ title: phaseData.title || phase.title || phaseId,
161
+ status: phaseData.status || phase.status || "open",
162
+ type: "phase",
163
+ depth: 1,
164
+ expanded: false,
165
+ children: [],
166
+ data: phaseData,
167
+ comments: phaseComments,
168
+ decisions: extractDecisions(phaseComments),
169
+ };
170
+
171
+ // Load tasks (children of phase)
172
+ for (const task of phaseChildren) {
173
+ const taskId = task.id || task.bead_id;
174
+ if (!taskId) continue;
175
+
176
+ const taskData = bdShowJson(taskId) || task;
177
+ const taskComments = bdCommentsList(taskId);
178
+
179
+ phaseNode.children.push({
180
+ id: taskId,
181
+ title: taskData.title || task.title || taskId,
182
+ status: taskData.status || task.status || "open",
183
+ type: "task",
184
+ depth: 2,
185
+ expanded: false,
186
+ children: [],
187
+ data: taskData,
188
+ comments: taskComments,
189
+ decisions: extractDecisions(taskComments),
190
+ });
191
+ }
192
+
193
+ root.children.push(phaseNode);
194
+ }
195
+
196
+ return root;
197
+ }
198
+
199
+ // ---------------------------------------------------------------------------
200
+ // Flatten tree for display (respects expanded state)
201
+ // ---------------------------------------------------------------------------
202
+
203
+ function flattenTree(node) {
204
+ const result = [node];
205
+ if (node.expanded && node.children.length > 0) {
206
+ for (const child of node.children) {
207
+ result.push(...flattenTree(child));
208
+ }
209
+ }
210
+ return result;
211
+ }
212
+
213
+ // ---------------------------------------------------------------------------
214
+ // Terminal helpers
215
+ // ---------------------------------------------------------------------------
216
+
217
+ function getTermSize() {
218
+ return {
219
+ cols: process.stdout.columns || 80,
220
+ rows: process.stdout.rows || 24,
221
+ };
222
+ }
223
+
224
+ function moveCursor(row, col) {
225
+ process.stdout.write(`\x1b[${row};${col}H`);
226
+ }
227
+
228
+ function clearScreen() {
229
+ process.stdout.write("\x1b[2J\x1b[H");
230
+ }
231
+
232
+ function hideCursor() {
233
+ process.stdout.write("\x1b[?25l");
234
+ }
235
+
236
+ function showCursor() {
237
+ process.stdout.write("\x1b[?25h");
238
+ }
239
+
240
+ // Strip ANSI codes for length calculation
241
+ function stripAnsi(str) {
242
+ return str.replace(/\x1b\[[0-9;]*m/g, "");
243
+ }
244
+
245
+ function truncate(str, maxLen) {
246
+ const plain = stripAnsi(str);
247
+ if (plain.length <= maxLen) return str;
248
+ // Truncate the plain text, but we need to handle ANSI codes
249
+ let visible = 0;
250
+ let i = 0;
251
+ while (i < str.length && visible < maxLen - 1) {
252
+ if (str[i] === "\x1b") {
253
+ const end = str.indexOf("m", i);
254
+ if (end !== -1) {
255
+ i = end + 1;
256
+ continue;
257
+ }
258
+ }
259
+ visible++;
260
+ i++;
261
+ }
262
+ return str.slice(0, i) + C.reset + "\u2026";
263
+ }
264
+
265
+ function padRight(str, width) {
266
+ const plain = stripAnsi(str);
267
+ const pad = Math.max(0, width - plain.length);
268
+ return str + " ".repeat(pad);
269
+ }
270
+
271
+ // ---------------------------------------------------------------------------
272
+ // Rendering
273
+ // ---------------------------------------------------------------------------
274
+
275
+ function renderTreeLine(node, isSelected, width) {
276
+ const indent = " ".repeat(node.depth);
277
+ const icon = statusIcon(node.status);
278
+ const expandIndicator =
279
+ node.children.length > 0 ? (node.expanded ? "\u25BC " : "\u25B6 ") : " ";
280
+
281
+ const typeLabel =
282
+ node.type === "epic"
283
+ ? `${C.bold}${C.magenta}Epic:${C.reset} `
284
+ : node.type === "phase"
285
+ ? `${C.cyan}Phase:${C.reset} `
286
+ : "";
287
+
288
+ const childCount =
289
+ node.children.length > 0
290
+ ? ` ${C.dim}(${node.children.length})${C.reset}`
291
+ : "";
292
+
293
+ let line = `${indent}${icon} ${expandIndicator}${typeLabel}${C.bold}${node.id}${C.reset} ${C.dim}\u2014${C.reset} ${node.title}${childCount}`;
294
+
295
+ if (isSelected) {
296
+ line = `${C.bgBlue}${C.white}${padRight(line, width)}${C.reset}`;
297
+ } else {
298
+ line = padRight(line, width);
299
+ }
300
+
301
+ return truncate(line, width);
302
+ }
303
+
304
+ function renderDetailPanel(node, width, height) {
305
+ const lines = [];
306
+ const hr = C.dim + "\u2500".repeat(width - 2) + C.reset;
307
+
308
+ // Header
309
+ lines.push(`${C.bold}${C.cyan}${node.id}${C.reset}`);
310
+ lines.push(`${C.bold}${node.title}${C.reset}`);
311
+ lines.push("");
312
+
313
+ // Status and type
314
+ lines.push(`${C.dim}Type:${C.reset} ${node.type}`);
315
+ lines.push(`${C.dim}Status:${C.reset} ${statusIcon(node.status)} ${node.status}`);
316
+
317
+ // Additional fields from data
318
+ const data = node.data || {};
319
+ if (data.priority) {
320
+ lines.push(`${C.dim}Priority:${C.reset} ${data.priority}`);
321
+ }
322
+ if (data.assignee) {
323
+ lines.push(`${C.dim}Assignee:${C.reset} ${data.assignee}`);
324
+ }
325
+ if (data.labels && data.labels.length > 0) {
326
+ lines.push(
327
+ `${C.dim}Labels:${C.reset} ${data.labels.join(", ")}`
328
+ );
329
+ }
330
+ if (data.parent) {
331
+ lines.push(`${C.dim}Parent:${C.reset} ${data.parent}`);
332
+ }
333
+
334
+ lines.push("");
335
+ lines.push(hr);
336
+
337
+ // Description
338
+ if (data.description || data.body) {
339
+ lines.push(`${C.bold}Description${C.reset}`);
340
+ lines.push("");
341
+ const desc = data.description || data.body || "";
342
+ const descLines = desc.split("\n");
343
+ for (const dl of descLines) {
344
+ // Word-wrap long lines
345
+ const wrapped = wordWrap(dl, width - 2);
346
+ lines.push(...wrapped);
347
+ }
348
+ lines.push("");
349
+ lines.push(hr);
350
+ }
351
+
352
+ // Decisions
353
+ if (node.decisions.length > 0) {
354
+ lines.push(`${C.bold}${C.yellow}Locked Decisions${C.reset}`);
355
+ lines.push("");
356
+ for (const dec of node.decisions) {
357
+ const wrapped = wordWrap(dec, width - 4);
358
+ for (const w of wrapped) {
359
+ lines.push(` ${C.yellow}\u2022${C.reset} ${w}`);
360
+ }
361
+ }
362
+ lines.push("");
363
+ lines.push(hr);
364
+ }
365
+
366
+ // Comments summary
367
+ if (node.comments.length > 0) {
368
+ const nonDecision = node.comments.filter(
369
+ (c) => !c.toUpperCase().includes("DECISION:")
370
+ );
371
+ lines.push(
372
+ `${C.bold}Comments${C.reset} ${C.dim}(${node.comments.length} total, ${node.decisions.length} decisions)${C.reset}`
373
+ );
374
+ lines.push("");
375
+ const showCount = Math.min(nonDecision.length, 10);
376
+ for (let i = 0; i < showCount; i++) {
377
+ const wrapped = wordWrap(nonDecision[i], width - 4);
378
+ for (const w of wrapped) {
379
+ lines.push(` ${C.dim}\u2502${C.reset} ${w}`);
380
+ }
381
+ }
382
+ if (nonDecision.length > showCount) {
383
+ lines.push(
384
+ ` ${C.dim}... and ${nonDecision.length - showCount} more${C.reset}`
385
+ );
386
+ }
387
+ lines.push("");
388
+ lines.push(hr);
389
+ }
390
+
391
+ // Children summary
392
+ if (node.children.length > 0) {
393
+ const closed = node.children.filter((c) => c.status === "closed").length;
394
+ const inProg = node.children.filter(
395
+ (c) => c.status === "in_progress"
396
+ ).length;
397
+ const open = node.children.filter((c) => c.status === "open").length;
398
+ const blocked = node.children.filter((c) => c.status === "blocked").length;
399
+
400
+ lines.push(
401
+ `${C.bold}Children${C.reset} ${C.dim}(${node.children.length} total)${C.reset}`
402
+ );
403
+ lines.push("");
404
+ if (closed > 0) lines.push(` ${C.green}[x]${C.reset} Closed: ${closed}`);
405
+ if (inProg > 0)
406
+ lines.push(` ${C.yellow}[>]${C.reset} In Progress: ${inProg}`);
407
+ if (open > 0) lines.push(` ${C.gray}[ ]${C.reset} Open: ${open}`);
408
+ if (blocked > 0) lines.push(` ${C.red}[!]${C.reset} Blocked: ${blocked}`);
409
+ }
410
+
411
+ // Pad/trim to height
412
+ while (lines.length < height) {
413
+ lines.push("");
414
+ }
415
+
416
+ return lines.slice(0, height);
417
+ }
418
+
419
+ function wordWrap(text, maxWidth) {
420
+ if (!text) return [""];
421
+ const plain = stripAnsi(text);
422
+ if (plain.length <= maxWidth) return [text];
423
+
424
+ const words = text.split(/\s+/);
425
+ const result = [];
426
+ let current = "";
427
+
428
+ for (const word of words) {
429
+ const plainCurrent = stripAnsi(current);
430
+ const plainWord = stripAnsi(word);
431
+
432
+ if (plainCurrent.length + plainWord.length + 1 > maxWidth) {
433
+ if (current) result.push(current);
434
+ current = word;
435
+ } else {
436
+ current = current ? current + " " + word : word;
437
+ }
438
+ }
439
+ if (current) result.push(current);
440
+ return result.length > 0 ? result : [""];
441
+ }
442
+
443
+ // ---------------------------------------------------------------------------
444
+ // Main TUI
445
+ // ---------------------------------------------------------------------------
446
+
447
+ function die(msg) {
448
+ console.error(`\n Error: ${msg}\n`);
449
+ process.exit(1);
450
+ }
451
+
452
+ function usage() {
453
+ console.log("");
454
+ console.log(" bd-plan-view - Browse beads plan trees in the terminal");
455
+ console.log("");
456
+ console.log(" Usage:");
457
+ console.log(" bd-plan-view <bead-id>");
458
+ console.log(" node bin/plan-view.js <bead-id>");
459
+ console.log("");
460
+ console.log(" Controls:");
461
+ console.log(" Up/Down Navigate tree");
462
+ console.log(" Enter/Right Expand node");
463
+ console.log(" Left Collapse node");
464
+ console.log(" q/Esc Quit");
465
+ console.log("");
466
+ }
467
+
468
+ function run(rootBeadId) {
469
+ // Build tree
470
+ process.stdout.write(` Loading plan tree for ${rootBeadId}...`);
471
+ const tree = buildTree(rootBeadId);
472
+ process.stdout.write(" done.\n");
473
+
474
+ let selectedIndex = 0;
475
+ let detailScroll = 0;
476
+ let running = true;
477
+
478
+ // Enter raw mode
479
+ if (!process.stdin.isTTY) {
480
+ die("plan-view requires an interactive terminal (TTY).");
481
+ }
482
+
483
+ readline.emitKeypressEvents(process.stdin);
484
+ process.stdin.setRawMode(true);
485
+ process.stdin.resume();
486
+ hideCursor();
487
+
488
+ // Clean exit handler
489
+ function cleanup() {
490
+ showCursor();
491
+ clearScreen();
492
+ if (process.stdin.isTTY) {
493
+ process.stdin.setRawMode(false);
494
+ }
495
+ process.stdin.pause();
496
+ }
497
+
498
+ process.on("exit", cleanup);
499
+ process.on("SIGINT", () => {
500
+ cleanup();
501
+ process.exit(0);
502
+ });
503
+ process.on("SIGTERM", () => {
504
+ cleanup();
505
+ process.exit(0);
506
+ });
507
+
508
+ function render() {
509
+ const { cols, rows } = getTermSize();
510
+ const leftWidth = Math.floor(cols * 0.4);
511
+ const rightWidth = cols - leftWidth - 1; // 1 for divider
512
+ const contentHeight = Math.max(0, rows - 3); // header + footer
513
+
514
+ const flatNodes = flattenTree(tree);
515
+
516
+ // Clamp selection
517
+ if (selectedIndex >= flatNodes.length) selectedIndex = flatNodes.length - 1;
518
+ if (selectedIndex < 0) selectedIndex = 0;
519
+
520
+ clearScreen();
521
+
522
+ // Header bar
523
+ moveCursor(1, 1);
524
+ const header = `${C.bold}${C.bgBlue}${C.white}${padRight(
525
+ " bd-plan-view",
526
+ cols
527
+ )}${C.reset}`;
528
+ process.stdout.write(header);
529
+
530
+ // Subheader
531
+ moveCursor(2, 1);
532
+ const totalBeads = flatNodes.length;
533
+ const closedBeads = flatNodes.filter((n) => n.status === "closed").length;
534
+ const progress =
535
+ totalBeads > 0 ? Math.round((closedBeads / totalBeads) * 100) : 0;
536
+ const subheader = `${C.dim} ${totalBeads} beads | ${closedBeads} closed (${progress}% done) | ${tree.id}${C.reset}`;
537
+ process.stdout.write(padRight(subheader, cols));
538
+
539
+ // Tree panel (left)
540
+ const scrollStart = Math.max(
541
+ 0,
542
+ Math.min(
543
+ selectedIndex - Math.floor(contentHeight / 2),
544
+ flatNodes.length - contentHeight
545
+ )
546
+ );
547
+
548
+ for (let i = 0; i < contentHeight; i++) {
549
+ const nodeIdx = scrollStart + i;
550
+ const row = i + 3;
551
+ moveCursor(row, 1);
552
+
553
+ if (nodeIdx < flatNodes.length) {
554
+ const node = flatNodes[nodeIdx];
555
+ const isSelected = nodeIdx === selectedIndex;
556
+ process.stdout.write(renderTreeLine(node, isSelected, leftWidth));
557
+ } else {
558
+ process.stdout.write(" ".repeat(leftWidth));
559
+ }
560
+
561
+ // Divider
562
+ process.stdout.write(`${C.dim}\u2502${C.reset}`);
563
+ }
564
+
565
+ // Detail panel (right)
566
+ const selectedNode = flatNodes[selectedIndex];
567
+ if (selectedNode) {
568
+ const detailLines = renderDetailPanel(
569
+ selectedNode,
570
+ rightWidth,
571
+ Math.max(contentHeight * 4, 80) // generous buffer for scrolling long descriptions
572
+ );
573
+
574
+ // Clamp detail scroll
575
+ const maxDetailScroll = Math.max(0, detailLines.length - contentHeight);
576
+ if (detailScroll > maxDetailScroll) detailScroll = maxDetailScroll;
577
+ if (detailScroll < 0) detailScroll = 0;
578
+
579
+ for (let i = 0; i < contentHeight; i++) {
580
+ const row = i + 3;
581
+ moveCursor(row, leftWidth + 2);
582
+ const lineIdx = detailScroll + i;
583
+ if (lineIdx < detailLines.length) {
584
+ process.stdout.write(
585
+ truncate(padRight(detailLines[lineIdx], rightWidth), rightWidth)
586
+ );
587
+ } else {
588
+ process.stdout.write(" ".repeat(rightWidth));
589
+ }
590
+ }
591
+ }
592
+
593
+ // Footer
594
+ moveCursor(rows, 1);
595
+ const footer = `${C.dim} \u2191\u2193 navigate \u2190\u2192/Enter expand/collapse PgUp/PgDn detail scroll q quit${C.reset}`;
596
+ process.stdout.write(padRight(footer, cols));
597
+ }
598
+
599
+ // Key handler
600
+ process.stdin.on("keypress", (str, key) => {
601
+ if (!running) return;
602
+
603
+ const flatNodes = flattenTree(tree);
604
+ const { rows } = getTermSize();
605
+ const contentHeight = rows - 3;
606
+
607
+ if (key.name === "q" || (key.name === "escape")) {
608
+ running = false;
609
+ cleanup();
610
+ process.exit(0);
611
+ }
612
+
613
+ if (key.ctrl && key.name === "c") {
614
+ running = false;
615
+ cleanup();
616
+ process.exit(0);
617
+ }
618
+
619
+ if (key.name === "up") {
620
+ selectedIndex = Math.max(0, selectedIndex - 1);
621
+ detailScroll = 0;
622
+ render();
623
+ }
624
+
625
+ if (key.name === "down") {
626
+ selectedIndex = Math.min(flatNodes.length - 1, selectedIndex + 1);
627
+ detailScroll = 0;
628
+ render();
629
+ }
630
+
631
+ if (key.name === "return" || key.name === "right") {
632
+ const node = flatNodes[selectedIndex];
633
+ if (node && node.children.length > 0) {
634
+ node.expanded = !node.expanded;
635
+ render();
636
+ }
637
+ }
638
+
639
+ if (key.name === "left") {
640
+ const node = flatNodes[selectedIndex];
641
+ if (node && node.expanded && node.children.length > 0) {
642
+ node.expanded = false;
643
+ render();
644
+ } else if (node && node.depth > 0) {
645
+ // Navigate to parent
646
+ for (let i = selectedIndex - 1; i >= 0; i--) {
647
+ if (flatNodes[i].depth < node.depth) {
648
+ selectedIndex = i;
649
+ break;
650
+ }
651
+ }
652
+ render();
653
+ }
654
+ }
655
+
656
+ // Page up/down for detail panel scroll
657
+ if (key.name === "pageup" || (key.shift && key.name === "up")) {
658
+ detailScroll = Math.max(0, detailScroll - contentHeight);
659
+ render();
660
+ }
661
+
662
+ if (key.name === "pagedown" || (key.shift && key.name === "down")) {
663
+ detailScroll += contentHeight;
664
+ render();
665
+ }
666
+ });
667
+
668
+ // Handle terminal resize
669
+ process.stdout.on("resize", () => {
670
+ if (running) render();
671
+ });
672
+
673
+ // Initial render
674
+ render();
675
+ }
676
+
677
+ // ---------------------------------------------------------------------------
678
+ // Entry point
679
+ // ---------------------------------------------------------------------------
680
+
681
+ const args = process.argv.slice(2);
682
+
683
+ if (args.includes("--help") || args.includes("-h")) {
684
+ usage();
685
+ process.exit(0);
686
+ }
687
+
688
+ if (args.length === 0) {
689
+ usage();
690
+ die("Missing required argument: <bead-id>");
691
+ }
692
+
693
+ const beadId = args[0];
694
+ validateBeadId(beadId);
695
+ run(beadId);