@chorus-aidlc/chorus 0.15.1 → 0.16.2
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 +394 -393
- package/.next/standalone/.next/app-path-routes-manifest.json +46 -46
- package/.next/standalone/.next/build-manifest.json +5 -5
- package/.next/standalone/.next/prerender-manifest.json +21 -21
- package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/settings/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/settings/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +2 -2
- package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
- package/.next/standalone/.next/server/app/admin/companies/[uuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin/companies/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin/companies/new.html +2 -2
- package/.next/standalone/.next/server/app/admin/companies/new.rsc +2 -2
- package/.next/standalone/.next/server/app/admin/companies/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin/companies.html +2 -2
- package/.next/standalone/.next/server/app/admin/companies.rsc +2 -2
- package/.next/standalone/.next/server/app/admin/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin.html +2 -2
- package/.next/standalone/.next/server/app/admin.rsc +2 -2
- 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/agent-connections/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent-connections/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/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.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/comments/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/connection-heartbeat/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon/connection-heartbeat/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/control/route.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/control/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/directory-request/report/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon/directory-request/report/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/execution-state/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon/execution-state/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/executions/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon/executions/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/pending-turns/route.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/pending-turns/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon/pending-turns/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/resume/route.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/resume/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon/resume/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/transcript/route.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/transcript/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon/transcript/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/turn-advance/route.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/turn-advance/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon/turn-advance/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-directory-requests/[uuid]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon-directory-requests/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-directory-requests/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon-directory-requests/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/repoint/route.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/repoint/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/repoint/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/route.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/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/entities/[type]/[uuid]/root-idea/route.js +1 -1
- package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/events/notifications/route.js +1 -1
- package/.next/standalone/.next/server/app/api/events/notifications/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/events/route.js.nft.json +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]/parent/route.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/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/ideas/[uuid]/wake-preview/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/wake-preview/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/conversational/route.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/conversational/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/conversational/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/mcp/route.js +2 -2
- 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.js +1 -1
- package/.next/standalone/.next/server/app/api/mentionables/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/preferences/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/read-all/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/unread-count/route.js.nft.json +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/project-visits/pin/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-visits/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-visits/visit/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]/agent-cwds/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/agent-cwds/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_client-reference-manifest.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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/resource-graph/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/resource-graph/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/resource-graph/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/agent-cwd-options/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/agent-cwd-options/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/route.js.nft.json +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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/references/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/references/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/session/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 +2 -2
- package/.next/standalone/.next/server/app/index.rsc +2 -2
- package/.next/standalone/.next/server/app/login/admin/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/admin.html +2 -2
- package/.next/standalone/.next/server/app/login/admin.rsc +2 -2
- package/.next/standalone/.next/server/app/login/callback/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/callback.html +2 -2
- package/.next/standalone/.next/server/app/login/callback.rsc +2 -2
- 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 +2 -2
- package/.next/standalone/.next/server/app/login/pick-workspace.rsc +2 -2
- package/.next/standalone/.next/server/app/login.html +2 -2
- package/.next/standalone/.next/server/app/login.rsc +2 -2
- package/.next/standalone/.next/server/app/onboarding/page.js +2 -2
- 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 +2 -2
- package/.next/standalone/.next/server/app/onboarding.rsc +3 -3
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects.html +2 -2
- package/.next/standalone/.next/server/app/projects.rsc +3 -3
- package/.next/standalone/.next/server/app/settings.html +2 -2
- package/.next/standalone/.next/server/app/settings.rsc +4 -4
- package/.next/standalone/.next/server/app-paths-manifest.json +46 -46
- package/.next/standalone/.next/server/chunks/1318.js +1 -1
- package/.next/standalone/.next/server/chunks/1559.js +2 -2
- package/.next/standalone/.next/server/chunks/2570.js +2 -2
- package/.next/standalone/.next/server/chunks/2572.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/3594.js +1 -0
- package/.next/standalone/.next/server/chunks/{2547.js → 4011.js} +3 -3
- package/.next/standalone/.next/server/chunks/4394.js +1 -0
- package/.next/standalone/.next/server/chunks/4827.js +1 -1
- package/.next/standalone/.next/server/chunks/5205.js +1 -0
- package/.next/standalone/.next/server/chunks/5245.js +1 -1
- package/.next/standalone/.next/server/chunks/{2282.js → 5351.js} +3 -3
- 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/6506.js +3 -3
- package/.next/standalone/.next/server/chunks/6667.js +1 -0
- package/.next/standalone/.next/server/chunks/679.js +1 -1
- package/.next/standalone/.next/server/chunks/6995.js +1 -0
- package/.next/standalone/.next/server/chunks/7364.js +1 -1
- package/.next/standalone/.next/server/chunks/7368.js +1 -1
- package/.next/standalone/.next/server/chunks/7530.js +1 -1
- package/.next/standalone/.next/server/chunks/920.js +1 -1
- package/.next/standalone/.next/server/chunks/9213.js +1 -1
- package/.next/standalone/.next/server/chunks/9378.js +1 -1
- package/.next/standalone/.next/server/chunks/9793.js +1 -0
- 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/pages/404.html +2 -2
- 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/11595.b6f8ad33572b32fe.js +1 -0
- package/.next/standalone/.next/static/chunks/19887-9f459ee9e8d0855f.js +1 -0
- package/.next/standalone/.next/static/chunks/29108-b9b232255811ffa8.js +1 -0
- package/.next/standalone/.next/static/chunks/{31308-bb4a97b3f39c22dd.js → 31308-fda6febfb2882a28.js} +1 -1
- package/.next/standalone/.next/static/chunks/33456.e8550ad410031e29.js +1 -0
- package/.next/standalone/.next/static/chunks/35432-ee83da56c49ef6f8.js +1 -0
- package/.next/standalone/.next/static/chunks/4860.b405fc235b36271b.js +1 -0
- package/.next/standalone/.next/static/chunks/53073-5fd399cb25a11740.js +1 -0
- package/.next/standalone/.next/static/chunks/6603-07faab08560f7ecd.js +1 -0
- package/.next/standalone/.next/static/chunks/66980-652990fcf3212c94.js +10 -0
- package/.next/standalone/.next/static/chunks/78155-db70d9684a1e77a2.js +1 -0
- package/.next/standalone/.next/static/chunks/78917-7354d3b6908da7d1.js +1 -0
- package/.next/standalone/.next/static/chunks/82751-de255af4418d53e4.js +1 -0
- package/.next/standalone/.next/static/chunks/94643-6d31df78aa3074b5.js +1 -0
- package/.next/standalone/.next/static/chunks/96170-75da13decdb6f73f.js +1 -0
- package/.next/standalone/.next/static/chunks/99366-425e9ef22e60e3e2.js +1 -0
- package/.next/standalone/.next/static/chunks/99373.9dce8f30802824fc.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-cea0bb3e3a295bea.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-007278623926490f.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-b6ecaf52f6b81ec7.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/{page-2c9d3f4c6e0ff807.js → page-82404154708e48a9.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/graph/page-f5a351c544ed23d7.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-3cd46bec9383b191.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/page-d5b222f379b2e8ca.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/{page-ed9415921188b4d3.js → page-6abc7d1785e2b999.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/{page-c70af8cac7bdc483.js → page-7f87113e5d8bcf6e.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/{page-715b000c156a080c.js → page-30ab1573c4bd466f.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-b21d4184d9ca0b25.js +1 -0
- package/.next/standalone/.next/static/chunks/app/onboarding/page-3b6c54f887108635.js +1 -0
- package/.next/standalone/.next/static/chunks/{webpack-e181cbbb1e041891.js → webpack-b54e0c78eded76be.js} +1 -1
- package/.next/standalone/.next/static/css/893d99a21153c9b0.css +1 -0
- 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/code-reviewer.md +1 -1
- package/.next/standalone/public/chorus-plugin/agents/proposal-reviewer.md +1 -0
- package/.next/standalone/public/chorus-plugin/agents/task-reviewer.md +2 -0
- package/.next/standalone/public/chorus-plugin/skills/brainstorm/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/chorus/SKILL.md +4 -3
- package/.next/standalone/public/chorus-plugin/skills/develop/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/docs/SKILL.md +68 -0
- 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 +1 -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 +1 -1
- package/.next/standalone/public/install-kiro.sh +10 -7
- package/.next/standalone/public/kiro-plugin/.kiro/agents/chorus-code-reviewer.json +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/agents/chorus-proposal-reviewer.json +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/agents/chorus-task-reviewer.json +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/agents/chorus.json +1 -0
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-brainstorm/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-develop/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-docs/SKILL.md +68 -0
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-idea/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-openspec-aware/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-proposal/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-quick-dev/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-review/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-yolo/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/steering/chorus.md +3 -2
- package/.next/standalone/public/kiro-plugin/bin/chorus-api.sh +1 -1
- package/.next/standalone/public/skill/brainstorm-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/chorus/SKILL.md +4 -3
- package/.next/standalone/public/skill/code-reviewer-chorus/SKILL.md +2 -2
- package/.next/standalone/public/skill/develop-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/docs-chorus/SKILL.md +70 -0
- package/.next/standalone/public/skill/idea-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/package.json +9 -5
- package/.next/standalone/public/skill/proposal-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/proposal-reviewer-chorus/SKILL.md +2 -1
- package/.next/standalone/public/skill/quick-dev-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/review-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/task-reviewer-chorus/SKILL.md +2 -1
- package/.next/standalone/public/skill/yolo-chorus/SKILL.md +1 -1
- package/README.ja.md +31 -359
- package/README.ko.md +33 -360
- package/README.md +39 -367
- package/README.zh.md +36 -341
- package/cli/claude-spawner.mjs +15 -6
- package/cli/client-args.mjs +8 -0
- package/cli/codex-spawner.mjs +7 -3
- package/cli/control-handler.mjs +13 -3
- package/cli/credentials.mjs +41 -0
- package/cli/daemon-config.mjs +202 -1
- package/cli/daemon-install-config.mjs +38 -1
- package/cli/daemon-rest-client.mjs +11 -3
- package/cli/daemon.mjs +274 -11
- package/cli/event-router.mjs +17 -5
- package/cli/login.mjs +90 -2
- package/cli/prompts.mjs +116 -1
- package/cli/turn-reporter.mjs +5 -1
- package/cli/wake-queue.mjs +57 -35
- package/cli/waker.mjs +125 -36
- package/package.json +1 -1
- package/prisma/migrations/20260814101500_add_typed_assignment_provenance/migration.sql +2 -0
- package/prisma/schema.prisma +4 -2
- package/.next/standalone/.next/server/chunks/1114.js +0 -1
- package/.next/standalone/.next/server/chunks/1524.js +0 -1
- package/.next/standalone/.next/server/chunks/330.js +0 -1
- package/.next/standalone/.next/server/chunks/3525.js +0 -1
- package/.next/standalone/.next/server/chunks/4070.js +0 -1
- package/.next/standalone/.next/server/chunks/8540.js +0 -1
- package/.next/standalone/.next/static/chunks/11595.69e774e65ffda45f.js +0 -1
- package/.next/standalone/.next/static/chunks/18351-12dc856208d79e10.js +0 -1
- package/.next/standalone/.next/static/chunks/33456.48112aa459fd9c68.js +0 -1
- package/.next/standalone/.next/static/chunks/37938-0b9a2b891c04b166.js +0 -1
- package/.next/standalone/.next/static/chunks/4340-a33120fb742af57e.js +0 -1
- package/.next/standalone/.next/static/chunks/4860.496d21fc6db9e153.js +0 -1
- package/.next/standalone/.next/static/chunks/68326-61feeb2f6cddd338.js +0 -1
- package/.next/standalone/.next/static/chunks/72974-7e63b565a9ef443b.js +0 -1
- package/.next/standalone/.next/static/chunks/78917-f91904c6c2d12dab.js +0 -1
- package/.next/standalone/.next/static/chunks/80748-e971c5a5d6ef967d.js +0 -1
- package/.next/standalone/.next/static/chunks/80904-973284d1fe916c38.js +0 -1
- package/.next/standalone/.next/static/chunks/94426-39b6da238425f9b7.js +0 -10
- package/.next/standalone/.next/static/chunks/94470-cae3b3ad4e51d2ff.js +0 -1
- package/.next/standalone/.next/static/chunks/94643-ba1ebff5769d2b50.js +0 -1
- package/.next/standalone/.next/static/chunks/99373.5ac319a55a8f99a1.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-177a3fa88be94b4a.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-ae7c9d32fa1c2532.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-4a8ac49308a4e23b.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/graph/page-03408be00dc4822b.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-dd5a0d1e50226c78.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/page-596d97796dd55e2f.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-e786a59c24eb5bda.js +0 -1
- package/.next/standalone/.next/static/chunks/app/onboarding/page-df7c97cefb508201.js +0 -1
- package/.next/standalone/.next/static/css/ef995b001437e3ef.css +0 -1
- /package/.next/standalone/.next/static/{8kqUZqMF8xgdDXm_I4XdF → YTZwWTfE0BsJnjCDYCEHi}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{8kqUZqMF8xgdDXm_I4XdF → YTZwWTfE0BsJnjCDYCEHi}/_ssgManifest.js +0 -0
package/README.zh.md
CHANGED
|
@@ -2,13 +2,15 @@
|
|
|
2
2
|
<img src="packages/landing/public/images/chorus-slug.png" alt="Chorus" width="240" />
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
|
-
<p align="center"><strong
|
|
5
|
+
<p align="center"><strong>你的编程 Agent 之上的 Harness:Agent 提议,人类把关,软件交付。</strong></p>
|
|
6
6
|
|
|
7
7
|
<p align="center"><a href="README.md">English</a> · <strong>中文</strong> · <a href="README.ko.md">한국어</a> · <a href="README.ja.md">日本語</a></p>
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
<p align="center"><a href="https://doc.chorus-ai.dev/zh/"><strong>📖 文档</strong></a></p>
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
Chorus 是你的编程 Agent 之上的 Harness。编程 Agent 是把模型 harness 起来写代码的那层;Chorus 高它们一层,把多个这样的 Agent 和你收进同一条流水线:Agent 提议,你来验收,想法最终交付成软件,而不只是写代码。在底层,它把这套多 Agent、真人把关的协作稳稳跑起来所需的一切都处理好:会话生命周期、任务状态、子 Agent 编排、可观测性和故障恢复。每个 AI Agent 都有细粒度、可配置的权限。
|
|
12
|
+
|
|
13
|
+
受 **[AI-DLC(AI-Driven Development Lifecycle)](https://aws.amazon.com/blogs/devops/ai-driven-development-life-cycle/)** 方法论启发。核心理念:**Reversed Conversation**:AI 提议,人类验证。
|
|
12
14
|
|
|
13
15
|
---
|
|
14
16
|
|
|
@@ -21,280 +23,80 @@ Idea ──> Proposal ──> [Document + Task DAG] ──> Execute ──> Veri
|
|
|
21
23
|
提出 + 需求澄清 + 起草 PRD/任务 + 报告进度 + 验收 + 关闭
|
|
22
24
|
```
|
|
23
25
|
|
|
24
|
-
|
|
26
|
+
每个阶段下方标的是「执行该阶段所需的权限」,可以授予人类、Agent 或两者。没有固定角色,5 × 3 权限矩阵的任意组合都合法。→ [Agent 权限](https://doc.chorus-ai.dev/zh/guides/manage-agents/)
|
|
25
27
|
|
|
26
28
|
---
|
|
27
29
|
|
|
28
30
|
## 最近更新
|
|
29
31
|
|
|
32
|
+
**[v0.16.1](https://chorus-ai.dev/zh/blog/chorus-v0.16.1-release/)** — 一个 `chorus daemon` 现在可以同时服务多个互相独立的 agent,每个都有自己的密钥、工作目录、后端和权限(通过 `agents[]` 配置);agent 之间还能通过 @ 把活递给对方,每次唤醒都落在该 agent 自己的项目目录里。
|
|
33
|
+
|
|
34
|
+
**[v0.16.0](https://chorus-ai.dev/zh/blog/chorus-v0.16.0-release/)** — 新增 `docs` skill,引导 Agent 查阅文档站点([doc.chorus-ai.dev](https://doc.chorus-ai.dev)),基于当前文档作答,而不是凭记忆复述。
|
|
35
|
+
|
|
30
36
|
**[v0.15.0](https://chorus-ai.dev/zh/blog/chorus-v0.15.0-release/)** — 项目级 Agent 工作目录:每位用户可以为项目中的每个 Agent 绑定主机和 cwd,只浏览 daemon 允许的目录,并让任务分配、唤醒、恢复和后续对话使用同一个执行位置,且不迁移进行中的会话。Codex 现在会单独保存可恢复的后端 thread ID,并移除不再需要的 Chorus session 管理步骤。
|
|
31
37
|
|
|
32
38
|
**[v0.14.1](https://chorus-ai.dev/zh/blog/chorus-v0.14.1-release/)** — Amazon Kiro CLI 成为第四种接入方式(Kiro CLI v2):一条命令的 `install-kiro.sh` 插件,以及 `--agent kiro` 的 daemon 后端,另有若干 daemon 修复。
|
|
33
39
|
|
|
34
40
|
**[v0.14.0](https://chorus-ai.dev/zh/blog/chorus-v0.14.0-release/)** — 全应用深色模式(浅色 / 深色 / 跟随系统)。参考资料可挂到任意想法、提案或任务上,行内可读,也能通过 MCP 读写。新增韩语和日语(韩语由社区贡献)。用于归类的**主题**想法,以及 daemon 的「开始开发」/「Yolo」按钮、对话式建想法、崩溃恢复与 `chorus daemon install`。
|
|
35
41
|
|
|
36
|
-
**[v0.13.0](https://chorus-ai.dev/zh/blog/chorus-v0.13.0-release/)** — 项目资源思维导图:新增 Graph 视图,把每个项目的想法、提案、文档、任务连成一棵可折叠的树,从项目自身结构自动生成。每张卡片都标着当前状态(想法用想法列表那套派生状态),标题搜索会自动展开命中节点的上游并高亮/调暗、配上下切换定位,同一张可缩放可拖动的图在桌面与手机上通用(捏合 + 双击缩放)。
|
|
37
|
-
|
|
38
|
-
**[v0.12.0](https://chorus-ai.dev/zh/blog/chorus-v0.12.0-release/)** — 可寻址的 daemon 实例:一个 `chorus daemon` 可同时守多个工作目录(`--cwd`),每一个 `(agent, 主机, 目录)` 都成为一个能单独看见、单独点名的实例,贯穿 presence、@-mention 与任务指派。在想法上钉一次实例,其下的提案、任务与唤醒都会继承;带钉的唤醒被精确投递到那个实例,而非全员广播。评论区的 Agent @-mention 渲染为实时在线状态徽章,评论列表改为游标式无限滚动。
|
|
39
|
-
|
|
40
|
-
**[v0.11.0](https://chorus-ai.dev/zh/blog/chorus-v0.11.0-release/)** — Chorus Daemon:`chorus daemon` 将本机变为常驻 Agent 运行时,在每次派发时唤起本地 Claude Code。Agent Connections 界面提供实时可观测与控制:流式 transcript、指令注入、打断 / 恢复;新增"完成细化"按钮,唤起被指派的 Agent 撰写提案。
|
|
41
|
-
|
|
42
|
-
**[v0.10.0](https://chorus-ai.dev/zh/blog/chorus-v0.10.0-release/)** — 单父想法血缘:一条想法可派生子想法或挂靠至另一条之下,构成森林结构。该关联为弱关联,父想法仅呈现只读的 "+N derived" 汇总,不约束子想法的细化、提案与任务流程。想法浏览统一收敛至 Dashboard(Ideas / Lineage / Stats 三档视图切换,支持自适应默认);独立的 Idea List 页面下线,原 URL 经 308 重定向至 Dashboard。
|
|
43
|
-
|
|
44
|
-
**[v0.9.4](https://chorus-ai.dev/zh/blog/chorus-v0.9.4-release/)** — OpenClaw 插件基于 OpenClaw 2026.4.27 Plugin SDK 全面重写(原生 MCP 注册、`runEmbeddedAgent` 处理 SSE 唤醒、reviewer 改为原生 skill);Codex 插件 hook 改为随插件包分发,安装器同时清理用户目录中的历史 hook 拷贝。
|
|
45
|
-
|
|
46
|
-
**[v0.9.0](https://chorus-ai.dev/zh/blog/chorus-v0.9.0-release/)** — 头脑风暴 skill 帮你把模糊的想法聊出形状(在结构化多选题前先开放式对话),想法落地后自动生成总结报告(Summary / Decisions / Follow-ups 三段式,挂在想法概览页)。
|
|
47
|
-
|
|
48
|
-
**[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 钩子。
|
|
49
|
-
|
|
50
42
|
> 完整更新日志:[CHANGELOG.md](CHANGELOG.md)
|
|
51
43
|
|
|
52
44
|
---
|
|
53
45
|
|
|
54
46
|
## 快速开始
|
|
55
47
|
|
|
56
|
-
|
|
48
|
+
两条命令即可,无需数据库、无需 Docker、无需配置文件。
|
|
57
49
|
|
|
58
50
|
```bash
|
|
59
51
|
npm install -g @chorus-aidlc/chorus
|
|
60
52
|
chorus
|
|
61
53
|
```
|
|
62
54
|
|
|
63
|
-
Chorus 会自动启动内嵌 PostgreSQL (PGlite)、执行数据库迁移,然后在 **http://localhost:8637**
|
|
64
|
-
|
|
65
|
-
> **提示:** PGlite 是嵌入式单进程 PostgreSQL,本地单人使用完全没问题,但并发能力有限。如果需要多人或多 Agent 同时使用,建议通过 `DATABASE_URL=postgresql://...` 连接外部 PostgreSQL,或使用完整的 [Docker Compose](#docker-一键启动推荐) 部署。
|
|
66
|
-
|
|
67
|
-
默认登录账号:`admin@chorus.local` / `chorus`
|
|
68
|
-
|
|
69
|
-
### 参数选项
|
|
70
|
-
|
|
71
|
-
```bash
|
|
72
|
-
# 自定义端口
|
|
73
|
-
chorus --port 3000
|
|
74
|
-
|
|
75
|
-
# 自定义数据目录(默认:~/.chorus-data)
|
|
76
|
-
chorus --data-dir /path/to/data
|
|
77
|
-
|
|
78
|
-
# 自定义登录账号
|
|
79
|
-
DEFAULT_USER=me@example.com DEFAULT_PASSWORD=secret chorus
|
|
80
|
-
|
|
81
|
-
# 使用外部 PostgreSQL(跳过内嵌 PGlite)
|
|
82
|
-
DATABASE_URL=postgresql://user:pass@host:5432/chorus chorus
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
### 其他部署方式
|
|
86
|
-
|
|
87
|
-
| 方式 | 命令 |
|
|
88
|
-
|------|------|
|
|
89
|
-
| **npm**(最简单) | `npm i -g @chorus-aidlc/chorus && chorus` |
|
|
90
|
-
| **Docker(单镜像)** | [`docker compose -f docker-compose.local.yml up`](#docker-一键启动推荐) |
|
|
91
|
-
| **Docker(完整版)** | [`docker compose up`](#docker-一键启动推荐)(PostgreSQL + Redis + Chorus) |
|
|
92
|
-
| **AWS CDK** | [部署到 AWS](#部署到-aws) |
|
|
93
|
-
|
|
94
|
-
### `chorus daemon` — 作为 Agent 运行时连接
|
|
95
|
-
|
|
96
|
-
`chorus daemon` 将你的本地机器作为 Agent 运行时连接到远程 Chorus 服务器并执行 Chorus 分配的任务。
|
|
97
|
-
|
|
98
|
-
> **Agent 后端:** 支持 **Claude Code**(默认)和 **Codex**,用 `--agent codex`(或 `CHORUS_AGENT=codex`)切换。对其他 Agent CLI(Copilot 等)的支持计划在未来版本中实现。
|
|
99
|
-
|
|
100
|
-
```bash
|
|
101
|
-
chorus login # 认证(打开浏览器)
|
|
102
|
-
chorus daemon # 前台启动 daemon
|
|
103
|
-
chorus daemon -d # 后台启动 daemon(分离模式)
|
|
104
|
-
chorus daemon install # 安装为开机自启服务(Linux)—— 推荐
|
|
105
|
-
chorus daemon uninstall # 卸载已安装的服务
|
|
106
|
-
chorus daemon stop # 停止 daemon(已安装服务时委派给 systemd)
|
|
107
|
-
chorus daemon stop --force # pid 卡死时强制清理 pidfile
|
|
108
|
-
chorus daemon status # 查看 daemon 状态
|
|
109
|
-
chorus daemon restart # 重启 daemon
|
|
110
|
-
chorus daemon logs # 查看 daemon 日志
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
**主要特性:**
|
|
114
|
-
|
|
115
|
-
- **Claude Code 与 Codex 后端** — 自动检测 PATH 中的 `claude`(或 `codex`)CLI;用 `--agent codex` 选择
|
|
116
|
-
- **后台模式** — 使用 `-d` 标志后台运行;用 `stop/restart/logs` 管理
|
|
117
|
-
- **开机自启服务** — `chorus daemon install` 生成正确的 `systemd --user` unit 并启动(见下文);此后 `status/stop/restart/logs` 会自动委派给 systemd
|
|
118
|
-
- **权限模式** — 默认完全访问(yolo);使用 `--chorus-only` 限制为仅 Chorus MCP 工具
|
|
119
|
-
- **多路径** — 用可重复的 `--cwd` 让单个 daemon 同时服务多个工作目录(见下文)
|
|
120
|
-
- **交互式设置** — 首次启动时如未配置凭证会提示输入
|
|
55
|
+
Chorus 会自动启动内嵌 PostgreSQL (PGlite)、执行数据库迁移,然后在 **http://localhost:8637** 提供服务。默认登录账号:`admin@chorus.local` / `chorus`。
|
|
121
56
|
|
|
122
|
-
|
|
57
|
+
> 需要运行多个 agent,或部署到生产环境?可使用外部 PostgreSQL、Docker 或 AWS → **[部署与自托管](https://doc.chorus-ai.dev/zh/guides/deployment-overview/)**。
|
|
123
58
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
```bash
|
|
127
|
-
chorus daemon install --cwd ~/work/repo-a --cwd ~/work/repo-b # 立即安装并启动,登录时自启
|
|
128
|
-
chorus daemon uninstall # 停用并移除该服务
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
在 Linux 上,`install` 会生成一个 `systemd --user` unit,让 daemon 以**前台**方式运行(`Type=simple`,不带 `-d`),从而由 systemd 直接接管进程,然后 `daemon-reload` + `enable --now`。它会捕获你传入的 `--cwd`/`--agent`/`--chorus-only` 参数。**不要**手写 `Type=forking` + `chorus daemon -d` 的 unit —— daemon 会自我 daemon 化,systemd 追踪不到,重启时会陷入死循环;交给 `install` 写正确的 unit。在 macOS/Windows 上,`install` 会打印一份可手动安装的正确模板。请先运行 `chorus login`,让 unit 能读到凭证。详见 [docs/DAEMON.md](docs/DAEMON.md)。
|
|
132
|
-
|
|
133
|
-
#### 服务多个工作目录
|
|
134
|
-
|
|
135
|
-
一个 daemon 可以同时服务多个本地工作目录——每个声明的路径会注册为一条独立连接(各自拥有会话与唤起循环),归属同一个 Agent。路径**仅仅**是 daemon 服务的目录,不携带任何项目绑定。
|
|
136
|
-
|
|
137
|
-
```bash
|
|
138
|
-
chorus daemon --cwd ~/work/repo-a --cwd ~/work/repo-b # 可重复传入
|
|
139
|
-
CHORUS_DAEMON_CWDS="~/work/repo-a:~/work/repo-b" chorus daemon # 或用环境变量(`:` 或 `,` 分隔)
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
不传 `--cwd` 时,daemon 只服务它的启动目录这一个路径。
|
|
143
|
-
|
|
144
|
-
#### 配置文件 —— `~/.chorus/daemon.json`
|
|
145
|
-
|
|
146
|
-
`chorus login` 会把凭证写入此文件(权限 `0600`)。你也可以把 daemon 的调优项写进**同一个**文件。所有字段都是可选的;命令行参数和环境变量的优先级始终高于文件。
|
|
147
|
-
|
|
148
|
-
```json
|
|
149
|
-
{
|
|
150
|
-
"url": "https://chorus.example.com",
|
|
151
|
-
"apiKey": "cho_xxxxxxxxxxxxxxxxxxxxxxxx",
|
|
152
|
-
"agentUuid": "00000000-0000-0000-0000-000000000000",
|
|
153
|
-
"agentName": "My Daemon Agent",
|
|
154
|
-
"cwds": ["~/work/repo-a", "~/work/repo-b"],
|
|
155
|
-
"sigintTimeoutMs": 10000
|
|
156
|
-
}
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
| 字段 | 类型 | 写入方 / 用途 | 优先级(从高到低) |
|
|
160
|
-
|------|------|---------------|--------------------|
|
|
161
|
-
| `url` | string | 远程 Chorus 服务器 URL | `--url` 参数 → `CHORUS_URL` → 文件 |
|
|
162
|
-
| `apiKey` | string | Agent API Key(`cho_…`) | `--api-key` 参数 → `CHORUS_API_KEY` → 文件 |
|
|
163
|
-
| `agentUuid` / `agentName` | string | 认证身份(登录时记录) | 由 `chorus login` 写入 |
|
|
164
|
-
| `cwds` | string[] | daemon 服务的工作目录(多路径) | `--cwd` 参数 → `CHORUS_DAEMON_CWDS` → 文件 → 启动目录 |
|
|
165
|
-
| `sigintTimeoutMs` | number | SIGINT 后强制结束前的宽限窗口(毫秒,默认 `10000`) | `--sigint-timeout` 参数 → `CHORUS_DAEMON_SIGINT_TIMEOUT` → 文件 → `10000` |
|
|
166
|
-
| `yoloAckAt` | string | 内部字段——TTY 下 yolo 确认的时间戳(自动管理) | — |
|
|
167
|
-
|
|
168
|
-
daemon 启动时的横幅会打印它**实际读取的 `daemon.json` 路径**(以及该文件是否存在),让你随时清楚该编辑哪个文件。
|
|
59
|
+
想把本地机器变成领取任务的 agent 运行时,运行 `chorus daemon` → **[Daemon 运维](https://doc.chorus-ai.dev/zh/guides/daemon-operations/)** · **[远程控制](https://doc.chorus-ai.dev/zh/guides/remote-control/)**。
|
|
169
60
|
|
|
170
61
|
---
|
|
171
62
|
|
|
172
63
|
## 界面预览
|
|
173
64
|
|
|
174
|
-
### 远程唤醒 Agent
|
|
65
|
+
### 远程唤醒 Agent:派活到指定目录,实时看它跑
|
|
175
66
|
|
|
176
67
|

|
|
177
68
|
|
|
178
69
|
把一条想法派给远程 Agent 的某个目录,打开对话窗口,就能实时看到本地的 Claude Code 接活、开跑,全程不用碰终端,也不用手动 resume。
|
|
179
70
|
|
|
180
|
-
###
|
|
71
|
+
### 项目资源图谱:整个项目一张实时思维导图
|
|
181
72
|
|
|
182
73
|

|
|
183
74
|
|
|
184
|
-
|
|
75
|
+
想法、提案、文档、任务连成一棵树,每张卡片的状态随着 Agent 工作实时更新。
|
|
185
76
|
|
|
186
|
-
### Proposal
|
|
77
|
+
### Proposal:AI Agent 实时生成计划
|
|
187
78
|
|
|
188
79
|

|
|
189
80
|
|
|
190
81
|
PM Agent 分析需求并实时生成包含 PRD 和任务 DAG 的提案,Presence 指示器实时显示 Agent 活动状态。
|
|
191
82
|
|
|
192
|
-
###
|
|
193
|
-
|
|
194
|
-

|
|
195
|
-
|
|
196
|
-
左侧为像素工作室,用像素小人代表每个 Agent 的实时工作状态;右侧为 Agent 终端实时输出。
|
|
197
|
-
|
|
198
|
-
### Kanban——任务状态实时流转
|
|
83
|
+
### Kanban:任务状态实时流转
|
|
199
84
|
|
|
200
85
|

|
|
201
86
|
|
|
202
87
|
Kanban 看板随 Agent 工作进度自动更新,任务卡片在 To Do → In Progress → To Verify 之间实时流转。Presence 指示器高亮显示正在被操作的资源。
|
|
203
88
|
|
|
204
|
-
### 看板 & 任务 DAG
|
|
205
|
-
|
|
206
|
-

|
|
207
|
-
|
|
208
|
-
看板追踪任务状态,DAG 展示依赖关系和并行路径,一目了然。
|
|
209
|
-
|
|
210
|
-
### Idea & 需求细化
|
|
211
|
-
|
|
212
|
-

|
|
213
|
-
|
|
214
|
-
PM Agent 在创建 Proposal 前,通过结构化问答轮次澄清需求。面板展示 Idea 详情及已完成的细化轮次。
|
|
215
|
-
|
|
216
|
-
### 提案审阅
|
|
217
|
-
|
|
218
|
-

|
|
219
|
-
|
|
220
|
-
PM Agent 生成的 Proposal 包含文档草稿和任务 DAG 草稿,Admin 在此面板审阅并决定批准或驳回。
|
|
221
|
-
|
|
222
|
-
### 验收标准——双路验证
|
|
223
|
-
|
|
224
|
-

|
|
225
|
-
|
|
226
|
-
Dev Agent 自检 + Admin 独立审核,每条验收标准都有结构化的通过/失败证据。
|
|
227
|
-
|
|
228
|
-
### Universal Search——Cmd+K 全局搜索
|
|
229
|
-
|
|
230
|
-

|
|
231
|
-
|
|
232
|
-
Cmd+K 命令面板,支持跨 6 种实体类型搜索。支持范围筛选(全局/项目组/单项目)、按类型切换 Tab、键盘导航。Web UI 和 AI Agent(通过 `chorus_search` MCP 工具)共享同一搜索后端。
|
|
233
|
-
|
|
234
89
|
---
|
|
235
90
|
|
|
236
|
-
##
|
|
237
|
-
|
|
238
|
-
- **会话生命周期** — 持久化 Session,心跳检测,自动过期与故障恢复
|
|
239
|
-
- **任务 DAG** — 依赖建模、环检测、交互式可视化
|
|
240
|
-
- **Kanban** — 实时任务流转,Worker 徽标与 Agent Presence
|
|
241
|
-
- **Multi-Agent 协作** — Claude Code Agent Teams (Swarm Mode) 并行执行
|
|
242
|
-
- **细粒度 Agent 权限** — 5 类资源 × 3 个动作组成的权限网格,支持预设 + 自定义组合([详细说明](docs/PERMISSIONS.md) · 英文)
|
|
243
|
-
- **Chorus Plugin** — 生命周期钩子自动管理 Session 创建/关闭、心跳、上下文注入
|
|
244
|
-
- **需求澄清** — Proposal 创建前的结构化问答轮次
|
|
245
|
-
- **Proposal 审批流** — PM 起草,Admin 审批,草稿物化为正式实体
|
|
246
|
-
- **通知系统** — 应用内 + SSE 推送 + Redis Pub/Sub,支持个人偏好设置([设计文档](src/app/api/notifications/README.md))
|
|
247
|
-
- **@Mention** — Tiptap 自动补全、权限隔离搜索、mention 通知([设计文档](src/app/api/mentionables/README.md))
|
|
248
|
-
- **活动流** — 全操作审计 + Session 归因
|
|
249
|
-
- **全局搜索** — Cmd+K 跨 6 种实体类型、3 级范围筛选、片段生成([设计文档](docs/SEARCH.md))
|
|
250
|
-
---
|
|
91
|
+
## 连接 Agent
|
|
251
92
|
|
|
252
|
-
|
|
93
|
+
最快的方式是应用内的 setup 向导:打开 **Settings → Setup Guide**。它会创建 API Key,并给出适配你所用客户端的完整命令,无论是 Claude Code、Codex、Kiro、OpenCode、OpenClaw、Pi,还是任何兼容 MCP 的 agent。
|
|
253
94
|
|
|
254
|
-
|
|
255
|
-
┌──────────────────────────────────────────────────────────────────┐
|
|
256
|
-
│ Chorus — Agent Harness (:8637) │
|
|
257
|
-
│ │
|
|
258
|
-
│ ┌── Harness Capabilities ───────────────────────────────────┐ │
|
|
259
|
-
│ │ Session Lifecycle │ Task State Machine │ Context Inject │ │
|
|
260
|
-
│ │ Sub-Agent Orchestration │ Observability │ Failure Recovery│ │
|
|
261
|
-
│ └───────────────────────────────────────────────────────────┘ │
|
|
262
|
-
│ │
|
|
263
|
-
│ ┌── Chorus Plugin (lifecycle hooks) ────────────────────────┐ │
|
|
264
|
-
│ │ SubagentStart/Stop │ Heartbeat │ Skill & Context Inject │ │
|
|
265
|
-
│ └───────────────────────────────────────────────────────────┘ │
|
|
266
|
-
│ │
|
|
267
|
-
│ ┌── API Layer ──────────────────────────────────────────────┐ │
|
|
268
|
-
│ │ /api/mcp — MCP Streaming (50+ tools, permission-gated) │ │
|
|
269
|
-
│ │ /api/* — REST API (Web UI + SSE push) │ │
|
|
270
|
-
│ └───────────────────────────────────────────────────────────┘ │
|
|
271
|
-
│ │
|
|
272
|
-
│ ┌── Service Layer ──────────────────────────────────────────┐ │
|
|
273
|
-
│ │ AI-DLC Workflow │ UUID-first │ Multi-tenant │ │
|
|
274
|
-
│ └───────────────────────────────────────────────────────────┘ │
|
|
275
|
-
│ │
|
|
276
|
-
│ ┌── Web UI (React 19 + Tailwind + shadcn/ui) ──────────────┐ │
|
|
277
|
-
│ │ Kanban │ Task DAG │ Proposals │ Activity │ Sessions │ │
|
|
278
|
-
│ └───────────────────────────────────────────────────────────┘ │
|
|
279
|
-
└──────────────────────────────────────────────────────────────────┘
|
|
280
|
-
↑ ↑ ↑ ↑
|
|
281
|
-
Agent w/ Agent w/ Agent w/ 人类
|
|
282
|
-
idea+proposal task:write *:admin perms (浏览器)
|
|
283
|
-
:write perms perms (代理人类审批)
|
|
284
|
-
(LLM) (LLM) (LLM)
|
|
285
|
-
│
|
|
286
|
-
┌──────────▼──────────┐ ┌─────────────────────┐
|
|
287
|
-
│ PostgreSQL + Prisma │ │ Redis(可选) │
|
|
288
|
-
└─────────────────────┘ │ Pub/Sub 事件分发 │
|
|
289
|
-
└─────────────────────┘
|
|
290
|
-
```
|
|
95
|
+
按客户端分的完整接入指南 → **[Agent 接入平台](https://doc.chorus-ai.dev/zh/reference/agents/)**。
|
|
291
96
|
|
|
292
|
-
|
|
97
|
+
在 **Settings → Agents → Create API Key** 创建 API Key。Key 以 `cho_` 开头,仅在创建时显示一次。
|
|
293
98
|
|
|
294
|
-
|
|
295
|
-
|---|------|
|
|
296
|
-
| [`packages/openclaw-plugin`](packages/openclaw-plugin) | **OpenClaw 插件** — 通过 SSE 长连接 + MCP 工具桥接 [OpenClaw](https://openclaw.ai) 与 Chorus。 |
|
|
297
|
-
| [`packages/chorus-cdk`](packages/chorus-cdk) | **AWS CDK** — Chorus 的 AWS 基础设施即代码。 |
|
|
99
|
+
---
|
|
298
100
|
|
|
299
101
|
## 技术栈
|
|
300
102
|
|
|
@@ -302,132 +104,25 @@ Cmd+K 命令面板,支持跨 6 种实体类型搜索。支持范围筛选(
|
|
|
302
104
|
|------|------|
|
|
303
105
|
| 框架 | Next.js 15 (App Router, Turbopack) |
|
|
304
106
|
| 语言 | TypeScript 5 (strict mode) |
|
|
305
|
-
| 前端 | React 19, Tailwind CSS 4, shadcn/ui
|
|
306
|
-
|
|
|
307
|
-
|
|
|
308
|
-
| 缓存/消息 | Redis 7 (ioredis) — 可选 |
|
|
309
|
-
| Agent 集成 | MCP SDK 1.26 (HTTP Streamable Transport) |
|
|
107
|
+
| 前端 | React 19, Tailwind CSS 4, shadcn/ui |
|
|
108
|
+
| 数据 | PostgreSQL 16 + Prisma 7, Redis 7(可选) |
|
|
109
|
+
| Agent 集成 | MCP SDK (HTTP Streamable Transport) |
|
|
310
110
|
| 认证 | OIDC + PKCE / API Key / SuperAdmin |
|
|
311
111
|
| i18n | next-intl (en, zh, ko, ja) |
|
|
312
|
-
| 部署 |
|
|
313
|
-
|
|
314
|
-
---
|
|
315
|
-
|
|
316
|
-
## 快速开始
|
|
317
|
-
|
|
318
|
-
### Docker 一键启动(推荐)
|
|
319
|
-
|
|
320
|
-
无需构建工具或外部数据库。镜像内置 [PGlite](https://pglite.dev)(嵌入式 PostgreSQL):
|
|
321
|
-
|
|
322
|
-
```bash
|
|
323
|
-
git clone https://github.com/Chorus-AIDLC/chorus.git
|
|
324
|
-
cd chorus
|
|
325
|
-
|
|
326
|
-
DEFAULT_USER=admin@example.com DEFAULT_PASSWORD=changeme \
|
|
327
|
-
docker compose -f docker-compose.local.yml up -d
|
|
328
|
-
```
|
|
329
|
-
|
|
330
|
-
访问 [http://localhost:8637](http://localhost:8637),用上面设置的账号登录。
|
|
331
|
-
|
|
332
|
-
> 数据持久化在 Docker 卷中。嵌入模式仅支持单实例(无 Redis)。
|
|
333
|
-
|
|
334
|
-
#### 生产部署(PostgreSQL + Redis)
|
|
335
|
-
|
|
336
|
-
多副本生产环境:
|
|
337
|
-
|
|
338
|
-
```bash
|
|
339
|
-
DEFAULT_USER=admin@example.com DEFAULT_PASSWORD=changeme \
|
|
340
|
-
docker compose up -d
|
|
341
|
-
```
|
|
342
|
-
|
|
343
|
-
> 完整环境变量和配置选项见 [Docker 文档](docs/DOCKER.md)。
|
|
344
|
-
|
|
345
|
-
---
|
|
346
|
-
|
|
347
|
-
### 本地开发
|
|
348
|
-
|
|
349
|
-
前置条件:Node.js 22+、pnpm 9+、Docker(用于 PostgreSQL/Redis)
|
|
350
|
-
|
|
351
|
-
```bash
|
|
352
|
-
cp .env.example .env
|
|
353
|
-
pnpm docker:db
|
|
354
|
-
pnpm install
|
|
355
|
-
pnpm db:migrate:dev
|
|
356
|
-
pnpm dev
|
|
357
|
-
# 访问 http://localhost:8637
|
|
358
|
-
```
|
|
359
|
-
|
|
360
|
-
### 本地开发(无需 Docker)
|
|
361
|
-
|
|
362
|
-
前置条件:Node.js 22+、pnpm 9+
|
|
363
|
-
|
|
364
|
-
```bash
|
|
365
|
-
cp .env.example .env
|
|
366
|
-
pnpm install
|
|
367
|
-
pnpm dev:local # 开发服务器 http://localhost:8637
|
|
368
|
-
```
|
|
369
|
-
|
|
370
|
-
PGlite 在端口 5433 运行嵌入式 PostgreSQL。数据存储在 `.pglite/`,删除即可重置。
|
|
371
|
-
|
|
372
|
-
### 部署到 AWS
|
|
373
|
-
|
|
374
|
-
```bash
|
|
375
|
-
./install.sh
|
|
376
|
-
```
|
|
377
|
-
|
|
378
|
-
交互式安装器自动创建 VPC、Aurora Serverless v2、ElastiCache Serverless、ECS Fargate 和 ALB(HTTPS)。配置保存到 `default_deploy.sh` 供后续重新部署。
|
|
379
|
-
|
|
380
|
-
### 连接 AI Agent
|
|
381
|
-
|
|
382
|
-
最快的方式是用应用内的 setup 向导:打开 Web UI,进入 **Settings → Setup Guide → 打开设置向导**,按照向导给出的分步指引接入自己的客户端(Claude Code、Codex、Kiro、OpenCode、OpenClaw 或其他 agent)。向导会帮你创建 API Key、展示完整命令,并引导你验证连接。
|
|
383
|
-
|
|
384
|
-
如果偏好文档:
|
|
385
|
-
|
|
386
|
-
| 客户端 | 接入文档 |
|
|
387
|
-
|--------|---------|
|
|
388
|
-
| Claude Code | [CONNECT_CLAUDE_CODE.zh.md](docs/CONNECT_CLAUDE_CODE.zh.md) |
|
|
389
|
-
| Codex CLI | [CONNECT_CODEX.zh.md](docs/CONNECT_CODEX.zh.md) |
|
|
390
|
-
| Pi coding agent | [CONNECT_PI.md](docs/CONNECT_PI.md) |
|
|
391
|
-
| Kiro CLI | [CONNECT_KIRO.md](docs/CONNECT_KIRO.md) |
|
|
392
|
-
| OpenCode † | [CONNECT_OPENCODE.zh.md](docs/CONNECT_OPENCODE.zh.md) |
|
|
393
|
-
| 其他 MCP agent(Cursor / Continue / 自研等) | [CONNECT_OTHER_AGENTS.zh.md](docs/CONNECT_OTHER_AGENTS.zh.md) |
|
|
394
|
-
|
|
395
|
-
† OpenCode 的接入由社区维护的 [`opencode-chorus`](https://github.com/etnperlong/opencode-chorus) 插件提供(npm: [`opencode-chorus`](https://www.npmjs.com/package/opencode-chorus)),作者 [@etnperlong](https://github.com/etnperlong),特此感谢!
|
|
396
|
-
|
|
397
|
-
在 Web UI 的 **Settings → Agents → Create API Key** 创建 API Key。Key 以 `cho_` 开头,仅在创建时显示一次。
|
|
398
|
-
|
|
399
|
-

|
|
400
|
-
|
|
401
|
-
---
|
|
402
|
-
|
|
403
|
-
## Skill 文档
|
|
404
|
-
|
|
405
|
-
| 方式 | 位置 | 适用场景 |
|
|
406
|
-
|------|------|---------|
|
|
407
|
-
| **Plugin 内嵌(Claude Code)** | `public/chorus-plugin/skills/` | Claude Code + Chorus 插件,Session 自动化与生命周期 hook |
|
|
408
|
-
| **Plugin 内嵌(Codex CLI)** | `plugins/chorus/skills/` | Codex CLI + Chorus 插件,移植版技能(`$` 前缀斜杠命令)|
|
|
409
|
-
| **Package 内嵌(Pi)** | `packages/chorus-pi/skills/` | Pi + Chorus package,Session 自动化与生命周期 hook |
|
|
410
|
-
| **独立分发** | `public/skill/`(`/skill/` 路径静态托管)| 其他 MCP 客户端(Cursor / Continue / 自研),手动 Session 管理 |
|
|
112
|
+
| 部署 | npm / Docker / AWS CDK |
|
|
411
113
|
|
|
412
114
|
---
|
|
413
115
|
|
|
414
116
|
## 文档
|
|
415
117
|
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
| [Search](docs/SEARCH.md) | 全局搜索技术设计 |
|
|
425
|
-
| [AI-DLC Gap Analysis](docs/AIDLC_GAP_ANALYSIS.md) | AI-DLC 方法论差距分析 |
|
|
426
|
-
| [AIG Implementation Plan](docs/CHORUS_AIG_PLAN.md) | Agent 透明度路线图 |
|
|
427
|
-
| [Presence Design](docs/PRESENCE_DESIGN.md) | 实时 Agent Presence 系统 |
|
|
428
|
-
| [Docker](docs/DOCKER.md) | Docker 镜像使用与部署 |
|
|
429
|
-
| [Logging](docs/LOGGING.md) | 结构化日志架构 |
|
|
430
|
-
| [CLAUDE.md](CLAUDE.md) | 项目开发规范 |
|
|
118
|
+
**📖 完整文档:[doc.chorus-ai.dev](https://doc.chorus-ai.dev/zh/)**
|
|
119
|
+
|
|
120
|
+
- [快速上手](https://doc.chorus-ai.dev/zh/guides/getting-started/)
|
|
121
|
+
- [连接 agent](https://doc.chorus-ai.dev/zh/reference/agents/)
|
|
122
|
+
- [AI-DLC 工作流](https://doc.chorus-ai.dev/zh/guides/ai-dlc-workflow/)
|
|
123
|
+
- [插件与命令](https://doc.chorus-ai.dev/zh/guides/plugin-commands/)
|
|
124
|
+
- [MCP 工具参考](https://doc.chorus-ai.dev/zh/reference/mcp-tools/)
|
|
125
|
+
- [部署与自托管](https://doc.chorus-ai.dev/zh/guides/deployment-overview/)
|
|
431
126
|
|
|
432
127
|
---
|
|
433
128
|
|
package/cli/claude-spawner.mjs
CHANGED
|
@@ -284,7 +284,11 @@ export class ClaudeSpawner {
|
|
|
284
284
|
* so the waker can store the handle in its execution registry for the interrupt
|
|
285
285
|
* path BEFORE this promise resolves. It is invoked once, synchronously, only on a
|
|
286
286
|
* successful spawn; a spawn failure never calls it.
|
|
287
|
-
* @returns {Promise<{ sessionId: string, exitCode: number|null, isNew: boolean }>}
|
|
287
|
+
* @returns {Promise<{ sessionId: string, backendSessionId: string|null, exitCode: number|null, isNew: boolean }>}
|
|
288
|
+
* `backendSessionId` is the Claude `--resume` anchor (the input `sessionId`) on a
|
|
289
|
+
* terminal resolution after a spawn, so the conversation UI can offer a resumable
|
|
290
|
+
* id — mirrors codex-spawner's shape. `null` on the pre-spawn failure paths (no
|
|
291
|
+
* turn ran, nothing to resume).
|
|
288
292
|
*/
|
|
289
293
|
async wake({ prompt, sessionId, isNew, mcpConfigPath, cwd, onMessage, onChild }) {
|
|
290
294
|
const id = sessionId;
|
|
@@ -295,14 +299,14 @@ export class ClaudeSpawner {
|
|
|
295
299
|
this.logger.error(
|
|
296
300
|
`[Chorus] refusing to spawn: session id is not a valid lowercase UUID: ${id}`
|
|
297
301
|
);
|
|
298
|
-
return { sessionId: typeof id === "string" ? id : "", exitCode: null, isNew: Boolean(isNew) };
|
|
302
|
+
return { sessionId: typeof id === "string" ? id : "", backendSessionId: null, exitCode: null, isNew: Boolean(isNew) };
|
|
299
303
|
}
|
|
300
304
|
|
|
301
305
|
const claudePath = this.claudePath ?? resolveClaudePath();
|
|
302
306
|
if (!claudePath) {
|
|
303
307
|
// No crash — surface visibly and resolve with a failure result.
|
|
304
308
|
this.logger.error("[Chorus] cannot locate the `claude` executable on PATH; skipping wake");
|
|
305
|
-
return { sessionId: id, exitCode: null, isNew };
|
|
309
|
+
return { sessionId: id, backendSessionId: null, exitCode: null, isNew };
|
|
306
310
|
}
|
|
307
311
|
|
|
308
312
|
const args = buildArgs({ sessionId: id, isNew, mcpConfigPath, permissionMode: this.permissionMode });
|
|
@@ -345,7 +349,7 @@ export class ClaudeSpawner {
|
|
|
345
349
|
});
|
|
346
350
|
} catch (err) {
|
|
347
351
|
this.logger.error(`[Chorus] failed to spawn claude: ${err}`);
|
|
348
|
-
resolve({ sessionId: id, exitCode: null, isNew });
|
|
352
|
+
resolve({ sessionId: id, backendSessionId: null, exitCode: null, isNew });
|
|
349
353
|
return;
|
|
350
354
|
}
|
|
351
355
|
|
|
@@ -391,14 +395,19 @@ export class ClaudeSpawner {
|
|
|
391
395
|
child.on("error", (err) => {
|
|
392
396
|
// e.g. ENOENT if the resolved path vanished — log, don't throw.
|
|
393
397
|
this.logger.error(`[Chorus] claude process error: ${err}`);
|
|
394
|
-
|
|
398
|
+
// backendSessionId is the `--resume` anchor (`id`), NOT observedSessionId:
|
|
399
|
+
// a fork-on-resume claude can emit a new stream session_id, but the daemon
|
|
400
|
+
// resumes and files the transcript under `id`, so `id` is the resumable value.
|
|
401
|
+
resolve({ sessionId: observedSessionId, backendSessionId: id, exitCode: null, isNew });
|
|
395
402
|
});
|
|
396
403
|
|
|
397
404
|
child.on("close", (code) => {
|
|
398
405
|
if (code !== 0) {
|
|
399
406
|
this.logger.warn(`[Chorus] claude exited with code ${code}`);
|
|
400
407
|
}
|
|
401
|
-
|
|
408
|
+
// backendSessionId is the `--resume` anchor (`id`), NOT observedSessionId (see
|
|
409
|
+
// the process-error handler above for why the anchor is the resumable value).
|
|
410
|
+
resolve({ sessionId: observedSessionId, backendSessionId: id, exitCode: code, isNew });
|
|
402
411
|
});
|
|
403
412
|
|
|
404
413
|
// Guard against an ASYNC stdin error (EPIPE): if claude exits/closes
|
package/cli/client-args.mjs
CHANGED
|
@@ -69,6 +69,7 @@ export function parseClientFlags(argv) {
|
|
|
69
69
|
else if (a === "-d" || a === "--detach") out.detach = true;
|
|
70
70
|
else if (a === "--force") out.force = true;
|
|
71
71
|
else if (a === "--yes" || a === "-y") out.yes = true;
|
|
72
|
+
else if (a === "--add") out.add = true;
|
|
72
73
|
else if (a === "--help" || a === "-h") out.help = true;
|
|
73
74
|
}
|
|
74
75
|
return out;
|
|
@@ -202,9 +203,16 @@ USAGE
|
|
|
202
203
|
OPTIONS
|
|
203
204
|
--url <url> Remote Chorus server URL (env: CHORUS_URL)
|
|
204
205
|
--api-key <cho_...> Agent API key (env: CHORUS_API_KEY)
|
|
206
|
+
--add Add this key as an ADDITIONAL agent (multi-agent daemon)
|
|
207
|
+
instead of overwriting the single credential
|
|
205
208
|
-h, --help Show this help message
|
|
206
209
|
|
|
207
210
|
With no flags, login prompts interactively for the URL and a masked API key,
|
|
208
211
|
validates them against the server, and on success saves the credentials.
|
|
212
|
+
|
|
213
|
+
With --add, the validated key is appended to the daemon.json 'agents[]' array
|
|
214
|
+
so one daemon can serve several independent agents (see docs/DAEMON.md). The
|
|
215
|
+
first --add migrates an existing flat credential into agents[0]; a duplicate
|
|
216
|
+
key is refused and existing agents are never overwritten.
|
|
209
217
|
`;
|
|
210
218
|
}
|
package/cli/codex-spawner.mjs
CHANGED
|
@@ -13,9 +13,13 @@
|
|
|
13
13
|
// it and persist anchor→thread_id (codex-session-map.mjs) so a later wake can
|
|
14
14
|
// `resume <thread_id>`. (serde: ThreadEvent tag="type", rename="thread.started";
|
|
15
15
|
// ThreadStartedEvent.thread_id: String — codex-rs/exec/src/exec_events.rs.)
|
|
16
|
-
// • No `--mcp-config`: MCP
|
|
17
|
-
//
|
|
18
|
-
//
|
|
16
|
+
// • No `--mcp-config`: Codex reads MCP servers from the user's ~/.codex/config.toml.
|
|
17
|
+
// The Chorus MCP key there is USER-MANAGED: the installer writes a LITERAL Bearer
|
|
18
|
+
// header and Codex does NOT expand ${VAR} inside http_headers, so the CHORUS_API_KEY
|
|
19
|
+
// the daemon exports does NOT reach Codex's MCP auth. The daemon still exports
|
|
20
|
+
// CHORUS_URL / CHORUS_API_KEY into the child env — but only for the plugin's shell
|
|
21
|
+
// tooling (chorus-api.sh / SessionStart hooks), never argv and never Codex MCP.
|
|
22
|
+
// (Multi-agent: two Codex agents with different keys each need their own CODEX_HOME.)
|
|
19
23
|
// • Permission is a SANDBOX mode, not a tool allowlist.
|
|
20
24
|
//
|
|
21
25
|
// Reuses claude-spawner's platform-neutral helpers: parseNdjsonChunk (NDJSON
|
package/cli/control-handler.mjs
CHANGED
|
@@ -38,7 +38,8 @@ const NOOP_LOGGER = { info() {}, warn() {}, error() {} };
|
|
|
38
38
|
* (null until the SSE handshake reports it).
|
|
39
39
|
* killer?: (child: any, opts: any) => Promise<any>, Injectable; defaults to killProcessTree.
|
|
40
40
|
* sigintTimeoutMs?: number, Layered-resolved escalation window.
|
|
41
|
-
* redispatchResume?: (entityType: string, entityUuid: string, resumeReason?: string
|
|
41
|
+
* redispatchResume?: (entityType: string, entityUuid: string, resumeReason?: string,
|
|
42
|
+
* runtimeCwd?: string, orchestrator?: object|null) => void,
|
|
42
43
|
* Re-run a wake for a resumed entity (子3); injected
|
|
43
44
|
* by the daemon. `resumeReason` ("user" | "crash",
|
|
44
45
|
* add-crash-execution-resume) is the row's prior
|
|
@@ -180,8 +181,17 @@ export function createControlHandler(deps) {
|
|
|
180
181
|
`)`
|
|
181
182
|
);
|
|
182
183
|
try {
|
|
183
|
-
if (
|
|
184
|
-
|
|
184
|
+
if (
|
|
185
|
+
(typeof event.runtimeCwd === "string" && event.runtimeCwd) ||
|
|
186
|
+
event.orchestrator != null
|
|
187
|
+
) {
|
|
188
|
+
redispatchResume?.(
|
|
189
|
+
entityType,
|
|
190
|
+
entityUuid,
|
|
191
|
+
resumeReason,
|
|
192
|
+
typeof event.runtimeCwd === "string" ? event.runtimeCwd : undefined,
|
|
193
|
+
event.orchestrator ?? null,
|
|
194
|
+
);
|
|
185
195
|
} else {
|
|
186
196
|
redispatchResume?.(entityType, entityUuid, resumeReason);
|
|
187
197
|
}
|