@yemi33/minions 0.1.2423 → 0.1.2425

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 (184) hide show
  1. package/bin/install-internal-minions.js +1209 -0
  2. package/bin/minions.js +75 -9
  3. package/dashboard/docs/typography.md +27 -12
  4. package/dashboard/js/command-center.js +13 -11
  5. package/dashboard/js/live-stream.js +1 -1
  6. package/dashboard/js/memory-search.js +388 -43
  7. package/dashboard/js/modal-qa.js +5 -5
  8. package/dashboard/js/qa.js +39 -26
  9. package/dashboard/js/refresh.js +37 -18
  10. package/dashboard/js/render-agents.js +14 -18
  11. package/dashboard/js/render-dispatch.js +14 -74
  12. package/dashboard/js/render-inbox.js +3 -3
  13. package/dashboard/js/render-meetings.js +8 -8
  14. package/dashboard/js/render-other.js +45 -20
  15. package/dashboard/js/render-pipelines.js +6 -6
  16. package/dashboard/js/render-plans.js +14 -14
  17. package/dashboard/js/render-prd.js +46 -46
  18. package/dashboard/js/render-prs.js +9 -65
  19. package/dashboard/js/render-schedules.js +5 -5
  20. package/dashboard/js/render-skills.js +6 -6
  21. package/dashboard/js/render-utils.js +4 -4
  22. package/dashboard/js/render-watches.js +4 -16
  23. package/dashboard/js/render-work-items.js +95 -107
  24. package/dashboard/js/settings.js +175 -74
  25. package/dashboard/layout.html +3 -2
  26. package/dashboard/pages/inbox.html +1 -1
  27. package/dashboard/pages/work.html +1 -1
  28. package/dashboard/shared/model-display.js +9 -0
  29. package/dashboard/shared/watches-source.js +43 -0
  30. package/dashboard/shared/welcome-popup.js +259 -0
  31. package/dashboard/slim/body.html +6 -6
  32. package/dashboard/slim/js/chat.js +4 -2
  33. package/dashboard/slim/js/history.js +10 -3
  34. package/dashboard/slim/js/modals-tiles.js +85 -16
  35. package/dashboard/slim/js/status.js +12 -16
  36. package/dashboard/slim/styles.css +24 -4
  37. package/dashboard/styles.css +62 -27
  38. package/dashboard-build.js +8 -2
  39. package/dashboard.js +3854 -2514
  40. package/docs/README.md +6 -4
  41. package/docs/api-errors.md +144 -0
  42. package/docs/auto-discovery.md +83 -61
  43. package/docs/capture-demos.js +173 -30
  44. package/docs/command-center.md +5 -1
  45. package/docs/completion-reports.md +127 -11
  46. package/docs/constants.md +15 -3
  47. package/docs/constellation-style-telemetry.md +2 -2
  48. package/docs/copilot-cli-schema.md +32 -22
  49. package/docs/cross-repo-plans.md +30 -30
  50. package/docs/demo/memory-system.html +1 -1
  51. package/docs/deprecated.json +132 -18
  52. package/docs/diagnostics-memory.md +8 -4
  53. package/docs/human-vs-automated.md +2 -2
  54. package/docs/internal-install.md +190 -0
  55. package/docs/kb-pr3223-cascade-archiving.md +16 -0
  56. package/docs/kb-pr696-merge-conflict-docs.md +23 -0
  57. package/docs/kb-sweep.md +2 -2
  58. package/docs/keep-processes.md +8 -1
  59. package/docs/live-checkout-mode.md +12 -7
  60. package/docs/managed-spawn.md +21 -3
  61. package/docs/named-agents.md +3 -2
  62. package/docs/plan-lifecycle.md +32 -32
  63. package/docs/pr-auto-fix-dispatch.md +3 -3
  64. package/docs/pr-review-fix-loop.md +6 -6
  65. package/docs/pr-screenshots/pr-899/worker-pool-worktrees-AFTER.png +0 -0
  66. package/docs/pr-screenshots/pr-899/worker-pool-worktrees-BEFORE.png +0 -0
  67. package/docs/pr-screenshots/pr-979/auto-fix-pane-AFTER.png +0 -0
  68. package/docs/pr-screenshots/pr-979/auto-fix-pane-BEFORE.png +0 -0
  69. package/docs/pr-screenshots/pr-985/pr-column-em-dash-AFTER.png +0 -0
  70. package/docs/pr-screenshots/pr-985/pr-column-em-dash-BEFORE.png +0 -0
  71. package/docs/qa-runbook-lifecycle.md +67 -51
  72. package/docs/qa-runbooks.md +2 -2
  73. package/docs/runtime-adapters.md +101 -50
  74. package/docs/security.md +28 -0
  75. package/docs/self-improvement.md +47 -13
  76. package/docs/skills.md +29 -0
  77. package/docs/slim-ux/concepts.md +2 -2
  78. package/docs/specs/agent-configurability.md +43 -41
  79. package/docs/specs/agent-rename.md +13 -13
  80. package/docs/team-memory.md +283 -14
  81. package/docs/tutorials/03-plan-driven-feature.md +3 -3
  82. package/docs/tutorials/04-runtimes-and-harness.md +18 -21
  83. package/docs/tutorials/08-operations-and-recovery.md +3 -2
  84. package/docs/tutorials/README.md +4 -3
  85. package/docs/visual-evidence-ci.md +103 -0
  86. package/docs/watches.md +35 -30
  87. package/docs/worktree-lifecycle.md +151 -13
  88. package/engine/acp-transport.js +1 -0
  89. package/engine/ado.js +80 -33
  90. package/engine/agent-api-validation.js +571 -0
  91. package/engine/agent-worker-pool.js +7 -6
  92. package/engine/api-contracts/agent-content.js +761 -0
  93. package/engine/api-contracts/cc-ops.js +219 -0
  94. package/engine/api-contracts/config-runtime.js +419 -0
  95. package/engine/api-contracts/core.js +138 -0
  96. package/engine/api-contracts/index.js +506 -0
  97. package/engine/api-contracts/orchestration.js +602 -0
  98. package/engine/api-contracts/pull-requests.js +323 -0
  99. package/engine/api-contracts/qa-process.js +764 -0
  100. package/engine/api-contracts/work-plan-prd.js +494 -0
  101. package/engine/api-validation.js +543 -0
  102. package/engine/cc-api-validation.js +586 -0
  103. package/engine/cc-worker-pool.js +9 -1
  104. package/engine/cleanup.js +393 -271
  105. package/engine/cli.js +65 -7
  106. package/engine/comment-classifier.js +70 -5
  107. package/engine/consolidation.js +123 -5
  108. package/engine/content-api-validation.js +606 -0
  109. package/engine/create-pr-worktree.js +22 -1
  110. package/engine/db/migrations/027-review-learning-lifecycle.js +162 -0
  111. package/engine/dispatch.js +33 -0
  112. package/engine/distribution.js +189 -0
  113. package/engine/execution-model.js +59 -0
  114. package/engine/features.js +12 -0
  115. package/engine/github.js +67 -25
  116. package/engine/harness-context.js +313 -0
  117. package/engine/inbox-store.js +1 -1
  118. package/engine/kb-sweep.js +161 -38
  119. package/engine/keep-process-sweep.js +43 -3
  120. package/engine/lifecycle.js +1066 -165
  121. package/engine/llm.js +4 -0
  122. package/engine/managed-spawn.js +463 -48
  123. package/engine/meeting.js +197 -34
  124. package/engine/memory-retrieval.js +280 -0
  125. package/engine/memory-store.js +821 -38
  126. package/engine/model-discovery.js +17 -3
  127. package/engine/pipeline.js +802 -14
  128. package/engine/plan-prd-validation.js +745 -0
  129. package/engine/playbook.js +206 -17
  130. package/engine/pooled-agent-process.js +6 -1
  131. package/engine/pr-action.js +1 -1
  132. package/engine/pr-issue-validation.js +653 -0
  133. package/engine/pr-resolve.js +75 -13
  134. package/engine/prd-store.js +39 -6
  135. package/engine/preflight.js +7 -2
  136. package/engine/process-utils.js +79 -31
  137. package/engine/projects.js +198 -12
  138. package/engine/promotion.js +371 -0
  139. package/engine/qa-from-prd.js +3 -0
  140. package/engine/qa-process-validation.js +572 -0
  141. package/engine/qa-runbooks.js +41 -37
  142. package/engine/qa-runners/maestro.js +11 -7
  143. package/engine/qa-runners/playwright.js +37 -14
  144. package/engine/qa-runners.js +9 -10
  145. package/engine/qa-runs.js +124 -11
  146. package/engine/qa-sessions.js +139 -40
  147. package/engine/quarantine-refs.js +81 -11
  148. package/engine/queries.js +163 -9
  149. package/engine/review-learning-backfill.js +482 -0
  150. package/engine/review-learning.js +1236 -0
  151. package/engine/runtimes/claude.js +60 -2
  152. package/engine/runtimes/codex.js +57 -16
  153. package/engine/runtimes/contract.js +21 -0
  154. package/engine/runtimes/copilot.js +51 -3
  155. package/engine/runtimes/index.js +1 -0
  156. package/engine/scheduler.js +201 -32
  157. package/engine/settings-validation.js +909 -0
  158. package/engine/shared.js +705 -208
  159. package/engine/spawn-agent.js +48 -21
  160. package/engine/steering-constraints.js +31 -0
  161. package/engine/steering-store.js +10 -2
  162. package/engine/steering.js +14 -2
  163. package/engine/timeout.js +404 -111
  164. package/engine/untrusted-fence.js +24 -10
  165. package/engine/watch-actions.js +7 -2
  166. package/engine/watches.js +353 -51
  167. package/engine/work-item-validation.js +561 -0
  168. package/engine/work-items-store.js +61 -1
  169. package/engine/worktree-gc.js +656 -37
  170. package/engine/worktree-preflight.js +154 -0
  171. package/engine.js +2068 -342
  172. package/package.json +1 -1
  173. package/playbooks/_pr-description-audit.md +88 -41
  174. package/playbooks/build-fix-complex.md +3 -3
  175. package/playbooks/docs.md +2 -2
  176. package/playbooks/fix.md +18 -18
  177. package/playbooks/implement.md +18 -18
  178. package/playbooks/qa-session-draft.md +10 -12
  179. package/playbooks/qa-session-execute.md +16 -12
  180. package/playbooks/qa-validate.md +8 -7
  181. package/playbooks/shared-rules.md +45 -0
  182. package/playbooks/test.md +4 -0
  183. package/prompts/cc-system.md +1 -1
  184. package/skills/check-self-authored-review-comment/SKILL.md +2 -2
package/engine/ado.js CHANGED
@@ -10,8 +10,13 @@ const { exec, execAsync, getAdoOrgBase, log, ts, dateStamp, PR_STATUS, BUILD_STA
10
10
  const { getPrs } = require('./queries');
11
11
  const { mutateJsonFileLocked } = shared;
12
12
  const { acquireAdoToken } = require('./ado-token');
13
- const { isPreviewStatusBody, hasMinionsMarker, hasVerdictPrefix } = require('./comment-classifier');
13
+ const {
14
+ hasMinionsMarker,
15
+ hasVerdictPrefix,
16
+ classifyNonActionableAutomationComment,
17
+ } = require('./comment-classifier');
14
18
  const { wrapUntrusted, buildSource } = require('./untrusted-fence');
19
+ const reviewLearning = require('./review-learning');
15
20
 
16
21
  // Lazy require to avoid circular dependency — only needed for engine().handlePostMerge
17
22
  let _engine = null;
@@ -2015,26 +2020,35 @@ async function pollPrHumanComments(config) {
2015
2020
  // Track date for cutoff BEFORE author/body filters so bot/CI/ignored
2016
2021
  // comments still advance the cutoff.
2017
2022
  if (comment.publishedDate) allCommentDates.push(comment.publishedDate);
2018
- if (comment.id != null) {
2019
- threadIdByComment.set(String(comment.id), thread.id);
2020
- editsInput.push({
2021
- id: comment.id,
2022
- createdRaw: comment.publishedDate,
2023
- updatedRaw: comment.lastUpdatedDate,
2024
- });
2025
- }
2023
+ if (comment.id == null) continue;
2024
+ threadIdByComment.set(String(comment.id), thread.id);
2025
+ const commentSource = reviewLearning.buildReviewCommentSource({
2026
+ host: 'ado',
2027
+ threadId: thread.id,
2028
+ commentType: comment.commentType || 'text',
2029
+ commentId: comment.id,
2030
+ author: comment.author?.displayName || 'Human',
2031
+ createdAt: comment.publishedDate,
2032
+ updatedAt: comment.lastUpdatedDate || comment.publishedDate,
2033
+ content,
2034
+ });
2035
+ editsInput.push({
2036
+ id: commentSource.key,
2037
+ createdRaw: comment.publishedDate,
2038
+ updatedRaw: comment.lastUpdatedDate,
2039
+ });
2026
2040
  // Skip explicitly ignored authors.
2027
2041
  const authorName = (comment.author?.displayName || '').toLowerCase();
2028
2042
  if (ignoredAuthors.some(a => authorName.includes(a))) continue;
2029
- // P-f23classifier (F2): filter preview-status / CI-report bot bodies
2030
- // (Firebase / Appetize / Deploy / Preview / Coverage-Build-Test
2031
- // headings / shields.io badges) for parity with engine/github.js
2032
- // _isPreviewStatusComment. ADO has no `user.type === 'bot'` flag,
2033
- // so the filter is body-only — same behavior the inline ADO CI
2034
- // filter had before extraction, now broadened to include the GH
2035
- // preview signatures so a Firebase/Appetize bot comment on an ADO
2036
- // PR no longer advances pendingFix.
2037
- if (isPreviewStatusBody(content)) continue;
2043
+ // Filter known automation noise by shared content/identity envelopes.
2044
+ // This retains body-only preview/status matching while allowing
2045
+ // actionable findings from the same PR Assistant/GitOps author.
2046
+ const automationReason = classifyNonActionableAutomationComment({
2047
+ host: 'ado',
2048
+ body: content,
2049
+ author: comment.author,
2050
+ });
2051
+ if (automationReason) continue;
2038
2052
  // P-f23classifier (F3): detect agent comments (included in context
2039
2053
  // but don't trigger fix). Structurally symmetric to
2040
2054
  // engine/github.js _isAgentComment + _isMinionsAuthoredComment:
@@ -2055,7 +2069,10 @@ async function pollPrHumanComments(config) {
2055
2069
  author: comment.author?.displayName || 'Human',
2056
2070
  content: comment.content,
2057
2071
  date: comment.publishedDate,
2058
- _isAgent: isAgent
2072
+ createdAt: comment.publishedDate,
2073
+ updatedAt: comment.lastUpdatedDate || comment.publishedDate,
2074
+ _isAgent: isAgent,
2075
+ commentSource,
2059
2076
  };
2060
2077
  allHumanComments.push(entry);
2061
2078
 
@@ -2072,35 +2089,61 @@ async function pollPrHumanComments(config) {
2072
2089
  // edit timestamp differs from what we already saw queue as new feedback
2073
2090
  // (re-dispatch). First-seen comments and re-polls of already-seen edits
2074
2091
  // do NOT route through this path.
2075
- const prevEditsSeen = (pr.humanFeedback && pr.humanFeedback.editsSeen) || {};
2092
+ const persistedEditsSeen = pr.humanFeedback?.editsSeen || {};
2093
+ const prevEditsSeen = reviewLearning.migrateLegacyReviewCommentEdits(
2094
+ persistedEditsSeen,
2095
+ editsInput.map(entry => entry.id),
2096
+ );
2097
+ const editsMigrationChanged = JSON.stringify(prevEditsSeen) !== JSON.stringify(persistedEditsSeen);
2076
2098
  editsInput.sort((a, b) => String(a.updatedRaw || '').localeCompare(String(b.updatedRaw || '')));
2077
- const { editsSeen, newlyEditedIds, changed: editsSeenChanged } =
2099
+ const { editsSeen, newlyEditedIds, changed } =
2078
2100
  shared.buildEditsSeen(editsInput, prevEditsSeen);
2101
+ const editsSeenChanged = changed || editsMigrationChanged;
2079
2102
 
2080
2103
  // F6: promote pre-cutoff comments that were newly edited into newHumanComments
2081
2104
  // (agent-authored edits do NOT re-dispatch — vote path handles agent reviews).
2082
- const seenNewCommentIds = new Set(newHumanComments.map(c => String(c.commentId)));
2105
+ const seenNewCommentKeys = new Set(newHumanComments.map(c => c.commentSource.key));
2083
2106
  for (const entry of allHumanComments) {
2084
2107
  if (entry._isAgent) continue;
2085
- const id = String(entry.commentId);
2086
- if (seenNewCommentIds.has(id)) continue;
2087
- if (!newlyEditedIds.has(id)) continue;
2088
- newHumanComments.push({ ...entry, date: editsSeen[id] || entry.date, _isEditedRedispatch: true });
2089
- seenNewCommentIds.add(id);
2108
+ const key = entry.commentSource.key;
2109
+ if (seenNewCommentKeys.has(key)) continue;
2110
+ if (!newlyEditedIds.has(key)) continue;
2111
+ entry._isEditedRedispatch = true;
2112
+ newHumanComments.push({
2113
+ ...entry,
2114
+ date: editsSeen[key] || entry.commentSource.updatedAt || entry.date,
2115
+ });
2116
+ seenNewCommentKeys.add(key);
2090
2117
  }
2091
2118
 
2119
+ allHumanComments.sort((a, b) => a.date.localeCompare(b.date));
2120
+ const currentFeedback = pr.humanFeedback || {};
2121
+ const observedCommentSources = reviewLearning.normalizeReviewCommentSources(
2122
+ allHumanComments.map(entry => entry.commentSource),
2123
+ );
2124
+ const commentSources = reviewLearning.selectReviewCommentSourceSnapshot(
2125
+ currentFeedback,
2126
+ observedCommentSources,
2127
+ );
2128
+ const commentSourcesChanged = JSON.stringify(commentSources)
2129
+ !== JSON.stringify(reviewLearning.normalizeReviewCommentSources(currentFeedback.commentSources));
2130
+
2092
2131
  // Persist cutoff unconditionally for any new comment we observed — even
2093
2132
  // if every new comment was bot/CI/ignored/agent. Mirrors GitHub poller.
2094
2133
  const allNewDates = allCommentDates.filter(d => (new Date(d).getTime() || 0) > cutoffMs);
2095
2134
  if (allNewDates.length > 0 && newHumanComments.length === 0) {
2096
- pr.humanFeedback = { ...(pr.humanFeedback || {}), lastProcessedCommentDate: allNewDates.sort().pop() };
2135
+ pr.humanFeedback = { ...currentFeedback, lastProcessedCommentDate: allNewDates.sort().pop() };
2136
+ if (commentSources.length > 0) pr.humanFeedback.commentSources = commentSources;
2097
2137
  if (editsSeenChanged) pr.humanFeedback.editsSeen = editsSeen;
2098
2138
  return true;
2099
2139
  }
2100
2140
  if (newHumanComments.length === 0) {
2101
2141
  // F6: persist pruned/updated editsSeen map even when no dispatch is queued.
2102
- if (editsSeenChanged) {
2103
- pr.humanFeedback = { ...(pr.humanFeedback || {}), editsSeen };
2142
+ if (editsSeenChanged || commentSourcesChanged) {
2143
+ pr.humanFeedback = { ...currentFeedback };
2144
+ if (commentSources.length > 0) pr.humanFeedback.commentSources = commentSources;
2145
+ else delete pr.humanFeedback.commentSources;
2146
+ if (editsSeenChanged) pr.humanFeedback.editsSeen = editsSeen;
2104
2147
  return true;
2105
2148
  }
2106
2149
  return false;
@@ -2109,7 +2152,6 @@ async function pollPrHumanComments(config) {
2109
2152
  // Sort all comments chronologically and build full context for the fix agent.
2110
2153
  // Cutoff advances to the latest of ALL new comment dates (so newer agent/CI
2111
2154
  // comments interleaved with the human feedback don't re-scan next tick).
2112
- allHumanComments.sort((a, b) => a.date.localeCompare(b.date));
2113
2155
  newHumanComments.sort((a, b) => a.date.localeCompare(b.date));
2114
2156
  const latestDate = allNewDates.sort().pop() || newHumanComments[newHumanComments.length - 1].date;
2115
2157
 
@@ -2120,7 +2162,10 @@ async function pollPrHumanComments(config) {
2120
2162
  const adoRepo = project?.repoName || project?.repositoryId || '';
2121
2163
  const feedbackContent = allHumanComments
2122
2164
  .map(c => {
2123
- const isNew = (new Date(c.date).getTime() || 0) > cutoffMs;
2165
+ const isNew = c._isEditedRedispatch || (new Date(c.date).getTime() || 0) > cutoffMs;
2166
+ const displayDate = c._isEditedRedispatch
2167
+ ? (c.commentSource.updatedAt || c.updatedAt || c.date)
2168
+ : c.date;
2124
2169
  const cleanedBody = String(c.content || '').replace(/@minions\s*/gi, '').trim();
2125
2170
  const source = buildSource('pr-comment', {
2126
2171
  host: 'ado',
@@ -2129,10 +2174,11 @@ async function pollPrHumanComments(config) {
2129
2174
  repo: adoRepo,
2130
2175
  number: prNum,
2131
2176
  author: c.author || 'unknown',
2177
+ key: c.commentSource.key,
2132
2178
  });
2133
2179
  const fenced = wrapUntrusted(cleanedBody, source);
2134
2180
  const bodyForPrompt = fenced || cleanedBody;
2135
- return `${isNew ? '**[NEW]** ' : ''}**${c.author}** (${c.date}):\n${bodyForPrompt}`;
2181
+ return `${isNew ? '**[NEW]** ' : ''}**${c.author}** (${displayDate}):\n${bodyForPrompt}`;
2136
2182
  })
2137
2183
  .join('\n\n---\n\n');
2138
2184
 
@@ -2143,6 +2189,7 @@ async function pollPrHumanComments(config) {
2143
2189
  lastProcessedCommentKey: `${latestNewHuman.threadId || threadIdByComment.get(String(latestNewHuman.commentId)) || ''}:${latestNewHuman.commentId}`,
2144
2190
  pendingFix: true,
2145
2191
  feedbackContent,
2192
+ commentSources: observedCommentSources,
2146
2193
  editsSeen,
2147
2194
  };
2148
2195