@chorus-aidlc/chorus 0.9.2 → 0.9.3
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 +187 -187
- package/.next/standalone/.next/app-path-routes-manifest.json +38 -38
- package/.next/standalone/.next/build-manifest.json +2 -2
- package/.next/standalone/.next/prerender-manifest.json +42 -42
- 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_client-reference-manifest.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 +1 -1
- 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_client-reference-manifest.js +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]/ideas/[ideaUuid]/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/[ideaUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/[ideaUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page.js +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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +1 -1
- package/.next/standalone/.next/server/app/admin/companies/[uuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin/companies/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin/companies/new.html +1 -1
- package/.next/standalone/.next/server/app/admin/companies/new.rsc +1 -1
- package/.next/standalone/.next/server/app/admin/companies/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin/companies.html +1 -1
- package/.next/standalone/.next/server/app/admin/companies.rsc +1 -1
- package/.next/standalone/.next/server/app/admin/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin.html +1 -1
- package/.next/standalone/.next/server/app/admin.rsc +1 -1
- package/.next/standalone/.next/server/app/api/admin/companies/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/companies/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/login/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/session/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/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/refresh/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/session/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/sync-token/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/comments/route_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/events/notifications/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/events/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route.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]/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/mcp/route.js +3 -3
- 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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/preferences/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/read-all/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/unread-count/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/[uuid]/dashboard/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/activity/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/documents/route_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.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route_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/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/sessions/[uuid]/route.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 +1 -1
- package/.next/standalone/.next/server/app/index.rsc +1 -1
- package/.next/standalone/.next/server/app/login/admin/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/admin.html +1 -1
- package/.next/standalone/.next/server/app/login/admin.rsc +1 -1
- package/.next/standalone/.next/server/app/login/callback/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/callback.html +1 -1
- package/.next/standalone/.next/server/app/login/callback.rsc +1 -1
- package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/pick-workspace/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/pick-workspace.html +1 -1
- package/.next/standalone/.next/server/app/login/pick-workspace.rsc +1 -1
- package/.next/standalone/.next/server/app/login/silent-refresh/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/silent-refresh.html +1 -1
- package/.next/standalone/.next/server/app/login/silent-refresh.rsc +1 -1
- package/.next/standalone/.next/server/app/login.html +1 -1
- package/.next/standalone/.next/server/app/login.rsc +1 -1
- package/.next/standalone/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/onboarding.html +1 -1
- package/.next/standalone/.next/server/app/onboarding.rsc +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects.html +1 -1
- package/.next/standalone/.next/server/app/projects.rsc +1 -1
- package/.next/standalone/.next/server/app/settings.html +1 -1
- package/.next/standalone/.next/server/app/settings.rsc +1 -1
- package/.next/standalone/.next/server/app-paths-manifest.json +38 -38
- package/.next/standalone/.next/server/chunks/1165.js +1 -1
- package/.next/standalone/.next/server/chunks/7228.js +2 -2
- package/.next/standalone/.next/server/chunks/7578.js +2 -2
- package/.next/standalone/.next/server/chunks/896.js +1 -0
- package/.next/standalone/.next/server/chunks/9508.js +2 -2
- package/.next/standalone/.next/server/middleware-manifest.json +1 -1
- package/.next/standalone/.next/server/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/package.json +1 -1
- package/.next/standalone/public/chorus-plugin/.claude-plugin/plugin.json +1 -1
- package/.next/standalone/public/chorus-plugin/skills/brainstorm/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/chorus/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/develop/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 +1 -1
- package/.next/standalone/public/chorus-plugin/skills/proposal/SKILL.md +13 -4
- package/.next/standalone/public/chorus-plugin/skills/quick-dev/SKILL.md +9 -4
- package/.next/standalone/public/chorus-plugin/skills/review/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/yolo/SKILL.md +2 -2
- package/.next/standalone/public/install-codex.sh +200 -90
- package/.next/standalone/public/skill/brainstorm-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/chorus/SKILL.md +55 -3
- package/.next/standalone/public/skill/develop-chorus/SKILL.md +2 -2
- package/.next/standalone/public/skill/idea-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/package.json +21 -5
- package/.next/standalone/public/skill/proposal-chorus/SKILL.md +13 -4
- package/.next/standalone/public/skill/proposal-reviewer-chorus/SKILL.md +198 -0
- package/.next/standalone/public/skill/quick-dev-chorus/SKILL.md +9 -4
- package/.next/standalone/public/skill/review-chorus/SKILL.md +13 -3
- package/.next/standalone/public/skill/task-reviewer-chorus/SKILL.md +219 -0
- package/.next/standalone/public/skill/yolo-chorus/SKILL.md +529 -0
- package/.next/standalone/public/test-install-codex.sh +4 -0
- package/package.json +1 -1
- package/.next/standalone/.next/server/chunks/1002.js +0 -1
- /package/.next/standalone/.next/static/{-kClYg0a7zvFcgkw_LnG7 → uuDSoqvm-WWenZQ6dXPT7}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{-kClYg0a7zvFcgkw_LnG7 → uuDSoqvm-WWenZQ6dXPT7}/_ssgManifest.js +0 -0
|
@@ -14,8 +14,8 @@
|
|
|
14
14
|
# [plugins."chorus@chorus-plugins"] enabled = true into ~/.codex/config.toml,
|
|
15
15
|
# so Codex auto-enables the plugin on first launch (falls back to one-click
|
|
16
16
|
# `/plugins → Install` if auto-install does not fire).
|
|
17
|
-
# 4.
|
|
18
|
-
#
|
|
17
|
+
# 4. Enables Codex lifecycle hooks. Chorus hook scripts are bundled in the
|
|
18
|
+
# plugin manifest and loaded by Codex after the plugin is installed/enabled.
|
|
19
19
|
|
|
20
20
|
set -euo pipefail
|
|
21
21
|
|
|
@@ -35,6 +35,158 @@ CONFIG_TOML="$CODEX_HOME/config.toml"
|
|
|
35
35
|
|
|
36
36
|
is_tty() { [ -t 0 ] && [ -t 1 ]; }
|
|
37
37
|
|
|
38
|
+
clean_legacy_chorus_hooks_json() {
|
|
39
|
+
local hooks_json="$1"
|
|
40
|
+
local tmp backup removed
|
|
41
|
+
|
|
42
|
+
tmp="$(mktemp "${TMPDIR:-/tmp}/chorus-hooks.XXXXXX")"
|
|
43
|
+
backup="${hooks_json}.chorus-legacy-bak"
|
|
44
|
+
cp "$hooks_json" "$backup"
|
|
45
|
+
|
|
46
|
+
if command -v node >/dev/null 2>&1; then
|
|
47
|
+
removed="$(node - "$hooks_json" "$tmp" <<'NODE'
|
|
48
|
+
const fs = require("fs");
|
|
49
|
+
const input = process.argv[2];
|
|
50
|
+
const output = process.argv[3];
|
|
51
|
+
let removed = 0;
|
|
52
|
+
|
|
53
|
+
function isLegacyCommand(value) {
|
|
54
|
+
return typeof value === "string" && value.indexOf("hooks/chorus/run-hook.sh") !== -1;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function clean(value, parentKey) {
|
|
58
|
+
if (Array.isArray(value)) {
|
|
59
|
+
return value
|
|
60
|
+
.map((item) => clean(item, parentKey))
|
|
61
|
+
.filter((item) => item !== undefined);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (value && typeof value === "object") {
|
|
65
|
+
if (isLegacyCommand(value.command)) {
|
|
66
|
+
removed += 1;
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const hadHooksArray = Array.isArray(value.hooks);
|
|
71
|
+
const out = {};
|
|
72
|
+
for (const [key, child] of Object.entries(value)) {
|
|
73
|
+
const cleaned = clean(child, key);
|
|
74
|
+
if (cleaned === undefined) continue;
|
|
75
|
+
if (Array.isArray(cleaned) && cleaned.length === 0 && (key === "hooks" || parentKey === "hooks")) continue;
|
|
76
|
+
out[key] = cleaned;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (hadHooksArray && (!Array.isArray(out.hooks) || out.hooks.length === 0)) {
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
return out;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return value;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
let data = JSON.parse(fs.readFileSync(input, "utf8"));
|
|
89
|
+
data = clean(data, "") || {};
|
|
90
|
+
if (data.hooks && typeof data.hooks === "object" && !Array.isArray(data.hooks)) {
|
|
91
|
+
for (const key of Object.keys(data.hooks)) {
|
|
92
|
+
if (Array.isArray(data.hooks[key]) && data.hooks[key].length === 0) {
|
|
93
|
+
delete data.hooks[key];
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
if (Object.keys(data.hooks).length === 0) {
|
|
97
|
+
delete data.hooks;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
fs.writeFileSync(output, JSON.stringify(data, null, 2) + "\n");
|
|
101
|
+
process.stdout.write(String(removed));
|
|
102
|
+
NODE
|
|
103
|
+
)" || {
|
|
104
|
+
rm -f "$tmp"
|
|
105
|
+
warn "Could not parse $hooks_json with node; leaving legacy hooks unchanged."
|
|
106
|
+
warn "Backup created at $backup"
|
|
107
|
+
return 1
|
|
108
|
+
}
|
|
109
|
+
elif command -v python3 >/dev/null 2>&1; then
|
|
110
|
+
removed="$(python3 - "$hooks_json" "$tmp" <<'PY'
|
|
111
|
+
import json
|
|
112
|
+
import sys
|
|
113
|
+
|
|
114
|
+
input_path = sys.argv[1]
|
|
115
|
+
output_path = sys.argv[2]
|
|
116
|
+
removed = 0
|
|
117
|
+
|
|
118
|
+
def is_legacy_command(value):
|
|
119
|
+
return isinstance(value, str) and "hooks/chorus/run-hook.sh" in value
|
|
120
|
+
|
|
121
|
+
def clean(value, parent_key=""):
|
|
122
|
+
global removed
|
|
123
|
+
if isinstance(value, list):
|
|
124
|
+
return [item for item in (clean(child, parent_key) for child in value) if item is not None]
|
|
125
|
+
if isinstance(value, dict):
|
|
126
|
+
if is_legacy_command(value.get("command")):
|
|
127
|
+
removed += 1
|
|
128
|
+
return None
|
|
129
|
+
had_hooks_array = isinstance(value.get("hooks"), list)
|
|
130
|
+
out = {}
|
|
131
|
+
for key, child in value.items():
|
|
132
|
+
cleaned = clean(child, key)
|
|
133
|
+
if cleaned is None:
|
|
134
|
+
continue
|
|
135
|
+
if isinstance(cleaned, list) and not cleaned and (key == "hooks" or parent_key == "hooks"):
|
|
136
|
+
continue
|
|
137
|
+
out[key] = cleaned
|
|
138
|
+
if had_hooks_array and (not isinstance(out.get("hooks"), list) or not out["hooks"]):
|
|
139
|
+
return None
|
|
140
|
+
return out
|
|
141
|
+
return value
|
|
142
|
+
|
|
143
|
+
with open(input_path, "r", encoding="utf-8") as f:
|
|
144
|
+
data = json.load(f)
|
|
145
|
+
|
|
146
|
+
data = clean(data) or {}
|
|
147
|
+
if isinstance(data.get("hooks"), dict):
|
|
148
|
+
for key in list(data["hooks"].keys()):
|
|
149
|
+
if isinstance(data["hooks"][key], list) and not data["hooks"][key]:
|
|
150
|
+
del data["hooks"][key]
|
|
151
|
+
if not data["hooks"]:
|
|
152
|
+
del data["hooks"]
|
|
153
|
+
|
|
154
|
+
with open(output_path, "w", encoding="utf-8") as f:
|
|
155
|
+
json.dump(data, f, indent=2)
|
|
156
|
+
f.write("\n")
|
|
157
|
+
|
|
158
|
+
print(removed, end="")
|
|
159
|
+
PY
|
|
160
|
+
)" || {
|
|
161
|
+
rm -f "$tmp"
|
|
162
|
+
warn "Could not parse $hooks_json with python3; leaving legacy hooks unchanged."
|
|
163
|
+
warn "Backup created at $backup"
|
|
164
|
+
return 1
|
|
165
|
+
}
|
|
166
|
+
else
|
|
167
|
+
rm -f "$tmp"
|
|
168
|
+
warn "Cannot auto-clean $hooks_json because neither node nor python3 is available."
|
|
169
|
+
warn "Backup created at $backup"
|
|
170
|
+
return 1
|
|
171
|
+
fi
|
|
172
|
+
|
|
173
|
+
if [ "${removed:-0}" = "0" ]; then
|
|
174
|
+
rm -f "$tmp"
|
|
175
|
+
warn "No legacy Chorus hook entries were removed from $hooks_json."
|
|
176
|
+
warn "Backup created at $backup"
|
|
177
|
+
return 1
|
|
178
|
+
fi
|
|
179
|
+
|
|
180
|
+
if grep -q '[^[:space:]{}]' "$tmp" 2>/dev/null; then
|
|
181
|
+
mv "$tmp" "$hooks_json"
|
|
182
|
+
ok "Removed $removed legacy Chorus hook entr$( [ "$removed" = "1" ] && printf 'y' || printf 'ies' ) from $hooks_json"
|
|
183
|
+
else
|
|
184
|
+
rm -f "$tmp" "$hooks_json"
|
|
185
|
+
ok "Removed $removed legacy Chorus hook entr$( [ "$removed" = "1" ] && printf 'y' || printf 'ies' ) and deleted now-empty $hooks_json"
|
|
186
|
+
fi
|
|
187
|
+
ok "Backup saved at $backup"
|
|
188
|
+
}
|
|
189
|
+
|
|
38
190
|
# If piped through `curl | bash`, stdin is the script body. Re-open from /dev/tty
|
|
39
191
|
# so interactive prompts still work — but only if a real TTY is available AND we
|
|
40
192
|
# actually need to prompt for input. Both CHORUS_URL and CHORUS_API_KEY being set
|
|
@@ -181,104 +333,61 @@ TOML
|
|
|
181
333
|
|
|
182
334
|
ok "Wrote [mcp_servers.chorus] and [plugins.\"chorus@chorus-plugins\"] → ${CONFIG_TOML}"
|
|
183
335
|
|
|
184
|
-
# ---------- step 5:
|
|
185
|
-
hdr "5/5
|
|
336
|
+
# ---------- step 5: enable hooks ----------
|
|
337
|
+
hdr "5/5 Enabling Codex lifecycle hooks"
|
|
186
338
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
CODEX_HOME_RESOLVED="${CODEX_HOME:-$HOME/.codex}"
|
|
206
|
-
PLUGIN_ROOT="$CODEX_HOME_RESOLVED/plugins/cache/chorus-plugins/chorus"
|
|
207
|
-
if [ ! -d "$PLUGIN_ROOT" ]; then
|
|
208
|
-
echo '{}' ; exit 0
|
|
209
|
-
fi
|
|
210
|
-
VER="$(ls -1 "$PLUGIN_ROOT" 2>/dev/null | sort -V | tail -1)"
|
|
211
|
-
if [ -z "$VER" ]; then
|
|
212
|
-
echo '{}' ; exit 0
|
|
213
|
-
fi
|
|
214
|
-
SCRIPT="$PLUGIN_ROOT/$VER/hooks/$HOOK_NAME"
|
|
215
|
-
if [ ! -x "$SCRIPT" ]; then
|
|
216
|
-
if [ -f "$SCRIPT" ]; then
|
|
217
|
-
chmod +x "$SCRIPT" 2>/dev/null || true
|
|
339
|
+
HOOKS_JSON="$CODEX_HOME/hooks.json"
|
|
340
|
+
if [ -f "$HOOKS_JSON" ] && grep -q "hooks/chorus/run-hook.sh" "$HOOKS_JSON" 2>/dev/null; then
|
|
341
|
+
warn "Found legacy copied Chorus hook entries in $HOOKS_JSON."
|
|
342
|
+
warn "These can duplicate the plugin-bundled Chorus hooks now loaded by Codex."
|
|
343
|
+
warn "Legacy entries:"
|
|
344
|
+
grep -n "hooks/chorus/run-hook.sh" "$HOOKS_JSON" 2>/dev/null | sed 's/^/ /' >&2 || true
|
|
345
|
+
|
|
346
|
+
if [ -r /dev/tty ] && [ -w /dev/tty ]; then
|
|
347
|
+
printf " Clean legacy Chorus entries from %s now? [y/N]: " "$HOOKS_JSON" > /dev/tty
|
|
348
|
+
read -r clean_legacy_hooks_answer < /dev/tty
|
|
349
|
+
case "$clean_legacy_hooks_answer" in
|
|
350
|
+
y|Y|yes|YES|Yes)
|
|
351
|
+
clean_legacy_chorus_hooks_json "$HOOKS_JSON" || true
|
|
352
|
+
;;
|
|
353
|
+
*)
|
|
354
|
+
warn "Keeping legacy hooks unchanged. Use /hooks to disable them or remove matching entries manually to avoid duplicates."
|
|
355
|
+
;;
|
|
356
|
+
esac
|
|
218
357
|
else
|
|
219
|
-
|
|
358
|
+
warn "No interactive TTY available; keeping legacy hooks unchanged."
|
|
359
|
+
warn "Re-run this installer in a terminal to auto-clean them, or remove matching entries manually."
|
|
220
360
|
fi
|
|
221
361
|
fi
|
|
222
|
-
exec "$SCRIPT" "$@"
|
|
223
|
-
WRAP
|
|
224
|
-
chmod +x "$WRAPPER"
|
|
225
|
-
ok "Installed hook wrapper → $WRAPPER"
|
|
226
362
|
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
warn " Add Chorus hook entries manually (command = $WRAPPER on-session-start.sh | on-post-submit-proposal.sh | on-post-submit-for-verify.sh)."
|
|
231
|
-
else
|
|
232
|
-
cat > "$HOOKS_JSON" <<HJSON
|
|
233
|
-
{
|
|
234
|
-
"hooks": {
|
|
235
|
-
"SessionStart": [
|
|
236
|
-
{
|
|
237
|
-
"matcher": "startup|resume|clear",
|
|
238
|
-
"hooks": [
|
|
239
|
-
{ "type": "command", "command": "$WRAPPER on-session-start.sh", "timeout": 20, "statusMessage": "Chorus: checkin" }
|
|
240
|
-
]
|
|
241
|
-
}
|
|
242
|
-
],
|
|
243
|
-
"PostToolUse": [
|
|
244
|
-
{
|
|
245
|
-
"matcher": ".*chorus_pm_submit_proposal",
|
|
246
|
-
"hooks": [
|
|
247
|
-
{ "type": "command", "command": "$WRAPPER on-post-submit-proposal.sh", "timeout": 10 }
|
|
248
|
-
]
|
|
249
|
-
},
|
|
250
|
-
{
|
|
251
|
-
"matcher": ".*chorus_submit_for_verify",
|
|
252
|
-
"hooks": [
|
|
253
|
-
{ "type": "command", "command": "$WRAPPER on-post-submit-for-verify.sh", "timeout": 10 }
|
|
254
|
-
]
|
|
255
|
-
}
|
|
256
|
-
]
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
HJSON
|
|
260
|
-
ok "Wrote $HOOKS_JSON (routing through $WRAPPER)"
|
|
261
|
-
fi
|
|
262
|
-
|
|
263
|
-
# Enable the codex_hooks feature flag in config.toml (idempotent).
|
|
363
|
+
# Keep the current canonical feature key. `codex_hooks` is a deprecated alias;
|
|
364
|
+
# remove any old hook feature setting from [features] before writing `hooks = true`
|
|
365
|
+
# so reruns do not create duplicate TOML keys.
|
|
264
366
|
if grep -qE "^\[features\]" "$CONFIG_TOML"; then
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
367
|
+
tmp="$(mktemp "${TMPDIR:-/tmp}/chorus-features.XXXXXX")"
|
|
368
|
+
awk '
|
|
369
|
+
/^\[features\][[:space:]]*$/ {
|
|
370
|
+
in_features = 1
|
|
371
|
+
print
|
|
372
|
+
print "hooks = true"
|
|
373
|
+
next
|
|
374
|
+
}
|
|
375
|
+
/^\[/ {
|
|
376
|
+
in_features = 0
|
|
377
|
+
}
|
|
378
|
+
in_features && /^[[:space:]]*(hooks|codex_hooks)[[:space:]]*=/ {
|
|
379
|
+
next
|
|
380
|
+
}
|
|
381
|
+
{ print }
|
|
382
|
+
' "$CONFIG_TOML" > "$tmp" && mv "$tmp" "$CONFIG_TOML"
|
|
383
|
+
ok "Set [features] hooks = true"
|
|
275
384
|
else
|
|
276
385
|
cat >> "$CONFIG_TOML" <<'TFEAT'
|
|
277
386
|
|
|
278
387
|
[features]
|
|
279
|
-
|
|
388
|
+
hooks = true
|
|
280
389
|
TFEAT
|
|
281
|
-
ok "Appended [features]
|
|
390
|
+
ok "Appended [features] hooks = true"
|
|
282
391
|
fi
|
|
283
392
|
|
|
284
393
|
# ---------- epilogue ----------
|
|
@@ -296,7 +405,8 @@ so one manual click is the fallback path).
|
|
|
296
405
|
|
|
297
406
|
Verify anytime:
|
|
298
407
|
${BOLD}codex mcp list${RESET} # 'chorus' row, Auth = 'Bearer token'
|
|
299
|
-
${BOLD}codex features list${RESET} #
|
|
408
|
+
${BOLD}codex features list${RESET} # hooks + plugins both true
|
|
409
|
+
${BOLD}/hooks${RESET} # review/trust bundled Chorus hooks after launch
|
|
300
410
|
|
|
301
411
|
Then in Codex type ${BOLD}\$chorus${RESET} (or \$develop, \$review, \$proposal, …) to
|
|
302
412
|
activate a skill. To change your API key later, just re-run this installer.
|
|
@@ -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.3
|
|
7
|
+
version: "0.9.3"
|
|
8
8
|
category: project-management
|
|
9
9
|
mcp_server: chorus
|
|
10
10
|
---
|
|
@@ -30,18 +30,28 @@ Skill files are hosted under the `<BASE_URL>/skill/` path.
|
|
|
30
30
|
| **proposal-chorus** | Proposal creation, drafts, DAG, submission | `/skill/proposal-chorus/SKILL.md` |
|
|
31
31
|
| **develop-chorus** | Task execution workflow | `/skill/develop-chorus/SKILL.md` |
|
|
32
32
|
| **review-chorus** | Proposal approval, task verification, governance | `/skill/review-chorus/SKILL.md` |
|
|
33
|
+
| **quick-dev-chorus** | Lightweight direct-to-task workflow (skips Idea→Proposal) | `/skill/quick-dev-chorus/SKILL.md` |
|
|
34
|
+
| **brainstorm-chorus** | Optional divergent→convergent dialogue, prelude to elaboration | `/skill/brainstorm-chorus/SKILL.md` |
|
|
35
|
+
| **proposal-reviewer-chorus** | Read-only adversarial proposal reviewer (posts VERDICT) | `/skill/proposal-reviewer-chorus/SKILL.md` |
|
|
36
|
+
| **task-reviewer-chorus** | Read-only adversarial task reviewer (posts VERDICT) | `/skill/task-reviewer-chorus/SKILL.md` |
|
|
37
|
+
| **yolo-chorus** | Full-auto AI-DLC pipeline — prompt to done | `/skill/yolo-chorus/SKILL.md` |
|
|
33
38
|
| **package.json** | Version & download metadata | `/skill/package.json` |
|
|
34
39
|
|
|
35
40
|
### Install (Claude Code, project-level)
|
|
36
41
|
|
|
37
42
|
```bash
|
|
38
43
|
BASE_URL="<BASE_URL>"
|
|
39
|
-
mkdir -p .claude/skills/chorus .claude/skills/idea-chorus .claude/skills/proposal-chorus .claude/skills/develop-chorus .claude/skills/review-chorus
|
|
44
|
+
mkdir -p .claude/skills/chorus .claude/skills/idea-chorus .claude/skills/proposal-chorus .claude/skills/develop-chorus .claude/skills/review-chorus .claude/skills/quick-dev-chorus .claude/skills/brainstorm-chorus .claude/skills/proposal-reviewer-chorus .claude/skills/task-reviewer-chorus .claude/skills/yolo-chorus
|
|
40
45
|
curl -s $BASE_URL/skill/chorus/SKILL.md > .claude/skills/chorus/SKILL.md
|
|
41
46
|
curl -s $BASE_URL/skill/idea-chorus/SKILL.md > .claude/skills/idea-chorus/SKILL.md
|
|
42
47
|
curl -s $BASE_URL/skill/proposal-chorus/SKILL.md > .claude/skills/proposal-chorus/SKILL.md
|
|
43
48
|
curl -s $BASE_URL/skill/develop-chorus/SKILL.md > .claude/skills/develop-chorus/SKILL.md
|
|
44
49
|
curl -s $BASE_URL/skill/review-chorus/SKILL.md > .claude/skills/review-chorus/SKILL.md
|
|
50
|
+
curl -s $BASE_URL/skill/quick-dev-chorus/SKILL.md > .claude/skills/quick-dev-chorus/SKILL.md
|
|
51
|
+
curl -s $BASE_URL/skill/brainstorm-chorus/SKILL.md > .claude/skills/brainstorm-chorus/SKILL.md
|
|
52
|
+
curl -s $BASE_URL/skill/proposal-reviewer-chorus/SKILL.md > .claude/skills/proposal-reviewer-chorus/SKILL.md
|
|
53
|
+
curl -s $BASE_URL/skill/task-reviewer-chorus/SKILL.md > .claude/skills/task-reviewer-chorus/SKILL.md
|
|
54
|
+
curl -s $BASE_URL/skill/yolo-chorus/SKILL.md > .claude/skills/yolo-chorus/SKILL.md
|
|
45
55
|
curl -s $BASE_URL/skill/package.json > .claude/skills/chorus/package.json
|
|
46
56
|
```
|
|
47
57
|
|
|
@@ -49,12 +59,17 @@ curl -s $BASE_URL/skill/package.json > .claude/skills/chorus/package.json
|
|
|
49
59
|
|
|
50
60
|
```bash
|
|
51
61
|
BASE_URL="<BASE_URL>"
|
|
52
|
-
mkdir -p ~/.moltbot/skills/chorus ~/.moltbot/skills/idea-chorus ~/.moltbot/skills/proposal-chorus ~/.moltbot/skills/develop-chorus ~/.moltbot/skills/review-chorus
|
|
62
|
+
mkdir -p ~/.moltbot/skills/chorus ~/.moltbot/skills/idea-chorus ~/.moltbot/skills/proposal-chorus ~/.moltbot/skills/develop-chorus ~/.moltbot/skills/review-chorus ~/.moltbot/skills/quick-dev-chorus ~/.moltbot/skills/brainstorm-chorus ~/.moltbot/skills/proposal-reviewer-chorus ~/.moltbot/skills/task-reviewer-chorus ~/.moltbot/skills/yolo-chorus
|
|
53
63
|
curl -s $BASE_URL/skill/chorus/SKILL.md > ~/.moltbot/skills/chorus/SKILL.md
|
|
54
64
|
curl -s $BASE_URL/skill/idea-chorus/SKILL.md > ~/.moltbot/skills/idea-chorus/SKILL.md
|
|
55
65
|
curl -s $BASE_URL/skill/proposal-chorus/SKILL.md > ~/.moltbot/skills/proposal-chorus/SKILL.md
|
|
56
66
|
curl -s $BASE_URL/skill/develop-chorus/SKILL.md > ~/.moltbot/skills/develop-chorus/SKILL.md
|
|
57
67
|
curl -s $BASE_URL/skill/review-chorus/SKILL.md > ~/.moltbot/skills/review-chorus/SKILL.md
|
|
68
|
+
curl -s $BASE_URL/skill/quick-dev-chorus/SKILL.md > ~/.moltbot/skills/quick-dev-chorus/SKILL.md
|
|
69
|
+
curl -s $BASE_URL/skill/brainstorm-chorus/SKILL.md > ~/.moltbot/skills/brainstorm-chorus/SKILL.md
|
|
70
|
+
curl -s $BASE_URL/skill/proposal-reviewer-chorus/SKILL.md > ~/.moltbot/skills/proposal-reviewer-chorus/SKILL.md
|
|
71
|
+
curl -s $BASE_URL/skill/task-reviewer-chorus/SKILL.md > ~/.moltbot/skills/task-reviewer-chorus/SKILL.md
|
|
72
|
+
curl -s $BASE_URL/skill/yolo-chorus/SKILL.md > ~/.moltbot/skills/yolo-chorus/SKILL.md
|
|
58
73
|
curl -s $BASE_URL/skill/package.json > ~/.moltbot/skills/chorus/package.json
|
|
59
74
|
```
|
|
60
75
|
|
|
@@ -385,17 +400,54 @@ approved --> draft (via revoke — cascade-closes tasks, deletes documents)
|
|
|
385
400
|
|
|
386
401
|
---
|
|
387
402
|
|
|
403
|
+
## Independent Review
|
|
404
|
+
|
|
405
|
+
Chorus uses **independent, read-only adversarial reviewers** at two gates: before a proposal is approved, and before a task is verified. The reviewer's job is to find what is wrong — not to rubber-stamp. Its output is **advisory**: it informs the admin's decision but does not by itself approve, reject, verify, or reopen anything.
|
|
406
|
+
|
|
407
|
+
This is the **single canonical description** of the reviewer pattern. The `develop-chorus`, `review-chorus`, and `yolo-chorus` skills all point back here rather than redefining it.
|
|
408
|
+
|
|
409
|
+
### The Pattern
|
|
410
|
+
|
|
411
|
+
1. **Spawn a read-only sub-agent** that loads one of the two reviewer skills:
|
|
412
|
+
- `proposal-reviewer-chorus` (`<BASE_URL>/skill/proposal-reviewer-chorus/SKILL.md`) — for reviewing a **proposal** before approval. Pass it the `proposalUuid`.
|
|
413
|
+
- `task-reviewer-chorus` (`<BASE_URL>/skill/task-reviewer-chorus/SKILL.md`) — for reviewing a **task** before verification. Pass it the `taskUuid`.
|
|
414
|
+
2. **The reviewer audits independently** and posts exactly **one** structured `VERDICT` comment on the proposal/task via `chorus_add_comment`. The comment ends with one literal verdict string: `VERDICT: PASS`, `VERDICT: PASS WITH NOTES`, or `VERDICT: FAIL`.
|
|
415
|
+
3. **Read the verdict and act.** Fetch the comment with `chorus_get_comments({ targetType, targetUuid })`, read the BLOCKER / NOTE findings, then make the call:
|
|
416
|
+
- `PASS` / `PASS WITH NOTES` → proceed (approve the proposal / verify the task), addressing NOTEs at your discretion.
|
|
417
|
+
- `FAIL` → do **not** proceed; route the BLOCKERs back for a fix (reject/revise the proposal, or reopen/rework the task), then re-review.
|
|
418
|
+
|
|
419
|
+
> The verdict is advisory: even a `FAIL` does not block the admin, and a `PASS` does not auto-approve. A human/admin makes the final decision.
|
|
420
|
+
|
|
421
|
+
### Spawn Mechanism Is Harness-Specific
|
|
422
|
+
|
|
423
|
+
How you spawn the read-only sub-agent depends on your agent harness — give it the reviewer skill plus the target UUID and instruct it to post a single VERDICT comment. Concrete examples:
|
|
424
|
+
|
|
425
|
+
- **Claude Code** — use the Task / Agent tool to launch a sub-agent that loads `task-reviewer-chorus` (or `proposal-reviewer-chorus`) and pass the `taskUuid` / `proposalUuid`.
|
|
426
|
+
- **Codex** — use `spawn_agent` with the reviewer skill and the target UUID.
|
|
427
|
+
- Other harnesses: use whatever sub-agent / sub-task primitive they expose.
|
|
428
|
+
|
|
429
|
+
### Inline Self-Review Fallback
|
|
430
|
+
|
|
431
|
+
When sub-agents are **not** available in your harness, run the review inline yourself: load the relevant reviewer skill's procedure (`proposal-reviewer-chorus` or `task-reviewer-chorus`), audit the proposal/task against its checklist with the same adversarial posture, and post the single `VERDICT` comment yourself before acting on it. A same-agent self-review is weaker than a fresh independent reviewer, but it is far better than skipping the gate.
|
|
432
|
+
|
|
433
|
+
---
|
|
434
|
+
|
|
388
435
|
## Skill Routing
|
|
389
436
|
|
|
390
437
|
This is the core overview skill. For stage-specific workflows, download and read the appropriate skill:
|
|
391
438
|
|
|
392
439
|
| Stage | Skill | Path |
|
|
393
440
|
|-------|-------|------|
|
|
441
|
+
| **Overview** (this file) | `chorus` | `<BASE_URL>/skill/chorus/SKILL.md` |
|
|
394
442
|
| **Quick Dev** | `quick-dev-chorus` | `<BASE_URL>/skill/quick-dev-chorus/SKILL.md` |
|
|
443
|
+
| **Brainstorm** | `brainstorm-chorus` | `<BASE_URL>/skill/brainstorm-chorus/SKILL.md` |
|
|
395
444
|
| **Ideation** | `idea-chorus` | `<BASE_URL>/skill/idea-chorus/SKILL.md` |
|
|
396
445
|
| **Planning** | `proposal-chorus` | `<BASE_URL>/skill/proposal-chorus/SKILL.md` |
|
|
397
446
|
| **Development** | `develop-chorus` | `<BASE_URL>/skill/develop-chorus/SKILL.md` |
|
|
398
447
|
| **Review** | `review-chorus` | `<BASE_URL>/skill/review-chorus/SKILL.md` |
|
|
448
|
+
| **Proposal Review** | `proposal-reviewer-chorus` | `<BASE_URL>/skill/proposal-reviewer-chorus/SKILL.md` |
|
|
449
|
+
| **Task Review** | `task-reviewer-chorus` | `<BASE_URL>/skill/task-reviewer-chorus/SKILL.md` |
|
|
450
|
+
| **Full-Auto** | `yolo-chorus` | `<BASE_URL>/skill/yolo-chorus/SKILL.md` |
|
|
399
451
|
|
|
400
452
|
### Getting Started
|
|
401
453
|
|
|
@@ -4,7 +4,7 @@ description: Chorus Development workflow — claim tasks, report work, self-chec
|
|
|
4
4
|
license: AGPL-3.0
|
|
5
5
|
metadata:
|
|
6
6
|
author: chorus
|
|
7
|
-
version: "0.3
|
|
7
|
+
version: "0.9.3"
|
|
8
8
|
category: project-management
|
|
9
9
|
mcp_server: chorus
|
|
10
10
|
---
|
|
@@ -182,7 +182,7 @@ chorus_submit_for_verify({
|
|
|
182
182
|
|
|
183
183
|
> `to_verify` does NOT unblock downstream tasks — only `done` (after admin verification) does.
|
|
184
184
|
|
|
185
|
-
> **Review
|
|
185
|
+
> **Independent Review:** After `chorus_submit_for_verify`, run an independent review of the task before it is verified. Spawn a read-only sub-agent that loads the `task-reviewer-chorus` skill (`<BASE_URL>/skill/task-reviewer-chorus/SKILL.md`), pass it the `taskUuid`, and let it post a single `VERDICT` comment (PASS / PASS WITH NOTES / FAIL) on the task; then read it with `chorus_get_comments` and act. The verdict is **advisory** (it does not block verification). The spawn mechanism is harness-specific, and an inline self-review fallback exists when sub-agents are unavailable — see the canonical **Independent Review** section in the `chorus` skill (`<BASE_URL>/skill/chorus/SKILL.md`) for the full pattern.
|
|
186
186
|
|
|
187
187
|
### Step 9: Handle Review Feedback
|
|
188
188
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "chorus-skill",
|
|
3
|
-
"version": "0.3
|
|
3
|
+
"version": "0.9.3",
|
|
4
4
|
"description": "Chorus AI Agent collaboration platform skill. Supports PM, Developer, and Admin roles via MCP tools for the Idea-Proposal-Task workflow.",
|
|
5
5
|
"author": "chorus",
|
|
6
6
|
"license": "AGPL-3.0",
|
|
@@ -23,7 +23,12 @@
|
|
|
23
23
|
"idea-chorus/SKILL.md": "/skill/idea-chorus/SKILL.md",
|
|
24
24
|
"proposal-chorus/SKILL.md": "/skill/proposal-chorus/SKILL.md",
|
|
25
25
|
"develop-chorus/SKILL.md": "/skill/develop-chorus/SKILL.md",
|
|
26
|
-
"review-chorus/SKILL.md": "/skill/review-chorus/SKILL.md"
|
|
26
|
+
"review-chorus/SKILL.md": "/skill/review-chorus/SKILL.md",
|
|
27
|
+
"quick-dev-chorus/SKILL.md": "/skill/quick-dev-chorus/SKILL.md",
|
|
28
|
+
"brainstorm-chorus/SKILL.md": "/skill/brainstorm-chorus/SKILL.md",
|
|
29
|
+
"proposal-reviewer-chorus/SKILL.md": "/skill/proposal-reviewer-chorus/SKILL.md",
|
|
30
|
+
"task-reviewer-chorus/SKILL.md": "/skill/task-reviewer-chorus/SKILL.md",
|
|
31
|
+
"yolo-chorus/SKILL.md": "/skill/yolo-chorus/SKILL.md"
|
|
27
32
|
},
|
|
28
33
|
"requires": {
|
|
29
34
|
"mcp": ["chorus"]
|
|
@@ -38,7 +43,10 @@
|
|
|
38
43
|
"report work",
|
|
39
44
|
"verify task",
|
|
40
45
|
"approve proposal",
|
|
41
|
-
"project management"
|
|
46
|
+
"project management",
|
|
47
|
+
"yolo",
|
|
48
|
+
"review agent",
|
|
49
|
+
"verify"
|
|
42
50
|
]
|
|
43
51
|
},
|
|
44
52
|
"moltbot": {
|
|
@@ -48,7 +56,12 @@
|
|
|
48
56
|
"idea-chorus/SKILL.md": "/skill/idea-chorus/SKILL.md",
|
|
49
57
|
"proposal-chorus/SKILL.md": "/skill/proposal-chorus/SKILL.md",
|
|
50
58
|
"develop-chorus/SKILL.md": "/skill/develop-chorus/SKILL.md",
|
|
51
|
-
"review-chorus/SKILL.md": "/skill/review-chorus/SKILL.md"
|
|
59
|
+
"review-chorus/SKILL.md": "/skill/review-chorus/SKILL.md",
|
|
60
|
+
"quick-dev-chorus/SKILL.md": "/skill/quick-dev-chorus/SKILL.md",
|
|
61
|
+
"brainstorm-chorus/SKILL.md": "/skill/brainstorm-chorus/SKILL.md",
|
|
62
|
+
"proposal-reviewer-chorus/SKILL.md": "/skill/proposal-reviewer-chorus/SKILL.md",
|
|
63
|
+
"task-reviewer-chorus/SKILL.md": "/skill/task-reviewer-chorus/SKILL.md",
|
|
64
|
+
"yolo-chorus/SKILL.md": "/skill/yolo-chorus/SKILL.md"
|
|
52
65
|
},
|
|
53
66
|
"requires": {
|
|
54
67
|
"mcp": ["chorus"]
|
|
@@ -63,7 +76,10 @@
|
|
|
63
76
|
"report work",
|
|
64
77
|
"verify task",
|
|
65
78
|
"approve proposal",
|
|
66
|
-
"project management"
|
|
79
|
+
"project management",
|
|
80
|
+
"yolo",
|
|
81
|
+
"review agent",
|
|
82
|
+
"verify"
|
|
67
83
|
]
|
|
68
84
|
}
|
|
69
85
|
}
|
|
@@ -4,7 +4,7 @@ description: Chorus Proposal workflow — create proposals with document and tas
|
|
|
4
4
|
license: AGPL-3.0
|
|
5
5
|
metadata:
|
|
6
6
|
author: chorus
|
|
7
|
-
version: "0.3
|
|
7
|
+
version: "0.9.3"
|
|
8
8
|
category: project-management
|
|
9
9
|
mcp_server: chorus
|
|
10
10
|
---
|
|
@@ -111,6 +111,8 @@ chorus_pm_add_document_draft({
|
|
|
111
111
|
|
|
112
112
|
Add task drafts one at a time. The response returns the new draft's `draftUuid` — use it directly for `dependsOnDraftUuids` in subsequent drafts.
|
|
113
113
|
|
|
114
|
+
**`acceptanceCriteriaItems` is required** — every task draft must include at least one item with a non-blank `description`, or the call is rejected. Use the structured `acceptanceCriteriaItems` array (the legacy `acceptanceCriteria` Markdown string does not satisfy the requirement).
|
|
115
|
+
|
|
114
116
|
```
|
|
115
117
|
# First task -> response includes { draftUuid, draftTitle }
|
|
116
118
|
chorus_pm_add_task_draft({
|
|
@@ -119,7 +121,10 @@ chorus_pm_add_task_draft({
|
|
|
119
121
|
description: "Detailed description of what to build...",
|
|
120
122
|
priority: "high",
|
|
121
123
|
storyPoints: 3,
|
|
122
|
-
|
|
124
|
+
acceptanceCriteriaItems: [
|
|
125
|
+
{ description: "Criteria 1", required: true },
|
|
126
|
+
{ description: "Criteria 2", required: true }
|
|
127
|
+
]
|
|
123
128
|
})
|
|
124
129
|
|
|
125
130
|
# Second task — depends on first
|
|
@@ -129,11 +134,15 @@ chorus_pm_add_task_draft({
|
|
|
129
134
|
description: "Unit and integration tests...",
|
|
130
135
|
priority: "medium",
|
|
131
136
|
storyPoints: 2,
|
|
132
|
-
|
|
137
|
+
acceptanceCriteriaItems: [
|
|
138
|
+
{ description: "Test coverage > 80%", required: true }
|
|
139
|
+
],
|
|
133
140
|
dependsOnDraftUuids: ["<draftUuid-from-first-task>"]
|
|
134
141
|
})
|
|
135
142
|
```
|
|
136
143
|
|
|
144
|
+
> To edit a draft's criteria later via `chorus_pm_update_task_draft`, pass a non-empty `acceptanceCriteriaItems` to replace them; omit the field to leave them unchanged. The field cannot be used to clear criteria.
|
|
145
|
+
|
|
137
146
|
**Task priority:** `low`, `medium`, `high`
|
|
138
147
|
|
|
139
148
|
### Step 4: Review and Refine Drafts
|
|
@@ -302,7 +311,7 @@ Potential issues and how to address them.
|
|
|
302
311
|
|
|
303
312
|
Good tasks are:
|
|
304
313
|
- **Module-scoped** — One cohesive functional module per task, not a single function or file
|
|
305
|
-
- **Testable** — Clear, cohesive acceptance criteria (
|
|
314
|
+
- **Testable** — Clear, cohesive acceptance criteria are **required** on every task (at least one non-blank item; max 6; group related checks into one criterion but list key coverage, e.g. "All tests pass: service layer unit tests, API integration tests, edge case handling")
|
|
306
315
|
- **Sized** — 1-8 story points (hours of agent work)
|
|
307
316
|
- **Ordered** — Use `dependsOnDraftUuids` / `dependsOnTaskUuids` to express execution order
|
|
308
317
|
- **Descriptive** — Include enough context for a developer agent to start without questions. For tasks with cross-module dependencies, reference the tech design's Module Contracts in the AC
|