@hybridlabor-api/aos 4.5.1 → 4.6.0

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.
Files changed (34) hide show
  1. package/.agents/rules/antigravity-rtk-rules.md +32 -0
  2. package/.claude/agents/architect.md +0 -1
  3. package/.claude/agents/database-reviewer.md +3 -102
  4. package/.claude/agents/go-build-resolver.md +3 -105
  5. package/.claude/agents/godmode-engineering.md +1 -2
  6. package/.claude/agents/godmode-media-eventtech.md +1 -2
  7. package/.claude/agents/godmode-shipping.md +2 -3
  8. package/.claude/agents/godmode-ui-ux.md +2 -3
  9. package/.claude/agents/opensource-forker.md +4 -210
  10. package/.claude/agents/opensource-sanitizer.md +3 -199
  11. package/.claude/agents/reviewer.md +1 -2
  12. package/.claude/agents/security-reviewer.md +3 -119
  13. package/.claude/agents/silent-failure-hunter.md +3 -61
  14. package/.claude/agents/techlead.md +1 -2
  15. package/.opencode/agents/architect.md +1 -0
  16. package/.opencode/agents/database-reviewer.md +10 -0
  17. package/.opencode/agents/go-build-resolver.md +10 -0
  18. package/.opencode/agents/godmode-engineering.md +1 -0
  19. package/.opencode/agents/godmode-media-eventtech.md +1 -0
  20. package/.opencode/agents/godmode-shipping.md +2 -1
  21. package/.opencode/agents/godmode-ui-ux.md +1 -0
  22. package/.opencode/agents/opensource-forker.md +10 -0
  23. package/.opencode/agents/opensource-sanitizer.md +10 -0
  24. package/.opencode/agents/reviewer.md +1 -0
  25. package/.opencode/agents/security-reviewer.md +10 -0
  26. package/.opencode/agents/silent-failure-hunter.md +10 -0
  27. package/.opencode/agents/techlead.md +1 -0
  28. package/.opencode/plugins/bdb-aos.js +171 -0
  29. package/docs/email/aos-4.5.0-update-banner.html +211 -0
  30. package/installer.js +261 -30
  31. package/package.json +1 -1
  32. package/skills/global_config/aos-project-init/SKILL.md +2 -0
  33. package/skills/global_config/subagent-setup/SKILL.md +71 -0
  34. package/skills/global_config/subagent-setup/scripts/setup-subagents.mjs +185 -0
@@ -0,0 +1,171 @@
1
+ /**
2
+ * BDB Agent OS (AOS) plugin for OpenCode.
3
+ *
4
+ * Implements:
5
+ * 1. tool.execute.before: Releases gatekeeper (go-gate). Guards outward-facing
6
+ * or hard-to-reverse actions (git push, npm publish, npm version, rm -rf)
7
+ * unless the user explicitly authorized it with the literal word "GO".
8
+ * 2. chat.message: Ambient memory injection (memB). Injects relevant project & user
9
+ * memories as ephemeral context from ~/.MemBDB/memb.db via node:sqlite.
10
+ *
11
+ * Zero external runtime dependencies. Fails open on memory lookup, fails closed
12
+ * on unguarded destructive actions.
13
+ */
14
+
15
+ import { existsSync, readFileSync } from 'node:fs';
16
+ import os from 'node:os';
17
+ import path from 'node:path';
18
+
19
+ const GUARDED_PATTERNS = [
20
+ /^\s*git\s+push\b/i,
21
+ /^\s*npm\s+publish\b/i,
22
+ /^\s*npm\s+version\b/i,
23
+ /^\s*rm\s+(-\w*[rR]\w*|--recursive)\b/i,
24
+ ];
25
+
26
+ let lastHumanPrompt = '';
27
+
28
+ function isGuardedCommand(cmd) {
29
+ if (typeof cmd !== 'string') return false;
30
+ return GUARDED_PATTERNS.some((re) => re.test(cmd));
31
+ }
32
+
33
+ function verifyGoAuthorized(lastPrompt) {
34
+ const trimmed = (lastPrompt || '').trim();
35
+ return trimmed.toUpperCase() === 'GO';
36
+ }
37
+
38
+ // Extract ambient memory from local memB database
39
+ async function getMembContext(prompt, currentDir) {
40
+ const home = os.homedir();
41
+ const dbPath = path.join(home, '.MemBDB', 'memb.db');
42
+ if (!existsSync(dbPath)) return null;
43
+
44
+ try {
45
+ const { DatabaseSync } = await import('node:sqlite');
46
+ const db = new DatabaseSync(dbPath, { readOnly: true });
47
+ db.exec('PRAGMA busy_timeout = 3000;');
48
+
49
+ const contextItems = [];
50
+
51
+ // Standing persona facts
52
+ const personaFile = path.join(home, '.MemBDB', 'ambient-persona.txt');
53
+ if (existsSync(personaFile)) {
54
+ try {
55
+ for (const line of readFileSync(personaFile, 'utf8').split('\n')) {
56
+ const t = line.trim();
57
+ if (t && !t.startsWith('#')) contextItems.push(`- ${t}`);
58
+ }
59
+ } catch {}
60
+ }
61
+
62
+ // Resolve project ID candidate
63
+ let projectName = path.basename(currentDir);
64
+ const pkgPath = path.join(currentDir, 'package.json');
65
+ if (existsSync(pkgPath)) {
66
+ try {
67
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
68
+ if (pkg?.name) projectName = pkg.name;
69
+ } catch {}
70
+ }
71
+
72
+ // Query project memories
73
+ try {
74
+ const sql = `
75
+ SELECT payload FROM memb_vectors
76
+ WHERE collection = 'bdb_agent_memory'
77
+ AND (
78
+ json_extract(payload, '$.project_id') = ?
79
+ OR json_extract(payload, '$.metadata.project_id') = ?
80
+ OR json_extract(payload, '$.project') = ?
81
+ OR json_extract(payload, '$.metadata.project') = ?
82
+ )
83
+ ORDER BY rowid DESC
84
+ LIMIT 3
85
+ `;
86
+ const rows = db.prepare(sql).all(projectName, projectName, projectName, projectName);
87
+ for (const r of rows) {
88
+ try {
89
+ const p = JSON.parse(r.payload);
90
+ const text = (p.memory || p.data || '').trim().replace(/\s+/g, ' ');
91
+ if (text.length > 10) {
92
+ contextItems.push(`- Project [${projectName}]: ${text.slice(0, 180)}`);
93
+ }
94
+ } catch {}
95
+ }
96
+ } catch {}
97
+
98
+ db.close();
99
+
100
+ if (contextItems.length === 0) return null;
101
+ return `[AOS Ambient Memory - memB]\n${contextItems.join('\n')}`;
102
+ } catch {
103
+ return null;
104
+ }
105
+ }
106
+
107
+ export default async function bdbAosPlugin(input) {
108
+ const directory = input.directory || process.cwd();
109
+
110
+ return {
111
+ 'chat.message': async (msgInput, msgOutput) => {
112
+ // Capture the user prompt text for GO-gate verification
113
+ const textParts = (msgOutput.parts || []).filter((p) => p && p.type === 'text' && typeof p.text === 'string');
114
+ const fullText = textParts.map((p) => p.text).join('\n').trim();
115
+ if (fullText) {
116
+ lastHumanPrompt = fullText;
117
+ }
118
+
119
+ // Inject memB ambient memory
120
+ try {
121
+ const membContext = await getMembContext(fullText, directory);
122
+ if (membContext) {
123
+ msgOutput.parts.unshift({
124
+ id: `memb-${Date.now()}`,
125
+ sessionID: msgInput.sessionID,
126
+ messageID: msgInput.messageID || '',
127
+ type: 'text',
128
+ text: membContext,
129
+ synthetic: true,
130
+ });
131
+ }
132
+ } catch {}
133
+ },
134
+
135
+ 'tool.execute.before': async (toolInput, toolOutput) => {
136
+ const toolName = (toolInput.tool || '').toLowerCase();
137
+ // Intercept bash, terminal, or command execution tools
138
+ if (toolName === 'bash' || toolName === 'terminal' || toolName === 'shell' || toolName === 'exec' || toolName === 'run_command') {
139
+ const cmd = toolOutput?.args?.command || toolOutput?.args?.cmd || toolOutput?.args?.script || '';
140
+ if (isGuardedCommand(cmd)) {
141
+ let authorized = verifyGoAuthorized(lastHumanPrompt);
142
+
143
+ // If last cached prompt wasn't GO, query recent session messages via OpenCode client as fallback
144
+ if (!authorized && input.client && toolInput.sessionID) {
145
+ try {
146
+ const res = await input.client.session.messages({ path: { id: toolInput.sessionID } });
147
+ const msgs = res?.data || [];
148
+ for (let i = msgs.length - 1; i >= 0; i--) {
149
+ const m = msgs[i];
150
+ if (m.role === 'user') {
151
+ const parts = m.parts || [];
152
+ const text = parts.filter((p) => p.type === 'text').map((p) => p.text).join('\n').trim();
153
+ if (text) {
154
+ authorized = (text.toUpperCase() === 'GO');
155
+ break;
156
+ }
157
+ }
158
+ }
159
+ } catch {}
160
+ }
161
+
162
+ if (!authorized) {
163
+ throw new Error(
164
+ `Blocked by BDB go-gate: Command "${cmd.slice(0, 80)}" is guarded and requires explicit authorization with the literal word "GO" before proceeding.`
165
+ );
166
+ }
167
+ }
168
+ }
169
+ },
170
+ };
171
+ }
@@ -0,0 +1,211 @@
1
+ <!--
2
+ BDB Agent OS -- v4.5.0 update email banner.
3
+ Table-based, inline-styled for email client compatibility (Outlook/Gmail/Apple Mail).
4
+ Width: 600px (standard email content width). Drop this <table> straight into a mail body.
5
+ Layout modeled on a "Company Update" newsletter template: light header banner with a
6
+ big centered mark + issue line, then alternating icon-left/icon-right feature rows
7
+ (git-graph / brain / box / message-square-heart, all Lucide). Icons are static inline
8
+ SVG -- no animation, since real email clients strip <script> and don't reliably run
9
+ CSS keyframes across clients.
10
+ -->
11
+ <table role="presentation" width="600" cellpadding="0" cellspacing="0" border="0" align="center" style="width:600px; max-width:100%; background-color:#ffffff; border:1px solid #e5e5e5; border-radius:8px; overflow:hidden; font-family:Helvetica, Arial, sans-serif;">
12
+
13
+ <!-- ============ Header banner ============ -->
14
+ <tr>
15
+ <td align="center" style="background-color:#f3e8ff; padding:24px 24px 18px 24px;">
16
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="52" height="52" style="display:block; margin:0 auto;">
17
+ <g transform="translate(70, 68)" fill="#0a0a0a">
18
+ <path d="M181.63.05c101.39-2.47,184.56,80.09,190.14,179.93,5.53,99.03-66.16,185.42-165.11,195.46-87.39,8.86-171.1-45.56-197.67-128.96C-28.74,128.03,56.78,3.1,181.63.05h0ZM177.5,21.3C69.09,25.31-7.16,129.62,21.76,234.52c18.72,67.88,81.56,116.7,151.53,121.32,106.21,7.03,195.6-81.63,179.68-189.06-12.54-84.65-89.81-148.66-175.47-145.49h0Z"/>
19
+ <path d="M147.69,120.05c12.04.36,24.64-.72,36.62-.07,24.29,1.32,41.37,20.13,42.91,43.99-.69,16.35.57,33.42-.28,49.69-1.31,25.42-18.55,43.75-44.02,45.64-9.59.72-20.14.69-29.78.84-4.97.08-9.9.68-10.37-5.66s.43-9.41.34-14.03c12.65-11.84,14.75-31.17,4.75-45.41-.63-.9-2.26-2.34-2.62-3.17s-.46-12.58-.26-14.37,1.1-3.52,1.46-5.16c1.21-5.42,1.06-11.26-.39-16.62-.41-1.54-1.48-3.56-1.63-4.99-.47-4.28-.14-9.67-.26-14.08-.11-3.56-.84-8.43-.57-11.86s1.32-4.35,4.08-4.75h0ZM162.03,135.5c-4.32.73-3.34,6.65-3.26,10.01.17,6.21.91,12.51,1.13,18.73.83,23.13-1.03,45.49-1.41,68.42-.07,3.93-1.27,10.87,4.01,11.46,10.36-.51,21.39,1.89,31.38-1.45,13.74-4.59,20.43-17.79,19.81-31.81-1.77-14.46-1.19-29.09-1.94-43.58-.52-10.12-3.97-20.33-12.44-26.46-10.8-7.82-24.82-4.88-37.29-5.34h0Z"/>
20
+ <path d="M232.66,132.46c9.53.36,19.74-.72,29.19-.08,22.64,1.52,33.92,28.58,21.93,47.05-1.49,2.3-4.32,4.47-3.85,7.42.47,2.95,5.64,6.21,7.42,8.3,11.88,13.96,8.41,35.69-6.91,45.49-7.85,5.02-14.69,4.43-23.56,4.86-7.67.37-16.24,1.05-23.91.66-1.66-.08-2.98-.73-3.68-2.32s-.52-7.28-.43-9.26c.36-6.63,3.52-13.04,3.89-20.39.58-11.38-.1-23.12-.3-34.49-.1-5.68.32-11.44-.3-17.08-.41-3.82-1.64-7.52-1.89-11.35-.25-3.85-.18-7.99-.26-11.88-.07-2.84-1.26-6.03,2.68-6.95h-.01ZM243.68,144.59c-3.41.77-2.55,6.7-2.66,9.2-.28,6.08-.58,12.36-.29,18.47.1,2.06.36,6.36.9,8.21.54,1.85.84,1.79,1.66,2.19,1.66.83,8-.68,10.26-.88,4.22-.39,8.12.03,12.28-1.24,16.76-5.12,16.53-26.53,1.01-33.02-15.52-6.5-13.5-2.7-18.82-2.98-5.31-.28-3.37-.17-4.36.06h.03ZM243.68,194.52c-3.49.79-2.58,8.66-2.68,11.39-.26,7.05-1.06,17.41.07,24.21,1.13,6.8,2.63,3.38,5.32,3.26,3.96-.19,8.36-1.32,12.4-1.67,5.85-.5,10.68.22,16.24-2.25,13.6-6.04,12.62-25.27-.46-31.46-5.63-2.66-9.89-1.97-15.78-2.43-3.57-.28-7.2-.92-10.76-1.1-1.12-.06-3.35-.17-4.36.06h0Z"/>
21
+ <path d="M90.59,133.03c8.84-.44,25.24-1.08,33.23,1.92,18.07,6.77,23.99,29.96,13.56,45.7-1.6,2.41-4.52,4.44-3.28,7.75.69,1.85,5.41,5.42,7.03,7.31,11.86,13.82,8.77,35.23-6.25,45.33-15.02,10.1-23.31,5.27-34.44,5.56-4.12.11-10.36.88-14.32.28-2.22-.34-3.45-2.79-3.48-4.83-.11-7.84.77-15.89,1.1-23.71.99-23.09,1.31-45.33.57-68.43-.14-4.15-1.05-9.79-.57-13.79.43-3.52,4.1-2.95,6.84-3.09h0ZM98.3,145.15c-1.71.29-2.98,1.7-3.21,3.41-.15,1.19-.23,3.13-.3,4.39-.39,8.01-.9,19.53.58,27.27.23,1.24.57,2.55,1.82,3.15,1.81.84,7.03-.55,9.32-.76,3.3-.3,6.62-.1,9.89-.59,21.2-3.21,21.02-29.7,1.28-34.86-4.36-1.14-13.16-1.92-17.79-2.07-.55-.01-1.03-.03-1.59.07h0ZM98.03,195.09c-4.25.88-2.46,6.76-3.24,9.72-.06,7.92-.55,15.86,0,23.75.22,3.21.77,5.75,4.57,5.67,3.82-.08,8.46-1.32,12.41-1.67,5.55-.48,11.21.12,16.48-2,14.62-5.88,13.53-26.13-.52-32.17-5.13-2.21-8.25-1.59-13.48-1.97-4.69-.34-9.7-1.23-14.35-1.38-.62-.01-1.26-.07-1.86.06h-.01Z"/>
22
+ </g>
23
+ </svg>
24
+ <div style="font-size:30px; font-weight:800; letter-spacing:-0.5px; color:#0a0a0a; padding-top:12px;">BDB AGENT OS</div>
25
+ <div style="font-size:13px; font-weight:700; letter-spacing:1.5px; text-transform:uppercase; color:#7c1fa0; padding-top:6px;">Update &middot; AOS v4.5.0</div>
26
+ </td>
27
+ </tr>
28
+
29
+ <tr>
30
+ <td align="center" style="padding:20px 32px 8px 32px;">
31
+ <span style="font-size:14px; line-height:1.5; color:#4a4a4a;">AOS Skills &amp; Tools for Agents and Humans.</span>
32
+ </td>
33
+ </tr>
34
+ <tr>
35
+ <td align="center" style="padding:0 40px 32px 40px;">
36
+ <span style="font-size:12.5px; line-height:1.6; color:#6b6b6b;">
37
+ Countless fixes, plus a loop-and-graph engineering pipeline that actually delivers.
38
+ </span>
39
+ </td>
40
+ </tr>
41
+
42
+ <!-- ============ Feature 01 -- icon RIGHT (GitGraph / multi-agent pipeline) ============ -->
43
+ <tr>
44
+ <td style="padding:12px 40px 0 40px;">
45
+ <table role="presentation" width="100%" cellpadding="0" cellspacing="0" border="0">
46
+ <tr>
47
+ <td valign="middle">
48
+ <div style="font-size:17px; font-weight:700; color:#0a0a0a; line-height:1.3;">Multi-Agent Graph Pipeline &amp; Smarter Setup</div>
49
+ <div style="font-size:13px; color:#525252; line-height:1.65; padding-top:9px;">
50
+ The real headline this cycle: a sharper dispatcher graph routes every task straight to the
51
+ right domain — Backend, UI/UX, Show Control &amp; Media, Hardware &amp; PCB, or the Remote Gateway —
52
+ through <code style="background:#f3e8ff; padding:1px 5px; border-radius:4px; color:#7c1fa0;">/startcycle</code>,
53
+ <code style="background:#f3e8ff; padding:1px 5px; border-radius:4px; color:#7c1fa0;">/startcycle-graph</code> and
54
+ <code style="background:#f3e8ff; padding:1px 5px; border-radius:4px; color:#7c1fa0;">/startcycle-graph-user</code>.
55
+ A new <code style="background:#f3e8ff; padding:1px 5px; border-radius:4px; color:#7c1fa0;">ask-tim</code> skill router
56
+ helps you pick the right one, and <code style="background:#f3e8ff; padding:1px 5px; border-radius:4px; color:#7c1fa0;">aos-setup</code> /
57
+ <code style="background:#f3e8ff; padding:1px 5px; border-radius:4px; color:#7c1fa0;">aos-project-init</code> make
58
+ environment injection noticeably smoother.
59
+ </div>
60
+ </td>
61
+ <td width="112" align="center" valign="middle" style="padding-left:20px;">
62
+ <table role="presentation" width="100" height="100" cellpadding="0" cellspacing="0" border="0" style="background-color:#f3e8ff; border-radius:20px; box-shadow:6px 6px 0 0 #ece2fb;">
63
+ <tr>
64
+ <td align="center" valign="middle">
65
+ <svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="#51116F" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round">
66
+ <circle cx="5" cy="6" r="3" />
67
+ <path d="M5 9v6" />
68
+ <circle cx="5" cy="18" r="3" />
69
+ <path d="M12 3v18" />
70
+ <circle cx="19" cy="6" r="3" />
71
+ <path d="M16 15.7A9 9 0 0 0 19 9" />
72
+ </svg>
73
+ </td>
74
+ </tr>
75
+ </table>
76
+ </td>
77
+ </tr>
78
+ </table>
79
+ </td>
80
+ </tr>
81
+
82
+ <!-- ============ Feature 02 -- icon LEFT (Brain / memB / OpenWiki) ============ -->
83
+ <tr>
84
+ <td style="padding:52px 40px 0 40px;">
85
+ <table role="presentation" width="100%" cellpadding="0" cellspacing="0" border="0">
86
+ <tr>
87
+ <td width="112" align="center" valign="middle" style="padding-right:20px;">
88
+ <table role="presentation" width="100" height="100" cellpadding="0" cellspacing="0" border="0" style="background-color:#f3e8ff; border-radius:20px; box-shadow:-6px 6px 0 0 #ece2fb;">
89
+ <tr>
90
+ <td align="center" valign="middle">
91
+ <svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="#51116F" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round">
92
+ <path d="M12 18V5" />
93
+ <path d="M15 13a4.17 4.17 0 0 1-3-4 4.17 4.17 0 0 1-3 4" />
94
+ <path d="M17.598 6.5A3 3 0 1 0 12 5a3 3 0 1 0-5.598 1.5" />
95
+ <path d="M17.997 5.125a4 4 0 0 1 2.526 5.77" />
96
+ <path d="M18 18a4 4 0 0 0 2-7.464" />
97
+ <path d="M19.967 17.483A4 4 0 1 1 12 18a4 4 0 1 1-7.967-.517" />
98
+ <path d="M6 18a4 4 0 0 1-2-7.464" />
99
+ <path d="M6.003 5.125a4 4 0 0 0-2.526 5.77" />
100
+ </svg>
101
+ </td>
102
+ </tr>
103
+ </table>
104
+ </td>
105
+ <td valign="middle">
106
+ <div style="font-size:17px; font-weight:700; color:#0a0a0a; line-height:1.3;">AO, memB &amp; the Documentation Engine</div>
107
+ <div style="font-size:13px; color:#525252; line-height:1.65; padding-top:9px;">
108
+ The agent ecosystem keeps evolving: memB's vector memory and OpenWiki's auto-generated,
109
+ evidence-grounded docs both got real upgrades this cycle — multi-provider LLM support and
110
+ a live background visualizer.
111
+ </div>
112
+ </td>
113
+ </tr>
114
+ </table>
115
+ </td>
116
+ </tr>
117
+
118
+ <!-- ============ Feature 03 -- icon RIGHT (Box / design canvas) ============ -->
119
+ <tr>
120
+ <td style="padding:52px 40px 0 40px;">
121
+ <table role="presentation" width="100%" cellpadding="0" cellspacing="0" border="0">
122
+ <tr>
123
+ <td valign="middle">
124
+ <div style="font-size:17px; font-weight:700; color:#0a0a0a; line-height:1.3;">Intuitive Plan &amp; Design Canvas — 2D, 3D and Web</div>
125
+ <div style="font-size:13px; color:#525252; line-height:1.65; padding-top:9px;">
126
+ A new live-preview-canvas skill in combination with our plan-canvas turns any draft
127
+ into a click-to-annotate feedback loop. Paired with plan-canvas for comments and
128
+ decisions, it spans everything from web layouts to CAD, media and 3D scenes.
129
+ </div>
130
+ </td>
131
+ <td width="112" align="center" valign="middle" style="padding-left:20px;">
132
+ <table role="presentation" width="100" height="100" cellpadding="0" cellspacing="0" border="0" style="background-color:#f3e8ff; border-radius:20px; box-shadow:6px 6px 0 0 #ece2fb;">
133
+ <tr>
134
+ <td align="center" valign="middle">
135
+ <svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="#51116F" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round">
136
+ <path d="M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z" />
137
+ <path d="m3.3 7 8.7 5 8.7-5" />
138
+ <path d="M12 22V12" />
139
+ </svg>
140
+ </td>
141
+ </tr>
142
+ </table>
143
+ </td>
144
+ </tr>
145
+ </table>
146
+ </td>
147
+ </tr>
148
+
149
+ <!-- ============ Feature 04 -- icon LEFT (MessageSquareHeart / new & rewritten skills) ============ -->
150
+ <tr>
151
+ <td style="padding:52px 40px 48px 40px;">
152
+ <table role="presentation" width="100%" cellpadding="0" cellspacing="0" border="0">
153
+ <tr>
154
+ <td width="112" align="center" valign="middle" style="padding-right:20px;">
155
+ <table role="presentation" width="100" height="100" cellpadding="0" cellspacing="0" border="0" style="background-color:#f3e8ff; border-radius:20px; box-shadow:-6px 6px 0 0 #ece2fb;">
156
+ <tr>
157
+ <td align="center" valign="middle">
158
+ <svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="#51116F" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round">
159
+ <path d="M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z" />
160
+ <path d="M7.5 9.5c0 .687.265 1.383.697 1.844l3.009 3.264a1.14 1.14 0 0 0 .407.314 1 1 0 0 0 .783-.004 1.14 1.14 0 0 0 .398-.31l3.008-3.264A2.77 2.77 0 0 0 16.5 9.5 2.5 2.5 0 0 0 12 8a2.5 2.5 0 0 0-4.5 1.5" />
161
+ </svg>
162
+ </td>
163
+ </tr>
164
+ </table>
165
+ </td>
166
+ <td valign="middle">
167
+ <div style="font-size:17px; font-weight:700; color:#0a0a0a; line-height:1.3;">New &amp; Rewritten Skills Across the Stack</div>
168
+ <div style="font-size:13px; color:#525252; line-height:1.65; padding-top:9px;">
169
+ <code style="background:#f3e8ff; padding:1px 5px; border-radius:4px; color:#7c1fa0;">Godmode_Hardware_PCB</code>
170
+ joins the dispatcher graph with a full schematic-to-fab pipeline. The Creator Extension got
171
+ real engine work, six ECC review subagents and Matt Pocock's grilling toolkit landed, and
172
+ <code style="background:#f3e8ff; padding:1px 5px; border-radius:4px; color:#7c1fa0;">bdbdesignpro</code>
173
+ now gates every motion decision against BDB's brand and accessibility rules.
174
+ </div>
175
+ </td>
176
+ </tr>
177
+ </table>
178
+ </td>
179
+ </tr>
180
+
181
+ <tr>
182
+ <td style="height:1px; background-color:#e5e5e5; line-height:1px; font-size:1px;">&nbsp;</td>
183
+ </tr>
184
+ <tr>
185
+ <td align="center" style="padding:24px 40px 4px 40px;">
186
+ <span style="font-size:12.5px; color:#6b6b6b; line-height:1.6;">
187
+ <strong style="color:#0a0a0a;">AO</strong> — our own Agent cockpit is close to release, landing in the
188
+ next few days as part of BDB AOS v5.0.0.
189
+ </span>
190
+ </td>
191
+ </tr>
192
+ <tr>
193
+ <td align="center" style="padding:16px 24px 4px 24px;">
194
+ <img src="https://img.shields.io/badge/NVIDIA%20SkillSpector-CLEAN-76B900?logo=nvidia&amp;logoColor=white" width="150" height="20" alt="NVIDIA SkillSpector: CLEAN" style="display:inline-block; border:0;">
195
+ </td>
196
+ </tr>
197
+ <tr>
198
+ <td align="center" style="padding:16px 24px 8px 24px;">
199
+ <span style="font-size:12px; color:#4a4a4a; line-height:1.6;">
200
+ <a href="https://github.com/hybridlabor-api/aos" style="color:#7c1fa0; text-decoration:none;">github.com/hybridlabor-api/aos</a>
201
+ &nbsp;&middot;&nbsp;
202
+ <code style="background:#f3e8ff; padding:1px 5px; border-radius:4px; color:#7c1fa0;">npm i -g @hybridlabor-api/aos</code>
203
+ </span>
204
+ </td>
205
+ </tr>
206
+ <tr>
207
+ <td align="center" style="padding:8px 24px 24px 24px;">
208
+ <span style="font-size:11px; color:#9a9a9a; letter-spacing:0.3px;">&copy; Hybridlabor Global LLC &middot; BDB Agent OS</span>
209
+ </td>
210
+ </tr>
211
+ </table>