@yemi33/minions 0.1.1918 → 0.1.1920

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.
@@ -265,8 +265,7 @@ async function openSettings() {
265
265
  '</div>' +
266
266
 
267
267
  '<h3 style="font-size:13px;color:var(--blue);margin-bottom:8px">Claude CLI</h3>' +
268
- '<div style="display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-bottom:8px">' +
269
- settingsField('Output Format', 'set-outputFormat', c.outputFormat || 'stream-json', '', '') +
268
+ '<div style="display:grid;grid-template-columns:1fr;gap:8px;margin-bottom:8px">' +
270
269
  settingsField('Allowed Tools', 'set-allowedTools', c.allowedTools || '', '', 'Claude allow-list passed through for compatibility; runtime bypass flags are adapter-owned.') +
271
270
  '</div>' +
272
271
  '<div style="font-size:10px;color:var(--muted);margin-bottom:16px;padding:6px 8px;border:1px solid var(--border);border-radius:4px;background:var(--surface-subtle, rgba(130,160,210,0.08))">' +
@@ -635,7 +634,6 @@ async function saveSettings() {
635
634
  };
636
635
 
637
636
  const claudePayload = {
638
- outputFormat: document.getElementById('set-outputFormat').value,
639
637
  allowedTools: document.getElementById('set-allowedTools').value,
640
638
  };
641
639
 
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "runtime": "copilot",
3
3
  "models": null,
4
- "cachedAt": "2026-05-13T22:31:23.464Z"
4
+ "cachedAt": "2026-05-13T22:41:19.532Z"
5
5
  }
@@ -3,6 +3,23 @@
3
3
  */
4
4
 
5
5
  // Entry shape: id → { description, default: bool, addedIn?: version, expires?: ISO-date }
6
+ //
7
+ // INTENTIONAL EMPTY REGISTRY — DO NOT DELETE.
8
+ //
9
+ // The `FEATURES = {}` literal below is intentional scaffolding, not dead code.
10
+ // The surrounding framework (isFeatureOn, listFeatures, hasFeature, env-var
11
+ // override resolver, expiration timestamps) is load-bearing: dashboard.js
12
+ // boot wires it into /api/features (list), /api/features/toggle, and the
13
+ // `window.MINIONS_FEATURES` client bootstrap. Deleting the registry — even
14
+ // while empty — would break dashboard startup and the experimental-flags UI.
15
+ //
16
+ // New flags belong here. Register them in this object instead of removing
17
+ // the empty literal. The first real entry will replace the example below;
18
+ // until then the empty object is the correct, expected shape.
19
+ //
20
+ // Decision logged in the 2026-05-13 daily architecture & bug review meeting
21
+ // (knowledge/architecture/2026-05-13-ripley-meeting-conclusion-daily-architecture-bug-review-2.md,
22
+ // PR-C, Option B — keep framework, document the empty registry).
6
23
  const FEATURES = {
7
24
  // Example:
8
25
  // 'ux-sidebar-v2': { description: '…', default: false, addedIn: '0.1.1738', expires: '2026-06-01' },
@@ -2597,6 +2597,12 @@ function parseAgentOutput(stdout, runtimeName) {
2597
2597
  * Agents produce a ```completion fenced block with key: value pairs.
2598
2598
  * Returns parsed object or null if not found / malformed.
2599
2599
  * If multiple blocks exist, the last one wins (agent may retry).
2600
+ *
2601
+ * DEPRECATED — slated for removal once telemetry shows zero hits over a 14-day
2602
+ * window. Telemetry: see _engine.completionFallbacks in metrics.json (the JSON
2603
+ * sidecar at MINIONS_COMPLETION_REPORT is the documented contract; this fenced
2604
+ * fallback exists only to support runtimes/agents that have not yet adopted it).
2605
+ * Removal is tracked by the P-c8f5e1b3 follow-up plan.
2600
2606
  */
2601
2607
  function parseStructuredCompletion(stdout, runtimeName) {
2602
2608
  if (!stdout || typeof stdout !== 'string') return null;
@@ -2692,6 +2698,13 @@ function parseCompletionKeyValues(text) {
2692
2698
  return result;
2693
2699
  }
2694
2700
 
2701
+ /**
2702
+ * DEPRECATED — slated for removal once telemetry shows zero hits over a 14-day
2703
+ * window. Telemetry: see _engine.completionFallbacks in metrics.json (the JSON
2704
+ * sidecar at MINIONS_COMPLETION_REPORT is the documented contract; this prose
2705
+ * fallback only fires when both the sidecar AND the fenced ```completion block
2706
+ * are missing). Removal is tracked by the P-c8f5e1b3 follow-up plan.
2707
+ */
2695
2708
  function parseCompletionFieldSummary(text) {
2696
2709
  if (!text || typeof text !== 'string') return null;
2697
2710
 
@@ -3203,6 +3216,28 @@ async function runPostCompletionHooks(dispatchItem, agentId, code, stdout, confi
3203
3216
  const summaryCompletion = reportCompletion || fencedCompletion ? null : parseCompletionFieldSummary(resultSummary);
3204
3217
  const fallbackCompletion = fencedCompletion || summaryCompletion;
3205
3218
  const fallbackSource = fencedCompletion && hasCompletionFence(stdout, runtimeName) ? 'fenced-completion' : 'summary-completion';
3219
+ // P-c8f5e1b3 — telemetry: completion-fallback. Emit a grep-able log + bump a
3220
+ // counter in metrics.json whenever the fenced or summary fallback fires (i.e.
3221
+ // the documented sidecar contract was missing). Used to confirm zero adoption
3222
+ // gaps before removing parseStructuredCompletion / parseCompletionFieldSummary
3223
+ // in a follow-up. Sidecar (happy) path is silent — no log, no increment.
3224
+ if (!reportCompletion && fallbackCompletion) {
3225
+ const counterKey = fallbackSource === 'fenced-completion' ? 'fenced' : 'summary';
3226
+ const wiId = dispatchItem.meta?.item?.id || null;
3227
+ log('info', `telemetry: completion-fallback agent=${agentId || 'unknown'} wi=${wiId || 'N/A'} runtime=${runtimeName} source=${fallbackSource}`);
3228
+ try {
3229
+ const metricsPath = path.join(ENGINE_DIR, 'metrics.json');
3230
+ mutateJsonFileLocked(metricsPath, (metrics) => {
3231
+ metrics = metrics || {};
3232
+ if (!metrics._engine) metrics._engine = {};
3233
+ if (!metrics._engine.completionFallbacks) metrics._engine.completionFallbacks = { fenced: 0, summary: 0 };
3234
+ metrics._engine.completionFallbacks[counterKey] = (metrics._engine.completionFallbacks[counterKey] || 0) + 1;
3235
+ return metrics;
3236
+ });
3237
+ } catch (err) {
3238
+ log('warn', `telemetry: completion-fallback metrics write failed: ${err.message}`);
3239
+ }
3240
+ }
3206
3241
  const structuredCompletion = reportCompletion || persistCompletionReport(dispatchItem, fallbackCompletion, fallbackSource);
3207
3242
  if (structuredCompletion) {
3208
3243
  if (structuredCompletion.summary) resultSummary = String(structuredCompletion.summary);
package/engine/shared.js CHANGED
@@ -1816,7 +1816,11 @@ function pruneDefaultClaudeConfig(config) {
1816
1816
  };
1817
1817
 
1818
1818
  removeKey('permissionMode');
1819
- for (const key of ['binary', 'outputFormat', 'allowedTools']) {
1819
+ // outputFormat is fully orphan the Claude adapter hard-codes 'stream-json'
1820
+ // and nothing threads config.claude.outputFormat into it. Strip unconditionally
1821
+ // so stale values stop tripping the deprecation warning.
1822
+ removeKey('outputFormat');
1823
+ for (const key of ['binary', 'allowedTools']) {
1820
1824
  if (Object.prototype.hasOwnProperty.call(claude, key) && claude[key] === DEFAULT_CLAUDE[key]) {
1821
1825
  removeKey(key);
1822
1826
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.1918",
3
+ "version": "0.1.1920",
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"