@chorus-aidlc/chorus 0.17.3 → 0.18.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 +327 -325
- package/.next/standalone/.next/app-path-routes-manifest.json +37 -37
- package/.next/standalone/.next/build-manifest.json +5 -5
- package/.next/standalone/.next/prerender-manifest.json +27 -27
- 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.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 +1 -1
- 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 +1 -1
- 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_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 +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 +1 -1
- 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 +37 -37
- package/.next/standalone/.next/server/chunks/109.js +1 -0
- package/.next/standalone/.next/server/chunks/1318.js +1 -1
- package/.next/standalone/.next/server/chunks/1496.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/3112.js +1 -1
- package/.next/standalone/.next/server/chunks/{1201.js → 3619.js} +2 -2
- package/.next/standalone/.next/server/chunks/{3630.js → 4810.js} +1 -1
- 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/6113.js +1 -1
- package/.next/standalone/.next/server/chunks/6506.js +2 -2
- package/.next/standalone/.next/server/chunks/6737.js +1 -0
- package/.next/standalone/.next/server/chunks/6753.js +3 -3
- package/.next/standalone/.next/server/chunks/679.js +1 -1
- package/.next/standalone/.next/server/chunks/731.js +1 -0
- 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/7857.js +1 -0
- 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/9931.js +1 -1
- 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.0afa1a540f681fb4.js +1 -0
- package/.next/standalone/.next/static/chunks/22705-324a191727ae45b7.js +1 -0
- package/.next/standalone/.next/static/chunks/33456.4a5f4712a7e78d8f.js +1 -0
- package/.next/standalone/.next/static/chunks/44216-3876e84f5b02d355.js +1 -0
- package/.next/standalone/.next/static/chunks/4860.5719e32b95be2d93.js +1 -0
- package/.next/standalone/.next/static/chunks/6528-a8a562ef7d26bb43.js +1 -0
- package/.next/standalone/.next/static/chunks/67439-7b339b28ed0ecfc6.js +1 -0
- package/.next/standalone/.next/static/chunks/79919-ae8bd8d8ec1e38ce.js +1 -0
- package/.next/standalone/.next/static/chunks/{46021-f5d072b0cbcb7fac.js → 82203-4ce5926624df7ed0.js} +1 -1
- package/.next/standalone/.next/static/chunks/94643-37ac7b8ef8ea5e75.js +1 -0
- package/.next/standalone/.next/static/chunks/99373.6c1509bfaf599741.js +1 -0
- package/.next/standalone/.next/static/chunks/99775-697e82ee04eac6b1.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-2fda722cdace8147.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/{page-77b175e52a85f3cb.js → page-b45c42c536eff64b.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-792aba7fd6b6daa3.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-800a979f12b73f27.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/graph/{page-69d3162667f85677.js → page-34de35f75aa71f6d.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-a16002aa2a911619.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/{page-a3f83031dfbafc81.js → page-e8030824994edf35.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-4f7f1ddbaf79be8f.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/{page-3c7ff3a40a4615ac.js → page-349b0977f3c6209a.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/{page-7b8e11fdc5b596d0.js → page-be43cb06112fce12.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-6916e1abab42a6e6.js +1 -0
- package/.next/standalone/.next/static/chunks/app/onboarding/{page-0ce33b9327fe3d8c.js → page-c0090caae202eae5.js} +1 -1
- package/.next/standalone/.next/static/chunks/{webpack-dffb97a4feb8faba.js → webpack-cfb63dd1b416c92e.js} +1 -1
- package/.next/standalone/.next/static/css/75c761a5428611fa.css +1 -0
- package/.next/standalone/package.json +1 -1
- package/.next/standalone/public/chorus-plugin/.claude-plugin/plugin.json +2 -2
- package/.next/standalone/public/chorus-plugin/agents/code-reviewer.md +1 -0
- package/.next/standalone/public/chorus-plugin/agents/proposal-reviewer.md +12 -3
- package/.next/standalone/public/chorus-plugin/agents/task-reviewer.md +4 -0
- package/.next/standalone/public/chorus-plugin/bin/chorus-api.sh +1 -1
- package/.next/standalone/public/chorus-plugin/bin/on-post-submit-for-verify.sh +3 -3
- package/.next/standalone/public/chorus-plugin/bin/on-post-submit-proposal.sh +3 -3
- package/.next/standalone/public/chorus-plugin/bin/on-post-verify-task.sh +2 -2
- package/.next/standalone/public/chorus-plugin/bin/on-session-start.sh +39 -64
- package/.next/standalone/public/chorus-plugin/bin/resolve-spec-mode.sh +107 -0
- package/.next/standalone/public/chorus-plugin/bin/tests/test-resolver-drift.sh +46 -0
- package/.next/standalone/public/chorus-plugin/bin/tests/test-skill-harness-fidelity-negative.sh +328 -0
- package/.next/standalone/public/chorus-plugin/bin/tests/test-skill-harness-fidelity.sh +372 -0
- package/.next/standalone/public/chorus-plugin/bin/tests/test-spec-mode-resolution.sh +83 -0
- package/.next/standalone/public/chorus-plugin/skills/brainstorm/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/chorus/SKILL.md +11 -6
- package/.next/standalone/public/chorus-plugin/skills/chorus-cli/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/develop/SKILL.md +14 -9
- 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 +27 -31
- package/.next/standalone/public/chorus-plugin/skills/orchestrate/SKILL.md +11 -1
- package/.next/standalone/public/chorus-plugin/skills/proposal/SKILL.md +14 -7
- package/.next/standalone/public/chorus-plugin/skills/quick-dev/SKILL.md +6 -4
- package/.next/standalone/public/chorus-plugin/skills/review/SKILL.md +10 -8
- package/.next/standalone/public/chorus-plugin/skills/spec-lite/SKILL.md +147 -0
- package/.next/standalone/public/chorus-plugin/skills/yolo/SKILL.md +49 -34
- 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 +2 -1
- package/.next/standalone/public/kiro-plugin/.kiro/agents/chorus-task-reviewer.json +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/agents/chorus.md +1 -1
- 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 +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-develop/SKILL.md +9 -7
- 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 +35 -27
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-orchestrate/SKILL.md +9 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-proposal/SKILL.md +14 -7
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-quick-dev/SKILL.md +2 -2
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-review/SKILL.md +8 -8
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-spec-lite/SKILL.md +147 -0
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-yolo/SKILL.md +39 -25
- package/.next/standalone/public/kiro-plugin/.kiro/steering/chorus.md +11 -6
- package/.next/standalone/public/kiro-plugin/bin/chorus-api.sh +1 -1
- package/.next/standalone/public/kiro-plugin/bin/on-agent-spawn.sh +41 -0
- package/.next/standalone/public/kiro-plugin/bin/on-post-submit-for-verify.sh +3 -3
- package/.next/standalone/public/kiro-plugin/bin/on-post-submit-proposal.sh +3 -3
- package/.next/standalone/public/kiro-plugin/bin/on-post-verify-task.sh +2 -2
- package/.next/standalone/public/kiro-plugin/bin/resolve-spec-mode.sh +107 -0
- package/.next/standalone/public/kiro-plugin/manifest.txt +2 -0
- package/.next/standalone/public/skill/chorus/SKILL.md +11 -1
- package/.next/standalone/public/skill/code-reviewer-chorus/SKILL.md +1 -0
- package/.next/standalone/public/skill/develop-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/orchestrate-chorus/SKILL.md +11 -1
- package/.next/standalone/public/skill/proposal-reviewer-chorus/SKILL.md +5 -2
- package/.next/standalone/public/skill/quick-dev-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/review-chorus/SKILL.md +5 -3
- package/.next/standalone/public/skill/task-reviewer-chorus/SKILL.md +4 -0
- package/.next/standalone/public/skill/yolo-chorus/SKILL.md +23 -7
- package/README.ja.md +3 -3
- package/README.ko.md +3 -3
- package/README.md +3 -3
- package/README.zh.md +3 -3
- package/cli/agent-cli-config.mjs +323 -0
- package/cli/agent-launcher.mjs +44 -16
- package/cli/claude-spawner.mjs +22 -13
- package/cli/codex-spawner.mjs +23 -15
- package/cli/credentials.mjs +7 -0
- package/cli/daemon-config.mjs +14 -0
- package/cli/daemon.mjs +32 -6
- package/cli/dsh-managed-config.mjs +26 -28
- package/cli/dsh-spawner.mjs +23 -15
- package/cli/init/steps/credential-seed.mjs +1 -1
- package/cli/kiro-spawner.mjs +22 -15
- package/cli/launch-diagnostics.mjs +67 -0
- package/cli/login.mjs +17 -1
- package/cli/pi-spawner.mjs +19 -12
- package/cli/prompts.mjs +52 -2
- package/cli/spawner-select.mjs +6 -11
- package/package.json +1 -1
- package/.next/standalone/.next/server/chunks/1114.js +0 -1
- package/.next/standalone/.next/server/chunks/1155.js +0 -1
- package/.next/standalone/.next/server/chunks/6465.js +0 -1
- package/.next/standalone/.next/server/chunks/8105.js +0 -1
- package/.next/standalone/.next/server/chunks/8232.js +0 -1
- package/.next/standalone/.next/static/chunks/11595.f7c3ef5cd7fc8feb.js +0 -1
- package/.next/standalone/.next/static/chunks/33456.c81079032acc2966.js +0 -1
- package/.next/standalone/.next/static/chunks/45262-38b332523f00a223.js +0 -1
- package/.next/standalone/.next/static/chunks/4860.f0cfb1201191ae88.js +0 -1
- package/.next/standalone/.next/static/chunks/66609-64a01d5cb415465b.js +0 -1
- package/.next/standalone/.next/static/chunks/79919-c5a2a3fd8f5f9204.js +0 -1
- package/.next/standalone/.next/static/chunks/94394-38194b81b489275c.js +0 -1
- package/.next/standalone/.next/static/chunks/94643-f1bdf37fb3bb6adb.js +0 -1
- package/.next/standalone/.next/static/chunks/95225-96b44da3ebd6ddad.js +0 -1
- package/.next/standalone/.next/static/chunks/96482-2b3bdb2544d72e5a.js +0 -1
- package/.next/standalone/.next/static/chunks/99373.3c23ac2efbd4db02.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-66328332f62c7371.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-87ceae13c4950fc9.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-45e95154e546460e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-b7b2017e5be69564.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-8b06834ca0f663bb.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-efe5326c47aca9ca.js +0 -1
- package/.next/standalone/.next/static/css/1d9cf83f50b6db00.css +0 -1
- /package/.next/standalone/.next/static/{wuqYN129vOIGymh_NEdZe → IxKVu5zkFPTjSKAUR99yH}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{wuqYN129vOIGymh_NEdZe → IxKVu5zkFPTjSKAUR99yH}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# test-skill-harness-fidelity.sh — keep shipped skill/manifest/hook text from
|
|
3
|
+
# re-asserting claims that are false about the harnesses we ship to:
|
|
4
|
+
#
|
|
5
|
+
# 1. `TeamCreate` — a tool no harness in this repo exposes.
|
|
6
|
+
# 2. Five literal phrases promising a reviewer runs in the foreground / returns
|
|
7
|
+
# its VERDICT inline, on the surfaces where that is untrue.
|
|
8
|
+
# 3. `.chorus/specs/TEMPLATE` — a path that exists nowhere on disk.
|
|
9
|
+
# 4. A proposal-reviewer definition — or the Kiro orchestrator/steering prose that
|
|
10
|
+
# DESCRIBES the reviewers' tool grants — claiming the shell/Bash is unavailable:
|
|
11
|
+
# false on all seven surfaces, and the claim that produced the "file is
|
|
12
|
+
# missing" false positive this guard's check 4-6 exist to prevent.
|
|
13
|
+
# 5. A proposal-reviewer definition that does NOT carry the canonical read-only
|
|
14
|
+
# shell rule (allowed commands + the confirm-before-flagging obligation).
|
|
15
|
+
# 6. Tool grants contradicting that rule: `Bash` back in the Claude Code agent's
|
|
16
|
+
# `disallowedTools`, or `shell` dropped from Kiro's `tools`.
|
|
17
|
+
#
|
|
18
|
+
# SCOPE — read this before extending the guard. Checks 1-3 are a string blacklist,
|
|
19
|
+
# nothing more. They do NOT verify that the reviewer-wait contract or the
|
|
20
|
+
# round-qualified "read THIS round's VERDICT" instruction is present, correct, or
|
|
21
|
+
# even still in the file: deleting those paragraphs outright leaves all three checks
|
|
22
|
+
# green. That gate is held by review and by the acceptance criteria of the changes
|
|
23
|
+
# that write those paragraphs, not here. It also does NOT check that the spec-lite
|
|
24
|
+
# templates are inlined anywhere — deliberately, by owner decision.
|
|
25
|
+
#
|
|
26
|
+
# Checks 4-6 go one step further for the proposal-reviewer only (4 also covers the
|
|
27
|
+
# two Kiro docs that describe its grant to the orchestrator): 4 is a blacklist,
|
|
28
|
+
# but 5 REQUIRES two marker substrings and 6 inspects the two manifests that
|
|
29
|
+
# actually gate the capability. They still do not verify the full three-sentence
|
|
30
|
+
# wording — a surface could keep both markers while mangling the forbidden list.
|
|
31
|
+
#
|
|
32
|
+
# Bash 3.2 compatible.
|
|
33
|
+
set -u
|
|
34
|
+
|
|
35
|
+
# Repo root = four levels up from this script (tests → bin → chorus-plugin → public → repo).
|
|
36
|
+
ROOT="$(cd "$(dirname "$0")/../../../.." && pwd)"
|
|
37
|
+
# This guard and its negative-case harness both have to spell every blacklisted
|
|
38
|
+
# literal out in order to forbid / plant it, so both are excluded from their own
|
|
39
|
+
# scans. Nothing else is exempt — a violation hidden in these two files would go
|
|
40
|
+
# unseen, which is the same tradeoff every self-excluding linter makes.
|
|
41
|
+
SELF_REL="public/chorus-plugin/bin/tests/test-skill-harness-fidelity.sh"
|
|
42
|
+
SELF_REL2="public/chorus-plugin/bin/tests/test-skill-harness-fidelity-negative.sh"
|
|
43
|
+
|
|
44
|
+
if [ ! -d "$ROOT/public/chorus-plugin" ]; then
|
|
45
|
+
echo "FATAL: repo root looks wrong (no public/chorus-plugin under $ROOT)" >&2
|
|
46
|
+
exit 1
|
|
47
|
+
fi
|
|
48
|
+
|
|
49
|
+
PASS=0
|
|
50
|
+
FAIL=0
|
|
51
|
+
|
|
52
|
+
# --exclude-dir matches a directory BASENAME, not a path, so `worktrees` covers
|
|
53
|
+
# `.claude/worktrees/` (and any other worktrees dir) — intentionally broader.
|
|
54
|
+
EXCLUDES="--exclude-dir=node_modules --exclude-dir=dist --exclude-dir=cdk.out --exclude-dir=worktrees --exclude-dir=.git"
|
|
55
|
+
|
|
56
|
+
# Scan-error flag. This is a FILE, not a shell variable, on purpose: every call
|
|
57
|
+
# site invokes hits() inside `$( )`, which runs it in a subshell — a variable
|
|
58
|
+
# assignment there is discarded when the substitution ends, so the guard would
|
|
59
|
+
# print the error and still exit 0. A file survives the subshell.
|
|
60
|
+
SCAN_ERR_FILE="$(mktemp)"
|
|
61
|
+
trap 'rm -f "$SCAN_ERR_FILE"' EXIT
|
|
62
|
+
|
|
63
|
+
# hits <literal> <path>... — print repo-relative files containing the literal,
|
|
64
|
+
# minus this guard's own source (it necessarily spells every pattern out).
|
|
65
|
+
#
|
|
66
|
+
# A grep that cannot scan is NOT a pass. grep exits 0 on match, 1 on no match and
|
|
67
|
+
# >=2 on error (unreadable path, missing directory, a path mangled by word
|
|
68
|
+
# splitting). Swallowing stderr and treating >=2 like "no match" is how a guard
|
|
69
|
+
# reports PASS while having searched nothing — so the rc is inspected and recorded
|
|
70
|
+
# in SCAN_ERR_FILE, which fails the run at the end. Every call site must pass each
|
|
71
|
+
# path as its own quoted argument for the same reason.
|
|
72
|
+
hits() {
|
|
73
|
+
local _lit _out _rc _err
|
|
74
|
+
_lit="$1"; shift
|
|
75
|
+
_err="$(mktemp)"
|
|
76
|
+
# shellcheck disable=SC2086
|
|
77
|
+
_out="$(grep -rlIF $EXCLUDES -- "$_lit" "$@" 2>"$_err")"
|
|
78
|
+
_rc=$?
|
|
79
|
+
if [ "$_rc" -ge 2 ]; then
|
|
80
|
+
echo "$_lit" >> "$SCAN_ERR_FILE"
|
|
81
|
+
echo " ERROR scan failed for \"$_lit\" (grep rc=$_rc) — a failed scan is not a PASS:" >&2
|
|
82
|
+
sed 's/^/ /' "$_err" >&2
|
|
83
|
+
fi
|
|
84
|
+
rm -f "$_err"
|
|
85
|
+
[ -n "$_out" ] || return 0
|
|
86
|
+
printf '%s\n' "$_out" \
|
|
87
|
+
| sed "s|^$ROOT/||" \
|
|
88
|
+
| grep -v "^$SELF_REL\$" \
|
|
89
|
+
| grep -v "^$SELF_REL2\$" \
|
|
90
|
+
| sort
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
# file_has <literal> <abs-path> — rc 0 when the file contains the literal, rc 1
|
|
94
|
+
# when it does not, rc>=2 when grep could not scan (missing/unreadable file).
|
|
95
|
+
#
|
|
96
|
+
# Unlike hits(), this is called DIRECTLY in an `if`, never inside `$( )`: a scan
|
|
97
|
+
# error has to be recorded for the parent shell, and an assignment made inside a
|
|
98
|
+
# command substitution is discarded when it ends. SCAN_ERR_FILE is a file for the
|
|
99
|
+
# same reason (see above) and works either way; the `if` form also keeps the rc
|
|
100
|
+
# distinction between "absent" (1) and "could not look" (>=2), which matters here
|
|
101
|
+
# because checks 5-6 REQUIRE a substring — an unreadable file would otherwise be
|
|
102
|
+
# indistinguishable from a file that legitimately lacks it.
|
|
103
|
+
file_has() {
|
|
104
|
+
local _lit _path _rc _err
|
|
105
|
+
_lit="$1"; _path="$2"
|
|
106
|
+
_err="$(mktemp)"
|
|
107
|
+
grep -qIF -- "$_lit" "$_path" 2>"$_err"
|
|
108
|
+
_rc=$?
|
|
109
|
+
if [ "$_rc" -ge 2 ]; then
|
|
110
|
+
echo "$_lit @ $_path" >> "$SCAN_ERR_FILE"
|
|
111
|
+
echo " ERROR scan failed for \"$_lit\" in $_path (grep rc=$_rc) — a failed scan is not a PASS:" >&2
|
|
112
|
+
sed 's/^/ /' "$_err" >&2
|
|
113
|
+
fi
|
|
114
|
+
rm -f "$_err"
|
|
115
|
+
return "$_rc"
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
report() {
|
|
119
|
+
local _label _found
|
|
120
|
+
_label="$1"; _found="$2"
|
|
121
|
+
if [ -z "$_found" ]; then
|
|
122
|
+
PASS=$((PASS + 1)); echo " PASS $_label"
|
|
123
|
+
else
|
|
124
|
+
FAIL=$((FAIL + 1)); echo " FAIL $_label — found in:"
|
|
125
|
+
echo "$_found" | sed 's/^/ /'
|
|
126
|
+
fi
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
echo "skill/harness fidelity guard (checks 1-4 blacklist, 5-6 require — see header for what it does NOT cover):"
|
|
130
|
+
echo ""
|
|
131
|
+
|
|
132
|
+
# ── Check 1 — no TeamCreate anywhere in shipped files ────────────────────────
|
|
133
|
+
# packages/chorus-pi/test/{static.sh,README.md} name it in order to forbid it.
|
|
134
|
+
echo "Check 1 — no \`TeamCreate\` (no harness in this repo exposes it)"
|
|
135
|
+
FOUND=$(hits 'TeamCreate' "$ROOT/public" "$ROOT/plugins" "$ROOT/packages" \
|
|
136
|
+
| grep -v '^packages/chorus-pi/test/static\.sh$' \
|
|
137
|
+
| grep -v '^packages/chorus-pi/test/README\.md$')
|
|
138
|
+
report "no TeamCreate reference" "$FOUND"
|
|
139
|
+
echo ""
|
|
140
|
+
|
|
141
|
+
# ── Check 2 — no foreground / inline-VERDICT reviewer promise ────────────────
|
|
142
|
+
# Scoped to the surfaces where the promise is false: on Claude Code the sub-agent
|
|
143
|
+
# launch result is never the verdict, and Kiro/dsh word their waiting differently.
|
|
144
|
+
# packages/chorus-pi/ is EXCLUDED on purpose — its bundled `subagent` genuinely
|
|
145
|
+
# blocks and returns the VERDICT, so its skill says so truthfully.
|
|
146
|
+
# Literal phrases only. Do NOT add a proximity rule pairing `run_in_background`
|
|
147
|
+
# with "foreground"/"synchronous"/"inline": dsh legitimately keeps
|
|
148
|
+
# `run_in_background: false`, so such a rule would fail a correct tree.
|
|
149
|
+
echo "Check 2 — no foreground/inline-VERDICT reviewer promise (chorus-plugin, kiro-plugin, chorus-dsh)"
|
|
150
|
+
# Three separate quoted arguments, NOT one space-joined string: a repo checked out
|
|
151
|
+
# under a path containing a space (e.g. /Users/me/My Repos/Chorus) would have that
|
|
152
|
+
# string word-split into non-existent paths, grep would error, and the guard would
|
|
153
|
+
# have reported PASS having scanned nothing. Bash 3.2 has indexed arrays (only
|
|
154
|
+
# associative ones are 4+), so an array is fine here.
|
|
155
|
+
SCOPE2=("$ROOT/public/chorus-plugin" "$ROOT/public/kiro-plugin" "$ROOT/packages/chorus-dsh")
|
|
156
|
+
CHECK2_FAILED=0
|
|
157
|
+
# Bash 3.2: no arrays / no readarray — one literal per line, split on newlines.
|
|
158
|
+
PATTERNS_2='reviewer synchronously
|
|
159
|
+
returns the VERDICT inline
|
|
160
|
+
waits and returns the VERDICT
|
|
161
|
+
in **foreground**
|
|
162
|
+
(do NOT set run_in_background)'
|
|
163
|
+
OLD_IFS="$IFS"
|
|
164
|
+
IFS='
|
|
165
|
+
'
|
|
166
|
+
for pat in $PATTERNS_2; do
|
|
167
|
+
IFS="$OLD_IFS"
|
|
168
|
+
FOUND=$(hits "$pat" "${SCOPE2[@]}")
|
|
169
|
+
if [ -n "$FOUND" ]; then
|
|
170
|
+
CHECK2_FAILED=1
|
|
171
|
+
echo " FAIL literal \"$pat\" — found in:"
|
|
172
|
+
echo "$FOUND" | sed 's/^/ /'
|
|
173
|
+
fi
|
|
174
|
+
IFS='
|
|
175
|
+
'
|
|
176
|
+
done
|
|
177
|
+
IFS="$OLD_IFS"
|
|
178
|
+
if [ "$CHECK2_FAILED" -eq 0 ]; then
|
|
179
|
+
PASS=$((PASS + 1)); echo " PASS none of the 5 blacklisted literals present"
|
|
180
|
+
else
|
|
181
|
+
FAIL=$((FAIL + 1))
|
|
182
|
+
fi
|
|
183
|
+
echo ""
|
|
184
|
+
|
|
185
|
+
# ── Check 3 — no dangling .chorus/specs/TEMPLATE path ───────────────────────
|
|
186
|
+
echo "Check 3 — no \`.chorus/specs/TEMPLATE\` path (no such directory is shipped)"
|
|
187
|
+
FOUND=$(hits '.chorus/specs/TEMPLATE' "$ROOT/public" "$ROOT/plugins" "$ROOT/packages" "$ROOT/docs/SPEC_LITE.md")
|
|
188
|
+
report "no .chorus/specs/TEMPLATE reference" "$FOUND"
|
|
189
|
+
echo ""
|
|
190
|
+
|
|
191
|
+
# ── The seven proposal-reviewer definitions ─────────────────────────────────
|
|
192
|
+
# Enumerated explicitly and NOT globbed, on purpose: shipping an eighth surface
|
|
193
|
+
# without adding it here is then a visible omission in this list rather than a
|
|
194
|
+
# silent pass by a glob that never saw the new file. A path listed here but absent
|
|
195
|
+
# on disk is a FAILURE, never a skip.
|
|
196
|
+
#
|
|
197
|
+
# Checks 4-6 are file-scoped, so this script spelling its own literals out cannot
|
|
198
|
+
# self-match the way checks 1-3 could — no SELF_REL exemption is needed or wanted.
|
|
199
|
+
PR_FILES='public/chorus-plugin/agents/proposal-reviewer.md
|
|
200
|
+
plugins/chorus/skills/chorus-proposal-reviewer/SKILL.md
|
|
201
|
+
public/kiro-plugin/.kiro/agents/chorus-proposal-reviewer.json
|
|
202
|
+
packages/chorus-pi/agents/chorus-proposal-reviewer.md
|
|
203
|
+
packages/chorus-dsh/skills/proposal-reviewer-chorus/SKILL.md
|
|
204
|
+
packages/openclaw-plugin/skills/proposal-reviewer/SKILL.md
|
|
205
|
+
public/skill/proposal-reviewer-chorus/SKILL.md'
|
|
206
|
+
|
|
207
|
+
# ── Files in check 4's scope ONLY ────────────────────────────────────────────
|
|
208
|
+
# The Kiro orchestrator's own prompt and the Kiro steering doc are not reviewer
|
|
209
|
+
# definitions — they DESCRIBE the reviewers' tool grants to the main agent that
|
|
210
|
+
# spawns them. A false "the reviewer has no shell" claim here misleads the
|
|
211
|
+
# orchestrator just as badly as one in the reviewer's own file, so they belong in
|
|
212
|
+
# the blacklist check. They must NOT be added to PR_FILES: check 5 requires the
|
|
213
|
+
# canonical rule verbatim, which is a reviewer-definition obligation, and check 6
|
|
214
|
+
# reads manifests neither of these files is.
|
|
215
|
+
# Same contract as PR_FILES: enumerated, not globbed, and a missing path FAILS.
|
|
216
|
+
CHECK4_EXTRA_FILES='public/kiro-plugin/.kiro/agents/chorus.md
|
|
217
|
+
public/kiro-plugin/.kiro/steering/chorus.md'
|
|
218
|
+
|
|
219
|
+
# ── Check 4 — no surface claims the reviewer's shell is unavailable ──────────
|
|
220
|
+
# These are the exact assertions the seven files carried before the fix. Each is
|
|
221
|
+
# long enough to be unambiguous: the truthful prose every surface DOES keep —
|
|
222
|
+
# "Any shell command beyond read-only inspection — no file writes …" — must not
|
|
223
|
+
# match, so no bare "shell"/"Bash" substring appears in this list.
|
|
224
|
+
echo "Check 4 — no proposal-reviewer surface (or Kiro orchestrator/steering doc) claims shell/Bash is unavailable"
|
|
225
|
+
PATTERNS_SHELL_DISABLED='Bash is disabled
|
|
226
|
+
no `shell`
|
|
227
|
+
cannot run shell
|
|
228
|
+
Do NOT run Bash
|
|
229
|
+
or run Bash commands
|
|
230
|
+
Running any shell commands'
|
|
231
|
+
CHECK4_FAILED=0
|
|
232
|
+
CHECK4_FILES=0
|
|
233
|
+
while IFS= read -r _rel; do
|
|
234
|
+
[ -n "$_rel" ] || continue
|
|
235
|
+
CHECK4_FILES=$((CHECK4_FILES + 1))
|
|
236
|
+
_abs="$ROOT/$_rel"
|
|
237
|
+
if [ ! -f "$_abs" ]; then
|
|
238
|
+
CHECK4_FAILED=1
|
|
239
|
+
echo " FAIL enumerated surface MISSING (not skipped): $_rel"
|
|
240
|
+
continue
|
|
241
|
+
fi
|
|
242
|
+
while IFS= read -r _pat; do
|
|
243
|
+
[ -n "$_pat" ] || continue
|
|
244
|
+
if file_has "$_pat" "$_abs"; then
|
|
245
|
+
CHECK4_FAILED=1
|
|
246
|
+
echo " FAIL shell-disabled claim \"$_pat\" — found in:"
|
|
247
|
+
echo " $_rel"
|
|
248
|
+
fi
|
|
249
|
+
done <<PATS4
|
|
250
|
+
$PATTERNS_SHELL_DISABLED
|
|
251
|
+
PATS4
|
|
252
|
+
done <<FILES4
|
|
253
|
+
$PR_FILES
|
|
254
|
+
$CHECK4_EXTRA_FILES
|
|
255
|
+
FILES4
|
|
256
|
+
if [ "$CHECK4_FAILED" -eq 0 ]; then
|
|
257
|
+
PASS=$((PASS + 1))
|
|
258
|
+
echo " PASS none of the 6 shell-disabled literals present in $CHECK4_FILES enumerated files"
|
|
259
|
+
else
|
|
260
|
+
FAIL=$((FAIL + 1))
|
|
261
|
+
fi
|
|
262
|
+
echo ""
|
|
263
|
+
|
|
264
|
+
# ── Check 5 — every surface carries the canonical read-only shell rule ───────
|
|
265
|
+
# Two markers, both required:
|
|
266
|
+
# * "READ-ONLY inspection only" — NOT "Bash is READ-ONLY", because Kiro's tool is
|
|
267
|
+
# named `shell` and its prompt reads "Shell is READ-ONLY inspection only".
|
|
268
|
+
# * "no installs, no test/build runs" — the forbidden list. Proposal review runs
|
|
269
|
+
# before any implementation exists, so test/build execution is out of scope here
|
|
270
|
+
# even though the task- and code-reviewer are allowed it.
|
|
271
|
+
# * "before flagging it as missing" — the existence-check obligation. Without it
|
|
272
|
+
# the capability grant alone does not stop the false positive this change fixes,
|
|
273
|
+
# since nothing obliges the reviewer to look before asserting a file is absent.
|
|
274
|
+
echo "Check 5 — every proposal-reviewer surface carries the canonical read-only rule"
|
|
275
|
+
CHECK5_FAILED=0
|
|
276
|
+
CHECK5_FILES=0
|
|
277
|
+
MARKERS_CANONICAL='READ-ONLY inspection only
|
|
278
|
+
no installs, no test/build runs
|
|
279
|
+
before flagging it as missing'
|
|
280
|
+
while IFS= read -r _rel; do
|
|
281
|
+
[ -n "$_rel" ] || continue
|
|
282
|
+
CHECK5_FILES=$((CHECK5_FILES + 1))
|
|
283
|
+
_abs="$ROOT/$_rel"
|
|
284
|
+
if [ ! -f "$_abs" ]; then
|
|
285
|
+
CHECK5_FAILED=1
|
|
286
|
+
echo " FAIL enumerated surface MISSING (not skipped): $_rel"
|
|
287
|
+
continue
|
|
288
|
+
fi
|
|
289
|
+
while IFS= read -r _marker; do
|
|
290
|
+
[ -n "$_marker" ] || continue
|
|
291
|
+
if ! file_has "$_marker" "$_abs"; then
|
|
292
|
+
CHECK5_FAILED=1
|
|
293
|
+
echo " FAIL canonical rule marker \"$_marker\" MISSING from:"
|
|
294
|
+
echo " $_rel"
|
|
295
|
+
fi
|
|
296
|
+
done <<MARK5
|
|
297
|
+
$MARKERS_CANONICAL
|
|
298
|
+
MARK5
|
|
299
|
+
done <<FILES5
|
|
300
|
+
$PR_FILES
|
|
301
|
+
FILES5
|
|
302
|
+
if [ "$CHECK5_FAILED" -eq 0 ]; then
|
|
303
|
+
PASS=$((PASS + 1))
|
|
304
|
+
echo " PASS all 3 canonical markers present in all $CHECK5_FILES enumerated surfaces"
|
|
305
|
+
else
|
|
306
|
+
FAIL=$((FAIL + 1))
|
|
307
|
+
fi
|
|
308
|
+
echo ""
|
|
309
|
+
|
|
310
|
+
# ── Check 6 — the two manifests that actually gate the capability ────────────
|
|
311
|
+
# Prose granting read-only shell is a lie if the harness never hands the tool over.
|
|
312
|
+
# Claude Code and Kiro are the only two surfaces that enforce tool access; the other
|
|
313
|
+
# five have no enforcement mechanism, so there is nothing to assert about them.
|
|
314
|
+
echo "Check 6 — tool grants match the rule (Claude Code \`disallowedTools\`, Kiro \`tools\`)"
|
|
315
|
+
CHECK6_FAILED=0
|
|
316
|
+
CC_AGENT="$ROOT/public/chorus-plugin/agents/proposal-reviewer.md"
|
|
317
|
+
if [ ! -f "$CC_AGENT" ]; then
|
|
318
|
+
CHECK6_FAILED=1
|
|
319
|
+
echo " FAIL Claude Code agent MISSING: public/chorus-plugin/agents/proposal-reviewer.md"
|
|
320
|
+
elif ! file_has 'disallowedTools:' "$CC_AGENT"; then
|
|
321
|
+
CHECK6_FAILED=1
|
|
322
|
+
echo " FAIL no \`disallowedTools:\` key in public/chorus-plugin/agents/proposal-reviewer.md"
|
|
323
|
+
echo " (the guard cannot certify Bash is absent from a list it cannot find)"
|
|
324
|
+
else
|
|
325
|
+
# The frontmatter list runs from `disallowedTools:` to the first line that is not
|
|
326
|
+
# a ` - item` entry. awk, not a YAML parser — this is a 6-line literal block.
|
|
327
|
+
# The key line itself is kept so YAML flow style (`disallowedTools: [Bash, Edit]`)
|
|
328
|
+
# is covered too, and the match is word-boundary rather than a whole-line `- Bash`
|
|
329
|
+
# so a quoted entry (`- "Bash"`) cannot slip through either.
|
|
330
|
+
# Blank lines and `#` comments INSIDE the list are skipped rather than treated as
|
|
331
|
+
# the end of it: YAML allows both, so exiting on one let `- Bash` placed after a
|
|
332
|
+
# comment sit in the deny list while this check reported PASS.
|
|
333
|
+
CC_BLOCK="$(awk '/^disallowedTools:/{f=1;print;next}
|
|
334
|
+
f&&/^[[:space:]]*$/{next}
|
|
335
|
+
f&&/^[[:space:]]*#/{next}
|
|
336
|
+
f&&/^[[:space:]]*-[[:space:]]/{print;next} f{exit}' "$CC_AGENT")"
|
|
337
|
+
if printf '%s\n' "$CC_BLOCK" | grep -qw 'Bash'; then
|
|
338
|
+
CHECK6_FAILED=1
|
|
339
|
+
echo " FAIL \`- Bash\` is back in \`disallowedTools\` of:"
|
|
340
|
+
echo " public/chorus-plugin/agents/proposal-reviewer.md"
|
|
341
|
+
fi
|
|
342
|
+
fi
|
|
343
|
+
KIRO_AGENT="$ROOT/public/kiro-plugin/.kiro/agents/chorus-proposal-reviewer.json"
|
|
344
|
+
if [ ! -f "$KIRO_AGENT" ]; then
|
|
345
|
+
CHECK6_FAILED=1
|
|
346
|
+
echo " FAIL Kiro agent MISSING: public/kiro-plugin/.kiro/agents/chorus-proposal-reviewer.json"
|
|
347
|
+
else
|
|
348
|
+
# From the `"tools"` key to the line closing its array.
|
|
349
|
+
KIRO_BLOCK="$(awk '/"tools"[[:space:]]*:/{f=1} f{print; if (/\]/) exit}' "$KIRO_AGENT")"
|
|
350
|
+
if ! printf '%s\n' "$KIRO_BLOCK" | grep -qF '"shell"'; then
|
|
351
|
+
CHECK6_FAILED=1
|
|
352
|
+
echo " FAIL \`\"shell\"\` is not in the \`tools\` array of:"
|
|
353
|
+
echo " public/kiro-plugin/.kiro/agents/chorus-proposal-reviewer.json"
|
|
354
|
+
fi
|
|
355
|
+
fi
|
|
356
|
+
if [ "$CHECK6_FAILED" -eq 0 ]; then
|
|
357
|
+
PASS=$((PASS + 1))
|
|
358
|
+
echo " PASS Claude Code does not disallow Bash; Kiro grants \`shell\`"
|
|
359
|
+
else
|
|
360
|
+
FAIL=$((FAIL + 1))
|
|
361
|
+
fi
|
|
362
|
+
echo ""
|
|
363
|
+
|
|
364
|
+
if [ -s "$SCAN_ERR_FILE" ]; then
|
|
365
|
+
FAIL=$((FAIL + 1))
|
|
366
|
+
echo " FAIL at least one grep could not scan its paths — see the ERROR lines above."
|
|
367
|
+
echo " A scan that never ran cannot certify anything; fix the paths and re-run."
|
|
368
|
+
echo ""
|
|
369
|
+
fi
|
|
370
|
+
|
|
371
|
+
echo "Results: $PASS check(s) passed, $FAIL failed"
|
|
372
|
+
[ "$FAIL" -eq 0 ]
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# test-spec-mode-resolution.sh — unit test for resolve-spec-mode.sh.
|
|
3
|
+
#
|
|
4
|
+
# resolve-spec-mode.sh is pure (env + filesystem only), so we drive it directly
|
|
5
|
+
# in subshells across the resolution matrix: explicit CHORUS_SPEC_MODE
|
|
6
|
+
# {lite, openspec, off, <invalid>} × OpenSpec {usable, missing, disabled} + unset.
|
|
7
|
+
# We simulate "OpenSpec usable" with a temp PROJECT_ROOT containing an openspec/
|
|
8
|
+
# dir plus a fake `openspec` on PATH; "missing" by dropping one of those; and
|
|
9
|
+
# "disabled" via CHORUS_OPENSPEC_MODE=off / CLAUDE_PLUGIN_OPTION_ENABLEOPENSPEC=false.
|
|
10
|
+
#
|
|
11
|
+
# Owner contract: explicit mode wins; UNSET → OpenSpec when usable, else lite.
|
|
12
|
+
# Bash 3.2 compatible (no associative arrays, no ${var,,}).
|
|
13
|
+
set -u
|
|
14
|
+
|
|
15
|
+
HERE="$(cd "$(dirname "$0")" && pwd)"
|
|
16
|
+
RESOLVER="${HERE}/../resolve-spec-mode.sh"
|
|
17
|
+
[ -f "$RESOLVER" ] || { echo "FATAL: resolver not found at $RESOLVER" >&2; exit 1; }
|
|
18
|
+
|
|
19
|
+
TMP="$(mktemp -d)"
|
|
20
|
+
trap 'rm -rf "$TMP"' EXIT
|
|
21
|
+
|
|
22
|
+
# A repo root WITH an openspec/ dir, and one WITHOUT.
|
|
23
|
+
ROOT_WITH="$TMP/with"; mkdir -p "$ROOT_WITH/openspec"
|
|
24
|
+
ROOT_WITHOUT="$TMP/without"; mkdir -p "$ROOT_WITHOUT"
|
|
25
|
+
|
|
26
|
+
# A fake `openspec` CLI on PATH; and a clean PATH that lacks openspec.
|
|
27
|
+
FAKEBIN="$TMP/bin"; mkdir -p "$FAKEBIN"
|
|
28
|
+
printf '#!/bin/sh\nexit 0\n' > "$FAKEBIN/openspec"; chmod +x "$FAKEBIN/openspec"
|
|
29
|
+
CLEAN_PATH="/usr/bin:/bin"
|
|
30
|
+
command -v openspec >/dev/null 2>&1 && [ -x "$(command -v openspec)" ] # informational only
|
|
31
|
+
# Sanity: ensure the clean PATH really lacks openspec, else the "missing CLI"
|
|
32
|
+
# cases would be invalid on this machine.
|
|
33
|
+
if PATH="$CLEAN_PATH" command -v openspec >/dev/null 2>&1; then
|
|
34
|
+
echo "FATAL: openspec is on the clean PATH ($CLEAN_PATH); cannot simulate missing CLI" >&2
|
|
35
|
+
exit 1
|
|
36
|
+
fi
|
|
37
|
+
PATH_WITH_CLI="$FAKEBIN:$CLEAN_PATH"
|
|
38
|
+
|
|
39
|
+
PASS=0; FAIL=0
|
|
40
|
+
|
|
41
|
+
# run <label> <expect_mode> <expect_active> <expect_fail:ok|fail> -- env assignments...
|
|
42
|
+
run() {
|
|
43
|
+
label="$1"; exp_mode="$2"; exp_active="$3"; exp_fail="$4"; shift 4
|
|
44
|
+
[ "$1" = "--" ] && shift
|
|
45
|
+
out="$(env -i HOME="$HOME" "$@" bash -c '
|
|
46
|
+
. "'"$RESOLVER"'" >/dev/null 2>&1
|
|
47
|
+
if [ -n "${SPEC_FAIL:-}" ]; then f=fail; else f=ok; fi
|
|
48
|
+
printf "%s|%s|%s" "${SPEC_MODE:-}" "${CHORUS_OPENSPEC_ACTIVE:-}" "$f"
|
|
49
|
+
')"
|
|
50
|
+
want="${exp_mode}|${exp_active}|${exp_fail}"
|
|
51
|
+
if [ "$out" = "$want" ]; then
|
|
52
|
+
PASS=$((PASS+1)); printf ' PASS %s\n' "$label"
|
|
53
|
+
else
|
|
54
|
+
FAIL=$((FAIL+1)); printf ' FAIL %s\n want [%s] got [%s]\n' "$label" "$want" "$out"
|
|
55
|
+
fi
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
echo "spec-mode resolution matrix:"
|
|
59
|
+
|
|
60
|
+
# --- unset ---
|
|
61
|
+
run "unset + usable → openspec" openspec 1 ok -- PATH="$PATH_WITH_CLI" PROJECT_ROOT="$ROOT_WITH"
|
|
62
|
+
run "unset + no openspec dir → lite" lite 0 ok -- PATH="$PATH_WITH_CLI" PROJECT_ROOT="$ROOT_WITHOUT"
|
|
63
|
+
run "unset + dir but no CLI → lite" lite 0 ok -- PATH="$CLEAN_PATH" PROJECT_ROOT="$ROOT_WITH"
|
|
64
|
+
run "unset + disabled(off) → lite" lite 0 ok -- PATH="$PATH_WITH_CLI" PROJECT_ROOT="$ROOT_WITH" CHORUS_OPENSPEC_MODE=off
|
|
65
|
+
run "unset + disabled(toggle) → lite" lite 0 ok -- PATH="$PATH_WITH_CLI" PROJECT_ROOT="$ROOT_WITH" CLAUDE_PLUGIN_OPTION_ENABLEOPENSPEC=false
|
|
66
|
+
|
|
67
|
+
# --- explicit lite / off ---
|
|
68
|
+
run "lite + usable → lite" lite 0 ok -- PATH="$PATH_WITH_CLI" PROJECT_ROOT="$ROOT_WITH" CHORUS_SPEC_MODE=lite
|
|
69
|
+
run "off + usable → off" off 0 ok -- PATH="$PATH_WITH_CLI" PROJECT_ROOT="$ROOT_WITH" CHORUS_SPEC_MODE=off
|
|
70
|
+
|
|
71
|
+
# --- explicit openspec ---
|
|
72
|
+
run "openspec + usable → openspec" openspec 1 ok -- PATH="$PATH_WITH_CLI" PROJECT_ROOT="$ROOT_WITH" CHORUS_SPEC_MODE=openspec
|
|
73
|
+
run "openspec + no dir → FAIL" openspec 0 fail -- PATH="$PATH_WITH_CLI" PROJECT_ROOT="$ROOT_WITHOUT" CHORUS_SPEC_MODE=openspec
|
|
74
|
+
run "openspec + no CLI → FAIL" openspec 0 fail -- PATH="$CLEAN_PATH" PROJECT_ROOT="$ROOT_WITH" CHORUS_SPEC_MODE=openspec
|
|
75
|
+
run "openspec + disabled → FAIL" openspec 0 fail -- PATH="$PATH_WITH_CLI" PROJECT_ROOT="$ROOT_WITH" CHORUS_SPEC_MODE=openspec CHORUS_OPENSPEC_MODE=off
|
|
76
|
+
|
|
77
|
+
# --- invalid value falls back to default resolution ---
|
|
78
|
+
run "invalid + usable → openspec" openspec 1 ok -- PATH="$PATH_WITH_CLI" PROJECT_ROOT="$ROOT_WITH" CHORUS_SPEC_MODE=bogus
|
|
79
|
+
run "invalid + no dir → lite" lite 0 ok -- PATH="$PATH_WITH_CLI" PROJECT_ROOT="$ROOT_WITHOUT" CHORUS_SPEC_MODE=bogus
|
|
80
|
+
|
|
81
|
+
echo ""
|
|
82
|
+
echo "Results: $PASS passed, $FAIL failed"
|
|
83
|
+
[ "$FAIL" -eq 0 ]
|
|
@@ -4,7 +4,7 @@ description: Chorus AI Agent collaboration platform — overview, common tools,
|
|
|
4
4
|
license: AGPL-3.0
|
|
5
5
|
metadata:
|
|
6
6
|
author: chorus
|
|
7
|
-
version: "0.
|
|
7
|
+
version: "0.18.0"
|
|
8
8
|
category: project-management
|
|
9
9
|
mcp_server: chorus
|
|
10
10
|
---
|
|
@@ -344,9 +344,13 @@ To disable, reconfigure the plugin via `/plugin` settings or manually edit `~/.c
|
|
|
344
344
|
|
|
345
345
|
When enabled, reviewers run as read-only sub-agents and post a VERDICT comment on the proposal/task/idea. Three possible outcomes: **PASS** (no issues), **PASS WITH NOTES** (minor non-blocking notes), or **FAIL** (BLOCKERs found). Results are advisory — they do not block approval, verification, or ship; the code-review gateway in particular is behavioral (it does not change the Idea's stored status). On a code-review FAIL, fix it via the `/chorus:quick-dev` workflow: `chorus_create_tasks` with `proposalUuid` set to the current approved proposal so the fix tasks attach to it. Group related small BLOCKERs into one cohesive task by default; split only materially large or independently testable fixes. Each fix task must self-check its acceptance criteria and pass independent task review plus admin verification. Re-run the gateway only after every fix task is successfully `done`; if there is a failed or cancelled fix task, stop and escalate instead. Disabling reduces token usage but removes the independent quality gate.
|
|
346
346
|
|
|
347
|
-
|
|
347
|
+
**First-principles alignment (a stage-tailored instruction in all three reviewers).** Each reviewer also checks, top-down, that the work still serves the *original Idea's intent*. It resolves the Idea from the entity under review (proposal-reviewer → the proposal's `inputUuids[0]`; task-reviewer → its proposal's `inputUuids[0]`; code-reviewer → the given `ideaUuid`), reads it with the existing `chorus_get_idea` + `chorus_get_elaboration` + `chorus_get_comments`, and builds the intent **baseline** from **human input only** — the Idea content + elaboration answers where `answeredBy.type == "user"` + comments where `author.type == "user"`. Agent-answered elaboration and agent-authored comments are audit context only: they cannot expand, shrink, or override the baseline. It flags **scope creep** (work beyond intent), **requirement loss / shrink** (intent dropped or reduced), or **semantic drift** (passes AC but misses the point). Unauthorized drift is a **BLOCKER → VERDICT: FAIL / reject**, downgraded to a cited `NOTE` only when traceable to a **human** authorization: a human-authored Idea comment (`author.type == "user"`), a human-answered elaboration entry (`answeredBy.type == "user"`), or an explicit human override at the gate. **An agent's own comment never authorizes**, so a drifting agent cannot self-clear. The alignment finding folds into the existing VERDICT; the dimension is skipped when the entity has no attached Idea.
|
|
348
348
|
|
|
349
|
-
|
|
349
|
+
### 6. Spec mode: OpenSpec (default when usable) vs spec-lite (fallback)
|
|
350
|
+
|
|
351
|
+
The SessionStart hook resolves one **spec mode** per session and prints a `## Spec Mode` section stating it. Resolution: an explicit `CHORUS_SPEC_MODE` (`lite`/`openspec`/`off`) wins; when unset, **OpenSpec is the default whenever it is usable** — the `enableOpenSpec` toggle on (default) and `CHORUS_OPENSPEC_MODE` ≠ `off`, an `openspec/` directory at the project root, and the `openspec` CLI on `PATH`. When OpenSpec is absent or disabled, the mode falls back to **spec-lite** — a Chorus-native, git-tracked model: a durable local spec `.chorus/specs/<slug>/spec.md` per capability (edited in place, **never synced** to Chorus), plus one dated folder per change effort `.chorus/specs/<slug>/<YYYY-MM-DD>-<change-slug>/` of plain-markdown docs named by Document type (`prd.md`, `tech_design.md`, …), each of those dated-folder docs mirrored 1:1 into a persistent Chorus Document (see the `spec-lite` skill). `CHORUS_SPEC_MODE=off` selects free-form (no spec artifact).
|
|
352
|
+
|
|
353
|
+
OpenSpec spec-driven path: `/proposal`, `/develop`, `/yolo` write `proposal.md` / `design.md` / spec deltas on disk and mirror them into Chorus drafts.
|
|
350
354
|
|
|
351
355
|
**When the user wants it on** (e.g. they ran `/chorus enable openspec` after the `(OpenSpec off — …)` banner), actually **enable it for them** — run whichever steps are missing, don't just describe them:
|
|
352
356
|
|
|
@@ -355,9 +359,9 @@ npm i -g @fission-ai/openspec # 1. install the CLI if it's not on PATH (gl
|
|
|
355
359
|
openspec init --tools claude # 2. scaffold openspec/ + wire up Claude Code's native commands/skills
|
|
356
360
|
```
|
|
357
361
|
|
|
358
|
-
`openspec init` is interactive if you omit `--tools`; pass `--tools claude` to run it unattended. Chorus's detection only needs the `openspec/` directory, but wiring up Claude Code also gives OpenSpec its own commands + skills. The
|
|
362
|
+
`openspec init` is interactive if you omit `--tools`; pass `--tools claude` to run it unattended. Chorus's detection only needs the `openspec/` directory, but wiring up Claude Code also gives OpenSpec its own commands + skills. The spec mode is resolved **once at SessionStart**, so it can't flip mid-session — after the steps succeed, tell the user to **re-launch the session**; the `## Spec Mode` section then reads `CHORUS_SPEC_MODE=openspec (…)` and the stage skills fold in the `openspec-aware` skill automatically.
|
|
359
363
|
|
|
360
|
-
To turn
|
|
364
|
+
To turn OpenSpec off, flip `enableOpenSpec` to `false` or set `CHORUS_OPENSPEC_MODE=off` — the mode then falls back to **spec-lite** (or set `CHORUS_SPEC_MODE=off` for free-form). The `## Spec Mode` section always states the resolved mode + reason.
|
|
361
365
|
|
|
362
366
|
### 7. Daemon auto-start via `chorus agents add`
|
|
363
367
|
|
|
@@ -438,7 +442,8 @@ This is the core overview skill. For stage-specific workflows, use:
|
|
|
438
442
|
| **Development** | `/develop` | Claim Tasks, report work, session & sub-agent management, Agent Teams integration |
|
|
439
443
|
| **Review** | `/review` | Approve/reject Proposals, verify Tasks, project governance |
|
|
440
444
|
| **Docs** | `/docs` | Consult the live Chorus documentation site to answer product-usage questions — UI workflow, agent/plugin setup, API/MCP, deployment, operations |
|
|
441
|
-
| **OpenSpec mode** | `openspec-aware` |
|
|
445
|
+
| **OpenSpec mode** | `openspec-aware` | **Shared sub-procedure** invoked by `/proposal`, `/develop`, and `/yolo` when the resolved spec mode is a usable OpenSpec (the default when `openspec/` + CLI present and not disabled). Scaffolds `openspec/changes/<slug>/` on disk and mirrors files into Chorus document drafts via the `chorus-api.sh` wrapper. No-op when the mode isn't a usable OpenSpec. See `.claude/skills/openspec-aware/SKILL.md`. |
|
|
446
|
+
| **spec-lite mode** | `spec-lite` | **Shared sub-procedure** and the fallback when OpenSpec isn't usable (or `CHORUS_SPEC_MODE=lite`). Durable local `.chorus/specs/<slug>/spec.md` (never synced) + dated per-change folders of Chorus-typed docs mirrored 1:1 into Chorus via `--arg-file`. No CLI/validation/archive. See `.claude/skills/spec-lite/SKILL.md`. |
|
|
442
447
|
|
|
443
448
|
### Getting Started
|
|
444
449
|
|
|
@@ -4,7 +4,7 @@ description: Chorus Development workflow — claim tasks, report work, manage se
|
|
|
4
4
|
license: AGPL-3.0
|
|
5
5
|
metadata:
|
|
6
6
|
author: chorus
|
|
7
|
-
version: "0.
|
|
7
|
+
version: "0.18.0"
|
|
8
8
|
category: project-management
|
|
9
9
|
mcp_server: chorus
|
|
10
10
|
---
|
|
@@ -142,6 +142,10 @@ Each task and proposal includes a `commentCount` field — use it to decide whic
|
|
|
142
142
|
>
|
|
143
143
|
> In the no-OpenSpec fallback (no slug line, or no `openspec` CLI), edit the Document content directly via the existing MCP tool with no wrapper, no local file step.
|
|
144
144
|
|
|
145
|
+
> **Document update flow (spec-lite mode):** if the originating proposal `description` contains a locator line `Spec-lite: .chorus/specs/<slug>/<YYYY-MM-DD>-<change-slug>/`, the project's `prd` / `tech_design` / … Documents are **persistent mirrors** of the Chorus-typed docs in that **dated change folder** (`prd.md`, `tech_design.md`, …, named by Chorus Document type). Load the `spec-lite` skill (`skills/spec-lite/SKILL.md`). Locate the dated folder **deterministically** from that locator line (not by title/type, which isn't unique). Edit those `<type>.md` files in place (they are the source of truth for the change) and update the capability's durable `.chorus/specs/<slug>/spec.md` in place too — but **`spec.md` is never mirrored** (local only, no ids). Tick `- [ ]` acceptance points as work completes, then re-mirror each edited dated-folder file via `chorus mcp call chorus_pm_update_document … --arg-file content=.chorus/specs/<slug>/<YYYY-MM-DD>-<change-slug>/<type>.md` against its `documentUuid` (each update auto-increments the Document version = its modification history). No new tool/CLI — same `--arg-file` transport as OpenSpec. **Git history is the audit trail** (`git log -- .chorus/specs/<slug>/` for the whole capability — the durable `spec.md`'s diffs + each dated folder's change docs; `git log --follow -- <file>` to trace a single renamed file) — there is no changelog section to maintain.
|
|
146
|
+
>
|
|
147
|
+
> **Single-writer:** the folder is shared — in a multi-task wave, only the **orchestrator / main agent** edits + re-mirrors it; parallel workers report via `chorus_report_work` only. A non-orchestrator that must update it re-reads immediately before writing to detect conflicts.
|
|
148
|
+
|
|
145
149
|
### Step 5: Start Working
|
|
146
150
|
|
|
147
151
|
**Sub-agent**: checkin to the task first:
|
|
@@ -223,21 +227,21 @@ chorus_submit_for_verify({
|
|
|
223
227
|
|
|
224
228
|
> `to_verify` does NOT unblock downstream tasks — only `done` (after admin verification) does.
|
|
225
229
|
|
|
226
|
-
> **Review Agent:** After `chorus_submit_for_verify`, the Chorus plugin's PostToolUse hook injects context instructing you to spawn `chorus:task-reviewer` — an independent, read-only review agent. You MUST spawn it yourself (it is NOT auto-launched).
|
|
230
|
+
> **Review Agent:** After `chorus_submit_for_verify`, the Chorus plugin's PostToolUse hook injects context instructing you to spawn `chorus:task-reviewer` — an independent, read-only review agent. You MUST spawn it yourself (it is NOT auto-launched). Wait for it to complete — in Claude Code, that means waiting for the sub-agent's completion notification; the launch result itself is never the verdict. The reviewer posts a VERDICT comment on the task.
|
|
227
231
|
|
|
228
|
-
After the reviewer completes, read
|
|
232
|
+
After the reviewer completes, read **this round's** VERDICT:
|
|
229
233
|
```
|
|
230
234
|
chorus_get_comments({ targetType: "task", targetUuid: "<task-uuid>" })
|
|
231
235
|
```
|
|
232
|
-
Find the
|
|
236
|
+
Find the `VERDICT:` comment posted **after you dispatched the reviewer** — not an older round's — and act on it. Do not advance the pipeline (verify or reopen) before you have read that comment:
|
|
233
237
|
|
|
234
238
|
- **VERDICT: PASS** — All AC verified, no issues. Proceed to admin verification.
|
|
235
239
|
- **VERDICT: PASS WITH NOTES** — All AC verified, minor notes. Proceed to admin verification (notes are non-blocking).
|
|
236
240
|
- **VERDICT: FAIL** — BLOCKERs found. Do NOT verify. Fix the BLOCKERs listed in the reviewer's comment, then resubmit.
|
|
237
241
|
|
|
238
|
-
If no new `VERDICT:` comment appears after the reviewer returns, it
|
|
242
|
+
If no new `VERDICT:` comment appears after the reviewer returns, check what it *did* post. A comment reporting that the round limit was reached, or any other explicit refusal to review, is a deliberate escalation to a human: STOP — do not respawn, do not self-review, do not post a VERDICT of your own. If it posted nothing at all, respawn it ONCE, telling it to stay within its turn budget and reserve its last turns for the VERDICT, then apply this same check again to what the retry posts. An explicit refusal from the retry still means STOP; only a second true silence lets you review the task yourself as a read-only pass using the checklist and POST the VERDICT comment. **Absence is never a PASS.**
|
|
239
243
|
|
|
240
|
-
> **Final code-review gateway (after the Idea's LAST task is verified):** when the task you just verified is the **last** task of its idea-rooted proposal, the feature is about to ship — the PostToolUse hook injects a reminder to spawn `chorus:code-reviewer` (gated by `enableCodeReviewer`, default on). Spawn it yourself
|
|
244
|
+
> **Final code-review gateway (after the Idea's LAST task is verified):** when the task you just verified is the **last** task of its idea-rooted proposal, the feature is about to ship — the PostToolUse hook injects a reminder to spawn `chorus:code-reviewer` (gated by `enableCodeReviewer`, default on). Spawn it yourself and wait for its completion notification, passing the `ideaUuid` + round number; then read THIS round's `VERDICT` comment on the idea before deciding. It reviews the Idea's **aggregate** code change across all its tasks (cross-task integration, architecture, security, regression, feature-level coverage) and posts one `VERDICT` comment on the **idea**. `PASS` / `PASS WITH NOTES` → ship; `FAIL` → fix via `/chorus:quick-dev` (`chorus_create_tasks` with `proposalUuid` set to the current approved proposal so the fix tasks attach to it — do NOT reopen the verified tasks). Group related small BLOCKERs by default; split only materially large or independently testable fixes. Require AC self-check, independent task review, and admin verification for every fix task. Re-run aggregate review only after every fix is successfully `done`; a failed or cancelled fix stops the loop and escalates, bounded by `maxCodeReviewRounds`. Advisory/behavioral, like the other reviewers. Run it **before** any idea-completion report.
|
|
241
245
|
|
|
242
246
|
### Step 9: Handle Review Feedback
|
|
243
247
|
|
|
@@ -293,9 +297,8 @@ When using Claude Code's Agent Teams to run multiple sub-agents in parallel, Cho
|
|
|
293
297
|
chorus_checkin()
|
|
294
298
|
chorus_list_tasks({ projectUuid: "<project-uuid>" })
|
|
295
299
|
|
|
296
|
-
# 2.
|
|
297
|
-
|
|
298
|
-
|
|
300
|
+
# 2. Dispatch one sub-agent per unblocked task, issuing the whole wave in a
|
|
301
|
+
# SINGLE message so they run in parallel. There is no team object to create.
|
|
299
302
|
# Pass only task UUIDs — plugin auto-injects session workflow
|
|
300
303
|
Task({
|
|
301
304
|
name: "frontend-worker",
|
|
@@ -307,6 +310,8 @@ Task({
|
|
|
307
310
|
- Task UUID(s)
|
|
308
311
|
- NO session UUID, NO workflow boilerplate — plugin auto-injects everything
|
|
309
312
|
|
|
313
|
+
> **Fallback:** if sub-agent dispatch is unavailable (no sub-agent primitive, permission denied) or sub-agents fail repeatedly, execute the wave's tasks sequentially as the main agent following Steps 1-9 above. Slower, same pipeline.
|
|
314
|
+
|
|
310
315
|
### Sub-Agent Workflow
|
|
311
316
|
|
|
312
317
|
The plugin injects session UUID and workflow into the sub-agent's context automatically.
|