@chorus-aidlc/chorus-openclaw-plugin 0.16.0 → 0.16.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/dist/event-router.d.ts +24 -0
- package/dist/event-router.d.ts.map +1 -1
- package/dist/event-router.js +61 -23
- package/dist/event-router.js.map +1 -1
- package/package.json +1 -1
- package/skills/brainstorm/SKILL.md +1 -1
- package/skills/chorus/SKILL.md +4 -3
- package/skills/code-reviewer/SKILL.md +2 -2
- package/skills/develop/SKILL.md +1 -1
- package/skills/docs/SKILL.md +1 -1
- package/skills/idea/SKILL.md +2 -1
- package/skills/openspec-aware/SKILL.md +1 -1
- package/skills/orchestrate/SKILL.md +129 -0
- package/skills/proposal/SKILL.md +1 -1
- package/skills/proposal-reviewer/SKILL.md +2 -1
- package/skills/quick-dev/SKILL.md +1 -1
- package/skills/review/SKILL.md +1 -1
- package/skills/task-reviewer/SKILL.md +2 -2
- package/skills/yolo/SKILL.md +1 -1
- package/src/event-router.ts +80 -14
package/dist/event-router.d.ts
CHANGED
|
@@ -67,11 +67,35 @@ export declare class ChorusEventRouter {
|
|
|
67
67
|
* Instructs the agent to @mention the actor after completing work.
|
|
68
68
|
*/
|
|
69
69
|
private buildMentionGuidance;
|
|
70
|
+
/**
|
|
71
|
+
* Orchestrator-handoff guidance for a wake — the OpenClaw twin of the daemon's
|
|
72
|
+
* orchestratorGuidance in cli/prompts.mjs. KEEP THE TWO WORDINGS IN SYNC. Returns
|
|
73
|
+
* null unless the resource has an AGENT orchestrator; a human-assigned resource
|
|
74
|
+
* hands back to the human via the actor @mention above (buildMentionGuidance).
|
|
75
|
+
*/
|
|
76
|
+
private buildOrchestratorGuidance;
|
|
77
|
+
/**
|
|
78
|
+
* Append orchestrator-handoff guidance (when the resource has an agent orchestrator)
|
|
79
|
+
* to a wake message and dispatch it. Every handler routes its wake through this so the
|
|
80
|
+
* handback instruction rides EVERY action — parity with the daemon, which appends
|
|
81
|
+
* orchestratorGuidance once in buildPrompt (cli/prompts.mjs). No orchestrator → the
|
|
82
|
+
* message is dispatched unchanged.
|
|
83
|
+
*/
|
|
84
|
+
private wakeWithHandoff;
|
|
70
85
|
private handleTaskAssigned;
|
|
71
86
|
private handleMentioned;
|
|
72
87
|
private handleElaborationRequested;
|
|
73
88
|
private handleProposalRejected;
|
|
74
89
|
private handleProposalApproved;
|
|
90
|
+
/**
|
|
91
|
+
* An idea was assigned to this agent. The assignment ALREADY set the assignee, so there is
|
|
92
|
+
* nothing to claim — chorus_claim_idea would throw (AlreadyClaimedError, and a hard "Cannot
|
|
93
|
+
* claim an elaborated Idea" for the elaborated-backfill case). Do NOT emit a claim
|
|
94
|
+
* instruction; tell the already-assigned agent to review and advance from the idea's CURRENT
|
|
95
|
+
* stage, stopping at the human proposal/verify gates, and name the assigner via
|
|
96
|
+
* n.actorName / n.actorType. Mirrors the daemon's cli/prompts.mjs `idea_claimed` case
|
|
97
|
+
* (plugin voice; no headless preamble) — KEEP THE TWO WORDINGS IN SYNC.
|
|
98
|
+
*/
|
|
75
99
|
private handleIdeaClaimed;
|
|
76
100
|
private handleTaskVerified;
|
|
77
101
|
private handleTaskReopened;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-router.d.ts","sourceRoot":"","sources":["../src/event-router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,YAAY,GAAG,CACzB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,eAAe,KAC1B,IAAI,CAAC;AAEV,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,eAAe,CAAC;IAC3B,IAAI,EAAE,YAAY,CAAC;IACnB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,MAAM,EAAE;QAAE,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QAAC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QAAC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAC;CACpG;
|
|
1
|
+
{"version":3,"file":"event-router.d.ts","sourceRoot":"","sources":["../src/event-router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,YAAY,GAAG,CACzB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,eAAe,KAC1B,IAAI,CAAC;AAEV,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,eAAe,CAAC;IAC3B,IAAI,EAAE,YAAY,CAAC;IACnB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,MAAM,EAAE;QAAE,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QAAC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QAAC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAC;CACpG;AA2BD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkB;IAC5C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAe;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAkB;IAC3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqC;gBAEhD,IAAI,EAAE,wBAAwB;IAO1C;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,oBAAoB,GAAG,IAAI;IAgC3C;;;;OAIG;IACH,OAAO,CAAC,aAAa;YAIP,aAAa;IA8F3B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAO5B;;;;;OAKG;IACH,OAAO,CAAC,yBAAyB;IAYjC;;;;;;OAMG;IACH,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,kBAAkB;IAW1B,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,0BAA0B;IASlC,OAAO,CAAC,sBAAsB;IAc9B,OAAO,CAAC,sBAAsB;IAc9B;;;;;;;;OAQG;IACH,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,kBAAkB;IAU1B,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,yBAAyB;IAgBjC;;;;;;OAMG;IACH,OAAO,CAAC,yBAAyB;IAcjC;;;;;;OAMG;IACH,OAAO,CAAC,sBAAsB;IAiB9B;;;;;;;;OAQG;IACH,OAAO,CAAC,mBAAmB;CAgB5B"}
|
package/dist/event-router.js
CHANGED
|
@@ -147,56 +147,94 @@ export class ChorusEventRouter {
|
|
|
147
147
|
return (`After completing your work, post a comment on this ${entityType} using chorus_add_comment with @mention:\n` +
|
|
148
148
|
`Use this exact mention format: @[${n.actorName}](${n.actorType}:${n.actorUuid})`);
|
|
149
149
|
}
|
|
150
|
+
/**
|
|
151
|
+
* Orchestrator-handoff guidance for a wake — the OpenClaw twin of the daemon's
|
|
152
|
+
* orchestratorGuidance in cli/prompts.mjs. KEEP THE TWO WORDINGS IN SYNC. Returns
|
|
153
|
+
* null unless the resource has an AGENT orchestrator; a human-assigned resource
|
|
154
|
+
* hands back to the human via the actor @mention above (buildMentionGuidance).
|
|
155
|
+
*/
|
|
156
|
+
buildOrchestratorGuidance(n) {
|
|
157
|
+
if (n.orchestrator?.type !== "agent")
|
|
158
|
+
return null;
|
|
159
|
+
return (`Your orchestrator for this resource is @${n.orchestrator.name}.\n` +
|
|
160
|
+
`At a human-only gate you cannot cross, or when this child resource is complete, hand control ` +
|
|
161
|
+
`back by commenting on the resource and mentioning ` +
|
|
162
|
+
`@[${n.orchestrator.name}](agent:${n.orchestrator.uuid}) with the decision needed or completion ` +
|
|
163
|
+
`evidence, then leave any human-gated resource pending and end the turn. Do not @mention the ` +
|
|
164
|
+
`orchestrator for ordinary internal progress.`);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Append orchestrator-handoff guidance (when the resource has an agent orchestrator)
|
|
168
|
+
* to a wake message and dispatch it. Every handler routes its wake through this so the
|
|
169
|
+
* handback instruction rides EVERY action — parity with the daemon, which appends
|
|
170
|
+
* orchestratorGuidance once in buildPrompt (cli/prompts.mjs). No orchestrator → the
|
|
171
|
+
* message is dispatched unchanged.
|
|
172
|
+
*/
|
|
173
|
+
wakeWithHandoff(message, contextKey, n, attr) {
|
|
174
|
+
const handoff = this.buildOrchestratorGuidance(n);
|
|
175
|
+
this.wake(handoff ? `${message}\n\n${handoff}` : message, contextKey, attr);
|
|
176
|
+
}
|
|
150
177
|
handleTaskAssigned(n, attr) {
|
|
151
178
|
const mentionGuidance = this.buildMentionGuidance(n, "task");
|
|
152
|
-
this.
|
|
179
|
+
this.wakeWithHandoff(`[Chorus] Task assigned: ${n.entityTitle}. Task UUID: ${n.entityUuid}, Project UUID: ${n.projectUuid}. Use chorus_get_task to review the task, then chorus_claim_task to start work.\n${mentionGuidance}`, this.contextKeyFor("task_assigned", n.entityUuid), n, attr);
|
|
153
180
|
}
|
|
154
181
|
handleMentioned(n, attr) {
|
|
155
182
|
const mentionGuidance = this.buildMentionGuidance(n, n.entityType);
|
|
156
|
-
this.
|
|
183
|
+
this.wakeWithHandoff(`[Chorus] You were @mentioned in ${n.entityType} '${n.entityTitle}' (entityType: ${n.entityType}, entityUuid: ${n.entityUuid}, projectUuid: ${n.projectUuid}): ${n.message}\n` +
|
|
157
184
|
`Review the ${n.entityType} content and use chorus_get_comments (targetType: "${n.entityType}", targetUuid: "${n.entityUuid}") to see the full conversation, then respond.\n` +
|
|
158
|
-
mentionGuidance, this.contextKeyFor("mentioned", n.entityUuid), attr);
|
|
185
|
+
mentionGuidance, this.contextKeyFor("mentioned", n.entityUuid), n, attr);
|
|
159
186
|
}
|
|
160
187
|
handleElaborationRequested(n, attr) {
|
|
161
|
-
this.
|
|
188
|
+
this.wakeWithHandoff(`[Chorus] Elaboration requested for idea '${n.entityTitle}' (ideaUuid: ${n.entityUuid}, projectUuid: ${n.projectUuid}). Use chorus_get_elaboration to review questions.`, this.contextKeyFor("elaboration_requested", n.entityUuid), n, attr);
|
|
162
189
|
}
|
|
163
190
|
handleProposalRejected(n, attr) {
|
|
164
191
|
const mentionGuidance = this.buildMentionGuidance(n, "proposal");
|
|
165
|
-
this.
|
|
192
|
+
this.wakeWithHandoff(`[Chorus] Proposal '${n.entityTitle}' was REJECTED (proposalUuid: ${n.entityUuid}, projectUuid: ${n.projectUuid}). Review note: "${n.message}". ` +
|
|
166
193
|
`Use chorus_get_proposal to review the proposal, then fix issues with chorus_update_task_draft / chorus_update_document_draft. ` +
|
|
167
194
|
`After fixing, call chorus_validate_proposal then chorus_submit_proposal to resubmit.\n` +
|
|
168
|
-
mentionGuidance, this.contextKeyFor("proposal_rejected", n.entityUuid), attr);
|
|
195
|
+
mentionGuidance, this.contextKeyFor("proposal_rejected", n.entityUuid), n, attr);
|
|
169
196
|
}
|
|
170
197
|
handleProposalApproved(n, attr) {
|
|
171
198
|
const mentionGuidance = this.buildMentionGuidance(n, "proposal");
|
|
172
199
|
const reviewInfo = n.message.includes("Note: ") ? ` Review note: "${n.message.split("Note: ").pop()}"` : "";
|
|
173
|
-
this.
|
|
200
|
+
this.wakeWithHandoff(`[Chorus] Proposal '${n.entityTitle}' was APPROVED (proposalUuid: ${n.entityUuid}, projectUuid: ${n.projectUuid})!${reviewInfo} Documents and tasks have been created. ` +
|
|
174
201
|
`Use chorus_get_available_tasks with projectUuid: "${n.projectUuid}" to see the new tasks ready for work.\n` +
|
|
175
|
-
mentionGuidance, this.contextKeyFor("proposal_approved", n.entityUuid), attr);
|
|
202
|
+
mentionGuidance, this.contextKeyFor("proposal_approved", n.entityUuid), n, attr);
|
|
176
203
|
}
|
|
204
|
+
/**
|
|
205
|
+
* An idea was assigned to this agent. The assignment ALREADY set the assignee, so there is
|
|
206
|
+
* nothing to claim — chorus_claim_idea would throw (AlreadyClaimedError, and a hard "Cannot
|
|
207
|
+
* claim an elaborated Idea" for the elaborated-backfill case). Do NOT emit a claim
|
|
208
|
+
* instruction; tell the already-assigned agent to review and advance from the idea's CURRENT
|
|
209
|
+
* stage, stopping at the human proposal/verify gates, and name the assigner via
|
|
210
|
+
* n.actorName / n.actorType. Mirrors the daemon's cli/prompts.mjs `idea_claimed` case
|
|
211
|
+
* (plugin voice; no headless preamble) — KEEP THE TWO WORDINGS IN SYNC.
|
|
212
|
+
*/
|
|
177
213
|
handleIdeaClaimed(n, attr) {
|
|
178
214
|
const mentionGuidance = this.buildMentionGuidance(n, "idea");
|
|
179
|
-
this.
|
|
180
|
-
`Use chorus_get_idea to review
|
|
181
|
-
|
|
215
|
+
this.wakeWithHandoff(`[Chorus] Idea '${n.entityTitle}' was assigned to you by ${n.actorName} (${n.actorType}) (ideaUuid: ${n.entityUuid}, projectUuid: ${n.projectUuid}). ` +
|
|
216
|
+
`You are now the assignee — no need to claim it. Use chorus_get_idea to review it, then advance it from its CURRENT stage: ` +
|
|
217
|
+
`if it is still elaborating, run or continue elaboration; if it is already elaborated, author the proposal. ` +
|
|
218
|
+
`Stop at the human proposal/verify gates and never merge automatically.\n` +
|
|
219
|
+
mentionGuidance, this.contextKeyFor("idea_claimed", n.entityUuid), n, attr);
|
|
182
220
|
}
|
|
183
221
|
handleTaskVerified(n, attr) {
|
|
184
|
-
this.
|
|
185
|
-
`Check if this unblocks other tasks: use chorus_get_unblocked_tasks with projectUuid "${n.projectUuid}" to find tasks that are now ready to start.`, this.contextKeyFor("task_verified", n.entityUuid), attr);
|
|
222
|
+
this.wakeWithHandoff(`[Chorus] Task '${n.entityTitle}' has been verified and is now done (taskUuid: ${n.entityUuid}, projectUuid: ${n.projectUuid}). ` +
|
|
223
|
+
`Check if this unblocks other tasks: use chorus_get_unblocked_tasks with projectUuid "${n.projectUuid}" to find tasks that are now ready to start.`, this.contextKeyFor("task_verified", n.entityUuid), n, attr);
|
|
186
224
|
}
|
|
187
225
|
handleTaskReopened(n, attr) {
|
|
188
226
|
const mentionGuidance = this.buildMentionGuidance(n, "task");
|
|
189
|
-
this.
|
|
190
|
-
`Use chorus_get_task to review the task and chorus_get_comments to see verification feedback, then fix the issues.\n${mentionGuidance}`, this.contextKeyFor("task_reopened", n.entityUuid), attr);
|
|
227
|
+
this.wakeWithHandoff(`[Chorus] Task '${n.entityTitle}' has been reopened and needs rework (taskUuid: ${n.entityUuid}, projectUuid: ${n.projectUuid}). ` +
|
|
228
|
+
`Use chorus_get_task to review the task and chorus_get_comments to see verification feedback, then fix the issues.\n${mentionGuidance}`, this.contextKeyFor("task_reopened", n.entityUuid), n, attr);
|
|
191
229
|
}
|
|
192
230
|
handleElaborationAnswered(n, attr) {
|
|
193
231
|
const mentionGuidance = this.buildMentionGuidance(n, "idea");
|
|
194
|
-
this.
|
|
232
|
+
this.wakeWithHandoff(`[Chorus] Elaboration answers submitted for idea '${n.entityTitle}' (ideaUuid: ${n.entityUuid}, projectUuid: ${n.projectUuid}). ` +
|
|
195
233
|
`Review the answers with chorus_get_elaboration, then either:\n` +
|
|
196
234
|
`- Call chorus_validate_elaboration with empty issues [] to resolve and proceed to proposal creation\n` +
|
|
197
235
|
`- Call chorus_validate_elaboration with issues + followUpQuestions for another round\n\n` +
|
|
198
236
|
`After reviewing, @mention the answerer to ask if they have any further questions before you proceed.\n` +
|
|
199
|
-
mentionGuidance, this.contextKeyFor("elaboration_answered", n.entityUuid), attr);
|
|
237
|
+
mentionGuidance, this.contextKeyFor("elaboration_answered", n.entityUuid), n, attr);
|
|
200
238
|
}
|
|
201
239
|
/**
|
|
202
240
|
* A human clicked "Verify Elaborate" (add-elaboration-verify-wake). The elaboration
|
|
@@ -207,10 +245,10 @@ export class ChorusEventRouter {
|
|
|
207
245
|
*/
|
|
208
246
|
handleElaborationVerified(n, attr) {
|
|
209
247
|
const mentionGuidance = this.buildMentionGuidance(n, "idea");
|
|
210
|
-
this.
|
|
248
|
+
this.wakeWithHandoff(`[Chorus] Elaboration for idea '${n.entityTitle}' was VERIFIED by a human (ideaUuid: ${n.entityUuid}, projectUuid: ${n.projectUuid}). ` +
|
|
211
249
|
`The idea is now elaborated — do NOT answer elaboration questions. Proceed to WRITE THE PROPOSAL: gather context with ` +
|
|
212
250
|
`chorus_get_idea and chorus_get_elaboration, then author the proposal via the existing proposal flow ` +
|
|
213
|
-
`(chorus_pm_create_proposal / the proposal skill).\n${mentionGuidance}`, this.contextKeyFor("elaboration_verified", n.entityUuid), attr);
|
|
251
|
+
`(chorus_pm_create_proposal / the proposal skill).\n${mentionGuidance}`, this.contextKeyFor("elaboration_verified", n.entityUuid), n, attr);
|
|
214
252
|
}
|
|
215
253
|
/**
|
|
216
254
|
* A human clicked "Start Development" (add-stage-advance-start-development). The idea's
|
|
@@ -221,13 +259,13 @@ export class ChorusEventRouter {
|
|
|
221
259
|
*/
|
|
222
260
|
handleStartDevelopment(n, attr) {
|
|
223
261
|
const mentionGuidance = this.buildMentionGuidance(n, "idea");
|
|
224
|
-
this.
|
|
262
|
+
this.wakeWithHandoff(`[Chorus] A human started DEVELOPMENT for idea '${n.entityTitle}' (ideaUuid: ${n.entityUuid}, projectUuid: ${n.projectUuid}). ` +
|
|
225
263
|
`The idea's proposal is approved and unfinished tasks remain. Claim and execute ALL remaining tasks of that proposal in ` +
|
|
226
264
|
`dependency order, following the develop workflow: repeatedly find claimable tasks (chorus_get_unblocked_tasks with ` +
|
|
227
265
|
`projectUuid: "${n.projectUuid}"), claim one (chorus_claim_task), implement it, self-check its acceptance criteria ` +
|
|
228
266
|
`(chorus_report_criteria_self_check), and submit it (chorus_submit_for_verify) — then loop until NO claimable task remains. ` +
|
|
229
267
|
`Do NOT stop after one task. Leave tasks already in to_verify (awaiting human verification) and tasks claimed by other ` +
|
|
230
|
-
`sessions untouched. If nothing is claimable, post a brief status comment on the idea and end the turn.\n${mentionGuidance}`, this.contextKeyFor("start_development", n.entityUuid), attr);
|
|
268
|
+
`sessions untouched. If nothing is claimable, post a brief status comment on the idea and end the turn.\n${mentionGuidance}`, this.contextKeyFor("start_development", n.entityUuid), n, attr);
|
|
231
269
|
}
|
|
232
270
|
/**
|
|
233
271
|
* A human clicked "Yolo" (add-stage-advance-yolo). Unlike start_development (always the
|
|
@@ -240,13 +278,13 @@ export class ChorusEventRouter {
|
|
|
240
278
|
*/
|
|
241
279
|
handleYoloRequested(n, attr) {
|
|
242
280
|
const mentionGuidance = this.buildMentionGuidance(n, "idea");
|
|
243
|
-
this.
|
|
281
|
+
this.wakeWithHandoff(`[Chorus] A human requested a YOLO run for idea '${n.entityTitle}' (ideaUuid: ${n.entityUuid}, projectUuid: ${n.projectUuid}). ` +
|
|
244
282
|
`Drive this idea all the way to done following the yolo skill (the full-auto AI-DLC pipeline: Idea → Elaboration → Proposal → ` +
|
|
245
283
|
`Execute → Verify). First read the idea's current state with chorus_get_idea (plus chorus_get_elaboration / ` +
|
|
246
284
|
`chorus_get_proposals as needed) and RESUME from whatever phase it is already in — do NOT assume a fixed stage: if ` +
|
|
247
285
|
`elaboration isn't resolved, self-elaborate then write the proposal; if a proposal is approved with open tasks, execute them; ` +
|
|
248
286
|
`and so on. Complete the pipeline through the final done state and completion report, but do NOT merge or push a pull request ` +
|
|
249
|
-
`without explicit human approval.\n${mentionGuidance}`, this.contextKeyFor("yolo_requested", n.entityUuid), attr);
|
|
287
|
+
`without explicit human approval.\n${mentionGuidance}`, this.contextKeyFor("yolo_requested", n.entityUuid), n, attr);
|
|
250
288
|
}
|
|
251
289
|
}
|
|
252
290
|
//# sourceMappingURL=event-router.js.map
|
package/dist/event-router.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-router.js","sourceRoot":"","sources":["../src/event-router.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"event-router.js","sourceRoot":"","sources":["../src/event-router.ts"],"names":[],"mappings":"AA2EA,MAAM,OAAO,iBAAiB;IACX,SAAS,CAAkB;IAC3B,IAAI,CAAe;IACnB,OAAO,CAAmB;IAC1B,MAAM,CAAqC;IAE5D,YAAY,IAA8B;QACxC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACH,QAAQ,CAAC,KAA2B;QAClC,4EAA4E;QAC5E,6EAA6E;QAC7E,6EAA6E;QAC7E,8EAA8E;QAC9E,8EAA8E;QAC9E,qDAAqD;QACrD,IAAI,KAAK,CAAC,IAAI,KAAK,uBAAuB,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACvE,OAAO;QACT,CAAC;QAED,kEAAkE;QAClE,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;YACtC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,KAAK,CAAC,IAAI,WAAW,CAAC,CAAC;YAC3D,OAAO;QACT,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;YAC9E,OAAO;QACT,CAAC;QAED,2DAA2D;QAC3D,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACvD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,sCAAsC,KAAK,CAAC,gBAAgB,KAAK,GAAG,EAAE,CAAC,CAAC;QAC5F,CAAC,CAAC,CAAC;IACL,CAAC;IAED,8EAA8E;IAC9E,WAAW;IACX,8EAA8E;IAE9E;;;;OAIG;IACK,aAAa,CAAC,MAAc,EAAE,UAAkB;QACtD,OAAO,UAAU,MAAM,IAAI,UAAU,EAAE,CAAC;IAC1C,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,gBAAwB;QAClD,0EAA0E;QAC1E,gFAAgF;QAChF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,0BAA0B,EAAE;YACvE,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,EAAE;YACT,YAAY,EAAE,KAAK;SACpB,CAAoD,CAAC;QAEtD,MAAM,aAAa,GAAG,MAAM,EAAE,aAAa,CAAC;QAC5C,IAAI,CAAC,aAAa,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;YACpD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;YACvD,OAAO;QACT,CAAC;QAED,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAC;QAC5E,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,gBAAgB,2BAA2B,CAAC,CAAC;YAC9E,OAAO;QACT,CAAC;QAED,kFAAkF;QAClF,qFAAqF;QACrF,8EAA8E;QAC9E,gFAAgF;QAChF,4EAA4E;QAC5E,IAAI,WAAW,GAAoB;YACjC,UAAU,EAAE,YAAY,CAAC,UAAU;YACnC,UAAU,EAAE,YAAY,CAAC,UAAU;SACpC,CAAC;QACF,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC;gBACH,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;gBAClF,WAAW,GAAG,EAAE,GAAG,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC;YACjE,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,0EAA0E;gBAC1E,2EAA2E;gBAC3E,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,YAAY,CAAC,UAAU,IAAI,YAAY,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC,CAAC;YAC/G,CAAC;QACH,CAAC;QAED,gEAAgE;QAChE,IAAI,CAAC;YACH,QAAQ,YAAY,CAAC,MAAM,EAAE,CAAC;gBAC5B,KAAK,eAAe;oBAClB,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;oBACnD,MAAM;gBACR,KAAK,WAAW;oBACd,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;oBAChD,MAAM;gBACR,KAAK,uBAAuB;oBAC1B,IAAI,CAAC,0BAA0B,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;oBAC3D,MAAM;gBACR,KAAK,sBAAsB;oBACzB,IAAI,CAAC,yBAAyB,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;oBAC1D,MAAM;gBACR,mFAAmF;gBACnF,qFAAqF;gBACrF,mFAAmF;gBACnF,kFAAkF;gBAClF,yDAAyD;gBACzD,KAAK,sBAAsB;oBACzB,IAAI,CAAC,yBAAyB,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;oBAC1D,MAAM;gBACR,KAAK,mBAAmB;oBACtB,IAAI,CAAC,sBAAsB,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;oBACvD,MAAM;gBACR,KAAK,gBAAgB;oBACnB,IAAI,CAAC,mBAAmB,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;oBACpD,MAAM;gBACR,KAAK,mBAAmB;oBACtB,IAAI,CAAC,sBAAsB,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;oBACvD,MAAM;gBACR,KAAK,mBAAmB;oBACtB,IAAI,CAAC,sBAAsB,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;oBACvD,MAAM;gBACR,KAAK,cAAc;oBACjB,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;oBAClD,MAAM;gBACR,KAAK,eAAe;oBAClB,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;oBACnD,MAAM;gBACR,KAAK,eAAe;oBAClB,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;oBACnD,MAAM;gBACR;oBACE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mCAAmC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;oBAC5E,MAAM;YACV,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,YAAY,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,oBAAoB,CAAC,CAAqB,EAAE,UAAkB;QACpE,OAAO,CACL,sDAAsD,UAAU,4CAA4C;YAC5G,oCAAoC,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,GAAG,CAClF,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACK,yBAAyB,CAAC,CAAqB;QACrD,IAAI,CAAC,CAAC,YAAY,EAAE,IAAI,KAAK,OAAO;YAAE,OAAO,IAAI,CAAC;QAClD,OAAO,CACL,2CAA2C,CAAC,CAAC,YAAY,CAAC,IAAI,KAAK;YACnE,+FAA+F;YAC/F,oDAAoD;YACpD,KAAK,CAAC,CAAC,YAAY,CAAC,IAAI,WAAW,CAAC,CAAC,YAAY,CAAC,IAAI,2CAA2C;YACjG,8FAA8F;YAC9F,8CAA8C,CAC/C,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACK,eAAe,CACrB,OAAe,EACf,UAAkB,EAClB,CAAqB,EACrB,IAAqB;QAErB,MAAM,OAAO,GAAG,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC;QAClD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,OAAO,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;IAC9E,CAAC;IAEO,kBAAkB,CAAC,CAAqB,EAAE,IAAqB;QACrE,MAAM,eAAe,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAE7D,IAAI,CAAC,eAAe,CAClB,2BAA2B,CAAC,CAAC,WAAW,gBAAgB,CAAC,CAAC,UAAU,mBAAmB,CAAC,CAAC,WAAW,oFAAoF,eAAe,EAAE,EACzM,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,CAAC,CAAC,UAAU,CAAC,EACjD,CAAC,EACD,IAAI,CACL,CAAC;IACJ,CAAC;IAEO,eAAe,CAAC,CAAqB,EAAE,IAAqB;QAClE,MAAM,eAAe,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;QAEnE,IAAI,CAAC,eAAe,CAClB,mCAAmC,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,WAAW,kBAAkB,CAAC,CAAC,UAAU,iBAAiB,CAAC,CAAC,UAAU,kBAAkB,CAAC,CAAC,WAAW,MAAM,CAAC,CAAC,OAAO,IAAI;YAC9K,cAAc,CAAC,CAAC,UAAU,sDAAsD,CAAC,CAAC,UAAU,mBAAmB,CAAC,CAAC,UAAU,kDAAkD;YAC7K,eAAe,EACf,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,CAAC,UAAU,CAAC,EAC7C,CAAC,EACD,IAAI,CACL,CAAC;IACJ,CAAC;IAEO,0BAA0B,CAAC,CAAqB,EAAE,IAAqB;QAC7E,IAAI,CAAC,eAAe,CAClB,4CAA4C,CAAC,CAAC,WAAW,gBAAgB,CAAC,CAAC,UAAU,kBAAkB,CAAC,CAAC,WAAW,oDAAoD,EACxK,IAAI,CAAC,aAAa,CAAC,uBAAuB,EAAE,CAAC,CAAC,UAAU,CAAC,EACzD,CAAC,EACD,IAAI,CACL,CAAC;IACJ,CAAC;IAEO,sBAAsB,CAAC,CAAqB,EAAE,IAAqB;QACzE,MAAM,eAAe,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QAEjE,IAAI,CAAC,eAAe,CAClB,sBAAsB,CAAC,CAAC,WAAW,iCAAiC,CAAC,CAAC,UAAU,kBAAkB,CAAC,CAAC,WAAW,oBAAoB,CAAC,CAAC,OAAO,KAAK;YACjJ,gIAAgI;YAChI,wFAAwF;YACxF,eAAe,EACf,IAAI,CAAC,aAAa,CAAC,mBAAmB,EAAE,CAAC,CAAC,UAAU,CAAC,EACrD,CAAC,EACD,IAAI,CACL,CAAC;IACJ,CAAC;IAEO,sBAAsB,CAAC,CAAqB,EAAE,IAAqB;QACzE,MAAM,eAAe,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QAEjE,MAAM,UAAU,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5G,IAAI,CAAC,eAAe,CAClB,sBAAsB,CAAC,CAAC,WAAW,iCAAiC,CAAC,CAAC,UAAU,kBAAkB,CAAC,CAAC,WAAW,KAAK,UAAU,0CAA0C;YACxK,qDAAqD,CAAC,CAAC,WAAW,0CAA0C;YAC5G,eAAe,EACf,IAAI,CAAC,aAAa,CAAC,mBAAmB,EAAE,CAAC,CAAC,UAAU,CAAC,EACrD,CAAC,EACD,IAAI,CACL,CAAC;IACJ,CAAC;IAED;;;;;;;;OAQG;IACK,iBAAiB,CAAC,CAAqB,EAAE,IAAqB;QACpE,MAAM,eAAe,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAE7D,IAAI,CAAC,eAAe,CAClB,kBAAkB,CAAC,CAAC,WAAW,4BAA4B,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS,gBAAgB,CAAC,CAAC,UAAU,kBAAkB,CAAC,CAAC,WAAW,KAAK;YACtJ,4HAA4H;YAC5H,6GAA6G;YAC7G,0EAA0E;YAC1E,eAAe,EACf,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,CAAC,CAAC,UAAU,CAAC,EAChD,CAAC,EACD,IAAI,CACL,CAAC;IACJ,CAAC;IAEO,kBAAkB,CAAC,CAAqB,EAAE,IAAqB;QACrE,IAAI,CAAC,eAAe,CAClB,kBAAkB,CAAC,CAAC,WAAW,kDAAkD,CAAC,CAAC,UAAU,kBAAkB,CAAC,CAAC,WAAW,KAAK;YACjI,wFAAwF,CAAC,CAAC,WAAW,8CAA8C,EACnJ,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,CAAC,CAAC,UAAU,CAAC,EACjD,CAAC,EACD,IAAI,CACL,CAAC;IACJ,CAAC;IAEO,kBAAkB,CAAC,CAAqB,EAAE,IAAqB;QACrE,MAAM,eAAe,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAE7D,IAAI,CAAC,eAAe,CAClB,kBAAkB,CAAC,CAAC,WAAW,mDAAmD,CAAC,CAAC,UAAU,kBAAkB,CAAC,CAAC,WAAW,KAAK;YAClI,sHAAsH,eAAe,EAAE,EACvI,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,CAAC,CAAC,UAAU,CAAC,EACjD,CAAC,EACD,IAAI,CACL,CAAC;IACJ,CAAC;IAEO,yBAAyB,CAAC,CAAqB,EAAE,IAAqB;QAC5E,MAAM,eAAe,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAE7D,IAAI,CAAC,eAAe,CAClB,oDAAoD,CAAC,CAAC,WAAW,gBAAgB,CAAC,CAAC,UAAU,kBAAkB,CAAC,CAAC,WAAW,KAAK;YACjI,gEAAgE;YAChE,uGAAuG;YACvG,0FAA0F;YAC1F,wGAAwG;YACxG,eAAe,EACf,IAAI,CAAC,aAAa,CAAC,sBAAsB,EAAE,CAAC,CAAC,UAAU,CAAC,EACxD,CAAC,EACD,IAAI,CACL,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACK,yBAAyB,CAAC,CAAqB,EAAE,IAAqB;QAC5E,MAAM,eAAe,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAE7D,IAAI,CAAC,eAAe,CAClB,kCAAkC,CAAC,CAAC,WAAW,wCAAwC,CAAC,CAAC,UAAU,kBAAkB,CAAC,CAAC,WAAW,KAAK;YACvI,uHAAuH;YACvH,sGAAsG;YACtG,sDAAsD,eAAe,EAAE,EACvE,IAAI,CAAC,aAAa,CAAC,sBAAsB,EAAE,CAAC,CAAC,UAAU,CAAC,EACxD,CAAC,EACD,IAAI,CACL,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACK,sBAAsB,CAAC,CAAqB,EAAE,IAAqB;QACzE,MAAM,eAAe,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAE7D,IAAI,CAAC,eAAe,CAClB,kDAAkD,CAAC,CAAC,WAAW,gBAAgB,CAAC,CAAC,UAAU,kBAAkB,CAAC,CAAC,WAAW,KAAK;YAC/H,yHAAyH;YACzH,qHAAqH;YACrH,iBAAiB,CAAC,CAAC,WAAW,sFAAsF;YACpH,6HAA6H;YAC7H,wHAAwH;YACxH,2GAA2G,eAAe,EAAE,EAC5H,IAAI,CAAC,aAAa,CAAC,mBAAmB,EAAE,CAAC,CAAC,UAAU,CAAC,EACrD,CAAC,EACD,IAAI,CACL,CAAC;IACJ,CAAC;IAED;;;;;;;;OAQG;IACK,mBAAmB,CAAC,CAAqB,EAAE,IAAqB;QACtE,MAAM,eAAe,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAE7D,IAAI,CAAC,eAAe,CAClB,mDAAmD,CAAC,CAAC,WAAW,gBAAgB,CAAC,CAAC,UAAU,kBAAkB,CAAC,CAAC,WAAW,KAAK;YAChI,+HAA+H;YAC/H,6GAA6G;YAC7G,oHAAoH;YACpH,+HAA+H;YAC/H,+HAA+H;YAC/H,qCAAqC,eAAe,EAAE,EACtD,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE,CAAC,CAAC,UAAU,CAAC,EAClD,CAAC,EACD,IAAI,CACL,CAAC;IACJ,CAAC;CACF"}
|
package/package.json
CHANGED
package/skills/chorus/SKILL.md
CHANGED
|
@@ -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.16.
|
|
7
|
+
version: "0.16.3"
|
|
8
8
|
category: project-management
|
|
9
9
|
mcp_server: chorus
|
|
10
10
|
---
|
|
@@ -71,7 +71,7 @@ All Agent roles can use the following tools for querying information and collabo
|
|
|
71
71
|
|
|
72
72
|
The checkin response includes **owner/master information** for the agent:
|
|
73
73
|
- `agent.owner`: `{ uuid, name, email }` or `null` — the human user who owns this agent
|
|
74
|
-
- Use the owner info
|
|
74
|
+
- Use the owner info as one @mention target — but hand a finished or gated resource back to whoever engaged you (the human or agent that assigned, @mentioned, or woke you), which is not always your owner
|
|
75
75
|
|
|
76
76
|
#### Project Filtering
|
|
77
77
|
|
|
@@ -197,7 +197,7 @@ Use @mentions to notify specific users or agents. Mention syntax: `@[DisplayName
|
|
|
197
197
|
**When to @mention:**
|
|
198
198
|
- **Elaboration completion** — confirm understanding with the answerer before validating (see `/idea`)
|
|
199
199
|
- **Proposal creation/update** — notify stakeholders when submitting
|
|
200
|
-
- **
|
|
200
|
+
- **Handback & significant decisions** — @mention whoever engaged you (a human, or an agent orchestrator), not only the PM/owner
|
|
201
201
|
- **Blocking issues** — notify relevant person for human input
|
|
202
202
|
|
|
203
203
|
### Search
|
|
@@ -449,6 +449,7 @@ This is the core overview skill. For stage-specific workflows, use:
|
|
|
449
449
|
| Stage | Skill | Description |
|
|
450
450
|
|-------|-------|-------------|
|
|
451
451
|
| **Full Auto** | `/yolo` | Full-auto AI-DLC pipeline — from prompt to done. Automates Idea → Proposal → Execute → Verify with adversarial reviewers |
|
|
452
|
+
| **Orchestration** | `/orchestrate` | Coordinate OTHER agents & humans across the lifecycle — delegate ideas (`chorus_pm_assign_idea`) & tasks, fan a theme out to child ideas, run independent reviewers, and gatekeep the proposal/verify gates |
|
|
452
453
|
| **Quick Dev** | `/quick-dev` | Skip Idea→Proposal, create tasks directly, execute, and verify |
|
|
453
454
|
| **Ideation** | `/idea` | Claim Ideas, run elaboration rounds, prepare for proposal |
|
|
454
455
|
| **Planning** | `/proposal` | Create Proposals with document & task drafts, manage dependency DAG, submit for review |
|
|
@@ -4,7 +4,7 @@ description: Final ship-time review of an Idea's aggregate code change — the w
|
|
|
4
4
|
license: AGPL-3.0
|
|
5
5
|
metadata:
|
|
6
6
|
author: chorus
|
|
7
|
-
version: "0.16.
|
|
7
|
+
version: "0.16.3"
|
|
8
8
|
category: project-management
|
|
9
9
|
mcp_server: chorus
|
|
10
10
|
---
|
|
@@ -56,7 +56,7 @@ Read each task's work report (in its comments) — the developers describe what
|
|
|
56
56
|
**Step 3: Review the whole-feature dimensions** (what per-task review cannot catch — cover each):
|
|
57
57
|
|
|
58
58
|
1. **Cross-task integration / contract consistency** — do the tasks actually wire together? Interface contracts, return formats, error patterns, call points across module boundaries different tasks built.
|
|
59
|
-
2. **Architecture & convention consistency (no drift)** — does the aggregate conform to project patterns, or did
|
|
59
|
+
2. **Architecture & convention consistency (no drift)** — does the aggregate conform to project patterns and the rules its context files declare (CLAUDE.md / AGENTS.md / .cursorrules, if present), or did any task drift from them or violate a declared project-level constraint? Duplicated logic, divergent naming, inconsistent layering.
|
|
60
60
|
3. **Security** — does the combination introduce a security risk (authz gaps at a seam, injection, secret handling, unsafe deserialization, missing tenant scoping) — especially risks visible only when the pieces are seen together.
|
|
61
61
|
4. **Regression risk / impact on untouched areas / performance** — does the change break or degrade code no single task owned? N+1s, hot-path cost, shared-state contention.
|
|
62
62
|
5. **Feature-level test coverage adequacy** — across the whole feature, are integration seams and end-to-end paths tested, or only per-task units? Gaps between tasks.
|
package/skills/develop/SKILL.md
CHANGED
package/skills/docs/SKILL.md
CHANGED
package/skills/idea/SKILL.md
CHANGED
|
@@ -4,7 +4,7 @@ description: Chorus Idea workflow — claim ideas, run elaboration rounds, and p
|
|
|
4
4
|
license: AGPL-3.0
|
|
5
5
|
metadata:
|
|
6
6
|
author: chorus
|
|
7
|
-
version: "0.16.
|
|
7
|
+
version: "0.16.3"
|
|
8
8
|
category: project-management
|
|
9
9
|
mcp_server: chorus
|
|
10
10
|
---
|
|
@@ -41,6 +41,7 @@ All post-elaboration progress (planning, building, verifying, done) is **derived
|
|
|
41
41
|
| `chorus_edit_idea` | Edit an existing idea's title, description, and/or lineage parent. `parentUuid`: another same-project idea to reparent under, `null` to detach to top-level, omit to leave unchanged (cycle-checked + same-project). Single-parent **weak** lineage — a parent shows a read-only `+N derived` rollup but never blocks either idea's flow. Records an "edited" activity and signals presence. |
|
|
42
42
|
| `chorus_claim_idea` | Claim an open idea (open -> elaborating) |
|
|
43
43
|
| `chorus_release_idea` | Release a claimed idea (elaborating -> open) |
|
|
44
|
+
| `chorus_pm_assign_idea` | Assign an idea to an agent (must hold `idea:write`) or a user, on a human's behalf — the counterpart to `chorus_claim_idea` (self-claim). Silently takes over any existing assignee; an `open` idea moves to `elaborating`, any other status is preserved. Optional `instanceUuid` pins an **agent** assignment to a specific AgentInstance (agent-only). Assigning to an agent wakes it best-effort (offline still persists the assignment); assigning to a user notifies them with no daemon wake. Requires `idea:admin`. |
|
|
44
45
|
| `chorus_move_idea` | Move an Idea to a different Project. Cascade-migrates the Idea **and its full lineage subtree** (all descendant Ideas; the moved root is detached from any parent left behind), all linked Proposals (any status), all materialized Documents and Tasks, and all related Activities atomically. Comments, TaskDependency, AcceptanceCriterion, AgentSession, SessionTaskCheckin, Notification history, and Task assignees are NOT modified. Returns `moved: { ideas, proposals, documents, tasks, activities }` counts. Requires `idea:write` only — no project-level checks. |
|
|
45
46
|
|
|
46
47
|
**Requirements Elaboration:**
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: orchestrate
|
|
3
|
+
description: Multi-agent orchestration playbook — coordinate OTHER agents and humans across the AI-DLC lifecycle by delegating ideas and tasks, running independent reviewers, and gatekeeping at the Reversed-Conversation gates.
|
|
4
|
+
license: AGPL-3.0
|
|
5
|
+
metadata:
|
|
6
|
+
author: chorus
|
|
7
|
+
version: "0.16.3"
|
|
8
|
+
category: project-management
|
|
9
|
+
mcp_server: chorus
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Orchestrate Skill
|
|
13
|
+
|
|
14
|
+
This skill is for an **orchestrator** (typically an Admin-preset agent) that coordinates *other* agents and humans across the AI-DLC lifecycle instead of doing all the work itself. The orchestrator decomposes work, hands each piece to a chosen owner, runs independent reviewers as quality gates, and gatekeeps the human-owned approval/verify gates — but never ships on its own.
|
|
15
|
+
|
|
16
|
+
> **Tool namespace under OpenClaw.** Bare tool names below (e.g. `chorus_pm_assign_idea`) are the readable form; the actual callable name is `chorus__`-prefixed (`chorus__chorus_pm_assign_idea`). See the namespace note in the core `chorus` skill.
|
|
17
|
+
|
|
18
|
+
It complements the other skills rather than replacing them:
|
|
19
|
+
|
|
20
|
+
- `/yolo` — **one** agent drives the whole pipeline solo. Orchestration is the opposite: **many** agents, each owning a piece, coordinated by you.
|
|
21
|
+
- `/idea`, `/proposal`, `/develop`, `/review`, `/quick-dev` — a single stage you execute yourself. Orchestration is the layer *above* those: you decide who runs each stage.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## When to use this skill
|
|
26
|
+
|
|
27
|
+
Use it when **more than one agent (or agent + human) will touch the work** and someone has to keep them coherent:
|
|
28
|
+
|
|
29
|
+
- You own a **theme / epic / container idea** that decomposes into several independent child ideas, and you want to hand each child to a specific worker (the motivating case: a theme owner gives one child to Codex, another to a Claude dev agent, another to a human).
|
|
30
|
+
- An approved proposal has a **task DAG** and you want several developer agents working the unblocked tasks in parallel waves.
|
|
31
|
+
- You need an **independent adversarial review** of someone else's proposal / task / feature before it advances.
|
|
32
|
+
- You are the responsible owner and must keep **one accountable assignee per idea** while work fans out.
|
|
33
|
+
|
|
34
|
+
Prerequisite: delegating ideas needs `idea:admin`; delegating tasks needs `proposal:write`. Run `chorus_checkin()` first to confirm your permission set.
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Delegation primitives
|
|
39
|
+
|
|
40
|
+
### Assign an idea — `chorus_pm_assign_idea` (`idea:admin`)
|
|
41
|
+
|
|
42
|
+
Hand a whole idea to a chosen agent or user. Parameters:
|
|
43
|
+
|
|
44
|
+
| Param | Meaning |
|
|
45
|
+
|-------|---------|
|
|
46
|
+
| `ideaUuid` | The idea to delegate |
|
|
47
|
+
| `assigneeType` | `"agent"` or `"user"` |
|
|
48
|
+
| `assigneeUuid` | The chosen agent/user UUID (resolve names with `chorus_search_mentionables`) |
|
|
49
|
+
| `instanceUuid` | *(optional, agent targets only)* pin the work to one durable AgentInstance — the `(agent, host, cwd)` place — so wakes land where the code lives |
|
|
50
|
+
|
|
51
|
+
Behavior you must understand:
|
|
52
|
+
|
|
53
|
+
- **The assignee is woken and advances from the idea's *current* stage** — it does **NOT** re-claim. If the idea is `open` it moves to `elaborating`; any other status is preserved. The assignee picks up wherever the idea already is (elaboration, ready-for-proposal, etc.).
|
|
54
|
+
- **Agent targets must hold `idea:write`** (via a preset such as `pm_agent`/`admin_agent`, or an explicit permission) or the call is rejected. **User targets must be in your company.** `instanceUuid` is rejected for user targets.
|
|
55
|
+
- **Silent takeover.** Reassigning an already-owned idea simply moves ownership to the new assignee — there is one owner at a time, no confirmation prompt. Use this deliberately, not by accident.
|
|
56
|
+
|
|
57
|
+
### Assign a task — `chorus_pm_assign_task` (`proposal:write`)
|
|
58
|
+
|
|
59
|
+
Hand a single task to a developer agent. Parameters: `taskUuid`, `agentUuid` (must hold `task:write`), optional `instanceUuid`. The task must be `open` or `assigned`. The assignee is woken to execute it. Use this to distribute the tasks of an approved proposal.
|
|
60
|
+
|
|
61
|
+
### Derive child ideas and fan them out
|
|
62
|
+
|
|
63
|
+
The theme-decomposition case, end to end:
|
|
64
|
+
|
|
65
|
+
1. Read the container/theme idea and its context (`chorus_get_idea`, `chorus_get_documents`, `chorus_get_comments`).
|
|
66
|
+
2. For each independent slice, create a child idea with `chorus_pm_create_idea` (link it back to the parent in the body / via `references[]`).
|
|
67
|
+
3. Assign each child to a distinct owner with `chorus_pm_assign_idea` — e.g. one child to Codex, one to a Claude dev agent, one to a human. Each child now has its **own single owner** and advances independently.
|
|
68
|
+
4. @mention each assignee and the theme owner so the delegation is visible.
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## Independent review as an adversarial gate
|
|
73
|
+
|
|
74
|
+
Chorus ships three read-only reviewer skills. As orchestrator you run them at the three gates and act on the verdict — this is your primary quality lever when you are not writing the code yourself.
|
|
75
|
+
|
|
76
|
+
| Reviewer skill | Run after | Reviews |
|
|
77
|
+
|----------------|-----------|---------|
|
|
78
|
+
| `/proposal-reviewer` | a proposal is submitted | proposal draft quality (VERDICT on the proposal) |
|
|
79
|
+
| `/task-reviewer` | a task is submitted for verify | one task vs its acceptance criteria (VERDICT on the task) |
|
|
80
|
+
| `/code-reviewer` | the idea's last task is verified | the idea's **aggregate** code change — the final ship gateway (VERDICT on the idea) |
|
|
81
|
+
|
|
82
|
+
Spawn a read-only sub-agent with `sessions_spawn` and instruct it (in the spawn `task`) to run the matching reviewer skill against the entity (pass the `ideaUuid` for code review), then poll for its VERDICT. If spawning is disabled by policy, run the reviewer's procedure yourself as a focused read-only pass and record the VERDICT via `chorus_add_comment`. Each posts exactly one `VERDICT: PASS` / `PASS WITH NOTES` / `FAIL` comment. Verdicts are **advisory** — they do not auto-approve, auto-verify, or hard-block; you read the BLOCKERs and decide. A `FAIL` means route the BLOCKERs back for a fix before advancing (for a code-review FAIL, add fix tasks to the *approved* proposal via `/quick-dev` and re-run once they are `done`). See `/review` for the full pattern.
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## Choosing a collaboration mode
|
|
87
|
+
|
|
88
|
+
Pick the lightest mode that fits the shape of the work:
|
|
89
|
+
|
|
90
|
+
| Mode | Use when | How you run it |
|
|
91
|
+
|------|----------|----------------|
|
|
92
|
+
| **Single-owner drives one idea** | The work is one coherent feature | Assign the idea once (`chorus_pm_assign_idea`); that owner runs idea → proposal → tasks; you gatekeep the gates |
|
|
93
|
+
| **Fan-out children to N agents** | A theme decomposes into independent slices | Derive child ideas, assign each to a distinct owner; children run in parallel, each single-owner |
|
|
94
|
+
| **Parallel task waves** | One approved proposal with a task DAG | Assign the currently-unblocked tasks (`chorus_pm_assign_task`) to several dev agents; as tasks reach `done`, assign the next wave |
|
|
95
|
+
| **Review-only** | Work is already produced elsewhere | Spawn the relevant reviewer, read the VERDICT, and gatekeep — no new delegation |
|
|
96
|
+
|
|
97
|
+
Guidance: start narrow. If a single owner can hold the whole feature in their head, prefer **single-owner** — coordination overhead is not free. Reach for **fan-out** only when slices are genuinely independent (separate scope, separable elaboration). Use **parallel task waves** only after a proposal is approved and its DAG is real; respect dependencies — `to_verify` does **not** unblock downstream, only `done` does.
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## Single-owner & concurrency discipline
|
|
102
|
+
|
|
103
|
+
- **One responsible assignee per idea at a time.** This mirrors the daemon's single-owner semantics: the idea is the authoritative pin root, and its owner's proposals/tasks/wakes inherit that identity. Don't leave an idea ambiguously "owned by the team."
|
|
104
|
+
- **Don't race duplicate sessions on the same work.** Two daemon sessions (or two agents) driving the same idea/task will collide on status transitions and produce conflicting wakes. Assign, then let one owner run.
|
|
105
|
+
- **Pin with `instanceUuid` when the work is tied to a place.** If a child idea's code lives on a specific host/cwd, pin the assignment to that AgentInstance so every downstream wake lands there instead of a random daemon.
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Reversed-Conversation gates (you never auto-ship)
|
|
110
|
+
|
|
111
|
+
Chorus is **AI proposes, humans verify**. As orchestrator you enforce that, you do not bypass it:
|
|
112
|
+
|
|
113
|
+
- **Proposal gate.** When a delegated owner submits a proposal, STOP. Run the proposal reviewer, then hand the approve/reject decision to the human owner. Do not self-approve just because you *can* (`proposal:admin`).
|
|
114
|
+
- **Verify gate.** When a task reaches `to_verify`, STOP. Run the task reviewer, then let the human verify. Permission to verify is not authorization to rubber-stamp your own coordinated work.
|
|
115
|
+
- **Never merge or push.** The orchestrator drives work up to "PR ready" and hands it back to the human — it does not merge, push, or otherwise ship autonomously.
|
|
116
|
+
|
|
117
|
+
@mention the owner at each gate so the handoff is explicit and auditable.
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Derive a child idea vs add a task vs assign directly
|
|
122
|
+
|
|
123
|
+
| Do this | When |
|
|
124
|
+
|---------|------|
|
|
125
|
+
| **Derive a new child idea** (`chorus_pm_create_idea` + assign) | The slice is genuinely separate scope that deserves its own elaboration, proposal, and owner — a theme decomposition, or a parallelizable sub-feature. |
|
|
126
|
+
| **Add a task to an approved proposal** (`chorus_create_tasks` with `proposalUuid`) | The work is a discrete unit of the **same** feature that already has a proposal — e.g. code-review fix tasks, or a follow-up step in an existing DAG. |
|
|
127
|
+
| **Assign the existing idea/task directly** (`chorus_pm_assign_idea` / `chorus_pm_assign_task`) | The work is already scoped and just needs a (different) owner or executor — reassignment, taking over a stalled idea, or distributing existing tasks. |
|
|
128
|
+
|
|
129
|
+
Rule of thumb: **new scope → child idea; same-proposal unit → task; only the owner changes → assign.**
|
package/skills/proposal/SKILL.md
CHANGED
|
@@ -4,7 +4,7 @@ description: Adversarial read-only review of a submitted Chorus proposal — doc
|
|
|
4
4
|
license: AGPL-3.0
|
|
5
5
|
metadata:
|
|
6
6
|
author: chorus
|
|
7
|
-
version: "0.16.
|
|
7
|
+
version: "0.16.3"
|
|
8
8
|
category: project-management
|
|
9
9
|
mcp_server: chorus
|
|
10
10
|
---
|
|
@@ -52,6 +52,7 @@ chorus_get_elaboration({ ideaUuid: "<idea-uuid>" })
|
|
|
52
52
|
- **Tech feasibility**: Does the architecture make sense? Missing auth, race conditions, no error handling?
|
|
53
53
|
- **Module contracts**: If multiple tasks share interfaces, are return formats, error patterns, and call points defined?
|
|
54
54
|
- **Hallucination risk**: Flag any specific external detail that looks LLM-fabricated (API signatures, model IDs, SDK versions, CLI flags, config keys, endpoint paths) as NOTE. The PM is an LLM — it confidently invents plausible-looking specifics.
|
|
55
|
+
- **Project constraints**: If the repo declares project rules in context files (CLAUDE.md / AGENTS.md / .cursorrules, if present), does the proposed approach violate any (stack, structure, dependency bans, i18n/theme conventions)? Conflict → BLOCKER.
|
|
55
56
|
|
|
56
57
|
**Step 3: Review task drafts** — for each task draft, check:
|
|
57
58
|
- **Granularity**: Each task should be cohesive and independently testable. 2–10 AC items is the sweet spot.
|
package/skills/review/SKILL.md
CHANGED
|
@@ -4,7 +4,7 @@ description: Adversarial verification of a submitted Chorus task against its AC
|
|
|
4
4
|
license: AGPL-3.0
|
|
5
5
|
metadata:
|
|
6
6
|
author: chorus
|
|
7
|
-
version: "0.16.
|
|
7
|
+
version: "0.16.3"
|
|
8
8
|
category: project-management
|
|
9
9
|
mcp_server: chorus
|
|
10
10
|
---
|
|
@@ -50,7 +50,7 @@ chorus_get_document({ documentUuid: "<doc-uuid>" })
|
|
|
50
50
|
|
|
51
51
|
**Step 3: Verify each AC independently.** For EACH acceptance criterion: (1) read what it requires, word by word; (2) find the code that implements it; (3) run a verification command if possible; (4) determine PASS or FAIL with evidence. Do NOT batch AC as "all look good." Check each one.
|
|
52
52
|
|
|
53
|
-
**Step 4: Cross-reference with proposal documents.** Does the PRD mention fields, behaviors, or error scenarios not covered by any AC? Does the tech design specify contracts the code doesn't follow?
|
|
53
|
+
**Step 4: Cross-reference with proposal documents.** Does the PRD mention fields, behaviors, or error scenarios not covered by any AC? Does the tech design specify contracts the code doesn't follow? **Project constraints:** read the repo's context files (CLAUDE.md / AGENTS.md / .cursorrules, if present); code that violates a declared project-level rule → BLOCKER.
|
|
54
54
|
|
|
55
55
|
**Step 5: Run tests/build if available.** A broken build or failing tests is an automatic FAIL. Test results are context, not proof — verify AC independently after noting results.
|
|
56
56
|
|
package/skills/yolo/SKILL.md
CHANGED
package/src/event-router.ts
CHANGED
|
@@ -63,6 +63,14 @@ interface NotificationDetail {
|
|
|
63
63
|
actorType: string;
|
|
64
64
|
actorUuid: string;
|
|
65
65
|
actorName: string;
|
|
66
|
+
/**
|
|
67
|
+
* The agent orchestrator for this resource (server read-projection,
|
|
68
|
+
* add-agent-orchestrator-handoff). Present only when the resource was assigned by an
|
|
69
|
+
* agent; null/absent for human-assigned or unattributed resources. Mirrors the
|
|
70
|
+
* daemon's cli/prompts.mjs `orchestrator` field so buildOrchestratorGuidance can
|
|
71
|
+
* inject the same handback instruction the daemon does.
|
|
72
|
+
*/
|
|
73
|
+
orchestrator?: { type: string; uuid: string; name: string } | null;
|
|
66
74
|
}
|
|
67
75
|
|
|
68
76
|
export class ChorusEventRouter {
|
|
@@ -228,12 +236,48 @@ export class ChorusEventRouter {
|
|
|
228
236
|
);
|
|
229
237
|
}
|
|
230
238
|
|
|
239
|
+
/**
|
|
240
|
+
* Orchestrator-handoff guidance for a wake — the OpenClaw twin of the daemon's
|
|
241
|
+
* orchestratorGuidance in cli/prompts.mjs. KEEP THE TWO WORDINGS IN SYNC. Returns
|
|
242
|
+
* null unless the resource has an AGENT orchestrator; a human-assigned resource
|
|
243
|
+
* hands back to the human via the actor @mention above (buildMentionGuidance).
|
|
244
|
+
*/
|
|
245
|
+
private buildOrchestratorGuidance(n: NotificationDetail): string | null {
|
|
246
|
+
if (n.orchestrator?.type !== "agent") return null;
|
|
247
|
+
return (
|
|
248
|
+
`Your orchestrator for this resource is @${n.orchestrator.name}.\n` +
|
|
249
|
+
`At a human-only gate you cannot cross, or when this child resource is complete, hand control ` +
|
|
250
|
+
`back by commenting on the resource and mentioning ` +
|
|
251
|
+
`@[${n.orchestrator.name}](agent:${n.orchestrator.uuid}) with the decision needed or completion ` +
|
|
252
|
+
`evidence, then leave any human-gated resource pending and end the turn. Do not @mention the ` +
|
|
253
|
+
`orchestrator for ordinary internal progress.`
|
|
254
|
+
);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* Append orchestrator-handoff guidance (when the resource has an agent orchestrator)
|
|
259
|
+
* to a wake message and dispatch it. Every handler routes its wake through this so the
|
|
260
|
+
* handback instruction rides EVERY action — parity with the daemon, which appends
|
|
261
|
+
* orchestratorGuidance once in buildPrompt (cli/prompts.mjs). No orchestrator → the
|
|
262
|
+
* message is dispatched unchanged.
|
|
263
|
+
*/
|
|
264
|
+
private wakeWithHandoff(
|
|
265
|
+
message: string,
|
|
266
|
+
contextKey: string,
|
|
267
|
+
n: NotificationDetail,
|
|
268
|
+
attr: WakeAttribution,
|
|
269
|
+
): void {
|
|
270
|
+
const handoff = this.buildOrchestratorGuidance(n);
|
|
271
|
+
this.wake(handoff ? `${message}\n\n${handoff}` : message, contextKey, attr);
|
|
272
|
+
}
|
|
273
|
+
|
|
231
274
|
private handleTaskAssigned(n: NotificationDetail, attr: WakeAttribution): void {
|
|
232
275
|
const mentionGuidance = this.buildMentionGuidance(n, "task");
|
|
233
276
|
|
|
234
|
-
this.
|
|
277
|
+
this.wakeWithHandoff(
|
|
235
278
|
`[Chorus] Task assigned: ${n.entityTitle}. Task UUID: ${n.entityUuid}, Project UUID: ${n.projectUuid}. Use chorus_get_task to review the task, then chorus_claim_task to start work.\n${mentionGuidance}`,
|
|
236
279
|
this.contextKeyFor("task_assigned", n.entityUuid),
|
|
280
|
+
n,
|
|
237
281
|
attr
|
|
238
282
|
);
|
|
239
283
|
}
|
|
@@ -241,19 +285,21 @@ export class ChorusEventRouter {
|
|
|
241
285
|
private handleMentioned(n: NotificationDetail, attr: WakeAttribution): void {
|
|
242
286
|
const mentionGuidance = this.buildMentionGuidance(n, n.entityType);
|
|
243
287
|
|
|
244
|
-
this.
|
|
288
|
+
this.wakeWithHandoff(
|
|
245
289
|
`[Chorus] You were @mentioned in ${n.entityType} '${n.entityTitle}' (entityType: ${n.entityType}, entityUuid: ${n.entityUuid}, projectUuid: ${n.projectUuid}): ${n.message}\n` +
|
|
246
290
|
`Review the ${n.entityType} content and use chorus_get_comments (targetType: "${n.entityType}", targetUuid: "${n.entityUuid}") to see the full conversation, then respond.\n` +
|
|
247
291
|
mentionGuidance,
|
|
248
292
|
this.contextKeyFor("mentioned", n.entityUuid),
|
|
293
|
+
n,
|
|
249
294
|
attr
|
|
250
295
|
);
|
|
251
296
|
}
|
|
252
297
|
|
|
253
298
|
private handleElaborationRequested(n: NotificationDetail, attr: WakeAttribution): void {
|
|
254
|
-
this.
|
|
299
|
+
this.wakeWithHandoff(
|
|
255
300
|
`[Chorus] Elaboration requested for idea '${n.entityTitle}' (ideaUuid: ${n.entityUuid}, projectUuid: ${n.projectUuid}). Use chorus_get_elaboration to review questions.`,
|
|
256
301
|
this.contextKeyFor("elaboration_requested", n.entityUuid),
|
|
302
|
+
n,
|
|
257
303
|
attr
|
|
258
304
|
);
|
|
259
305
|
}
|
|
@@ -261,12 +307,13 @@ export class ChorusEventRouter {
|
|
|
261
307
|
private handleProposalRejected(n: NotificationDetail, attr: WakeAttribution): void {
|
|
262
308
|
const mentionGuidance = this.buildMentionGuidance(n, "proposal");
|
|
263
309
|
|
|
264
|
-
this.
|
|
310
|
+
this.wakeWithHandoff(
|
|
265
311
|
`[Chorus] Proposal '${n.entityTitle}' was REJECTED (proposalUuid: ${n.entityUuid}, projectUuid: ${n.projectUuid}). Review note: "${n.message}". ` +
|
|
266
312
|
`Use chorus_get_proposal to review the proposal, then fix issues with chorus_update_task_draft / chorus_update_document_draft. ` +
|
|
267
313
|
`After fixing, call chorus_validate_proposal then chorus_submit_proposal to resubmit.\n` +
|
|
268
314
|
mentionGuidance,
|
|
269
315
|
this.contextKeyFor("proposal_rejected", n.entityUuid),
|
|
316
|
+
n,
|
|
270
317
|
attr
|
|
271
318
|
);
|
|
272
319
|
}
|
|
@@ -275,32 +322,46 @@ export class ChorusEventRouter {
|
|
|
275
322
|
const mentionGuidance = this.buildMentionGuidance(n, "proposal");
|
|
276
323
|
|
|
277
324
|
const reviewInfo = n.message.includes("Note: ") ? ` Review note: "${n.message.split("Note: ").pop()}"` : "";
|
|
278
|
-
this.
|
|
325
|
+
this.wakeWithHandoff(
|
|
279
326
|
`[Chorus] Proposal '${n.entityTitle}' was APPROVED (proposalUuid: ${n.entityUuid}, projectUuid: ${n.projectUuid})!${reviewInfo} Documents and tasks have been created. ` +
|
|
280
327
|
`Use chorus_get_available_tasks with projectUuid: "${n.projectUuid}" to see the new tasks ready for work.\n` +
|
|
281
328
|
mentionGuidance,
|
|
282
329
|
this.contextKeyFor("proposal_approved", n.entityUuid),
|
|
330
|
+
n,
|
|
283
331
|
attr
|
|
284
332
|
);
|
|
285
333
|
}
|
|
286
334
|
|
|
335
|
+
/**
|
|
336
|
+
* An idea was assigned to this agent. The assignment ALREADY set the assignee, so there is
|
|
337
|
+
* nothing to claim — chorus_claim_idea would throw (AlreadyClaimedError, and a hard "Cannot
|
|
338
|
+
* claim an elaborated Idea" for the elaborated-backfill case). Do NOT emit a claim
|
|
339
|
+
* instruction; tell the already-assigned agent to review and advance from the idea's CURRENT
|
|
340
|
+
* stage, stopping at the human proposal/verify gates, and name the assigner via
|
|
341
|
+
* n.actorName / n.actorType. Mirrors the daemon's cli/prompts.mjs `idea_claimed` case
|
|
342
|
+
* (plugin voice; no headless preamble) — KEEP THE TWO WORDINGS IN SYNC.
|
|
343
|
+
*/
|
|
287
344
|
private handleIdeaClaimed(n: NotificationDetail, attr: WakeAttribution): void {
|
|
288
345
|
const mentionGuidance = this.buildMentionGuidance(n, "idea");
|
|
289
346
|
|
|
290
|
-
this.
|
|
291
|
-
`[Chorus] Idea '${n.entityTitle}'
|
|
292
|
-
`Use chorus_get_idea to review
|
|
347
|
+
this.wakeWithHandoff(
|
|
348
|
+
`[Chorus] Idea '${n.entityTitle}' was assigned to you by ${n.actorName} (${n.actorType}) (ideaUuid: ${n.entityUuid}, projectUuid: ${n.projectUuid}). ` +
|
|
349
|
+
`You are now the assignee — no need to claim it. Use chorus_get_idea to review it, then advance it from its CURRENT stage: ` +
|
|
350
|
+
`if it is still elaborating, run or continue elaboration; if it is already elaborated, author the proposal. ` +
|
|
351
|
+
`Stop at the human proposal/verify gates and never merge automatically.\n` +
|
|
293
352
|
mentionGuidance,
|
|
294
353
|
this.contextKeyFor("idea_claimed", n.entityUuid),
|
|
354
|
+
n,
|
|
295
355
|
attr
|
|
296
356
|
);
|
|
297
357
|
}
|
|
298
358
|
|
|
299
359
|
private handleTaskVerified(n: NotificationDetail, attr: WakeAttribution): void {
|
|
300
|
-
this.
|
|
360
|
+
this.wakeWithHandoff(
|
|
301
361
|
`[Chorus] Task '${n.entityTitle}' has been verified and is now done (taskUuid: ${n.entityUuid}, projectUuid: ${n.projectUuid}). ` +
|
|
302
362
|
`Check if this unblocks other tasks: use chorus_get_unblocked_tasks with projectUuid "${n.projectUuid}" to find tasks that are now ready to start.`,
|
|
303
363
|
this.contextKeyFor("task_verified", n.entityUuid),
|
|
364
|
+
n,
|
|
304
365
|
attr
|
|
305
366
|
);
|
|
306
367
|
}
|
|
@@ -308,10 +369,11 @@ export class ChorusEventRouter {
|
|
|
308
369
|
private handleTaskReopened(n: NotificationDetail, attr: WakeAttribution): void {
|
|
309
370
|
const mentionGuidance = this.buildMentionGuidance(n, "task");
|
|
310
371
|
|
|
311
|
-
this.
|
|
372
|
+
this.wakeWithHandoff(
|
|
312
373
|
`[Chorus] Task '${n.entityTitle}' has been reopened and needs rework (taskUuid: ${n.entityUuid}, projectUuid: ${n.projectUuid}). ` +
|
|
313
374
|
`Use chorus_get_task to review the task and chorus_get_comments to see verification feedback, then fix the issues.\n${mentionGuidance}`,
|
|
314
375
|
this.contextKeyFor("task_reopened", n.entityUuid),
|
|
376
|
+
n,
|
|
315
377
|
attr
|
|
316
378
|
);
|
|
317
379
|
}
|
|
@@ -319,7 +381,7 @@ export class ChorusEventRouter {
|
|
|
319
381
|
private handleElaborationAnswered(n: NotificationDetail, attr: WakeAttribution): void {
|
|
320
382
|
const mentionGuidance = this.buildMentionGuidance(n, "idea");
|
|
321
383
|
|
|
322
|
-
this.
|
|
384
|
+
this.wakeWithHandoff(
|
|
323
385
|
`[Chorus] Elaboration answers submitted for idea '${n.entityTitle}' (ideaUuid: ${n.entityUuid}, projectUuid: ${n.projectUuid}). ` +
|
|
324
386
|
`Review the answers with chorus_get_elaboration, then either:\n` +
|
|
325
387
|
`- Call chorus_validate_elaboration with empty issues [] to resolve and proceed to proposal creation\n` +
|
|
@@ -327,6 +389,7 @@ export class ChorusEventRouter {
|
|
|
327
389
|
`After reviewing, @mention the answerer to ask if they have any further questions before you proceed.\n` +
|
|
328
390
|
mentionGuidance,
|
|
329
391
|
this.contextKeyFor("elaboration_answered", n.entityUuid),
|
|
392
|
+
n,
|
|
330
393
|
attr
|
|
331
394
|
);
|
|
332
395
|
}
|
|
@@ -341,12 +404,13 @@ export class ChorusEventRouter {
|
|
|
341
404
|
private handleElaborationVerified(n: NotificationDetail, attr: WakeAttribution): void {
|
|
342
405
|
const mentionGuidance = this.buildMentionGuidance(n, "idea");
|
|
343
406
|
|
|
344
|
-
this.
|
|
407
|
+
this.wakeWithHandoff(
|
|
345
408
|
`[Chorus] Elaboration for idea '${n.entityTitle}' was VERIFIED by a human (ideaUuid: ${n.entityUuid}, projectUuid: ${n.projectUuid}). ` +
|
|
346
409
|
`The idea is now elaborated — do NOT answer elaboration questions. Proceed to WRITE THE PROPOSAL: gather context with ` +
|
|
347
410
|
`chorus_get_idea and chorus_get_elaboration, then author the proposal via the existing proposal flow ` +
|
|
348
411
|
`(chorus_pm_create_proposal / the proposal skill).\n${mentionGuidance}`,
|
|
349
412
|
this.contextKeyFor("elaboration_verified", n.entityUuid),
|
|
413
|
+
n,
|
|
350
414
|
attr
|
|
351
415
|
);
|
|
352
416
|
}
|
|
@@ -361,7 +425,7 @@ export class ChorusEventRouter {
|
|
|
361
425
|
private handleStartDevelopment(n: NotificationDetail, attr: WakeAttribution): void {
|
|
362
426
|
const mentionGuidance = this.buildMentionGuidance(n, "idea");
|
|
363
427
|
|
|
364
|
-
this.
|
|
428
|
+
this.wakeWithHandoff(
|
|
365
429
|
`[Chorus] A human started DEVELOPMENT for idea '${n.entityTitle}' (ideaUuid: ${n.entityUuid}, projectUuid: ${n.projectUuid}). ` +
|
|
366
430
|
`The idea's proposal is approved and unfinished tasks remain. Claim and execute ALL remaining tasks of that proposal in ` +
|
|
367
431
|
`dependency order, following the develop workflow: repeatedly find claimable tasks (chorus_get_unblocked_tasks with ` +
|
|
@@ -370,6 +434,7 @@ export class ChorusEventRouter {
|
|
|
370
434
|
`Do NOT stop after one task. Leave tasks already in to_verify (awaiting human verification) and tasks claimed by other ` +
|
|
371
435
|
`sessions untouched. If nothing is claimable, post a brief status comment on the idea and end the turn.\n${mentionGuidance}`,
|
|
372
436
|
this.contextKeyFor("start_development", n.entityUuid),
|
|
437
|
+
n,
|
|
373
438
|
attr
|
|
374
439
|
);
|
|
375
440
|
}
|
|
@@ -386,7 +451,7 @@ export class ChorusEventRouter {
|
|
|
386
451
|
private handleYoloRequested(n: NotificationDetail, attr: WakeAttribution): void {
|
|
387
452
|
const mentionGuidance = this.buildMentionGuidance(n, "idea");
|
|
388
453
|
|
|
389
|
-
this.
|
|
454
|
+
this.wakeWithHandoff(
|
|
390
455
|
`[Chorus] A human requested a YOLO run for idea '${n.entityTitle}' (ideaUuid: ${n.entityUuid}, projectUuid: ${n.projectUuid}). ` +
|
|
391
456
|
`Drive this idea all the way to done following the yolo skill (the full-auto AI-DLC pipeline: Idea → Elaboration → Proposal → ` +
|
|
392
457
|
`Execute → Verify). First read the idea's current state with chorus_get_idea (plus chorus_get_elaboration / ` +
|
|
@@ -395,6 +460,7 @@ export class ChorusEventRouter {
|
|
|
395
460
|
`and so on. Complete the pipeline through the final done state and completion report, but do NOT merge or push a pull request ` +
|
|
396
461
|
`without explicit human approval.\n${mentionGuidance}`,
|
|
397
462
|
this.contextKeyFor("yolo_requested", n.entityUuid),
|
|
463
|
+
n,
|
|
398
464
|
attr
|
|
399
465
|
);
|
|
400
466
|
}
|