@yemi33/minions 0.1.238 → 0.1.240

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,8 +1,9 @@
1
1
  # Changelog
2
2
 
3
- ## 0.1.238 (2026-04-03)
3
+ ## 0.1.240 (2026-04-03)
4
4
 
5
5
  ### Features
6
+ - capture-demos seeds mock data for richer screenshots
6
7
  - add capture-demos skill for regenerating GitHub Pages screenshots
7
8
 
8
9
  ### Fixes
@@ -10,6 +11,7 @@
10
11
  - clean _pendingReason on all status→done transitions, not just updateWorkItemStatus
11
12
 
12
13
  ### Other
14
+ - docs: fix quick start — use 'minions dash' not raw URL
13
15
  - docs: update GitHub Pages with all features + fresh screenshots
14
16
  - docs: fix outdated references across all documentation
15
17
 
@@ -1,82 +1,146 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
3
  * Capture dashboard screenshots for GitHub Pages.
4
- * Run: npx playwright test docs/capture-demos.js (or node docs/capture-demos.js)
4
+ * Seeds demo data, captures all pages, then cleans up.
5
+ *
6
+ * Run: node docs/capture-demos.js
7
+ * Requires: dashboard running on :7331, playwright chromium installed
5
8
  */
6
9
  const { chromium } = require('@playwright/test');
10
+ const { execSync } = require('child_process');
7
11
  const path = require('path');
8
12
 
9
13
  const DEMO_DIR = path.join(__dirname, 'demo');
10
14
  const BASE = 'http://localhost:7331';
15
+ const ROOT = path.resolve(__dirname, '..');
11
16
 
12
17
  async function capture() {
18
+ // Seed demo data
19
+ console.log(' Seeding demo data...');
20
+ execSync(`node "${path.join(ROOT, 'test', 'seed-demo-data.js')}"`, { stdio: 'inherit' });
21
+
22
+ // Wait for dashboard to pick up seeded data
23
+ await new Promise(r => setTimeout(r, 5000));
24
+
13
25
  const browser = await chromium.launch({ headless: true });
14
26
  const ctx = await browser.newContext({ viewport: { width: 1400, height: 900 }, colorScheme: 'dark' });
15
27
  const page = await ctx.newPage();
16
28
 
17
- // Wait for dashboard to load
18
- await page.goto(BASE, { waitUntil: 'networkidle' });
19
- await page.waitForTimeout(2000);
20
-
21
- // 1. Home / Overview
22
- console.log(' Capturing: home');
23
- await page.screenshot({ path: path.join(DEMO_DIR, '01-dashboard-overview.png'), fullPage: false });
24
-
25
- // 2. Work Items
26
- console.log(' Capturing: work items');
27
- await page.click('a[data-page="work"]');
28
- await page.waitForTimeout(1500);
29
- await page.screenshot({ path: path.join(DEMO_DIR, '02-work-items.png'), fullPage: false });
30
-
31
- // 3. Plans & PRD
32
- console.log(' Capturing: plans & PRD');
33
- await page.click('a[data-page="plans"]');
34
- await page.waitForTimeout(1500);
35
- await page.screenshot({ path: path.join(DEMO_DIR, '03-plans-prd.png'), fullPage: false });
36
-
37
- // 4. Pull Requests
38
- console.log(' Capturing: pull requests');
39
- await page.click('a[data-page="prs"]');
40
- await page.waitForTimeout(1500);
41
- await page.screenshot({ path: path.join(DEMO_DIR, '04-pull-requests.png'), fullPage: false });
42
-
43
- // 5. Meetings
44
- console.log(' Capturing: meetings');
45
- await page.click('a[data-page="meetings"]');
46
- await page.waitForTimeout(1500);
47
- await page.screenshot({ path: path.join(DEMO_DIR, '05-meetings.png'), fullPage: false });
48
-
49
- // 6. Pipelines
50
- console.log(' Capturing: pipelines');
51
- await page.click('a[data-page="pipelines"]');
52
- await page.waitForTimeout(1500);
53
- await page.screenshot({ path: path.join(DEMO_DIR, '06-pipelines.png'), fullPage: false });
54
-
55
- // 7. Notes & KB
56
- console.log(' Capturing: notes & KB');
57
- await page.click('a[data-page="inbox"]');
58
- await page.waitForTimeout(1500);
59
- await page.screenshot({ path: path.join(DEMO_DIR, '07-notes-kb.png'), fullPage: false });
60
-
61
- // 8. Schedules
62
- console.log(' Capturing: schedules');
63
- await page.click('a[data-page="schedule"]');
64
- await page.waitForTimeout(1500);
65
- await page.screenshot({ path: path.join(DEMO_DIR, '08-schedules.png'), fullPage: false });
66
-
67
- // 9. Engine page (dispatch, log, metrics)
68
- console.log(' Capturing: engine');
69
- await page.click('a[data-page="engine"]');
70
- await page.waitForTimeout(1500);
71
- await page.screenshot({ path: path.join(DEMO_DIR, '09-engine.png'), fullPage: false });
72
-
73
- // 10. Command Center
74
- console.log(' Capturing: command center');
75
- await page.click('#cc-toggle-btn');
76
- await page.waitForTimeout(1000);
77
- await page.screenshot({ path: path.join(DEMO_DIR, '10-command-center.png'), fullPage: false });
78
-
79
- await browser.close();
29
+ try {
30
+ await page.goto(BASE, { waitUntil: 'networkidle' });
31
+ await page.waitForTimeout(3000);
32
+
33
+ // 1. Home / Overview (agents should show as working from seeded dispatches)
34
+ console.log(' Capturing: home');
35
+ await page.screenshot({ path: path.join(DEMO_DIR, '01-dashboard-overview.png'), fullPage: false });
36
+
37
+ // 2. Work Items
38
+ console.log(' Capturing: work items');
39
+ await page.click('a[data-page="work"]');
40
+ await page.waitForTimeout(2000);
41
+ await page.screenshot({ path: path.join(DEMO_DIR, '02-work-items.png'), fullPage: false });
42
+
43
+ // 3. Plans & PRD (seeded PRD with dependency graph)
44
+ console.log(' Capturing: plans & PRD');
45
+ await page.click('a[data-page="plans"]');
46
+ await page.waitForTimeout(2000);
47
+ await page.screenshot({ path: path.join(DEMO_DIR, '03-plans-prd.png'), fullPage: false });
48
+
49
+ // 4. Pull Requests
50
+ console.log(' Capturing: pull requests');
51
+ await page.click('a[data-page="prs"]');
52
+ await page.waitForTimeout(1500);
53
+ await page.screenshot({ path: path.join(DEMO_DIR, '04-pull-requests.png'), fullPage: false });
54
+
55
+ // 5. Meetings
56
+ console.log(' Capturing: meetings');
57
+ await page.click('a[data-page="meetings"]');
58
+ await page.waitForTimeout(1500);
59
+ await page.screenshot({ path: path.join(DEMO_DIR, '05-meetings.png'), fullPage: false });
60
+
61
+ // 6. Pipelines
62
+ console.log(' Capturing: pipelines');
63
+ await page.click('a[data-page="pipelines"]');
64
+ await page.waitForTimeout(1500);
65
+ await page.screenshot({ path: path.join(DEMO_DIR, '06-pipelines.png'), fullPage: false });
66
+
67
+ // 7. Notes & KB
68
+ console.log(' Capturing: notes & KB');
69
+ await page.click('a[data-page="inbox"]');
70
+ await page.waitForTimeout(1500);
71
+ await page.screenshot({ path: path.join(DEMO_DIR, '07-notes-kb.png'), fullPage: false });
72
+
73
+ // 8. Schedules
74
+ console.log(' Capturing: schedules');
75
+ await page.click('a[data-page="schedule"]');
76
+ await page.waitForTimeout(1500);
77
+ await page.screenshot({ path: path.join(DEMO_DIR, '08-schedules.png'), fullPage: false });
78
+
79
+ // 9. Engine page (dispatch, log, metrics)
80
+ console.log(' Capturing: engine');
81
+ await page.click('a[data-page="engine"]');
82
+ await page.waitForTimeout(1500);
83
+ await page.screenshot({ path: path.join(DEMO_DIR, '09-engine.png'), fullPage: false });
84
+
85
+ // 10. Command Center with mock conversation
86
+ console.log(' Capturing: command center');
87
+ await page.click('#cc-toggle-btn');
88
+ await page.waitForTimeout(500);
89
+
90
+ // Inject mock CC messages into the DOM for the screenshot
91
+ await page.evaluate(() => {
92
+ const el = document.getElementById('cc-messages');
93
+ if (!el) return;
94
+ el.innerHTML = '';
95
+
96
+ function addMsg(role, html) {
97
+ const div = document.createElement('div');
98
+ div.className = 'cc-msg cc-msg-' + role;
99
+ div.innerHTML = html;
100
+ el.appendChild(div);
101
+ }
102
+
103
+ addMsg('user', 'Create a plan to add OAuth2 authentication to OfficeAgent with JWT tokens and role-based access control.');
104
+
105
+ addMsg('assistant', '<div class="md-content">' +
106
+ '<p>I\'ll create a plan for OAuth2 authentication with RBAC. Let me check the current auth setup first.</p>' +
107
+ '<p>After reviewing the codebase, here\'s what I\'m dispatching:</p>' +
108
+ '<ul>' +
109
+ '<li><strong>Plan created:</strong> <code>auth-plan.md</code> with 5 features (OAuth2, RBAC, rate limiting, sessions, audit logging)</li>' +
110
+ '<li><strong>Dispatched to Lambert</strong> for PRD generation</li>' +
111
+ '</ul>' +
112
+ '<p>The plan is now in <strong>Plans &amp; PRD</strong> awaiting your approval. Once approved, Dallas and Rebecca will start implementing in parallel.</p>' +
113
+ '</div>' +
114
+ '<div style="margin-top:8px;padding:6px 10px;background:rgba(63,185,80,0.1);border:1px solid rgba(63,185,80,0.2);border-radius:6px;font-size:11px;color:var(--green)">' +
115
+ '&#x2713; Created plan: auth-plan.md &nbsp; &#x2713; Dispatched: Lambert &rarr; plan-to-prd</div>');
116
+
117
+ addMsg('user', 'What\'s the status of the auth implementation?');
118
+
119
+ addMsg('assistant', '<div class="md-content">' +
120
+ '<p>Here\'s the current status:</p>' +
121
+ '<table style="width:100%;font-size:12px">' +
122
+ '<tr><td style="color:var(--green)">&#x2713; Done</td><td>OAuth2 Middleware</td><td style="color:var(--muted)">Dallas &mdash; PR-4520 merged</td></tr>' +
123
+ '<tr><td style="color:var(--green)">&#x2713; Done</td><td>Role-Based Access Control</td><td style="color:var(--muted)">Rebecca &mdash; PR-4521 in review</td></tr>' +
124
+ '<tr><td style="color:var(--blue)">&#x25CB; Active</td><td>API Rate Limiting</td><td style="color:var(--muted)">Dallas &mdash; working now</td></tr>' +
125
+ '<tr><td style="color:var(--blue)">&#x25CB; Active</td><td>Session Management</td><td style="color:var(--muted)">Rebecca &mdash; working now</td></tr>' +
126
+ '<tr><td style="color:var(--muted)">&#x25CB; Pending</td><td>Audit Logging</td><td style="color:var(--muted)">Blocked on RBAC</td></tr>' +
127
+ '</table>' +
128
+ '<p><strong>2/5 done, 2 active, 1 pending.</strong> On track for completion today.</p>' +
129
+ '</div>');
130
+
131
+ el.scrollTop = el.scrollHeight;
132
+ });
133
+ await page.waitForTimeout(500);
134
+ await page.screenshot({ path: path.join(DEMO_DIR, '10-command-center.png'), fullPage: false });
135
+
136
+ } finally {
137
+ await browser.close();
138
+
139
+ // Clean up demo data
140
+ console.log(' Cleaning demo data...');
141
+ execSync(`node "${path.join(ROOT, 'test', 'seed-demo-data.js')}" --clean`, { stdio: 'inherit' });
142
+ }
143
+
80
144
  console.log('\n Done! Screenshots saved to docs/demo/');
81
145
  }
82
146
 
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
package/docs/index.html CHANGED
@@ -225,8 +225,8 @@ minions init
225
225
  <span class="comment"># Give your first task</span>
226
226
  minions work "Explore the codebase and document the architecture"
227
227
 
228
- <span class="comment"># Open dashboard</span>
229
- http://localhost:7331
228
+ <span class="comment"># Open dashboard at http://localhost:7331</span>
229
+ minions dash
230
230
 
231
231
  <span class="comment"># Update to latest</span>
232
232
  minions update</pre>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.238",
3
+ "version": "0.1.240",
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"