@jaimevalasek/aioson 1.4.0 → 1.5.1
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 +31 -1
- package/LICENSE +661 -21
- package/README.md +3 -1
- package/docs/en/squad-dashboard.md +372 -0
- package/docs/openclaw-bridge.md +308 -0
- package/docs/pt/agentes.md +124 -10
- package/docs/pt/cenarios.md +46 -2
- package/docs/pt/comandos-cli.md +60 -1
- package/docs/pt/inicio-rapido.md +18 -2
- package/docs/pt/squad-dashboard.md +373 -0
- package/docs/testing/genome-2.0-matrix.md +5 -5
- package/docs/testing/genome-2.0-rollout.md +9 -9
- package/package.json +2 -2
- package/src/backup-local.js +74 -0
- package/src/cli.js +98 -0
- package/src/commands/backup-local-cmd.js +25 -0
- package/src/commands/runtime.js +242 -0
- package/src/commands/setup-context.js +7 -2
- package/src/commands/squad-daemon.js +209 -0
- package/src/commands/squad-dashboard.js +39 -0
- package/src/commands/squad-deploy.js +64 -0
- package/src/commands/squad-doctor.js +52 -0
- package/src/commands/squad-mcp.js +270 -0
- package/src/commands/squad-processes.js +56 -0
- package/src/commands/squad-recovery.js +42 -0
- package/src/commands/squad-roi.js +291 -0
- package/src/commands/squad-score.js +250 -0
- package/src/commands/squad-status.js +37 -1
- package/src/commands/squad-validate.js +62 -1
- package/src/commands/squad-webhook.js +160 -0
- package/src/commands/squad-worker.js +191 -0
- package/src/commands/squad-worktrees.js +75 -0
- package/src/commands/web-map.js +70 -0
- package/src/commands/web-scrape.js +71 -0
- package/src/constants.js +8 -0
- package/src/context-writer.js +45 -1
- package/src/i18n/messages/en.js +127 -1
- package/src/i18n/messages/es.js +117 -0
- package/src/i18n/messages/fr.js +117 -0
- package/src/i18n/messages/pt-BR.js +126 -1
- package/src/lib/webhook-server.js +328 -0
- package/src/mcp-connectors/registry.js +602 -0
- package/src/runtime-store.js +259 -2
- package/src/squad/external-session.js +180 -0
- package/src/squad/inter-squad.js +74 -0
- package/src/squad/recovery-context.js +201 -0
- package/src/squad/worktree-manager.js +114 -0
- package/src/squad-daemon.js +490 -0
- package/src/squad-dashboard/api.js +223 -0
- package/src/squad-dashboard/attachment-handler.js +93 -0
- package/src/squad-dashboard/context-monitor.js +157 -0
- package/src/squad-dashboard/execution-logs.js +115 -0
- package/src/squad-dashboard/hunk-review.js +209 -0
- package/src/squad-dashboard/metrics.js +133 -0
- package/src/squad-dashboard/process-monitor.js +125 -0
- package/src/squad-dashboard/renderer.js +858 -0
- package/src/squad-dashboard/server.js +232 -0
- package/src/squad-dashboard/styles.js +525 -0
- package/src/squad-dashboard/token-tracker.js +99 -0
- package/src/web.js +284 -0
- package/src/worker-runner.js +339 -0
- package/template/.aioson/agents/analyst.md +4 -0
- package/template/.aioson/agents/architect.md +4 -0
- package/template/.aioson/agents/dev.md +120 -11
- package/template/.aioson/agents/deyvin.md +8 -0
- package/template/.aioson/agents/neo.md +152 -0
- package/template/.aioson/agents/orache.md +17 -0
- package/template/.aioson/agents/orchestrator.md +26 -0
- package/template/.aioson/agents/product.md +60 -12
- package/template/.aioson/agents/qa.md +1 -0
- package/template/.aioson/agents/setup.md +63 -19
- package/template/.aioson/agents/sheldon.md +603 -0
- package/template/.aioson/agents/squad.md +191 -0
- package/template/.aioson/agents/tester.md +254 -0
- package/template/.aioson/agents/ux-ui.md +12 -0
- package/template/.aioson/config.md +6 -0
- package/template/.aioson/locales/en/agents/analyst.md +8 -0
- package/template/.aioson/locales/en/agents/architect.md +8 -0
- package/template/.aioson/locales/en/agents/dev.md +66 -7
- package/template/.aioson/locales/en/agents/deyvin.md +8 -0
- package/template/.aioson/locales/en/agents/neo.md +8 -0
- package/template/.aioson/locales/en/agents/orchestrator.md +26 -0
- package/template/.aioson/locales/en/agents/qa.md +49 -0
- package/template/.aioson/locales/en/agents/setup.md +2 -1
- package/template/.aioson/locales/en/agents/sheldon.md +340 -0
- package/template/.aioson/locales/en/agents/ux-ui.md +8 -0
- package/template/.aioson/locales/es/agents/analyst.md +8 -0
- package/template/.aioson/locales/es/agents/architect.md +8 -0
- package/template/.aioson/locales/es/agents/dev.md +66 -7
- package/template/.aioson/locales/es/agents/deyvin.md +8 -0
- package/template/.aioson/locales/es/agents/neo.md +48 -0
- package/template/.aioson/locales/es/agents/orchestrator.md +26 -0
- package/template/.aioson/locales/es/agents/qa.md +26 -0
- package/template/.aioson/locales/es/agents/setup.md +2 -1
- package/template/.aioson/locales/es/agents/sheldon.md +192 -0
- package/template/.aioson/locales/es/agents/squad.md +63 -0
- package/template/.aioson/locales/es/agents/ux-ui.md +8 -0
- package/template/.aioson/locales/fr/agents/analyst.md +8 -0
- package/template/.aioson/locales/fr/agents/architect.md +8 -0
- package/template/.aioson/locales/fr/agents/dev.md +66 -7
- package/template/.aioson/locales/fr/agents/deyvin.md +8 -0
- package/template/.aioson/locales/fr/agents/neo.md +48 -0
- package/template/.aioson/locales/fr/agents/orchestrator.md +26 -0
- package/template/.aioson/locales/fr/agents/qa.md +26 -0
- package/template/.aioson/locales/fr/agents/setup.md +2 -1
- package/template/.aioson/locales/fr/agents/sheldon.md +192 -0
- package/template/.aioson/locales/fr/agents/squad.md +63 -0
- package/template/.aioson/locales/fr/agents/ux-ui.md +8 -0
- package/template/.aioson/locales/pt-BR/agents/analyst.md +19 -0
- package/template/.aioson/locales/pt-BR/agents/architect.md +19 -0
- package/template/.aioson/locales/pt-BR/agents/dev.md +75 -12
- package/template/.aioson/locales/pt-BR/agents/deyvin.md +8 -0
- package/template/.aioson/locales/pt-BR/agents/neo.md +147 -0
- package/template/.aioson/locales/pt-BR/agents/orchestrator.md +26 -0
- package/template/.aioson/locales/pt-BR/agents/product.md +8 -3
- package/template/.aioson/locales/pt-BR/agents/qa.md +60 -0
- package/template/.aioson/locales/pt-BR/agents/setup.md +2 -1
- package/template/.aioson/locales/pt-BR/agents/sheldon.md +192 -0
- package/template/.aioson/locales/pt-BR/agents/squad.md +105 -0
- package/template/.aioson/locales/pt-BR/agents/ux-ui.md +8 -0
- package/template/.aioson/schemas/squad-blueprint.schema.json +21 -0
- package/template/.aioson/schemas/squad-manifest.schema.json +178 -1
- package/template/.aioson/skills/design/bold-editorial-ui/SKILL.md +205 -0
- package/template/.aioson/skills/design/bold-editorial-ui/references/art-direction.md +338 -0
- package/template/.aioson/skills/design/bold-editorial-ui/references/components.md +977 -0
- package/template/.aioson/skills/design/bold-editorial-ui/references/dashboards.md +218 -0
- package/template/.aioson/skills/design/bold-editorial-ui/references/design-tokens.md +326 -0
- package/template/.aioson/skills/design/bold-editorial-ui/references/motion.md +461 -0
- package/template/.aioson/skills/design/bold-editorial-ui/references/patterns.md +293 -0
- package/template/.aioson/skills/design/bold-editorial-ui/references/websites.md +352 -0
- package/template/.aioson/skills/design/clean-saas-ui/SKILL.md +210 -0
- package/template/.aioson/skills/design/clean-saas-ui/references/art-direction.md +319 -0
- package/template/.aioson/skills/design/clean-saas-ui/references/components.md +365 -0
- package/template/.aioson/skills/design/clean-saas-ui/references/dashboards.md +196 -0
- package/template/.aioson/skills/design/clean-saas-ui/references/design-tokens.md +244 -0
- package/template/.aioson/skills/design/clean-saas-ui/references/motion.md +235 -0
- package/template/.aioson/skills/design/clean-saas-ui/references/patterns.md +215 -0
- package/template/.aioson/skills/design/clean-saas-ui/references/websites.md +295 -0
- package/template/.aioson/skills/design/cognitive-core-ui/SKILL.md +55 -9
- package/template/.aioson/skills/design/cognitive-core-ui/references/art-direction.md +339 -0
- package/template/.aioson/skills/design/cognitive-core-ui/references/components.md +1 -1
- package/template/.aioson/skills/design/cognitive-core-ui/references/dashboards.md +100 -0
- package/template/.aioson/skills/design/cognitive-core-ui/references/design-tokens.md +43 -9
- package/template/.aioson/skills/design/cognitive-core-ui/references/motion.md +40 -0
- package/template/.aioson/skills/design/cognitive-core-ui/references/patterns.md +1 -1
- package/template/.aioson/skills/design/cognitive-core-ui/references/websites.md +99 -12
- package/template/.aioson/skills/design/warm-craft-ui/SKILL.md +209 -0
- package/template/.aioson/skills/design/warm-craft-ui/references/art-direction.md +324 -0
- package/template/.aioson/skills/design/warm-craft-ui/references/components.md +508 -0
- package/template/.aioson/skills/design/warm-craft-ui/references/dashboards.md +223 -0
- package/template/.aioson/skills/design/warm-craft-ui/references/design-tokens.md +374 -0
- package/template/.aioson/skills/design/warm-craft-ui/references/motion.md +356 -0
- package/template/.aioson/skills/design/warm-craft-ui/references/patterns.md +288 -0
- package/template/.aioson/skills/design/warm-craft-ui/references/websites.md +289 -0
- package/template/.aioson/skills/premium-visual-design/SKILL.md +83 -0
- package/template/.aioson/skills/premium-visual-design/components/agent-badge.md +92 -0
- package/template/.aioson/skills/premium-visual-design/components/dependency-node.md +102 -0
- package/template/.aioson/skills/premium-visual-design/components/mention-autocomplete.md +136 -0
- package/template/.aioson/skills/premium-visual-design/components/notification-center.md +136 -0
- package/template/.aioson/skills/premium-visual-design/components/review-action-bar.md +188 -0
- package/template/.aioson/skills/premium-visual-design/components/team-switcher.md +131 -0
- package/template/.aioson/skills/premium-visual-design/patterns/agent-message-thread.md +198 -0
- package/template/.aioson/skills/premium-visual-design/patterns/notification-panel.md +275 -0
- package/template/.aioson/skills/premium-visual-design/patterns/review-workflow-ui.md +234 -0
- package/template/.aioson/skills/premium-visual-design/patterns/task-dependency-graph.md +147 -0
- package/template/.aioson/skills/premium-visual-design/tokens/status-extended.md +142 -0
- package/template/.aioson/skills/squad/formats/catalog.json +15 -0
- package/template/.aioson/skills/squad/formats/content/blog-post.md +47 -0
- package/template/.aioson/skills/squad/formats/content/newsletter.md +47 -0
- package/template/.aioson/skills/squad/formats/creative/podcast-script.md +43 -0
- package/template/.aioson/skills/squad/formats/creative/video-script.md +41 -0
- package/template/.aioson/skills/squad/formats/social/instagram-feed.md +42 -0
- package/template/.aioson/skills/squad/formats/social/linkedin-post.md +42 -0
- package/template/.aioson/skills/squad/formats/social/tiktok.md +39 -0
- package/template/.aioson/skills/squad/formats/social/twitter-thread.md +39 -0
- package/template/.aioson/skills/squad/formats/social/youtube-long.md +47 -0
- package/template/.aioson/skills/squad/formats/social/youtube-shorts.md +39 -0
- package/template/.aioson/skills/squad/patterns/multi-platform-pattern.md +108 -0
- package/template/.aioson/skills/squad/patterns/persona-based-pattern.md +98 -0
- package/template/.aioson/skills/squad/patterns/pipeline-pattern.md +106 -0
- package/template/.aioson/skills/squad/patterns/review-loop-pattern.md +81 -0
- package/template/.aioson/skills/squad/references/checklist-templates.md +122 -0
- package/template/.aioson/skills/squad/references/executor-archetypes.md +123 -0
- package/template/.aioson/skills/squad/references/workflow-templates.md +169 -0
- package/template/.aioson/skills/static/debugging-protocol.md +42 -0
- package/template/.aioson/skills/static/git-worktrees.md +36 -0
- package/template/.aioson/tasks/implementation-plan.md +19 -0
- package/template/.aioson/tasks/squad-design.md +28 -0
- package/template/.aioson/tasks/squad-profile.md +48 -0
- package/template/.aioson/tasks/squad-review.md +61 -0
- package/template/.aioson/tasks/squad-task-decompose.md +66 -0
- package/template/.claude/commands/aioson/agent/neo.md +5 -0
- package/template/.claude/commands/aioson/agent/tester.md +5 -0
- package/template/.gemini/GEMINI.md +1 -0
- package/template/.gemini/commands/aios-neo.toml +4 -0
- package/template/.gemini/commands/aios-tester.toml +6 -0
- package/template/AGENTS.md +3 -0
- package/template/CLAUDE.md +5 -2
- package/template/OPENCODE.md +2 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# Notification Center Component
|
|
2
|
+
|
|
3
|
+
Bell icon with unread count badge + toggle for the notification panel dropdown.
|
|
4
|
+
|
|
5
|
+
## Anatomy
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
🔔 [3] ← no notifications: 🔔 only
|
|
9
|
+
🔔 [!] ← critical: red badge
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## States
|
|
13
|
+
|
|
14
|
+
| State | Bell | Badge |
|
|
15
|
+
|-------|------|-------|
|
|
16
|
+
| No notifications | muted color | hidden |
|
|
17
|
+
| Has unread | normal color | accent bg, count |
|
|
18
|
+
| Has critical unread | normal color | red bg, count |
|
|
19
|
+
| Panel open | accent bg | same |
|
|
20
|
+
|
|
21
|
+
## HTML Structure
|
|
22
|
+
|
|
23
|
+
```html
|
|
24
|
+
<div class="notif-center">
|
|
25
|
+
<button class="notif-bell" id="notif-bell" aria-label="Notifications" aria-expanded="false">
|
|
26
|
+
<!-- Bell SVG or emoji -->
|
|
27
|
+
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
28
|
+
<path d="M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9"/>
|
|
29
|
+
<path d="M13.73 21a2 2 0 0 1-3.46 0"/>
|
|
30
|
+
</svg>
|
|
31
|
+
</button>
|
|
32
|
+
|
|
33
|
+
<!-- Badge — hidden when count = 0 -->
|
|
34
|
+
<span class="notif-badge" id="notif-badge" hidden>3</span>
|
|
35
|
+
|
|
36
|
+
<!-- Panel wrapper — shown on bell click -->
|
|
37
|
+
<div class="notif-panel-wrapper" id="notif-panel-wrapper">
|
|
38
|
+
<!-- Insert notification-panel.md pattern here -->
|
|
39
|
+
</div>
|
|
40
|
+
</div>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## CSS
|
|
44
|
+
|
|
45
|
+
```css
|
|
46
|
+
.notif-center {
|
|
47
|
+
position: relative;
|
|
48
|
+
display: inline-flex;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.notif-bell {
|
|
52
|
+
width: 36px;
|
|
53
|
+
height: 36px;
|
|
54
|
+
display: flex;
|
|
55
|
+
align-items: center;
|
|
56
|
+
justify-content: center;
|
|
57
|
+
border-radius: 6px;
|
|
58
|
+
cursor: pointer;
|
|
59
|
+
color: var(--text-muted);
|
|
60
|
+
background: none;
|
|
61
|
+
border: none;
|
|
62
|
+
transition: background 0.15s, color 0.15s;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.notif-bell:hover {
|
|
66
|
+
background: var(--bg-hover);
|
|
67
|
+
color: var(--text);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.notif-bell[aria-expanded="true"] {
|
|
71
|
+
background: var(--accent-dim);
|
|
72
|
+
color: var(--accent);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.notif-badge {
|
|
76
|
+
position: absolute;
|
|
77
|
+
top: 2px;
|
|
78
|
+
right: 2px;
|
|
79
|
+
min-width: 16px;
|
|
80
|
+
height: 16px;
|
|
81
|
+
border-radius: 8px;
|
|
82
|
+
background: var(--accent);
|
|
83
|
+
color: #fff;
|
|
84
|
+
font-size: 10px;
|
|
85
|
+
font-weight: 700;
|
|
86
|
+
line-height: 16px;
|
|
87
|
+
text-align: center;
|
|
88
|
+
padding: 0 4px;
|
|
89
|
+
pointer-events: none;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.notif-badge.critical {
|
|
93
|
+
background: var(--danger);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
.notif-panel-wrapper {
|
|
97
|
+
position: absolute;
|
|
98
|
+
top: calc(100% + 8px);
|
|
99
|
+
right: 0;
|
|
100
|
+
z-index: 500;
|
|
101
|
+
display: none;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.notif-panel-wrapper.open {
|
|
105
|
+
display: block;
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Interaction (JS spec)
|
|
110
|
+
|
|
111
|
+
```javascript
|
|
112
|
+
// Toggle panel on bell click
|
|
113
|
+
bellBtn.addEventListener('click', function() {
|
|
114
|
+
const isOpen = wrapper.classList.toggle('open');
|
|
115
|
+
bellBtn.setAttribute('aria-expanded', String(isOpen));
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
// Close on outside click
|
|
119
|
+
document.addEventListener('click', function(e) {
|
|
120
|
+
if (!notifCenter.contains(e.target)) {
|
|
121
|
+
wrapper.classList.remove('open');
|
|
122
|
+
bellBtn.setAttribute('aria-expanded', 'false');
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
// Update badge
|
|
127
|
+
function setNotifCount(count, hasCritical) {
|
|
128
|
+
badge.hidden = count === 0;
|
|
129
|
+
badge.textContent = count > 99 ? '99+' : String(count);
|
|
130
|
+
badge.classList.toggle('critical', hasCritical);
|
|
131
|
+
}
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## Placement
|
|
135
|
+
|
|
136
|
+
Place in the top-right of the dashboard header bar. Keep 8px gap from other header icons.
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
# Review Action Bar Component
|
|
2
|
+
|
|
3
|
+
Approve / Reject / Comment bar shown at the bottom of each diff hunk in the review workflow.
|
|
4
|
+
|
|
5
|
+
## Anatomy
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
┌────────────────────────────────────────────────────────┐
|
|
9
|
+
│ Hunk 2/4 · @@ -45,7 +45,9 @@ [✓ Approve] [✗ Reject] [💬 Comment] │
|
|
10
|
+
└────────────────────────────────────────────────────────┘
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## States
|
|
14
|
+
|
|
15
|
+
| State | Approve btn | Reject btn | Comment btn |
|
|
16
|
+
|-------|------------|-----------|------------|
|
|
17
|
+
| `pending` | outlined | outlined | outlined |
|
|
18
|
+
| `approved` | filled green | dimmed | dimmed |
|
|
19
|
+
| `rejected` | dimmed | filled red | normal (comment may be shown) |
|
|
20
|
+
| `revised` | outlined | outlined | amber tint |
|
|
21
|
+
|
|
22
|
+
## HTML Structure
|
|
23
|
+
|
|
24
|
+
```html
|
|
25
|
+
<div class="review-action-bar" data-hunk-id="hunk-2" data-status="pending">
|
|
26
|
+
<span class="review-hunk-label">Hunk 2/4 · @@ -45,7 +45,9 @@</span>
|
|
27
|
+
|
|
28
|
+
<div class="review-actions">
|
|
29
|
+
<button class="review-btn approve" data-action="approve">
|
|
30
|
+
✓ Approve
|
|
31
|
+
</button>
|
|
32
|
+
<button class="review-btn reject" data-action="reject">
|
|
33
|
+
✗ Reject
|
|
34
|
+
</button>
|
|
35
|
+
<button class="review-btn comment" data-action="comment">
|
|
36
|
+
💬 Comment
|
|
37
|
+
</button>
|
|
38
|
+
</div>
|
|
39
|
+
</div>
|
|
40
|
+
|
|
41
|
+
<!-- Comment expansion (hidden by default, shown when comment clicked) -->
|
|
42
|
+
<div class="review-comment-box" hidden>
|
|
43
|
+
<textarea class="review-comment-input" placeholder="Leave a comment..."></textarea>
|
|
44
|
+
<div class="review-comment-actions">
|
|
45
|
+
<button class="review-btn comment active">Send</button>
|
|
46
|
+
<button class="review-btn" data-action="cancel-comment">Cancel</button>
|
|
47
|
+
</div>
|
|
48
|
+
</div>
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## CSS
|
|
52
|
+
|
|
53
|
+
```css
|
|
54
|
+
.review-action-bar {
|
|
55
|
+
display: flex;
|
|
56
|
+
align-items: center;
|
|
57
|
+
gap: 8px;
|
|
58
|
+
padding: 8px 12px;
|
|
59
|
+
background: var(--bg-hover);
|
|
60
|
+
border-top: 1px solid var(--border);
|
|
61
|
+
border-radius: 0 0 6px 6px;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.review-hunk-label {
|
|
65
|
+
flex: 1;
|
|
66
|
+
font-size: 11px;
|
|
67
|
+
font-family: monospace;
|
|
68
|
+
color: var(--text-muted);
|
|
69
|
+
overflow: hidden;
|
|
70
|
+
text-overflow: ellipsis;
|
|
71
|
+
white-space: nowrap;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.review-actions {
|
|
75
|
+
display: flex;
|
|
76
|
+
gap: 6px;
|
|
77
|
+
flex-shrink: 0;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.review-btn {
|
|
81
|
+
padding: 4px 12px;
|
|
82
|
+
border-radius: 4px;
|
|
83
|
+
font-size: 12px;
|
|
84
|
+
cursor: pointer;
|
|
85
|
+
border: 1px solid var(--border);
|
|
86
|
+
background: none;
|
|
87
|
+
color: var(--text-muted);
|
|
88
|
+
transition: all 0.15s;
|
|
89
|
+
display: flex;
|
|
90
|
+
align-items: center;
|
|
91
|
+
gap: 4px;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.review-btn:hover {
|
|
95
|
+
color: var(--text);
|
|
96
|
+
border-color: var(--text-muted);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/* Approve */
|
|
100
|
+
.review-btn.approve:hover,
|
|
101
|
+
.review-btn.approve.active {
|
|
102
|
+
background: rgba(74, 222, 128, 0.15);
|
|
103
|
+
color: var(--success);
|
|
104
|
+
border-color: var(--success);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/* Reject */
|
|
108
|
+
.review-btn.reject:hover,
|
|
109
|
+
.review-btn.reject.active {
|
|
110
|
+
background: rgba(248, 113, 113, 0.15);
|
|
111
|
+
color: var(--danger);
|
|
112
|
+
border-color: var(--danger);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/* Comment */
|
|
116
|
+
.review-btn.comment:hover,
|
|
117
|
+
.review-btn.comment.active {
|
|
118
|
+
background: rgba(192, 132, 252, 0.15);
|
|
119
|
+
color: var(--purple, #c084fc);
|
|
120
|
+
border-color: var(--purple, #c084fc);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.review-btn:disabled {
|
|
124
|
+
opacity: 0.35;
|
|
125
|
+
cursor: not-allowed;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/* Comment box */
|
|
129
|
+
.review-comment-box {
|
|
130
|
+
padding: 10px 12px;
|
|
131
|
+
background: var(--bg-card);
|
|
132
|
+
border-top: 1px solid var(--border);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.review-comment-input {
|
|
136
|
+
width: 100%;
|
|
137
|
+
min-height: 64px;
|
|
138
|
+
background: var(--bg-hover);
|
|
139
|
+
border: 1px solid var(--border);
|
|
140
|
+
border-radius: 4px;
|
|
141
|
+
color: var(--text);
|
|
142
|
+
font-size: 13px;
|
|
143
|
+
padding: 8px 10px;
|
|
144
|
+
resize: vertical;
|
|
145
|
+
font-family: var(--font, monospace);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.review-comment-input:focus {
|
|
149
|
+
outline: none;
|
|
150
|
+
border-color: var(--accent);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
.review-comment-actions {
|
|
154
|
+
display: flex;
|
|
155
|
+
gap: 8px;
|
|
156
|
+
margin-top: 8px;
|
|
157
|
+
justify-content: flex-end;
|
|
158
|
+
}
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
## Progress Indicator
|
|
162
|
+
|
|
163
|
+
Show overall review progress above the hunk list:
|
|
164
|
+
|
|
165
|
+
```html
|
|
166
|
+
<div class="review-progress">
|
|
167
|
+
<span class="review-progress-label">2 / 4 hunks reviewed</span>
|
|
168
|
+
<div class="review-progress-bar">
|
|
169
|
+
<div class="review-progress-fill" style="width: 50%"></div>
|
|
170
|
+
</div>
|
|
171
|
+
</div>
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
```css
|
|
175
|
+
.review-progress { display: flex; align-items: center; gap: 12px; margin-bottom: 12px; }
|
|
176
|
+
.review-progress-label { font-size: 12px; color: var(--text-muted); white-space: nowrap; }
|
|
177
|
+
.review-progress-bar { flex: 1; height: 4px; background: var(--bg-hover); border-radius: 2px; }
|
|
178
|
+
.review-progress-fill { height: 100%; background: var(--accent); border-radius: 2px; transition: width 0.3s; }
|
|
179
|
+
/* All done: green */
|
|
180
|
+
[data-all-done] .review-progress-fill { background: var(--success); }
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
## Interaction notes
|
|
184
|
+
|
|
185
|
+
- When `approve` is clicked, add `.active` to approve btn, add `disabled` to reject.
|
|
186
|
+
- When `reject` is clicked, add `.active` to reject btn, optionally auto-open comment box for rejection reason.
|
|
187
|
+
- Click outside comment box or Cancel: collapse it, clear textarea.
|
|
188
|
+
- Sending a comment does NOT change approval state — it's independent.
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# Team Switcher Component
|
|
2
|
+
|
|
3
|
+
Sidebar squad navigation. Shows all squads, highlights the active one, displays mode badge and agent count.
|
|
4
|
+
|
|
5
|
+
## Anatomy
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
─ Squads ─────────────────
|
|
9
|
+
● Alpha Squad [software] 3 agents ← active (accent border + bg)
|
|
10
|
+
Bravo Squad [content] 2 agents
|
|
11
|
+
Gamma Squad [research] 1 agent
|
|
12
|
+
──────────────────────────
|
|
13
|
+
+ New Squad
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## HTML Structure
|
|
17
|
+
|
|
18
|
+
```html
|
|
19
|
+
<nav class="team-switcher">
|
|
20
|
+
<div class="team-switcher-header">Squads</div>
|
|
21
|
+
|
|
22
|
+
<a class="team-item active" href="/squad/alpha">
|
|
23
|
+
<div class="team-name">Alpha Squad</div>
|
|
24
|
+
<div class="team-meta">
|
|
25
|
+
<span class="mode-badge mode-software">software</span>
|
|
26
|
+
<span class="agent-count">3 agents</span>
|
|
27
|
+
</div>
|
|
28
|
+
</a>
|
|
29
|
+
|
|
30
|
+
<a class="team-item" href="/squad/bravo">
|
|
31
|
+
<div class="team-name">Bravo Squad</div>
|
|
32
|
+
<div class="team-meta">
|
|
33
|
+
<span class="mode-badge mode-content">content</span>
|
|
34
|
+
<span class="agent-count">2 agents</span>
|
|
35
|
+
</div>
|
|
36
|
+
</a>
|
|
37
|
+
|
|
38
|
+
<div class="team-switcher-divider"></div>
|
|
39
|
+
<a class="team-item team-item-new" href="/squad/new">+ New Squad</a>
|
|
40
|
+
</nav>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## CSS
|
|
44
|
+
|
|
45
|
+
```css
|
|
46
|
+
.team-switcher {
|
|
47
|
+
width: 240px;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.team-switcher-header {
|
|
51
|
+
font-size: 11px;
|
|
52
|
+
text-transform: uppercase;
|
|
53
|
+
color: var(--text-muted);
|
|
54
|
+
padding: 0 16px 8px;
|
|
55
|
+
letter-spacing: 0.5px;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.team-item {
|
|
59
|
+
display: block;
|
|
60
|
+
padding: 8px 16px;
|
|
61
|
+
border-radius: 6px;
|
|
62
|
+
cursor: pointer;
|
|
63
|
+
text-decoration: none;
|
|
64
|
+
color: var(--text);
|
|
65
|
+
margin: 1px 8px;
|
|
66
|
+
border-left: 2px solid transparent;
|
|
67
|
+
transition: background 0.12s, border-color 0.12s;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.team-item:hover {
|
|
71
|
+
background: var(--bg-hover);
|
|
72
|
+
text-decoration: none;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.team-item.active {
|
|
76
|
+
background: var(--accent-dim);
|
|
77
|
+
border-left-color: var(--accent);
|
|
78
|
+
color: var(--accent);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.team-item.active .team-name { color: var(--accent); }
|
|
82
|
+
|
|
83
|
+
.team-name {
|
|
84
|
+
font-size: 13px;
|
|
85
|
+
font-weight: 500;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.team-meta {
|
|
89
|
+
display: flex;
|
|
90
|
+
align-items: center;
|
|
91
|
+
gap: 6px;
|
|
92
|
+
margin-top: 3px;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/* Mode badges */
|
|
96
|
+
.mode-badge {
|
|
97
|
+
font-size: 10px;
|
|
98
|
+
padding: 1px 5px;
|
|
99
|
+
border-radius: 3px;
|
|
100
|
+
font-weight: 500;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.mode-software { background: rgba(74, 222, 128, 0.15); color: var(--success); }
|
|
104
|
+
.mode-content { background: rgba(108, 138, 255, 0.15); color: var(--accent); }
|
|
105
|
+
.mode-research { background: rgba(251, 191, 36, 0.15); color: var(--warning); }
|
|
106
|
+
.mode-mixed { background: var(--bg-hover); color: var(--text-muted); }
|
|
107
|
+
|
|
108
|
+
.agent-count {
|
|
109
|
+
font-size: 11px;
|
|
110
|
+
color: var(--text-muted);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
.team-switcher-divider {
|
|
114
|
+
height: 1px;
|
|
115
|
+
background: var(--border);
|
|
116
|
+
margin: 8px 16px;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.team-item-new {
|
|
120
|
+
font-size: 12px;
|
|
121
|
+
color: var(--text-muted);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.team-item-new:hover { color: var(--accent); }
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Interaction notes
|
|
128
|
+
|
|
129
|
+
- Active item has `border-left: 2px solid var(--accent)` — requires `margin-left: 8px` on items to preserve alignment.
|
|
130
|
+
- On narrow screens (< 768px) the sidebar hides; team switcher may move to a top dropdown.
|
|
131
|
+
- Optionally show an unread notification dot on squad items: small `6px` circle (accent color) after the agent count.
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
# Agent Message Thread Pattern
|
|
2
|
+
|
|
3
|
+
Inter-squad message feed. Displays communication between agents across squads in a vertical timeline.
|
|
4
|
+
|
|
5
|
+
## Layout
|
|
6
|
+
|
|
7
|
+
Vertical thread, chronological (oldest at top, newest at bottom). Each message: avatar (agent-badge) on left, message bubble on right. Optional timeline connector line between items.
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
⚡ ┌─ writer · alpha-squad · 2m ago ─────────────────────┐
|
|
11
|
+
│ Here's the draft PRD. @planner please review §3. │
|
|
12
|
+
│ Related: #write-prd │
|
|
13
|
+
│ 👍 2 ✅ 1 💬 1 reply │
|
|
14
|
+
└───────────────────────────────────────────────────────┘
|
|
15
|
+
|
|
16
|
+
👤 ┌─ planner · alpha-squad · 1m ago ─────────────────────┐
|
|
17
|
+
│ Section 3 looks good. Forwarding to @bravo-squad │
|
|
18
|
+
│ for implementation estimates. │
|
|
19
|
+
└───────────────────────────────────────────────────────┘
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Message Types
|
|
23
|
+
|
|
24
|
+
| Type | Visual treatment |
|
|
25
|
+
|------|-----------------|
|
|
26
|
+
| `message` | Standard bubble |
|
|
27
|
+
| `handoff` | Special card: `→ from → to`, summary, task reference |
|
|
28
|
+
| `decision` | Highlighted with left border (accent), bold label "Decision" |
|
|
29
|
+
| `milestone` | Green left border, italic summary |
|
|
30
|
+
|
|
31
|
+
## HTML Structure
|
|
32
|
+
|
|
33
|
+
### Standard message
|
|
34
|
+
|
|
35
|
+
```html
|
|
36
|
+
<div class="thread">
|
|
37
|
+
|
|
38
|
+
<!-- Standard message -->
|
|
39
|
+
<div class="thread-msg" data-type="message">
|
|
40
|
+
<div class="thread-msg-avatar">
|
|
41
|
+
<span class="agent-badge agent-badge-auto sm">⚡</span>
|
|
42
|
+
</div>
|
|
43
|
+
<div class="thread-msg-bubble">
|
|
44
|
+
<div class="thread-msg-header">
|
|
45
|
+
writer · alpha-squad · 2m ago
|
|
46
|
+
</div>
|
|
47
|
+
<div class="thread-msg-body">
|
|
48
|
+
Here's the draft PRD.
|
|
49
|
+
<span class="mention mention-agent">@planner</span>
|
|
50
|
+
please review §3. Related:
|
|
51
|
+
<span class="mention mention-task">#write-prd</span>
|
|
52
|
+
</div>
|
|
53
|
+
<div class="thread-reactions">
|
|
54
|
+
<button class="reaction-btn">👍 2</button>
|
|
55
|
+
<button class="reaction-btn">✅ 1</button>
|
|
56
|
+
<button class="reaction-btn">💬 1 reply</button>
|
|
57
|
+
</div>
|
|
58
|
+
</div>
|
|
59
|
+
</div>
|
|
60
|
+
|
|
61
|
+
<!-- Handoff message -->
|
|
62
|
+
<div class="thread-msg thread-msg-handoff" data-type="handoff">
|
|
63
|
+
<div class="thread-msg-avatar">
|
|
64
|
+
<span class="agent-badge agent-badge-auto sm">⚡</span>
|
|
65
|
+
</div>
|
|
66
|
+
<div class="thread-msg-bubble">
|
|
67
|
+
<div class="thread-msg-header">orchestrator · 30s ago</div>
|
|
68
|
+
<div class="thread-handoff-card">
|
|
69
|
+
<span class="handoff-from">analyst</span>
|
|
70
|
+
<span class="handoff-arrow">→</span>
|
|
71
|
+
<span class="handoff-to">architect</span>
|
|
72
|
+
<span class="handoff-task">#discovery-phase</span>
|
|
73
|
+
</div>
|
|
74
|
+
<div class="thread-msg-body">Discovery complete. Passing findings to architect.</div>
|
|
75
|
+
</div>
|
|
76
|
+
</div>
|
|
77
|
+
|
|
78
|
+
<!-- Decision message -->
|
|
79
|
+
<div class="thread-msg thread-msg-decision" data-type="decision">
|
|
80
|
+
<div class="thread-msg-avatar">
|
|
81
|
+
<span class="agent-badge agent-badge-human sm">👤</span>
|
|
82
|
+
</div>
|
|
83
|
+
<div class="thread-msg-bubble">
|
|
84
|
+
<div class="thread-msg-header">pm · alpha-squad · 5m ago</div>
|
|
85
|
+
<div class="thread-decision-label">Decision</div>
|
|
86
|
+
<div class="thread-msg-body">Use SQLite for local storage. Rationale: zero infra overhead.</div>
|
|
87
|
+
</div>
|
|
88
|
+
</div>
|
|
89
|
+
|
|
90
|
+
</div>
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## CSS
|
|
94
|
+
|
|
95
|
+
```css
|
|
96
|
+
.thread {
|
|
97
|
+
display: flex;
|
|
98
|
+
flex-direction: column;
|
|
99
|
+
gap: 12px;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.thread-msg {
|
|
103
|
+
display: flex;
|
|
104
|
+
gap: 10px;
|
|
105
|
+
align-items: flex-start;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.thread-msg-avatar {
|
|
109
|
+
flex-shrink: 0;
|
|
110
|
+
padding-top: 2px;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
.thread-msg-bubble {
|
|
114
|
+
background: var(--bg-card);
|
|
115
|
+
border: 1px solid var(--border);
|
|
116
|
+
border-radius: 8px;
|
|
117
|
+
padding: 10px 14px;
|
|
118
|
+
flex: 1;
|
|
119
|
+
min-width: 0;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.thread-msg-header {
|
|
123
|
+
font-size: 11px;
|
|
124
|
+
color: var(--text-muted);
|
|
125
|
+
margin-bottom: 5px;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
.thread-msg-body {
|
|
129
|
+
font-size: 13px;
|
|
130
|
+
line-height: 1.55;
|
|
131
|
+
word-wrap: break-word;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/* Mention styles — see mention-autocomplete.md */
|
|
135
|
+
.mention { padding: 1px 4px; border-radius: 3px; font-weight: 500; }
|
|
136
|
+
.mention-agent { background: var(--accent-dim); color: var(--accent); }
|
|
137
|
+
.mention-squad { background: rgba(34,211,238,0.10); color: #22d3ee; }
|
|
138
|
+
.mention-task { background: rgba(192,132,252,0.10); color: #c084fc; }
|
|
139
|
+
|
|
140
|
+
/* Reactions */
|
|
141
|
+
.thread-reactions {
|
|
142
|
+
display: flex;
|
|
143
|
+
gap: 6px;
|
|
144
|
+
margin-top: 8px;
|
|
145
|
+
flex-wrap: wrap;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.reaction-btn {
|
|
149
|
+
background: var(--bg-hover);
|
|
150
|
+
border: 1px solid var(--border);
|
|
151
|
+
border-radius: 12px;
|
|
152
|
+
padding: 2px 8px;
|
|
153
|
+
font-size: 12px;
|
|
154
|
+
cursor: pointer;
|
|
155
|
+
color: var(--text-muted);
|
|
156
|
+
transition: border-color 0.15s;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
.reaction-btn:hover { border-color: var(--accent); color: var(--text); }
|
|
160
|
+
|
|
161
|
+
/* Handoff card */
|
|
162
|
+
.thread-msg-handoff .thread-msg-bubble { border-color: var(--accent); }
|
|
163
|
+
.thread-handoff-card {
|
|
164
|
+
display: flex;
|
|
165
|
+
align-items: center;
|
|
166
|
+
gap: 8px;
|
|
167
|
+
padding: 6px 0;
|
|
168
|
+
margin-bottom: 6px;
|
|
169
|
+
font-size: 13px;
|
|
170
|
+
font-weight: 500;
|
|
171
|
+
}
|
|
172
|
+
.handoff-arrow { color: var(--accent); font-size: 16px; }
|
|
173
|
+
.handoff-from, .handoff-to { font-family: monospace; }
|
|
174
|
+
.handoff-task { font-size: 11px; color: #c084fc; margin-left: 4px; }
|
|
175
|
+
|
|
176
|
+
/* Decision card */
|
|
177
|
+
.thread-msg-decision .thread-msg-bubble {
|
|
178
|
+
border-left: 3px solid var(--accent);
|
|
179
|
+
}
|
|
180
|
+
.thread-decision-label {
|
|
181
|
+
font-size: 10px;
|
|
182
|
+
text-transform: uppercase;
|
|
183
|
+
color: var(--accent);
|
|
184
|
+
letter-spacing: 0.5px;
|
|
185
|
+
margin-bottom: 4px;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/* Milestone */
|
|
189
|
+
.thread-msg[data-type="milestone"] .thread-msg-bubble {
|
|
190
|
+
border-left: 3px solid var(--success);
|
|
191
|
+
}
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## Interaction notes
|
|
195
|
+
|
|
196
|
+
- "Reply" button expands an inline thread (nested `.thread` with `margin-left: 36px`).
|
|
197
|
+
- Reactions are togglable: clicking one you already gave removes it (add `active` class + accent fill).
|
|
198
|
+
- For long threads (> 30 messages), virtualize or paginate. Show "Load earlier" at top.
|