@chorus-aidlc/chorus 0.17.3 → 0.18.1
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 +345 -341
- package/.next/standalone/.next/app-path-routes-manifest.json +35 -35
- 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_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.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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/settings/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/settings/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +2 -2
- package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
- package/.next/standalone/.next/server/app/admin/companies/[uuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin/companies/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin/companies/new.html +2 -2
- package/.next/standalone/.next/server/app/admin/companies/new.rsc +2 -2
- package/.next/standalone/.next/server/app/admin/companies/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin/companies.html +2 -2
- package/.next/standalone/.next/server/app/admin/companies.rsc +2 -2
- package/.next/standalone/.next/server/app/admin/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin.html +2 -2
- package/.next/standalone/.next/server/app/admin.rsc +2 -2
- package/.next/standalone/.next/server/app/api/admin/companies/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/companies/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/login/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/session/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agent-connections/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent-connections/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/api-keys/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/api-keys/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/callback/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/check-default/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/company-oidc/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/default-login/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/identify/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/me/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/sync-token/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/comments/route.js +1 -1
- package/.next/standalone/.next/server/app/api/comments/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/comments/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/connection-heartbeat/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon/connection-heartbeat/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/control/route.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/control/route.js.nft.json +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 +35 -35
- package/.next/standalone/.next/server/chunks/1318.js +1 -1
- package/.next/standalone/.next/server/chunks/{5201.js → 1416.js} +2 -2
- package/.next/standalone/.next/server/chunks/1559.js +2 -2
- package/.next/standalone/.next/server/chunks/{3630.js → 2195.js} +1 -1
- package/.next/standalone/.next/server/chunks/2460.js +1 -0
- package/.next/standalone/.next/server/chunks/2572.js +2 -2
- package/.next/standalone/.next/server/chunks/2758.js +1 -0
- package/.next/standalone/.next/server/chunks/2961.js +1 -1
- package/.next/standalone/.next/server/chunks/3419.js +1 -1
- package/.next/standalone/.next/server/chunks/4066.js +1 -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/5453.js +1 -1
- package/.next/standalone/.next/server/chunks/5489.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/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/7578.js +2 -2
- package/.next/standalone/.next/server/chunks/7675.js +1 -0
- package/.next/standalone/.next/server/chunks/7789.js +1 -0
- package/.next/standalone/.next/server/chunks/{1201.js → 8030.js} +2 -2
- 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/instrumentation.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.f080a1d100972212.js +1 -0
- package/.next/standalone/.next/static/chunks/14628-283d3983d1fb36c9.js +1 -0
- package/.next/standalone/.next/static/chunks/{29305-f587e7e81bc0b200.js → 17562-56f932146e9e6c94.js} +4 -4
- package/.next/standalone/.next/static/chunks/25080-25ad29e64c855338.js +1 -0
- package/.next/standalone/.next/static/chunks/28698-7fb271ffc6e63a26.js +1 -0
- package/.next/standalone/.next/static/chunks/{95225-96b44da3ebd6ddad.js → 32736-aeaaa1e4c4d5529b.js} +1 -1
- package/.next/standalone/.next/static/chunks/33456.20313bd67a5c41cc.js +1 -0
- package/.next/standalone/.next/static/chunks/4860.3b555a398cdffb19.js +1 -0
- package/.next/standalone/.next/static/chunks/75257-99c0ce24b436847b.js +1 -0
- package/.next/standalone/.next/static/chunks/79919-0c6dcda1dd8646f0.js +1 -0
- package/.next/standalone/.next/static/chunks/91328-f501e3c3ca519a92.js +1 -0
- package/.next/standalone/.next/static/chunks/94643-e54eff17e941a93b.js +1 -0
- package/.next/standalone/.next/static/chunks/99373.b8a95d1bec5ad4e7.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-f3c6431432d42c7c.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/{page-77b175e52a85f3cb.js → page-5d723f974bdad33b.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-8d3b1f4d8b76d66c.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-57c698dea2fa6e29.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/graph/{page-69d3162667f85677.js → page-d2bb622855e746f1.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-fc255dc3612032b9.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/{page-a3f83031dfbafc81.js → page-f032ee8a80d1f56a.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-46a0ddfd0421b0a8.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/{page-3c7ff3a40a4615ac.js → page-3a83748ce0ae1c4f.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/{page-7b8e11fdc5b596d0.js → page-8af9bb9f96ab0258.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-b02939820affdae5.js +1 -0
- package/.next/standalone/.next/static/chunks/app/onboarding/page-d2c0c7951114e763.js +1 -0
- package/.next/standalone/.next/static/chunks/{webpack-dffb97a4feb8faba.js → webpack-de8a36d232a91d6b.js} +1 -1
- package/.next/standalone/.next/static/css/44f13b43a3de716d.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-pre-spawn-agent.sh +22 -9
- package/.next/standalone/public/chorus-plugin/bin/on-session-start.sh +39 -64
- package/.next/standalone/public/chorus-plugin/bin/on-subagent-start.sh +44 -29
- package/.next/standalone/public/chorus-plugin/bin/on-subagent-stop.sh +100 -29
- package/.next/standalone/public/chorus-plugin/bin/resolve-spec-mode.sh +107 -0
- package/.next/standalone/public/chorus-plugin/bin/test-syntax.sh +6 -2
- 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/bin/tests/test-subagent-session-name.sh +599 -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/chorus.mjs +30 -2
- package/cli/agent-cli-config.mjs +323 -0
- package/cli/agent-launcher.mjs +44 -16
- package/cli/child-exit.mjs +77 -0
- package/cli/claude-spawner.mjs +26 -14
- package/cli/codex-spawner.mjs +27 -16
- package/cli/control-handler.mjs +104 -6
- package/cli/credentials.mjs +7 -0
- package/cli/daemon-config.mjs +14 -0
- package/cli/daemon-rest-client.mjs +98 -29
- package/cli/daemon.mjs +37 -7
- package/cli/dsh-managed-config.mjs +26 -28
- package/cli/dsh-spawner.mjs +27 -16
- package/cli/init/steps/credential-seed.mjs +1 -1
- package/cli/kiro-spawner.mjs +26 -16
- package/cli/launch-diagnostics.mjs +67 -0
- package/cli/login.mjs +17 -1
- package/cli/pi-spawner.mjs +23 -13
- 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/46021-f5d072b0cbcb7fac.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/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/chunks/app/onboarding/page-0ce33b9327fe3d8c.js +0 -1
- package/.next/standalone/.next/static/css/1d9cf83f50b6db00.css +0 -1
- /package/.next/standalone/.next/static/{wuqYN129vOIGymh_NEdZe → dot63ILT878Tloqi7Czj_}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{wuqYN129vOIGymh_NEdZe → dot63ILT878Tloqi7Czj_}/_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 ]
|