@chorus-aidlc/chorus 0.6.8 → 0.7.1

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 (313) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-build-manifest.json +335 -333
  3. package/.next/standalone/.next/app-path-routes-manifest.json +38 -38
  4. package/.next/standalone/.next/build-manifest.json +5 -5
  5. package/.next/standalone/.next/prerender-manifest.json +36 -36
  6. package/.next/standalone/.next/react-loadable-manifest.json +2 -2
  7. package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page.js +1 -1
  8. package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page.js.nft.json +1 -1
  9. package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page_client-reference-manifest.js +1 -1
  10. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page.js +2 -2
  11. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page.js.nft.json +1 -1
  12. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page_client-reference-manifest.js +1 -1
  13. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page.js +2 -2
  14. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page.js.nft.json +1 -1
  15. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page_client-reference-manifest.js +1 -1
  16. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js +2 -2
  17. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js.nft.json +1 -1
  18. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page_client-reference-manifest.js +1 -1
  19. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page.js +2 -2
  20. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page.js.nft.json +1 -1
  21. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page_client-reference-manifest.js +1 -1
  22. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page.js +1 -1
  23. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page.js.nft.json +1 -1
  24. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page_client-reference-manifest.js +1 -1
  25. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/[ideaUuid]/page.js +1 -1
  26. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/[ideaUuid]/page.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/[ideaUuid]/page_client-reference-manifest.js +1 -1
  28. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/page.js +1 -1
  29. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/page.js.nft.json +1 -1
  30. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/page_client-reference-manifest.js +1 -1
  31. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js +2 -2
  32. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js.nft.json +1 -1
  33. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page_client-reference-manifest.js +1 -1
  34. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js +2 -2
  35. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js.nft.json +1 -1
  36. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page_client-reference-manifest.js +1 -1
  37. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page.js +2 -2
  38. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page.js.nft.json +1 -1
  39. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page_client-reference-manifest.js +1 -1
  40. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js +1 -1
  41. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js.nft.json +1 -1
  42. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page_client-reference-manifest.js +1 -1
  43. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js +1 -1
  44. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js.nft.json +1 -1
  45. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page_client-reference-manifest.js +1 -1
  46. package/.next/standalone/.next/server/app/(dashboard)/projects/page.js +2 -2
  47. package/.next/standalone/.next/server/app/(dashboard)/projects/page.js.nft.json +1 -1
  48. package/.next/standalone/.next/server/app/(dashboard)/projects/page_client-reference-manifest.js +1 -1
  49. package/.next/standalone/.next/server/app/(dashboard)/settings/page.js +2 -2
  50. package/.next/standalone/.next/server/app/(dashboard)/settings/page.js.nft.json +1 -1
  51. package/.next/standalone/.next/server/app/(dashboard)/settings/page_client-reference-manifest.js +1 -1
  52. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  53. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  54. package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
  55. package/.next/standalone/.next/server/app/admin/companies/[uuid]/page_client-reference-manifest.js +1 -1
  56. package/.next/standalone/.next/server/app/admin/companies/new/page_client-reference-manifest.js +1 -1
  57. package/.next/standalone/.next/server/app/admin/companies/new.html +1 -1
  58. package/.next/standalone/.next/server/app/admin/companies/new.rsc +2 -2
  59. package/.next/standalone/.next/server/app/admin/companies/page_client-reference-manifest.js +1 -1
  60. package/.next/standalone/.next/server/app/admin/companies.html +1 -1
  61. package/.next/standalone/.next/server/app/admin/companies.rsc +2 -2
  62. package/.next/standalone/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  63. package/.next/standalone/.next/server/app/admin.html +1 -1
  64. package/.next/standalone/.next/server/app/admin.rsc +2 -2
  65. package/.next/standalone/.next/server/app/api/admin/companies/[uuid]/route_client-reference-manifest.js +1 -1
  66. package/.next/standalone/.next/server/app/api/admin/companies/route_client-reference-manifest.js +1 -1
  67. package/.next/standalone/.next/server/app/api/admin/login/route_client-reference-manifest.js +1 -1
  68. package/.next/standalone/.next/server/app/api/admin/session/route_client-reference-manifest.js +1 -1
  69. package/.next/standalone/.next/server/app/api/agents/[uuid]/route.js +1 -1
  70. package/.next/standalone/.next/server/app/api/agents/[uuid]/route_client-reference-manifest.js +1 -1
  71. package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route_client-reference-manifest.js +1 -1
  72. package/.next/standalone/.next/server/app/api/agents/route.js +1 -1
  73. package/.next/standalone/.next/server/app/api/agents/route_client-reference-manifest.js +1 -1
  74. package/.next/standalone/.next/server/app/api/api-keys/[uuid]/route_client-reference-manifest.js +1 -1
  75. package/.next/standalone/.next/server/app/api/api-keys/route_client-reference-manifest.js +1 -1
  76. package/.next/standalone/.next/server/app/api/auth/callback/route_client-reference-manifest.js +1 -1
  77. package/.next/standalone/.next/server/app/api/auth/check-default/route_client-reference-manifest.js +1 -1
  78. package/.next/standalone/.next/server/app/api/auth/company-oidc/route_client-reference-manifest.js +1 -1
  79. package/.next/standalone/.next/server/app/api/auth/default-login/route_client-reference-manifest.js +1 -1
  80. package/.next/standalone/.next/server/app/api/auth/identify/route_client-reference-manifest.js +1 -1
  81. package/.next/standalone/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  82. package/.next/standalone/.next/server/app/api/auth/me/route_client-reference-manifest.js +1 -1
  83. package/.next/standalone/.next/server/app/api/auth/refresh/route_client-reference-manifest.js +1 -1
  84. package/.next/standalone/.next/server/app/api/auth/session/route_client-reference-manifest.js +1 -1
  85. package/.next/standalone/.next/server/app/api/auth/sync-token/route_client-reference-manifest.js +1 -1
  86. package/.next/standalone/.next/server/app/api/comments/route_client-reference-manifest.js +1 -1
  87. package/.next/standalone/.next/server/app/api/documents/[uuid]/route.js +1 -1
  88. package/.next/standalone/.next/server/app/api/documents/[uuid]/route_client-reference-manifest.js +1 -1
  89. package/.next/standalone/.next/server/app/api/events/notifications/route_client-reference-manifest.js +1 -1
  90. package/.next/standalone/.next/server/app/api/events/route_client-reference-manifest.js +1 -1
  91. package/.next/standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  92. package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route.js +1 -1
  93. package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route_client-reference-manifest.js +1 -1
  94. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route.js +1 -1
  95. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route_client-reference-manifest.js +1 -1
  96. package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route.js +1 -1
  97. package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route_client-reference-manifest.js +1 -1
  98. package/.next/standalone/.next/server/app/api/ideas/[uuid]/route.js +1 -1
  99. package/.next/standalone/.next/server/app/api/ideas/[uuid]/route_client-reference-manifest.js +1 -1
  100. package/.next/standalone/.next/server/app/api/mcp/route.js +6 -6
  101. package/.next/standalone/.next/server/app/api/mcp/route_client-reference-manifest.js +1 -1
  102. package/.next/standalone/.next/server/app/api/me/assignments/route_client-reference-manifest.js +1 -1
  103. package/.next/standalone/.next/server/app/api/mentionables/route_client-reference-manifest.js +1 -1
  104. package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route_client-reference-manifest.js +1 -1
  105. package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route_client-reference-manifest.js +1 -1
  106. package/.next/standalone/.next/server/app/api/notifications/preferences/route_client-reference-manifest.js +1 -1
  107. package/.next/standalone/.next/server/app/api/notifications/read-all/route_client-reference-manifest.js +1 -1
  108. package/.next/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  109. package/.next/standalone/.next/server/app/api/notifications/unread-count/route_client-reference-manifest.js +1 -1
  110. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/dashboard/route.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.js +1 -1
  113. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/route_client-reference-manifest.js +1 -1
  114. package/.next/standalone/.next/server/app/api/project-groups/route.js +1 -1
  115. package/.next/standalone/.next/server/app/api/project-groups/route_client-reference-manifest.js +1 -1
  116. package/.next/standalone/.next/server/app/api/projects/[uuid]/activity/route.js +1 -1
  117. package/.next/standalone/.next/server/app/api/projects/[uuid]/activity/route_client-reference-manifest.js +1 -1
  118. package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route.js +1 -1
  119. package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route_client-reference-manifest.js +1 -1
  120. package/.next/standalone/.next/server/app/api/projects/[uuid]/documents/route.js +1 -1
  121. package/.next/standalone/.next/server/app/api/projects/[uuid]/documents/route_client-reference-manifest.js +1 -1
  122. package/.next/standalone/.next/server/app/api/projects/[uuid]/group/route.js +1 -1
  123. package/.next/standalone/.next/server/app/api/projects/[uuid]/group/route_client-reference-manifest.js +1 -1
  124. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route.js +1 -1
  125. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route_client-reference-manifest.js +1 -1
  126. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route.js +1 -1
  127. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route_client-reference-manifest.js +1 -1
  128. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route.js +1 -1
  129. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route_client-reference-manifest.js +1 -1
  130. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route.js +1 -1
  131. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route_client-reference-manifest.js +1 -1
  132. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route.js +1 -1
  133. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route_client-reference-manifest.js +1 -1
  134. package/.next/standalone/.next/server/app/api/projects/[uuid]/route.js +1 -1
  135. package/.next/standalone/.next/server/app/api/projects/[uuid]/route_client-reference-manifest.js +1 -1
  136. package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route.js +1 -1
  137. package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route_client-reference-manifest.js +1 -1
  138. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route.js +1 -1
  139. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route_client-reference-manifest.js +1 -1
  140. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route.js +1 -1
  141. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route_client-reference-manifest.js +1 -1
  142. package/.next/standalone/.next/server/app/api/projects/route.js +1 -1
  143. package/.next/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  144. package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route.js +1 -1
  145. package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route_client-reference-manifest.js +1 -1
  146. package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route.js +1 -1
  147. package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route_client-reference-manifest.js +1 -1
  148. package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route.js +1 -1
  149. package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route_client-reference-manifest.js +1 -1
  150. package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route.js +1 -1
  151. package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route_client-reference-manifest.js +1 -1
  152. package/.next/standalone/.next/server/app/api/proposals/[uuid]/route.js +1 -1
  153. package/.next/standalone/.next/server/app/api/proposals/[uuid]/route_client-reference-manifest.js +1 -1
  154. package/.next/standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  155. package/.next/standalone/.next/server/app/api/sessions/[uuid]/route_client-reference-manifest.js +1 -1
  156. package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route.js +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_client-reference-manifest.js +1 -1
  160. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route.js +1 -1
  161. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route_client-reference-manifest.js +1 -1
  162. package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route.js +1 -1
  163. package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route_client-reference-manifest.js +1 -1
  164. package/.next/standalone/.next/server/app/api/tasks/[uuid]/route.js +1 -1
  165. package/.next/standalone/.next/server/app/api/tasks/[uuid]/route_client-reference-manifest.js +1 -1
  166. package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route.js +1 -1
  167. package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route_client-reference-manifest.js +1 -1
  168. package/.next/standalone/.next/server/app/index.html +1 -1
  169. package/.next/standalone/.next/server/app/index.rsc +2 -2
  170. package/.next/standalone/.next/server/app/login/admin/page_client-reference-manifest.js +1 -1
  171. package/.next/standalone/.next/server/app/login/admin.html +1 -1
  172. package/.next/standalone/.next/server/app/login/admin.rsc +2 -2
  173. package/.next/standalone/.next/server/app/login/callback/page_client-reference-manifest.js +1 -1
  174. package/.next/standalone/.next/server/app/login/callback.html +1 -1
  175. package/.next/standalone/.next/server/app/login/callback.rsc +2 -2
  176. package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  177. package/.next/standalone/.next/server/app/login/pick-workspace/page_client-reference-manifest.js +1 -1
  178. package/.next/standalone/.next/server/app/login/pick-workspace.html +1 -1
  179. package/.next/standalone/.next/server/app/login/pick-workspace.rsc +2 -2
  180. package/.next/standalone/.next/server/app/login/silent-refresh/page_client-reference-manifest.js +1 -1
  181. package/.next/standalone/.next/server/app/login/silent-refresh.html +1 -1
  182. package/.next/standalone/.next/server/app/login/silent-refresh.rsc +2 -2
  183. package/.next/standalone/.next/server/app/login.html +1 -1
  184. package/.next/standalone/.next/server/app/login.rsc +2 -2
  185. package/.next/standalone/.next/server/app/onboarding/page.js +5 -4
  186. package/.next/standalone/.next/server/app/onboarding/page.js.nft.json +1 -1
  187. package/.next/standalone/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
  188. package/.next/standalone/.next/server/app/onboarding.html +1 -1
  189. package/.next/standalone/.next/server/app/onboarding.rsc +3 -3
  190. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  191. package/.next/standalone/.next/server/app/projects.html +1 -1
  192. package/.next/standalone/.next/server/app/projects.rsc +4 -4
  193. package/.next/standalone/.next/server/app/settings.html +1 -1
  194. package/.next/standalone/.next/server/app/settings.rsc +4 -4
  195. package/.next/standalone/.next/server/app-paths-manifest.json +38 -38
  196. package/.next/standalone/.next/server/chunks/1596.js +1 -1
  197. package/.next/standalone/.next/server/chunks/1639.js +1 -0
  198. package/.next/standalone/.next/server/chunks/1871.js +1 -0
  199. package/.next/standalone/.next/server/chunks/2570.js +1 -1
  200. package/.next/standalone/.next/server/chunks/2618.js +1 -1
  201. package/.next/standalone/.next/server/chunks/2961.js +1 -1
  202. package/.next/standalone/.next/server/chunks/{3408.js → 3300.js} +1 -1
  203. package/.next/standalone/.next/server/chunks/3611.js +158 -0
  204. package/.next/standalone/.next/server/chunks/3890.js +1 -1
  205. package/.next/standalone/.next/server/chunks/5300.js +1 -1
  206. package/.next/standalone/.next/server/chunks/5869.js +16 -0
  207. package/.next/standalone/.next/server/chunks/6113.js +1 -1
  208. package/.next/standalone/.next/server/chunks/6207.js +1 -1
  209. package/.next/standalone/.next/server/chunks/6753.js +3 -3
  210. package/.next/standalone/.next/server/chunks/7368.js +1 -1
  211. package/.next/standalone/.next/server/chunks/8251.js +1 -0
  212. package/.next/standalone/.next/server/chunks/8584.js +1 -0
  213. package/.next/standalone/.next/server/chunks/9051.js +1 -0
  214. package/.next/standalone/.next/server/chunks/920.js +1 -1
  215. package/.next/standalone/.next/server/chunks/937.js +1 -1
  216. package/.next/standalone/.next/server/chunks/9508.js +2 -2
  217. package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
  218. package/.next/standalone/.next/server/middleware-manifest.json +5 -5
  219. package/.next/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  220. package/.next/standalone/.next/server/pages/404.html +1 -1
  221. package/.next/standalone/.next/server/pages/500.html +1 -1
  222. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  223. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  224. package/.next/standalone/.next/static/chunks/10739-5c185aa0432f5d56.js +1 -0
  225. package/.next/standalone/.next/static/chunks/{14945-45ab8dcd7d1460b0.js → 14945-0bc0086add441ba7.js} +1 -1
  226. package/.next/standalone/.next/static/chunks/19126-858a24cab6fd338a.js +1 -0
  227. package/.next/standalone/.next/static/chunks/21932-bce5ba937d1603e1.js +1 -0
  228. package/.next/standalone/.next/static/chunks/29445-04c4ab36da85b7da.js +1 -0
  229. package/.next/standalone/.next/static/chunks/34775-387b9a9967a35ccb.js +1 -0
  230. package/.next/standalone/.next/static/chunks/39611-cc227784ed679a6d.js +1 -0
  231. package/.next/standalone/.next/static/chunks/4457-b86052b2e954e357.js +1 -0
  232. package/.next/standalone/.next/static/chunks/4842-95cf4b7efd540e89.js +1 -0
  233. package/.next/standalone/.next/static/chunks/4860.15c9ae5b6268c6fc.js +1 -0
  234. package/.next/standalone/.next/static/chunks/53298-82b9c818cd70686d.js +1 -0
  235. package/.next/standalone/.next/static/chunks/{72156-693a7612a0a1927c.js → 53664-a2be2eaacce03f0f.js} +1 -1
  236. package/.next/standalone/.next/static/chunks/55434-622522b242e7747f.js +1 -0
  237. package/.next/standalone/.next/static/chunks/95750-3d0d1d48995d1088.js +1 -0
  238. package/.next/standalone/.next/static/chunks/96919-8cbf6310c703e7af.js +1 -0
  239. package/.next/standalone/.next/static/chunks/{52162.90c7520be06645a7.js → 96924.93f7dab7363f09ac.js} +1 -1
  240. package/.next/standalone/.next/static/chunks/{99373.dddf0d83066106d0.js → 99373.9939e11f5b4e0615.js} +1 -1
  241. package/.next/standalone/.next/static/chunks/99513-24849ff68a8098e1.js +1 -0
  242. package/.next/standalone/.next/static/chunks/app/(dashboard)/{layout-bf420c745be7631b.js → layout-acddb9c84f5d1607.js} +1 -1
  243. package/.next/standalone/.next/static/chunks/app/(dashboard)/project-groups/[uuid]/{page-cb9454c2d5a8390c.js → page-63a6a5b6cf9ecf87.js} +1 -1
  244. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-b4c6141dd26cc506.js +1 -0
  245. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-4bf7bff8d68509f9.js +1 -0
  246. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-37a0cea0ba40c31b.js +1 -0
  247. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/ideas/[ideaUuid]/page-2d820769aa7bcaf6.js +1 -0
  248. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/ideas/page-dec0e71221d77928.js +1 -0
  249. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-355321010dd82e56.js +1 -0
  250. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/{page-59f6f1967c3dfcad.js → page-bc66567cb9c40bf0.js} +1 -1
  251. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/{page-a4995a788651e9bc.js → page-86cfeb421fa97830.js} +1 -1
  252. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page-7fe70579023330da.js +1 -0
  253. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/page-8c51993bb3866a55.js +1 -0
  254. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/{page-7c30b3f9f2b8f520.js → page-80566dcc1cd42bee.js} +1 -1
  255. package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-8db25385236a9bbf.js +1 -0
  256. package/.next/standalone/.next/static/chunks/app/onboarding/page-8d755192f0f67938.js +1 -0
  257. package/.next/standalone/.next/static/chunks/{webpack-121b5a7960550fef.js → webpack-1bb984dd0934fa96.js} +1 -1
  258. package/.next/standalone/.next/static/css/ca9796ac54f96058.css +1 -0
  259. package/.next/standalone/package.json +1 -1
  260. package/.next/standalone/public/chorus-plugin/.claude-plugin/plugin.json +1 -1
  261. package/.next/standalone/public/chorus-plugin/bin/on-session-start.sh +11 -4
  262. package/.next/standalone/public/chorus-plugin/bin/on-subagent-start.sh +1 -1
  263. package/.next/standalone/public/chorus-plugin/bin/on-subagent-stop.sh +5 -5
  264. package/.next/standalone/public/chorus-plugin/skills/chorus/SKILL.md +43 -18
  265. package/.next/standalone/public/chorus-plugin/skills/develop/SKILL.md +1 -1
  266. package/.next/standalone/public/chorus-plugin/skills/idea/SKILL.md +1 -1
  267. package/.next/standalone/public/chorus-plugin/skills/proposal/SKILL.md +2 -2
  268. package/.next/standalone/public/chorus-plugin/skills/quick-dev/SKILL.md +3 -3
  269. package/.next/standalone/public/chorus-plugin/skills/review/SKILL.md +1 -1
  270. package/.next/standalone/public/chorus-plugin/skills/yolo/SKILL.md +15 -18
  271. package/.next/standalone/public/install-opencode.sh +284 -0
  272. package/.next/standalone/public/skill/chorus/SKILL.md +44 -19
  273. package/.next/standalone/public/skill/proposal-chorus/SKILL.md +2 -2
  274. package/.next/standalone/public/skill/quick-dev-chorus/SKILL.md +3 -3
  275. package/README.md +12 -5
  276. package/README.zh.md +12 -5
  277. package/package.json +1 -1
  278. package/prisma/migrations/20260430034110_add_agent_permissions/migration.sql +2 -0
  279. package/prisma/schema.prisma +1 -0
  280. package/.next/standalone/.next/server/chunks/1386.js +0 -1
  281. package/.next/standalone/.next/server/chunks/1526.js +0 -1
  282. package/.next/standalone/.next/server/chunks/3088.js +0 -1
  283. package/.next/standalone/.next/server/chunks/4152.js +0 -1
  284. package/.next/standalone/.next/server/chunks/4772.js +0 -158
  285. package/.next/standalone/.next/server/chunks/8104.js +0 -16
  286. package/.next/standalone/.next/server/chunks/9408.js +0 -1
  287. package/.next/standalone/.next/static/chunks/10739-f8a95983c740edff.js +0 -1
  288. package/.next/standalone/.next/static/chunks/19126-ce11a472a7b46715.js +0 -1
  289. package/.next/standalone/.next/static/chunks/192-2fe41d1be4cf52c7.js +0 -1
  290. package/.next/standalone/.next/static/chunks/36940-1a052dcfd7a51c42.js +0 -1
  291. package/.next/standalone/.next/static/chunks/4860.32370b32f23e5ea7.js +0 -1
  292. package/.next/standalone/.next/static/chunks/53011-6c6e5c3c761b4229.js +0 -1
  293. package/.next/standalone/.next/static/chunks/55203-e226f28d874a003b.js +0 -1
  294. package/.next/standalone/.next/static/chunks/58245-b2ea112ace9624d2.js +0 -1
  295. package/.next/standalone/.next/static/chunks/59703-726546958cd4cf44.js +0 -1
  296. package/.next/standalone/.next/static/chunks/62326-65d43abf563d7ce2.js +0 -1
  297. package/.next/standalone/.next/static/chunks/67312-2b0c88796d8a1f83.js +0 -1
  298. package/.next/standalone/.next/static/chunks/71350-88c2649fc693c1e8.js +0 -1
  299. package/.next/standalone/.next/static/chunks/89310-e7dd1f2b9518aeb2.js +0 -1
  300. package/.next/standalone/.next/static/chunks/96924-847b528f7abad0e5.js +0 -1
  301. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-61ad25356f1bcf61.js +0 -1
  302. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-cfd59c5238497200.js +0 -1
  303. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-9d721a820e1058b5.js +0 -1
  304. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/ideas/[ideaUuid]/page-9199629492f0d6cc.js +0 -1
  305. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/ideas/page-164acb03167c8257.js +0 -1
  306. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-642981c5c760bfef.js +0 -1
  307. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page-38e4430e5591fbff.js +0 -1
  308. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/page-cb3978ef57e7197a.js +0 -1
  309. package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-94169bdcca8cb817.js +0 -1
  310. package/.next/standalone/.next/static/chunks/app/onboarding/page-1aadff0d5227df18.js +0 -1
  311. package/.next/standalone/.next/static/css/5d7e316311e46db1.css +0 -1
  312. /package/.next/standalone/.next/static/{oJIidfE9Dj5iwDkFfuZP9 → TJ6qFSxjQGUSajvwbI2qu}/_buildManifest.js +0 -0
  313. /package/.next/standalone/.next/static/{oJIidfE9Dj5iwDkFfuZP9 → TJ6qFSxjQGUSajvwbI2qu}/_ssgManifest.js +0 -0
@@ -0,0 +1,284 @@
1
+ #!/usr/bin/env bash
2
+ # Chorus + OpenCode one-shot plugin installer
3
+ #
4
+ # Usage:
5
+ # curl -fsSL https://<your-chorus>/install-opencode.sh | bash
6
+ #
7
+ # What this does (idempotent, safe to re-run):
8
+ # 1. Verifies `opencode` CLI is installed.
9
+ # 2. Adds "opencode-chorus" to the `plugin` array in
10
+ # ~/.config/opencode/opencode.json. Creates the file if missing.
11
+ # Preserves any existing plugins.
12
+ # 3. Sets file permissions to 600.
13
+ #
14
+ # What this does NOT do:
15
+ # - Write to ~/.bashrc / ~/.zshrc. You must export CHORUS_URL and
16
+ # CHORUS_API_KEY yourself before launching opencode (the plugin reads
17
+ # process.env on startup).
18
+ # - Invoke jq / node / python. Pure POSIX awk/sed/grep only.
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}\xe2\x9c\x93${RESET} %s\n" "$*"; }
25
+ warn() { printf "${YELLOW}!${RESET} %s\n" "$*" >&2; }
26
+ die() { printf "${RED}\xe2\x9c\x97${RESET} %s\n" "$*" >&2; exit 1; }
27
+ hdr() { printf "\n${BOLD}%s${RESET}\n" "$*"; }
28
+
29
+ # ---------- config ----------
30
+ PLUGIN_NAME="opencode-chorus"
31
+ CONFIG_DIR="${OPENCODE_CONFIG_DIR:-$HOME/.config/opencode}"
32
+ CONFIG_FILE="$CONFIG_DIR/opencode.json"
33
+ BACKUP_FILE="$CONFIG_FILE.chorus-bak"
34
+
35
+ # ---------- step 1: check opencode ----------
36
+ hdr "1/3 Checking OpenCode CLI"
37
+ if command -v opencode >/dev/null 2>&1; then
38
+ ok "Found $(opencode --version 2>/dev/null | head -1)"
39
+ else
40
+ warn "opencode not found in PATH — install it first: https://opencode.ai/docs/"
41
+ warn "Proceeding to write the config anyway. OpenCode will pick it up on install."
42
+ fi
43
+
44
+ # ---------- step 2: ensure config dir ----------
45
+ hdr "2/3 Updating $CONFIG_FILE"
46
+ mkdir -p "$CONFIG_DIR"
47
+
48
+ # Helper: print the manual instructions and exit 0 (non-fatal).
49
+ print_manual_hint() {
50
+ warn "Could not automatically update $CONFIG_FILE."
51
+ warn "Please add \"$PLUGIN_NAME\" to the \"plugin\" array manually:"
52
+ cat >&2 <<HINT
53
+
54
+ {
55
+ "\$schema": "https://opencode.ai/config.json",
56
+ "plugin": ["$PLUGIN_NAME"${EXISTING_PLUGIN_HINT:-}]
57
+ ...
58
+ }
59
+
60
+ HINT
61
+ exit 0
62
+ }
63
+
64
+ # ---------- Case A: file does not exist ----------
65
+ if [ ! -f "$CONFIG_FILE" ]; then
66
+ cat > "$CONFIG_FILE" <<JSON
67
+ {
68
+ "\$schema": "https://opencode.ai/config.json",
69
+ "plugin": ["$PLUGIN_NAME"]
70
+ }
71
+ JSON
72
+ chmod 600 "$CONFIG_FILE"
73
+ ok "Created $CONFIG_FILE with $PLUGIN_NAME"
74
+ else
75
+ # File exists — back it up once.
76
+ if [ ! -f "$BACKUP_FILE" ]; then
77
+ cp "$CONFIG_FILE" "$BACKUP_FILE"
78
+ chmod 600 "$BACKUP_FILE"
79
+ ok "Backed up original config to $BACKUP_FILE"
80
+ fi
81
+
82
+ # Reject JSONC (comments). Presence of // or /* strongly suggests the file
83
+ # is hand-edited JSONC; our line-based awk would mangle it. Bail cleanly.
84
+ if grep -qE '^[[:space:]]*//|/\*' "$CONFIG_FILE"; then
85
+ warn "Detected // or /* in $CONFIG_FILE — looks like JSONC with comments."
86
+ print_manual_hint
87
+ fi
88
+
89
+ # Case C1: plugin array already contains opencode-chorus → no-op.
90
+ # Scope the check to the "plugin" array itself: a top-level occurrence of
91
+ # "opencode-chorus" outside that array (e.g. in a "lastInstalled" field)
92
+ # must not trigger the no-op shortcut.
93
+ plugin_contains_self() {
94
+ awk -v plugin="$PLUGIN_NAME" '
95
+ # Track whether we are currently inside the first "plugin" array.
96
+ # State machine:
97
+ # 0 = before the plugin key
98
+ # 1 = inside the plugin array (between its [ and matching ])
99
+ BEGIN { state = 0 }
100
+ state == 0 {
101
+ # Is the "plugin" key on this line?
102
+ if (match($0, /"plugin"[[:space:]]*:[[:space:]]*\[/)) {
103
+ # Consume the rest of the line starting at the [
104
+ rest = substr($0, RSTART + RLENGTH - 1)
105
+ state = 1
106
+ # Fall through to state == 1 handling for this rest.
107
+ $0 = rest
108
+ } else {
109
+ next
110
+ }
111
+ }
112
+ state == 1 {
113
+ # Look for the closing ] on this line (naive — good enough for
114
+ # standard JSON because plugin entries are plain strings).
115
+ close_pos = index($0, "]")
116
+ if (close_pos > 0) {
117
+ chunk = substr($0, 1, close_pos - 1)
118
+ } else {
119
+ chunk = $0
120
+ }
121
+ # Check for the quoted token inside the array chunk only.
122
+ if (index(chunk, "\"" plugin "\"") > 0) {
123
+ print "yes"
124
+ exit 0
125
+ }
126
+ if (close_pos > 0) exit 0
127
+ }
128
+ ' "$CONFIG_FILE"
129
+ }
130
+
131
+ if [ "$(plugin_contains_self)" = "yes" ]; then
132
+ ok "$PLUGIN_NAME already present in $CONFIG_FILE — nothing to do"
133
+ else
134
+ # Decide: Case B (no plugin key) vs Case C2 (plugin key exists without this plugin).
135
+ if grep -qE '"plugin"[[:space:]]*:' "$CONFIG_FILE"; then
136
+ # Case C2: insert into existing plugin array.
137
+ # Strategy: find the first "plugin" key, locate its array bracket pair,
138
+ # insert "opencode-chorus" before the closing ].
139
+ #
140
+ # Only handle the common cases where the array is on a single line or
141
+ # a multi-line array that has one entry per line. Otherwise bail to hint.
142
+ tmp="$(mktemp "${TMPDIR:-/tmp}/chorus-opencode.XXXXXX")"
143
+ if awk -v plugin="$PLUGIN_NAME" '
144
+ BEGIN { done = 0 }
145
+ # Single-line empty array: "plugin": []
146
+ !done && /"plugin"[[:space:]]*:[[:space:]]*\[[[:space:]]*\]/ {
147
+ sub(/\[[[:space:]]*\]/, "[\"" plugin "\"]")
148
+ done = 1
149
+ print
150
+ next
151
+ }
152
+ # Single-line non-empty array: "plugin": [ "foo", "bar" ]
153
+ !done && match($0, /"plugin"[[:space:]]*:[[:space:]]*\[[^\]]*\]/) {
154
+ line = $0
155
+ pre = substr(line, 1, RSTART - 1)
156
+ match_text = substr(line, RSTART, RLENGTH)
157
+ post = substr(line, RSTART + RLENGTH)
158
+ # Insert before the closing ]
159
+ sub(/\][[:space:]]*$/, ", \"" plugin "\"]", match_text)
160
+ # If the match still ends in ] (no trailing whitespace stripped), fall through
161
+ print pre match_text post
162
+ done = 1
163
+ next
164
+ }
165
+ # Multi-line array opener: "plugin": [ (and not on same line closer)
166
+ !done && /"plugin"[[:space:]]*:[[:space:]]*\[[[:space:]]*$/ {
167
+ print
168
+ getline nextline
169
+ # Empty multi-line array: next line is just ]
170
+ if (nextline ~ /^[[:space:]]*\][[:space:]]*,?[[:space:]]*$/) {
171
+ print " \"" plugin "\""
172
+ print nextline
173
+ done = 1
174
+ next
175
+ }
176
+ # Non-empty multi-line: emit entries verbatim until we hit the ]
177
+ buffer[++bn] = nextline
178
+ while ((getline nextline) > 0) {
179
+ if (nextline ~ /^[[:space:]]*\][[:space:]]*,?[[:space:]]*$/) {
180
+ # Last existing entry may not have trailing comma; add one.
181
+ last = buffer[bn]
182
+ if (last !~ /,[[:space:]]*$/) {
183
+ sub(/[[:space:]]*$/, ",", buffer[bn])
184
+ }
185
+ for (i = 1; i <= bn; i++) print buffer[i]
186
+ # Insert new entry before the closing ]
187
+ # Determine indentation from first buffered entry.
188
+ match(buffer[1], /^[[:space:]]*/)
189
+ indent = substr(buffer[1], 1, RLENGTH)
190
+ print indent "\"" plugin "\""
191
+ print nextline
192
+ done = 1
193
+ bn = 0
194
+ break
195
+ }
196
+ buffer[++bn] = nextline
197
+ }
198
+ next
199
+ }
200
+ { print }
201
+ END {
202
+ if (!done) exit 2
203
+ }
204
+ ' "$CONFIG_FILE" > "$tmp"; then
205
+ mv "$tmp" "$CONFIG_FILE"
206
+ chmod 600 "$CONFIG_FILE"
207
+ ok "Added $PLUGIN_NAME to existing \"plugin\" array"
208
+ else
209
+ rm -f "$tmp"
210
+ warn "The \"plugin\" key exists but I could not safely determine where to insert the new entry."
211
+ EXISTING_PLUGIN_HINT=", ...your existing entries..."
212
+ print_manual_hint
213
+ fi
214
+ else
215
+ # Case B: no plugin key in file → inject it.
216
+ # We look for the first top-level "{" then insert `"plugin": [...]` on the next line.
217
+ # Safer: look for the first line containing just "{" optionally with whitespace.
218
+ tmp="$(mktemp "${TMPDIR:-/tmp}/chorus-opencode.XXXXXX")"
219
+ if awk -v plugin="$PLUGIN_NAME" '
220
+ BEGIN { inserted = 0 }
221
+ !inserted && /^[[:space:]]*\{[[:space:]]*$/ {
222
+ print
223
+ print " \"plugin\": [\"" plugin "\"],"
224
+ inserted = 1
225
+ next
226
+ }
227
+ { print }
228
+ END { if (!inserted) exit 2 }
229
+ ' "$CONFIG_FILE" > "$tmp"; then
230
+ mv "$tmp" "$CONFIG_FILE"
231
+ chmod 600 "$CONFIG_FILE"
232
+ ok "Added \"plugin\" field with $PLUGIN_NAME to $CONFIG_FILE"
233
+ else
234
+ rm -f "$tmp"
235
+ warn "Could not find a line with just \"{\" to inject the plugin array."
236
+ print_manual_hint
237
+ fi
238
+ fi
239
+ fi
240
+ fi
241
+
242
+ # ---------- step 3: reminders ----------
243
+ hdr "3/3 Final reminders"
244
+
245
+ # Environment check — read-only warning, don't export.
246
+ missing_env=""
247
+ if [ -z "${CHORUS_URL:-}" ]; then
248
+ missing_env="$missing_env CHORUS_URL"
249
+ fi
250
+ if [ -z "${CHORUS_API_KEY:-}" ]; then
251
+ missing_env="$missing_env CHORUS_API_KEY"
252
+ fi
253
+
254
+ if [ -n "$missing_env" ]; then
255
+ warn "The following environment variables are not set in this shell:$missing_env"
256
+ warn "The plugin reads them on OpenCode startup. Please export them in your shell rc:"
257
+ cat >&2 <<'HINT'
258
+
259
+ export CHORUS_URL="https://<your-chorus-instance>"
260
+ export CHORUS_API_KEY="cho_..."
261
+
262
+ HINT
263
+ warn "Then re-source your shell rc, or launch opencode from a shell where they are exported."
264
+ else
265
+ ok "CHORUS_URL and CHORUS_API_KEY are set in this shell"
266
+ fi
267
+
268
+ hdr "Done."
269
+ cat <<'NEXT'
270
+ Start OpenCode — Bun will fetch opencode-chorus on first launch:
271
+
272
+ opencode
273
+
274
+ Then in OpenCode, ask the agent:
275
+
276
+ check in to chorus
277
+
278
+ If the plugin fails to load, clear the package cache and retry:
279
+
280
+ rm -rf ~/.cache/opencode/packages/opencode-chorus@latest
281
+
282
+ To roll back this change:
283
+ NEXT
284
+ printf " mv %s %s\n\n" "$BACKUP_FILE" "$CONFIG_FILE"
@@ -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>" })
package/README.md CHANGED
@@ -15,7 +15,7 @@
15
15
 
16
16
  <p align="center"><a href="README.zh.md">中文</a></p>
17
17
 
18
- Chorus is an agent harness — the infrastructure that wraps around LLM agents to manage session lifecycle, task state, sub-agent orchestration, observability, and failure recovery. It lets multiple AI Agents (PM, Developer, Admin) and humans collaborate through the full workflow from requirements to delivery.
18
+ Chorus is an agent harness — the infrastructure that wraps around LLM agents to manage session lifecycle, task state, sub-agent orchestration, observability, and failure recovery. It lets multiple AI Agents (with fine-grained, configurable permissions) and humans collaborate through the full workflow from requirements to delivery.
19
19
 
20
20
  Inspired by the **[AI-DLC (AI-Driven Development Lifecycle)](https://aws.amazon.com/blogs/devops/ai-driven-development-life-cycle/)** methodology. Core philosophy: **Reversed Conversation** — AI proposes, humans verify.
21
21
 
@@ -35,6 +35,8 @@ creates analyzes drafts PRD codes & reviews closes
35
35
 
36
36
  ## What's New
37
37
 
38
+ **[v0.7.0](https://chorus-ai.dev/blog/chorus-v0.7.0-release/)** — Fine-grained agent permissions: 5 resources × 3 actions grid replaces the PM/Developer/Admin three-way choice, with presets + a Custom option for free combination.
39
+
38
40
  **[v0.6.7](https://chorus-ai.dev/blog/chorus-v0.6.7-release/)** — Chorus plugin for Codex CLI (one-command installer), workspace picker when one email belongs to multiple Companies, per-client connect guides.
39
41
 
40
42
  **[v0.6.6](https://chorus-ai.dev/blog/chorus-v0.6.6-release/)** — npm one-click install (`npx @chorus-aidlc/chorus`), document export (MD/PDF/Word), proposal revoke, faster agent checkin with work status at a glance.
@@ -153,6 +155,7 @@ A Cmd+K command palette for searching across all 6 entity types (Tasks, Ideas, P
153
155
  - **Task DAG** — Dependency modeling, cycle detection, and interactive visualization
154
156
  - **Kanban** — Real-time task flow with Worker badges and agent presence
155
157
  - **Multi-Agent Collaboration** — Claude Code Agent Teams (Swarm Mode) for parallel execution
158
+ - **Fine-Grained Agent Permissions** — 5 resources × 3 actions grid with preset + custom combinations ([details](docs/PERMISSIONS.md))
156
159
  - **Chorus Plugin** — Lifecycle hooks automate session create/close, heartbeats, and context injection
157
160
  - **Requirements Elaboration** — Structured Q&A rounds before proposal creation
158
161
  - **Proposal Approval Flow** — PM drafts, Admin approves, drafts materialize into real entities
@@ -178,7 +181,7 @@ A Cmd+K command palette for searching across all 6 entity types (Tasks, Ideas, P
178
181
  │ └───────────────────────────────────────────────────────────┘ │
179
182
  │ │
180
183
  │ ┌── API Layer ──────────────────────────────────────────────┐ │
181
- │ │ /api/mcp — MCP HTTP Streamable (50+ tools, role-based) │ │
184
+ │ │ /api/mcp — MCP Streaming (50+ tools, permission-gated) │ │
182
185
  │ │ /api/* — REST API (Web UI + SSE push) │ │
183
186
  │ └───────────────────────────────────────────────────────────┘ │
184
187
  │ │
@@ -191,8 +194,9 @@ A Cmd+K command palette for searching across all 6 entity types (Tasks, Ideas, P
191
194
  │ └───────────────────────────────────────────────────────────┘ │
192
195
  └──────────────────────────────────────────────────────────────────┘
193
196
  ↑ ↑ ↑ ↑
194
- PM Agent Developer Agent Admin Agent Human
195
- (LLM) (LLM) (LLM) (Browser)
197
+ Agent w/ Agent w/ Agent w/ Human
198
+ PM perms Developer perms Admin perms (Browser)
199
+ (LLM) (LLM) (LLM)
196
200
 
197
201
  ┌──────────▼──────────┐ ┌─────────────────────┐
198
202
  │ PostgreSQL + Prisma │ │ Redis (optional) │
@@ -290,7 +294,7 @@ The interactive installer provisions VPC, Aurora Serverless v2, ElastiCache Serv
290
294
 
291
295
  ### Connect AI Agents
292
296
 
293
- The fastest path is the in-app setup wizard: open the Web UI, go to **Settings → Setup Guide → Open setup guide**, and follow the step-by-step instructions for your client (Claude Code, Codex, OpenClaw, or other agents). The wizard creates the API key for you, shows the exact commands, and walks through verifying the connection.
297
+ The fastest path is the in-app setup wizard: open the Web UI, go to **Settings → Setup Guide → Open setup guide**, and follow the step-by-step instructions for your client (Claude Code, Codex, OpenCode, OpenClaw, or other agents). The wizard creates the API key for you, shows the exact commands, and walks through verifying the connection.
294
298
 
295
299
  If you'd rather read the full docs:
296
300
 
@@ -298,8 +302,11 @@ If you'd rather read the full docs:
298
302
  |--------|-------|
299
303
  | Claude Code | [CONNECT_CLAUDE_CODE.md](docs/CONNECT_CLAUDE_CODE.md) |
300
304
  | Codex CLI | [CONNECT_CODEX.md](docs/CONNECT_CODEX.md) |
305
+ | OpenCode † | [CONNECT_OPENCODE.md](docs/CONNECT_OPENCODE.md) |
301
306
  | Other MCP agents (Cursor, Continue, custom, …) | [CONNECT_OTHER_AGENTS.md](docs/CONNECT_OTHER_AGENTS.md) |
302
307
 
308
+ † OpenCode support is provided by the community-maintained [`opencode-chorus`](https://github.com/etnperlong/opencode-chorus) plugin (npm: [`opencode-chorus`](https://www.npmjs.com/package/opencode-chorus)), authored by [@etnperlong](https://github.com/etnperlong). Thanks!
309
+
303
310
  Create API Keys in the Web UI under **Settings → Agents → Create API Key**. Keys start with `cho_` and are shown only once.
304
311
 
305
312
  ![Create API Key](docs/images/create-key.png)
package/README.zh.md CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  <p align="center"><a href="README.md">English</a></p>
8
8
 
9
- Chorus 是一个 Agent Harness——包裹在 LLM 外面的基础设施层,负责管理会话生命周期、任务状态、子 Agent 编排、可观测性和故障恢复。它让多个 AI Agent(PM、Developer、Admin)和人类在同一平台上协作,完成从需求到交付的全流程。
9
+ Chorus 是一个 Agent Harness——包裹在 LLM 外面的基础设施层,负责管理会话生命周期、任务状态、子 Agent 编排、可观测性和故障恢复。它让多个具备细粒度权限配置的 AI Agent 和人类在同一平台上协作,完成从需求到交付的全流程。
10
10
 
11
11
  受 **[AI-DLC(AI-Driven Development Lifecycle)](https://aws.amazon.com/blogs/devops/ai-driven-development-life-cycle/)** 方法论启发。核心理念:**Reversed Conversation**——AI 提议,人类验证。
12
12
 
@@ -26,6 +26,8 @@ creates analyzes drafts PRD codes & reviews closes
26
26
 
27
27
  ## 最近更新
28
28
 
29
+ **[v0.7.0](https://chorus-ai.dev/zh/blog/chorus-v0.7.0-release/)** — 细粒度 Agent 权限:5 类资源 × 3 个动作组成的网格,取代 PM / Developer / Admin 三选一。保留原有预设,新增 Custom 选项自由组合。
30
+
29
31
  **[v0.6.7](https://chorus-ai.dev/zh/blog/chorus-v0.6.7-release/)** — Codex CLI 版 Chorus 插件(一条命令装完)、同一邮箱属于多个 Company 时的工作区选择器、每种客户端的接入文档。
30
32
 
31
33
  **[v0.6.6](https://chorus-ai.dev/zh/blog/chorus-v0.6.6-release/)** — npm 一键安装(`npx @chorus-aidlc/chorus`)、文档导出(MD/PDF/Word)、Proposal 撤回、优化 Agent Checkin 快速获取工作状态。
@@ -144,6 +146,7 @@ Cmd+K 命令面板,支持跨 6 种实体类型搜索。支持范围筛选(
144
146
  - **任务 DAG** — 依赖建模、环检测、交互式可视化
145
147
  - **Kanban** — 实时任务流转,Worker 徽标与 Agent Presence
146
148
  - **Multi-Agent 协作** — Claude Code Agent Teams (Swarm Mode) 并行执行
149
+ - **细粒度 Agent 权限** — 5 类资源 × 3 个动作组成的权限网格,支持预设 + 自定义组合([详细说明](docs/PERMISSIONS.md) · 英文)
147
150
  - **Chorus Plugin** — 生命周期钩子自动管理 Session 创建/关闭、心跳、上下文注入
148
151
  - **需求澄清** — Proposal 创建前的结构化问答轮次
149
152
  - **Proposal 审批流** — PM 起草,Admin 审批,草稿物化为正式实体
@@ -169,7 +172,7 @@ Cmd+K 命令面板,支持跨 6 种实体类型搜索。支持范围筛选(
169
172
  │ └───────────────────────────────────────────────────────────┘ │
170
173
  │ │
171
174
  │ ┌── API Layer ──────────────────────────────────────────────┐ │
172
- │ │ /api/mcp — MCP HTTP Streamable (50+ tools, role-based) │ │
175
+ │ │ /api/mcp — MCP Streaming (50+ tools, permission-gated) │ │
173
176
  │ │ /api/* — REST API (Web UI + SSE push) │ │
174
177
  │ └───────────────────────────────────────────────────────────┘ │
175
178
  │ │
@@ -182,8 +185,9 @@ Cmd+K 命令面板,支持跨 6 种实体类型搜索。支持范围筛选(
182
185
  │ └───────────────────────────────────────────────────────────┘ │
183
186
  └──────────────────────────────────────────────────────────────────┘
184
187
  ↑ ↑ ↑ ↑
185
- PM Agent Developer Agent Admin Agent Human
186
- (LLM) (LLM) (LLM) (Browser)
188
+ Agent w/ Agent w/ Agent w/ Human
189
+ PM perms Developer perms Admin perms (Browser)
190
+ (LLM) (LLM) (LLM)
187
191
 
188
192
  ┌──────────▼──────────┐ ┌─────────────────────┐
189
193
  │ PostgreSQL + Prisma │ │ Redis(可选) │
@@ -281,7 +285,7 @@ PGlite 在端口 5433 运行嵌入式 PostgreSQL。数据存储在 `.pglite/`,
281
285
 
282
286
  ### 连接 AI Agent
283
287
 
284
- 最快的方式是用应用内的 setup 向导:打开 Web UI,进入 **Settings → Setup Guide → 打开设置向导**,按照向导给出的分步指引接入自己的客户端(Claude Code、Codex、OpenClaw 或其他 agent)。向导会帮你创建 API Key、展示完整命令,并引导你验证连接。
288
+ 最快的方式是用应用内的 setup 向导:打开 Web UI,进入 **Settings → Setup Guide → 打开设置向导**,按照向导给出的分步指引接入自己的客户端(Claude Code、Codex、OpenCode、OpenClaw 或其他 agent)。向导会帮你创建 API Key、展示完整命令,并引导你验证连接。
285
289
 
286
290
  如果偏好文档:
287
291
 
@@ -289,8 +293,11 @@ PGlite 在端口 5433 运行嵌入式 PostgreSQL。数据存储在 `.pglite/`,
289
293
  |--------|---------|
290
294
  | Claude Code | [CONNECT_CLAUDE_CODE.zh.md](docs/CONNECT_CLAUDE_CODE.zh.md) |
291
295
  | Codex CLI | [CONNECT_CODEX.zh.md](docs/CONNECT_CODEX.zh.md) |
296
+ | OpenCode † | [CONNECT_OPENCODE.zh.md](docs/CONNECT_OPENCODE.zh.md) |
292
297
  | 其他 MCP agent(Cursor / Continue / 自研等) | [CONNECT_OTHER_AGENTS.zh.md](docs/CONNECT_OTHER_AGENTS.zh.md) |
293
298
 
299
+ † OpenCode 的接入由社区维护的 [`opencode-chorus`](https://github.com/etnperlong/opencode-chorus) 插件提供(npm: [`opencode-chorus`](https://www.npmjs.com/package/opencode-chorus)),作者 [@etnperlong](https://github.com/etnperlong),特此感谢!
300
+
294
301
  在 Web UI 的 **Settings → Agents → Create API Key** 创建 API Key。Key 以 `cho_` 开头,仅在创建时显示一次。
295
302
 
296
303
  ![Create API Key](docs/images/create-key.png)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chorus-aidlc/chorus",
3
- "version": "0.6.8",
3
+ "version": "0.7.1",
4
4
  "description": "The Agent Harness for AI-Human Collaboration — session lifecycle, task state, sub-agent orchestration, observability, and failure recovery",
5
5
  "homepage": "https://github.com/Chorus-AIDLC/Chorus",
6
6
  "repository": {
@@ -0,0 +1,2 @@
1
+ -- AlterTable
2
+ ALTER TABLE "Agent" ADD COLUMN "permissions" TEXT[] DEFAULT ARRAY[]::TEXT[];
@@ -63,6 +63,7 @@ model Agent {
63
63
  company Company @relation(fields: [companyUuid], references: [uuid])
64
64
  name String
65
65
  roles String[] @default(["developer"]) // pm | developer (multi-select)
66
+ permissions String[] @default([]) // Custom permission bits (resource:action); merged with role presets at auth time
66
67
  // Agent persona definition (Zero Context Injection)
67
68
  persona String? // Custom persona description (brief)
68
69
  systemPrompt String? // Full system prompt (optional, overrides default template)