@chorus-aidlc/chorus 0.9.1 → 0.9.3

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 (284) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-build-manifest.json +223 -223
  3. package/.next/standalone/.next/app-path-routes-manifest.json +38 -38
  4. package/.next/standalone/.next/build-manifest.json +2 -2
  5. package/.next/standalone/.next/prerender-manifest.json +39 -39
  6. package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page.js +2 -2
  7. package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page_client-reference-manifest.js +1 -1
  8. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page.js +1 -1
  9. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page_client-reference-manifest.js +1 -1
  10. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page.js +1 -1
  11. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page_client-reference-manifest.js +1 -1
  12. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js +2 -2
  13. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js.nft.json +1 -1
  14. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page_client-reference-manifest.js +1 -1
  15. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page.js +1 -1
  16. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page_client-reference-manifest.js +1 -1
  17. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page.js +2 -2
  18. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page_client-reference-manifest.js +1 -1
  19. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/[ideaUuid]/page.js +1 -1
  20. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/[ideaUuid]/page.js.nft.json +1 -1
  21. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/[ideaUuid]/page_client-reference-manifest.js +1 -1
  22. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/page.js +2 -2
  23. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/page.js.nft.json +1 -1
  24. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/page_client-reference-manifest.js +1 -1
  25. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js +2 -2
  26. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page_client-reference-manifest.js +1 -1
  28. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js +1 -1
  29. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js.nft.json +1 -1
  30. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page_client-reference-manifest.js +1 -1
  31. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page.js +2 -2
  32. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page_client-reference-manifest.js +1 -1
  33. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js +1 -1
  34. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js.nft.json +1 -1
  35. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page_client-reference-manifest.js +1 -1
  36. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js +1 -1
  37. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js.nft.json +1 -1
  38. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page_client-reference-manifest.js +1 -1
  39. package/.next/standalone/.next/server/app/(dashboard)/projects/page.js +2 -2
  40. package/.next/standalone/.next/server/app/(dashboard)/projects/page_client-reference-manifest.js +1 -1
  41. package/.next/standalone/.next/server/app/(dashboard)/settings/page.js +2 -2
  42. package/.next/standalone/.next/server/app/(dashboard)/settings/page.js.nft.json +1 -1
  43. package/.next/standalone/.next/server/app/(dashboard)/settings/page_client-reference-manifest.js +1 -1
  44. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  45. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  46. package/.next/standalone/.next/server/app/_not-found.rsc +1 -1
  47. package/.next/standalone/.next/server/app/admin/companies/[uuid]/page_client-reference-manifest.js +1 -1
  48. package/.next/standalone/.next/server/app/admin/companies/new/page_client-reference-manifest.js +1 -1
  49. package/.next/standalone/.next/server/app/admin/companies/new.html +1 -1
  50. package/.next/standalone/.next/server/app/admin/companies/new.rsc +1 -1
  51. package/.next/standalone/.next/server/app/admin/companies/page_client-reference-manifest.js +1 -1
  52. package/.next/standalone/.next/server/app/admin/companies.html +1 -1
  53. package/.next/standalone/.next/server/app/admin/companies.rsc +1 -1
  54. package/.next/standalone/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  55. package/.next/standalone/.next/server/app/admin.html +1 -1
  56. package/.next/standalone/.next/server/app/admin.rsc +1 -1
  57. package/.next/standalone/.next/server/app/api/admin/companies/[uuid]/route_client-reference-manifest.js +1 -1
  58. package/.next/standalone/.next/server/app/api/admin/companies/route_client-reference-manifest.js +1 -1
  59. package/.next/standalone/.next/server/app/api/admin/login/route_client-reference-manifest.js +1 -1
  60. package/.next/standalone/.next/server/app/api/admin/session/route_client-reference-manifest.js +1 -1
  61. package/.next/standalone/.next/server/app/api/agents/[uuid]/route_client-reference-manifest.js +1 -1
  62. package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route.js +1 -1
  63. package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route.js.nft.json +1 -1
  64. package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route_client-reference-manifest.js +1 -1
  65. package/.next/standalone/.next/server/app/api/agents/route_client-reference-manifest.js +1 -1
  66. package/.next/standalone/.next/server/app/api/api-keys/[uuid]/route_client-reference-manifest.js +1 -1
  67. package/.next/standalone/.next/server/app/api/api-keys/route_client-reference-manifest.js +1 -1
  68. package/.next/standalone/.next/server/app/api/auth/callback/route_client-reference-manifest.js +1 -1
  69. package/.next/standalone/.next/server/app/api/auth/check-default/route_client-reference-manifest.js +1 -1
  70. package/.next/standalone/.next/server/app/api/auth/company-oidc/route_client-reference-manifest.js +1 -1
  71. package/.next/standalone/.next/server/app/api/auth/default-login/route_client-reference-manifest.js +1 -1
  72. package/.next/standalone/.next/server/app/api/auth/identify/route_client-reference-manifest.js +1 -1
  73. package/.next/standalone/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  74. package/.next/standalone/.next/server/app/api/auth/me/route_client-reference-manifest.js +1 -1
  75. package/.next/standalone/.next/server/app/api/auth/refresh/route_client-reference-manifest.js +1 -1
  76. package/.next/standalone/.next/server/app/api/auth/session/route_client-reference-manifest.js +1 -1
  77. package/.next/standalone/.next/server/app/api/auth/sync-token/route_client-reference-manifest.js +1 -1
  78. package/.next/standalone/.next/server/app/api/comments/route_client-reference-manifest.js +1 -1
  79. package/.next/standalone/.next/server/app/api/documents/[uuid]/route_client-reference-manifest.js +1 -1
  80. package/.next/standalone/.next/server/app/api/events/notifications/route_client-reference-manifest.js +1 -1
  81. package/.next/standalone/.next/server/app/api/events/route_client-reference-manifest.js +1 -1
  82. package/.next/standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  83. package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route.js +1 -1
  84. package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route.js.nft.json +1 -1
  85. package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route_client-reference-manifest.js +1 -1
  86. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route.js +1 -1
  87. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route.js.nft.json +1 -1
  88. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route_client-reference-manifest.js +1 -1
  89. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route.js +1 -1
  90. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route.js.nft.json +1 -1
  91. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route_client-reference-manifest.js +1 -1
  92. package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route.js +1 -1
  93. package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route.js.nft.json +1 -1
  94. package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route_client-reference-manifest.js +1 -1
  95. package/.next/standalone/.next/server/app/api/ideas/[uuid]/route.js +1 -1
  96. package/.next/standalone/.next/server/app/api/ideas/[uuid]/route.js.nft.json +1 -1
  97. package/.next/standalone/.next/server/app/api/ideas/[uuid]/route_client-reference-manifest.js +1 -1
  98. package/.next/standalone/.next/server/app/api/mcp/route.js +3 -3
  99. package/.next/standalone/.next/server/app/api/mcp/route.js.nft.json +1 -1
  100. package/.next/standalone/.next/server/app/api/mcp/route_client-reference-manifest.js +1 -1
  101. package/.next/standalone/.next/server/app/api/me/assignments/route.js +1 -1
  102. package/.next/standalone/.next/server/app/api/me/assignments/route.js.nft.json +1 -1
  103. package/.next/standalone/.next/server/app/api/me/assignments/route_client-reference-manifest.js +1 -1
  104. package/.next/standalone/.next/server/app/api/mentionables/route_client-reference-manifest.js +1 -1
  105. package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route_client-reference-manifest.js +1 -1
  106. package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route_client-reference-manifest.js +1 -1
  107. package/.next/standalone/.next/server/app/api/notifications/preferences/route_client-reference-manifest.js +1 -1
  108. package/.next/standalone/.next/server/app/api/notifications/read-all/route_client-reference-manifest.js +1 -1
  109. package/.next/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  110. package/.next/standalone/.next/server/app/api/notifications/unread-count/route_client-reference-manifest.js +1 -1
  111. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/dashboard/route_client-reference-manifest.js +1 -1
  112. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/route_client-reference-manifest.js +1 -1
  113. package/.next/standalone/.next/server/app/api/project-groups/route_client-reference-manifest.js +1 -1
  114. package/.next/standalone/.next/server/app/api/projects/[uuid]/activity/route_client-reference-manifest.js +1 -1
  115. package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route.js +1 -1
  116. package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route.js.nft.json +1 -1
  117. package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route_client-reference-manifest.js +1 -1
  118. package/.next/standalone/.next/server/app/api/projects/[uuid]/documents/route_client-reference-manifest.js +1 -1
  119. package/.next/standalone/.next/server/app/api/projects/[uuid]/group/route_client-reference-manifest.js +1 -1
  120. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route.js +1 -1
  121. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route.js.nft.json +1 -1
  122. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route_client-reference-manifest.js +1 -1
  123. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route.js +1 -1
  124. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route.js.nft.json +1 -1
  125. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route_client-reference-manifest.js +1 -1
  126. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route.js +1 -1
  127. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route_client-reference-manifest.js +1 -1
  128. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route.js +1 -1
  129. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route_client-reference-manifest.js +1 -1
  130. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route.js +1 -1
  131. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route_client-reference-manifest.js +1 -1
  132. package/.next/standalone/.next/server/app/api/projects/[uuid]/route_client-reference-manifest.js +1 -1
  133. package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route_client-reference-manifest.js +1 -1
  134. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route.js +1 -1
  135. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route.js.nft.json +1 -1
  136. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route_client-reference-manifest.js +1 -1
  137. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route.js +1 -1
  138. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route.js.nft.json +1 -1
  139. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route_client-reference-manifest.js +1 -1
  140. package/.next/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  141. package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route.js +1 -1
  142. package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route_client-reference-manifest.js +1 -1
  143. package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route.js +1 -1
  144. package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route_client-reference-manifest.js +1 -1
  145. package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route.js +1 -1
  146. package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route_client-reference-manifest.js +1 -1
  147. package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route.js +1 -1
  148. package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route_client-reference-manifest.js +1 -1
  149. package/.next/standalone/.next/server/app/api/proposals/[uuid]/route.js +1 -1
  150. package/.next/standalone/.next/server/app/api/proposals/[uuid]/route_client-reference-manifest.js +1 -1
  151. package/.next/standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  152. package/.next/standalone/.next/server/app/api/sessions/[uuid]/route.js +1 -1
  153. package/.next/standalone/.next/server/app/api/sessions/[uuid]/route.js.nft.json +1 -1
  154. package/.next/standalone/.next/server/app/api/sessions/[uuid]/route_client-reference-manifest.js +1 -1
  155. package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route.js +1 -1
  156. package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route.js.nft.json +1 -1
  157. package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route_client-reference-manifest.js +1 -1
  158. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route.js +1 -1
  159. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route.js.nft.json +1 -1
  160. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route_client-reference-manifest.js +1 -1
  161. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route.js +1 -1
  162. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route.js.nft.json +1 -1
  163. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route_client-reference-manifest.js +1 -1
  164. package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route.js +1 -1
  165. package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route.js.nft.json +1 -1
  166. package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route_client-reference-manifest.js +1 -1
  167. package/.next/standalone/.next/server/app/api/tasks/[uuid]/route.js +1 -1
  168. package/.next/standalone/.next/server/app/api/tasks/[uuid]/route.js.nft.json +1 -1
  169. package/.next/standalone/.next/server/app/api/tasks/[uuid]/route_client-reference-manifest.js +1 -1
  170. package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route.js +1 -1
  171. package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route.js.nft.json +1 -1
  172. package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route_client-reference-manifest.js +1 -1
  173. package/.next/standalone/.next/server/app/index.html +1 -1
  174. package/.next/standalone/.next/server/app/index.rsc +1 -1
  175. package/.next/standalone/.next/server/app/login/admin/page_client-reference-manifest.js +1 -1
  176. package/.next/standalone/.next/server/app/login/admin.html +1 -1
  177. package/.next/standalone/.next/server/app/login/admin.rsc +1 -1
  178. package/.next/standalone/.next/server/app/login/callback/page_client-reference-manifest.js +1 -1
  179. package/.next/standalone/.next/server/app/login/callback.html +1 -1
  180. package/.next/standalone/.next/server/app/login/callback.rsc +1 -1
  181. package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  182. package/.next/standalone/.next/server/app/login/pick-workspace/page_client-reference-manifest.js +1 -1
  183. package/.next/standalone/.next/server/app/login/pick-workspace.html +1 -1
  184. package/.next/standalone/.next/server/app/login/pick-workspace.rsc +1 -1
  185. package/.next/standalone/.next/server/app/login/silent-refresh/page_client-reference-manifest.js +1 -1
  186. package/.next/standalone/.next/server/app/login/silent-refresh.html +1 -1
  187. package/.next/standalone/.next/server/app/login/silent-refresh.rsc +1 -1
  188. package/.next/standalone/.next/server/app/login.html +1 -1
  189. package/.next/standalone/.next/server/app/login.rsc +1 -1
  190. package/.next/standalone/.next/server/app/onboarding/page.js +3 -3
  191. package/.next/standalone/.next/server/app/onboarding/page.js.nft.json +1 -1
  192. package/.next/standalone/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
  193. package/.next/standalone/.next/server/app/onboarding.html +1 -1
  194. package/.next/standalone/.next/server/app/onboarding.rsc +2 -2
  195. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  196. package/.next/standalone/.next/server/app/projects.html +1 -1
  197. package/.next/standalone/.next/server/app/projects.rsc +2 -2
  198. package/.next/standalone/.next/server/app/settings.html +1 -1
  199. package/.next/standalone/.next/server/app/settings.rsc +3 -3
  200. package/.next/standalone/.next/server/app-paths-manifest.json +38 -38
  201. package/.next/standalone/.next/server/chunks/1165.js +1 -1
  202. package/.next/standalone/.next/server/chunks/2990.js +1 -0
  203. package/.next/standalone/.next/server/chunks/4090.js +2 -2
  204. package/.next/standalone/.next/server/chunks/5491.js +1 -0
  205. package/.next/standalone/.next/server/chunks/6207.js +1 -1
  206. package/.next/standalone/.next/server/chunks/{5044.js → 6878.js} +1 -1
  207. package/.next/standalone/.next/server/chunks/7228.js +2 -2
  208. package/.next/standalone/.next/server/chunks/7578.js +2 -2
  209. package/.next/standalone/.next/server/chunks/7621.js +1 -0
  210. package/.next/standalone/.next/server/chunks/8144.js +1 -0
  211. package/.next/standalone/.next/server/chunks/8637.js +1 -1
  212. package/.next/standalone/.next/server/chunks/896.js +1 -0
  213. package/.next/standalone/.next/server/chunks/9508.js +2 -2
  214. package/.next/standalone/.next/server/middleware-manifest.json +5 -5
  215. package/.next/standalone/.next/server/pages/404.html +1 -1
  216. package/.next/standalone/.next/server/pages/500.html +1 -1
  217. package/.next/standalone/.next/server/pages-manifest.json +1 -1
  218. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  219. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  220. package/.next/standalone/.next/static/chunks/19126-12ce8ade288ce1dc.js +1 -0
  221. package/.next/standalone/.next/static/chunks/19898-7e07c69b635e3662.js +1 -0
  222. package/.next/standalone/.next/static/chunks/35486-1978488574385a45.js +1 -0
  223. package/.next/standalone/.next/static/chunks/52206-51a89715ca643e44.js +1 -0
  224. package/.next/standalone/.next/static/chunks/60011-b602fea2afba6992.js +1 -0
  225. package/.next/standalone/.next/static/chunks/{32190-a110356fb68a4333.js → 75444-976ac95fd66e7988.js} +1 -1
  226. package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-dd7eb66bb4ffd252.js +1 -0
  227. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-6d92b9867caf0fe1.js +1 -0
  228. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-f8f17f58cf779d37.js +1 -0
  229. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-83e2e42b27132b41.js +1 -0
  230. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/ideas/[ideaUuid]/{page-405cc5757c9116ed.js → page-55148db4b28ee5f5.js} +1 -1
  231. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/ideas/{page-1591999fb2994672.js → page-556c181809c9e4f6.js} +1 -1
  232. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-656797940b35b23c.js +1 -0
  233. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/{page-31f4ffd9778a39ed.js → page-414b398806324ad1.js} +1 -1
  234. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-af88aeaedc3f4ae5.js +1 -0
  235. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/{page-00ae31e877b4b261.js → page-6524ab00e6cdf59a.js} +1 -1
  236. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/{page-b148c338bed81dce.js → page-7b0bb5f037cd320b.js} +1 -1
  237. package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-db79d84fa8ca8cbf.js +1 -0
  238. package/.next/standalone/.next/static/chunks/app/onboarding/{page-9768ac847f5b2b48.js → page-7a00689ba561c111.js} +1 -1
  239. package/.next/standalone/package.json +1 -1
  240. package/.next/standalone/public/chorus-plugin/.claude-plugin/plugin.json +1 -1
  241. package/.next/standalone/public/chorus-plugin/agents/proposal-reviewer.md +3 -2
  242. package/.next/standalone/public/chorus-plugin/agents/task-reviewer.md +1 -1
  243. package/.next/standalone/public/chorus-plugin/skills/brainstorm/SKILL.md +1 -1
  244. package/.next/standalone/public/chorus-plugin/skills/chorus/SKILL.md +2 -2
  245. package/.next/standalone/public/chorus-plugin/skills/develop/SKILL.md +3 -2
  246. package/.next/standalone/public/chorus-plugin/skills/idea/SKILL.md +1 -1
  247. package/.next/standalone/public/chorus-plugin/skills/openspec-aware/SKILL.md +1 -1
  248. package/.next/standalone/public/chorus-plugin/skills/proposal/SKILL.md +18 -7
  249. package/.next/standalone/public/chorus-plugin/skills/quick-dev/SKILL.md +9 -4
  250. package/.next/standalone/public/chorus-plugin/skills/review/SKILL.md +5 -3
  251. package/.next/standalone/public/chorus-plugin/skills/yolo/SKILL.md +2 -2
  252. package/.next/standalone/public/install-codex.sh +200 -90
  253. package/.next/standalone/public/skill/brainstorm-chorus/SKILL.md +1 -1
  254. package/.next/standalone/public/skill/chorus/SKILL.md +56 -4
  255. package/.next/standalone/public/skill/develop-chorus/SKILL.md +4 -3
  256. package/.next/standalone/public/skill/idea-chorus/SKILL.md +1 -1
  257. package/.next/standalone/public/skill/package.json +21 -5
  258. package/.next/standalone/public/skill/proposal-chorus/SKILL.md +18 -7
  259. package/.next/standalone/public/skill/proposal-reviewer-chorus/SKILL.md +198 -0
  260. package/.next/standalone/public/skill/quick-dev-chorus/SKILL.md +9 -4
  261. package/.next/standalone/public/skill/review-chorus/SKILL.md +17 -5
  262. package/.next/standalone/public/skill/task-reviewer-chorus/SKILL.md +219 -0
  263. package/.next/standalone/public/skill/yolo-chorus/SKILL.md +529 -0
  264. package/.next/standalone/public/test-install-codex.sh +4 -0
  265. package/package.json +1 -1
  266. package/.next/standalone/.next/server/chunks/1002.js +0 -1
  267. package/.next/standalone/.next/server/chunks/3405.js +0 -1
  268. package/.next/standalone/.next/server/chunks/4043.js +0 -1
  269. package/.next/standalone/.next/server/chunks/6592.js +0 -1
  270. package/.next/standalone/.next/server/chunks/6975.js +0 -1
  271. package/.next/standalone/.next/static/chunks/19126-7671ce1fd803fdd4.js +0 -1
  272. package/.next/standalone/.next/static/chunks/44046-5c0f7f8c0914988a.js +0 -1
  273. package/.next/standalone/.next/static/chunks/60011-0fbcb92028fe9655.js +0 -1
  274. package/.next/standalone/.next/static/chunks/6028-fe4175ea5e6241ed.js +0 -1
  275. package/.next/standalone/.next/static/chunks/9562-8433cd5c5abad077.js +0 -1
  276. package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-8409ca03f132910b.js +0 -1
  277. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-7f7a7f654cab4dc3.js +0 -1
  278. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-a99a690b878a03be.js +0 -1
  279. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-95cdcec5e6db551f.js +0 -1
  280. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-2d85f24a980966b7.js +0 -1
  281. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-38579c303156008c.js +0 -1
  282. package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-b153aa34b940a24c.js +0 -1
  283. /package/.next/standalone/.next/static/{yBxnuARbl0brBJS3_STaI → uuDSoqvm-WWenZQ6dXPT7}/_buildManifest.js +0 -0
  284. /package/.next/standalone/.next/static/{yBxnuARbl0brBJS3_STaI → uuDSoqvm-WWenZQ6dXPT7}/_ssgManifest.js +0 -0
@@ -4,7 +4,7 @@ description: Optional divergent-then-convergent dialogue for fuzzy ideas. Invoke
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.9.0"
7
+ version: "0.9.3"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -4,7 +4,7 @@ description: Chorus AI Agent collaboration platform — overview, common tools,
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.9.0"
7
+ version: "0.9.3"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -156,7 +156,7 @@ A **report** is a short idea-completion summary persisted as a `type="report"` D
156
156
  | Tool | Purpose |
157
157
  |------|---------|
158
158
  | `chorus_get_proposals` | List project Proposals (filterable by status: pending, approved, rejected) |
159
- | `chorus_get_proposal` | Get a single Proposal's details, including documentDrafts and taskDrafts |
159
+ | `chorus_get_proposal` | Get a single Proposal, sliced by `section` (default `basic`: metadata + lightweight draft index; `documents`/`tasks`/`full` for the draft bodies) |
160
160
 
161
161
  ### Tasks
162
162
 
@@ -4,7 +4,7 @@ description: Chorus Development workflow — claim tasks, report work, manage se
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.9.0"
7
+ version: "0.9.3"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -125,8 +125,9 @@ Each task and proposal includes a `commentCount` field — use it to decide whic
125
125
 
126
126
  4. **Read the originating proposal** for design intent:
127
127
  ```
128
- chorus_get_proposal({ proposalUuid: "<proposal-uuid>" })
128
+ chorus_get_proposal({ proposalUuid: "<proposal-uuid>", section: "documents" })
129
129
  ```
130
+ (`chorus_get_proposal` defaults to `section: "basic"` — just metadata + a draft index. Pass `section: "documents"` for the design docs, or `section: "full"` for docs + task drafts.)
130
131
 
131
132
  5. **Read project documents** (PRD, tech design, ADR):
132
133
  ```
@@ -4,7 +4,7 @@ description: Chorus Idea workflow — claim ideas, run elaboration rounds, and p
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.9.0"
7
+ version: "0.9.3"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -4,7 +4,7 @@ description: Opt-in OpenSpec-mode authoring for Chorus PM workflows in Claude Co
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.9.0"
7
+ version: "0.9.3"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -4,7 +4,7 @@ description: Chorus Proposal workflow — create proposals with document and tas
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.9.0"
7
+ version: "0.9.3"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -121,6 +121,8 @@ chorus_pm_add_document_draft({
121
121
 
122
122
  Add task drafts one at a time. The response returns the new draft's `draftUuid` — use it directly for `dependsOnDraftUuids` in subsequent drafts.
123
123
 
124
+ **`acceptanceCriteriaItems` is required** — every task draft must include at least one item with a non-blank `description`, or the call is rejected. Use the structured `acceptanceCriteriaItems` array (the legacy `acceptanceCriteria` Markdown string does not satisfy the requirement).
125
+
124
126
  ```
125
127
  # First task -> response includes { draftUuid, draftTitle }
126
128
  chorus_pm_add_task_draft({
@@ -129,7 +131,10 @@ chorus_pm_add_task_draft({
129
131
  description: "Detailed description of what to build...",
130
132
  priority: "high",
131
133
  storyPoints: 3,
132
- acceptanceCriteria: "- [ ] Criteria 1\n- [ ] Criteria 2"
134
+ acceptanceCriteriaItems: [
135
+ { description: "Criteria 1", required: true },
136
+ { description: "Criteria 2", required: true }
137
+ ]
133
138
  })
134
139
 
135
140
  # Second task — depends on first
@@ -139,18 +144,24 @@ chorus_pm_add_task_draft({
139
144
  description: "Unit and integration tests...",
140
145
  priority: "medium",
141
146
  storyPoints: 2,
142
- acceptanceCriteria: "- [ ] Test coverage > 80%",
147
+ acceptanceCriteriaItems: [
148
+ { description: "Test coverage > 80%", required: true }
149
+ ],
143
150
  dependsOnDraftUuids: ["<draftUuid-from-first-task>"]
144
151
  })
145
152
  ```
146
153
 
154
+ > To edit a draft's criteria later via `chorus_pm_update_task_draft`, pass a non-empty `acceptanceCriteriaItems` to replace them; omit the field to leave them unchanged. The field cannot be used to clear criteria.
155
+
147
156
  **Task priority:** `low`, `medium`, `high`
148
157
 
149
158
  ### Step 4: Review and Refine Drafts
150
159
 
151
160
  ```
152
- # Review current state
153
- chorus_get_proposal({ proposalUuid: "<proposal-uuid>" })
161
+ # Review current state. chorus_get_proposal defaults to section:"basic"
162
+ # (metadata + a lightweight draft index, no bodies). Use section:"full" to
163
+ # see every draft's content, or section:"documents"/"tasks" for one kind.
164
+ chorus_get_proposal({ proposalUuid: "<proposal-uuid>", section: "full" })
154
165
 
155
166
  # Update a document draft
156
167
  chorus_pm_update_document_draft({
@@ -210,7 +221,7 @@ After submission, a `chorus:proposal-reviewer` may run and post a VERDICT commen
210
221
 
211
222
  1. **Read feedback:**
212
223
  ```
213
- chorus_get_proposal({ proposalUuid: "<proposal-uuid>" })
224
+ chorus_get_proposal({ proposalUuid: "<proposal-uuid>", section: "full" })
214
225
  chorus_get_comments({ targetType: "proposal", targetUuid: "<proposal-uuid>" })
215
226
  ```
216
227
  Identify BLOCKERs from the reviewer VERDICT or rejection note.
@@ -332,7 +343,7 @@ Potential issues and how to address them.
332
343
 
333
344
  Good tasks are:
334
345
  - **Module-scoped** — One cohesive functional module per task, not a single function or file
335
- - **Testable** — Clear, cohesive acceptance criteria (max 6 items per task; group related checks into one criterion but list key coverage, e.g. "All tests pass: service layer unit tests, API integration tests, edge case handling")
346
+ - **Testable** — Clear, cohesive acceptance criteria are **required** on every task (at least one non-blank item; max 6; group related checks into one criterion but list key coverage, e.g. "All tests pass: service layer unit tests, API integration tests, edge case handling")
336
347
  - **Sized** — 1-8 story points (hours of agent work)
337
348
  - **Ordered** — Use `dependsOnDraftUuids` / `dependsOnTaskUuids` to express execution order
338
349
  - **Descriptive** — Include enough context for a developer agent to start without questions. For tasks with cross-module dependencies, reference the tech design's Module Contracts in the AC
@@ -1,7 +1,12 @@
1
1
  ---
2
2
  name: quick-dev
3
- version: 0.9.0
4
3
  description: Quick Task workflow — skip Idea→Proposal, create tasks directly, execute, and verify.
4
+ license: AGPL-3.0
5
+ metadata:
6
+ author: chorus
7
+ version: "0.9.3"
8
+ category: project-management
9
+ mcp_server: chorus
5
10
  ---
6
11
 
7
12
  # Quick Dev Skill
@@ -63,7 +68,7 @@ This matters because admin agents can call `chorus_admin_verify_task` to close t
63
68
 
64
69
  ### Step 1: Create a Quick Task
65
70
 
66
- **Always include `acceptanceCriteriaItems`** these are the foundation for self-checking in Step 6. Write specific, testable criteria that you can objectively verify after development. Vague AC like "works correctly" defeats the purpose; prefer "returns 200 on GET /api/foo with valid token".
71
+ **`acceptanceCriteriaItems` is required** `chorus_create_tasks` rejects any task without at least one non-blank criterion (and rejects the whole batch if any task is missing them). These are also the foundation for self-checking in Step 6. Write specific, testable criteria that you can objectively verify after development. Vague AC like "works correctly" defeats the purpose; prefer "returns 200 on GET /api/foo with valid token".
67
72
 
68
73
  ```
69
74
  chorus_create_tasks({
@@ -93,7 +98,7 @@ chorus_claim_task({ taskUuid: "<task-uuid>" })
93
98
 
94
99
  ### Step 3: Edit Details (if needed)
95
100
 
96
- Use `chorus_update_task` to refine the task after creation. **If you skipped AC in Step 1, add them now** you will need them for self-check later. Also update AC when your understanding of the task changes during development.
101
+ Use `chorus_update_task` to refine the task after creation. Tasks always have AC (creation requires them), but **update them when your understanding changes during development**. Passing `acceptanceCriteriaItems` **replaces** the task's criteria with the provided non-empty set; omit the field to leave them unchanged (it cannot be used to clear AC).
97
102
 
98
103
  ```
99
104
  chorus_update_task({
@@ -172,7 +177,7 @@ Quick Tasks work with Claude Code Agent Teams just like proposal-based tasks:
172
177
  ## Tips
173
178
 
174
179
  - Keep Quick Tasks small — if you need more than 2-3 tasks, consider using `/proposal`
175
- - **Always write acceptance criteria at creation time** — they are your self-check contract. Specific, testable AC enables autonomous verification and makes the entire workflow self-contained
180
+ - **Acceptance criteria are required at creation time** — `chorus_create_tasks` rejects tasks without them. They are your self-check contract; specific, testable AC enables autonomous verification and makes the entire workflow self-contained
176
181
  - Use `chorus_update_task` to refine tasks (including AC) after creation rather than deleting and recreating
177
182
  - Pass `proposalUuid` to attach follow-up or gap-filling tasks to an existing proposal — this keeps related work grouped in the same project context and DAG
178
183
  - Quick Tasks show up in the same project task list and DAG as proposal-based tasks
@@ -4,7 +4,7 @@ description: Chorus Review workflow — approve/reject proposals, verify tasks,
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.9.0"
7
+ version: "0.9.3"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -110,10 +110,12 @@ Prioritize: **Proposals first** (they unblock PM and Developer work), then task
110
110
  #### A1: Read the Proposal
111
111
 
112
112
  ```
113
- chorus_get_proposal({ proposalUuid: "<proposal-uuid>" })
113
+ chorus_get_proposal({ proposalUuid: "<proposal-uuid>", section: "full" })
114
114
  ```
115
115
 
116
- This returns: title, description, input ideas, **document drafts** (PRD, tech design), **task drafts** (with descriptions and acceptance criteria).
116
+ `chorus_get_proposal` defaults to `section: "basic"` — proposal metadata plus a lightweight index of the drafts (uuid, type/title, contentLength, AC count, dependency edges) with **no** document content or full task descriptions. For a review you need the bodies, so pass `section: "full"` to get everything at once (or `section: "documents"` / `section: "tasks"` to read one kind at a time).
117
+
118
+ The `full` view returns: title, description, input ideas, **document drafts** (PRD, tech design), **task drafts** (with descriptions and acceptance criteria).
117
119
 
118
120
  #### A2: Quality Checklist
119
121
 
@@ -4,7 +4,7 @@ description: Full-auto AI-DLC pipeline — from prompt to done. Automates the en
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.9.0"
7
+ version: "0.9.3"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -224,7 +224,7 @@ In /yolo mode, the agent generates elaboration questions and answers them itself
224
224
  })
225
225
  ```
226
226
 
227
- 3. **Add task drafts incrementally** (use returned `draftUuid` for dependency chaining):
227
+ 3. **Add task drafts incrementally** (use returned `draftUuid` for dependency chaining). `acceptanceCriteriaItems` is **required** on every draft — at least one non-blank criterion, or the call is rejected:
228
228
  ```
229
229
  # First task
230
230
  result1 = chorus_pm_add_task_draft({
@@ -14,8 +14,8 @@
14
14
  # [plugins."chorus@chorus-plugins"] enabled = true into ~/.codex/config.toml,
15
15
  # so Codex auto-enables the plugin on first launch (falls back to one-click
16
16
  # `/plugins → Install` if auto-install does not fire).
17
- # 4. Installs a lazy hook wrapper under ~/.codex/hooks/chorus/ so Chorus hooks
18
- # work even before the plugin cache is materialized.
17
+ # 4. Enables Codex lifecycle hooks. Chorus hook scripts are bundled in the
18
+ # plugin manifest and loaded by Codex after the plugin is installed/enabled.
19
19
 
20
20
  set -euo pipefail
21
21
 
@@ -35,6 +35,158 @@ CONFIG_TOML="$CODEX_HOME/config.toml"
35
35
 
36
36
  is_tty() { [ -t 0 ] && [ -t 1 ]; }
37
37
 
38
+ clean_legacy_chorus_hooks_json() {
39
+ local hooks_json="$1"
40
+ local tmp backup removed
41
+
42
+ tmp="$(mktemp "${TMPDIR:-/tmp}/chorus-hooks.XXXXXX")"
43
+ backup="${hooks_json}.chorus-legacy-bak"
44
+ cp "$hooks_json" "$backup"
45
+
46
+ if command -v node >/dev/null 2>&1; then
47
+ removed="$(node - "$hooks_json" "$tmp" <<'NODE'
48
+ const fs = require("fs");
49
+ const input = process.argv[2];
50
+ const output = process.argv[3];
51
+ let removed = 0;
52
+
53
+ function isLegacyCommand(value) {
54
+ return typeof value === "string" && value.indexOf("hooks/chorus/run-hook.sh") !== -1;
55
+ }
56
+
57
+ function clean(value, parentKey) {
58
+ if (Array.isArray(value)) {
59
+ return value
60
+ .map((item) => clean(item, parentKey))
61
+ .filter((item) => item !== undefined);
62
+ }
63
+
64
+ if (value && typeof value === "object") {
65
+ if (isLegacyCommand(value.command)) {
66
+ removed += 1;
67
+ return undefined;
68
+ }
69
+
70
+ const hadHooksArray = Array.isArray(value.hooks);
71
+ const out = {};
72
+ for (const [key, child] of Object.entries(value)) {
73
+ const cleaned = clean(child, key);
74
+ if (cleaned === undefined) continue;
75
+ if (Array.isArray(cleaned) && cleaned.length === 0 && (key === "hooks" || parentKey === "hooks")) continue;
76
+ out[key] = cleaned;
77
+ }
78
+
79
+ if (hadHooksArray && (!Array.isArray(out.hooks) || out.hooks.length === 0)) {
80
+ return undefined;
81
+ }
82
+ return out;
83
+ }
84
+
85
+ return value;
86
+ }
87
+
88
+ let data = JSON.parse(fs.readFileSync(input, "utf8"));
89
+ data = clean(data, "") || {};
90
+ if (data.hooks && typeof data.hooks === "object" && !Array.isArray(data.hooks)) {
91
+ for (const key of Object.keys(data.hooks)) {
92
+ if (Array.isArray(data.hooks[key]) && data.hooks[key].length === 0) {
93
+ delete data.hooks[key];
94
+ }
95
+ }
96
+ if (Object.keys(data.hooks).length === 0) {
97
+ delete data.hooks;
98
+ }
99
+ }
100
+ fs.writeFileSync(output, JSON.stringify(data, null, 2) + "\n");
101
+ process.stdout.write(String(removed));
102
+ NODE
103
+ )" || {
104
+ rm -f "$tmp"
105
+ warn "Could not parse $hooks_json with node; leaving legacy hooks unchanged."
106
+ warn "Backup created at $backup"
107
+ return 1
108
+ }
109
+ elif command -v python3 >/dev/null 2>&1; then
110
+ removed="$(python3 - "$hooks_json" "$tmp" <<'PY'
111
+ import json
112
+ import sys
113
+
114
+ input_path = sys.argv[1]
115
+ output_path = sys.argv[2]
116
+ removed = 0
117
+
118
+ def is_legacy_command(value):
119
+ return isinstance(value, str) and "hooks/chorus/run-hook.sh" in value
120
+
121
+ def clean(value, parent_key=""):
122
+ global removed
123
+ if isinstance(value, list):
124
+ return [item for item in (clean(child, parent_key) for child in value) if item is not None]
125
+ if isinstance(value, dict):
126
+ if is_legacy_command(value.get("command")):
127
+ removed += 1
128
+ return None
129
+ had_hooks_array = isinstance(value.get("hooks"), list)
130
+ out = {}
131
+ for key, child in value.items():
132
+ cleaned = clean(child, key)
133
+ if cleaned is None:
134
+ continue
135
+ if isinstance(cleaned, list) and not cleaned and (key == "hooks" or parent_key == "hooks"):
136
+ continue
137
+ out[key] = cleaned
138
+ if had_hooks_array and (not isinstance(out.get("hooks"), list) or not out["hooks"]):
139
+ return None
140
+ return out
141
+ return value
142
+
143
+ with open(input_path, "r", encoding="utf-8") as f:
144
+ data = json.load(f)
145
+
146
+ data = clean(data) or {}
147
+ if isinstance(data.get("hooks"), dict):
148
+ for key in list(data["hooks"].keys()):
149
+ if isinstance(data["hooks"][key], list) and not data["hooks"][key]:
150
+ del data["hooks"][key]
151
+ if not data["hooks"]:
152
+ del data["hooks"]
153
+
154
+ with open(output_path, "w", encoding="utf-8") as f:
155
+ json.dump(data, f, indent=2)
156
+ f.write("\n")
157
+
158
+ print(removed, end="")
159
+ PY
160
+ )" || {
161
+ rm -f "$tmp"
162
+ warn "Could not parse $hooks_json with python3; leaving legacy hooks unchanged."
163
+ warn "Backup created at $backup"
164
+ return 1
165
+ }
166
+ else
167
+ rm -f "$tmp"
168
+ warn "Cannot auto-clean $hooks_json because neither node nor python3 is available."
169
+ warn "Backup created at $backup"
170
+ return 1
171
+ fi
172
+
173
+ if [ "${removed:-0}" = "0" ]; then
174
+ rm -f "$tmp"
175
+ warn "No legacy Chorus hook entries were removed from $hooks_json."
176
+ warn "Backup created at $backup"
177
+ return 1
178
+ fi
179
+
180
+ if grep -q '[^[:space:]{}]' "$tmp" 2>/dev/null; then
181
+ mv "$tmp" "$hooks_json"
182
+ ok "Removed $removed legacy Chorus hook entr$( [ "$removed" = "1" ] && printf 'y' || printf 'ies' ) from $hooks_json"
183
+ else
184
+ rm -f "$tmp" "$hooks_json"
185
+ ok "Removed $removed legacy Chorus hook entr$( [ "$removed" = "1" ] && printf 'y' || printf 'ies' ) and deleted now-empty $hooks_json"
186
+ fi
187
+ ok "Backup saved at $backup"
188
+ }
189
+
38
190
  # If piped through `curl | bash`, stdin is the script body. Re-open from /dev/tty
39
191
  # so interactive prompts still work — but only if a real TTY is available AND we
40
192
  # actually need to prompt for input. Both CHORUS_URL and CHORUS_API_KEY being set
@@ -181,104 +333,61 @@ TOML
181
333
 
182
334
  ok "Wrote [mcp_servers.chorus] and [plugins.\"chorus@chorus-plugins\"] → ${CONFIG_TOML}"
183
335
 
184
- # ---------- step 5: install hooks ----------
185
- hdr "5/5 Installing Chorus hooks"
336
+ # ---------- step 5: enable hooks ----------
337
+ hdr "5/5 Enabling Codex lifecycle hooks"
186
338
 
187
- # Install a tiny wrapper that lazily resolves the newest plugin cache at
188
- # hook-run time. This lets us write hooks.json BEFORE `/plugins → Install`
189
- # has materialized the plugin cache first-run UX becomes truly one-shot.
190
- WRAPPER_DIR="$CODEX_HOME/hooks/chorus"
191
- WRAPPER="$WRAPPER_DIR/run-hook.sh"
192
- mkdir -p "$WRAPPER_DIR"
193
- cat > "$WRAPPER" <<'WRAP'
194
- #!/usr/bin/env bash
195
- # Chorus hook wrapper (installed by public/install-codex.sh).
196
- # Resolves the newest installed Chorus plugin version at runtime and execs
197
- # the named hook script from its hooks/ directory. Exits 0 (no-op) if the
198
- # plugin has not been installed yet, so Codex sessions still start cleanly.
199
- set -eu
200
- HOOK_NAME="${1:-}"
201
- if [ -z "$HOOK_NAME" ]; then
202
- echo '{}' ; exit 0
203
- fi
204
- shift
205
- CODEX_HOME_RESOLVED="${CODEX_HOME:-$HOME/.codex}"
206
- PLUGIN_ROOT="$CODEX_HOME_RESOLVED/plugins/cache/chorus-plugins/chorus"
207
- if [ ! -d "$PLUGIN_ROOT" ]; then
208
- echo '{}' ; exit 0
209
- fi
210
- VER="$(ls -1 "$PLUGIN_ROOT" 2>/dev/null | sort -V | tail -1)"
211
- if [ -z "$VER" ]; then
212
- echo '{}' ; exit 0
213
- fi
214
- SCRIPT="$PLUGIN_ROOT/$VER/hooks/$HOOK_NAME"
215
- if [ ! -x "$SCRIPT" ]; then
216
- if [ -f "$SCRIPT" ]; then
217
- chmod +x "$SCRIPT" 2>/dev/null || true
339
+ HOOKS_JSON="$CODEX_HOME/hooks.json"
340
+ if [ -f "$HOOKS_JSON" ] && grep -q "hooks/chorus/run-hook.sh" "$HOOKS_JSON" 2>/dev/null; then
341
+ warn "Found legacy copied Chorus hook entries in $HOOKS_JSON."
342
+ warn "These can duplicate the plugin-bundled Chorus hooks now loaded by Codex."
343
+ warn "Legacy entries:"
344
+ grep -n "hooks/chorus/run-hook.sh" "$HOOKS_JSON" 2>/dev/null | sed 's/^/ /' >&2 || true
345
+
346
+ if [ -r /dev/tty ] && [ -w /dev/tty ]; then
347
+ printf " Clean legacy Chorus entries from %s now? [y/N]: " "$HOOKS_JSON" > /dev/tty
348
+ read -r clean_legacy_hooks_answer < /dev/tty
349
+ case "$clean_legacy_hooks_answer" in
350
+ y|Y|yes|YES|Yes)
351
+ clean_legacy_chorus_hooks_json "$HOOKS_JSON" || true
352
+ ;;
353
+ *)
354
+ warn "Keeping legacy hooks unchanged. Use /hooks to disable them or remove matching entries manually to avoid duplicates."
355
+ ;;
356
+ esac
218
357
  else
219
- echo '{}' ; exit 0
358
+ warn "No interactive TTY available; keeping legacy hooks unchanged."
359
+ warn "Re-run this installer in a terminal to auto-clean them, or remove matching entries manually."
220
360
  fi
221
361
  fi
222
- exec "$SCRIPT" "$@"
223
- WRAP
224
- chmod +x "$WRAPPER"
225
- ok "Installed hook wrapper → $WRAPPER"
226
362
 
227
- HOOKS_JSON="$CODEX_HOME/hooks.json"
228
- if [ -f "$HOOKS_JSON" ] && ! grep -q "hooks/chorus/run-hook.sh\|chorus-plugins/chorus" "$HOOKS_JSON" 2>/dev/null; then
229
- warn "Found a non-Chorus $HOOKS_JSON not overwriting."
230
- warn " Add Chorus hook entries manually (command = $WRAPPER on-session-start.sh | on-post-submit-proposal.sh | on-post-submit-for-verify.sh)."
231
- else
232
- cat > "$HOOKS_JSON" <<HJSON
233
- {
234
- "hooks": {
235
- "SessionStart": [
236
- {
237
- "matcher": "startup|resume|clear",
238
- "hooks": [
239
- { "type": "command", "command": "$WRAPPER on-session-start.sh", "timeout": 20, "statusMessage": "Chorus: checkin" }
240
- ]
241
- }
242
- ],
243
- "PostToolUse": [
244
- {
245
- "matcher": ".*chorus_pm_submit_proposal",
246
- "hooks": [
247
- { "type": "command", "command": "$WRAPPER on-post-submit-proposal.sh", "timeout": 10 }
248
- ]
249
- },
250
- {
251
- "matcher": ".*chorus_submit_for_verify",
252
- "hooks": [
253
- { "type": "command", "command": "$WRAPPER on-post-submit-for-verify.sh", "timeout": 10 }
254
- ]
255
- }
256
- ]
257
- }
258
- }
259
- HJSON
260
- ok "Wrote $HOOKS_JSON (routing through $WRAPPER)"
261
- fi
262
-
263
- # Enable the codex_hooks feature flag in config.toml (idempotent).
363
+ # Keep the current canonical feature key. `codex_hooks` is a deprecated alias;
364
+ # remove any old hook feature setting from [features] before writing `hooks = true`
365
+ # so reruns do not create duplicate TOML keys.
264
366
  if grep -qE "^\[features\]" "$CONFIG_TOML"; then
265
- if ! grep -qE "^codex_hooks\s*=\s*true" "$CONFIG_TOML"; then
266
- tmp="$(mktemp "${TMPDIR:-/tmp}/chorus-features.XXXXXX")"
267
- awk '
268
- /^\[features\][[:space:]]*$/ { print; print "codex_hooks = true"; inserted=1; next }
269
- { print }
270
- ' "$CONFIG_TOML" > "$tmp" && mv "$tmp" "$CONFIG_TOML"
271
- ok "Added codex_hooks = true under existing [features]"
272
- else
273
- ok "codex_hooks feature flag already enabled"
274
- fi
367
+ tmp="$(mktemp "${TMPDIR:-/tmp}/chorus-features.XXXXXX")"
368
+ awk '
369
+ /^\[features\][[:space:]]*$/ {
370
+ in_features = 1
371
+ print
372
+ print "hooks = true"
373
+ next
374
+ }
375
+ /^\[/ {
376
+ in_features = 0
377
+ }
378
+ in_features && /^[[:space:]]*(hooks|codex_hooks)[[:space:]]*=/ {
379
+ next
380
+ }
381
+ { print }
382
+ ' "$CONFIG_TOML" > "$tmp" && mv "$tmp" "$CONFIG_TOML"
383
+ ok "Set [features] hooks = true"
275
384
  else
276
385
  cat >> "$CONFIG_TOML" <<'TFEAT'
277
386
 
278
387
  [features]
279
- codex_hooks = true
388
+ hooks = true
280
389
  TFEAT
281
- ok "Appended [features] codex_hooks = true"
390
+ ok "Appended [features] hooks = true"
282
391
  fi
283
392
 
284
393
  # ---------- epilogue ----------
@@ -296,7 +405,8 @@ so one manual click is the fallback path).
296
405
 
297
406
  Verify anytime:
298
407
  ${BOLD}codex mcp list${RESET} # 'chorus' row, Auth = 'Bearer token'
299
- ${BOLD}codex features list${RESET} # codex_hooks + plugins both true
408
+ ${BOLD}codex features list${RESET} # hooks + plugins both true
409
+ ${BOLD}/hooks${RESET} # review/trust bundled Chorus hooks after launch
300
410
 
301
411
  Then in Codex type ${BOLD}\$chorus${RESET} (or \$develop, \$review, \$proposal, …) to
302
412
  activate a skill. To change your API key later, just re-run this installer.
@@ -4,7 +4,7 @@ description: Optional divergent-then-convergent dialogue for fuzzy ideas. Invoke
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.3.1"
7
+ version: "0.9.3"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---