@chorus-aidlc/chorus 0.7.0 → 0.8.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 (282) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-build-manifest.json +319 -319
  3. package/.next/standalone/.next/app-path-routes-manifest.json +40 -40
  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/server/app/(dashboard)/project-groups/[uuid]/page.js +1 -1
  7. package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page_client-reference-manifest.js +1 -1
  8. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page.js +1 -1
  9. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page_client-reference-manifest.js +1 -1
  10. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page.js +1 -1
  11. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page_client-reference-manifest.js +1 -1
  12. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js +2 -2
  13. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js.nft.json +1 -1
  14. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page_client-reference-manifest.js +1 -1
  15. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page.js +1 -1
  16. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page_client-reference-manifest.js +1 -1
  17. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page.js +2 -2
  18. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page_client-reference-manifest.js +1 -1
  19. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/[ideaUuid]/page.js +1 -1
  20. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/[ideaUuid]/page.js.nft.json +1 -1
  21. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/[ideaUuid]/page_client-reference-manifest.js +1 -1
  22. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/page.js +1 -1
  23. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/page.js.nft.json +1 -1
  24. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/page_client-reference-manifest.js +1 -1
  25. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js +2 -2
  26. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page_client-reference-manifest.js +1 -1
  28. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js +1 -1
  29. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page_client-reference-manifest.js +1 -1
  30. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page.js +2 -2
  31. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page_client-reference-manifest.js +1 -1
  32. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js +1 -1
  33. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js.nft.json +1 -1
  34. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page_client-reference-manifest.js +1 -1
  35. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js +1 -1
  36. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js.nft.json +1 -1
  37. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page_client-reference-manifest.js +1 -1
  38. package/.next/standalone/.next/server/app/(dashboard)/projects/page.js +2 -2
  39. package/.next/standalone/.next/server/app/(dashboard)/projects/page_client-reference-manifest.js +1 -1
  40. package/.next/standalone/.next/server/app/(dashboard)/settings/page.js +2 -2
  41. package/.next/standalone/.next/server/app/(dashboard)/settings/page.js.nft.json +1 -1
  42. package/.next/standalone/.next/server/app/(dashboard)/settings/page_client-reference-manifest.js +1 -1
  43. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  44. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  45. package/.next/standalone/.next/server/app/_not-found.rsc +6 -6
  46. package/.next/standalone/.next/server/app/admin/companies/[uuid]/page_client-reference-manifest.js +1 -1
  47. package/.next/standalone/.next/server/app/admin/companies/new/page_client-reference-manifest.js +1 -1
  48. package/.next/standalone/.next/server/app/admin/companies/new.html +1 -1
  49. package/.next/standalone/.next/server/app/admin/companies/new.rsc +6 -6
  50. package/.next/standalone/.next/server/app/admin/companies/page_client-reference-manifest.js +1 -1
  51. package/.next/standalone/.next/server/app/admin/companies.html +1 -1
  52. package/.next/standalone/.next/server/app/admin/companies.rsc +6 -6
  53. package/.next/standalone/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  54. package/.next/standalone/.next/server/app/admin.html +1 -1
  55. package/.next/standalone/.next/server/app/admin.rsc +6 -6
  56. package/.next/standalone/.next/server/app/api/admin/companies/[uuid]/route_client-reference-manifest.js +1 -1
  57. package/.next/standalone/.next/server/app/api/admin/companies/route_client-reference-manifest.js +1 -1
  58. package/.next/standalone/.next/server/app/api/admin/login/route_client-reference-manifest.js +1 -1
  59. package/.next/standalone/.next/server/app/api/admin/session/route_client-reference-manifest.js +1 -1
  60. package/.next/standalone/.next/server/app/api/agents/[uuid]/route_client-reference-manifest.js +1 -1
  61. package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route_client-reference-manifest.js +1 -1
  62. package/.next/standalone/.next/server/app/api/agents/route_client-reference-manifest.js +1 -1
  63. package/.next/standalone/.next/server/app/api/api-keys/[uuid]/route_client-reference-manifest.js +1 -1
  64. package/.next/standalone/.next/server/app/api/api-keys/route_client-reference-manifest.js +1 -1
  65. package/.next/standalone/.next/server/app/api/auth/callback/route_client-reference-manifest.js +1 -1
  66. package/.next/standalone/.next/server/app/api/auth/check-default/route_client-reference-manifest.js +1 -1
  67. package/.next/standalone/.next/server/app/api/auth/company-oidc/route_client-reference-manifest.js +1 -1
  68. package/.next/standalone/.next/server/app/api/auth/default-login/route_client-reference-manifest.js +1 -1
  69. package/.next/standalone/.next/server/app/api/auth/identify/route_client-reference-manifest.js +1 -1
  70. package/.next/standalone/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  71. package/.next/standalone/.next/server/app/api/auth/me/route_client-reference-manifest.js +1 -1
  72. package/.next/standalone/.next/server/app/api/auth/refresh/route_client-reference-manifest.js +1 -1
  73. package/.next/standalone/.next/server/app/api/auth/session/route_client-reference-manifest.js +1 -1
  74. package/.next/standalone/.next/server/app/api/auth/sync-token/route_client-reference-manifest.js +1 -1
  75. package/.next/standalone/.next/server/app/api/comments/route.js +1 -1
  76. package/.next/standalone/.next/server/app/api/comments/route_client-reference-manifest.js +1 -1
  77. package/.next/standalone/.next/server/app/api/documents/[uuid]/route.js +1 -1
  78. package/.next/standalone/.next/server/app/api/documents/[uuid]/route_client-reference-manifest.js +1 -1
  79. package/.next/standalone/.next/server/app/api/events/notifications/route_client-reference-manifest.js +1 -1
  80. package/.next/standalone/.next/server/app/api/events/route_client-reference-manifest.js +1 -1
  81. package/.next/standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  82. package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route_client-reference-manifest.js +1 -1
  83. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route_client-reference-manifest.js +1 -1
  84. package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route_client-reference-manifest.js +1 -1
  85. package/.next/standalone/.next/server/app/api/ideas/[uuid]/route_client-reference-manifest.js +1 -1
  86. package/.next/standalone/.next/server/app/api/mcp/route.js +3 -3
  87. package/.next/standalone/.next/server/app/api/mcp/route_client-reference-manifest.js +1 -1
  88. package/.next/standalone/.next/server/app/api/me/assignments/route.js +1 -1
  89. package/.next/standalone/.next/server/app/api/me/assignments/route.js.nft.json +1 -1
  90. package/.next/standalone/.next/server/app/api/me/assignments/route_client-reference-manifest.js +1 -1
  91. package/.next/standalone/.next/server/app/api/mentionables/route.js +1 -1
  92. package/.next/standalone/.next/server/app/api/mentionables/route_client-reference-manifest.js +1 -1
  93. package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route_client-reference-manifest.js +1 -1
  94. package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route_client-reference-manifest.js +1 -1
  95. package/.next/standalone/.next/server/app/api/notifications/preferences/route_client-reference-manifest.js +1 -1
  96. package/.next/standalone/.next/server/app/api/notifications/read-all/route_client-reference-manifest.js +1 -1
  97. package/.next/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  98. package/.next/standalone/.next/server/app/api/notifications/unread-count/route_client-reference-manifest.js +1 -1
  99. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/dashboard/route_client-reference-manifest.js +1 -1
  100. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/route_client-reference-manifest.js +1 -1
  101. package/.next/standalone/.next/server/app/api/project-groups/route_client-reference-manifest.js +1 -1
  102. package/.next/standalone/.next/server/app/api/projects/[uuid]/activity/route_client-reference-manifest.js +1 -1
  103. package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route.js +1 -1
  104. package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route.js.nft.json +1 -1
  105. package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route_client-reference-manifest.js +1 -1
  106. package/.next/standalone/.next/server/app/api/projects/[uuid]/documents/route.js +1 -1
  107. package/.next/standalone/.next/server/app/api/projects/[uuid]/documents/route_client-reference-manifest.js +1 -1
  108. package/.next/standalone/.next/server/app/api/projects/[uuid]/group/route_client-reference-manifest.js +1 -1
  109. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route_client-reference-manifest.js +1 -1
  110. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route_client-reference-manifest.js +1 -1
  111. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route.js +1 -1
  112. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route_client-reference-manifest.js +1 -1
  113. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route.js +1 -1
  114. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route_client-reference-manifest.js +1 -1
  115. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route.js +1 -1
  116. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route_client-reference-manifest.js +1 -1
  117. package/.next/standalone/.next/server/app/api/projects/[uuid]/route_client-reference-manifest.js +1 -1
  118. package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route.js +1 -1
  119. package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route_client-reference-manifest.js +1 -1
  120. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route_client-reference-manifest.js +1 -1
  121. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route_client-reference-manifest.js +1 -1
  122. package/.next/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  123. package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route.js +1 -1
  124. package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route_client-reference-manifest.js +1 -1
  125. package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route.js +1 -1
  126. package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route_client-reference-manifest.js +1 -1
  127. package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route.js +1 -1
  128. package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route_client-reference-manifest.js +1 -1
  129. package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route.js +1 -1
  130. package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route_client-reference-manifest.js +1 -1
  131. package/.next/standalone/.next/server/app/api/proposals/[uuid]/route.js +1 -1
  132. package/.next/standalone/.next/server/app/api/proposals/[uuid]/route_client-reference-manifest.js +1 -1
  133. package/.next/standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  134. package/.next/standalone/.next/server/app/api/sessions/[uuid]/route_client-reference-manifest.js +1 -1
  135. package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route_client-reference-manifest.js +1 -1
  136. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route_client-reference-manifest.js +1 -1
  137. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route_client-reference-manifest.js +1 -1
  138. package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route_client-reference-manifest.js +1 -1
  139. package/.next/standalone/.next/server/app/api/tasks/[uuid]/route_client-reference-manifest.js +1 -1
  140. package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route_client-reference-manifest.js +1 -1
  141. package/.next/standalone/.next/server/app/index.html +1 -1
  142. package/.next/standalone/.next/server/app/index.rsc +6 -6
  143. package/.next/standalone/.next/server/app/login/admin/page_client-reference-manifest.js +1 -1
  144. package/.next/standalone/.next/server/app/login/admin.html +1 -1
  145. package/.next/standalone/.next/server/app/login/admin.rsc +6 -6
  146. package/.next/standalone/.next/server/app/login/callback/page_client-reference-manifest.js +1 -1
  147. package/.next/standalone/.next/server/app/login/callback.html +1 -1
  148. package/.next/standalone/.next/server/app/login/callback.rsc +6 -6
  149. package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  150. package/.next/standalone/.next/server/app/login/pick-workspace/page_client-reference-manifest.js +1 -1
  151. package/.next/standalone/.next/server/app/login/pick-workspace.html +1 -1
  152. package/.next/standalone/.next/server/app/login/pick-workspace.rsc +6 -6
  153. package/.next/standalone/.next/server/app/login/silent-refresh/page_client-reference-manifest.js +1 -1
  154. package/.next/standalone/.next/server/app/login/silent-refresh.html +1 -1
  155. package/.next/standalone/.next/server/app/login/silent-refresh.rsc +6 -6
  156. package/.next/standalone/.next/server/app/login.html +1 -1
  157. package/.next/standalone/.next/server/app/login.rsc +6 -6
  158. package/.next/standalone/.next/server/app/onboarding/page.js +4 -3
  159. package/.next/standalone/.next/server/app/onboarding/page.js.nft.json +1 -1
  160. package/.next/standalone/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
  161. package/.next/standalone/.next/server/app/onboarding.html +1 -1
  162. package/.next/standalone/.next/server/app/onboarding.rsc +7 -7
  163. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  164. package/.next/standalone/.next/server/app/projects.html +1 -1
  165. package/.next/standalone/.next/server/app/projects.rsc +7 -7
  166. package/.next/standalone/.next/server/app/settings.html +1 -1
  167. package/.next/standalone/.next/server/app/settings.rsc +8 -8
  168. package/.next/standalone/.next/server/app-paths-manifest.json +40 -40
  169. package/.next/standalone/.next/server/chunks/1002.js +1 -1
  170. package/.next/standalone/.next/server/chunks/1596.js +2 -2
  171. package/.next/standalone/.next/server/chunks/1673.js +1 -0
  172. package/.next/standalone/.next/server/chunks/1871.js +1 -1
  173. package/.next/standalone/.next/server/chunks/2570.js +1 -1
  174. package/.next/standalone/.next/server/chunks/2618.js +1 -1
  175. package/.next/standalone/.next/server/chunks/2961.js +1 -1
  176. package/.next/standalone/.next/server/chunks/{2675.js → 3139.js} +1 -1
  177. package/.next/standalone/.next/server/chunks/3405.js +1 -0
  178. package/.next/standalone/.next/server/chunks/4294.js +1 -0
  179. package/.next/standalone/.next/server/chunks/{8251.js → 5044.js} +1 -1
  180. package/.next/standalone/.next/server/chunks/6113.js +1 -1
  181. package/.next/standalone/.next/server/chunks/6207.js +1 -1
  182. package/.next/standalone/.next/server/chunks/6836.js +1 -0
  183. package/.next/standalone/.next/server/chunks/7368.js +1 -1
  184. package/.next/standalone/.next/server/chunks/8322.js +2 -2
  185. package/.next/standalone/.next/server/chunks/8881.js +1 -1
  186. package/.next/standalone/.next/server/chunks/920.js +1 -1
  187. package/.next/standalone/.next/server/chunks/937.js +2 -2
  188. package/.next/standalone/.next/server/chunks/9508.js +2 -2
  189. package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
  190. package/.next/standalone/.next/server/middleware-manifest.json +5 -5
  191. package/.next/standalone/.next/server/next-font-manifest.js +1 -1
  192. package/.next/standalone/.next/server/next-font-manifest.json +1 -1
  193. package/.next/standalone/.next/server/pages/404.html +1 -1
  194. package/.next/standalone/.next/server/pages/500.html +1 -1
  195. package/.next/standalone/.next/server/pages-manifest.json +1 -1
  196. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  197. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  198. package/.next/standalone/.next/static/chunks/10739-a14d0dc7271f247e.js +1 -0
  199. package/.next/standalone/.next/static/chunks/19126-f1bc396538752bce.js +1 -0
  200. package/.next/standalone/.next/static/chunks/{53664-a2be2eaacce03f0f.js → 23588-66d80958224a8544.js} +1 -1
  201. package/.next/standalone/.next/static/chunks/32190-a110356fb68a4333.js +1 -0
  202. package/.next/standalone/.next/static/chunks/{4860.d626399834b496e5.js → 4860.15c9ae5b6268c6fc.js} +1 -1
  203. package/.next/standalone/.next/static/chunks/65371-d3686d82abca6495.js +1 -0
  204. package/.next/standalone/.next/static/chunks/70317-49653c6dce23f1d9.js +1 -0
  205. package/.next/standalone/.next/static/chunks/8731-7869a6ed671c63a3.js +1 -0
  206. package/.next/standalone/.next/static/chunks/{99373.aedaca88297c6d8b.js → 99373.9939e11f5b4e0615.js} +1 -1
  207. package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-719f0815a37f19be.js +1 -0
  208. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-bc8c3c0362de377c.js +1 -0
  209. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-c1c4b5798c494341.js +1 -0
  210. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-29ac4172940780e0.js +1 -0
  211. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/ideas/[ideaUuid]/{page-2d820769aa7bcaf6.js → page-e59232665c3a0412.js} +1 -1
  212. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/ideas/{page-dec0e71221d77928.js → page-9b1e02b5e2cfb410.js} +1 -1
  213. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-567e98e9e90a7ef1.js +1 -0
  214. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/{page-bc66567cb9c40bf0.js → page-31f4ffd9778a39ed.js} +1 -1
  215. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/{page-86cfeb421fa97830.js → page-8eded17e1e44522d.js} +1 -1
  216. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/{page-7fe70579023330da.js → page-e5c99f2020b904f5.js} +1 -1
  217. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/{page-8c51993bb3866a55.js → page-7947010e9684fbcf.js} +1 -1
  218. package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-a01b45dbe80aeecf.js +1 -0
  219. package/.next/standalone/.next/static/chunks/app/{layout-22f1a931323bbb60.js → layout-482dee7dace72c88.js} +1 -1
  220. package/.next/standalone/.next/static/chunks/app/onboarding/page-ac0593c045c64013.js +1 -0
  221. package/.next/standalone/.next/static/chunks/{webpack-da41e6b9f3fe2f48.js → webpack-1bb984dd0934fa96.js} +1 -1
  222. package/.next/standalone/.next/static/css/84edd78de243cde6.css +1 -0
  223. package/.next/standalone/.next/static/css/{ca9796ac54f96058.css → a577d38ad6d7491b.css} +1 -1
  224. package/.next/standalone/.next/static/media/0f1bdadaf30e2d5f-s.woff2 +0 -0
  225. package/.next/standalone/.next/static/media/22a5144ee8d83bca-s.p.woff2 +0 -0
  226. package/.next/standalone/.next/static/media/2c34d62a75506231-s.woff2 +0 -0
  227. package/.next/standalone/.next/static/media/601f5c280d60caca-s.woff2 +0 -0
  228. package/.next/standalone/.next/static/media/9766a7e9e2e0ad5a-s.woff2 +0 -0
  229. package/.next/standalone/.next/static/media/a115172161b307bb-s.woff2 +0 -0
  230. package/.next/standalone/.next/static/media/aa016aab0e6d1295-s.woff2 +0 -0
  231. package/.next/standalone/.next/static/media/b66cf8e69499582a-s.woff2 +0 -0
  232. package/.next/standalone/.next/static/media/d100b2a099e34044-s.woff2 +0 -0
  233. package/.next/standalone/.next/static/media/f5271587012faf78-s.p.woff2 +0 -0
  234. package/.next/standalone/.next/static/media/f639721981034f88-s.woff2 +0 -0
  235. package/.next/standalone/package.json +1 -1
  236. package/.next/standalone/public/chorus-plugin/.claude-plugin/plugin.json +7 -1
  237. package/.next/standalone/public/chorus-plugin/agents/proposal-reviewer.md +1 -1
  238. package/.next/standalone/public/chorus-plugin/agents/task-reviewer.md +1 -1
  239. package/.next/standalone/public/chorus-plugin/bin/on-post-verify-task.sh +190 -0
  240. package/.next/standalone/public/chorus-plugin/bin/on-session-start.sh +58 -0
  241. package/.next/standalone/public/chorus-plugin/bin/test-syntax.sh +1 -0
  242. package/.next/standalone/public/chorus-plugin/bin/tests/test-on-post-verify-task.sh +365 -0
  243. package/.next/standalone/public/chorus-plugin/hooks/hooks.json +9 -0
  244. package/.next/standalone/public/chorus-plugin/skills/chorus/SKILL.md +2 -1
  245. package/.next/standalone/public/chorus-plugin/skills/develop/SKILL.md +9 -1
  246. package/.next/standalone/public/chorus-plugin/skills/idea/SKILL.md +1 -1
  247. package/.next/standalone/public/chorus-plugin/skills/openspec-aware/SKILL.md +436 -0
  248. package/.next/standalone/public/chorus-plugin/skills/proposal/SKILL.md +11 -1
  249. package/.next/standalone/public/chorus-plugin/skills/quick-dev/SKILL.md +1 -1
  250. package/.next/standalone/public/chorus-plugin/skills/review/SKILL.md +1 -1
  251. package/.next/standalone/public/chorus-plugin/skills/yolo/SKILL.md +26 -4
  252. package/.next/standalone/public/install-opencode.sh +284 -0
  253. package/README.md +44 -10
  254. package/README.zh.md +24 -10
  255. package/chorus.mjs +56 -12
  256. package/package.json +1 -1
  257. package/.next/standalone/.next/server/chunks/1639.js +0 -1
  258. package/.next/standalone/.next/server/chunks/3300.js +0 -1
  259. package/.next/standalone/.next/server/chunks/8584.js +0 -1
  260. package/.next/standalone/.next/server/chunks/9051.js +0 -1
  261. package/.next/standalone/.next/static/chunks/10739-5c185aa0432f5d56.js +0 -1
  262. package/.next/standalone/.next/static/chunks/19126-858a24cab6fd338a.js +0 -1
  263. package/.next/standalone/.next/static/chunks/29445-04c4ab36da85b7da.js +0 -1
  264. package/.next/standalone/.next/static/chunks/39611-cc227784ed679a6d.js +0 -1
  265. package/.next/standalone/.next/static/chunks/96919-8cbf6310c703e7af.js +0 -1
  266. package/.next/standalone/.next/static/chunks/99513-24849ff68a8098e1.js +0 -1
  267. package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-acddb9c84f5d1607.js +0 -1
  268. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-b4c6141dd26cc506.js +0 -1
  269. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-4bf7bff8d68509f9.js +0 -1
  270. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-37a0cea0ba40c31b.js +0 -1
  271. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-355321010dd82e56.js +0 -1
  272. package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-8db25385236a9bbf.js +0 -1
  273. package/.next/standalone/.next/static/chunks/app/onboarding/page-e9409a2935c3c480.js +0 -1
  274. package/.next/standalone/.next/static/css/de70bee13400563f.css +0 -1
  275. package/.next/standalone/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
  276. package/.next/standalone/.next/static/media/747892c23ea88013-s.woff2 +0 -0
  277. package/.next/standalone/.next/static/media/8d697b304b401681-s.woff2 +0 -0
  278. package/.next/standalone/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
  279. package/.next/standalone/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
  280. package/.next/standalone/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
  281. /package/.next/standalone/.next/static/{CQcM9hNpa5m8P_K5qveuk → CqUAJ6h-gVfCxU6FvVekP}/_buildManifest.js +0 -0
  282. /package/.next/standalone/.next/static/{CQcM9hNpa5m8P_K5qveuk → CqUAJ6h-gVfCxU6FvVekP}/_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"
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
 
@@ -26,15 +26,20 @@ Inspired by the **[AI-DLC (AI-Driven Development Lifecycle)](https://aws.amazon.
26
26
  ```
27
27
  Idea ──> Proposal ──> [Document + Task DAG] ──> Execute ──> Verify ──> Done
28
28
  ^ ^ ^ ^ ^ ^
29
- Human PM Agent PM Agent Dev Agent Admin Admin
30
- creates analyzes drafts PRD codes & reviews closes
31
- & plans & tasks reports & verifies
29
+ Human idea:write proposal:write task:write *:admin *:admin
30
+ creates + elaborate + drafts + reports + verifies + closes
32
31
  ```
33
32
 
33
+ The labels under each stage are the **permissions** an actor needs at that stage — granted to a human, an Agent (preset or Custom), or both. There are no fixed roles; any combination of the 5 × 3 permission matrix is possible. See [`docs/PERMISSIONS.md`](docs/PERMISSIONS.md).
34
+
34
35
  ---
35
36
 
36
37
  ## What's New
37
38
 
39
+ **[v0.8.0](https://chorus-ai.dev/blog/chorus-v0.8.0-release/)** — OpenSpec-aware mode (Claude Code): auto-activates when an `openspec/` directory and the `openspec` CLI are both present, adds `/opsx/{explore,propose,apply,archive}` and a post-verify archive-trigger hook.
40
+
41
+ **[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.
42
+
38
43
  **[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
44
 
40
45
  **[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 +158,7 @@ A Cmd+K command palette for searching across all 6 entity types (Tasks, Ideas, P
153
158
  - **Task DAG** — Dependency modeling, cycle detection, and interactive visualization
154
159
  - **Kanban** — Real-time task flow with Worker badges and agent presence
155
160
  - **Multi-Agent Collaboration** — Claude Code Agent Teams (Swarm Mode) for parallel execution
161
+ - **Fine-Grained Agent Permissions** — 5 resources × 3 actions grid with preset + custom combinations ([details](docs/PERMISSIONS.md))
156
162
  - **Chorus Plugin** — Lifecycle hooks automate session create/close, heartbeats, and context injection
157
163
  - **Requirements Elaboration** — Structured Q&A rounds before proposal creation
158
164
  - **Proposal Approval Flow** — PM drafts, Admin approves, drafts materialize into real entities
@@ -178,7 +184,7 @@ A Cmd+K command palette for searching across all 6 entity types (Tasks, Ideas, P
178
184
  │ └───────────────────────────────────────────────────────────┘ │
179
185
  │ │
180
186
  │ ┌── API Layer ──────────────────────────────────────────────┐ │
181
- │ │ /api/mcp — MCP HTTP Streamable (50+ tools, role-based) │ │
187
+ │ │ /api/mcp — MCP Streaming (50+ tools, permission-gated) │ │
182
188
  │ │ /api/* — REST API (Web UI + SSE push) │ │
183
189
  │ └───────────────────────────────────────────────────────────┘ │
184
190
  │ │
@@ -191,8 +197,10 @@ A Cmd+K command palette for searching across all 6 entity types (Tasks, Ideas, P
191
197
  │ └───────────────────────────────────────────────────────────┘ │
192
198
  └──────────────────────────────────────────────────────────────────┘
193
199
  ↑ ↑ ↑ ↑
194
- PM Agent Developer Agent Admin Agent Human
195
- (LLM) (LLM) (LLM) (Browser)
200
+ Agent w/ Agent w/ Agent w/ Human
201
+ idea+proposal task:write *:admin perms (Browser)
202
+ :write perms perms (proxy approval)
203
+ (LLM) (LLM) (LLM)
196
204
 
197
205
  ┌──────────▼──────────┐ ┌─────────────────────┐
198
206
  │ PostgreSQL + Prisma │ │ Redis (optional) │
@@ -290,7 +298,7 @@ The interactive installer provisions VPC, Aurora Serverless v2, ElastiCache Serv
290
298
 
291
299
  ### Connect AI Agents
292
300
 
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.
301
+ 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
302
 
295
303
  If you'd rather read the full docs:
296
304
 
@@ -298,8 +306,11 @@ If you'd rather read the full docs:
298
306
  |--------|-------|
299
307
  | Claude Code | [CONNECT_CLAUDE_CODE.md](docs/CONNECT_CLAUDE_CODE.md) |
300
308
  | Codex CLI | [CONNECT_CODEX.md](docs/CONNECT_CODEX.md) |
309
+ | OpenCode † | [CONNECT_OPENCODE.md](docs/CONNECT_OPENCODE.md) |
301
310
  | Other MCP agents (Cursor, Continue, custom, …) | [CONNECT_OTHER_AGENTS.md](docs/CONNECT_OTHER_AGENTS.md) |
302
311
 
312
+ † 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!
313
+
303
314
  Create API Keys in the Web UI under **Settings → Agents → Create API Key**. Keys start with `cho_` and are shown only once.
304
315
 
305
316
  ![Create API Key](docs/images/create-key.png)
@@ -310,8 +321,29 @@ Create API Keys in the Web UI under **Settings → Agents → Create API Key**.
310
321
 
311
322
  | Method | Location | Use Case |
312
323
  |--------|----------|----------|
313
- | **Plugin-embedded** | `public/chorus-plugin/skills/chorus/` | Claude Code + Plugin, automated Sessions |
314
- | **Standalone** | `public/skill/` (served at `/skill/`) | Any Agent, manual Session management |
324
+ | **Plugin-embedded (Claude Code)** | `public/chorus-plugin/skills/` | Claude Code + Chorus plugin, automated Sessions and lifecycle hooks |
325
+ | **Plugin-embedded (Codex CLI)** | `plugins/chorus/skills/` | Codex CLI + Chorus plugin, ported skills with `$`-prefixed slash commands |
326
+ | **Standalone** | `public/skill/` (served at `/skill/`) | Any other MCP-capable Agent (Cursor, Continue, custom), manual Session management |
327
+
328
+ ### OpenSpec mode (opt-in, plugin 0.8.1+)
329
+
330
+ PM agents that have the [OpenSpec](https://github.com/Fission-AI/OpenSpec)
331
+ CLI installed can author proposals in a structured `proposal.md` +
332
+ `design.md` + `specs/<capability>/spec.md` layout. Local files are the
333
+ working copy and Chorus `documentDrafts` are the mirror; reviewers see a
334
+ predictable shape (`## ADDED Requirements`, `### Requirement:`,
335
+ `#### Scenario:`) instead of free-form Markdown. A PostToolUse hook on
336
+ `chorus_admin_verify_task` injects an `openspec archive <slug>` reminder
337
+ when the last task of an OpenSpec idea is verified, so finalized specs
338
+ are merged into the long-term spec set right after sign-off. The mode is
339
+ strictly opt-in: when `openspec` is not installed, behavior is unchanged.
340
+ Master switch on Claude Code is `enableOpenSpec` (plugin userConfig,
341
+ default `true`); both clients also honor `CHORUS_OPENSPEC_MODE=off`. No
342
+ new MCP tools or schema changes ship in this mode; the canonical skill
343
+ reuses the existing `chorus_pm_*` draft and document tools, with mirror
344
+ calls routed through the `chorus-api.sh` wrapper to keep multi-thousand-
345
+ line markdown out of LLM context. See
346
+ [OPENSPEC_MODE.md](docs/OPENSPEC_MODE.md) for the full guide.
315
347
 
316
348
  ---
317
349
 
@@ -322,7 +354,9 @@ Create API Keys in the Web UI under **Settings → Agents → Create API Key**.
322
354
  | [PRD](docs/PRD_Chorus.md) | Product Requirements Document |
323
355
  | [Architecture](docs/ARCHITECTURE.md) | Technical Architecture Document |
324
356
  | [MCP Tools](docs/MCP_TOOLS.md) | MCP Tools Reference |
357
+ | [Permissions](docs/PERMISSIONS.md) | Agent permission model (5 × 3 matrix, presets, Custom mode) |
325
358
  | [Chorus Plugin](docs/chorus-plugin.md) | Plugin Design & Hook Documentation |
359
+ | [OpenSpec Mode](docs/OPENSPEC_MODE.md) | Opt-in OpenSpec authoring mode for PM agents (Plugin 0.8.1+) |
326
360
  | [Search](docs/SEARCH.md) | Global Search Technical Design |
327
361
  | [AI-DLC Gap Analysis](docs/AIDLC_GAP_ANALYSIS.md) | AI-DLC Methodology Gap Analysis |
328
362
  | [AIG Implementation Plan](docs/CHORUS_AIG_PLAN.md) | Agent transparency roadmap |
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
 
@@ -17,15 +17,20 @@ Chorus 是一个 Agent Harness——包裹在 LLM 外面的基础设施层,负
17
17
  ```
18
18
  Idea ──> Proposal ──> [Document + Task DAG] ──> Execute ──> Verify ──> Done
19
19
  ^ ^ ^ ^ ^ ^
20
- Human PM Agent PM Agent Dev Agent Admin Admin
21
- creates analyzes drafts PRD codes & reviews closes
22
- & plans & tasks reports & verifies
20
+ 人类 idea:write proposal:write task:write *:admin *:admin
21
+ 提出 + 需求澄清 + 起草 PRD/任务 + 报告进度 + 验收 + 关闭
23
22
  ```
24
23
 
24
+ 每个阶段下方标的是「执行该阶段所需的权限」,可以由人类、Agent(预设或 Custom)或两者持有。没有固定角色,5 × 3 权限矩阵的任意组合都合法,详见 [`docs/PERMISSIONS.md`](docs/PERMISSIONS.md)(英文)。
25
+
25
26
  ---
26
27
 
27
28
  ## 最近更新
28
29
 
30
+ **[v0.8.0](https://chorus-ai.dev/zh/blog/chorus-v0.8.0-release/)** — OpenSpec-aware 模式(仅 Claude Code):当仓库下同时存在 `openspec/` 目录和 `openspec` CLI 时自动启用,新增 `/opsx/{explore,propose,apply,archive}` 与 task verify 后的 archive-trigger 钩子。
31
+
32
+ **[v0.7.0](https://chorus-ai.dev/zh/blog/chorus-v0.7.0-release/)** — 细粒度 Agent 权限:5 类资源 × 3 个动作组成的网格,取代 PM / Developer / Admin 三选一。保留原有预设,新增 Custom 选项自由组合。
33
+
29
34
  **[v0.6.7](https://chorus-ai.dev/zh/blog/chorus-v0.6.7-release/)** — Codex CLI 版 Chorus 插件(一条命令装完)、同一邮箱属于多个 Company 时的工作区选择器、每种客户端的接入文档。
30
35
 
31
36
  **[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 +149,7 @@ Cmd+K 命令面板,支持跨 6 种实体类型搜索。支持范围筛选(
144
149
  - **任务 DAG** — 依赖建模、环检测、交互式可视化
145
150
  - **Kanban** — 实时任务流转,Worker 徽标与 Agent Presence
146
151
  - **Multi-Agent 协作** — Claude Code Agent Teams (Swarm Mode) 并行执行
152
+ - **细粒度 Agent 权限** — 5 类资源 × 3 个动作组成的权限网格,支持预设 + 自定义组合([详细说明](docs/PERMISSIONS.md) · 英文)
147
153
  - **Chorus Plugin** — 生命周期钩子自动管理 Session 创建/关闭、心跳、上下文注入
148
154
  - **需求澄清** — Proposal 创建前的结构化问答轮次
149
155
  - **Proposal 审批流** — PM 起草,Admin 审批,草稿物化为正式实体
@@ -169,7 +175,7 @@ Cmd+K 命令面板,支持跨 6 种实体类型搜索。支持范围筛选(
169
175
  │ └───────────────────────────────────────────────────────────┘ │
170
176
  │ │
171
177
  │ ┌── API Layer ──────────────────────────────────────────────┐ │
172
- │ │ /api/mcp — MCP HTTP Streamable (50+ tools, role-based) │ │
178
+ │ │ /api/mcp — MCP Streaming (50+ tools, permission-gated) │ │
173
179
  │ │ /api/* — REST API (Web UI + SSE push) │ │
174
180
  │ └───────────────────────────────────────────────────────────┘ │
175
181
  │ │
@@ -182,8 +188,10 @@ Cmd+K 命令面板,支持跨 6 种实体类型搜索。支持范围筛选(
182
188
  │ └───────────────────────────────────────────────────────────┘ │
183
189
  └──────────────────────────────────────────────────────────────────┘
184
190
  ↑ ↑ ↑ ↑
185
- PM Agent Developer Agent Admin Agent Human
186
- (LLM) (LLM) (LLM) (Browser)
191
+ Agent w/ Agent w/ Agent w/ 人类
192
+ idea+proposal task:write *:admin perms (浏览器)
193
+ :write perms perms (代理人类审批)
194
+ (LLM) (LLM) (LLM)
187
195
 
188
196
  ┌──────────▼──────────┐ ┌─────────────────────┐
189
197
  │ PostgreSQL + Prisma │ │ Redis(可选) │
@@ -281,7 +289,7 @@ PGlite 在端口 5433 运行嵌入式 PostgreSQL。数据存储在 `.pglite/`,
281
289
 
282
290
  ### 连接 AI Agent
283
291
 
284
- 最快的方式是用应用内的 setup 向导:打开 Web UI,进入 **Settings → Setup Guide → 打开设置向导**,按照向导给出的分步指引接入自己的客户端(Claude Code、Codex、OpenClaw 或其他 agent)。向导会帮你创建 API Key、展示完整命令,并引导你验证连接。
292
+ 最快的方式是用应用内的 setup 向导:打开 Web UI,进入 **Settings → Setup Guide → 打开设置向导**,按照向导给出的分步指引接入自己的客户端(Claude Code、Codex、OpenCode、OpenClaw 或其他 agent)。向导会帮你创建 API Key、展示完整命令,并引导你验证连接。
285
293
 
286
294
  如果偏好文档:
287
295
 
@@ -289,8 +297,11 @@ PGlite 在端口 5433 运行嵌入式 PostgreSQL。数据存储在 `.pglite/`,
289
297
  |--------|---------|
290
298
  | Claude Code | [CONNECT_CLAUDE_CODE.zh.md](docs/CONNECT_CLAUDE_CODE.zh.md) |
291
299
  | Codex CLI | [CONNECT_CODEX.zh.md](docs/CONNECT_CODEX.zh.md) |
300
+ | OpenCode † | [CONNECT_OPENCODE.zh.md](docs/CONNECT_OPENCODE.zh.md) |
292
301
  | 其他 MCP agent(Cursor / Continue / 自研等) | [CONNECT_OTHER_AGENTS.zh.md](docs/CONNECT_OTHER_AGENTS.zh.md) |
293
302
 
303
+ † OpenCode 的接入由社区维护的 [`opencode-chorus`](https://github.com/etnperlong/opencode-chorus) 插件提供(npm: [`opencode-chorus`](https://www.npmjs.com/package/opencode-chorus)),作者 [@etnperlong](https://github.com/etnperlong),特此感谢!
304
+
294
305
  在 Web UI 的 **Settings → Agents → Create API Key** 创建 API Key。Key 以 `cho_` 开头,仅在创建时显示一次。
295
306
 
296
307
  ![Create API Key](docs/images/create-key.png)
@@ -301,8 +312,9 @@ PGlite 在端口 5433 运行嵌入式 PostgreSQL。数据存储在 `.pglite/`,
301
312
 
302
313
  | 方式 | 位置 | 适用场景 |
303
314
  |------|------|---------|
304
- | **Plugin 内嵌** | `public/chorus-plugin/skills/chorus/` | Claude Code + Plugin,Session 自动化 |
305
- | **独立分发** | `public/skill/`(`/skill/` 路径静态托管)| 任何 Agent,手动 Session 管理 |
315
+ | **Plugin 内嵌(Claude Code)** | `public/chorus-plugin/skills/` | Claude Code + Chorus 插件,Session 自动化与生命周期 hook |
316
+ | **Plugin 内嵌(Codex CLI)** | `plugins/chorus/skills/` | Codex CLI + Chorus 插件,移植版技能(`$` 前缀斜杠命令)|
317
+ | **独立分发** | `public/skill/`(`/skill/` 路径静态托管)| 其他 MCP 客户端(Cursor / Continue / 自研),手动 Session 管理 |
306
318
 
307
319
  ---
308
320
 
@@ -313,7 +325,9 @@ PGlite 在端口 5433 运行嵌入式 PostgreSQL。数据存储在 `.pglite/`,
313
325
  | [PRD](docs/PRD_Chorus.md) | 产品需求文档 |
314
326
  | [Architecture](docs/ARCHITECTURE.md) | 技术架构文档 |
315
327
  | [MCP Tools](docs/MCP_TOOLS.md) | MCP 工具参考 |
328
+ | [Permissions](docs/PERMISSIONS.md) | Agent 权限模型(5 × 3 矩阵 + 预设 + Custom) |
316
329
  | [Chorus Plugin](docs/chorus-plugin.md) | 插件设计与 Hook 说明 |
330
+ | [OpenSpec Mode](docs/OPENSPEC_MODE.md) | OpenSpec 模式(Plugin 0.8.1+,opt-in) |
317
331
  | [Search](docs/SEARCH.md) | 全局搜索技术设计 |
318
332
  | [AI-DLC Gap Analysis](docs/AIDLC_GAP_ANALYSIS.md) | AI-DLC 方法论差距分析 |
319
333
  | [AIG Implementation Plan](docs/CHORUS_AIG_PLAN.md) | Agent 透明度路线图 |
package/chorus.mjs CHANGED
@@ -12,7 +12,7 @@ import {
12
12
  import { createConnection } from "node:net";
13
13
  import { homedir } from "node:os";
14
14
  import { dirname, join, resolve } from "node:path";
15
- import { fileURLToPath } from "node:url";
15
+ import { fileURLToPath, pathToFileURL } from "node:url";
16
16
 
17
17
  const __dirname = dirname(fileURLToPath(import.meta.url));
18
18
 
@@ -71,11 +71,13 @@ OPTIONS
71
71
  -d, --data-dir <path> Data directory for PGlite (default: ~/.chorus-data, env: CHORUS_DATA_DIR)
72
72
  --hostname <host> Bind address (default: 0.0.0.0)
73
73
  --pglite-port <port> Embedded PGlite port (default: 5433, env: CHORUS_PGLITE_PORT)
74
+ --use-pglite[=BOOL] Use embedded PGlite (default: true; pass =false for external Postgres)
74
75
  -h, --help Show this help message
75
76
  -v, --version Show version number
76
77
 
77
78
  ENVIRONMENT VARIABLES
78
- DATABASE_URL External PostgreSQL URL (skips embedded PGlite)
79
+ CHORUS_USE_PGLITE Set to "0" to disable embedded PGlite (default: enabled)
80
+ DATABASE_URL External PostgreSQL URL (required when --use-pglite=false)
79
81
  REDIS_URL Redis URL for multi-instance pub/sub
80
82
  DEFAULT_USER Auto-create login user email
81
83
  DEFAULT_PASSWORD Auto-create login user password
@@ -83,10 +85,10 @@ ENVIRONMENT VARIABLES
83
85
  COOKIE_SECURE Set to "true" for HTTPS deployments
84
86
 
85
87
  EXAMPLES
86
- chorus # Start with defaults
88
+ chorus # Embedded PGlite (default)
87
89
  chorus --port 3000 # Custom port
88
90
  chorus --data-dir /var/lib/chorus # Custom data directory
89
- DATABASE_URL=postgres://... chorus # Use external PostgreSQL
91
+ DATABASE_URL=postgres://... chorus --use-pglite=false # External PostgreSQL
90
92
  `);
91
93
  process.exit(0);
92
94
  }
@@ -158,14 +160,40 @@ function ensureSecret() {
158
160
  let pgliteProcess = null;
159
161
 
160
162
  async function main() {
161
- // 1. Ensure data directory
162
- mkdirSync(join(dataDir, "pglite"), { recursive: true });
163
+ // 1. Determine database mode
164
+ // --use-pglite means "the database is PGlite-backed" (local or remote).
165
+ // It controls pg.Pool sizing (max=1 to avoid the @electric-sql/pglite-socket
166
+ // cross-handler race), independently of whether the PGlite process is
167
+ // local or remote.
168
+ //
169
+ // Whether to start a local embedded PGlite is decided by DATABASE_URL:
170
+ // - If DATABASE_URL is set, treat it as a pre-existing DB (PGlite or
171
+ // real Postgres) and connect to it.
172
+ // - Otherwise, --use-pglite=true (default) starts an embedded PGlite.
173
+ const usePgliteFlag = getArg("--use-pglite");
174
+ const envFlag = process.env.CHORUS_USE_PGLITE;
175
+ const usePglite =
176
+ usePgliteFlag === "false" || envFlag === "0" || envFlag === "false"
177
+ ? false
178
+ : true;
179
+ const startEmbeddedPglite = usePglite && !process.env.DATABASE_URL;
180
+
181
+ if (!usePglite && !process.env.DATABASE_URL) {
182
+ console.error(
183
+ "ERROR: --use-pglite=false requires DATABASE_URL to be set."
184
+ );
185
+ process.exit(1);
186
+ }
163
187
 
164
- // 2. Determine database mode
165
- const useExternalDb = !!process.env.DATABASE_URL;
188
+ // 2. Signal child processes to pin pg.Pool max=1 when using any PGlite backend.
189
+ if (usePglite) {
190
+ process.env.CHORUS_USE_PGLITE = "1";
191
+ }
166
192
 
167
- if (!useExternalDb) {
168
- // Start embedded PGlite
193
+ // 3. Start embedded PGlite if requested (no DATABASE_URL pointing at an
194
+ // external instance).
195
+ if (startEmbeddedPglite) {
196
+ mkdirSync(join(dataDir, "pglite"), { recursive: true });
169
197
  console.log(`Starting embedded PostgreSQL (PGlite) on port ${PGLITE_PORT}...`);
170
198
 
171
199
  // @electric-sql/pglite-socket does not expose `./dist/scripts/server.js`
@@ -253,13 +281,26 @@ async function main() {
253
281
  console.log("");
254
282
  console.log(` URL: http://${hostname === "0.0.0.0" ? "localhost" : hostname}:${port}`);
255
283
  console.log(` Data: ${dataDir}`);
256
- console.log(` Database: ${useExternalDb ? "external PostgreSQL" : "PGlite (embedded)"}`);
284
+ const dbLabel = usePglite
285
+ ? (startEmbeddedPglite
286
+ ? "PGlite (embedded, pg.Pool max=1)"
287
+ : "PGlite (external, pg.Pool max=1)")
288
+ : "external PostgreSQL";
289
+ console.log(` Database: ${dbLabel}`);
257
290
  console.log(` Redis: ${process.env.REDIS_URL ? "connected" : "disabled (in-memory EventBus)"}`);
258
291
  const maskedPassword = process.env.DEFAULT_PASSWORD === "chorus"
259
292
  ? "chorus"
260
293
  : "****";
261
294
  console.log(` Login: ${process.env.DEFAULT_USER} / ${maskedPassword}`);
262
295
  console.log("");
296
+ if (usePglite) {
297
+ console.log(" ⚠ PGlite mode pins pg.Pool to max=1 to avoid a cross-handler");
298
+ console.log(" race in @electric-sql/pglite-socket. Concurrent DB traffic is");
299
+ console.log(" serialized — fine for local single-user use, but for multi-user");
300
+ console.log(" or production deployments use a real PostgreSQL: pass");
301
+ console.log(" --use-pglite=false and set DATABASE_URL.");
302
+ console.log("");
303
+ }
263
304
 
264
305
  // 7. Ensure static assets are accessible inside standalone directory
265
306
  // next build puts .next/static/ and public/ at the project root, but
@@ -279,8 +320,11 @@ async function main() {
279
320
  }
280
321
 
281
322
  // 8. Start Next.js standalone server
323
+ // Use pathToFileURL — on Windows, dynamic import() rejects bare drive paths
324
+ // like "C:\…\server.js" with ERR_UNSUPPORTED_ESM_URL_SCHEME. file:// URLs
325
+ // work on every platform.
282
326
  process.chdir(standaloneDir);
283
- await import(join(standaloneDir, "server.js"));
327
+ await import(pathToFileURL(join(standaloneDir, "server.js")).href);
284
328
  }
285
329
 
286
330
  // ---------------------------------------------------------------------------
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chorus-aidlc/chorus",
3
- "version": "0.7.0",
3
+ "version": "0.8.0",
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": {