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