@chorus-aidlc/chorus 0.6.7 → 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 (469) hide show
  1. package/.next/standalone/.env +2 -1
  2. package/.next/standalone/.next/BUILD_ID +1 -1
  3. package/.next/standalone/.next/app-build-manifest.json +398 -379
  4. package/.next/standalone/.next/app-path-routes-manifest.json +42 -40
  5. package/.next/standalone/.next/build-manifest.json +5 -5
  6. package/.next/standalone/.next/prerender-manifest.json +59 -35
  7. package/.next/standalone/.next/react-loadable-manifest.json +2 -2
  8. package/.next/standalone/.next/routes-manifest.json +6 -0
  9. package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page.js +1 -1
  10. package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page.js.nft.json +1 -1
  11. package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page_client-reference-manifest.js +1 -1
  12. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page.js +2 -2
  13. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page.js.nft.json +1 -1
  14. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page_client-reference-manifest.js +1 -1
  15. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page.js +2 -2
  16. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page.js.nft.json +1 -1
  17. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page_client-reference-manifest.js +1 -1
  18. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js +2 -2
  19. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js.nft.json +1 -1
  20. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page_client-reference-manifest.js +1 -1
  21. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page.js +2 -2
  22. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page.js.nft.json +1 -1
  23. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page_client-reference-manifest.js +1 -1
  24. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page.js +1 -1
  25. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page.js.nft.json +1 -1
  26. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page_client-reference-manifest.js +1 -1
  27. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/[ideaUuid]/page.js +1 -1
  28. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/[ideaUuid]/page.js.nft.json +1 -1
  29. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/[ideaUuid]/page_client-reference-manifest.js +1 -1
  30. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/page.js +1 -1
  31. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/page.js.nft.json +1 -1
  32. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/page_client-reference-manifest.js +1 -1
  33. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js +2 -2
  34. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js.nft.json +1 -1
  35. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page_client-reference-manifest.js +1 -1
  36. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js +2 -2
  37. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js.nft.json +1 -1
  38. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page_client-reference-manifest.js +1 -1
  39. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page.js +2 -2
  40. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page.js.nft.json +1 -1
  41. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page_client-reference-manifest.js +1 -1
  42. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js +1 -1
  43. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js.nft.json +1 -1
  44. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page_client-reference-manifest.js +1 -1
  45. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js +1 -1
  46. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js.nft.json +1 -1
  47. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page_client-reference-manifest.js +1 -1
  48. package/.next/standalone/.next/server/app/(dashboard)/projects/page.js +2 -2
  49. package/.next/standalone/.next/server/app/(dashboard)/projects/page.js.nft.json +1 -1
  50. package/.next/standalone/.next/server/app/(dashboard)/projects/page_client-reference-manifest.js +1 -1
  51. package/.next/standalone/.next/server/app/(dashboard)/settings/page.js +2 -2
  52. package/.next/standalone/.next/server/app/(dashboard)/settings/page.js.nft.json +1 -1
  53. package/.next/standalone/.next/server/app/(dashboard)/settings/page_client-reference-manifest.js +1 -1
  54. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  55. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  56. package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
  57. package/.next/standalone/.next/server/app/admin/companies/[uuid]/page_client-reference-manifest.js +1 -1
  58. package/.next/standalone/.next/server/app/admin/companies/new/page_client-reference-manifest.js +1 -1
  59. package/.next/standalone/.next/server/app/admin/companies/new.html +1 -1
  60. package/.next/standalone/.next/server/app/admin/companies/new.rsc +2 -2
  61. package/.next/standalone/.next/server/app/admin/companies/page_client-reference-manifest.js +1 -1
  62. package/.next/standalone/.next/server/app/admin/companies.html +1 -1
  63. package/.next/standalone/.next/server/app/admin/companies.rsc +2 -2
  64. package/.next/standalone/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  65. package/.next/standalone/.next/server/app/admin.html +1 -1
  66. package/.next/standalone/.next/server/app/admin.rsc +2 -2
  67. package/.next/standalone/.next/server/app/api/admin/companies/[uuid]/route.js +1 -1
  68. package/.next/standalone/.next/server/app/api/admin/companies/[uuid]/route_client-reference-manifest.js +1 -1
  69. package/.next/standalone/.next/server/app/api/admin/companies/route.js +1 -1
  70. package/.next/standalone/.next/server/app/api/admin/companies/route_client-reference-manifest.js +1 -1
  71. package/.next/standalone/.next/server/app/api/admin/login/route_client-reference-manifest.js +1 -1
  72. package/.next/standalone/.next/server/app/api/admin/session/route_client-reference-manifest.js +1 -1
  73. package/.next/standalone/.next/server/app/api/agents/[uuid]/route.js +1 -1
  74. package/.next/standalone/.next/server/app/api/agents/[uuid]/route_client-reference-manifest.js +1 -1
  75. package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route_client-reference-manifest.js +1 -1
  76. package/.next/standalone/.next/server/app/api/agents/route.js +1 -1
  77. package/.next/standalone/.next/server/app/api/agents/route_client-reference-manifest.js +1 -1
  78. package/.next/standalone/.next/server/app/api/api-keys/[uuid]/route_client-reference-manifest.js +1 -1
  79. package/.next/standalone/.next/server/app/api/api-keys/route_client-reference-manifest.js +1 -1
  80. package/.next/standalone/.next/server/app/api/auth/callback/route_client-reference-manifest.js +1 -1
  81. package/.next/standalone/.next/server/app/api/auth/check-default/route_client-reference-manifest.js +1 -1
  82. package/.next/standalone/.next/server/app/api/auth/company-oidc/route.js +1 -0
  83. package/.next/standalone/.next/server/app/api/auth/company-oidc/route.js.nft.json +1 -0
  84. package/.next/standalone/.next/server/app/api/auth/company-oidc/route_client-reference-manifest.js +1 -0
  85. package/.next/standalone/.next/server/app/api/auth/default-login/route_client-reference-manifest.js +1 -1
  86. package/.next/standalone/.next/server/app/api/auth/identify/route.js +1 -1
  87. package/.next/standalone/.next/server/app/api/auth/identify/route_client-reference-manifest.js +1 -1
  88. package/.next/standalone/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  89. package/.next/standalone/.next/server/app/api/auth/me/route_client-reference-manifest.js +1 -1
  90. package/.next/standalone/.next/server/app/api/auth/refresh/route_client-reference-manifest.js +1 -1
  91. package/.next/standalone/.next/server/app/api/auth/session/route_client-reference-manifest.js +1 -1
  92. package/.next/standalone/.next/server/app/api/auth/sync-token/route_client-reference-manifest.js +1 -1
  93. package/.next/standalone/.next/server/app/api/comments/route_client-reference-manifest.js +1 -1
  94. package/.next/standalone/.next/server/app/api/documents/[uuid]/route.js +1 -1
  95. package/.next/standalone/.next/server/app/api/documents/[uuid]/route_client-reference-manifest.js +1 -1
  96. package/.next/standalone/.next/server/app/api/events/notifications/route_client-reference-manifest.js +1 -1
  97. package/.next/standalone/.next/server/app/api/events/route_client-reference-manifest.js +1 -1
  98. package/.next/standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  99. package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route.js +1 -1
  100. package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route_client-reference-manifest.js +1 -1
  101. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route.js +1 -1
  102. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route_client-reference-manifest.js +1 -1
  103. package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route.js +1 -1
  104. package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route_client-reference-manifest.js +1 -1
  105. package/.next/standalone/.next/server/app/api/ideas/[uuid]/route.js +1 -1
  106. package/.next/standalone/.next/server/app/api/ideas/[uuid]/route_client-reference-manifest.js +1 -1
  107. package/.next/standalone/.next/server/app/api/mcp/route.js +6 -6
  108. package/.next/standalone/.next/server/app/api/mcp/route_client-reference-manifest.js +1 -1
  109. package/.next/standalone/.next/server/app/api/me/assignments/route_client-reference-manifest.js +1 -1
  110. package/.next/standalone/.next/server/app/api/mentionables/route_client-reference-manifest.js +1 -1
  111. package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route_client-reference-manifest.js +1 -1
  112. package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route_client-reference-manifest.js +1 -1
  113. package/.next/standalone/.next/server/app/api/notifications/preferences/route_client-reference-manifest.js +1 -1
  114. package/.next/standalone/.next/server/app/api/notifications/read-all/route_client-reference-manifest.js +1 -1
  115. package/.next/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  116. package/.next/standalone/.next/server/app/api/notifications/unread-count/route_client-reference-manifest.js +1 -1
  117. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/dashboard/route.js +1 -1
  118. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/dashboard/route_client-reference-manifest.js +1 -1
  119. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/route.js +1 -1
  120. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/route_client-reference-manifest.js +1 -1
  121. package/.next/standalone/.next/server/app/api/project-groups/route.js +1 -1
  122. package/.next/standalone/.next/server/app/api/project-groups/route_client-reference-manifest.js +1 -1
  123. package/.next/standalone/.next/server/app/api/projects/[uuid]/activity/route.js +1 -1
  124. package/.next/standalone/.next/server/app/api/projects/[uuid]/activity/route_client-reference-manifest.js +1 -1
  125. package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route.js +1 -1
  126. package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route_client-reference-manifest.js +1 -1
  127. package/.next/standalone/.next/server/app/api/projects/[uuid]/documents/route.js +1 -1
  128. package/.next/standalone/.next/server/app/api/projects/[uuid]/documents/route_client-reference-manifest.js +1 -1
  129. package/.next/standalone/.next/server/app/api/projects/[uuid]/group/route.js +1 -1
  130. package/.next/standalone/.next/server/app/api/projects/[uuid]/group/route_client-reference-manifest.js +1 -1
  131. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route.js +1 -1
  132. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route_client-reference-manifest.js +1 -1
  133. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route.js +1 -1
  134. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route_client-reference-manifest.js +1 -1
  135. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route.js +1 -1
  136. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route_client-reference-manifest.js +1 -1
  137. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route.js +1 -1
  138. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route_client-reference-manifest.js +1 -1
  139. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route.js +1 -1
  140. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route_client-reference-manifest.js +1 -1
  141. package/.next/standalone/.next/server/app/api/projects/[uuid]/route.js +1 -1
  142. package/.next/standalone/.next/server/app/api/projects/[uuid]/route_client-reference-manifest.js +1 -1
  143. package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route.js +1 -1
  144. package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route_client-reference-manifest.js +1 -1
  145. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route.js +1 -1
  146. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route_client-reference-manifest.js +1 -1
  147. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route.js +1 -1
  148. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route_client-reference-manifest.js +1 -1
  149. package/.next/standalone/.next/server/app/api/projects/route.js +1 -1
  150. package/.next/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  151. package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route.js +1 -1
  152. package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route_client-reference-manifest.js +1 -1
  153. package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route.js +1 -1
  154. package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route_client-reference-manifest.js +1 -1
  155. package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route.js +1 -1
  156. package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route_client-reference-manifest.js +1 -1
  157. package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route.js +1 -1
  158. package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route_client-reference-manifest.js +1 -1
  159. package/.next/standalone/.next/server/app/api/proposals/[uuid]/route.js +1 -1
  160. package/.next/standalone/.next/server/app/api/proposals/[uuid]/route_client-reference-manifest.js +1 -1
  161. package/.next/standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  162. package/.next/standalone/.next/server/app/api/sessions/[uuid]/route_client-reference-manifest.js +1 -1
  163. package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route.js +1 -1
  164. package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route_client-reference-manifest.js +1 -1
  165. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route.js +1 -1
  166. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route_client-reference-manifest.js +1 -1
  167. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route.js +1 -1
  168. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route_client-reference-manifest.js +1 -1
  169. package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route.js +1 -1
  170. package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route_client-reference-manifest.js +1 -1
  171. package/.next/standalone/.next/server/app/api/tasks/[uuid]/route.js +1 -1
  172. package/.next/standalone/.next/server/app/api/tasks/[uuid]/route_client-reference-manifest.js +1 -1
  173. package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route.js +1 -1
  174. package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route_client-reference-manifest.js +1 -1
  175. package/.next/standalone/.next/server/app/index.html +1 -1
  176. package/.next/standalone/.next/server/app/index.rsc +2 -2
  177. package/.next/standalone/.next/server/app/login/admin/page_client-reference-manifest.js +1 -1
  178. package/.next/standalone/.next/server/app/login/admin.html +1 -1
  179. package/.next/standalone/.next/server/app/login/admin.rsc +2 -2
  180. package/.next/standalone/.next/server/app/login/callback/page_client-reference-manifest.js +1 -1
  181. package/.next/standalone/.next/server/app/login/callback.html +1 -1
  182. package/.next/standalone/.next/server/app/login/callback.rsc +3 -3
  183. package/.next/standalone/.next/server/app/login/page.js +1 -1
  184. package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  185. package/.next/standalone/.next/server/app/login/pick-workspace/page.js +2 -0
  186. package/.next/standalone/.next/server/app/login/pick-workspace/page.js.nft.json +1 -0
  187. package/.next/standalone/.next/server/app/login/pick-workspace/page_client-reference-manifest.js +1 -0
  188. package/.next/standalone/.next/server/app/login/pick-workspace.html +1 -0
  189. package/.next/standalone/.next/server/app/login/pick-workspace.meta +7 -0
  190. package/.next/standalone/.next/server/app/login/pick-workspace.rsc +24 -0
  191. package/.next/standalone/.next/server/app/login/silent-refresh/page_client-reference-manifest.js +1 -1
  192. package/.next/standalone/.next/server/app/login/silent-refresh.html +1 -1
  193. package/.next/standalone/.next/server/app/login/silent-refresh.rsc +2 -2
  194. package/.next/standalone/.next/server/app/login.html +1 -1
  195. package/.next/standalone/.next/server/app/login.rsc +3 -3
  196. package/.next/standalone/.next/server/app/onboarding/page.js +5 -4
  197. package/.next/standalone/.next/server/app/onboarding/page.js.nft.json +1 -1
  198. package/.next/standalone/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
  199. package/.next/standalone/.next/server/app/onboarding.html +1 -1
  200. package/.next/standalone/.next/server/app/onboarding.rsc +3 -3
  201. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  202. package/.next/standalone/.next/server/app/projects.html +1 -1
  203. package/.next/standalone/.next/server/app/projects.rsc +4 -4
  204. package/.next/standalone/.next/server/app/settings.html +1 -1
  205. package/.next/standalone/.next/server/app/settings.rsc +4 -4
  206. package/.next/standalone/.next/server/app-paths-manifest.json +42 -40
  207. package/.next/standalone/.next/server/chunks/1596.js +1 -1
  208. package/.next/standalone/.next/server/chunks/1639.js +1 -0
  209. package/.next/standalone/.next/server/chunks/1871.js +1 -0
  210. package/.next/standalone/.next/server/chunks/2570.js +1 -1
  211. package/.next/standalone/.next/server/chunks/2618.js +1 -1
  212. package/.next/standalone/.next/server/chunks/2961.js +1 -1
  213. package/.next/standalone/.next/server/chunks/{3408.js → 3300.js} +1 -1
  214. package/.next/standalone/.next/server/chunks/3611.js +158 -0
  215. package/.next/standalone/.next/server/chunks/3890.js +1 -1
  216. package/.next/standalone/.next/server/chunks/5300.js +1 -1
  217. package/.next/standalone/.next/server/chunks/5869.js +16 -0
  218. package/.next/standalone/.next/server/chunks/6113.js +1 -1
  219. package/.next/standalone/.next/server/chunks/6207.js +1 -1
  220. package/.next/standalone/.next/server/chunks/6753.js +3 -3
  221. package/.next/standalone/.next/server/chunks/7368.js +1 -1
  222. package/.next/standalone/.next/server/chunks/8251.js +1 -0
  223. package/.next/standalone/.next/server/chunks/8584.js +1 -0
  224. package/.next/standalone/.next/server/chunks/9051.js +1 -0
  225. package/.next/standalone/.next/server/chunks/920.js +1 -1
  226. package/.next/standalone/.next/server/chunks/937.js +1 -1
  227. package/.next/standalone/.next/server/chunks/9508.js +2 -2
  228. package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
  229. package/.next/standalone/.next/server/middleware-manifest.json +5 -5
  230. package/.next/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  231. package/.next/standalone/.next/server/pages/404.html +1 -1
  232. package/.next/standalone/.next/server/pages/500.html +1 -1
  233. package/.next/standalone/.next/server/pages-manifest.json +1 -1
  234. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  235. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  236. package/.next/standalone/.next/static/CQcM9hNpa5m8P_K5qveuk/_buildManifest.js +1 -0
  237. package/.next/standalone/.next/static/chunks/10739-5c185aa0432f5d56.js +1 -0
  238. package/.next/standalone/.next/static/chunks/{14945-45ab8dcd7d1460b0.js → 14945-0bc0086add441ba7.js} +1 -1
  239. package/.next/standalone/.next/static/chunks/19126-858a24cab6fd338a.js +1 -0
  240. package/.next/standalone/.next/static/chunks/21932-bce5ba937d1603e1.js +1 -0
  241. package/.next/standalone/.next/static/chunks/29445-04c4ab36da85b7da.js +1 -0
  242. package/.next/standalone/.next/static/chunks/34775-387b9a9967a35ccb.js +1 -0
  243. package/.next/standalone/.next/static/chunks/39611-cc227784ed679a6d.js +1 -0
  244. package/.next/standalone/.next/static/chunks/4457-b86052b2e954e357.js +1 -0
  245. package/.next/standalone/.next/static/chunks/4842-95cf4b7efd540e89.js +1 -0
  246. package/.next/standalone/.next/static/chunks/4860.d626399834b496e5.js +1 -0
  247. package/.next/standalone/.next/static/chunks/53298-82b9c818cd70686d.js +1 -0
  248. package/.next/standalone/.next/static/chunks/{72156-693a7612a0a1927c.js → 53664-a2be2eaacce03f0f.js} +1 -1
  249. package/.next/standalone/.next/static/chunks/55434-622522b242e7747f.js +1 -0
  250. package/.next/standalone/.next/static/chunks/95750-3d0d1d48995d1088.js +1 -0
  251. package/.next/standalone/.next/static/chunks/96919-8cbf6310c703e7af.js +1 -0
  252. package/.next/standalone/.next/static/chunks/{52162.90c7520be06645a7.js → 96924.93f7dab7363f09ac.js} +1 -1
  253. package/.next/standalone/.next/static/chunks/{99373.5b5e7a2cd5147b83.js → 99373.aedaca88297c6d8b.js} +1 -1
  254. package/.next/standalone/.next/static/chunks/99513-24849ff68a8098e1.js +1 -0
  255. package/.next/standalone/.next/static/chunks/app/(dashboard)/{layout-45973b20578f2dd7.js → layout-acddb9c84f5d1607.js} +1 -1
  256. package/.next/standalone/.next/static/chunks/app/(dashboard)/project-groups/[uuid]/page-63a6a5b6cf9ecf87.js +1 -0
  257. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page-e81d22f021f61318.js +1 -0
  258. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-b4c6141dd26cc506.js +1 -0
  259. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-4bf7bff8d68509f9.js +1 -0
  260. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-37a0cea0ba40c31b.js +1 -0
  261. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/ideas/[ideaUuid]/page-2d820769aa7bcaf6.js +1 -0
  262. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/ideas/page-dec0e71221d77928.js +1 -0
  263. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-355321010dd82e56.js +1 -0
  264. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/{page-59f6f1967c3dfcad.js → page-bc66567cb9c40bf0.js} +1 -1
  265. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/{page-a4995a788651e9bc.js → page-86cfeb421fa97830.js} +1 -1
  266. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page-7fe70579023330da.js +1 -0
  267. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/page-8c51993bb3866a55.js +1 -0
  268. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/{page-7c30b3f9f2b8f520.js → page-80566dcc1cd42bee.js} +1 -1
  269. package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-8db25385236a9bbf.js +1 -0
  270. package/.next/standalone/.next/static/chunks/app/api/admin/companies/[uuid]/route-e81d22f021f61318.js +1 -0
  271. package/.next/standalone/.next/static/chunks/app/api/admin/companies/route-e81d22f021f61318.js +1 -0
  272. package/.next/standalone/.next/static/chunks/app/api/admin/login/route-e81d22f021f61318.js +1 -0
  273. package/.next/standalone/.next/static/chunks/app/api/admin/session/route-e81d22f021f61318.js +1 -0
  274. package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/route-e81d22f021f61318.js +1 -0
  275. package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/sessions/route-e81d22f021f61318.js +1 -0
  276. package/.next/standalone/.next/static/chunks/app/api/agents/route-e81d22f021f61318.js +1 -0
  277. package/.next/standalone/.next/static/chunks/app/api/api-keys/[uuid]/route-e81d22f021f61318.js +1 -0
  278. package/.next/standalone/.next/static/chunks/app/api/api-keys/route-e81d22f021f61318.js +1 -0
  279. package/.next/standalone/.next/static/chunks/app/api/auth/callback/route-e81d22f021f61318.js +1 -0
  280. package/.next/standalone/.next/static/chunks/app/api/auth/check-default/route-e81d22f021f61318.js +1 -0
  281. package/.next/standalone/.next/static/chunks/app/api/auth/company-oidc/route-e81d22f021f61318.js +1 -0
  282. package/.next/standalone/.next/static/chunks/app/api/auth/default-login/route-e81d22f021f61318.js +1 -0
  283. package/.next/standalone/.next/static/chunks/app/api/auth/identify/route-e81d22f021f61318.js +1 -0
  284. package/.next/standalone/.next/static/chunks/app/api/auth/logout/route-e81d22f021f61318.js +1 -0
  285. package/.next/standalone/.next/static/chunks/app/api/auth/me/route-e81d22f021f61318.js +1 -0
  286. package/.next/standalone/.next/static/chunks/app/api/auth/refresh/route-e81d22f021f61318.js +1 -0
  287. package/.next/standalone/.next/static/chunks/app/api/auth/session/route-e81d22f021f61318.js +1 -0
  288. package/.next/standalone/.next/static/chunks/app/api/auth/sync-token/route-e81d22f021f61318.js +1 -0
  289. package/.next/standalone/.next/static/chunks/app/api/comments/route-e81d22f021f61318.js +1 -0
  290. package/.next/standalone/.next/static/chunks/app/api/documents/[uuid]/route-e81d22f021f61318.js +1 -0
  291. package/.next/standalone/.next/static/chunks/app/api/events/notifications/route-e81d22f021f61318.js +1 -0
  292. package/.next/standalone/.next/static/chunks/app/api/events/route-e81d22f021f61318.js +1 -0
  293. package/.next/standalone/.next/static/chunks/app/api/health/route-e81d22f021f61318.js +1 -0
  294. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/claim/route-e81d22f021f61318.js +1 -0
  295. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/move/route-e81d22f021f61318.js +1 -0
  296. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/release/route-e81d22f021f61318.js +1 -0
  297. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/route-e81d22f021f61318.js +1 -0
  298. package/.next/standalone/.next/static/chunks/app/api/mcp/route-e81d22f021f61318.js +1 -0
  299. package/.next/standalone/.next/static/chunks/app/api/me/assignments/route-e81d22f021f61318.js +1 -0
  300. package/.next/standalone/.next/static/chunks/app/api/mentionables/route-e81d22f021f61318.js +1 -0
  301. package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/archive/route-e81d22f021f61318.js +1 -0
  302. package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/read/route-e81d22f021f61318.js +1 -0
  303. package/.next/standalone/.next/static/chunks/app/api/notifications/preferences/route-e81d22f021f61318.js +1 -0
  304. package/.next/standalone/.next/static/chunks/app/api/notifications/read-all/route-e81d22f021f61318.js +1 -0
  305. package/.next/standalone/.next/static/chunks/app/api/notifications/route-e81d22f021f61318.js +1 -0
  306. package/.next/standalone/.next/static/chunks/app/api/notifications/unread-count/route-e81d22f021f61318.js +1 -0
  307. package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/dashboard/route-e81d22f021f61318.js +1 -0
  308. package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/route-e81d22f021f61318.js +1 -0
  309. package/.next/standalone/.next/static/chunks/app/api/project-groups/route-e81d22f021f61318.js +1 -0
  310. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/activity/route-e81d22f021f61318.js +1 -0
  311. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/available/route-e81d22f021f61318.js +1 -0
  312. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/documents/route-e81d22f021f61318.js +1 -0
  313. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/group/route-e81d22f021f61318.js +1 -0
  314. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/route-e81d22f021f61318.js +1 -0
  315. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/tracker/route-e81d22f021f61318.js +1 -0
  316. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route-e81d22f021f61318.js +1 -0
  317. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/route-e81d22f021f61318.js +1 -0
  318. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/summary/route-e81d22f021f61318.js +1 -0
  319. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/route-e81d22f021f61318.js +1 -0
  320. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/stats/route-e81d22f021f61318.js +1 -0
  321. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/dependencies/route-e81d22f021f61318.js +1 -0
  322. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/route-e81d22f021f61318.js +1 -0
  323. package/.next/standalone/.next/static/chunks/app/api/projects/route-e81d22f021f61318.js +1 -0
  324. package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/approve/route-e81d22f021f61318.js +1 -0
  325. package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/close/route-e81d22f021f61318.js +1 -0
  326. package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/reject/route-e81d22f021f61318.js +1 -0
  327. package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/revoke/route-e81d22f021f61318.js +1 -0
  328. package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/route-e81d22f021f61318.js +1 -0
  329. package/.next/standalone/.next/static/chunks/app/api/search/route-e81d22f021f61318.js +1 -0
  330. package/.next/standalone/.next/static/chunks/app/api/sessions/[uuid]/route-e81d22f021f61318.js +1 -0
  331. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/claim/route-e81d22f021f61318.js +1 -0
  332. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route-e81d22f021f61318.js +1 -0
  333. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/route-e81d22f021f61318.js +1 -0
  334. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/release/route-e81d22f021f61318.js +1 -0
  335. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/route-e81d22f021f61318.js +1 -0
  336. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/sessions/route-e81d22f021f61318.js +1 -0
  337. package/.next/standalone/.next/static/chunks/app/login/callback/{page-e756563d2407e942.js → page-48a34c31a0f8e58c.js} +1 -1
  338. package/.next/standalone/.next/static/chunks/app/login/page-dcb689dfe6e69879.js +1 -0
  339. package/.next/standalone/.next/static/chunks/app/login/pick-workspace/page-ee9bda8bfc4e0697.js +1 -0
  340. package/.next/standalone/.next/static/chunks/app/onboarding/page-e9409a2935c3c480.js +1 -0
  341. package/.next/standalone/.next/static/chunks/{webpack-17a45e2f5f3cd686.js → webpack-da41e6b9f3fe2f48.js} +1 -1
  342. package/.next/standalone/.next/static/css/ca9796ac54f96058.css +1 -0
  343. package/.next/standalone/package.json +7 -1
  344. package/.next/standalone/public/chorus-plugin/.claude-plugin/plugin.json +1 -1
  345. package/.next/standalone/public/chorus-plugin/agents/proposal-reviewer.md +5 -2
  346. package/.next/standalone/public/chorus-plugin/agents/task-reviewer.md +5 -2
  347. package/.next/standalone/public/chorus-plugin/bin/on-session-start.sh +11 -4
  348. package/.next/standalone/public/chorus-plugin/bin/on-subagent-start.sh +1 -1
  349. package/.next/standalone/public/chorus-plugin/bin/on-subagent-stop.sh +5 -5
  350. package/.next/standalone/public/chorus-plugin/skills/chorus/SKILL.md +43 -18
  351. package/.next/standalone/public/chorus-plugin/skills/develop/SKILL.md +3 -1
  352. package/.next/standalone/public/chorus-plugin/skills/idea/SKILL.md +1 -1
  353. package/.next/standalone/public/chorus-plugin/skills/proposal/SKILL.md +2 -2
  354. package/.next/standalone/public/chorus-plugin/skills/quick-dev/SKILL.md +3 -3
  355. package/.next/standalone/public/chorus-plugin/skills/review/SKILL.md +4 -3
  356. package/.next/standalone/public/chorus-plugin/skills/yolo/SKILL.md +19 -18
  357. package/.next/standalone/public/install-codex.sh +304 -0
  358. package/.next/standalone/public/skill/chorus/SKILL.md +44 -19
  359. package/.next/standalone/public/skill/proposal-chorus/SKILL.md +2 -2
  360. package/.next/standalone/public/skill/quick-dev-chorus/SKILL.md +3 -3
  361. package/.next/standalone/public/test-install-codex.sh +165 -0
  362. package/README.md +11 -38
  363. package/README.zh.md +11 -38
  364. package/package.json +7 -1
  365. package/prisma/migrations/20260430034110_add_agent_permissions/migration.sql +2 -0
  366. package/prisma/schema.prisma +1 -0
  367. package/.next/standalone/.next/server/chunks/1386.js +0 -1
  368. package/.next/standalone/.next/server/chunks/1526.js +0 -1
  369. package/.next/standalone/.next/server/chunks/3088.js +0 -1
  370. package/.next/standalone/.next/server/chunks/4152.js +0 -1
  371. package/.next/standalone/.next/server/chunks/4772.js +0 -158
  372. package/.next/standalone/.next/server/chunks/8104.js +0 -16
  373. package/.next/standalone/.next/server/chunks/9408.js +0 -1
  374. package/.next/standalone/.next/static/chunks/10739-f8a95983c740edff.js +0 -1
  375. package/.next/standalone/.next/static/chunks/19126-ce11a472a7b46715.js +0 -1
  376. package/.next/standalone/.next/static/chunks/192-2fe41d1be4cf52c7.js +0 -1
  377. package/.next/standalone/.next/static/chunks/36940-1a052dcfd7a51c42.js +0 -1
  378. package/.next/standalone/.next/static/chunks/4860.e2abb2e82b6cc9b4.js +0 -1
  379. package/.next/standalone/.next/static/chunks/53011-6c6e5c3c761b4229.js +0 -1
  380. package/.next/standalone/.next/static/chunks/55203-e226f28d874a003b.js +0 -1
  381. package/.next/standalone/.next/static/chunks/58245-b2ea112ace9624d2.js +0 -1
  382. package/.next/standalone/.next/static/chunks/59703-726546958cd4cf44.js +0 -1
  383. package/.next/standalone/.next/static/chunks/62326-65d43abf563d7ce2.js +0 -1
  384. package/.next/standalone/.next/static/chunks/67312-2b0c88796d8a1f83.js +0 -1
  385. package/.next/standalone/.next/static/chunks/71350-88c2649fc693c1e8.js +0 -1
  386. package/.next/standalone/.next/static/chunks/89310-e7dd1f2b9518aeb2.js +0 -1
  387. package/.next/standalone/.next/static/chunks/96924-847b528f7abad0e5.js +0 -1
  388. package/.next/standalone/.next/static/chunks/app/(dashboard)/project-groups/[uuid]/page-78f88c60bbff6c0f.js +0 -1
  389. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page-0e35b9b3fc9b614e.js +0 -1
  390. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-61ad25356f1bcf61.js +0 -1
  391. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-cfd59c5238497200.js +0 -1
  392. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-9d721a820e1058b5.js +0 -1
  393. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/ideas/[ideaUuid]/page-9199629492f0d6cc.js +0 -1
  394. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/ideas/page-164acb03167c8257.js +0 -1
  395. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-642981c5c760bfef.js +0 -1
  396. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page-38e4430e5591fbff.js +0 -1
  397. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/page-cb3978ef57e7197a.js +0 -1
  398. package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-94169bdcca8cb817.js +0 -1
  399. package/.next/standalone/.next/static/chunks/app/api/admin/companies/[uuid]/route-0e35b9b3fc9b614e.js +0 -1
  400. package/.next/standalone/.next/static/chunks/app/api/admin/companies/route-0e35b9b3fc9b614e.js +0 -1
  401. package/.next/standalone/.next/static/chunks/app/api/admin/login/route-0e35b9b3fc9b614e.js +0 -1
  402. package/.next/standalone/.next/static/chunks/app/api/admin/session/route-0e35b9b3fc9b614e.js +0 -1
  403. package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/route-0e35b9b3fc9b614e.js +0 -1
  404. package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/sessions/route-0e35b9b3fc9b614e.js +0 -1
  405. package/.next/standalone/.next/static/chunks/app/api/agents/route-0e35b9b3fc9b614e.js +0 -1
  406. package/.next/standalone/.next/static/chunks/app/api/api-keys/[uuid]/route-0e35b9b3fc9b614e.js +0 -1
  407. package/.next/standalone/.next/static/chunks/app/api/api-keys/route-0e35b9b3fc9b614e.js +0 -1
  408. package/.next/standalone/.next/static/chunks/app/api/auth/callback/route-0e35b9b3fc9b614e.js +0 -1
  409. package/.next/standalone/.next/static/chunks/app/api/auth/check-default/route-0e35b9b3fc9b614e.js +0 -1
  410. package/.next/standalone/.next/static/chunks/app/api/auth/default-login/route-0e35b9b3fc9b614e.js +0 -1
  411. package/.next/standalone/.next/static/chunks/app/api/auth/identify/route-0e35b9b3fc9b614e.js +0 -1
  412. package/.next/standalone/.next/static/chunks/app/api/auth/logout/route-0e35b9b3fc9b614e.js +0 -1
  413. package/.next/standalone/.next/static/chunks/app/api/auth/me/route-0e35b9b3fc9b614e.js +0 -1
  414. package/.next/standalone/.next/static/chunks/app/api/auth/refresh/route-0e35b9b3fc9b614e.js +0 -1
  415. package/.next/standalone/.next/static/chunks/app/api/auth/session/route-0e35b9b3fc9b614e.js +0 -1
  416. package/.next/standalone/.next/static/chunks/app/api/auth/sync-token/route-0e35b9b3fc9b614e.js +0 -1
  417. package/.next/standalone/.next/static/chunks/app/api/comments/route-0e35b9b3fc9b614e.js +0 -1
  418. package/.next/standalone/.next/static/chunks/app/api/documents/[uuid]/route-0e35b9b3fc9b614e.js +0 -1
  419. package/.next/standalone/.next/static/chunks/app/api/events/notifications/route-0e35b9b3fc9b614e.js +0 -1
  420. package/.next/standalone/.next/static/chunks/app/api/events/route-0e35b9b3fc9b614e.js +0 -1
  421. package/.next/standalone/.next/static/chunks/app/api/health/route-0e35b9b3fc9b614e.js +0 -1
  422. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/claim/route-0e35b9b3fc9b614e.js +0 -1
  423. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/move/route-0e35b9b3fc9b614e.js +0 -1
  424. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/release/route-0e35b9b3fc9b614e.js +0 -1
  425. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/route-0e35b9b3fc9b614e.js +0 -1
  426. package/.next/standalone/.next/static/chunks/app/api/mcp/route-0e35b9b3fc9b614e.js +0 -1
  427. package/.next/standalone/.next/static/chunks/app/api/me/assignments/route-0e35b9b3fc9b614e.js +0 -1
  428. package/.next/standalone/.next/static/chunks/app/api/mentionables/route-0e35b9b3fc9b614e.js +0 -1
  429. package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/archive/route-0e35b9b3fc9b614e.js +0 -1
  430. package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/read/route-0e35b9b3fc9b614e.js +0 -1
  431. package/.next/standalone/.next/static/chunks/app/api/notifications/preferences/route-0e35b9b3fc9b614e.js +0 -1
  432. package/.next/standalone/.next/static/chunks/app/api/notifications/read-all/route-0e35b9b3fc9b614e.js +0 -1
  433. package/.next/standalone/.next/static/chunks/app/api/notifications/route-0e35b9b3fc9b614e.js +0 -1
  434. package/.next/standalone/.next/static/chunks/app/api/notifications/unread-count/route-0e35b9b3fc9b614e.js +0 -1
  435. package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/dashboard/route-0e35b9b3fc9b614e.js +0 -1
  436. package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/route-0e35b9b3fc9b614e.js +0 -1
  437. package/.next/standalone/.next/static/chunks/app/api/project-groups/route-0e35b9b3fc9b614e.js +0 -1
  438. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/activity/route-0e35b9b3fc9b614e.js +0 -1
  439. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/available/route-0e35b9b3fc9b614e.js +0 -1
  440. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/documents/route-0e35b9b3fc9b614e.js +0 -1
  441. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/group/route-0e35b9b3fc9b614e.js +0 -1
  442. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/route-0e35b9b3fc9b614e.js +0 -1
  443. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/tracker/route-0e35b9b3fc9b614e.js +0 -1
  444. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route-0e35b9b3fc9b614e.js +0 -1
  445. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/route-0e35b9b3fc9b614e.js +0 -1
  446. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/summary/route-0e35b9b3fc9b614e.js +0 -1
  447. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/route-0e35b9b3fc9b614e.js +0 -1
  448. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/stats/route-0e35b9b3fc9b614e.js +0 -1
  449. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/dependencies/route-0e35b9b3fc9b614e.js +0 -1
  450. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/route-0e35b9b3fc9b614e.js +0 -1
  451. package/.next/standalone/.next/static/chunks/app/api/projects/route-0e35b9b3fc9b614e.js +0 -1
  452. package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/approve/route-0e35b9b3fc9b614e.js +0 -1
  453. package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/close/route-0e35b9b3fc9b614e.js +0 -1
  454. package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/reject/route-0e35b9b3fc9b614e.js +0 -1
  455. package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/revoke/route-0e35b9b3fc9b614e.js +0 -1
  456. package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/route-0e35b9b3fc9b614e.js +0 -1
  457. package/.next/standalone/.next/static/chunks/app/api/search/route-0e35b9b3fc9b614e.js +0 -1
  458. package/.next/standalone/.next/static/chunks/app/api/sessions/[uuid]/route-0e35b9b3fc9b614e.js +0 -1
  459. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/claim/route-0e35b9b3fc9b614e.js +0 -1
  460. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route-0e35b9b3fc9b614e.js +0 -1
  461. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/route-0e35b9b3fc9b614e.js +0 -1
  462. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/release/route-0e35b9b3fc9b614e.js +0 -1
  463. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/route-0e35b9b3fc9b614e.js +0 -1
  464. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/sessions/route-0e35b9b3fc9b614e.js +0 -1
  465. package/.next/standalone/.next/static/chunks/app/login/page-d7e41e281967f94d.js +0 -1
  466. package/.next/standalone/.next/static/chunks/app/onboarding/page-834ecbaf55d82ba5.js +0 -1
  467. package/.next/standalone/.next/static/css/99c7a0c50ad6bd32.css +0 -1
  468. package/.next/standalone/.next/static/kc2HwRxZUiMeDzrPiJW6z/_buildManifest.js +0 -1
  469. /package/.next/standalone/.next/static/{kc2HwRxZUiMeDzrPiJW6z → CQcM9hNpa5m8P_K5qveuk}/_ssgManifest.js +0 -0
@@ -0,0 +1,304 @@
1
+ #!/usr/bin/env bash
2
+ # Chorus + Codex CLI one-shot installer
3
+ #
4
+ # Usage:
5
+ # curl -sSL https://raw.githubusercontent.com/Chorus-AIDLC/Chorus/main/public/install-codex.sh | bash
6
+ # # or non-interactive:
7
+ # CHORUS_URL=https://... CHORUS_API_KEY=cho_... \
8
+ # bash <(curl -sSL https://raw.githubusercontent.com/Chorus-AIDLC/Chorus/main/public/install-codex.sh)
9
+ #
10
+ # What this does (idempotent, safe to re-run):
11
+ # 1. Verifies `codex` CLI is installed.
12
+ # 2. Registers (or upgrades) the Chorus plugin marketplace.
13
+ # 3. Writes [mcp_servers.chorus] (url + Authorization header) and
14
+ # [plugins."chorus@chorus-plugins"] enabled = true into ~/.codex/config.toml,
15
+ # so Codex auto-enables the plugin on first launch (falls back to one-click
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.
19
+
20
+ set -euo pipefail
21
+
22
+ # ---------- cosmetics ----------
23
+ BOLD=$'\033[1m'; DIM=$'\033[2m'; GREEN=$'\033[32m'; YELLOW=$'\033[33m'; RED=$'\033[31m'; RESET=$'\033[0m'
24
+ ok() { printf "${GREEN}✓${RESET} %s\n" "$*"; }
25
+ warn() { printf "${YELLOW}!${RESET} %s\n" "$*" >&2; }
26
+ die() { printf "${RED}✗${RESET} %s\n" "$*" >&2; exit 1; }
27
+ hdr() { printf "\n${BOLD}%s${RESET}\n" "$*"; }
28
+
29
+ # ---------- config ----------
30
+ MARKETPLACE_NAME="chorus-plugins"
31
+ MARKETPLACE_SOURCE_DEFAULT="${CHORUS_MARKETPLACE_SOURCE:-https://github.com/Chorus-AIDLC/Chorus}"
32
+ CHORUS_URL_DEFAULT="${CHORUS_URL_DEFAULT:-http://localhost:8637/api/mcp}"
33
+ CODEX_HOME="${CODEX_HOME:-$HOME/.codex}"
34
+ CONFIG_TOML="$CODEX_HOME/config.toml"
35
+
36
+ is_tty() { [ -t 0 ] && [ -t 1 ]; }
37
+
38
+ # If piped through `curl | bash`, stdin is the script body. Re-open from /dev/tty
39
+ # so interactive prompts still work — but only if a real TTY is available AND we
40
+ # actually need to prompt for input. Both CHORUS_URL and CHORUS_API_KEY being set
41
+ # lets us run fully non-interactively (useful in CI or unified-exec sandboxes).
42
+ if [ -z "${CHORUS_API_KEY:-}" ] && ! is_tty; then
43
+ if [ -r /dev/tty ] && [ -w /dev/tty ]; then
44
+ exec < /dev/tty
45
+ fi
46
+ fi
47
+
48
+ # ---------- step 1: check codex ----------
49
+ hdr "1/5 Checking Codex CLI"
50
+ command -v codex >/dev/null 2>&1 || die "codex not found in PATH. Install it first: npm i -g @openai/codex"
51
+ ok "Found $(codex --version 2>/dev/null | head -1)"
52
+
53
+ # ---------- step 2: register marketplace ----------
54
+ hdr "2/5 Registering the Chorus plugin marketplace"
55
+ # Extract the currently registered source (if any) for chorus-plugins.
56
+ # awk scoped between the matching [marketplaces.<name>] header and the next [section].
57
+ existing_source=""
58
+ if [ -f "$CONFIG_TOML" ]; then
59
+ existing_source="$(awk -v name="$MARKETPLACE_NAME" '
60
+ $0 ~ "^\\[marketplaces\\." name "\\][[:space:]]*$" { in_block=1; next }
61
+ in_block && /^\[/ { in_block=0 }
62
+ in_block && /^source[[:space:]]*=/ {
63
+ sub(/^source[[:space:]]*=[[:space:]]*/, "")
64
+ gsub(/^"|"$/, "")
65
+ print
66
+ exit
67
+ }
68
+ ' "$CONFIG_TOML" 2>/dev/null || true)"
69
+ fi
70
+
71
+ if [ -z "$existing_source" ]; then
72
+ codex plugin marketplace add "$MARKETPLACE_SOURCE_DEFAULT" >/dev/null
73
+ ok "Added marketplace: $MARKETPLACE_SOURCE_DEFAULT"
74
+ elif [ "$existing_source" = "$MARKETPLACE_SOURCE_DEFAULT" ]; then
75
+ # Same source — pull the latest plugin manifest/version.
76
+ if codex plugin marketplace upgrade "$MARKETPLACE_NAME" >/dev/null 2>&1; then
77
+ ok "Upgraded marketplace '${MARKETPLACE_NAME}' to latest"
78
+ else
79
+ warn "Marketplace '${MARKETPLACE_NAME}' already registered; upgrade skipped"
80
+ fi
81
+ else
82
+ # Source changed — remove the stale registration and re-add.
83
+ warn "Marketplace '${MARKETPLACE_NAME}' points at a different source; re-registering"
84
+ warn " old: $existing_source"
85
+ warn " new: $MARKETPLACE_SOURCE_DEFAULT"
86
+ codex plugin marketplace remove "$MARKETPLACE_NAME" >/dev/null 2>&1 || true
87
+ codex plugin marketplace add "$MARKETPLACE_SOURCE_DEFAULT" >/dev/null
88
+ ok "Re-added marketplace: $MARKETPLACE_SOURCE_DEFAULT"
89
+ fi
90
+
91
+ # ---------- step 3: collect Chorus URL + API key ----------
92
+ hdr "3/5 Configuring the Chorus MCP server"
93
+
94
+ # URL
95
+ if [ -n "${CHORUS_URL:-}" ]; then
96
+ url="$CHORUS_URL"
97
+ ok "Using CHORUS_URL from env: $url"
98
+ elif [ -t 0 ]; then
99
+ printf " Chorus MCP URL ${DIM}[default: $CHORUS_URL_DEFAULT]${RESET}: "
100
+ read -r url
101
+ url="${url:-$CHORUS_URL_DEFAULT}"
102
+ else
103
+ url="$CHORUS_URL_DEFAULT"
104
+ warn "No TTY and CHORUS_URL unset — using default: $url"
105
+ fi
106
+
107
+ # API key
108
+ if [ -n "${CHORUS_API_KEY:-}" ]; then
109
+ apikey="$CHORUS_API_KEY"
110
+ ok "Using CHORUS_API_KEY from env"
111
+ elif [ -t 0 ]; then
112
+ printf " Chorus API key (starts with cho_): "
113
+ stty -echo 2>/dev/null || true
114
+ read -r apikey
115
+ stty echo 2>/dev/null || true
116
+ printf "\n"
117
+ [ -n "$apikey" ] || die "API key is required"
118
+ else
119
+ die "No TTY and CHORUS_API_KEY unset — cannot continue"
120
+ fi
121
+
122
+ # Must be http(s).
123
+ case "$url" in
124
+ http://*|https://*) ;;
125
+ *) die "URL must start with http:// or https:// — got: $url" ;;
126
+ esac
127
+
128
+ # Normalize: the Chorus MCP endpoint lives under /api/mcp. If the user gave us
129
+ # just a host (or a host with trailing slash, or any path that doesn't already
130
+ # end in /api/mcp), append it so the MCP handshake hits the right route.
131
+ case "$url" in
132
+ */api/mcp) ;;
133
+ */api/mcp/) url="${url%/}" ;;
134
+ */) url="${url}api/mcp" ;;
135
+ *) url="${url}/api/mcp" ;;
136
+ esac
137
+ ok "MCP endpoint: $url"
138
+
139
+ # ---------- step 4: write config.toml ----------
140
+ hdr "4/5 Writing ~/.codex/config.toml"
141
+ mkdir -p "$CODEX_HOME"
142
+ [ -f "$CONFIG_TOML" ] || touch "$CONFIG_TOML"
143
+
144
+ # Back up once
145
+ if [ ! -f "$CONFIG_TOML.chorus-bak" ]; then
146
+ cp "$CONFIG_TOML" "$CONFIG_TOML.chorus-bak"
147
+ ok "Backed up original config to ${CONFIG_TOML}.chorus-bak"
148
+ fi
149
+
150
+ # Remove any existing [mcp_servers.chorus] and [mcp_servers.chorus.*] sub-tables
151
+ # (idempotent — old rotated keys / headers are wiped, then fresh section appended).
152
+ # Pure awk so we do not require Python on the user's machine.
153
+ tmp="$(mktemp "${TMPDIR:-/tmp}/chorus-config.XXXXXX")"
154
+ awk '
155
+ # A TOML table header line. Match [mcp_servers.chorus] and any
156
+ # [mcp_servers.chorus.<subtable>], plus [plugins."chorus@chorus-plugins"],
157
+ # and suppress lines until the next [section] header appears.
158
+ /^\[mcp_servers\.chorus(\..*)?\][[:space:]]*$/ { skip = 1; next }
159
+ /^\[plugins\."chorus@chorus-plugins"\][[:space:]]*$/ { skip = 1; next }
160
+ /^\[/ { skip = 0 }
161
+ skip != 1 { print }
162
+ ' "$CONFIG_TOML" > "$tmp"
163
+ mv "$tmp" "$CONFIG_TOML"
164
+
165
+ # Ensure user-owned file mode 600 (contains secret).
166
+ chmod 600 "$CONFIG_TOML"
167
+
168
+ # Append [mcp_servers.chorus] with literal URL + Authorization header.
169
+ # (Codex does NOT expand ${VAR}; the token is a literal string in the header.)
170
+ cat >> "$CONFIG_TOML" <<TOML
171
+
172
+ [mcp_servers.chorus]
173
+ url = "${url}"
174
+
175
+ [mcp_servers.chorus.http_headers]
176
+ Authorization = "Bearer ${apikey}"
177
+
178
+ [plugins."chorus@chorus-plugins"]
179
+ enabled = true
180
+ TOML
181
+
182
+ ok "Wrote [mcp_servers.chorus] and [plugins.\"chorus@chorus-plugins\"] → ${CONFIG_TOML}"
183
+
184
+ # ---------- step 5: install hooks ----------
185
+ hdr "5/5 Installing Chorus hooks"
186
+
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
218
+ else
219
+ echo '{}' ; exit 0
220
+ fi
221
+ fi
222
+ exec "$SCRIPT" "$@"
223
+ WRAP
224
+ chmod +x "$WRAPPER"
225
+ ok "Installed hook wrapper → $WRAPPER"
226
+
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).
264
+ 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
275
+ else
276
+ cat >> "$CONFIG_TOML" <<'TFEAT'
277
+
278
+ [features]
279
+ codex_hooks = true
280
+ TFEAT
281
+ ok "Appended [features] codex_hooks = true"
282
+ fi
283
+
284
+ # ---------- epilogue ----------
285
+ hdr "Done."
286
+ cat <<NEXT
287
+
288
+ Start Codex — the plugin is registered as INSTALLED_BY_DEFAULT so it
289
+ should activate on first launch:
290
+
291
+ ${BOLD}codex${RESET}
292
+
293
+ If /plugins does not show "chorus" as installed on first launch, open it
294
+ and click Install once (Codex has no \`plugin install\` CLI command yet,
295
+ so one manual click is the fallback path).
296
+
297
+ Verify anytime:
298
+ ${BOLD}codex mcp list${RESET} # 'chorus' row, Auth = 'Bearer token'
299
+ ${BOLD}codex features list${RESET} # codex_hooks + plugins both true
300
+
301
+ Then in Codex type ${BOLD}\$chorus${RESET} (or \$develop, \$review, \$proposal, …) to
302
+ activate a skill. To change your API key later, just re-run this installer.
303
+
304
+ NEXT
@@ -86,10 +86,26 @@ creates analyzes drafts PRD codes & reviews closes
86
86
 
87
87
  | Role | Responsibility | MCP Tools |
88
88
  |------|---------------|-----------|
89
- | **PM Agent** | Analyze Ideas, create Proposals (PRD + Task drafts), manage documents | Public + `chorus_pm_*` + `chorus_*_idea` |
89
+ | **PM Agent** | Analyze Ideas, create Proposals (PRD + Task drafts), manage documents | Public + `chorus_pm_*` + `chorus_*_idea` + `task:write` tools (claim/release/submit/report) |
90
90
  | **Developer Agent** | Claim Tasks, write code, report work, submit for verification | Public + `chorus_*_task` + `chorus_report_work` |
91
91
  | **Admin Agent** | Create projects/ideas, approve/reject proposals, verify tasks, manage lifecycle | Public + `chorus_admin_*` + PM + Developer tools |
92
92
 
93
+ ### Permissions
94
+
95
+ Each agent's tool visibility is driven by a **permission set**, not by the role label alone. Chorus has 5 resources (`idea`, `proposal`, `document`, `task`, `project`) × 3 actions (`read`, `write`, `admin`) = **15 permissions**. Each permission-gated MCP tool declares a single required permission (see `<BASE_URL>/docs/MCP_TOOLS.md` for the full table).
96
+
97
+ **Role presets** map to permission sets:
98
+
99
+ | Preset | Permissions |
100
+ |--------|-------------|
101
+ | `developer_agent` | all `*:read` + `task:write` |
102
+ | `pm_agent` | all `*:read` + `idea:write` + `proposal:write` + `document:write` + `task:write` + `project:write` |
103
+ | `admin_agent` | all 15 permissions (every `read` + `write` + `admin`) |
104
+
105
+ **Custom permissions** are also supported: when creating an agent you can pick a preset AND/OR add individual permissions. The effective permission set is the union. Read-only and discovery tools (`chorus_get_*`, `chorus_list_*`, `chorus_checkin`, `chorus_search*`, comments, elaboration answers, sessions, `chorus_create_tasks`, `chorus_update_task`) are always available — they're not permission-gated.
106
+
107
+ > **Note**: possessing `task:write` grants *tool visibility*, not unconditional authority. Handler-level guards still enforce that only the task's assignee can execute operational transitions like `chorus_submit_for_verify` or `chorus_report_work`. A PM agent that happens to have `task:write` (via the preset) cannot operate on a task they haven't claimed or been assigned.
108
+
93
109
  ---
94
110
 
95
111
  ## Common Tools (All Roles)
@@ -125,9 +141,9 @@ Results can be filtered by project(s) using optional HTTP headers in your MCP co
125
141
 
126
142
  ### MCP Connection
127
143
 
128
- - MCP sessions expire after 30 minutes of **inactivity** (sliding window)
129
- - Each MCP request automatically renews the session
130
- - If you receive a "Session not found" error, reinitialize the MCP connection
144
+ - The Chorus MCP endpoint is **stateless** each HTTP request creates a fresh server instance, so there is no client-side session to keep alive
145
+ - Supply your API Key in the `Authorization: Bearer cho_...` header on every request (your MCP client handles this automatically)
146
+ - Horizontal scaling works out of the box; no sticky sessions required
131
147
 
132
148
  ### Project Groups
133
149
 
@@ -257,11 +273,14 @@ API Keys are created by the user in the Chorus Web UI.
257
273
  **Ask the user to:**
258
274
  1. Open the Chorus settings page (e.g., `http://localhost:8637/settings`)
259
275
  2. Click **Create API Key**
260
- 3. Enter Agent name, select role (Developer / PM / Admin)
276
+ 3. Enter Agent name, then either:
277
+ - Pick a **role preset** (Developer / PM / Admin) — recommended for the common case
278
+ - Or pick a preset and **add/remove individual permissions** (5 resources × 3 actions = 15 permissions) to get a precise custom set
261
279
  4. Click create and **immediately copy the key** (shown only once)
262
280
 
263
281
  **Security notes:**
264
- - Each Agent should have its own API Key with the minimum required role
282
+ - Each Agent should have its own API Key with the minimum required permissions
283
+ - Presets are the fastest path; custom permissions let you grant narrowly (e.g. a dev agent that also needs `idea:write` to file bugs)
265
284
  - API Keys should not be committed to version control
266
285
 
267
286
  ### 2. MCP Server Configuration
@@ -297,19 +316,25 @@ chorus_checkin()
297
316
 
298
317
  If it fails, check: API Key correct (`cho_` prefix)? URL reachable? IDE restarted?
299
318
 
300
- ### 4. Role-Specific Tool Access
301
-
302
- | Tool Prefix | Developer | PM | Admin |
303
- |-------------|-----------|------|-------|
304
- | `chorus_get_*` / `chorus_list_*` | Yes | Yes | Yes |
305
- | `chorus_checkin` | Yes | Yes | Yes |
306
- | `chorus_add_comment` / `chorus_get_comments` | Yes | Yes | Yes |
307
- | `chorus_claim_task` / `chorus_release_task` | Yes | No | Yes |
308
- | `chorus_update_task` / `chorus_submit_for_verify` | Yes | No | Yes |
309
- | `chorus_report_work` | Yes | No | Yes |
310
- | `chorus_claim_idea` / `chorus_release_idea` | No | Yes | Yes |
311
- | `chorus_pm_*` | No | Yes | Yes |
312
- | `chorus_admin_*` | No | No | Yes |
319
+ ### 4. Tool Access by Preset
320
+
321
+ The table below shows default tool availability for each preset (no custom permissions). Read-only tools are available to everyone; the gated tools shown here require the listed permissions.
322
+
323
+ | Tool Group | Required Permission | Developer | PM | Admin |
324
+ |------------|--------------------|-----------|------|-------|
325
+ | `chorus_get_*` / `chorus_list_*` / `chorus_search*` | (public, read) | Yes | Yes | Yes |
326
+ | `chorus_checkin` | (public) | Yes | Yes | Yes |
327
+ | `chorus_add_comment` / `chorus_get_comments` | (public) | Yes | Yes | Yes |
328
+ | `chorus_update_task` (field edits + status) | (public; assignee required for status) | Yes | Yes | Yes |
329
+ | `chorus_claim_task` / `chorus_release_task` / `chorus_submit_for_verify` / `chorus_report_work` / `chorus_report_criteria_self_check` | `task:write` | Yes | **Yes** (0.7.0+) | Yes |
330
+ | `chorus_claim_idea` / `chorus_release_idea` / `chorus_move_idea` / `chorus_pm_create_idea` / `chorus_pm_*_elaboration` | `idea:write` | No | Yes | Yes |
331
+ | `chorus_pm_create_proposal` / `chorus_pm_*_proposal` / `chorus_pm_*_draft` / `chorus_pm_create_tasks` / `chorus_pm_assign_task` / `chorus_*_task_dependency` | `proposal:write` | No | Yes | Yes |
332
+ | `chorus_pm_create_document` / `chorus_pm_update_document` | `document:write` | No | Yes | Yes |
333
+ | `chorus_admin_create_project` / `chorus_admin_*_project_group` / `chorus_admin_move_project_to_group` | `project:write` | No | **Yes** (0.7.0+) | Yes |
334
+ | `chorus_admin_approve_proposal` / `chorus_admin_close_proposal` | `proposal:admin` | No | No | Yes |
335
+ | `chorus_admin_verify_task` / `chorus_admin_reopen_task` / `chorus_admin_close_task` / `chorus_mark_acceptance_criteria` / `chorus_admin_delete_task` | `task:admin` | No | No | Yes |
336
+ | `chorus_admin_delete_idea` | `idea:admin` | No | No | Yes |
337
+ | `chorus_admin_delete_document` | `document:admin` | No | No | Yes |
313
338
 
314
339
  ---
315
340
 
@@ -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.2.0"
7
+ version: "0.2.1"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -244,7 +244,7 @@ chorus_pm_assign_task({ taskUuid: "<task-uuid>", agentUuid: "<developer-agent-uu
244
244
  ```
245
245
 
246
246
  - Task should be `open` or `assigned`
247
- - Target agent should have `developer` or `developer_agent` role
247
+ - Target agent must have `task: ["write"]` permission
248
248
 
249
249
  ---
250
250
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: quick-dev-chorus
3
- version: 0.1.0
3
+ version: 0.1.1
4
4
  description: Quick Task workflow — skip Idea→Proposal, create tasks directly, execute, and verify.
5
5
  ---
6
6
 
@@ -37,7 +37,7 @@ For complex work, consider using the idea and proposal skills instead.
37
37
 
38
38
  ## Pre-Flight: Admin Self-Verify Check
39
39
 
40
- **Before creating tasks**, if you have the `admin_agent` role, ask the user:
40
+ **Before creating tasks**, if `chorus_checkin().agent.permissions.task` includes `"admin"`, ask the user:
41
41
 
42
42
  > "I have admin privileges. After development, should I verify the task myself, or leave it for another admin to verify?"
43
43
 
@@ -143,7 +143,7 @@ chorus_submit_for_verify({
143
143
  })
144
144
  ```
145
145
 
146
- **Admin self-verification:** If you have the `admin_agent` role and the user approved self-verification in the Pre-Flight check, you can verify the task yourself immediately after submitting:
146
+ **Admin self-verification:** If you have `task: ["admin"]` in `permissions` and the user approved self-verification in the Pre-Flight check, you can verify the task yourself immediately after submitting:
147
147
 
148
148
  ```
149
149
  chorus_admin_verify_task({ taskUuid: "<task-uuid>" })
@@ -0,0 +1,165 @@
1
+ #!/usr/bin/env bash
2
+ # Test public/install-codex.sh for macOS bash 3.2 compatibility.
3
+ #
4
+ # Usage:
5
+ # bash public/test-install-codex.sh
6
+ # BASH32=/path/to/bash-3.2 bash public/test-install-codex.sh
7
+ #
8
+ # Picks a bash: $BASH32 → /tmp/bash32-build/bash-3.2/bash (hand-built)
9
+ # → /bin/bash (macOS system bash is 3.2.57)
10
+ # → `bash` on PATH.
11
+
12
+ set -euo pipefail
13
+
14
+ REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
15
+ SCRIPT="$REPO_ROOT/public/install-codex.sh"
16
+
17
+ if [ -n "${BASH32:-}" ] && [ -x "$BASH32" ]; then
18
+ TEST_BASH="$BASH32"
19
+ elif [ -x "/tmp/bash32-build/bash-3.2/bash" ]; then
20
+ TEST_BASH="/tmp/bash32-build/bash-3.2/bash"
21
+ elif [ -x "/bin/bash" ]; then
22
+ TEST_BASH="/bin/bash"
23
+ else
24
+ TEST_BASH="$(command -v bash)"
25
+ fi
26
+
27
+ BOLD=$'\033[1m'; GREEN=$'\033[32m'; RED=$'\033[31m'; DIM=$'\033[2m'; RESET=$'\033[0m'
28
+
29
+ PASS=0; FAIL=0; FAIL_NOTES=""
30
+
31
+ pass() { printf " ${GREEN}PASS${RESET} %s\n" "$*"; PASS=$((PASS + 1)); }
32
+ fail() { printf " ${RED}FAIL${RESET} %s\n" "$*"; FAIL=$((FAIL + 1)); FAIL_NOTES="$FAIL_NOTES
33
+ - $*"; }
34
+
35
+ echo "${BOLD}Testing:${RESET} $SCRIPT"
36
+ echo "${BOLD}Using:${RESET} $TEST_BASH ($("$TEST_BASH" --version | head -1))"
37
+ echo ""
38
+
39
+ # [1/4] Static scan — reject bash 4+ constructs
40
+ echo "${BOLD}[1/4]${RESET} Static scan for bash 4+ constructs"
41
+ scan() {
42
+ local label="$1"; local pattern="$2"
43
+ if grep -nE "$pattern" "$SCRIPT" >/tmp/install-codex-scan.$$ 2>/dev/null; then
44
+ fail "$label"
45
+ sed 's/^/ /' /tmp/install-codex-scan.$$
46
+ else
47
+ pass "$label"
48
+ fi
49
+ rm -f /tmp/install-codex-scan.$$
50
+ }
51
+ scan 'no ${VAR,,} / ${VAR^^} case conversion' '\$\{[A-Za-z_][A-Za-z0-9_]*(\[[^]]+\])?[,^]{1,2}\}'
52
+ scan 'no "declare -A" / "typeset -A"' '^[[:space:]]*(declare|typeset|local)[[:space:]]+-[A-Za-z]*A'
53
+ scan 'no mapfile / readarray' '^\s*(mapfile|readarray)\b'
54
+ scan 'no "&>" redirection' '[^|]&>[^>]'
55
+ scan 'no "|&" redirection' '\|&'
56
+ scan 'no ";;&" case fallthrough' ';;&'
57
+
58
+ # [2/4] Parse
59
+ echo ""
60
+ echo "${BOLD}[2/4]${RESET} Parse with $TEST_BASH -n"
61
+ if "$TEST_BASH" -n "$SCRIPT" 2>/tmp/install-codex-parse.$$; then
62
+ pass "parses without syntax errors"
63
+ else
64
+ fail "parse error"
65
+ sed 's/^/ /' /tmp/install-codex-parse.$$
66
+ fi
67
+ rm -f /tmp/install-codex-parse.$$
68
+
69
+ # [3/4] End-to-end dry run with an isolated CODEX_HOME
70
+ echo ""
71
+ echo "${BOLD}[3/4]${RESET} End-to-end dry run (isolated CODEX_HOME)"
72
+
73
+ TMP_HOME="$(mktemp -d -t chorus-install-test.XXXXXX)"
74
+ trap 'rm -rf "$TMP_HOME"' EXIT
75
+
76
+ FAKE_BIN="$TMP_HOME/bin"
77
+ mkdir -p "$FAKE_BIN"
78
+ cat > "$FAKE_BIN/codex" <<'FAKE'
79
+ #!/usr/bin/env bash
80
+ case "${1:-}" in
81
+ --version) echo "codex 0.125.0-test" ;;
82
+ plugin)
83
+ if [ "${2:-}" = "marketplace" ] && [ "${3:-}" = "list" ]; then
84
+ echo ""
85
+ exit 0
86
+ fi
87
+ exit 0
88
+ ;;
89
+ *) exit 0 ;;
90
+ esac
91
+ FAKE
92
+ chmod +x "$FAKE_BIN/codex"
93
+
94
+ run_out="$TMP_HOME/run.log"
95
+ set +e
96
+ env \
97
+ PATH="$FAKE_BIN:$PATH" \
98
+ HOME="$TMP_HOME" \
99
+ CODEX_HOME="$TMP_HOME/.codex" \
100
+ CHORUS_URL="https://chorus.test/api/mcp" \
101
+ CHORUS_API_KEY="cho_test_key_abc123" \
102
+ CHORUS_MARKETPLACE_SOURCE="https://github.com/Chorus-AIDLC/Chorus" \
103
+ "$TEST_BASH" "$SCRIPT" >"$run_out" 2>&1
104
+ rc=$?
105
+ set -e
106
+
107
+ if [ "$rc" -ne 0 ]; then
108
+ fail "installer exited non-zero ($rc)"
109
+ sed 's/^/ /' "$run_out"
110
+ else
111
+ pass "installer exited 0"
112
+ fi
113
+
114
+ cfg="$TMP_HOME/.codex/config.toml"
115
+ if [ ! -f "$cfg" ]; then
116
+ fail "config.toml not created at $cfg"
117
+ else
118
+ pass "config.toml created"
119
+ grep -q '^\[mcp_servers\.chorus\]' "$cfg" && pass "[mcp_servers.chorus] block present" || fail "[mcp_servers.chorus] missing"
120
+ grep -q 'url = "https://chorus.test/api/mcp"' "$cfg" && pass "url written literally" || fail "url not literal"
121
+ grep -q 'Authorization = "Bearer cho_test_key_abc123"' "$cfg" && pass "Authorization header literal" || fail "Authorization not literal"
122
+ if command -v stat >/dev/null 2>&1; then
123
+ mode="$(stat -c '%a' "$cfg" 2>/dev/null || stat -f '%OLp' "$cfg" 2>/dev/null || echo "")"
124
+ if [ "$mode" = "600" ]; then
125
+ pass "config.toml mode=600"
126
+ elif [ -n "$mode" ]; then
127
+ fail "config.toml mode=$mode (expected 600)"
128
+ fi
129
+ fi
130
+ fi
131
+
132
+ # [4/4] Idempotent re-run with a rotated key
133
+ echo ""
134
+ echo "${BOLD}[4/4]${RESET} Idempotent re-run with a rotated key"
135
+ set +e
136
+ env \
137
+ PATH="$FAKE_BIN:$PATH" \
138
+ HOME="$TMP_HOME" \
139
+ CODEX_HOME="$TMP_HOME/.codex" \
140
+ CHORUS_URL="https://chorus.test/api/mcp" \
141
+ CHORUS_API_KEY="cho_rotated_key_xyz789" \
142
+ "$TEST_BASH" "$SCRIPT" >"$run_out" 2>&1
143
+ rc=$?
144
+ set -e
145
+ [ "$rc" -eq 0 ] && pass "rerun exited 0" || { fail "rerun exited non-zero ($rc)"; sed 's/^/ /' "$run_out"; }
146
+
147
+ blocks="$(grep -c '^\[mcp_servers\.chorus\]' "$cfg" 2>/dev/null || echo 0)"
148
+ [ "$blocks" = "1" ] && pass "exactly one [mcp_servers.chorus] block" || fail "found $blocks [mcp_servers.chorus] blocks"
149
+
150
+ hdr_blocks="$(grep -c '^\[mcp_servers\.chorus\.http_headers\]' "$cfg" 2>/dev/null || echo 0)"
151
+ [ "$hdr_blocks" = "1" ] && pass "exactly one [mcp_servers.chorus.http_headers] block" || fail "found $hdr_blocks http_headers blocks"
152
+
153
+ if grep -q 'Authorization = "Bearer cho_rotated_key_xyz789"' "$cfg" && ! grep -q 'cho_test_key_abc123' "$cfg"; then
154
+ pass "rotated key replaced the previous key"
155
+ else
156
+ fail "rotated key not applied cleanly"
157
+ fi
158
+
159
+ echo ""
160
+ echo "${BOLD}Summary:${RESET} $PASS passed, $FAIL failed"
161
+ if [ "$FAIL" -gt 0 ]; then
162
+ printf "${RED}%s${RESET}\n" "$FAIL_NOTES"
163
+ exit 1
164
+ fi
165
+ echo "${GREEN}All checks passed.${RESET}"