@chorus-aidlc/chorus 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-build-manifest.json +319 -319
- package/.next/standalone/.next/app-path-routes-manifest.json +40 -40
- package/.next/standalone/.next/build-manifest.json +5 -5
- package/.next/standalone/.next/prerender-manifest.json +36 -36
- 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_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 +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 +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 +6 -6
- 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 +6 -6
- 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 +6 -6
- 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 +6 -6
- 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_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.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_client-reference-manifest.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_client-reference-manifest.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 +3 -3
- 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.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.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_client-reference-manifest.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_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_client-reference-manifest.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_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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.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 +6 -6
- 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 +6 -6
- 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 +6 -6
- 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 +6 -6
- 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 +6 -6
- package/.next/standalone/.next/server/app/login.html +1 -1
- package/.next/standalone/.next/server/app/login.rsc +6 -6
- package/.next/standalone/.next/server/app/onboarding/page.js +4 -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 +7 -7
- 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 +7 -7
- package/.next/standalone/.next/server/app/settings.html +1 -1
- package/.next/standalone/.next/server/app/settings.rsc +8 -8
- package/.next/standalone/.next/server/app-paths-manifest.json +40 -40
- package/.next/standalone/.next/server/chunks/1002.js +1 -1
- package/.next/standalone/.next/server/chunks/1596.js +2 -2
- package/.next/standalone/.next/server/chunks/1673.js +1 -0
- package/.next/standalone/.next/server/chunks/1871.js +1 -1
- 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/{2675.js → 3139.js} +1 -1
- package/.next/standalone/.next/server/chunks/3405.js +1 -0
- package/.next/standalone/.next/server/chunks/4294.js +1 -0
- package/.next/standalone/.next/server/chunks/{8251.js → 5044.js} +1 -1
- 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/6836.js +1 -0
- package/.next/standalone/.next/server/chunks/7368.js +1 -1
- package/.next/standalone/.next/server/chunks/8322.js +2 -2
- package/.next/standalone/.next/server/chunks/8881.js +1 -1
- package/.next/standalone/.next/server/chunks/920.js +1 -1
- package/.next/standalone/.next/server/chunks/937.js +2 -2
- 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/next-font-manifest.js +1 -1
- package/.next/standalone/.next/server/next-font-manifest.json +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/chunks/10739-a14d0dc7271f247e.js +1 -0
- package/.next/standalone/.next/static/chunks/19126-f1bc396538752bce.js +1 -0
- package/.next/standalone/.next/static/chunks/{53664-a2be2eaacce03f0f.js → 23588-66d80958224a8544.js} +1 -1
- package/.next/standalone/.next/static/chunks/32190-a110356fb68a4333.js +1 -0
- package/.next/standalone/.next/static/chunks/{4860.d626399834b496e5.js → 4860.15c9ae5b6268c6fc.js} +1 -1
- package/.next/standalone/.next/static/chunks/65371-d3686d82abca6495.js +1 -0
- package/.next/standalone/.next/static/chunks/70317-49653c6dce23f1d9.js +1 -0
- package/.next/standalone/.next/static/chunks/8731-7869a6ed671c63a3.js +1 -0
- package/.next/standalone/.next/static/chunks/{99373.aedaca88297c6d8b.js → 99373.9939e11f5b4e0615.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-719f0815a37f19be.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-bc8c3c0362de377c.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-c1c4b5798c494341.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-29ac4172940780e0.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/ideas/[ideaUuid]/{page-2d820769aa7bcaf6.js → page-e59232665c3a0412.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/ideas/{page-dec0e71221d77928.js → page-9b1e02b5e2cfb410.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-567e98e9e90a7ef1.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/{page-bc66567cb9c40bf0.js → page-31f4ffd9778a39ed.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/{page-86cfeb421fa97830.js → page-8eded17e1e44522d.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/{page-7fe70579023330da.js → page-e5c99f2020b904f5.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/{page-8c51993bb3866a55.js → page-7947010e9684fbcf.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-a01b45dbe80aeecf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/{layout-22f1a931323bbb60.js → layout-482dee7dace72c88.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/onboarding/page-ac0593c045c64013.js +1 -0
- package/.next/standalone/.next/static/chunks/{webpack-da41e6b9f3fe2f48.js → webpack-1bb984dd0934fa96.js} +1 -1
- package/.next/standalone/.next/static/css/84edd78de243cde6.css +1 -0
- package/.next/standalone/.next/static/css/{ca9796ac54f96058.css → a577d38ad6d7491b.css} +1 -1
- package/.next/standalone/.next/static/media/0f1bdadaf30e2d5f-s.woff2 +0 -0
- package/.next/standalone/.next/static/media/22a5144ee8d83bca-s.p.woff2 +0 -0
- package/.next/standalone/.next/static/media/2c34d62a75506231-s.woff2 +0 -0
- package/.next/standalone/.next/static/media/601f5c280d60caca-s.woff2 +0 -0
- package/.next/standalone/.next/static/media/9766a7e9e2e0ad5a-s.woff2 +0 -0
- package/.next/standalone/.next/static/media/a115172161b307bb-s.woff2 +0 -0
- package/.next/standalone/.next/static/media/aa016aab0e6d1295-s.woff2 +0 -0
- package/.next/standalone/.next/static/media/b66cf8e69499582a-s.woff2 +0 -0
- package/.next/standalone/.next/static/media/d100b2a099e34044-s.woff2 +0 -0
- package/.next/standalone/.next/static/media/f5271587012faf78-s.p.woff2 +0 -0
- package/.next/standalone/.next/static/media/f639721981034f88-s.woff2 +0 -0
- package/.next/standalone/package.json +1 -1
- package/.next/standalone/public/chorus-plugin/.claude-plugin/plugin.json +7 -1
- package/.next/standalone/public/chorus-plugin/agents/proposal-reviewer.md +1 -1
- package/.next/standalone/public/chorus-plugin/agents/task-reviewer.md +1 -1
- package/.next/standalone/public/chorus-plugin/bin/on-post-verify-task.sh +190 -0
- package/.next/standalone/public/chorus-plugin/bin/on-session-start.sh +58 -0
- package/.next/standalone/public/chorus-plugin/bin/test-syntax.sh +1 -0
- package/.next/standalone/public/chorus-plugin/bin/tests/test-on-post-verify-task.sh +365 -0
- package/.next/standalone/public/chorus-plugin/hooks/hooks.json +9 -0
- package/.next/standalone/public/chorus-plugin/skills/chorus/SKILL.md +2 -1
- package/.next/standalone/public/chorus-plugin/skills/develop/SKILL.md +9 -1
- package/.next/standalone/public/chorus-plugin/skills/idea/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/openspec-aware/SKILL.md +436 -0
- package/.next/standalone/public/chorus-plugin/skills/proposal/SKILL.md +11 -1
- package/.next/standalone/public/chorus-plugin/skills/quick-dev/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/review/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/yolo/SKILL.md +26 -4
- package/.next/standalone/public/install-opencode.sh +284 -0
- package/README.md +44 -10
- package/README.zh.md +24 -10
- package/chorus.mjs +56 -12
- package/package.json +1 -1
- package/.next/standalone/.next/server/chunks/1639.js +0 -1
- package/.next/standalone/.next/server/chunks/3300.js +0 -1
- package/.next/standalone/.next/server/chunks/8584.js +0 -1
- package/.next/standalone/.next/server/chunks/9051.js +0 -1
- package/.next/standalone/.next/static/chunks/10739-5c185aa0432f5d56.js +0 -1
- package/.next/standalone/.next/static/chunks/19126-858a24cab6fd338a.js +0 -1
- package/.next/standalone/.next/static/chunks/29445-04c4ab36da85b7da.js +0 -1
- package/.next/standalone/.next/static/chunks/39611-cc227784ed679a6d.js +0 -1
- package/.next/standalone/.next/static/chunks/96919-8cbf6310c703e7af.js +0 -1
- package/.next/standalone/.next/static/chunks/99513-24849ff68a8098e1.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-acddb9c84f5d1607.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-b4c6141dd26cc506.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-4bf7bff8d68509f9.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-37a0cea0ba40c31b.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-355321010dd82e56.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-8db25385236a9bbf.js +0 -1
- package/.next/standalone/.next/static/chunks/app/onboarding/page-e9409a2935c3c480.js +0 -1
- package/.next/standalone/.next/static/css/de70bee13400563f.css +0 -1
- package/.next/standalone/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
- package/.next/standalone/.next/static/media/747892c23ea88013-s.woff2 +0 -0
- package/.next/standalone/.next/static/media/8d697b304b401681-s.woff2 +0 -0
- package/.next/standalone/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
- package/.next/standalone/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
- package/.next/standalone/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
- /package/.next/standalone/.next/static/{CQcM9hNpa5m8P_K5qveuk → CqUAJ6h-gVfCxU6FvVekP}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{CQcM9hNpa5m8P_K5qveuk → CqUAJ6h-gVfCxU6FvVekP}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Chorus + OpenCode one-shot plugin installer
|
|
3
|
+
#
|
|
4
|
+
# Usage:
|
|
5
|
+
# curl -fsSL https://<your-chorus>/install-opencode.sh | bash
|
|
6
|
+
#
|
|
7
|
+
# What this does (idempotent, safe to re-run):
|
|
8
|
+
# 1. Verifies `opencode` CLI is installed.
|
|
9
|
+
# 2. Adds "opencode-chorus" to the `plugin` array in
|
|
10
|
+
# ~/.config/opencode/opencode.json. Creates the file if missing.
|
|
11
|
+
# Preserves any existing plugins.
|
|
12
|
+
# 3. Sets file permissions to 600.
|
|
13
|
+
#
|
|
14
|
+
# What this does NOT do:
|
|
15
|
+
# - Write to ~/.bashrc / ~/.zshrc. You must export CHORUS_URL and
|
|
16
|
+
# CHORUS_API_KEY yourself before launching opencode (the plugin reads
|
|
17
|
+
# process.env on startup).
|
|
18
|
+
# - Invoke jq / node / python. Pure POSIX awk/sed/grep only.
|
|
19
|
+
|
|
20
|
+
set -euo pipefail
|
|
21
|
+
|
|
22
|
+
# ---------- cosmetics ----------
|
|
23
|
+
BOLD=$'\033[1m'; DIM=$'\033[2m'; GREEN=$'\033[32m'; YELLOW=$'\033[33m'; RED=$'\033[31m'; RESET=$'\033[0m'
|
|
24
|
+
ok() { printf "${GREEN}\xe2\x9c\x93${RESET} %s\n" "$*"; }
|
|
25
|
+
warn() { printf "${YELLOW}!${RESET} %s\n" "$*" >&2; }
|
|
26
|
+
die() { printf "${RED}\xe2\x9c\x97${RESET} %s\n" "$*" >&2; exit 1; }
|
|
27
|
+
hdr() { printf "\n${BOLD}%s${RESET}\n" "$*"; }
|
|
28
|
+
|
|
29
|
+
# ---------- config ----------
|
|
30
|
+
PLUGIN_NAME="opencode-chorus"
|
|
31
|
+
CONFIG_DIR="${OPENCODE_CONFIG_DIR:-$HOME/.config/opencode}"
|
|
32
|
+
CONFIG_FILE="$CONFIG_DIR/opencode.json"
|
|
33
|
+
BACKUP_FILE="$CONFIG_FILE.chorus-bak"
|
|
34
|
+
|
|
35
|
+
# ---------- step 1: check opencode ----------
|
|
36
|
+
hdr "1/3 Checking OpenCode CLI"
|
|
37
|
+
if command -v opencode >/dev/null 2>&1; then
|
|
38
|
+
ok "Found $(opencode --version 2>/dev/null | head -1)"
|
|
39
|
+
else
|
|
40
|
+
warn "opencode not found in PATH — install it first: https://opencode.ai/docs/"
|
|
41
|
+
warn "Proceeding to write the config anyway. OpenCode will pick it up on install."
|
|
42
|
+
fi
|
|
43
|
+
|
|
44
|
+
# ---------- step 2: ensure config dir ----------
|
|
45
|
+
hdr "2/3 Updating $CONFIG_FILE"
|
|
46
|
+
mkdir -p "$CONFIG_DIR"
|
|
47
|
+
|
|
48
|
+
# Helper: print the manual instructions and exit 0 (non-fatal).
|
|
49
|
+
print_manual_hint() {
|
|
50
|
+
warn "Could not automatically update $CONFIG_FILE."
|
|
51
|
+
warn "Please add \"$PLUGIN_NAME\" to the \"plugin\" array manually:"
|
|
52
|
+
cat >&2 <<HINT
|
|
53
|
+
|
|
54
|
+
{
|
|
55
|
+
"\$schema": "https://opencode.ai/config.json",
|
|
56
|
+
"plugin": ["$PLUGIN_NAME"${EXISTING_PLUGIN_HINT:-}]
|
|
57
|
+
...
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
HINT
|
|
61
|
+
exit 0
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
# ---------- Case A: file does not exist ----------
|
|
65
|
+
if [ ! -f "$CONFIG_FILE" ]; then
|
|
66
|
+
cat > "$CONFIG_FILE" <<JSON
|
|
67
|
+
{
|
|
68
|
+
"\$schema": "https://opencode.ai/config.json",
|
|
69
|
+
"plugin": ["$PLUGIN_NAME"]
|
|
70
|
+
}
|
|
71
|
+
JSON
|
|
72
|
+
chmod 600 "$CONFIG_FILE"
|
|
73
|
+
ok "Created $CONFIG_FILE with $PLUGIN_NAME"
|
|
74
|
+
else
|
|
75
|
+
# File exists — back it up once.
|
|
76
|
+
if [ ! -f "$BACKUP_FILE" ]; then
|
|
77
|
+
cp "$CONFIG_FILE" "$BACKUP_FILE"
|
|
78
|
+
chmod 600 "$BACKUP_FILE"
|
|
79
|
+
ok "Backed up original config to $BACKUP_FILE"
|
|
80
|
+
fi
|
|
81
|
+
|
|
82
|
+
# Reject JSONC (comments). Presence of // or /* strongly suggests the file
|
|
83
|
+
# is hand-edited JSONC; our line-based awk would mangle it. Bail cleanly.
|
|
84
|
+
if grep -qE '^[[:space:]]*//|/\*' "$CONFIG_FILE"; then
|
|
85
|
+
warn "Detected // or /* in $CONFIG_FILE — looks like JSONC with comments."
|
|
86
|
+
print_manual_hint
|
|
87
|
+
fi
|
|
88
|
+
|
|
89
|
+
# Case C1: plugin array already contains opencode-chorus → no-op.
|
|
90
|
+
# Scope the check to the "plugin" array itself: a top-level occurrence of
|
|
91
|
+
# "opencode-chorus" outside that array (e.g. in a "lastInstalled" field)
|
|
92
|
+
# must not trigger the no-op shortcut.
|
|
93
|
+
plugin_contains_self() {
|
|
94
|
+
awk -v plugin="$PLUGIN_NAME" '
|
|
95
|
+
# Track whether we are currently inside the first "plugin" array.
|
|
96
|
+
# State machine:
|
|
97
|
+
# 0 = before the plugin key
|
|
98
|
+
# 1 = inside the plugin array (between its [ and matching ])
|
|
99
|
+
BEGIN { state = 0 }
|
|
100
|
+
state == 0 {
|
|
101
|
+
# Is the "plugin" key on this line?
|
|
102
|
+
if (match($0, /"plugin"[[:space:]]*:[[:space:]]*\[/)) {
|
|
103
|
+
# Consume the rest of the line starting at the [
|
|
104
|
+
rest = substr($0, RSTART + RLENGTH - 1)
|
|
105
|
+
state = 1
|
|
106
|
+
# Fall through to state == 1 handling for this rest.
|
|
107
|
+
$0 = rest
|
|
108
|
+
} else {
|
|
109
|
+
next
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
state == 1 {
|
|
113
|
+
# Look for the closing ] on this line (naive — good enough for
|
|
114
|
+
# standard JSON because plugin entries are plain strings).
|
|
115
|
+
close_pos = index($0, "]")
|
|
116
|
+
if (close_pos > 0) {
|
|
117
|
+
chunk = substr($0, 1, close_pos - 1)
|
|
118
|
+
} else {
|
|
119
|
+
chunk = $0
|
|
120
|
+
}
|
|
121
|
+
# Check for the quoted token inside the array chunk only.
|
|
122
|
+
if (index(chunk, "\"" plugin "\"") > 0) {
|
|
123
|
+
print "yes"
|
|
124
|
+
exit 0
|
|
125
|
+
}
|
|
126
|
+
if (close_pos > 0) exit 0
|
|
127
|
+
}
|
|
128
|
+
' "$CONFIG_FILE"
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
if [ "$(plugin_contains_self)" = "yes" ]; then
|
|
132
|
+
ok "$PLUGIN_NAME already present in $CONFIG_FILE — nothing to do"
|
|
133
|
+
else
|
|
134
|
+
# Decide: Case B (no plugin key) vs Case C2 (plugin key exists without this plugin).
|
|
135
|
+
if grep -qE '"plugin"[[:space:]]*:' "$CONFIG_FILE"; then
|
|
136
|
+
# Case C2: insert into existing plugin array.
|
|
137
|
+
# Strategy: find the first "plugin" key, locate its array bracket pair,
|
|
138
|
+
# insert "opencode-chorus" before the closing ].
|
|
139
|
+
#
|
|
140
|
+
# Only handle the common cases where the array is on a single line or
|
|
141
|
+
# a multi-line array that has one entry per line. Otherwise bail to hint.
|
|
142
|
+
tmp="$(mktemp "${TMPDIR:-/tmp}/chorus-opencode.XXXXXX")"
|
|
143
|
+
if awk -v plugin="$PLUGIN_NAME" '
|
|
144
|
+
BEGIN { done = 0 }
|
|
145
|
+
# Single-line empty array: "plugin": []
|
|
146
|
+
!done && /"plugin"[[:space:]]*:[[:space:]]*\[[[:space:]]*\]/ {
|
|
147
|
+
sub(/\[[[:space:]]*\]/, "[\"" plugin "\"]")
|
|
148
|
+
done = 1
|
|
149
|
+
print
|
|
150
|
+
next
|
|
151
|
+
}
|
|
152
|
+
# Single-line non-empty array: "plugin": [ "foo", "bar" ]
|
|
153
|
+
!done && match($0, /"plugin"[[:space:]]*:[[:space:]]*\[[^\]]*\]/) {
|
|
154
|
+
line = $0
|
|
155
|
+
pre = substr(line, 1, RSTART - 1)
|
|
156
|
+
match_text = substr(line, RSTART, RLENGTH)
|
|
157
|
+
post = substr(line, RSTART + RLENGTH)
|
|
158
|
+
# Insert before the closing ]
|
|
159
|
+
sub(/\][[:space:]]*$/, ", \"" plugin "\"]", match_text)
|
|
160
|
+
# If the match still ends in ] (no trailing whitespace stripped), fall through
|
|
161
|
+
print pre match_text post
|
|
162
|
+
done = 1
|
|
163
|
+
next
|
|
164
|
+
}
|
|
165
|
+
# Multi-line array opener: "plugin": [ (and not on same line closer)
|
|
166
|
+
!done && /"plugin"[[:space:]]*:[[:space:]]*\[[[:space:]]*$/ {
|
|
167
|
+
print
|
|
168
|
+
getline nextline
|
|
169
|
+
# Empty multi-line array: next line is just ]
|
|
170
|
+
if (nextline ~ /^[[:space:]]*\][[:space:]]*,?[[:space:]]*$/) {
|
|
171
|
+
print " \"" plugin "\""
|
|
172
|
+
print nextline
|
|
173
|
+
done = 1
|
|
174
|
+
next
|
|
175
|
+
}
|
|
176
|
+
# Non-empty multi-line: emit entries verbatim until we hit the ]
|
|
177
|
+
buffer[++bn] = nextline
|
|
178
|
+
while ((getline nextline) > 0) {
|
|
179
|
+
if (nextline ~ /^[[:space:]]*\][[:space:]]*,?[[:space:]]*$/) {
|
|
180
|
+
# Last existing entry may not have trailing comma; add one.
|
|
181
|
+
last = buffer[bn]
|
|
182
|
+
if (last !~ /,[[:space:]]*$/) {
|
|
183
|
+
sub(/[[:space:]]*$/, ",", buffer[bn])
|
|
184
|
+
}
|
|
185
|
+
for (i = 1; i <= bn; i++) print buffer[i]
|
|
186
|
+
# Insert new entry before the closing ]
|
|
187
|
+
# Determine indentation from first buffered entry.
|
|
188
|
+
match(buffer[1], /^[[:space:]]*/)
|
|
189
|
+
indent = substr(buffer[1], 1, RLENGTH)
|
|
190
|
+
print indent "\"" plugin "\""
|
|
191
|
+
print nextline
|
|
192
|
+
done = 1
|
|
193
|
+
bn = 0
|
|
194
|
+
break
|
|
195
|
+
}
|
|
196
|
+
buffer[++bn] = nextline
|
|
197
|
+
}
|
|
198
|
+
next
|
|
199
|
+
}
|
|
200
|
+
{ print }
|
|
201
|
+
END {
|
|
202
|
+
if (!done) exit 2
|
|
203
|
+
}
|
|
204
|
+
' "$CONFIG_FILE" > "$tmp"; then
|
|
205
|
+
mv "$tmp" "$CONFIG_FILE"
|
|
206
|
+
chmod 600 "$CONFIG_FILE"
|
|
207
|
+
ok "Added $PLUGIN_NAME to existing \"plugin\" array"
|
|
208
|
+
else
|
|
209
|
+
rm -f "$tmp"
|
|
210
|
+
warn "The \"plugin\" key exists but I could not safely determine where to insert the new entry."
|
|
211
|
+
EXISTING_PLUGIN_HINT=", ...your existing entries..."
|
|
212
|
+
print_manual_hint
|
|
213
|
+
fi
|
|
214
|
+
else
|
|
215
|
+
# Case B: no plugin key in file → inject it.
|
|
216
|
+
# We look for the first top-level "{" then insert `"plugin": [...]` on the next line.
|
|
217
|
+
# Safer: look for the first line containing just "{" optionally with whitespace.
|
|
218
|
+
tmp="$(mktemp "${TMPDIR:-/tmp}/chorus-opencode.XXXXXX")"
|
|
219
|
+
if awk -v plugin="$PLUGIN_NAME" '
|
|
220
|
+
BEGIN { inserted = 0 }
|
|
221
|
+
!inserted && /^[[:space:]]*\{[[:space:]]*$/ {
|
|
222
|
+
print
|
|
223
|
+
print " \"plugin\": [\"" plugin "\"],"
|
|
224
|
+
inserted = 1
|
|
225
|
+
next
|
|
226
|
+
}
|
|
227
|
+
{ print }
|
|
228
|
+
END { if (!inserted) exit 2 }
|
|
229
|
+
' "$CONFIG_FILE" > "$tmp"; then
|
|
230
|
+
mv "$tmp" "$CONFIG_FILE"
|
|
231
|
+
chmod 600 "$CONFIG_FILE"
|
|
232
|
+
ok "Added \"plugin\" field with $PLUGIN_NAME to $CONFIG_FILE"
|
|
233
|
+
else
|
|
234
|
+
rm -f "$tmp"
|
|
235
|
+
warn "Could not find a line with just \"{\" to inject the plugin array."
|
|
236
|
+
print_manual_hint
|
|
237
|
+
fi
|
|
238
|
+
fi
|
|
239
|
+
fi
|
|
240
|
+
fi
|
|
241
|
+
|
|
242
|
+
# ---------- step 3: reminders ----------
|
|
243
|
+
hdr "3/3 Final reminders"
|
|
244
|
+
|
|
245
|
+
# Environment check — read-only warning, don't export.
|
|
246
|
+
missing_env=""
|
|
247
|
+
if [ -z "${CHORUS_URL:-}" ]; then
|
|
248
|
+
missing_env="$missing_env CHORUS_URL"
|
|
249
|
+
fi
|
|
250
|
+
if [ -z "${CHORUS_API_KEY:-}" ]; then
|
|
251
|
+
missing_env="$missing_env CHORUS_API_KEY"
|
|
252
|
+
fi
|
|
253
|
+
|
|
254
|
+
if [ -n "$missing_env" ]; then
|
|
255
|
+
warn "The following environment variables are not set in this shell:$missing_env"
|
|
256
|
+
warn "The plugin reads them on OpenCode startup. Please export them in your shell rc:"
|
|
257
|
+
cat >&2 <<'HINT'
|
|
258
|
+
|
|
259
|
+
export CHORUS_URL="https://<your-chorus-instance>"
|
|
260
|
+
export CHORUS_API_KEY="cho_..."
|
|
261
|
+
|
|
262
|
+
HINT
|
|
263
|
+
warn "Then re-source your shell rc, or launch opencode from a shell where they are exported."
|
|
264
|
+
else
|
|
265
|
+
ok "CHORUS_URL and CHORUS_API_KEY are set in this shell"
|
|
266
|
+
fi
|
|
267
|
+
|
|
268
|
+
hdr "Done."
|
|
269
|
+
cat <<'NEXT'
|
|
270
|
+
Start OpenCode — Bun will fetch opencode-chorus on first launch:
|
|
271
|
+
|
|
272
|
+
opencode
|
|
273
|
+
|
|
274
|
+
Then in OpenCode, ask the agent:
|
|
275
|
+
|
|
276
|
+
check in to chorus
|
|
277
|
+
|
|
278
|
+
If the plugin fails to load, clear the package cache and retry:
|
|
279
|
+
|
|
280
|
+
rm -rf ~/.cache/opencode/packages/opencode-chorus@latest
|
|
281
|
+
|
|
282
|
+
To roll back this change:
|
|
283
|
+
NEXT
|
|
284
|
+
printf " mv %s %s\n\n" "$BACKUP_FILE" "$CONFIG_FILE"
|
package/README.md
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
<p align="center"><a href="README.zh.md">中文</a></p>
|
|
17
17
|
|
|
18
|
-
Chorus is an agent harness — the infrastructure that wraps around LLM agents to manage session lifecycle, task state, sub-agent orchestration, observability, and failure recovery. It lets multiple AI Agents (
|
|
18
|
+
Chorus is an agent harness — the infrastructure that wraps around LLM agents to manage session lifecycle, task state, sub-agent orchestration, observability, and failure recovery. It lets multiple AI Agents (with fine-grained, configurable permissions) and humans collaborate through the full workflow from requirements to delivery.
|
|
19
19
|
|
|
20
20
|
Inspired by the **[AI-DLC (AI-Driven Development Lifecycle)](https://aws.amazon.com/blogs/devops/ai-driven-development-life-cycle/)** methodology. Core philosophy: **Reversed Conversation** — AI proposes, humans verify.
|
|
21
21
|
|
|
@@ -26,15 +26,20 @@ Inspired by the **[AI-DLC (AI-Driven Development Lifecycle)](https://aws.amazon.
|
|
|
26
26
|
```
|
|
27
27
|
Idea ──> Proposal ──> [Document + Task DAG] ──> Execute ──> Verify ──> Done
|
|
28
28
|
^ ^ ^ ^ ^ ^
|
|
29
|
-
Human
|
|
30
|
-
creates
|
|
31
|
-
& plans & tasks reports & verifies
|
|
29
|
+
Human idea:write proposal:write task:write *:admin *:admin
|
|
30
|
+
creates + elaborate + drafts + reports + verifies + closes
|
|
32
31
|
```
|
|
33
32
|
|
|
33
|
+
The labels under each stage are the **permissions** an actor needs at that stage — granted to a human, an Agent (preset or Custom), or both. There are no fixed roles; any combination of the 5 × 3 permission matrix is possible. See [`docs/PERMISSIONS.md`](docs/PERMISSIONS.md).
|
|
34
|
+
|
|
34
35
|
---
|
|
35
36
|
|
|
36
37
|
## What's New
|
|
37
38
|
|
|
39
|
+
**[v0.8.0](https://chorus-ai.dev/blog/chorus-v0.8.0-release/)** — OpenSpec-aware mode (Claude Code): auto-activates when an `openspec/` directory and the `openspec` CLI are both present, adds `/opsx/{explore,propose,apply,archive}` and a post-verify archive-trigger hook.
|
|
40
|
+
|
|
41
|
+
**[v0.7.0](https://chorus-ai.dev/blog/chorus-v0.7.0-release/)** — Fine-grained agent permissions: 5 resources × 3 actions grid replaces the PM/Developer/Admin three-way choice, with presets + a Custom option for free combination.
|
|
42
|
+
|
|
38
43
|
**[v0.6.7](https://chorus-ai.dev/blog/chorus-v0.6.7-release/)** — Chorus plugin for Codex CLI (one-command installer), workspace picker when one email belongs to multiple Companies, per-client connect guides.
|
|
39
44
|
|
|
40
45
|
**[v0.6.6](https://chorus-ai.dev/blog/chorus-v0.6.6-release/)** — npm one-click install (`npx @chorus-aidlc/chorus`), document export (MD/PDF/Word), proposal revoke, faster agent checkin with work status at a glance.
|
|
@@ -153,6 +158,7 @@ A Cmd+K command palette for searching across all 6 entity types (Tasks, Ideas, P
|
|
|
153
158
|
- **Task DAG** — Dependency modeling, cycle detection, and interactive visualization
|
|
154
159
|
- **Kanban** — Real-time task flow with Worker badges and agent presence
|
|
155
160
|
- **Multi-Agent Collaboration** — Claude Code Agent Teams (Swarm Mode) for parallel execution
|
|
161
|
+
- **Fine-Grained Agent Permissions** — 5 resources × 3 actions grid with preset + custom combinations ([details](docs/PERMISSIONS.md))
|
|
156
162
|
- **Chorus Plugin** — Lifecycle hooks automate session create/close, heartbeats, and context injection
|
|
157
163
|
- **Requirements Elaboration** — Structured Q&A rounds before proposal creation
|
|
158
164
|
- **Proposal Approval Flow** — PM drafts, Admin approves, drafts materialize into real entities
|
|
@@ -178,7 +184,7 @@ A Cmd+K command palette for searching across all 6 entity types (Tasks, Ideas, P
|
|
|
178
184
|
│ └───────────────────────────────────────────────────────────┘ │
|
|
179
185
|
│ │
|
|
180
186
|
│ ┌── API Layer ──────────────────────────────────────────────┐ │
|
|
181
|
-
│ │ /api/mcp — MCP
|
|
187
|
+
│ │ /api/mcp — MCP Streaming (50+ tools, permission-gated) │ │
|
|
182
188
|
│ │ /api/* — REST API (Web UI + SSE push) │ │
|
|
183
189
|
│ └───────────────────────────────────────────────────────────┘ │
|
|
184
190
|
│ │
|
|
@@ -191,8 +197,10 @@ A Cmd+K command palette for searching across all 6 entity types (Tasks, Ideas, P
|
|
|
191
197
|
│ └───────────────────────────────────────────────────────────┘ │
|
|
192
198
|
└──────────────────────────────────────────────────────────────────┘
|
|
193
199
|
↑ ↑ ↑ ↑
|
|
194
|
-
|
|
195
|
-
(
|
|
200
|
+
Agent w/ Agent w/ Agent w/ Human
|
|
201
|
+
idea+proposal task:write *:admin perms (Browser)
|
|
202
|
+
:write perms perms (proxy approval)
|
|
203
|
+
(LLM) (LLM) (LLM)
|
|
196
204
|
│
|
|
197
205
|
┌──────────▼──────────┐ ┌─────────────────────┐
|
|
198
206
|
│ PostgreSQL + Prisma │ │ Redis (optional) │
|
|
@@ -290,7 +298,7 @@ The interactive installer provisions VPC, Aurora Serverless v2, ElastiCache Serv
|
|
|
290
298
|
|
|
291
299
|
### Connect AI Agents
|
|
292
300
|
|
|
293
|
-
The fastest path is the in-app setup wizard: open the Web UI, go to **Settings → Setup Guide → Open setup guide**, and follow the step-by-step instructions for your client (Claude Code, Codex, OpenClaw, or other agents). The wizard creates the API key for you, shows the exact commands, and walks through verifying the connection.
|
|
301
|
+
The fastest path is the in-app setup wizard: open the Web UI, go to **Settings → Setup Guide → Open setup guide**, and follow the step-by-step instructions for your client (Claude Code, Codex, OpenCode, OpenClaw, or other agents). The wizard creates the API key for you, shows the exact commands, and walks through verifying the connection.
|
|
294
302
|
|
|
295
303
|
If you'd rather read the full docs:
|
|
296
304
|
|
|
@@ -298,8 +306,11 @@ If you'd rather read the full docs:
|
|
|
298
306
|
|--------|-------|
|
|
299
307
|
| Claude Code | [CONNECT_CLAUDE_CODE.md](docs/CONNECT_CLAUDE_CODE.md) |
|
|
300
308
|
| Codex CLI | [CONNECT_CODEX.md](docs/CONNECT_CODEX.md) |
|
|
309
|
+
| OpenCode † | [CONNECT_OPENCODE.md](docs/CONNECT_OPENCODE.md) |
|
|
301
310
|
| Other MCP agents (Cursor, Continue, custom, …) | [CONNECT_OTHER_AGENTS.md](docs/CONNECT_OTHER_AGENTS.md) |
|
|
302
311
|
|
|
312
|
+
† OpenCode support is provided by the community-maintained [`opencode-chorus`](https://github.com/etnperlong/opencode-chorus) plugin (npm: [`opencode-chorus`](https://www.npmjs.com/package/opencode-chorus)), authored by [@etnperlong](https://github.com/etnperlong). Thanks!
|
|
313
|
+
|
|
303
314
|
Create API Keys in the Web UI under **Settings → Agents → Create API Key**. Keys start with `cho_` and are shown only once.
|
|
304
315
|
|
|
305
316
|

|
|
@@ -310,8 +321,29 @@ Create API Keys in the Web UI under **Settings → Agents → Create API Key**.
|
|
|
310
321
|
|
|
311
322
|
| Method | Location | Use Case |
|
|
312
323
|
|--------|----------|----------|
|
|
313
|
-
| **Plugin-embedded** | `public/chorus-plugin/skills
|
|
314
|
-
| **
|
|
324
|
+
| **Plugin-embedded (Claude Code)** | `public/chorus-plugin/skills/` | Claude Code + Chorus plugin, automated Sessions and lifecycle hooks |
|
|
325
|
+
| **Plugin-embedded (Codex CLI)** | `plugins/chorus/skills/` | Codex CLI + Chorus plugin, ported skills with `$`-prefixed slash commands |
|
|
326
|
+
| **Standalone** | `public/skill/` (served at `/skill/`) | Any other MCP-capable Agent (Cursor, Continue, custom), manual Session management |
|
|
327
|
+
|
|
328
|
+
### OpenSpec mode (opt-in, plugin 0.8.1+)
|
|
329
|
+
|
|
330
|
+
PM agents that have the [OpenSpec](https://github.com/Fission-AI/OpenSpec)
|
|
331
|
+
CLI installed can author proposals in a structured `proposal.md` +
|
|
332
|
+
`design.md` + `specs/<capability>/spec.md` layout. Local files are the
|
|
333
|
+
working copy and Chorus `documentDrafts` are the mirror; reviewers see a
|
|
334
|
+
predictable shape (`## ADDED Requirements`, `### Requirement:`,
|
|
335
|
+
`#### Scenario:`) instead of free-form Markdown. A PostToolUse hook on
|
|
336
|
+
`chorus_admin_verify_task` injects an `openspec archive <slug>` reminder
|
|
337
|
+
when the last task of an OpenSpec idea is verified, so finalized specs
|
|
338
|
+
are merged into the long-term spec set right after sign-off. The mode is
|
|
339
|
+
strictly opt-in: when `openspec` is not installed, behavior is unchanged.
|
|
340
|
+
Master switch on Claude Code is `enableOpenSpec` (plugin userConfig,
|
|
341
|
+
default `true`); both clients also honor `CHORUS_OPENSPEC_MODE=off`. No
|
|
342
|
+
new MCP tools or schema changes ship in this mode; the canonical skill
|
|
343
|
+
reuses the existing `chorus_pm_*` draft and document tools, with mirror
|
|
344
|
+
calls routed through the `chorus-api.sh` wrapper to keep multi-thousand-
|
|
345
|
+
line markdown out of LLM context. See
|
|
346
|
+
[OPENSPEC_MODE.md](docs/OPENSPEC_MODE.md) for the full guide.
|
|
315
347
|
|
|
316
348
|
---
|
|
317
349
|
|
|
@@ -322,7 +354,9 @@ Create API Keys in the Web UI under **Settings → Agents → Create API Key**.
|
|
|
322
354
|
| [PRD](docs/PRD_Chorus.md) | Product Requirements Document |
|
|
323
355
|
| [Architecture](docs/ARCHITECTURE.md) | Technical Architecture Document |
|
|
324
356
|
| [MCP Tools](docs/MCP_TOOLS.md) | MCP Tools Reference |
|
|
357
|
+
| [Permissions](docs/PERMISSIONS.md) | Agent permission model (5 × 3 matrix, presets, Custom mode) |
|
|
325
358
|
| [Chorus Plugin](docs/chorus-plugin.md) | Plugin Design & Hook Documentation |
|
|
359
|
+
| [OpenSpec Mode](docs/OPENSPEC_MODE.md) | Opt-in OpenSpec authoring mode for PM agents (Plugin 0.8.1+) |
|
|
326
360
|
| [Search](docs/SEARCH.md) | Global Search Technical Design |
|
|
327
361
|
| [AI-DLC Gap Analysis](docs/AIDLC_GAP_ANALYSIS.md) | AI-DLC Methodology Gap Analysis |
|
|
328
362
|
| [AIG Implementation Plan](docs/CHORUS_AIG_PLAN.md) | Agent transparency roadmap |
|
package/README.zh.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
<p align="center"><a href="README.md">English</a></p>
|
|
8
8
|
|
|
9
|
-
Chorus 是一个 Agent Harness——包裹在 LLM 外面的基础设施层,负责管理会话生命周期、任务状态、子 Agent
|
|
9
|
+
Chorus 是一个 Agent Harness——包裹在 LLM 外面的基础设施层,负责管理会话生命周期、任务状态、子 Agent 编排、可观测性和故障恢复。它让多个具备细粒度权限配置的 AI Agent 和人类在同一平台上协作,完成从需求到交付的全流程。
|
|
10
10
|
|
|
11
11
|
受 **[AI-DLC(AI-Driven Development Lifecycle)](https://aws.amazon.com/blogs/devops/ai-driven-development-life-cycle/)** 方法论启发。核心理念:**Reversed Conversation**——AI 提议,人类验证。
|
|
12
12
|
|
|
@@ -17,15 +17,20 @@ Chorus 是一个 Agent Harness——包裹在 LLM 外面的基础设施层,负
|
|
|
17
17
|
```
|
|
18
18
|
Idea ──> Proposal ──> [Document + Task DAG] ──> Execute ──> Verify ──> Done
|
|
19
19
|
^ ^ ^ ^ ^ ^
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
& plans & tasks reports & verifies
|
|
20
|
+
人类 idea:write proposal:write task:write *:admin *:admin
|
|
21
|
+
提出 + 需求澄清 + 起草 PRD/任务 + 报告进度 + 验收 + 关闭
|
|
23
22
|
```
|
|
24
23
|
|
|
24
|
+
每个阶段下方标的是「执行该阶段所需的权限」,可以由人类、Agent(预设或 Custom)或两者持有。没有固定角色,5 × 3 权限矩阵的任意组合都合法,详见 [`docs/PERMISSIONS.md`](docs/PERMISSIONS.md)(英文)。
|
|
25
|
+
|
|
25
26
|
---
|
|
26
27
|
|
|
27
28
|
## 最近更新
|
|
28
29
|
|
|
30
|
+
**[v0.8.0](https://chorus-ai.dev/zh/blog/chorus-v0.8.0-release/)** — OpenSpec-aware 模式(仅 Claude Code):当仓库下同时存在 `openspec/` 目录和 `openspec` CLI 时自动启用,新增 `/opsx/{explore,propose,apply,archive}` 与 task verify 后的 archive-trigger 钩子。
|
|
31
|
+
|
|
32
|
+
**[v0.7.0](https://chorus-ai.dev/zh/blog/chorus-v0.7.0-release/)** — 细粒度 Agent 权限:5 类资源 × 3 个动作组成的网格,取代 PM / Developer / Admin 三选一。保留原有预设,新增 Custom 选项自由组合。
|
|
33
|
+
|
|
29
34
|
**[v0.6.7](https://chorus-ai.dev/zh/blog/chorus-v0.6.7-release/)** — Codex CLI 版 Chorus 插件(一条命令装完)、同一邮箱属于多个 Company 时的工作区选择器、每种客户端的接入文档。
|
|
30
35
|
|
|
31
36
|
**[v0.6.6](https://chorus-ai.dev/zh/blog/chorus-v0.6.6-release/)** — npm 一键安装(`npx @chorus-aidlc/chorus`)、文档导出(MD/PDF/Word)、Proposal 撤回、优化 Agent Checkin 快速获取工作状态。
|
|
@@ -144,6 +149,7 @@ Cmd+K 命令面板,支持跨 6 种实体类型搜索。支持范围筛选(
|
|
|
144
149
|
- **任务 DAG** — 依赖建模、环检测、交互式可视化
|
|
145
150
|
- **Kanban** — 实时任务流转,Worker 徽标与 Agent Presence
|
|
146
151
|
- **Multi-Agent 协作** — Claude Code Agent Teams (Swarm Mode) 并行执行
|
|
152
|
+
- **细粒度 Agent 权限** — 5 类资源 × 3 个动作组成的权限网格,支持预设 + 自定义组合([详细说明](docs/PERMISSIONS.md) · 英文)
|
|
147
153
|
- **Chorus Plugin** — 生命周期钩子自动管理 Session 创建/关闭、心跳、上下文注入
|
|
148
154
|
- **需求澄清** — Proposal 创建前的结构化问答轮次
|
|
149
155
|
- **Proposal 审批流** — PM 起草,Admin 审批,草稿物化为正式实体
|
|
@@ -169,7 +175,7 @@ Cmd+K 命令面板,支持跨 6 种实体类型搜索。支持范围筛选(
|
|
|
169
175
|
│ └───────────────────────────────────────────────────────────┘ │
|
|
170
176
|
│ │
|
|
171
177
|
│ ┌── API Layer ──────────────────────────────────────────────┐ │
|
|
172
|
-
│ │ /api/mcp — MCP
|
|
178
|
+
│ │ /api/mcp — MCP Streaming (50+ tools, permission-gated) │ │
|
|
173
179
|
│ │ /api/* — REST API (Web UI + SSE push) │ │
|
|
174
180
|
│ └───────────────────────────────────────────────────────────┘ │
|
|
175
181
|
│ │
|
|
@@ -182,8 +188,10 @@ Cmd+K 命令面板,支持跨 6 种实体类型搜索。支持范围筛选(
|
|
|
182
188
|
│ └───────────────────────────────────────────────────────────┘ │
|
|
183
189
|
└──────────────────────────────────────────────────────────────────┘
|
|
184
190
|
↑ ↑ ↑ ↑
|
|
185
|
-
|
|
186
|
-
|
|
191
|
+
Agent w/ Agent w/ Agent w/ 人类
|
|
192
|
+
idea+proposal task:write *:admin perms (浏览器)
|
|
193
|
+
:write perms perms (代理人类审批)
|
|
194
|
+
(LLM) (LLM) (LLM)
|
|
187
195
|
│
|
|
188
196
|
┌──────────▼──────────┐ ┌─────────────────────┐
|
|
189
197
|
│ PostgreSQL + Prisma │ │ Redis(可选) │
|
|
@@ -281,7 +289,7 @@ PGlite 在端口 5433 运行嵌入式 PostgreSQL。数据存储在 `.pglite/`,
|
|
|
281
289
|
|
|
282
290
|
### 连接 AI Agent
|
|
283
291
|
|
|
284
|
-
最快的方式是用应用内的 setup 向导:打开 Web UI,进入 **Settings → Setup Guide → 打开设置向导**,按照向导给出的分步指引接入自己的客户端(Claude Code、Codex、OpenClaw 或其他 agent)。向导会帮你创建 API Key、展示完整命令,并引导你验证连接。
|
|
292
|
+
最快的方式是用应用内的 setup 向导:打开 Web UI,进入 **Settings → Setup Guide → 打开设置向导**,按照向导给出的分步指引接入自己的客户端(Claude Code、Codex、OpenCode、OpenClaw 或其他 agent)。向导会帮你创建 API Key、展示完整命令,并引导你验证连接。
|
|
285
293
|
|
|
286
294
|
如果偏好文档:
|
|
287
295
|
|
|
@@ -289,8 +297,11 @@ PGlite 在端口 5433 运行嵌入式 PostgreSQL。数据存储在 `.pglite/`,
|
|
|
289
297
|
|--------|---------|
|
|
290
298
|
| Claude Code | [CONNECT_CLAUDE_CODE.zh.md](docs/CONNECT_CLAUDE_CODE.zh.md) |
|
|
291
299
|
| Codex CLI | [CONNECT_CODEX.zh.md](docs/CONNECT_CODEX.zh.md) |
|
|
300
|
+
| OpenCode † | [CONNECT_OPENCODE.zh.md](docs/CONNECT_OPENCODE.zh.md) |
|
|
292
301
|
| 其他 MCP agent(Cursor / Continue / 自研等) | [CONNECT_OTHER_AGENTS.zh.md](docs/CONNECT_OTHER_AGENTS.zh.md) |
|
|
293
302
|
|
|
303
|
+
† OpenCode 的接入由社区维护的 [`opencode-chorus`](https://github.com/etnperlong/opencode-chorus) 插件提供(npm: [`opencode-chorus`](https://www.npmjs.com/package/opencode-chorus)),作者 [@etnperlong](https://github.com/etnperlong),特此感谢!
|
|
304
|
+
|
|
294
305
|
在 Web UI 的 **Settings → Agents → Create API Key** 创建 API Key。Key 以 `cho_` 开头,仅在创建时显示一次。
|
|
295
306
|
|
|
296
307
|

|
|
@@ -301,8 +312,9 @@ PGlite 在端口 5433 运行嵌入式 PostgreSQL。数据存储在 `.pglite/`,
|
|
|
301
312
|
|
|
302
313
|
| 方式 | 位置 | 适用场景 |
|
|
303
314
|
|------|------|---------|
|
|
304
|
-
| **Plugin
|
|
305
|
-
|
|
|
315
|
+
| **Plugin 内嵌(Claude Code)** | `public/chorus-plugin/skills/` | Claude Code + Chorus 插件,Session 自动化与生命周期 hook |
|
|
316
|
+
| **Plugin 内嵌(Codex CLI)** | `plugins/chorus/skills/` | Codex CLI + Chorus 插件,移植版技能(`$` 前缀斜杠命令)|
|
|
317
|
+
| **独立分发** | `public/skill/`(`/skill/` 路径静态托管)| 其他 MCP 客户端(Cursor / Continue / 自研),手动 Session 管理 |
|
|
306
318
|
|
|
307
319
|
---
|
|
308
320
|
|
|
@@ -313,7 +325,9 @@ PGlite 在端口 5433 运行嵌入式 PostgreSQL。数据存储在 `.pglite/`,
|
|
|
313
325
|
| [PRD](docs/PRD_Chorus.md) | 产品需求文档 |
|
|
314
326
|
| [Architecture](docs/ARCHITECTURE.md) | 技术架构文档 |
|
|
315
327
|
| [MCP Tools](docs/MCP_TOOLS.md) | MCP 工具参考 |
|
|
328
|
+
| [Permissions](docs/PERMISSIONS.md) | Agent 权限模型(5 × 3 矩阵 + 预设 + Custom) |
|
|
316
329
|
| [Chorus Plugin](docs/chorus-plugin.md) | 插件设计与 Hook 说明 |
|
|
330
|
+
| [OpenSpec Mode](docs/OPENSPEC_MODE.md) | OpenSpec 模式(Plugin 0.8.1+,opt-in) |
|
|
317
331
|
| [Search](docs/SEARCH.md) | 全局搜索技术设计 |
|
|
318
332
|
| [AI-DLC Gap Analysis](docs/AIDLC_GAP_ANALYSIS.md) | AI-DLC 方法论差距分析 |
|
|
319
333
|
| [AIG Implementation Plan](docs/CHORUS_AIG_PLAN.md) | Agent 透明度路线图 |
|
package/chorus.mjs
CHANGED
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
import { createConnection } from "node:net";
|
|
13
13
|
import { homedir } from "node:os";
|
|
14
14
|
import { dirname, join, resolve } from "node:path";
|
|
15
|
-
import { fileURLToPath } from "node:url";
|
|
15
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
16
16
|
|
|
17
17
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
18
18
|
|
|
@@ -71,11 +71,13 @@ OPTIONS
|
|
|
71
71
|
-d, --data-dir <path> Data directory for PGlite (default: ~/.chorus-data, env: CHORUS_DATA_DIR)
|
|
72
72
|
--hostname <host> Bind address (default: 0.0.0.0)
|
|
73
73
|
--pglite-port <port> Embedded PGlite port (default: 5433, env: CHORUS_PGLITE_PORT)
|
|
74
|
+
--use-pglite[=BOOL] Use embedded PGlite (default: true; pass =false for external Postgres)
|
|
74
75
|
-h, --help Show this help message
|
|
75
76
|
-v, --version Show version number
|
|
76
77
|
|
|
77
78
|
ENVIRONMENT VARIABLES
|
|
78
|
-
|
|
79
|
+
CHORUS_USE_PGLITE Set to "0" to disable embedded PGlite (default: enabled)
|
|
80
|
+
DATABASE_URL External PostgreSQL URL (required when --use-pglite=false)
|
|
79
81
|
REDIS_URL Redis URL for multi-instance pub/sub
|
|
80
82
|
DEFAULT_USER Auto-create login user email
|
|
81
83
|
DEFAULT_PASSWORD Auto-create login user password
|
|
@@ -83,10 +85,10 @@ ENVIRONMENT VARIABLES
|
|
|
83
85
|
COOKIE_SECURE Set to "true" for HTTPS deployments
|
|
84
86
|
|
|
85
87
|
EXAMPLES
|
|
86
|
-
chorus #
|
|
88
|
+
chorus # Embedded PGlite (default)
|
|
87
89
|
chorus --port 3000 # Custom port
|
|
88
90
|
chorus --data-dir /var/lib/chorus # Custom data directory
|
|
89
|
-
DATABASE_URL=postgres://... chorus
|
|
91
|
+
DATABASE_URL=postgres://... chorus --use-pglite=false # External PostgreSQL
|
|
90
92
|
`);
|
|
91
93
|
process.exit(0);
|
|
92
94
|
}
|
|
@@ -158,14 +160,40 @@ function ensureSecret() {
|
|
|
158
160
|
let pgliteProcess = null;
|
|
159
161
|
|
|
160
162
|
async function main() {
|
|
161
|
-
// 1.
|
|
162
|
-
|
|
163
|
+
// 1. Determine database mode
|
|
164
|
+
// --use-pglite means "the database is PGlite-backed" (local or remote).
|
|
165
|
+
// It controls pg.Pool sizing (max=1 to avoid the @electric-sql/pglite-socket
|
|
166
|
+
// cross-handler race), independently of whether the PGlite process is
|
|
167
|
+
// local or remote.
|
|
168
|
+
//
|
|
169
|
+
// Whether to start a local embedded PGlite is decided by DATABASE_URL:
|
|
170
|
+
// - If DATABASE_URL is set, treat it as a pre-existing DB (PGlite or
|
|
171
|
+
// real Postgres) and connect to it.
|
|
172
|
+
// - Otherwise, --use-pglite=true (default) starts an embedded PGlite.
|
|
173
|
+
const usePgliteFlag = getArg("--use-pglite");
|
|
174
|
+
const envFlag = process.env.CHORUS_USE_PGLITE;
|
|
175
|
+
const usePglite =
|
|
176
|
+
usePgliteFlag === "false" || envFlag === "0" || envFlag === "false"
|
|
177
|
+
? false
|
|
178
|
+
: true;
|
|
179
|
+
const startEmbeddedPglite = usePglite && !process.env.DATABASE_URL;
|
|
180
|
+
|
|
181
|
+
if (!usePglite && !process.env.DATABASE_URL) {
|
|
182
|
+
console.error(
|
|
183
|
+
"ERROR: --use-pglite=false requires DATABASE_URL to be set."
|
|
184
|
+
);
|
|
185
|
+
process.exit(1);
|
|
186
|
+
}
|
|
163
187
|
|
|
164
|
-
// 2.
|
|
165
|
-
|
|
188
|
+
// 2. Signal child processes to pin pg.Pool max=1 when using any PGlite backend.
|
|
189
|
+
if (usePglite) {
|
|
190
|
+
process.env.CHORUS_USE_PGLITE = "1";
|
|
191
|
+
}
|
|
166
192
|
|
|
167
|
-
if (
|
|
168
|
-
|
|
193
|
+
// 3. Start embedded PGlite if requested (no DATABASE_URL pointing at an
|
|
194
|
+
// external instance).
|
|
195
|
+
if (startEmbeddedPglite) {
|
|
196
|
+
mkdirSync(join(dataDir, "pglite"), { recursive: true });
|
|
169
197
|
console.log(`Starting embedded PostgreSQL (PGlite) on port ${PGLITE_PORT}...`);
|
|
170
198
|
|
|
171
199
|
// @electric-sql/pglite-socket does not expose `./dist/scripts/server.js`
|
|
@@ -253,13 +281,26 @@ async function main() {
|
|
|
253
281
|
console.log("");
|
|
254
282
|
console.log(` URL: http://${hostname === "0.0.0.0" ? "localhost" : hostname}:${port}`);
|
|
255
283
|
console.log(` Data: ${dataDir}`);
|
|
256
|
-
|
|
284
|
+
const dbLabel = usePglite
|
|
285
|
+
? (startEmbeddedPglite
|
|
286
|
+
? "PGlite (embedded, pg.Pool max=1)"
|
|
287
|
+
: "PGlite (external, pg.Pool max=1)")
|
|
288
|
+
: "external PostgreSQL";
|
|
289
|
+
console.log(` Database: ${dbLabel}`);
|
|
257
290
|
console.log(` Redis: ${process.env.REDIS_URL ? "connected" : "disabled (in-memory EventBus)"}`);
|
|
258
291
|
const maskedPassword = process.env.DEFAULT_PASSWORD === "chorus"
|
|
259
292
|
? "chorus"
|
|
260
293
|
: "****";
|
|
261
294
|
console.log(` Login: ${process.env.DEFAULT_USER} / ${maskedPassword}`);
|
|
262
295
|
console.log("");
|
|
296
|
+
if (usePglite) {
|
|
297
|
+
console.log(" ⚠ PGlite mode pins pg.Pool to max=1 to avoid a cross-handler");
|
|
298
|
+
console.log(" race in @electric-sql/pglite-socket. Concurrent DB traffic is");
|
|
299
|
+
console.log(" serialized — fine for local single-user use, but for multi-user");
|
|
300
|
+
console.log(" or production deployments use a real PostgreSQL: pass");
|
|
301
|
+
console.log(" --use-pglite=false and set DATABASE_URL.");
|
|
302
|
+
console.log("");
|
|
303
|
+
}
|
|
263
304
|
|
|
264
305
|
// 7. Ensure static assets are accessible inside standalone directory
|
|
265
306
|
// next build puts .next/static/ and public/ at the project root, but
|
|
@@ -279,8 +320,11 @@ async function main() {
|
|
|
279
320
|
}
|
|
280
321
|
|
|
281
322
|
// 8. Start Next.js standalone server
|
|
323
|
+
// Use pathToFileURL — on Windows, dynamic import() rejects bare drive paths
|
|
324
|
+
// like "C:\…\server.js" with ERR_UNSUPPORTED_ESM_URL_SCHEME. file:// URLs
|
|
325
|
+
// work on every platform.
|
|
282
326
|
process.chdir(standaloneDir);
|
|
283
|
-
await import(join(standaloneDir, "server.js"));
|
|
327
|
+
await import(pathToFileURL(join(standaloneDir, "server.js")).href);
|
|
284
328
|
}
|
|
285
329
|
|
|
286
330
|
// ---------------------------------------------------------------------------
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chorus-aidlc/chorus",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "The Agent Harness for AI-Human Collaboration — session lifecycle, task state, sub-agent orchestration, observability, and failure recovery",
|
|
5
5
|
"homepage": "https://github.com/Chorus-AIDLC/Chorus",
|
|
6
6
|
"repository": {
|