@chorus-aidlc/chorus 0.16.4 → 0.17.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 +420 -420
- package/.next/standalone/.next/app-path-routes-manifest.json +53 -53
- package/.next/standalone/.next/build-manifest.json +5 -5
- package/.next/standalone/.next/prerender-manifest.json +45 -45
- 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 +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 +2 -2
- 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]/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 +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/page.js +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 +1 -1
- package/.next/standalone/.next/server/app/admin/companies/[uuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin/companies/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin/companies/new.html +2 -2
- package/.next/standalone/.next/server/app/admin/companies/new.rsc +1 -1
- package/.next/standalone/.next/server/app/admin/companies/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin/companies.html +2 -2
- package/.next/standalone/.next/server/app/admin/companies.rsc +1 -1
- package/.next/standalone/.next/server/app/admin/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin.html +2 -2
- package/.next/standalone/.next/server/app/admin.rsc +1 -1
- package/.next/standalone/.next/server/app/api/admin/companies/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/companies/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/login/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/session/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/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_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.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.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 +4 -4
- 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 +1 -1
- package/.next/standalone/.next/server/app/login/admin/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/admin.html +2 -2
- package/.next/standalone/.next/server/app/login/admin.rsc +1 -1
- package/.next/standalone/.next/server/app/login/callback/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/callback.html +2 -2
- package/.next/standalone/.next/server/app/login/callback.rsc +1 -1
- package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/pick-workspace/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/pick-workspace.html +2 -2
- package/.next/standalone/.next/server/app/login/pick-workspace.rsc +1 -1
- package/.next/standalone/.next/server/app/login.html +2 -2
- package/.next/standalone/.next/server/app/login.rsc +1 -1
- 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 +2 -2
- 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 +2 -2
- package/.next/standalone/.next/server/app/settings.html +2 -2
- package/.next/standalone/.next/server/app/settings.rsc +3 -3
- package/.next/standalone/.next/server/app-paths-manifest.json +53 -53
- package/.next/standalone/.next/server/chunks/{5205.js → 1114.js} +1 -1
- package/.next/standalone/.next/server/chunks/1318.js +1 -1
- package/.next/standalone/.next/server/chunks/1437.js +1 -0
- package/.next/standalone/.next/server/chunks/1559.js +2 -2
- package/.next/standalone/.next/server/chunks/2572.js +1 -1
- package/.next/standalone/.next/server/chunks/2961.js +1 -1
- package/.next/standalone/.next/server/chunks/{9793.js → 3045.js} +1 -1
- package/.next/standalone/.next/server/chunks/3831.js +37 -0
- package/.next/standalone/.next/server/chunks/4827.js +1 -1
- package/.next/standalone/.next/server/chunks/5245.js +1 -1
- package/.next/standalone/.next/server/chunks/{4394.js → 5706.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/6515.js +2 -2
- package/.next/standalone/.next/server/chunks/679.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/8454.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/9449.js +1 -0
- package/.next/standalone/.next/server/chunks/9458.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/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/static/chunks/{11595.a6268c75ca8a2163.js → 11595.bbe40924d18958bf.js} +1 -1
- package/.next/standalone/.next/static/chunks/18139-e6ef4b5869593f8e.js +1 -0
- package/.next/standalone/.next/static/chunks/28856-ef2cb58fbd404ef9.js +1 -0
- package/.next/standalone/.next/static/chunks/{31308-fda6febfb2882a28.js → 31308-bb4a97b3f39c22dd.js} +1 -1
- package/.next/standalone/.next/static/chunks/{33456.16ff7edf00137539.js → 33456.5499eb8e892b110a.js} +1 -1
- package/.next/standalone/.next/static/chunks/{4860.9e06848eb531e667.js → 4860.be77046fb2b3a2bd.js} +1 -1
- package/.next/standalone/.next/static/chunks/66873-e3be53f41b3f2255.js +1 -0
- package/.next/standalone/.next/static/chunks/70303-aec3d52ad87602a3.js +1 -0
- package/.next/standalone/.next/static/chunks/76201-83b26515f85ce37c.js +1 -0
- package/.next/standalone/.next/static/chunks/78917-a8a8dff98857c045.js +1 -0
- package/.next/standalone/.next/static/chunks/97663-9c3ae4fd60b353db.js +1 -0
- package/.next/standalone/.next/static/chunks/{99373.81b79c91858f9099.js → 99373.111493dc260a2a04.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/{layout-b742c51c0a764daf.js → layout-40fe7d026c5a7c6d.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-87d4d0fe90fca28c.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-1206abaee85dc915.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/{page-425acbe9ade5fa83.js → page-474e494097c8945f.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/graph/page-e902b19328092ccf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-f273288c3530aa0f.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/page-6568a7b08bf9a54b.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-fbd3c27b68666234.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/{page-58b48aa0a11603c3.js → page-15bb6e1696668512.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/{page-286faced32c6133f.js → page-2bea97214b1595cc.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-2bf7ceee62b574c7.js +1 -0
- package/.next/standalone/.next/static/chunks/app/onboarding/{page-5c82cf3abd856301.js → page-540da64d7ba16dc7.js} +1 -1
- package/.next/standalone/.next/static/chunks/{webpack-4d1cc14b13e247b6.js → webpack-7cbb3ba6792f1fb3.js} +1 -1
- package/.next/standalone/package.json +1 -1
- package/.next/standalone/public/chorus-plugin/.claude-plugin/plugin.json +1 -1
- package/.next/standalone/public/chorus-plugin/bin/chorus-api.sh +44 -1
- package/.next/standalone/public/chorus-plugin/bin/on-session-start.sh +4 -3
- package/.next/standalone/public/chorus-plugin/bin/tests/test-mcp-cli-delegation.sh +244 -0
- package/.next/standalone/public/chorus-plugin/skills/brainstorm/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/chorus/SKILL.md +19 -1
- package/.next/standalone/public/chorus-plugin/skills/chorus-cli/SKILL.md +57 -0
- package/.next/standalone/public/chorus-plugin/skills/develop/SKILL.md +2 -2
- package/.next/standalone/public/chorus-plugin/skills/docs/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/idea/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/openspec-aware/SKILL.md +85 -42
- package/.next/standalone/public/chorus-plugin/skills/orchestrate/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/proposal/SKILL.md +2 -2
- package/.next/standalone/public/chorus-plugin/skills/quick-dev/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/review/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/yolo/SKILL.md +3 -3
- package/.next/standalone/public/dsh-credentials.sh +20 -127
- package/.next/standalone/public/install-codex.sh +21 -406
- package/.next/standalone/public/install-kiro.sh +20 -344
- package/.next/standalone/public/install-opencode.sh +20 -275
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-brainstorm/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-cli/SKILL.md +57 -0
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-develop/SKILL.md +2 -2
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-docs/SKILL.md +1 -1
- 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 +85 -42
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-orchestrate/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-proposal/SKILL.md +2 -2
- 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 +3 -3
- package/.next/standalone/public/kiro-plugin/bin/chorus-api.sh +44 -1
- package/.next/standalone/public/kiro-plugin/bin/on-agent-spawn.sh +6 -4
- package/.next/standalone/public/kiro-plugin/manifest.txt +41 -0
- package/.next/standalone/public/skill/brainstorm-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/chorus/SKILL.md +19 -1
- package/.next/standalone/public/skill/code-reviewer-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/develop-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/docs-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/idea-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/orchestrate-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/proposal-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/proposal-reviewer-chorus/SKILL.md +1 -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 +1 -1
- package/.next/standalone/public/skill/yolo-chorus/SKILL.md +1 -1
- package/.next/standalone/public/test-dsh-credentials.sh +22 -38
- package/.next/standalone/public/test-install-codex.sh +31 -79
- package/README.ja.md +2 -2
- package/README.ko.md +2 -2
- package/README.md +2 -2
- package/README.zh.md +2 -2
- package/chorus.mjs +35 -1
- package/cli/agent-backend-prompt.mjs +3 -2
- package/cli/agents.mjs +329 -0
- package/cli/chorus-client.mjs +69 -0
- package/cli/claude-spawner.mjs +4 -0
- package/cli/codex-spawner.mjs +11 -6
- package/cli/credentials.mjs +185 -3
- package/cli/daemon-agent.mjs +26 -2
- package/cli/daemon-config.mjs +27 -2
- package/cli/daemon-service.mjs +120 -33
- package/cli/daemon.mjs +128 -22
- package/cli/dsh-spawner.mjs +7 -0
- package/cli/init/adapters.mjs +137 -0
- package/cli/init/agent-type-map.mjs +60 -0
- package/cli/init/chorus-plugin-consts.mjs +16 -0
- package/cli/init/codex-mcp-config.mjs +183 -0
- package/cli/init/contracts.mjs +120 -0
- package/cli/init/detect.mjs +97 -0
- package/cli/init/file-template.mjs +248 -0
- package/cli/init/install-methods.mjs +508 -0
- package/cli/init/registry.mjs +74 -0
- package/cli/init/run-command.mjs +30 -0
- package/cli/init/select.mjs +111 -0
- package/cli/init/steps/credential-seed.mjs +751 -0
- package/cli/init/steps/daemon-setup.mjs +246 -0
- package/cli/init/steps/plugin-install.mjs +37 -0
- package/cli/init-args.mjs +137 -0
- package/cli/init.mjs +198 -0
- package/cli/kiro-spawner.mjs +4 -0
- package/cli/mcp-args.mjs +280 -0
- package/cli/mcp.mjs +164 -0
- package/cli/spawner-select.mjs +45 -2
- package/package.json +1 -1
- package/.next/standalone/.next/server/chunks/3594.js +0 -1
- package/.next/standalone/.next/server/chunks/5351.js +0 -33
- package/.next/standalone/.next/server/chunks/6667.js +0 -1
- package/.next/standalone/.next/server/chunks/6995.js +0 -1
- package/.next/standalone/.next/static/chunks/19887-b805e1dcee8c367b.js +0 -1
- package/.next/standalone/.next/static/chunks/29108-5a11eea003f4cc11.js +0 -1
- package/.next/standalone/.next/static/chunks/53073-a7ed20af6538a178.js +0 -1
- package/.next/standalone/.next/static/chunks/6603-e70ddeab6ad09c50.js +0 -1
- package/.next/standalone/.next/static/chunks/78917-1b59cbb806b3ecfc.js +0 -1
- package/.next/standalone/.next/static/chunks/82751-3e161e1d8dbda3ac.js +0 -1
- package/.next/standalone/.next/static/chunks/99366-425e9ef22e60e3e2.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-f636e00c28f425ea.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-c004f1a194af7fa5.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/graph/page-fdd617457730a116.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-b9eb4e0692996657.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/page-d5b222f379b2e8ca.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-0a6c2d0e1b68e0e4.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-1507a761e67c2aa9.js +0 -1
- /package/.next/standalone/.next/static/{6sHDgeKioa0SJR1MAbcYG → 0spgxl3lP26Fl1otd1D7R}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{6sHDgeKioa0SJR1MAbcYG → 0spgxl3lP26Fl1otd1D7R}/_ssgManifest.js +0 -0
|
@@ -1,353 +1,29 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
# Chorus + Kiro CLI
|
|
2
|
+
# Chorus + Kiro CLI installer — DEPRECATED.
|
|
3
3
|
#
|
|
4
|
-
#
|
|
5
|
-
#
|
|
6
|
-
# # or non-interactive:
|
|
7
|
-
# CHORUS_URL=https://... CHORUS_API_KEY=cho_... \
|
|
8
|
-
# bash <(curl -fsSL https://chorus.example.com/install-kiro.sh)
|
|
9
|
-
# # workspace-local (writes <cwd>/.kiro/ instead of ~/.kiro/):
|
|
10
|
-
# bash <(curl -fsSL "$CHORUS_URL/install-kiro.sh") --workspace
|
|
4
|
+
# Chorus setup is now a global install plus a single command that configures
|
|
5
|
+
# every supported agent (claude / codex / opencode / kiro / openclaw / dsh):
|
|
11
6
|
#
|
|
12
|
-
#
|
|
13
|
-
#
|
|
14
|
-
# 2. Collects CHORUS_URL + CHORUS_API_KEY (env or TTY prompt) and
|
|
15
|
-
# normalizes the URL to end in exactly one /api/mcp.
|
|
16
|
-
# 3. Installs the Chorus `.kiro/` template — the chorus-* skills, the
|
|
17
|
-
# `chorus` main agent + 3 read-only reviewer subagents, and the Chorus
|
|
18
|
-
# steering doc — into ~/.kiro/ (global, default) or <cwd>/.kiro/
|
|
19
|
-
# (--workspace).
|
|
20
|
-
# 4. Copies the session-automation hook scripts (+ chorus-api.sh) into
|
|
21
|
-
# <KIRO_DIR>/chorus-bin/, chmod +x, and substitutes the __CHORUS_BIN__
|
|
22
|
-
# placeholder in the installed agents/chorus.json hook commands with
|
|
23
|
-
# the resolved ABSOLUTE chorus-bin path.
|
|
24
|
-
# 5. MERGES the `chorus` MCP server into <KIRO_DIR>/settings/mcp.json,
|
|
25
|
-
# preserving any pre-existing user servers, backing the original up to
|
|
26
|
-
# mcp.json.chorus-bak first.
|
|
7
|
+
# npm install -g @chorus-aidlc/chorus@0.17.0
|
|
8
|
+
# chorus agents add
|
|
27
9
|
#
|
|
28
|
-
#
|
|
29
|
-
#
|
|
10
|
+
# This script is still fetched via curl for backward compatibility, but it no
|
|
11
|
+
# longer installs anything itself — it just points you at `chorus agents add`.
|
|
12
|
+
#
|
|
13
|
+
# Bash 3.2 compatible (macOS /bin/bash): no case-conversion parameter expansion,
|
|
14
|
+
# no associative arrays.
|
|
30
15
|
|
|
31
16
|
set -euo pipefail
|
|
32
17
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
warn() { printf "${YELLOW}!${RESET} %s\n" "$*" >&2; }
|
|
37
|
-
die() { printf "${RED}\xe2\x9c\x97${RESET} %s\n" "$*" >&2; exit 1; }
|
|
38
|
-
hdr() { printf "\n${BOLD}%s${RESET}\n" "$*"; }
|
|
39
|
-
|
|
40
|
-
is_tty() { [ -t 0 ] && [ -t 1 ]; }
|
|
41
|
-
|
|
42
|
-
# ---------- config: the artifact manifest (single source of truth) ----------
|
|
43
|
-
# These lists drive BOTH the local copy and the remote download, so the two
|
|
44
|
-
# source modes can never diverge.
|
|
45
|
-
SKILLS="chorus-idea chorus-proposal chorus-develop chorus-yolo chorus-review chorus-quick-dev chorus-brainstorm chorus-openspec-aware chorus-docs"
|
|
46
|
-
REVIEWER_AGENTS="chorus-code-reviewer chorus-proposal-reviewer chorus-task-reviewer"
|
|
47
|
-
HOOK_SCRIPTS="on-agent-spawn.sh on-stop.sh on-post-submit-proposal.sh on-post-submit-for-verify.sh on-post-verify-task.sh chorus-api.sh verify-document-roundtrip.sh test-syntax.sh"
|
|
48
|
-
|
|
49
|
-
CHORUS_URL_DEFAULT="${CHORUS_URL_DEFAULT:-http://localhost:8637/api/mcp}"
|
|
50
|
-
|
|
51
|
-
# ---------- argument parsing ----------
|
|
52
|
-
SCOPE="global"
|
|
53
|
-
for arg in "$@"; do
|
|
54
|
-
case "$arg" in
|
|
55
|
-
--workspace) SCOPE="workspace" ;;
|
|
56
|
-
--global) SCOPE="global" ;;
|
|
57
|
-
-h|--help)
|
|
58
|
-
cat <<'USAGE'
|
|
59
|
-
install-kiro.sh — install the Chorus plugin for Kiro CLI.
|
|
60
|
-
|
|
61
|
-
Options:
|
|
62
|
-
--workspace Write to <cwd>/.kiro/ (project-local) instead of ~/.kiro/.
|
|
63
|
-
--global Write to ~/.kiro/ (default).
|
|
64
|
-
-h, --help Show this help.
|
|
65
|
-
|
|
66
|
-
Environment:
|
|
67
|
-
CHORUS_URL Chorus base URL (e.g. https://chorus.example.com). Normalized
|
|
68
|
-
to end in /api/mcp. Prompted on a TTY if unset.
|
|
69
|
-
CHORUS_API_KEY Chorus agent API key (starts with cho_). Prompted (echo off)
|
|
70
|
-
on a TTY if unset; required — no TTY + unset is a hard error.
|
|
71
|
-
USAGE
|
|
72
|
-
exit 0
|
|
73
|
-
;;
|
|
74
|
-
*) die "Unknown argument: $arg (try --help)" ;;
|
|
75
|
-
esac
|
|
76
|
-
done
|
|
77
|
-
|
|
78
|
-
# If piped through `curl | bash`, stdin is the script body. Re-open from
|
|
79
|
-
# /dev/tty so interactive prompts still work — but only when a real TTY is
|
|
80
|
-
# available AND we actually need to prompt (the key is unset). Both CHORUS_URL
|
|
81
|
-
# and CHORUS_API_KEY being set lets us run fully non-interactively (CI /
|
|
82
|
-
# sandboxed / unified-exec environments).
|
|
83
|
-
if [ -z "${CHORUS_API_KEY:-}" ] && ! is_tty; then
|
|
84
|
-
# Probe that /dev/tty is actually openable before exec'ing onto it. In a
|
|
85
|
-
# detached/headless environment (CI, daemon-spawned) /dev/tty can pass the
|
|
86
|
-
# -r/-w file-mode test yet fail to open ("No such device or address"), and a
|
|
87
|
-
# bare `exec < /dev/tty` would abort the shell with that raw error instead of
|
|
88
|
-
# reaching the explanatory die below. The subshell open-test runs inside an
|
|
89
|
-
# `if` so its failure never trips set -e.
|
|
90
|
-
if ( : < /dev/tty ) >/dev/null 2>&1; then
|
|
91
|
-
exec < /dev/tty
|
|
92
|
-
fi
|
|
93
|
-
fi
|
|
94
|
-
|
|
95
|
-
# ---------- step 1: check Kiro CLI ----------
|
|
96
|
-
hdr "1/5 Checking Kiro CLI"
|
|
97
|
-
KIRO_BIN=""
|
|
98
|
-
if command -v kiro-cli >/dev/null 2>&1; then
|
|
99
|
-
KIRO_BIN="kiro-cli"
|
|
100
|
-
elif command -v kiro >/dev/null 2>&1; then
|
|
101
|
-
KIRO_BIN="kiro"
|
|
102
|
-
fi
|
|
103
|
-
[ -n "$KIRO_BIN" ] || die "No Kiro CLI found in PATH (looked for 'kiro-cli' and 'kiro'). Install it first: https://kiro.dev/docs/cli"
|
|
104
|
-
ok "Found $($KIRO_BIN --version 2>/dev/null | head -1 || echo "$KIRO_BIN")"
|
|
105
|
-
|
|
106
|
-
# ---------- step 2: collect Chorus URL + API key ----------
|
|
107
|
-
hdr "2/5 Configuring the Chorus connection"
|
|
108
|
-
|
|
109
|
-
# URL
|
|
110
|
-
if [ -n "${CHORUS_URL:-}" ]; then
|
|
111
|
-
url="$CHORUS_URL"
|
|
112
|
-
ok "Using CHORUS_URL from env: $url"
|
|
113
|
-
elif [ -t 0 ]; then
|
|
114
|
-
printf " Chorus URL ${DIM}[default: $CHORUS_URL_DEFAULT]${RESET}: "
|
|
115
|
-
read -r url
|
|
116
|
-
url="${url:-$CHORUS_URL_DEFAULT}"
|
|
117
|
-
else
|
|
118
|
-
url="$CHORUS_URL_DEFAULT"
|
|
119
|
-
warn "No TTY and CHORUS_URL unset — using default: $url"
|
|
120
|
-
fi
|
|
121
|
-
|
|
122
|
-
# API key
|
|
123
|
-
if [ -n "${CHORUS_API_KEY:-}" ]; then
|
|
124
|
-
apikey="$CHORUS_API_KEY"
|
|
125
|
-
ok "Using CHORUS_API_KEY from env"
|
|
126
|
-
elif [ -t 0 ]; then
|
|
127
|
-
printf " Chorus API key (starts with cho_): "
|
|
128
|
-
stty -echo 2>/dev/null || true
|
|
129
|
-
read -r apikey
|
|
130
|
-
stty echo 2>/dev/null || true
|
|
131
|
-
printf "\n"
|
|
132
|
-
[ -n "$apikey" ] || die "API key is required"
|
|
133
|
-
else
|
|
134
|
-
die "No TTY and CHORUS_API_KEY unset — cannot continue. Export CHORUS_API_KEY (create one under Settings -> Agents in the Chorus UI) and re-run."
|
|
135
|
-
fi
|
|
136
|
-
|
|
137
|
-
# Must be http(s).
|
|
138
|
-
case "$url" in
|
|
139
|
-
http://*|https://*) ;;
|
|
140
|
-
*) die "URL must start with http:// or https:// — got: $url" ;;
|
|
141
|
-
esac
|
|
142
|
-
|
|
143
|
-
# Normalize: the Chorus MCP endpoint lives under /api/mcp. If the user gave us
|
|
144
|
-
# just a host (or a host with trailing slash, or any path that doesn't already
|
|
145
|
-
# end in /api/mcp), append it so the MCP handshake hits the right route.
|
|
146
|
-
case "$url" in
|
|
147
|
-
*/api/mcp) ;;
|
|
148
|
-
*/api/mcp/) url="${url%/}" ;;
|
|
149
|
-
*/) url="${url}api/mcp" ;;
|
|
150
|
-
*) url="${url}/api/mcp" ;;
|
|
151
|
-
esac
|
|
152
|
-
ok "MCP endpoint: $url"
|
|
153
|
-
|
|
154
|
-
# The base for fetching static plugin assets is the same origin minus /api/mcp
|
|
155
|
-
# (public/ is served at web root, so public/kiro-plugin/... => <base>/kiro-plugin/...).
|
|
156
|
-
ASSET_BASE="${url%/api/mcp}"
|
|
157
|
-
|
|
158
|
-
# ---------- step 3: locate the template source ----------
|
|
159
|
-
hdr "3/5 Locating the Chorus .kiro/ template"
|
|
160
|
-
|
|
161
|
-
# Resolve the directory of this script (only meaningful when run from a file,
|
|
162
|
-
# not via `curl | bash`).
|
|
163
|
-
SCRIPT_SRC="${BASH_SOURCE:-$0}"
|
|
164
|
-
SCRIPT_DIR=""
|
|
165
|
-
if [ -f "$SCRIPT_SRC" ]; then
|
|
166
|
-
SCRIPT_DIR="$(cd "$(dirname "$SCRIPT_SRC")" >/dev/null 2>&1 && pwd)"
|
|
167
|
-
fi
|
|
168
|
-
|
|
169
|
-
# Candidate local template roots (script lives in public/, or repo root).
|
|
170
|
-
SRC_ROOT=""
|
|
171
|
-
if [ -n "$SCRIPT_DIR" ]; then
|
|
172
|
-
for cand in "$SCRIPT_DIR/kiro-plugin" "$SCRIPT_DIR/public/kiro-plugin" "$SCRIPT_DIR/../public/kiro-plugin"; do
|
|
173
|
-
if [ -f "$cand/.kiro/settings/mcp.json" ] && [ -f "$cand/.kiro/agents/chorus.json" ]; then
|
|
174
|
-
SRC_ROOT="$(cd "$cand" >/dev/null 2>&1 && pwd)"
|
|
175
|
-
break
|
|
176
|
-
fi
|
|
177
|
-
done
|
|
178
|
-
fi
|
|
179
|
-
|
|
180
|
-
CLEANUP_SRC=""
|
|
181
|
-
if [ -n "$SRC_ROOT" ]; then
|
|
182
|
-
ok "Using local template: $SRC_ROOT"
|
|
183
|
-
else
|
|
184
|
-
# Remote mode: download the manifest from the Chorus instance's static assets.
|
|
185
|
-
command -v curl >/dev/null 2>&1 || die "No local template found and 'curl' is unavailable — cannot download the plugin. Run this from a Chorus checkout, or install curl."
|
|
186
|
-
SRC_ROOT="$(mktemp -d "${TMPDIR:-/tmp}/chorus-kiro.XXXXXX")"
|
|
187
|
-
CLEANUP_SRC="$SRC_ROOT"
|
|
188
|
-
ok "Downloading template from ${ASSET_BASE}/kiro-plugin/"
|
|
189
|
-
|
|
190
|
-
fetch() {
|
|
191
|
-
# fetch <relpath-under-kiro-plugin> <dest-abs-path>
|
|
192
|
-
local rel="$1" dest="$2"
|
|
193
|
-
mkdir -p "$(dirname "$dest")"
|
|
194
|
-
curl -fsSL "${ASSET_BASE}/kiro-plugin/${rel}" -o "$dest" \
|
|
195
|
-
|| die "Failed to download kiro-plugin/${rel} from ${ASSET_BASE}. Is CHORUS_URL correct and reachable?"
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
fetch ".kiro/settings/mcp.json" "$SRC_ROOT/.kiro/settings/mcp.json"
|
|
199
|
-
fetch ".kiro/steering/chorus.md" "$SRC_ROOT/.kiro/steering/chorus.md"
|
|
200
|
-
fetch ".kiro/agents/chorus.json" "$SRC_ROOT/.kiro/agents/chorus.json"
|
|
201
|
-
fetch ".kiro/agents/chorus.md" "$SRC_ROOT/.kiro/agents/chorus.md"
|
|
202
|
-
for a in $REVIEWER_AGENTS; do
|
|
203
|
-
fetch ".kiro/agents/${a}.json" "$SRC_ROOT/.kiro/agents/${a}.json"
|
|
204
|
-
done
|
|
205
|
-
for s in $SKILLS; do
|
|
206
|
-
fetch ".kiro/skills/${s}/SKILL.md" "$SRC_ROOT/.kiro/skills/${s}/SKILL.md"
|
|
207
|
-
done
|
|
208
|
-
for b in $HOOK_SCRIPTS; do
|
|
209
|
-
fetch "bin/${b}" "$SRC_ROOT/bin/${b}"
|
|
210
|
-
done
|
|
211
|
-
fi
|
|
212
|
-
|
|
213
|
-
# Clean up any downloaded temp on exit (no-op for local mode).
|
|
214
|
-
cleanup() { [ -n "$CLEANUP_SRC" ] && rm -rf "$CLEANUP_SRC" 2>/dev/null || true; }
|
|
215
|
-
trap cleanup EXIT
|
|
216
|
-
|
|
217
|
-
# ---------- step 4: determine KIRO_DIR + write skills / agents / steering / hooks ----------
|
|
218
|
-
if [ "$SCOPE" = "workspace" ]; then
|
|
219
|
-
KIRO_DIR="$(pwd)/.kiro"
|
|
220
|
-
else
|
|
221
|
-
KIRO_DIR="$HOME/.kiro"
|
|
222
|
-
fi
|
|
223
|
-
CHORUS_BIN_ABS="$KIRO_DIR/chorus-bin"
|
|
224
|
-
|
|
225
|
-
hdr "4/5 Installing into $KIRO_DIR (scope: $SCOPE)"
|
|
226
|
-
mkdir -p "$KIRO_DIR/skills" "$KIRO_DIR/agents" "$KIRO_DIR/steering" "$KIRO_DIR/chorus-bin" "$KIRO_DIR/settings"
|
|
227
|
-
|
|
228
|
-
# Skills (chorus-* only — never touches a user's own skills).
|
|
229
|
-
for s in $SKILLS; do
|
|
230
|
-
mkdir -p "$KIRO_DIR/skills/$s"
|
|
231
|
-
cp "$SRC_ROOT/.kiro/skills/$s/SKILL.md" "$KIRO_DIR/skills/$s/SKILL.md"
|
|
232
|
-
done
|
|
233
|
-
ok "Installed skills: $SKILLS"
|
|
234
|
-
|
|
235
|
-
# Reviewer subagents (raw copy) + the main-agent prompt sidecar.
|
|
236
|
-
for a in $REVIEWER_AGENTS; do
|
|
237
|
-
cp "$SRC_ROOT/.kiro/agents/$a.json" "$KIRO_DIR/agents/$a.json"
|
|
238
|
-
done
|
|
239
|
-
cp "$SRC_ROOT/.kiro/agents/chorus.md" "$KIRO_DIR/agents/chorus.md"
|
|
240
|
-
ok "Installed agents: chorus (main) + $REVIEWER_AGENTS"
|
|
241
|
-
|
|
242
|
-
# Steering (Chorus platform-overview / AI-DLC context).
|
|
243
|
-
cp "$SRC_ROOT/.kiro/steering/chorus.md" "$KIRO_DIR/steering/chorus.md"
|
|
244
|
-
ok "Installed steering: chorus.md"
|
|
245
|
-
|
|
246
|
-
# Hook scripts -> chorus-bin/ (executable). Copying them INTO the Kiro dir keeps
|
|
247
|
-
# the install self-contained and removable.
|
|
248
|
-
for b in $HOOK_SCRIPTS; do
|
|
249
|
-
cp "$SRC_ROOT/bin/$b" "$CHORUS_BIN_ABS/$b"
|
|
250
|
-
chmod +x "$CHORUS_BIN_ABS/$b"
|
|
251
|
-
done
|
|
252
|
-
ok "Installed hook scripts -> $CHORUS_BIN_ABS/ (chmod +x)"
|
|
253
|
-
|
|
254
|
-
# Main agent: substitute the __CHORUS_BIN__ placeholder in the hook `command`
|
|
255
|
-
# strings with the resolved ABSOLUTE chorus-bin path. The repo copy keeps the
|
|
256
|
-
# placeholder; only this installed copy is concretized. Absolute paths are
|
|
257
|
-
# scope-independent and survive Kiro being launched from any cwd.
|
|
258
|
-
# (Use '|' as the sed delimiter since the replacement is a filesystem path.)
|
|
259
|
-
sed "s|__CHORUS_BIN__|$CHORUS_BIN_ABS|g" \
|
|
260
|
-
"$SRC_ROOT/.kiro/agents/chorus.json" > "$KIRO_DIR/agents/chorus.json"
|
|
261
|
-
|
|
262
|
-
# Fail loudly if the placeholder survived (it must not).
|
|
263
|
-
if grep -q '__CHORUS_BIN__' "$KIRO_DIR/agents/chorus.json" 2>/dev/null; then
|
|
264
|
-
die "Internal error: __CHORUS_BIN__ placeholder was not fully substituted in agents/chorus.json"
|
|
265
|
-
fi
|
|
266
|
-
ok "Wrote agents/chorus.json (hook commands -> $CHORUS_BIN_ABS)"
|
|
267
|
-
|
|
268
|
-
# ---------- step 5: merge the chorus MCP server into settings/mcp.json ----------
|
|
269
|
-
hdr "5/5 Wiring the Chorus MCP server into settings/mcp.json"
|
|
270
|
-
|
|
271
|
-
MCP_JSON="$KIRO_DIR/settings/mcp.json"
|
|
272
|
-
# Seed a valid empty document if the file is missing so the merge has a target.
|
|
273
|
-
if [ ! -f "$MCP_JSON" ]; then
|
|
274
|
-
printf '%s\n' '{"mcpServers":{}}' > "$MCP_JSON"
|
|
275
|
-
fi
|
|
276
|
-
|
|
277
|
-
# Back up ONCE (idempotent — a second run keeps the single original backup).
|
|
278
|
-
if [ ! -f "$MCP_JSON.chorus-bak" ]; then
|
|
279
|
-
cp "$MCP_JSON" "$MCP_JSON.chorus-bak"
|
|
280
|
-
ok "Backed up original to ${MCP_JSON}.chorus-bak"
|
|
281
|
-
fi
|
|
282
|
-
|
|
283
|
-
# The chorus server object. BOTH the URL and the API key stay ${...} references
|
|
284
|
-
# (not baked literals) so Kiro CLI interpolates them from the environment at
|
|
285
|
-
# runtime — this is what makes a single daemon serving MULTIPLE agents work: each
|
|
286
|
-
# woken Kiro child inherits that agent's own CHORUS_URL / CHORUS_API_KEY, so the
|
|
287
|
-
# same mcp.json resolves to the right server + key per agent. The API key is never
|
|
288
|
-
# written to disk. Single-quote both refs so the shell never expands ${...} here.
|
|
289
|
-
URL_REF='${CHORUS_URL}/api/mcp'
|
|
290
|
-
AUTH_REF='Bearer ${env:CHORUS_API_KEY}'
|
|
291
|
-
|
|
292
|
-
merged=""
|
|
293
|
-
if command -v jq >/dev/null 2>&1; then
|
|
294
|
-
# Build the server object, then set only .mcpServers.chorus (in place if it
|
|
295
|
-
# already exists — preserving position and every other user server).
|
|
296
|
-
server_json="$(jq -n --arg url "$URL_REF" --arg auth "$AUTH_REF" \
|
|
297
|
-
'{type:"http", url:$url, headers:{Authorization:$auth}, disabled:false}')"
|
|
298
|
-
merged="$(jq --argjson srv "$server_json" \
|
|
299
|
-
'(.mcpServers // {}) as $m | .mcpServers = ($m + {chorus:$srv})' "$MCP_JSON")" \
|
|
300
|
-
|| die "Failed to merge mcp.json with jq (is $MCP_JSON valid JSON?)"
|
|
301
|
-
elif command -v node >/dev/null 2>&1; then
|
|
302
|
-
merged="$(CHORUS_MCP_URL="$URL_REF" CHORUS_MCP_AUTH="$AUTH_REF" node - "$MCP_JSON" <<'NODE'
|
|
303
|
-
const fs = require("fs");
|
|
304
|
-
const file = process.argv[2];
|
|
305
|
-
let data = {};
|
|
306
|
-
try { data = JSON.parse(fs.readFileSync(file, "utf8")) || {}; }
|
|
307
|
-
catch (e) { console.error("mcp.json is not valid JSON: " + e.message); process.exit(1); }
|
|
308
|
-
if (typeof data !== "object" || Array.isArray(data)) data = {};
|
|
309
|
-
if (typeof data.mcpServers !== "object" || data.mcpServers === null || Array.isArray(data.mcpServers)) data.mcpServers = {};
|
|
310
|
-
data.mcpServers.chorus = {
|
|
311
|
-
type: "http",
|
|
312
|
-
url: process.env.CHORUS_MCP_URL,
|
|
313
|
-
headers: { Authorization: process.env.CHORUS_MCP_AUTH },
|
|
314
|
-
disabled: false,
|
|
315
|
-
};
|
|
316
|
-
process.stdout.write(JSON.stringify(data, null, 2) + "\n");
|
|
317
|
-
NODE
|
|
318
|
-
)" || die "Failed to merge mcp.json with node (is $MCP_JSON valid JSON?)"
|
|
319
|
-
else
|
|
320
|
-
die "Cannot merge mcp.json safely: neither jq nor node is available. Install one (e.g. 'brew install jq') and re-run."
|
|
321
|
-
fi
|
|
322
|
-
|
|
323
|
-
printf '%s\n' "$merged" > "$MCP_JSON"
|
|
324
|
-
ok "Merged the 'chorus' server into $MCP_JSON (other servers preserved)"
|
|
325
|
-
|
|
326
|
-
# ---------- epilogue ----------
|
|
327
|
-
hdr "Done."
|
|
328
|
-
if [ "$SCOPE" = "workspace" ]; then
|
|
329
|
-
scope_note="this project ($KIRO_DIR)"
|
|
330
|
-
else
|
|
331
|
-
scope_note="every directory (global $KIRO_DIR)"
|
|
332
|
-
fi
|
|
333
|
-
cat <<NEXT
|
|
334
|
-
|
|
335
|
-
The Chorus plugin is installed for ${scope_note}.
|
|
336
|
-
|
|
337
|
-
Make sure CHORUS_URL and CHORUS_API_KEY stay exported in your shell (Kiro
|
|
338
|
-
reads \${env:CHORUS_API_KEY} at runtime — add them to ~/.bashrc / ~/.zshrc):
|
|
339
|
-
|
|
340
|
-
${BOLD}export CHORUS_URL="${ASSET_BASE}"${RESET}
|
|
341
|
-
${BOLD}export CHORUS_API_KEY="cho_..."${RESET}
|
|
342
|
-
|
|
343
|
-
Then, in ${BOLD}${KIRO_BIN}${RESET}:
|
|
344
|
-
|
|
345
|
-
* Type ${BOLD}/chorus-idea${RESET} (or /chorus-proposal, /chorus-develop, /chorus-yolo,
|
|
346
|
-
/chorus-review, /chorus-quick-dev, ...) to activate a workflow skill.
|
|
347
|
-
* Launch the full-automation main agent with session hooks + reviewer
|
|
348
|
-
subagents: ${BOLD}${KIRO_BIN} --agent chorus${RESET}
|
|
18
|
+
BOLD=$'\033[1m'; YELLOW=$'\033[33m'; RESET=$'\033[0m'
|
|
19
|
+
INSTALL_CMD="npm install -g @chorus-aidlc/chorus@0.17.0"
|
|
20
|
+
INIT_CMD="chorus agents add"
|
|
349
21
|
|
|
350
|
-
|
|
351
|
-
|
|
22
|
+
printf "${YELLOW}!${RESET} install-kiro.sh is deprecated and installs nothing.\n" >&2
|
|
23
|
+
printf " Chorus setup is now: ${BOLD}%s${RESET} then ${BOLD}%s${RESET}\n" "$INSTALL_CMD" "$INIT_CMD" >&2
|
|
352
24
|
|
|
353
|
-
|
|
25
|
+
# This stub installs nothing. Print the exact commands and exit non-zero so
|
|
26
|
+
# both interactive users and automation that piped the old installer notice
|
|
27
|
+
# they must install the Chorus CLI globally, then run `chorus agents add`.
|
|
28
|
+
printf "\n Run these to set up Chorus:\n\n %s\n %s\n\n" "$INSTALL_CMD" "$INIT_CMD" >&2
|
|
29
|
+
exit 1
|
|
@@ -1,284 +1,29 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
# Chorus + OpenCode
|
|
2
|
+
# Chorus + OpenCode installer — DEPRECATED.
|
|
3
3
|
#
|
|
4
|
-
#
|
|
5
|
-
#
|
|
4
|
+
# Chorus setup is now a global install plus a single command that configures
|
|
5
|
+
# every supported agent (claude / codex / opencode / kiro / openclaw / dsh):
|
|
6
6
|
#
|
|
7
|
-
#
|
|
8
|
-
#
|
|
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.
|
|
7
|
+
# npm install -g @chorus-aidlc/chorus@0.17.0
|
|
8
|
+
# chorus agents add
|
|
13
9
|
#
|
|
14
|
-
#
|
|
15
|
-
#
|
|
16
|
-
#
|
|
17
|
-
#
|
|
18
|
-
#
|
|
10
|
+
# This script is still fetched via curl for backward compatibility, but it no
|
|
11
|
+
# longer installs anything itself — it just points you at `chorus agents add`.
|
|
12
|
+
#
|
|
13
|
+
# Bash 3.2 compatible (macOS /bin/bash): no case-conversion parameter expansion,
|
|
14
|
+
# no associative arrays.
|
|
19
15
|
|
|
20
16
|
set -euo pipefail
|
|
21
17
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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:
|
|
18
|
+
BOLD=$'\033[1m'; YELLOW=$'\033[33m'; RESET=$'\033[0m'
|
|
19
|
+
INSTALL_CMD="npm install -g @chorus-aidlc/chorus@0.17.0"
|
|
20
|
+
INIT_CMD="chorus agents add"
|
|
279
21
|
|
|
280
|
-
|
|
22
|
+
printf "${YELLOW}!${RESET} install-opencode.sh is deprecated and installs nothing.\n" >&2
|
|
23
|
+
printf " Chorus setup is now: ${BOLD}%s${RESET} then ${BOLD}%s${RESET}\n" "$INSTALL_CMD" "$INIT_CMD" >&2
|
|
281
24
|
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
25
|
+
# This stub installs nothing. Print the exact commands and exit non-zero so
|
|
26
|
+
# both interactive users and automation that piped the old installer notice
|
|
27
|
+
# they must install the Chorus CLI globally, then run `chorus agents add`.
|
|
28
|
+
printf "\n Run these to set up Chorus:\n\n %s\n %s\n\n" "$INSTALL_CMD" "$INIT_CMD" >&2
|
|
29
|
+
exit 1
|