@chorus-aidlc/chorus 0.6.7 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/standalone/.env +2 -1
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-build-manifest.json +398 -379
- package/.next/standalone/.next/app-path-routes-manifest.json +42 -40
- package/.next/standalone/.next/build-manifest.json +5 -5
- package/.next/standalone/.next/prerender-manifest.json +59 -35
- package/.next/standalone/.next/react-loadable-manifest.json +2 -2
- package/.next/standalone/.next/routes-manifest.json +6 -0
- package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/[ideaUuid]/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/[ideaUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/[ideaUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/settings/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/settings/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
- package/.next/standalone/.next/server/app/admin/companies/[uuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin/companies/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin/companies/new.html +1 -1
- package/.next/standalone/.next/server/app/admin/companies/new.rsc +2 -2
- package/.next/standalone/.next/server/app/admin/companies/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin/companies.html +1 -1
- package/.next/standalone/.next/server/app/admin/companies.rsc +2 -2
- package/.next/standalone/.next/server/app/admin/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin.html +1 -1
- package/.next/standalone/.next/server/app/admin.rsc +2 -2
- package/.next/standalone/.next/server/app/api/admin/companies/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/companies/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/companies/route.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/companies/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/login/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/session/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/route.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/api-keys/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/api-keys/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/callback/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/check-default/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/company-oidc/route.js +1 -0
- package/.next/standalone/.next/server/app/api/auth/company-oidc/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/auth/company-oidc/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/auth/default-login/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/identify/route.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/identify/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/me/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/refresh/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/session/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/sync-token/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/comments/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/documents/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/documents/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/events/notifications/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/events/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/mcp/route.js +6 -6
- package/.next/standalone/.next/server/app/api/mcp/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/me/assignments/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/mentionables/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/preferences/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/read-all/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/unread-count/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/[uuid]/dashboard/route.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/[uuid]/dashboard/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/route.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/activity/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/activity/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/documents/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/documents/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/group/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/group/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/sessions/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +2 -2
- package/.next/standalone/.next/server/app/login/admin/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/admin.html +1 -1
- package/.next/standalone/.next/server/app/login/admin.rsc +2 -2
- package/.next/standalone/.next/server/app/login/callback/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/callback.html +1 -1
- package/.next/standalone/.next/server/app/login/callback.rsc +3 -3
- package/.next/standalone/.next/server/app/login/page.js +1 -1
- package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/pick-workspace/page.js +2 -0
- package/.next/standalone/.next/server/app/login/pick-workspace/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/login/pick-workspace/page_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/login/pick-workspace.html +1 -0
- package/.next/standalone/.next/server/app/login/pick-workspace.meta +7 -0
- package/.next/standalone/.next/server/app/login/pick-workspace.rsc +24 -0
- package/.next/standalone/.next/server/app/login/silent-refresh/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/silent-refresh.html +1 -1
- package/.next/standalone/.next/server/app/login/silent-refresh.rsc +2 -2
- package/.next/standalone/.next/server/app/login.html +1 -1
- package/.next/standalone/.next/server/app/login.rsc +3 -3
- package/.next/standalone/.next/server/app/onboarding/page.js +5 -4
- package/.next/standalone/.next/server/app/onboarding/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/onboarding.html +1 -1
- package/.next/standalone/.next/server/app/onboarding.rsc +3 -3
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects.html +1 -1
- package/.next/standalone/.next/server/app/projects.rsc +4 -4
- package/.next/standalone/.next/server/app/settings.html +1 -1
- package/.next/standalone/.next/server/app/settings.rsc +4 -4
- package/.next/standalone/.next/server/app-paths-manifest.json +42 -40
- package/.next/standalone/.next/server/chunks/1596.js +1 -1
- package/.next/standalone/.next/server/chunks/1639.js +1 -0
- package/.next/standalone/.next/server/chunks/1871.js +1 -0
- package/.next/standalone/.next/server/chunks/2570.js +1 -1
- package/.next/standalone/.next/server/chunks/2618.js +1 -1
- package/.next/standalone/.next/server/chunks/2961.js +1 -1
- package/.next/standalone/.next/server/chunks/{3408.js → 3300.js} +1 -1
- package/.next/standalone/.next/server/chunks/3611.js +158 -0
- package/.next/standalone/.next/server/chunks/3890.js +1 -1
- package/.next/standalone/.next/server/chunks/5300.js +1 -1
- package/.next/standalone/.next/server/chunks/5869.js +16 -0
- package/.next/standalone/.next/server/chunks/6113.js +1 -1
- package/.next/standalone/.next/server/chunks/6207.js +1 -1
- package/.next/standalone/.next/server/chunks/6753.js +3 -3
- package/.next/standalone/.next/server/chunks/7368.js +1 -1
- package/.next/standalone/.next/server/chunks/8251.js +1 -0
- package/.next/standalone/.next/server/chunks/8584.js +1 -0
- package/.next/standalone/.next/server/chunks/9051.js +1 -0
- package/.next/standalone/.next/server/chunks/920.js +1 -1
- package/.next/standalone/.next/server/chunks/937.js +1 -1
- package/.next/standalone/.next/server/chunks/9508.js +2 -2
- package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/.next/standalone/.next/server/middleware-manifest.json +5 -5
- package/.next/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/standalone/.next/server/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/pages-manifest.json +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/static/CQcM9hNpa5m8P_K5qveuk/_buildManifest.js +1 -0
- package/.next/standalone/.next/static/chunks/10739-5c185aa0432f5d56.js +1 -0
- package/.next/standalone/.next/static/chunks/{14945-45ab8dcd7d1460b0.js → 14945-0bc0086add441ba7.js} +1 -1
- package/.next/standalone/.next/static/chunks/19126-858a24cab6fd338a.js +1 -0
- package/.next/standalone/.next/static/chunks/21932-bce5ba937d1603e1.js +1 -0
- package/.next/standalone/.next/static/chunks/29445-04c4ab36da85b7da.js +1 -0
- package/.next/standalone/.next/static/chunks/34775-387b9a9967a35ccb.js +1 -0
- package/.next/standalone/.next/static/chunks/39611-cc227784ed679a6d.js +1 -0
- package/.next/standalone/.next/static/chunks/4457-b86052b2e954e357.js +1 -0
- package/.next/standalone/.next/static/chunks/4842-95cf4b7efd540e89.js +1 -0
- package/.next/standalone/.next/static/chunks/4860.d626399834b496e5.js +1 -0
- package/.next/standalone/.next/static/chunks/53298-82b9c818cd70686d.js +1 -0
- package/.next/standalone/.next/static/chunks/{72156-693a7612a0a1927c.js → 53664-a2be2eaacce03f0f.js} +1 -1
- package/.next/standalone/.next/static/chunks/55434-622522b242e7747f.js +1 -0
- package/.next/standalone/.next/static/chunks/95750-3d0d1d48995d1088.js +1 -0
- package/.next/standalone/.next/static/chunks/96919-8cbf6310c703e7af.js +1 -0
- package/.next/standalone/.next/static/chunks/{52162.90c7520be06645a7.js → 96924.93f7dab7363f09ac.js} +1 -1
- package/.next/standalone/.next/static/chunks/{99373.5b5e7a2cd5147b83.js → 99373.aedaca88297c6d8b.js} +1 -1
- package/.next/standalone/.next/static/chunks/99513-24849ff68a8098e1.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/{layout-45973b20578f2dd7.js → layout-acddb9c84f5d1607.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/project-groups/[uuid]/page-63a6a5b6cf9ecf87.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-b4c6141dd26cc506.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-4bf7bff8d68509f9.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-37a0cea0ba40c31b.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/ideas/[ideaUuid]/page-2d820769aa7bcaf6.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/ideas/page-dec0e71221d77928.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-355321010dd82e56.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/{page-59f6f1967c3dfcad.js → page-bc66567cb9c40bf0.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/{page-a4995a788651e9bc.js → page-86cfeb421fa97830.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page-7fe70579023330da.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/page-8c51993bb3866a55.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/{page-7c30b3f9f2b8f520.js → page-80566dcc1cd42bee.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-8db25385236a9bbf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/admin/companies/[uuid]/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/admin/companies/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/admin/login/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/admin/session/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/sessions/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/agents/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/api-keys/[uuid]/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/api-keys/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/callback/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/check-default/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/company-oidc/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/default-login/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/identify/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/logout/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/me/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/refresh/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/session/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/sync-token/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/comments/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/documents/[uuid]/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/events/notifications/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/events/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/health/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/claim/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/move/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/release/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/mcp/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/me/assignments/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/mentionables/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/archive/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/read/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/notifications/preferences/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/notifications/read-all/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/notifications/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/notifications/unread-count/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/dashboard/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/project-groups/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/activity/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/available/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/documents/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/group/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/tracker/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/summary/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/stats/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/dependencies/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/approve/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/close/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/reject/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/revoke/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/search/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/sessions/[uuid]/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/claim/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/release/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/sessions/route-e81d22f021f61318.js +1 -0
- package/.next/standalone/.next/static/chunks/app/login/callback/{page-e756563d2407e942.js → page-48a34c31a0f8e58c.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/login/page-dcb689dfe6e69879.js +1 -0
- package/.next/standalone/.next/static/chunks/app/login/pick-workspace/page-ee9bda8bfc4e0697.js +1 -0
- package/.next/standalone/.next/static/chunks/app/onboarding/page-e9409a2935c3c480.js +1 -0
- package/.next/standalone/.next/static/chunks/{webpack-17a45e2f5f3cd686.js → webpack-da41e6b9f3fe2f48.js} +1 -1
- package/.next/standalone/.next/static/css/ca9796ac54f96058.css +1 -0
- package/.next/standalone/package.json +7 -1
- package/.next/standalone/public/chorus-plugin/.claude-plugin/plugin.json +1 -1
- package/.next/standalone/public/chorus-plugin/agents/proposal-reviewer.md +5 -2
- package/.next/standalone/public/chorus-plugin/agents/task-reviewer.md +5 -2
- package/.next/standalone/public/chorus-plugin/bin/on-session-start.sh +11 -4
- package/.next/standalone/public/chorus-plugin/bin/on-subagent-start.sh +1 -1
- package/.next/standalone/public/chorus-plugin/bin/on-subagent-stop.sh +5 -5
- package/.next/standalone/public/chorus-plugin/skills/chorus/SKILL.md +43 -18
- package/.next/standalone/public/chorus-plugin/skills/develop/SKILL.md +3 -1
- package/.next/standalone/public/chorus-plugin/skills/idea/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/proposal/SKILL.md +2 -2
- package/.next/standalone/public/chorus-plugin/skills/quick-dev/SKILL.md +3 -3
- package/.next/standalone/public/chorus-plugin/skills/review/SKILL.md +4 -3
- package/.next/standalone/public/chorus-plugin/skills/yolo/SKILL.md +19 -18
- package/.next/standalone/public/install-codex.sh +304 -0
- package/.next/standalone/public/skill/chorus/SKILL.md +44 -19
- package/.next/standalone/public/skill/proposal-chorus/SKILL.md +2 -2
- package/.next/standalone/public/skill/quick-dev-chorus/SKILL.md +3 -3
- package/.next/standalone/public/test-install-codex.sh +165 -0
- package/README.md +11 -38
- package/README.zh.md +11 -38
- package/package.json +7 -1
- package/prisma/migrations/20260430034110_add_agent_permissions/migration.sql +2 -0
- package/prisma/schema.prisma +1 -0
- package/.next/standalone/.next/server/chunks/1386.js +0 -1
- package/.next/standalone/.next/server/chunks/1526.js +0 -1
- package/.next/standalone/.next/server/chunks/3088.js +0 -1
- package/.next/standalone/.next/server/chunks/4152.js +0 -1
- package/.next/standalone/.next/server/chunks/4772.js +0 -158
- package/.next/standalone/.next/server/chunks/8104.js +0 -16
- package/.next/standalone/.next/server/chunks/9408.js +0 -1
- package/.next/standalone/.next/static/chunks/10739-f8a95983c740edff.js +0 -1
- package/.next/standalone/.next/static/chunks/19126-ce11a472a7b46715.js +0 -1
- package/.next/standalone/.next/static/chunks/192-2fe41d1be4cf52c7.js +0 -1
- package/.next/standalone/.next/static/chunks/36940-1a052dcfd7a51c42.js +0 -1
- package/.next/standalone/.next/static/chunks/4860.e2abb2e82b6cc9b4.js +0 -1
- package/.next/standalone/.next/static/chunks/53011-6c6e5c3c761b4229.js +0 -1
- package/.next/standalone/.next/static/chunks/55203-e226f28d874a003b.js +0 -1
- package/.next/standalone/.next/static/chunks/58245-b2ea112ace9624d2.js +0 -1
- package/.next/standalone/.next/static/chunks/59703-726546958cd4cf44.js +0 -1
- package/.next/standalone/.next/static/chunks/62326-65d43abf563d7ce2.js +0 -1
- package/.next/standalone/.next/static/chunks/67312-2b0c88796d8a1f83.js +0 -1
- package/.next/standalone/.next/static/chunks/71350-88c2649fc693c1e8.js +0 -1
- package/.next/standalone/.next/static/chunks/89310-e7dd1f2b9518aeb2.js +0 -1
- package/.next/standalone/.next/static/chunks/96924-847b528f7abad0e5.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/project-groups/[uuid]/page-78f88c60bbff6c0f.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-61ad25356f1bcf61.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-cfd59c5238497200.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-9d721a820e1058b5.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/ideas/[ideaUuid]/page-9199629492f0d6cc.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/ideas/page-164acb03167c8257.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-642981c5c760bfef.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page-38e4430e5591fbff.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/page-cb3978ef57e7197a.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-94169bdcca8cb817.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/admin/companies/[uuid]/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/admin/companies/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/admin/login/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/admin/session/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/sessions/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/agents/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/api-keys/[uuid]/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/api-keys/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/callback/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/check-default/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/default-login/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/identify/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/logout/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/me/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/refresh/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/session/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/sync-token/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/comments/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/documents/[uuid]/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/events/notifications/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/events/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/health/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/claim/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/move/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/release/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/mcp/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/me/assignments/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/mentionables/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/archive/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/read/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/preferences/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/read-all/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/unread-count/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/dashboard/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/project-groups/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/activity/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/available/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/documents/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/group/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/tracker/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/summary/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/stats/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/dependencies/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/approve/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/close/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/reject/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/revoke/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/search/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/sessions/[uuid]/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/claim/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/release/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/sessions/route-0e35b9b3fc9b614e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/login/page-d7e41e281967f94d.js +0 -1
- package/.next/standalone/.next/static/chunks/app/onboarding/page-834ecbaf55d82ba5.js +0 -1
- package/.next/standalone/.next/static/css/99c7a0c50ad6bd32.css +0 -1
- package/.next/standalone/.next/static/kc2HwRxZUiMeDzrPiJW6z/_buildManifest.js +0 -1
- /package/.next/standalone/.next/static/{kc2HwRxZUiMeDzrPiJW6z → CQcM9hNpa5m8P_K5qveuk}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Chorus + Codex CLI one-shot installer
|
|
3
|
+
#
|
|
4
|
+
# Usage:
|
|
5
|
+
# curl -sSL https://raw.githubusercontent.com/Chorus-AIDLC/Chorus/main/public/install-codex.sh | bash
|
|
6
|
+
# # or non-interactive:
|
|
7
|
+
# CHORUS_URL=https://... CHORUS_API_KEY=cho_... \
|
|
8
|
+
# bash <(curl -sSL https://raw.githubusercontent.com/Chorus-AIDLC/Chorus/main/public/install-codex.sh)
|
|
9
|
+
#
|
|
10
|
+
# What this does (idempotent, safe to re-run):
|
|
11
|
+
# 1. Verifies `codex` CLI is installed.
|
|
12
|
+
# 2. Registers (or upgrades) the Chorus plugin marketplace.
|
|
13
|
+
# 3. Writes [mcp_servers.chorus] (url + Authorization header) and
|
|
14
|
+
# [plugins."chorus@chorus-plugins"] enabled = true into ~/.codex/config.toml,
|
|
15
|
+
# so Codex auto-enables the plugin on first launch (falls back to one-click
|
|
16
|
+
# `/plugins → Install` if auto-install does not fire).
|
|
17
|
+
# 4. Installs a lazy hook wrapper under ~/.codex/hooks/chorus/ so Chorus hooks
|
|
18
|
+
# work even before the plugin cache is materialized.
|
|
19
|
+
|
|
20
|
+
set -euo pipefail
|
|
21
|
+
|
|
22
|
+
# ---------- cosmetics ----------
|
|
23
|
+
BOLD=$'\033[1m'; DIM=$'\033[2m'; GREEN=$'\033[32m'; YELLOW=$'\033[33m'; RED=$'\033[31m'; RESET=$'\033[0m'
|
|
24
|
+
ok() { printf "${GREEN}✓${RESET} %s\n" "$*"; }
|
|
25
|
+
warn() { printf "${YELLOW}!${RESET} %s\n" "$*" >&2; }
|
|
26
|
+
die() { printf "${RED}✗${RESET} %s\n" "$*" >&2; exit 1; }
|
|
27
|
+
hdr() { printf "\n${BOLD}%s${RESET}\n" "$*"; }
|
|
28
|
+
|
|
29
|
+
# ---------- config ----------
|
|
30
|
+
MARKETPLACE_NAME="chorus-plugins"
|
|
31
|
+
MARKETPLACE_SOURCE_DEFAULT="${CHORUS_MARKETPLACE_SOURCE:-https://github.com/Chorus-AIDLC/Chorus}"
|
|
32
|
+
CHORUS_URL_DEFAULT="${CHORUS_URL_DEFAULT:-http://localhost:8637/api/mcp}"
|
|
33
|
+
CODEX_HOME="${CODEX_HOME:-$HOME/.codex}"
|
|
34
|
+
CONFIG_TOML="$CODEX_HOME/config.toml"
|
|
35
|
+
|
|
36
|
+
is_tty() { [ -t 0 ] && [ -t 1 ]; }
|
|
37
|
+
|
|
38
|
+
# If piped through `curl | bash`, stdin is the script body. Re-open from /dev/tty
|
|
39
|
+
# so interactive prompts still work — but only if a real TTY is available AND we
|
|
40
|
+
# actually need to prompt for input. Both CHORUS_URL and CHORUS_API_KEY being set
|
|
41
|
+
# lets us run fully non-interactively (useful in CI or unified-exec sandboxes).
|
|
42
|
+
if [ -z "${CHORUS_API_KEY:-}" ] && ! is_tty; then
|
|
43
|
+
if [ -r /dev/tty ] && [ -w /dev/tty ]; then
|
|
44
|
+
exec < /dev/tty
|
|
45
|
+
fi
|
|
46
|
+
fi
|
|
47
|
+
|
|
48
|
+
# ---------- step 1: check codex ----------
|
|
49
|
+
hdr "1/5 Checking Codex CLI"
|
|
50
|
+
command -v codex >/dev/null 2>&1 || die "codex not found in PATH. Install it first: npm i -g @openai/codex"
|
|
51
|
+
ok "Found $(codex --version 2>/dev/null | head -1)"
|
|
52
|
+
|
|
53
|
+
# ---------- step 2: register marketplace ----------
|
|
54
|
+
hdr "2/5 Registering the Chorus plugin marketplace"
|
|
55
|
+
# Extract the currently registered source (if any) for chorus-plugins.
|
|
56
|
+
# awk scoped between the matching [marketplaces.<name>] header and the next [section].
|
|
57
|
+
existing_source=""
|
|
58
|
+
if [ -f "$CONFIG_TOML" ]; then
|
|
59
|
+
existing_source="$(awk -v name="$MARKETPLACE_NAME" '
|
|
60
|
+
$0 ~ "^\\[marketplaces\\." name "\\][[:space:]]*$" { in_block=1; next }
|
|
61
|
+
in_block && /^\[/ { in_block=0 }
|
|
62
|
+
in_block && /^source[[:space:]]*=/ {
|
|
63
|
+
sub(/^source[[:space:]]*=[[:space:]]*/, "")
|
|
64
|
+
gsub(/^"|"$/, "")
|
|
65
|
+
print
|
|
66
|
+
exit
|
|
67
|
+
}
|
|
68
|
+
' "$CONFIG_TOML" 2>/dev/null || true)"
|
|
69
|
+
fi
|
|
70
|
+
|
|
71
|
+
if [ -z "$existing_source" ]; then
|
|
72
|
+
codex plugin marketplace add "$MARKETPLACE_SOURCE_DEFAULT" >/dev/null
|
|
73
|
+
ok "Added marketplace: $MARKETPLACE_SOURCE_DEFAULT"
|
|
74
|
+
elif [ "$existing_source" = "$MARKETPLACE_SOURCE_DEFAULT" ]; then
|
|
75
|
+
# Same source — pull the latest plugin manifest/version.
|
|
76
|
+
if codex plugin marketplace upgrade "$MARKETPLACE_NAME" >/dev/null 2>&1; then
|
|
77
|
+
ok "Upgraded marketplace '${MARKETPLACE_NAME}' to latest"
|
|
78
|
+
else
|
|
79
|
+
warn "Marketplace '${MARKETPLACE_NAME}' already registered; upgrade skipped"
|
|
80
|
+
fi
|
|
81
|
+
else
|
|
82
|
+
# Source changed — remove the stale registration and re-add.
|
|
83
|
+
warn "Marketplace '${MARKETPLACE_NAME}' points at a different source; re-registering"
|
|
84
|
+
warn " old: $existing_source"
|
|
85
|
+
warn " new: $MARKETPLACE_SOURCE_DEFAULT"
|
|
86
|
+
codex plugin marketplace remove "$MARKETPLACE_NAME" >/dev/null 2>&1 || true
|
|
87
|
+
codex plugin marketplace add "$MARKETPLACE_SOURCE_DEFAULT" >/dev/null
|
|
88
|
+
ok "Re-added marketplace: $MARKETPLACE_SOURCE_DEFAULT"
|
|
89
|
+
fi
|
|
90
|
+
|
|
91
|
+
# ---------- step 3: collect Chorus URL + API key ----------
|
|
92
|
+
hdr "3/5 Configuring the Chorus MCP server"
|
|
93
|
+
|
|
94
|
+
# URL
|
|
95
|
+
if [ -n "${CHORUS_URL:-}" ]; then
|
|
96
|
+
url="$CHORUS_URL"
|
|
97
|
+
ok "Using CHORUS_URL from env: $url"
|
|
98
|
+
elif [ -t 0 ]; then
|
|
99
|
+
printf " Chorus MCP URL ${DIM}[default: $CHORUS_URL_DEFAULT]${RESET}: "
|
|
100
|
+
read -r url
|
|
101
|
+
url="${url:-$CHORUS_URL_DEFAULT}"
|
|
102
|
+
else
|
|
103
|
+
url="$CHORUS_URL_DEFAULT"
|
|
104
|
+
warn "No TTY and CHORUS_URL unset — using default: $url"
|
|
105
|
+
fi
|
|
106
|
+
|
|
107
|
+
# API key
|
|
108
|
+
if [ -n "${CHORUS_API_KEY:-}" ]; then
|
|
109
|
+
apikey="$CHORUS_API_KEY"
|
|
110
|
+
ok "Using CHORUS_API_KEY from env"
|
|
111
|
+
elif [ -t 0 ]; then
|
|
112
|
+
printf " Chorus API key (starts with cho_): "
|
|
113
|
+
stty -echo 2>/dev/null || true
|
|
114
|
+
read -r apikey
|
|
115
|
+
stty echo 2>/dev/null || true
|
|
116
|
+
printf "\n"
|
|
117
|
+
[ -n "$apikey" ] || die "API key is required"
|
|
118
|
+
else
|
|
119
|
+
die "No TTY and CHORUS_API_KEY unset — cannot continue"
|
|
120
|
+
fi
|
|
121
|
+
|
|
122
|
+
# Must be http(s).
|
|
123
|
+
case "$url" in
|
|
124
|
+
http://*|https://*) ;;
|
|
125
|
+
*) die "URL must start with http:// or https:// — got: $url" ;;
|
|
126
|
+
esac
|
|
127
|
+
|
|
128
|
+
# Normalize: the Chorus MCP endpoint lives under /api/mcp. If the user gave us
|
|
129
|
+
# just a host (or a host with trailing slash, or any path that doesn't already
|
|
130
|
+
# end in /api/mcp), append it so the MCP handshake hits the right route.
|
|
131
|
+
case "$url" in
|
|
132
|
+
*/api/mcp) ;;
|
|
133
|
+
*/api/mcp/) url="${url%/}" ;;
|
|
134
|
+
*/) url="${url}api/mcp" ;;
|
|
135
|
+
*) url="${url}/api/mcp" ;;
|
|
136
|
+
esac
|
|
137
|
+
ok "MCP endpoint: $url"
|
|
138
|
+
|
|
139
|
+
# ---------- step 4: write config.toml ----------
|
|
140
|
+
hdr "4/5 Writing ~/.codex/config.toml"
|
|
141
|
+
mkdir -p "$CODEX_HOME"
|
|
142
|
+
[ -f "$CONFIG_TOML" ] || touch "$CONFIG_TOML"
|
|
143
|
+
|
|
144
|
+
# Back up once
|
|
145
|
+
if [ ! -f "$CONFIG_TOML.chorus-bak" ]; then
|
|
146
|
+
cp "$CONFIG_TOML" "$CONFIG_TOML.chorus-bak"
|
|
147
|
+
ok "Backed up original config to ${CONFIG_TOML}.chorus-bak"
|
|
148
|
+
fi
|
|
149
|
+
|
|
150
|
+
# Remove any existing [mcp_servers.chorus] and [mcp_servers.chorus.*] sub-tables
|
|
151
|
+
# (idempotent — old rotated keys / headers are wiped, then fresh section appended).
|
|
152
|
+
# Pure awk so we do not require Python on the user's machine.
|
|
153
|
+
tmp="$(mktemp "${TMPDIR:-/tmp}/chorus-config.XXXXXX")"
|
|
154
|
+
awk '
|
|
155
|
+
# A TOML table header line. Match [mcp_servers.chorus] and any
|
|
156
|
+
# [mcp_servers.chorus.<subtable>], plus [plugins."chorus@chorus-plugins"],
|
|
157
|
+
# and suppress lines until the next [section] header appears.
|
|
158
|
+
/^\[mcp_servers\.chorus(\..*)?\][[:space:]]*$/ { skip = 1; next }
|
|
159
|
+
/^\[plugins\."chorus@chorus-plugins"\][[:space:]]*$/ { skip = 1; next }
|
|
160
|
+
/^\[/ { skip = 0 }
|
|
161
|
+
skip != 1 { print }
|
|
162
|
+
' "$CONFIG_TOML" > "$tmp"
|
|
163
|
+
mv "$tmp" "$CONFIG_TOML"
|
|
164
|
+
|
|
165
|
+
# Ensure user-owned file mode 600 (contains secret).
|
|
166
|
+
chmod 600 "$CONFIG_TOML"
|
|
167
|
+
|
|
168
|
+
# Append [mcp_servers.chorus] with literal URL + Authorization header.
|
|
169
|
+
# (Codex does NOT expand ${VAR}; the token is a literal string in the header.)
|
|
170
|
+
cat >> "$CONFIG_TOML" <<TOML
|
|
171
|
+
|
|
172
|
+
[mcp_servers.chorus]
|
|
173
|
+
url = "${url}"
|
|
174
|
+
|
|
175
|
+
[mcp_servers.chorus.http_headers]
|
|
176
|
+
Authorization = "Bearer ${apikey}"
|
|
177
|
+
|
|
178
|
+
[plugins."chorus@chorus-plugins"]
|
|
179
|
+
enabled = true
|
|
180
|
+
TOML
|
|
181
|
+
|
|
182
|
+
ok "Wrote [mcp_servers.chorus] and [plugins.\"chorus@chorus-plugins\"] → ${CONFIG_TOML}"
|
|
183
|
+
|
|
184
|
+
# ---------- step 5: install hooks ----------
|
|
185
|
+
hdr "5/5 Installing Chorus hooks"
|
|
186
|
+
|
|
187
|
+
# Install a tiny wrapper that lazily resolves the newest plugin cache at
|
|
188
|
+
# hook-run time. This lets us write hooks.json BEFORE `/plugins → Install`
|
|
189
|
+
# has materialized the plugin cache — first-run UX becomes truly one-shot.
|
|
190
|
+
WRAPPER_DIR="$CODEX_HOME/hooks/chorus"
|
|
191
|
+
WRAPPER="$WRAPPER_DIR/run-hook.sh"
|
|
192
|
+
mkdir -p "$WRAPPER_DIR"
|
|
193
|
+
cat > "$WRAPPER" <<'WRAP'
|
|
194
|
+
#!/usr/bin/env bash
|
|
195
|
+
# Chorus hook wrapper (installed by public/install-codex.sh).
|
|
196
|
+
# Resolves the newest installed Chorus plugin version at runtime and execs
|
|
197
|
+
# the named hook script from its hooks/ directory. Exits 0 (no-op) if the
|
|
198
|
+
# plugin has not been installed yet, so Codex sessions still start cleanly.
|
|
199
|
+
set -eu
|
|
200
|
+
HOOK_NAME="${1:-}"
|
|
201
|
+
if [ -z "$HOOK_NAME" ]; then
|
|
202
|
+
echo '{}' ; exit 0
|
|
203
|
+
fi
|
|
204
|
+
shift
|
|
205
|
+
CODEX_HOME_RESOLVED="${CODEX_HOME:-$HOME/.codex}"
|
|
206
|
+
PLUGIN_ROOT="$CODEX_HOME_RESOLVED/plugins/cache/chorus-plugins/chorus"
|
|
207
|
+
if [ ! -d "$PLUGIN_ROOT" ]; then
|
|
208
|
+
echo '{}' ; exit 0
|
|
209
|
+
fi
|
|
210
|
+
VER="$(ls -1 "$PLUGIN_ROOT" 2>/dev/null | sort -V | tail -1)"
|
|
211
|
+
if [ -z "$VER" ]; then
|
|
212
|
+
echo '{}' ; exit 0
|
|
213
|
+
fi
|
|
214
|
+
SCRIPT="$PLUGIN_ROOT/$VER/hooks/$HOOK_NAME"
|
|
215
|
+
if [ ! -x "$SCRIPT" ]; then
|
|
216
|
+
if [ -f "$SCRIPT" ]; then
|
|
217
|
+
chmod +x "$SCRIPT" 2>/dev/null || true
|
|
218
|
+
else
|
|
219
|
+
echo '{}' ; exit 0
|
|
220
|
+
fi
|
|
221
|
+
fi
|
|
222
|
+
exec "$SCRIPT" "$@"
|
|
223
|
+
WRAP
|
|
224
|
+
chmod +x "$WRAPPER"
|
|
225
|
+
ok "Installed hook wrapper → $WRAPPER"
|
|
226
|
+
|
|
227
|
+
HOOKS_JSON="$CODEX_HOME/hooks.json"
|
|
228
|
+
if [ -f "$HOOKS_JSON" ] && ! grep -q "hooks/chorus/run-hook.sh\|chorus-plugins/chorus" "$HOOKS_JSON" 2>/dev/null; then
|
|
229
|
+
warn "Found a non-Chorus $HOOKS_JSON — not overwriting."
|
|
230
|
+
warn " Add Chorus hook entries manually (command = $WRAPPER on-session-start.sh | on-post-submit-proposal.sh | on-post-submit-for-verify.sh)."
|
|
231
|
+
else
|
|
232
|
+
cat > "$HOOKS_JSON" <<HJSON
|
|
233
|
+
{
|
|
234
|
+
"hooks": {
|
|
235
|
+
"SessionStart": [
|
|
236
|
+
{
|
|
237
|
+
"matcher": "startup|resume|clear",
|
|
238
|
+
"hooks": [
|
|
239
|
+
{ "type": "command", "command": "$WRAPPER on-session-start.sh", "timeout": 20, "statusMessage": "Chorus: checkin" }
|
|
240
|
+
]
|
|
241
|
+
}
|
|
242
|
+
],
|
|
243
|
+
"PostToolUse": [
|
|
244
|
+
{
|
|
245
|
+
"matcher": ".*chorus_pm_submit_proposal",
|
|
246
|
+
"hooks": [
|
|
247
|
+
{ "type": "command", "command": "$WRAPPER on-post-submit-proposal.sh", "timeout": 10 }
|
|
248
|
+
]
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
"matcher": ".*chorus_submit_for_verify",
|
|
252
|
+
"hooks": [
|
|
253
|
+
{ "type": "command", "command": "$WRAPPER on-post-submit-for-verify.sh", "timeout": 10 }
|
|
254
|
+
]
|
|
255
|
+
}
|
|
256
|
+
]
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
HJSON
|
|
260
|
+
ok "Wrote $HOOKS_JSON (routing through $WRAPPER)"
|
|
261
|
+
fi
|
|
262
|
+
|
|
263
|
+
# Enable the codex_hooks feature flag in config.toml (idempotent).
|
|
264
|
+
if grep -qE "^\[features\]" "$CONFIG_TOML"; then
|
|
265
|
+
if ! grep -qE "^codex_hooks\s*=\s*true" "$CONFIG_TOML"; then
|
|
266
|
+
tmp="$(mktemp "${TMPDIR:-/tmp}/chorus-features.XXXXXX")"
|
|
267
|
+
awk '
|
|
268
|
+
/^\[features\][[:space:]]*$/ { print; print "codex_hooks = true"; inserted=1; next }
|
|
269
|
+
{ print }
|
|
270
|
+
' "$CONFIG_TOML" > "$tmp" && mv "$tmp" "$CONFIG_TOML"
|
|
271
|
+
ok "Added codex_hooks = true under existing [features]"
|
|
272
|
+
else
|
|
273
|
+
ok "codex_hooks feature flag already enabled"
|
|
274
|
+
fi
|
|
275
|
+
else
|
|
276
|
+
cat >> "$CONFIG_TOML" <<'TFEAT'
|
|
277
|
+
|
|
278
|
+
[features]
|
|
279
|
+
codex_hooks = true
|
|
280
|
+
TFEAT
|
|
281
|
+
ok "Appended [features] codex_hooks = true"
|
|
282
|
+
fi
|
|
283
|
+
|
|
284
|
+
# ---------- epilogue ----------
|
|
285
|
+
hdr "Done."
|
|
286
|
+
cat <<NEXT
|
|
287
|
+
|
|
288
|
+
Start Codex — the plugin is registered as INSTALLED_BY_DEFAULT so it
|
|
289
|
+
should activate on first launch:
|
|
290
|
+
|
|
291
|
+
${BOLD}codex${RESET}
|
|
292
|
+
|
|
293
|
+
If /plugins does not show "chorus" as installed on first launch, open it
|
|
294
|
+
and click Install once (Codex has no \`plugin install\` CLI command yet,
|
|
295
|
+
so one manual click is the fallback path).
|
|
296
|
+
|
|
297
|
+
Verify anytime:
|
|
298
|
+
${BOLD}codex mcp list${RESET} # 'chorus' row, Auth = 'Bearer token'
|
|
299
|
+
${BOLD}codex features list${RESET} # codex_hooks + plugins both true
|
|
300
|
+
|
|
301
|
+
Then in Codex type ${BOLD}\$chorus${RESET} (or \$develop, \$review, \$proposal, …) to
|
|
302
|
+
activate a skill. To change your API key later, just re-run this installer.
|
|
303
|
+
|
|
304
|
+
NEXT
|
|
@@ -86,10 +86,26 @@ creates analyzes drafts PRD codes & reviews closes
|
|
|
86
86
|
|
|
87
87
|
| Role | Responsibility | MCP Tools |
|
|
88
88
|
|------|---------------|-----------|
|
|
89
|
-
| **PM Agent** | Analyze Ideas, create Proposals (PRD + Task drafts), manage documents | Public + `chorus_pm_*` + `chorus_*_idea` |
|
|
89
|
+
| **PM Agent** | Analyze Ideas, create Proposals (PRD + Task drafts), manage documents | Public + `chorus_pm_*` + `chorus_*_idea` + `task:write` tools (claim/release/submit/report) |
|
|
90
90
|
| **Developer Agent** | Claim Tasks, write code, report work, submit for verification | Public + `chorus_*_task` + `chorus_report_work` |
|
|
91
91
|
| **Admin Agent** | Create projects/ideas, approve/reject proposals, verify tasks, manage lifecycle | Public + `chorus_admin_*` + PM + Developer tools |
|
|
92
92
|
|
|
93
|
+
### Permissions
|
|
94
|
+
|
|
95
|
+
Each agent's tool visibility is driven by a **permission set**, not by the role label alone. Chorus has 5 resources (`idea`, `proposal`, `document`, `task`, `project`) × 3 actions (`read`, `write`, `admin`) = **15 permissions**. Each permission-gated MCP tool declares a single required permission (see `<BASE_URL>/docs/MCP_TOOLS.md` for the full table).
|
|
96
|
+
|
|
97
|
+
**Role presets** map to permission sets:
|
|
98
|
+
|
|
99
|
+
| Preset | Permissions |
|
|
100
|
+
|--------|-------------|
|
|
101
|
+
| `developer_agent` | all `*:read` + `task:write` |
|
|
102
|
+
| `pm_agent` | all `*:read` + `idea:write` + `proposal:write` + `document:write` + `task:write` + `project:write` |
|
|
103
|
+
| `admin_agent` | all 15 permissions (every `read` + `write` + `admin`) |
|
|
104
|
+
|
|
105
|
+
**Custom permissions** are also supported: when creating an agent you can pick a preset AND/OR add individual permissions. The effective permission set is the union. Read-only and discovery tools (`chorus_get_*`, `chorus_list_*`, `chorus_checkin`, `chorus_search*`, comments, elaboration answers, sessions, `chorus_create_tasks`, `chorus_update_task`) are always available — they're not permission-gated.
|
|
106
|
+
|
|
107
|
+
> **Note**: possessing `task:write` grants *tool visibility*, not unconditional authority. Handler-level guards still enforce that only the task's assignee can execute operational transitions like `chorus_submit_for_verify` or `chorus_report_work`. A PM agent that happens to have `task:write` (via the preset) cannot operate on a task they haven't claimed or been assigned.
|
|
108
|
+
|
|
93
109
|
---
|
|
94
110
|
|
|
95
111
|
## Common Tools (All Roles)
|
|
@@ -125,9 +141,9 @@ Results can be filtered by project(s) using optional HTTP headers in your MCP co
|
|
|
125
141
|
|
|
126
142
|
### MCP Connection
|
|
127
143
|
|
|
128
|
-
- MCP
|
|
129
|
-
-
|
|
130
|
-
-
|
|
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,
|
|
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
|
|
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.
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
|
305
|
-
|
|
306
|
-
| `
|
|
307
|
-
| `
|
|
308
|
-
| `
|
|
309
|
-
| `
|
|
310
|
-
| `
|
|
311
|
-
| `chorus_pm_
|
|
312
|
-
| `
|
|
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.
|
|
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
|
|
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.
|
|
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
|
|
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
|
|
146
|
+
**Admin self-verification:** If you have `task: ["admin"]` in `permissions` and the user approved self-verification in the Pre-Flight check, you can verify the task yourself immediately after submitting:
|
|
147
147
|
|
|
148
148
|
```
|
|
149
149
|
chorus_admin_verify_task({ taskUuid: "<task-uuid>" })
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Test public/install-codex.sh for macOS bash 3.2 compatibility.
|
|
3
|
+
#
|
|
4
|
+
# Usage:
|
|
5
|
+
# bash public/test-install-codex.sh
|
|
6
|
+
# BASH32=/path/to/bash-3.2 bash public/test-install-codex.sh
|
|
7
|
+
#
|
|
8
|
+
# Picks a bash: $BASH32 → /tmp/bash32-build/bash-3.2/bash (hand-built)
|
|
9
|
+
# → /bin/bash (macOS system bash is 3.2.57)
|
|
10
|
+
# → `bash` on PATH.
|
|
11
|
+
|
|
12
|
+
set -euo pipefail
|
|
13
|
+
|
|
14
|
+
REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
|
15
|
+
SCRIPT="$REPO_ROOT/public/install-codex.sh"
|
|
16
|
+
|
|
17
|
+
if [ -n "${BASH32:-}" ] && [ -x "$BASH32" ]; then
|
|
18
|
+
TEST_BASH="$BASH32"
|
|
19
|
+
elif [ -x "/tmp/bash32-build/bash-3.2/bash" ]; then
|
|
20
|
+
TEST_BASH="/tmp/bash32-build/bash-3.2/bash"
|
|
21
|
+
elif [ -x "/bin/bash" ]; then
|
|
22
|
+
TEST_BASH="/bin/bash"
|
|
23
|
+
else
|
|
24
|
+
TEST_BASH="$(command -v bash)"
|
|
25
|
+
fi
|
|
26
|
+
|
|
27
|
+
BOLD=$'\033[1m'; GREEN=$'\033[32m'; RED=$'\033[31m'; DIM=$'\033[2m'; RESET=$'\033[0m'
|
|
28
|
+
|
|
29
|
+
PASS=0; FAIL=0; FAIL_NOTES=""
|
|
30
|
+
|
|
31
|
+
pass() { printf " ${GREEN}PASS${RESET} %s\n" "$*"; PASS=$((PASS + 1)); }
|
|
32
|
+
fail() { printf " ${RED}FAIL${RESET} %s\n" "$*"; FAIL=$((FAIL + 1)); FAIL_NOTES="$FAIL_NOTES
|
|
33
|
+
- $*"; }
|
|
34
|
+
|
|
35
|
+
echo "${BOLD}Testing:${RESET} $SCRIPT"
|
|
36
|
+
echo "${BOLD}Using:${RESET} $TEST_BASH ($("$TEST_BASH" --version | head -1))"
|
|
37
|
+
echo ""
|
|
38
|
+
|
|
39
|
+
# [1/4] Static scan — reject bash 4+ constructs
|
|
40
|
+
echo "${BOLD}[1/4]${RESET} Static scan for bash 4+ constructs"
|
|
41
|
+
scan() {
|
|
42
|
+
local label="$1"; local pattern="$2"
|
|
43
|
+
if grep -nE "$pattern" "$SCRIPT" >/tmp/install-codex-scan.$$ 2>/dev/null; then
|
|
44
|
+
fail "$label"
|
|
45
|
+
sed 's/^/ /' /tmp/install-codex-scan.$$
|
|
46
|
+
else
|
|
47
|
+
pass "$label"
|
|
48
|
+
fi
|
|
49
|
+
rm -f /tmp/install-codex-scan.$$
|
|
50
|
+
}
|
|
51
|
+
scan 'no ${VAR,,} / ${VAR^^} case conversion' '\$\{[A-Za-z_][A-Za-z0-9_]*(\[[^]]+\])?[,^]{1,2}\}'
|
|
52
|
+
scan 'no "declare -A" / "typeset -A"' '^[[:space:]]*(declare|typeset|local)[[:space:]]+-[A-Za-z]*A'
|
|
53
|
+
scan 'no mapfile / readarray' '^\s*(mapfile|readarray)\b'
|
|
54
|
+
scan 'no "&>" redirection' '[^|]&>[^>]'
|
|
55
|
+
scan 'no "|&" redirection' '\|&'
|
|
56
|
+
scan 'no ";;&" case fallthrough' ';;&'
|
|
57
|
+
|
|
58
|
+
# [2/4] Parse
|
|
59
|
+
echo ""
|
|
60
|
+
echo "${BOLD}[2/4]${RESET} Parse with $TEST_BASH -n"
|
|
61
|
+
if "$TEST_BASH" -n "$SCRIPT" 2>/tmp/install-codex-parse.$$; then
|
|
62
|
+
pass "parses without syntax errors"
|
|
63
|
+
else
|
|
64
|
+
fail "parse error"
|
|
65
|
+
sed 's/^/ /' /tmp/install-codex-parse.$$
|
|
66
|
+
fi
|
|
67
|
+
rm -f /tmp/install-codex-parse.$$
|
|
68
|
+
|
|
69
|
+
# [3/4] End-to-end dry run with an isolated CODEX_HOME
|
|
70
|
+
echo ""
|
|
71
|
+
echo "${BOLD}[3/4]${RESET} End-to-end dry run (isolated CODEX_HOME)"
|
|
72
|
+
|
|
73
|
+
TMP_HOME="$(mktemp -d -t chorus-install-test.XXXXXX)"
|
|
74
|
+
trap 'rm -rf "$TMP_HOME"' EXIT
|
|
75
|
+
|
|
76
|
+
FAKE_BIN="$TMP_HOME/bin"
|
|
77
|
+
mkdir -p "$FAKE_BIN"
|
|
78
|
+
cat > "$FAKE_BIN/codex" <<'FAKE'
|
|
79
|
+
#!/usr/bin/env bash
|
|
80
|
+
case "${1:-}" in
|
|
81
|
+
--version) echo "codex 0.125.0-test" ;;
|
|
82
|
+
plugin)
|
|
83
|
+
if [ "${2:-}" = "marketplace" ] && [ "${3:-}" = "list" ]; then
|
|
84
|
+
echo ""
|
|
85
|
+
exit 0
|
|
86
|
+
fi
|
|
87
|
+
exit 0
|
|
88
|
+
;;
|
|
89
|
+
*) exit 0 ;;
|
|
90
|
+
esac
|
|
91
|
+
FAKE
|
|
92
|
+
chmod +x "$FAKE_BIN/codex"
|
|
93
|
+
|
|
94
|
+
run_out="$TMP_HOME/run.log"
|
|
95
|
+
set +e
|
|
96
|
+
env \
|
|
97
|
+
PATH="$FAKE_BIN:$PATH" \
|
|
98
|
+
HOME="$TMP_HOME" \
|
|
99
|
+
CODEX_HOME="$TMP_HOME/.codex" \
|
|
100
|
+
CHORUS_URL="https://chorus.test/api/mcp" \
|
|
101
|
+
CHORUS_API_KEY="cho_test_key_abc123" \
|
|
102
|
+
CHORUS_MARKETPLACE_SOURCE="https://github.com/Chorus-AIDLC/Chorus" \
|
|
103
|
+
"$TEST_BASH" "$SCRIPT" >"$run_out" 2>&1
|
|
104
|
+
rc=$?
|
|
105
|
+
set -e
|
|
106
|
+
|
|
107
|
+
if [ "$rc" -ne 0 ]; then
|
|
108
|
+
fail "installer exited non-zero ($rc)"
|
|
109
|
+
sed 's/^/ /' "$run_out"
|
|
110
|
+
else
|
|
111
|
+
pass "installer exited 0"
|
|
112
|
+
fi
|
|
113
|
+
|
|
114
|
+
cfg="$TMP_HOME/.codex/config.toml"
|
|
115
|
+
if [ ! -f "$cfg" ]; then
|
|
116
|
+
fail "config.toml not created at $cfg"
|
|
117
|
+
else
|
|
118
|
+
pass "config.toml created"
|
|
119
|
+
grep -q '^\[mcp_servers\.chorus\]' "$cfg" && pass "[mcp_servers.chorus] block present" || fail "[mcp_servers.chorus] missing"
|
|
120
|
+
grep -q 'url = "https://chorus.test/api/mcp"' "$cfg" && pass "url written literally" || fail "url not literal"
|
|
121
|
+
grep -q 'Authorization = "Bearer cho_test_key_abc123"' "$cfg" && pass "Authorization header literal" || fail "Authorization not literal"
|
|
122
|
+
if command -v stat >/dev/null 2>&1; then
|
|
123
|
+
mode="$(stat -c '%a' "$cfg" 2>/dev/null || stat -f '%OLp' "$cfg" 2>/dev/null || echo "")"
|
|
124
|
+
if [ "$mode" = "600" ]; then
|
|
125
|
+
pass "config.toml mode=600"
|
|
126
|
+
elif [ -n "$mode" ]; then
|
|
127
|
+
fail "config.toml mode=$mode (expected 600)"
|
|
128
|
+
fi
|
|
129
|
+
fi
|
|
130
|
+
fi
|
|
131
|
+
|
|
132
|
+
# [4/4] Idempotent re-run with a rotated key
|
|
133
|
+
echo ""
|
|
134
|
+
echo "${BOLD}[4/4]${RESET} Idempotent re-run with a rotated key"
|
|
135
|
+
set +e
|
|
136
|
+
env \
|
|
137
|
+
PATH="$FAKE_BIN:$PATH" \
|
|
138
|
+
HOME="$TMP_HOME" \
|
|
139
|
+
CODEX_HOME="$TMP_HOME/.codex" \
|
|
140
|
+
CHORUS_URL="https://chorus.test/api/mcp" \
|
|
141
|
+
CHORUS_API_KEY="cho_rotated_key_xyz789" \
|
|
142
|
+
"$TEST_BASH" "$SCRIPT" >"$run_out" 2>&1
|
|
143
|
+
rc=$?
|
|
144
|
+
set -e
|
|
145
|
+
[ "$rc" -eq 0 ] && pass "rerun exited 0" || { fail "rerun exited non-zero ($rc)"; sed 's/^/ /' "$run_out"; }
|
|
146
|
+
|
|
147
|
+
blocks="$(grep -c '^\[mcp_servers\.chorus\]' "$cfg" 2>/dev/null || echo 0)"
|
|
148
|
+
[ "$blocks" = "1" ] && pass "exactly one [mcp_servers.chorus] block" || fail "found $blocks [mcp_servers.chorus] blocks"
|
|
149
|
+
|
|
150
|
+
hdr_blocks="$(grep -c '^\[mcp_servers\.chorus\.http_headers\]' "$cfg" 2>/dev/null || echo 0)"
|
|
151
|
+
[ "$hdr_blocks" = "1" ] && pass "exactly one [mcp_servers.chorus.http_headers] block" || fail "found $hdr_blocks http_headers blocks"
|
|
152
|
+
|
|
153
|
+
if grep -q 'Authorization = "Bearer cho_rotated_key_xyz789"' "$cfg" && ! grep -q 'cho_test_key_abc123' "$cfg"; then
|
|
154
|
+
pass "rotated key replaced the previous key"
|
|
155
|
+
else
|
|
156
|
+
fail "rotated key not applied cleanly"
|
|
157
|
+
fi
|
|
158
|
+
|
|
159
|
+
echo ""
|
|
160
|
+
echo "${BOLD}Summary:${RESET} $PASS passed, $FAIL failed"
|
|
161
|
+
if [ "$FAIL" -gt 0 ]; then
|
|
162
|
+
printf "${RED}%s${RESET}\n" "$FAIL_NOTES"
|
|
163
|
+
exit 1
|
|
164
|
+
fi
|
|
165
|
+
echo "${GREEN}All checks passed.${RESET}"
|