@yemi33/minions 0.1.2424 → 0.1.2426
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/bin/install-internal-minions.js +1209 -0
- package/bin/minions.js +75 -9
- package/dashboard/docs/typography.md +27 -12
- package/dashboard/js/command-center.js +13 -11
- package/dashboard/js/live-stream.js +1 -1
- package/dashboard/js/memory-search.js +388 -43
- package/dashboard/js/modal-qa.js +5 -5
- package/dashboard/js/qa.js +39 -26
- package/dashboard/js/refresh.js +37 -18
- package/dashboard/js/render-agents.js +14 -18
- package/dashboard/js/render-dispatch.js +14 -74
- package/dashboard/js/render-inbox.js +3 -3
- package/dashboard/js/render-meetings.js +8 -8
- package/dashboard/js/render-other.js +45 -20
- package/dashboard/js/render-pipelines.js +6 -6
- package/dashboard/js/render-plans.js +14 -14
- package/dashboard/js/render-prd.js +46 -46
- package/dashboard/js/render-prs.js +9 -65
- package/dashboard/js/render-schedules.js +5 -5
- package/dashboard/js/render-skills.js +6 -6
- package/dashboard/js/render-utils.js +4 -4
- package/dashboard/js/render-watches.js +4 -16
- package/dashboard/js/render-work-items.js +95 -107
- package/dashboard/js/settings.js +175 -74
- package/dashboard/layout.html +3 -2
- package/dashboard/pages/inbox.html +1 -1
- package/dashboard/pages/work.html +1 -1
- package/dashboard/shared/model-display.js +9 -0
- package/dashboard/shared/watches-source.js +43 -0
- package/dashboard/shared/welcome-popup.js +259 -0
- package/dashboard/slim/body.html +6 -6
- package/dashboard/slim/js/chat.js +4 -2
- package/dashboard/slim/js/history.js +10 -3
- package/dashboard/slim/js/modals-tiles.js +85 -16
- package/dashboard/slim/js/status.js +12 -16
- package/dashboard/slim/styles.css +24 -4
- package/dashboard/styles.css +62 -27
- package/dashboard-build.js +8 -2
- package/dashboard.js +3854 -2514
- package/docs/README.md +7 -5
- package/docs/api-errors.md +144 -0
- package/docs/auto-discovery.md +83 -61
- package/docs/capture-demos.js +173 -30
- package/docs/command-center.md +5 -1
- package/docs/completion-reports.md +127 -11
- package/docs/constants.md +15 -3
- package/docs/constellation-style-telemetry.md +2 -2
- package/docs/copilot-cli-schema.md +32 -22
- package/docs/cross-repo-plans.md +30 -30
- package/docs/demo/memory-system.html +1 -1
- package/docs/deprecated.json +132 -18
- package/docs/diagnostics-memory.md +8 -4
- package/docs/human-vs-automated.md +2 -2
- package/docs/index.html +9 -2
- package/docs/internal-install.md +212 -0
- package/docs/kb-pr3223-cascade-archiving.md +16 -0
- package/docs/kb-pr696-merge-conflict-docs.md +23 -0
- package/docs/kb-sweep.md +2 -2
- package/docs/keep-processes.md +8 -1
- package/docs/live-checkout-mode.md +1 -1
- package/docs/managed-spawn.md +21 -3
- package/docs/named-agents.md +3 -2
- package/docs/onboarding.md +26 -0
- package/docs/plan-lifecycle.md +32 -32
- package/docs/pr-screenshots/pr-899/worker-pool-worktrees-AFTER.png +0 -0
- package/docs/pr-screenshots/pr-899/worker-pool-worktrees-BEFORE.png +0 -0
- package/docs/pr-screenshots/pr-979/auto-fix-pane-AFTER.png +0 -0
- package/docs/pr-screenshots/pr-979/auto-fix-pane-BEFORE.png +0 -0
- package/docs/pr-screenshots/pr-985/pr-column-em-dash-AFTER.png +0 -0
- package/docs/pr-screenshots/pr-985/pr-column-em-dash-BEFORE.png +0 -0
- package/docs/qa-runbook-lifecycle.md +67 -51
- package/docs/qa-runbooks.md +2 -2
- package/docs/runtime-adapters.md +101 -50
- package/docs/security.md +28 -0
- package/docs/self-improvement.md +47 -13
- package/docs/skills.md +29 -0
- package/docs/slim-ux/concepts.md +2 -2
- package/docs/specs/agent-configurability.md +43 -41
- package/docs/specs/agent-rename.md +13 -13
- package/docs/team-memory.md +283 -14
- package/docs/tutorials/01-install-and-connect.md +23 -0
- package/docs/tutorials/03-plan-driven-feature.md +3 -3
- package/docs/tutorials/04-runtimes-and-harness.md +18 -21
- package/docs/tutorials/08-operations-and-recovery.md +3 -2
- package/docs/tutorials/README.md +4 -3
- package/docs/visual-evidence-ci.md +103 -0
- package/docs/watches.md +35 -30
- package/docs/worktree-lifecycle.md +151 -13
- package/engine/acp-transport.js +1 -0
- package/engine/ado.js +80 -33
- package/engine/agent-api-validation.js +571 -0
- package/engine/agent-worker-pool.js +7 -6
- package/engine/api-contracts/agent-content.js +761 -0
- package/engine/api-contracts/cc-ops.js +219 -0
- package/engine/api-contracts/config-runtime.js +419 -0
- package/engine/api-contracts/core.js +138 -0
- package/engine/api-contracts/index.js +506 -0
- package/engine/api-contracts/orchestration.js +602 -0
- package/engine/api-contracts/pull-requests.js +323 -0
- package/engine/api-contracts/qa-process.js +764 -0
- package/engine/api-contracts/work-plan-prd.js +494 -0
- package/engine/api-validation.js +543 -0
- package/engine/cc-api-validation.js +586 -0
- package/engine/cc-worker-pool.js +9 -1
- package/engine/cleanup.js +393 -271
- package/engine/cli.js +65 -7
- package/engine/comment-classifier.js +70 -5
- package/engine/consolidation.js +123 -5
- package/engine/content-api-validation.js +606 -0
- package/engine/create-pr-worktree.js +22 -1
- package/engine/db/migrations/027-review-learning-lifecycle.js +162 -0
- package/engine/dispatch.js +33 -0
- package/engine/distribution.js +189 -0
- package/engine/execution-model.js +59 -0
- package/engine/features.js +12 -0
- package/engine/github.js +67 -25
- package/engine/harness-context.js +313 -0
- package/engine/inbox-store.js +1 -1
- package/engine/kb-sweep.js +161 -38
- package/engine/keep-process-sweep.js +43 -3
- package/engine/lifecycle.js +1066 -165
- package/engine/llm.js +4 -0
- package/engine/managed-spawn.js +463 -48
- package/engine/meeting.js +197 -34
- package/engine/memory-retrieval.js +280 -0
- package/engine/memory-store.js +821 -38
- package/engine/model-discovery.js +17 -3
- package/engine/pipeline.js +802 -14
- package/engine/plan-prd-validation.js +745 -0
- package/engine/playbook.js +206 -17
- package/engine/pooled-agent-process.js +6 -1
- package/engine/pr-action.js +1 -1
- package/engine/pr-issue-validation.js +653 -0
- package/engine/pr-resolve.js +75 -13
- package/engine/prd-store.js +39 -6
- package/engine/preflight.js +7 -2
- package/engine/process-utils.js +79 -31
- package/engine/projects.js +198 -12
- package/engine/promotion.js +371 -0
- package/engine/qa-from-prd.js +3 -0
- package/engine/qa-process-validation.js +572 -0
- package/engine/qa-runbooks.js +41 -37
- package/engine/qa-runners/maestro.js +11 -7
- package/engine/qa-runners/playwright.js +37 -14
- package/engine/qa-runners.js +9 -10
- package/engine/qa-runs.js +124 -11
- package/engine/qa-sessions.js +139 -40
- package/engine/quarantine-refs.js +81 -11
- package/engine/queries.js +163 -9
- package/engine/review-learning-backfill.js +482 -0
- package/engine/review-learning.js +1236 -0
- package/engine/runtimes/claude.js +60 -2
- package/engine/runtimes/codex.js +57 -16
- package/engine/runtimes/contract.js +21 -0
- package/engine/runtimes/copilot.js +51 -3
- package/engine/runtimes/index.js +1 -0
- package/engine/scheduler.js +201 -32
- package/engine/settings-validation.js +909 -0
- package/engine/shared.js +705 -208
- package/engine/spawn-agent.js +48 -21
- package/engine/steering-constraints.js +31 -0
- package/engine/steering-store.js +10 -2
- package/engine/steering.js +14 -2
- package/engine/timeout.js +404 -111
- package/engine/untrusted-fence.js +24 -10
- package/engine/watch-actions.js +7 -2
- package/engine/watches.js +353 -51
- package/engine/work-item-validation.js +561 -0
- package/engine/work-items-store.js +61 -1
- package/engine/worktree-gc.js +656 -37
- package/engine/worktree-preflight.js +154 -0
- package/engine.js +2068 -342
- package/package.json +1 -1
- package/playbooks/_pr-description-audit.md +88 -41
- package/playbooks/build-fix-complex.md +3 -3
- package/playbooks/docs.md +2 -2
- package/playbooks/fix.md +18 -18
- package/playbooks/implement.md +18 -18
- package/playbooks/qa-session-draft.md +10 -12
- package/playbooks/qa-session-execute.md +16 -12
- package/playbooks/qa-validate.md +8 -7
- package/playbooks/shared-rules.md +45 -0
- package/playbooks/test.md +4 -0
- package/prompts/cc-system.md +1 -1
- 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 {
|
|
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
|
|
2019
|
-
|
|
2020
|
-
|
|
2021
|
-
|
|
2022
|
-
|
|
2023
|
-
|
|
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
|
-
//
|
|
2030
|
-
//
|
|
2031
|
-
//
|
|
2032
|
-
|
|
2033
|
-
|
|
2034
|
-
|
|
2035
|
-
|
|
2036
|
-
|
|
2037
|
-
if (
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
2086
|
-
if (
|
|
2087
|
-
if (!newlyEditedIds.has(
|
|
2088
|
-
|
|
2089
|
-
|
|
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 = { ...
|
|
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 = { ...
|
|
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}** (${
|
|
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
|
|