@yemi33/minions 0.1.139 → 0.1.141
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,18 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.1.141 (2026-04-01)
|
|
4
|
+
|
|
5
|
+
### Dashboard
|
|
6
|
+
- dashboard/pages/pipelines.html
|
|
7
|
+
- dashboard/pages/schedule.html
|
|
8
|
+
|
|
9
|
+
## 0.1.140 (2026-04-01)
|
|
10
|
+
|
|
11
|
+
### Dashboard
|
|
12
|
+
- dashboard.js
|
|
13
|
+
- dashboard/js/command-center.js
|
|
14
|
+
- dashboard/js/render-pipelines.js
|
|
15
|
+
|
|
3
16
|
## 0.1.139 (2026-04-01)
|
|
4
17
|
|
|
5
18
|
### Dashboard
|
|
@@ -434,6 +434,20 @@ async function ccExecuteAction(action) {
|
|
|
434
434
|
status.style.color = 'var(--green)';
|
|
435
435
|
break;
|
|
436
436
|
}
|
|
437
|
+
case 'edit-pipeline': {
|
|
438
|
+
const body = { id: action.id };
|
|
439
|
+
if (action.title) body.title = action.title;
|
|
440
|
+
if (action.stages) body.stages = action.stages;
|
|
441
|
+
if (action.trigger !== undefined) body.trigger = action.trigger;
|
|
442
|
+
const res = await fetch('/api/pipelines/update', {
|
|
443
|
+
method: 'POST', headers: { 'Content-Type': 'application/json' },
|
|
444
|
+
body: JSON.stringify(body)
|
|
445
|
+
});
|
|
446
|
+
if (!res.ok) { const d = await res.json().catch(() => ({})); throw new Error(d.error || 'Pipeline update failed'); }
|
|
447
|
+
status.innerHTML = '✓ Updated pipeline: <strong>' + escHtml(action.id) + '</strong>';
|
|
448
|
+
status.style.color = 'var(--green)';
|
|
449
|
+
break;
|
|
450
|
+
}
|
|
437
451
|
default:
|
|
438
452
|
status.innerHTML = '? Unknown action: ' + escHtml(action.type);
|
|
439
453
|
status.style.color = 'var(--muted)';
|
|
@@ -55,6 +55,7 @@ function openPipelineDetail(id) {
|
|
|
55
55
|
'<span style="font-size:10px;color:var(--muted)">' + (p.trigger?.cron ? escHtml(_cronToHuman(p.trigger.cron)) + ' <span style="opacity:0.6">(' + escHtml(p.trigger.cron) + ', ' + escHtml(Intl.DateTimeFormat().resolvedOptions().timeZone) + ')</span>' : 'Manual trigger') + '</span>' +
|
|
56
56
|
'<div style="display:flex;gap:6px">' +
|
|
57
57
|
(activeRun ? '' : '<button class="pr-pager-btn" style="font-size:9px;padding:2px 8px;color:var(--green);border-color:var(--green)" onclick="_triggerPipeline(\'' + escHtml(id) + '\',this)">Run Now</button>') +
|
|
58
|
+
'<button class="pr-pager-btn" style="font-size:9px;padding:2px 8px;color:var(--blue);border-color:var(--blue)" onclick="openEditPipelineModal(\'' + escHtml(id) + '\')">Edit</button>' +
|
|
58
59
|
'<button class="pr-pager-btn" style="font-size:9px;padding:2px 8px" onclick="_togglePipelineEnabled(\'' + escHtml(id) + '\',' + !p.enabled + ',this)">' + (p.enabled !== false ? 'Disable' : 'Enable') + '</button>' +
|
|
59
60
|
'<button class="pr-pager-btn" style="font-size:9px;padding:2px 8px;color:var(--red);border-color:var(--red)" onclick="_deletePipelineConfirm(\'' + escHtml(id) + '\')">Delete</button>' +
|
|
60
61
|
'</div>' +
|
|
@@ -236,4 +237,88 @@ async function _submitCreatePipeline() {
|
|
|
236
237
|
} catch (e) { alert('Error: ' + e.message); openCreatePipelineModal(); }
|
|
237
238
|
}
|
|
238
239
|
|
|
239
|
-
|
|
240
|
+
function openEditPipelineModal(id) {
|
|
241
|
+
var p = _pipelinesData.find(function(x) { return x.id === id; });
|
|
242
|
+
if (!p) return;
|
|
243
|
+
var inputStyle = 'display:block;width:100%;margin-top:4px;padding:6px 8px;background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text);font-size:var(--text-md);font-family:inherit';
|
|
244
|
+
var pillStyle = 'display:inline-block;padding:4px 10px;margin:2px;border:1px solid var(--border);border-radius:12px;cursor:pointer;font-size:11px;color:var(--text);background:var(--bg);user-select:none;transition:all 0.15s';
|
|
245
|
+
var linkStyle = 'font-size:10px;color:var(--blue);cursor:pointer;text-decoration:underline;margin-right:8px';
|
|
246
|
+
var tz = Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
247
|
+
var hasCron = !!p.trigger?.cron;
|
|
248
|
+
var picker = hasCron ? _parseCronToPicker(p.trigger.cron) : { hour: 9, minute: 0, days: [1,2,3,4,5] };
|
|
249
|
+
|
|
250
|
+
var hourOpts = '';
|
|
251
|
+
for (var h = 0; h < 24; h++) hourOpts += '<option value="' + h + '"' + (h === picker.hour ? ' selected' : '') + '>' + String(h).padStart(2, '0') + '</option>';
|
|
252
|
+
var minOpts = '';
|
|
253
|
+
for (var m = 0; m <= 55; m += 5) minOpts += '<option value="' + m + '"' + (m === picker.minute ? ' selected' : '') + '>' + String(m).padStart(2, '0') + '</option>';
|
|
254
|
+
|
|
255
|
+
var dayOrder = [0, 1, 2, 3, 4, 5, 6];
|
|
256
|
+
var dayLabels = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
|
|
257
|
+
var dayPills = dayOrder.map(function(d) {
|
|
258
|
+
var active = picker.days.includes(d);
|
|
259
|
+
return '<span class="sched-day-pill' + (active ? ' active' : '') + '" data-day="' + d + '" ' +
|
|
260
|
+
'style="' + pillStyle + (active ? ';background:var(--blue);color:#fff;border-color:var(--blue)' : '') + '" ' +
|
|
261
|
+
'onclick="_toggleDayPill(this);_updatePlCronPreview()">' + dayLabels[d] + '</span>';
|
|
262
|
+
}).join('');
|
|
263
|
+
|
|
264
|
+
window._editPipelineId = id;
|
|
265
|
+
|
|
266
|
+
document.getElementById('modal-title').textContent = 'Edit Pipeline: ' + p.title;
|
|
267
|
+
document.getElementById('modal-body').innerHTML =
|
|
268
|
+
'<div style="display:flex;flex-direction:column;gap:10px">' +
|
|
269
|
+
'<div style="color:var(--muted);font-size:11px">ID: <strong style="color:var(--text)">' + escHtml(id) + '</strong></div>' +
|
|
270
|
+
'<label style="color:var(--text);font-size:var(--text-md)">Title<input id="pl-title" value="' + escHtml(p.title || '') + '" style="' + inputStyle + '"></label>' +
|
|
271
|
+
'<div>' +
|
|
272
|
+
'<div style="display:flex;align-items:center;gap:8px;margin-bottom:6px">' +
|
|
273
|
+
'<label style="color:var(--text);font-size:var(--text-md);margin:0">Schedule</label>' +
|
|
274
|
+
'<label style="font-size:11px;color:var(--muted);cursor:pointer"><input type="checkbox" id="pl-use-cron"' + (hasCron ? ' checked' : '') + ' onchange="_updatePlCronPreview()" style="accent-color:var(--blue)"> Enable automatic trigger</label>' +
|
|
275
|
+
'</div>' +
|
|
276
|
+
'<div id="pl-cron-picker">' +
|
|
277
|
+
'<div style="display:flex;gap:8px;align-items:center">' +
|
|
278
|
+
'<select id="pl-pick-hour" style="' + inputStyle + ';width:auto;display:inline-block" onchange="_updatePlCronPreview()">' + hourOpts + '</select>' +
|
|
279
|
+
'<span style="color:var(--muted)">:</span>' +
|
|
280
|
+
'<select id="pl-pick-minute" style="' + inputStyle + ';width:auto;display:inline-block" onchange="_updatePlCronPreview()">' + minOpts + '</select>' +
|
|
281
|
+
'<span style="font-size:10px;color:var(--muted)">' + escHtml(tz) + '</span>' +
|
|
282
|
+
'</div>' +
|
|
283
|
+
'<div style="margin-top:8px">' + dayPills + '</div>' +
|
|
284
|
+
'<div style="margin-top:6px">' +
|
|
285
|
+
'<span style="' + linkStyle + '" onclick="_quickSelectDays(\'all\');_updatePlCronPreview()">Every day</span>' +
|
|
286
|
+
'<span style="' + linkStyle + '" onclick="_quickSelectDays(\'weekdays\');_updatePlCronPreview()">Weekdays</span>' +
|
|
287
|
+
'<span style="' + linkStyle + '" onclick="_quickSelectDays(\'weekends\');_updatePlCronPreview()">Weekends</span>' +
|
|
288
|
+
'</div>' +
|
|
289
|
+
'<div id="pl-cron-preview" style="margin-top:4px;font-size:11px;color:var(--blue)"></div>' +
|
|
290
|
+
'</div>' +
|
|
291
|
+
'</div>' +
|
|
292
|
+
'<label style="color:var(--text);font-size:var(--text-md)">Stages (JSON array)<textarea id="pl-stages" rows="10" style="' + inputStyle + ';resize:vertical;font-family:Consolas,monospace">' + escHtml(JSON.stringify(p.stages || [], null, 2)) + '</textarea></label>' +
|
|
293
|
+
'<div style="display:flex;justify-content:flex-end;gap:8px;margin-top:4px">' +
|
|
294
|
+
'<button onclick="closeModal()" class="pr-pager-btn">Cancel</button>' +
|
|
295
|
+
'<button onclick="_submitEditPipeline()" style="padding:6px 16px;background:var(--blue);color:#fff;border:none;border-radius:var(--radius-sm);cursor:pointer">Save</button>' +
|
|
296
|
+
'</div>' +
|
|
297
|
+
'</div>';
|
|
298
|
+
document.getElementById('modal-body').style.whiteSpace = 'normal';
|
|
299
|
+
document.getElementById('modal-body').style.fontFamily = '';
|
|
300
|
+
document.getElementById('modal').classList.add('open');
|
|
301
|
+
_updatePlCronPreview();
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
async function _submitEditPipeline() {
|
|
305
|
+
var id = window._editPipelineId;
|
|
306
|
+
if (!id) return;
|
|
307
|
+
var title = document.getElementById('pl-title')?.value?.trim();
|
|
308
|
+
var useCron = document.getElementById('pl-use-cron')?.checked;
|
|
309
|
+
var cron = useCron ? (window._plComputedCron || '') : '';
|
|
310
|
+
var stagesRaw = document.getElementById('pl-stages')?.value?.trim();
|
|
311
|
+
if (!title) { alert('Title required'); return; }
|
|
312
|
+
var stages;
|
|
313
|
+
try { stages = JSON.parse(stagesRaw); } catch (e) { alert('Invalid JSON in stages: ' + e.message); return; }
|
|
314
|
+
if (!Array.isArray(stages) || stages.length === 0) { alert('Stages must be a non-empty array'); return; }
|
|
315
|
+
|
|
316
|
+
var body = { id: id, title: title, stages: stages, trigger: cron ? { cron: cron } : null };
|
|
317
|
+
try {
|
|
318
|
+
var res = await fetch('/api/pipelines/update', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) });
|
|
319
|
+
if (res.ok) { closeModal(); showToast('cmd-toast', 'Pipeline updated', true); refresh(); }
|
|
320
|
+
else { var d = await res.json().catch(function() { return {}; }); alert('Failed: ' + (d.error || 'unknown')); }
|
|
321
|
+
} catch (e) { alert('Error: ' + e.message); }
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
window.MinionsPipelines = { renderPipelines, openPipelineDetail, openCreatePipelineModal, openEditPipelineModal };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<section>
|
|
2
2
|
<h2>Pipelines <span class="count" id="pipelines-count">0</span>
|
|
3
3
|
<button class="pr-pager-btn" style="font-size:9px;padding:1px 6px;color:var(--green);border-color:var(--green);margin-left:8px" onclick="openCreatePipelineModal()">+ New Pipeline</button>
|
|
4
|
-
<span style="font-size:10px;color:var(--muted);font-weight:400;text-transform:none;letter-spacing:0">
|
|
4
|
+
<span style="font-size:10px;color:var(--muted);font-weight:400;text-transform:none;letter-spacing:0">multi-stage workflows with dependencies — chain meetings, plans, tasks, merges in any order, on a schedule or manual</span>
|
|
5
5
|
</h2>
|
|
6
6
|
<div id="pipelines-content"><p class="empty">No pipelines yet. Create one to chain stages like audit → meeting → plan → merge.</p></div>
|
|
7
7
|
</section>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<section id="scheduled-section">
|
|
2
2
|
<h2>Scheduled Tasks <span class="count" id="scheduled-count">0</span>
|
|
3
3
|
<button class="pr-pager-btn" style="font-size:9px;padding:1px 6px;color:var(--green);border-color:var(--green);margin-left:8px" onclick="openCreateScheduleModal()">+ New</button>
|
|
4
|
-
<span style="font-size:10px;color:var(--muted);font-weight:400;text-transform:none;letter-spacing:0">
|
|
4
|
+
<span style="font-size:10px;color:var(--muted);font-weight:400;text-transform:none;letter-spacing:0">single recurring tasks on a cron — for multi-step workflows, use Pipelines</span>
|
|
5
5
|
</h2>
|
|
6
6
|
<div id="scheduled-content"><p class="empty">No scheduled tasks. Add one to automate recurring work.</p></div>
|
|
7
7
|
</section>
|
package/dashboard.js
CHANGED
|
@@ -387,6 +387,7 @@ Available action types:
|
|
|
387
387
|
- **delete-schedule**: Delete a scheduled task. Fields: id.
|
|
388
388
|
- **create-meeting**: Start a team meeting. Fields: title (short meeting name), agenda (detailed text — what agents should investigate/debate, numbered items work best), agents (array of agent IDs), rounds (optional, default 3), project (optional).
|
|
389
389
|
- **set-config**: Update engine settings. Fields: setting (setting name), value (new value). Valid settings: autoApprovePlans (bool), autoDecompose (bool), allowTempAgents (bool), maxConcurrent (number), maxTurns (number). Example: { "type": "set-config", "setting": "autoApprovePlans", "value": true }
|
|
390
|
+
- **edit-pipeline**: Update an existing pipeline. Fields: id (pipeline ID), title (optional), stages (optional, JSON array), trigger (optional, { cron: "minute hour dow" } or null for manual).
|
|
390
391
|
|
|
391
392
|
## Rules
|
|
392
393
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yemi33/minions",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.141",
|
|
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"
|