@yemi33/minions 0.1.1572 → 0.1.1574

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/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.1574 (2026-04-27)
4
+
5
+ ### Fixes
6
+ - oneShot flag prevents one-off reviews from eval loop (#1776)
7
+
8
+ ## 0.1.1573 (2026-04-27)
9
+
10
+ ### Fixes
11
+ - default existing_prd_json to empty so plan-to-prd dispatch doesn't warn
12
+
3
13
  ## 0.1.1572 (2026-04-27)
4
14
 
5
15
  ### Fixes
package/dashboard.js CHANGED
@@ -912,6 +912,10 @@ async function executeCCActions(actions) {
912
912
  const project = action.project || '';
913
913
  const targetProject = project ? PROJECTS.find(p => p.name?.toLowerCase() === project.toLowerCase()) : PROJECTS[0];
914
914
  const wiPath = targetProject ? shared.projectWorkItemsPath(targetProject) : path.join(MINIONS_DIR, 'work-items.json');
915
+ // Issue #1772: CC review/explore/test are human-initiated one-offs.
916
+ // Mark oneShot so any discovered PR is tagged _contextOnly (skips eval loop).
917
+ const ccOneShotTypes = new Set(['review', 'explore', 'test']);
918
+ const isOneShot = action.oneShot === true || (action.oneShot !== false && ccOneShotTypes.has(workType));
915
919
  shared.mutateJsonFileLocked(wiPath, items => {
916
920
  if (!Array.isArray(items)) items = [];
917
921
  items.push({
@@ -920,6 +924,7 @@ async function executeCCActions(actions) {
920
924
  status: WI_STATUS.PENDING, created: new Date().toISOString(),
921
925
  createdBy: 'command-center', project,
922
926
  ...(action.agents?.length ? { preferred_agent: action.agents[0] } : {}),
927
+ ...(isOneShot ? { oneShot: true } : {}),
923
928
  });
924
929
  return items;
925
930
  }, { defaultValue: [] });
@@ -1978,6 +1983,7 @@ const server = http.createServer(async (req, res) => {
1978
1983
  if (body.references) item.references = body.references;
1979
1984
  if (body.acceptanceCriteria) item.acceptanceCriteria = body.acceptanceCriteria;
1980
1985
  if (body.skipPr) item.skipPr = true;
1986
+ if (body.oneShot) item.oneShot = true;
1981
1987
  let dupId = null;
1982
1988
  mutateJsonFileLocked(wiPath, (items) => {
1983
1989
  if (!Array.isArray(items)) items = [];
@@ -800,23 +800,25 @@ function syncPrsFromOutput(output, agentId, meta, config) {
800
800
  }
801
801
 
802
802
  if (!newPrsByPath.has(prPath)) newPrsByPath.set(prPath, { name: targetName, project: targetProject, entries: [] });
803
- newPrsByPath.get(prPath).entries.push({
804
- prId, fullId,
805
- entry: {
806
- id: fullId,
807
- prNumber: parseInt(prId, 10) || prId,
808
- title: (title || `PR created by ${agentName}`).slice(0, 120),
809
- agent: agentName,
810
- branch: meta?.branch || '',
811
- reviewStatus: 'pending',
812
- status: PR_STATUS.ACTIVE,
813
- created: ts(),
814
- url: prUrl,
815
- prdItems: meta?.item?.id ? [meta.item.id] : [],
816
- sourcePlan: meta?.item?.sourcePlan || '',
817
- itemType: meta?.item?.itemType || ''
818
- }
819
- });
803
+ const entry = {
804
+ id: fullId,
805
+ prNumber: parseInt(prId, 10) || prId,
806
+ title: (title || `PR created by ${agentName}`).slice(0, 120),
807
+ agent: agentName,
808
+ branch: meta?.branch || '',
809
+ reviewStatus: 'pending',
810
+ status: PR_STATUS.ACTIVE,
811
+ created: ts(),
812
+ url: prUrl,
813
+ prdItems: meta?.item?.id ? [meta.item.id] : [],
814
+ sourcePlan: meta?.item?.sourcePlan || '',
815
+ itemType: meta?.item?.itemType || ''
816
+ };
817
+ // Issue #1772: one-off dispatches (e.g. human-initiated "review this PR" via CC)
818
+ // must not enroll the discovered PR into the auto eval loop. Tag _contextOnly so
819
+ // discoverFromPrs skips it for review/fix dispatch (still polled for status/comments).
820
+ if (meta?.item?.oneShot) entry._contextOnly = true;
821
+ newPrsByPath.get(prPath).entries.push({ prId, fullId, entry });
820
822
  }
821
823
 
822
824
  const entryBranch = meta?.branch || '';
package/engine.js CHANGED
@@ -2982,6 +2982,11 @@ function discoverCentralWorkItems(config) {
2982
2982
  vars.plan_summary = (item.title || item.planFile).substring(0, 80);
2983
2983
  vars.plan_file = item.planFile || '';
2984
2984
  vars.project_name_lower = (firstProject?.name || 'project').toLowerCase();
2985
+ // Default empty string so the {{existing_prd_json}} token always resolves —
2986
+ // playbook treats empty as "no existing PRD, fresh run". Without this default
2987
+ // the renderPlaybook pass logs an "unresolved template variables" warning
2988
+ // every time a fresh plan-to-prd dispatches.
2989
+ vars.existing_prd_json = '';
2985
2990
  // Check if a PRD already exists for this plan — reuse its filename to avoid duplicates (#884)
2986
2991
  let prdFilename = null;
2987
2992
  const prdFiles = safeReadDir(PRD_DIR).filter(f => f.endsWith('.json'));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.1572",
3
+ "version": "0.1.1574",
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"