@yemi33/minions 0.1.2454 → 0.1.2455

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.
Files changed (41) hide show
  1. package/bin/install-internal-minions.js +136 -6
  2. package/bin/minions.js +27 -13
  3. package/dashboard/js/agent-identity.js +121 -0
  4. package/dashboard/js/modal.js +4 -0
  5. package/dashboard/js/refresh.js +38 -3
  6. package/dashboard/js/render-agents.js +14 -2
  7. package/dashboard/js/render-dispatch.js +2 -2
  8. package/dashboard/js/render-other.js +147 -13
  9. package/dashboard/js/render-prd.js +6 -5
  10. package/dashboard/js/render-prs.js +1 -1
  11. package/dashboard/js/render-work-items.js +436 -21
  12. package/dashboard/js/utils.js +40 -0
  13. package/dashboard/pages/tools.html +1 -0
  14. package/dashboard/pages/work.html +13 -0
  15. package/dashboard/styles.css +73 -0
  16. package/dashboard-build.js +2 -2
  17. package/dashboard.js +93 -7
  18. package/docs/README.md +1 -0
  19. package/docs/copilot-cli-schema.md +1 -0
  20. package/docs/engine-restart.md +4 -2
  21. package/docs/internal-install.md +44 -5
  22. package/docs/named-agents.md +48 -0
  23. package/docs/runtime-adapters.md +39 -0
  24. package/docs/temporary-agents.md +172 -0
  25. package/engine/ado/comment.js +261 -4
  26. package/engine/agents/llm.js +26 -0
  27. package/engine/agents/playbook.js +2 -1
  28. package/engine/core/queries.js +27 -2
  29. package/engine/core/shared.js +148 -1
  30. package/engine/operations/cli.js +102 -1
  31. package/engine/orchestration/lifecycle.js +7 -0
  32. package/engine/orchestration/routing.js +4 -1
  33. package/engine/providers/gh-comment.js +159 -0
  34. package/engine/recovery/stop-stack.js +16 -2
  35. package/engine/runtimes/claude.js +3 -0
  36. package/engine/runtimes/codex.js +4 -0
  37. package/engine/runtimes/copilot.js +23 -2
  38. package/engine.js +2 -2
  39. package/package.json +1 -1
  40. package/playbooks/fix.md +23 -2
  41. package/playbooks/shared-rules.md +24 -2
package/engine.js CHANGED
@@ -11706,7 +11706,7 @@ function discoverFromWorkItems(config, project) {
11706
11706
  newWork.push({
11707
11707
  type: workType,
11708
11708
  agent: agentId,
11709
- agentName: config.agents[agentId]?.name || tempAgents.get(agentId)?.name || agentId,
11709
+ agentName: config.agents[agentId]?.name || tempAgents.get(agentId)?.name || shared.tempAgentCallSign(agentId) || agentId,
11710
11710
  agentRole: config.agents[agentId]?.role || tempAgents.get(agentId)?.role || 'Agent',
11711
11711
  task: `[${project?.name || 'project'}] ${item.title || item.description?.slice(0, 80) || item.id}`,
11712
11712
  prompt,
@@ -12952,7 +12952,7 @@ function resolvePendingDispatchAgent(item, config) {
12952
12952
  function assignPendingDispatchAgent(item, agentId, config) {
12953
12953
  const agents = config.agents || {};
12954
12954
  item.agent = agentId;
12955
- item.agentName = agents[agentId]?.name || tempAgents.get(agentId)?.name || agentId;
12955
+ item.agentName = agents[agentId]?.name || tempAgents.get(agentId)?.name || shared.tempAgentCallSign(agentId) || agentId;
12956
12956
  item.agentRole = agents[agentId]?.role || tempAgents.get(agentId)?.role || 'Agent';
12957
12957
  delete item._agentBusySince;
12958
12958
  delete item.skipReason;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.2454",
3
+ "version": "0.1.2455",
4
4
  "description": "Multi-agent AI dev team that runs from ~/.minions/ — five autonomous agents share a single engine, dashboard, and knowledge base",
5
5
  "bin": {
6
6
  "minions": "bin/minions.js"
package/playbooks/fix.md CHANGED
@@ -232,8 +232,29 @@ Pick the disposition that matches the finding and post the matching reply, then
232
232
  - **Won't fix / disagree** (comment is invalid, stale, already addressed, out of scope, or harmful) → Reply with the evidence-backed rationale explaining why no code change was made. Leave the thread **active** for the reviewer to decide; do NOT resolve unilaterally.
233
233
 
234
234
  Host-specific mechanics:
235
- - **GitHub**: Reply to each review comment, then resolve the conversation for the four resolve-eligible dispositions above. Leave Won't-fix threads unresolved.
236
- - **ADO**: Use `az` CLI first to reply to each thread and update status when supported; use ADO MCP only as a fallback when `az` is unavailable or insufficient. Set status to `fixed` for Fixed/Satisfied-elsewhere/Tracked-as-follow-up and `closed` for Deferred; leave `active` for Won't-fix rationale replies.
235
+ - **Preferred (both hosts): reply on the ORIGINATING thread and resolve it in one call** with
236
+ `minions pr comment <repo> --thread <threadId> --resolve --agent <id> --kind fix [--wi <finding-id>] --body-file <path>`
237
+ (ADO: add `--host ado --ado-org … --ado-project … --repo-id …` and, for Deferred, `--resolve-status closed`;
238
+ GitHub: `--thread` is the review-thread GraphQL node id). The `--thread` id is the **structured thread/finding
239
+ identity carried on the work item / your `reviewFindingResolution` evidence** — never resolve by matching title or
240
+ body text, and never resolve sibling threads or all threads in bulk. This path is idempotent: re-running after a
241
+ retry, restart, or a provider timeout re-checks the thread, skips a reply it already posted (matched by the hidden
242
+ minions marker), and re-attempts only the unfinished resolve.
243
+ - **Do NOT open a fresh active thread to summarize an addressed finding.** A new top-level/active thread for a fix
244
+ you already made just adds triage noise the author must re-close. Post the summary as a reply on the finding's own
245
+ thread via `--thread … --resolve` above.
246
+ - **GitHub**: `--thread … --resolve` replies to the review thread and resolves it via `resolveReviewThread` for the
247
+ four resolve-eligible dispositions. Leave Won't-fix threads unresolved. If no review-thread id exists (the finding
248
+ was a top-level conversation comment), a top-level `minions pr comment` reply is informational only — GitHub has no
249
+ resolved state for conversation comments, so do **not** claim it is "resolved."
250
+ - **ADO**: `--thread … --resolve` posts the reply on the originating thread and transitions it (`fixed` for
251
+ Fixed/Satisfied-elsewhere/Tracked-as-follow-up, `--resolve-status closed` for Deferred). Prefer it over raw `az`;
252
+ if you must fall back, use `az` first (ADO MCP only when `az` is insufficient), reply on the existing thread, and
253
+ set its status — do not create a new thread just for the fix summary. Leave `active` for Won't-fix rationale replies.
254
+
255
+ Never auto-resolve a finding the agent did NOT actually address. When the fix report says the finding was not
256
+ addressed, is ambiguous, needs human input, or lacks the required commit/`file:line` resolution evidence, reply with
257
+ the rationale and leave the thread **active**. Human feedback is not auto-resolved merely because a dispatch completed.
237
258
 
238
259
  Hard rule: never resolve, close, or mark-fixed a thread without first posting a reply that explains the disposition. The chunk-5 / Caleb-Tseng / MaiLibraryViewModel thread (ADO 5215549 thread 65692221) is the canonical bad example — closed silently with no audit trail.
239
260
 
@@ -262,6 +262,18 @@ non-actionable thread is posted pre-resolved in a single call. Prefer
262
262
  thread `status` field yourself: `closed` (4) for non-actionable notes (or `fixed`
263
263
  (2) when the comment records something already handled), `active` (1) for
264
264
  actionable findings. The verdict/summary comment itself stays `active`.
265
+
266
+ **Fix summaries reply on the originating thread — never a new active thread.**
267
+ When you are recording that an existing review finding was *addressed*, reply on
268
+ that finding's own thread and transition it, rather than opening a fresh thread:
269
+ `minions pr comment <pr> --host ado --ado-org … --ado-project … --repo-id … --thread <threadId> --resolve [--resolve-status closed] --agent <id> --kind fix [--wi <finding-id>] --body-file <path>`.
270
+ The `--thread` id is **structured thread/finding identity** from the work item or
271
+ your `reviewFindingResolution` evidence — resolve only that thread, keyed by id,
272
+ never by matching comment title/body text and never in bulk across sibling
273
+ threads. The reply+status transition is idempotent across retries/restarts: it
274
+ re-reads the thread, skips a reply already carrying your minions marker, and only
275
+ re-applies the status if the earlier PATCH failed — so a partial failure stays
276
+ visible and retryable instead of being silently marked resolved locally.
265
277
  {{/ado_shared_rules}}
266
278
  {{#github_shared_rules}}
267
279
  **GitHub mechanism.** GitHub has no "resolved" state for PR *conversation*
@@ -273,9 +285,19 @@ single API call that creates a thread pre-resolved. So on GitHub:
273
285
  `<details><summary>Non-blocking observations</summary>…</details>` block inside
274
286
  the verdict comment so they are visible but de-emphasized and create no separate
275
287
  unresolved threads. `--resolved` is rejected on the GitHub path for this reason.
288
+ - **To record that an existing review finding was addressed**, reply on that
289
+ finding's own review thread and resolve it in one idempotent call:
290
+ `minions pr comment <repo> --thread <reviewThreadNodeId> --resolve --agent <id> --kind fix [--wi <finding-id>] --body-file <path>`.
291
+ The `--thread` node id is **structured thread identity** from the work item or
292
+ your `reviewFindingResolution` evidence — resolve only that thread, never by
293
+ matching comment text and never in bulk. Do **not** open a fresh active thread
294
+ to summarize a fix you already made. If the finding was a *top-level*
295
+ conversation comment (no review-thread node id), a top-level `minions pr comment`
296
+ reply is informational only — never call it "resolved."
276
297
  - If you DO post a non-actionable note as its own **inline review thread**, resolve
277
- it immediately after posting via the GraphQL `resolveReviewThread` mutation
278
- (issue comments cannot be resolved this way; only review threads can):
298
+ it immediately after posting (equivalent to `--thread … --resolve`, or the raw
299
+ GraphQL `resolveReviewThread` mutation below; issue comments cannot be resolved
300
+ this way, only review threads can):
279
301
  ```bash
280
302
  # 1. find the thread node id for the comment you just posted
281
303
  gh api graphql -f query='query($owner:String!,$repo:String!,$pr:Int!){