@hybridlabor-api/aos 4.5.2 → 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 (33) 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/docs/email/aos-4.5.0-update-banner.html +211 -0
  29. package/installer.js +157 -25
  30. package/package.json +1 -1
  31. package/skills/global_config/aos-project-init/SKILL.md +2 -0
  32. package/skills/global_config/subagent-setup/SKILL.md +71 -0
  33. package/skills/global_config/subagent-setup/scripts/setup-subagents.mjs +185 -0
@@ -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>
package/installer.js CHANGED
@@ -2919,17 +2919,83 @@ function yamlQuote(str) {
2919
2919
  return `"${str.replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, ' ')}"`;
2920
2920
  }
2921
2921
 
2922
+ // Canonical model tiers mapped to verified provider-specific model IDs for each harness.
2923
+ // Protects against vendor model churn and provides seamless cross-harness defaults.
2924
+ const CANONICAL_TIERS = {
2925
+ reasoning_max: {
2926
+ claude: 'opus',
2927
+ antigravity: 'gemini-3.1-pro-high',
2928
+ opencode: 'opencode/muse-spark-1.3-contributor-free',
2929
+ codex: 'o3-mini'
2930
+ },
2931
+ standard_fast: {
2932
+ claude: 'sonnet',
2933
+ antigravity: 'gemini-3.8-flash-high',
2934
+ opencode: 'opencode/muse-spark-1.3-contributor-free',
2935
+ codex: 'gpt-4o'
2936
+ },
2937
+ trivial_low: {
2938
+ claude: 'haiku',
2939
+ antigravity: 'gemini-3.8-flash-low',
2940
+ opencode: 'opencode/muse-spark-1.3-contributor-free',
2941
+ codex: 'gpt-4o-mini'
2942
+ }
2943
+ };
2944
+
2945
+ // Loads .aos/pipeline.json or .aos/project.json containing role-to-model/harness mappings.
2946
+ function loadPipelineConfig(projectDir = currentDir) {
2947
+ const candidates = [
2948
+ path.join(projectDir, '.aos', 'pipeline.json'),
2949
+ path.join(projectDir, '.aos', 'project.json'),
2950
+ path.join(homeDir, '.aos', 'pipeline.json')
2951
+ ];
2952
+ for (const p of candidates) {
2953
+ if (fs.existsSync(p)) {
2954
+ try {
2955
+ const data = JSON.parse(fs.readFileSync(p, 'utf8'));
2956
+ if (data && data.pipeline) return data.pipeline;
2957
+ } catch {}
2958
+ }
2959
+ }
2960
+ return null;
2961
+ }
2962
+
2963
+ // Resolves model ID, tier, and enabled status for a given agent role and target harness.
2964
+ function resolveAgentConfig(agentSlug, harness, pipelineConfig = null) {
2965
+ const normSlug = agentSlug.toLowerCase().replace(/-/g, '_');
2966
+ const roleCfg = pipelineConfig ? (pipelineConfig[normSlug] || pipelineConfig[agentSlug]) : null;
2967
+ if (roleCfg) {
2968
+ if (roleCfg.model) {
2969
+ return {
2970
+ model: roleCfg.model,
2971
+ tier: roleCfg.tier || 'custom',
2972
+ enabled: roleCfg.enabled !== false,
2973
+ harness: roleCfg.harness || harness
2974
+ };
2975
+ }
2976
+ if (roleCfg.tier && CANONICAL_TIERS[roleCfg.tier] && CANONICAL_TIERS[roleCfg.tier][harness]) {
2977
+ return {
2978
+ model: CANONICAL_TIERS[roleCfg.tier][harness],
2979
+ tier: roleCfg.tier,
2980
+ enabled: roleCfg.enabled !== false,
2981
+ harness: roleCfg.harness || harness
2982
+ };
2983
+ }
2984
+ }
2985
+ const defaultTier = (normSlug === 'architect' || normSlug === 'reviewer') ? 'reasoning_max' : 'standard_fast';
2986
+ const fallbackModel = (CANONICAL_TIERS[defaultTier] && CANONICAL_TIERS[defaultTier][harness]) || 'inherit';
2987
+ return { model: fallbackModel, tier: defaultTier, enabled: true, harness };
2988
+ }
2989
+
2922
2990
  // Generates .claude/agents/<name>.md — Claude Code's native subagent format.
2923
2991
  // Only frontmatter fields confirmed against code.claude.com/docs/en/sub-agents
2924
- // are emitted (name, description, model). `tools:`/`permission`-style
2925
- // allowlists are deliberately omitted rather than guessed from the MCP-server
2926
- // list -- an unverified mapping there would silently over- or under-scope a
2927
- // subagent's tool access, which is worse than inheriting the default set.
2928
- function compileClaudeAgents(agents, targetDir) {
2992
+ // are emitted (name, description, model).
2993
+ function compileClaudeAgents(agents, targetDir, pipelineConfig = null) {
2929
2994
  fs.mkdirSync(targetDir, { recursive: true });
2930
2995
  for (const a of agents) {
2931
2996
  const slug = a.name.toLowerCase().replace(/_/g, '-');
2932
- const model = a.model ? a.model.toLowerCase() : 'inherit';
2997
+ const resolved = resolveAgentConfig(slug, 'claude', pipelineConfig);
2998
+ const model = (resolved && resolved.model) ? resolved.model.toLowerCase() : (a.model ? a.model.toLowerCase() : 'inherit');
2933
2999
  const body = [
2934
3000
  a.role,
2935
3001
  a.skills.length ? `**Primary skills:** ${a.skills.join(', ')}` : null,
@@ -2950,18 +3016,13 @@ function compileClaudeAgents(agents, targetDir) {
2950
3016
  }
2951
3017
  }
2952
3018
 
2953
- // Generates .opencode/agents/<name>.md. Only `description` and `mode` are
2954
- // emitted -- confirmed fields per opencode.ai/docs/agents. `model` and
2955
- // `permission` are left unset: OpenCode's model-id format and its mapping
2956
- // from an MCP-server list to `permission` keys are not verified against its
2957
- // docs, so guessing either would risk emitting a value OpenCode silently
2958
- // can't resolve. `mode: subagent` is used for every generated agent, since
2959
- // none of these five is meant to be a primary/default agent a user talks to
2960
- // directly.
2961
- function compileOpenCodeAgents(agents, targetDir) {
3019
+ // Generates .opencode/agents/<name>.md. Emits description, mode: subagent, and model.
3020
+ function compileOpenCodeAgents(agents, targetDir, pipelineConfig = null) {
2962
3021
  fs.mkdirSync(targetDir, { recursive: true });
2963
3022
  for (const a of agents) {
2964
3023
  const slug = a.name.toLowerCase().replace(/_/g, '-');
3024
+ const resolved = resolveAgentConfig(slug, 'opencode', pipelineConfig);
3025
+ const model = resolved && resolved.model ? resolved.model : null;
2965
3026
  const body = [
2966
3027
  a.role,
2967
3028
  a.skills.length ? `**Primary skills:** ${a.skills.join(', ')}` : null,
@@ -2969,18 +3030,54 @@ function compileOpenCodeAgents(agents, targetDir) {
2969
3030
  a.output ? `**Output artifact(s):** ${a.output}` : null,
2970
3031
  ].filter(Boolean).join('\n\n');
2971
3032
 
2972
- const frontmatter = [
3033
+ const frontmatterLines = [
2973
3034
  '---',
2974
3035
  `description: ${yamlQuote(a.role)}`,
2975
3036
  'mode: subagent',
2976
- '---',
2977
- '',
3037
+ ];
3038
+ if (model) {
3039
+ frontmatterLines.push(`model: ${model}`);
3040
+ }
3041
+ frontmatterLines.push('---', '');
3042
+
3043
+ fs.writeFileSync(path.join(targetDir, `${slug}.md`), frontmatterLines.join('\n') + body + '\n');
3044
+ }
3045
+ }
3046
+
3047
+ // Generates .codex/agents/<name>.toml and .codex/agents/<name>.md for ChatGPT Codex CLI.
3048
+ function compileCodexAgents(agents, targetDir, pipelineConfig = null) {
3049
+ fs.mkdirSync(targetDir, { recursive: true });
3050
+ for (const a of agents) {
3051
+ const slug = a.name.toLowerCase().replace(/_/g, '-');
3052
+ const resolved = resolveAgentConfig(slug, 'codex', pipelineConfig);
3053
+ const model = resolved && resolved.model ? resolved.model : 'o3-mini';
3054
+
3055
+ const tomlContent = [
3056
+ `# Codex subagent configuration for ${slug}`,
3057
+ `name = "${slug}"`,
3058
+ `description = ${JSON.stringify(a.role)}`,
3059
+ `model = "${model}"`,
3060
+ `tier = "${resolved.tier || 'standard_fast'}"`,
3061
+ `enabled = ${resolved.enabled !== false}`,
3062
+ `prompt_file = "${slug}.md"`
2978
3063
  ].join('\n');
3064
+ fs.writeFileSync(path.join(targetDir, `${slug}.toml`), tomlContent + '\n');
2979
3065
 
2980
- fs.writeFileSync(path.join(targetDir, `${slug}.md`), frontmatter + body + '\n');
3066
+ const body = [
3067
+ `# Role: ${a.name}`,
3068
+ a.role,
3069
+ a.skills.length ? `**Primary skills:** ${a.skills.join(', ')}` : null,
3070
+ a.mcpServers.length ? `**MCP servers used:** ${a.mcpServers.join(', ')}` : null,
3071
+ a.output ? `**Output artifact(s):** ${a.output}` : null,
3072
+ '',
3073
+ '## Instructions',
3074
+ a.systemPrompt
3075
+ ].filter(Boolean).join('\n\n');
3076
+ fs.writeFileSync(path.join(targetDir, `${slug}.md`), body + '\n');
2981
3077
  }
2982
3078
  }
2983
3079
 
3080
+
2984
3081
  function injectHarnessRules() {
2985
3082
  const geminiMdSrc = path.join(srcDir, 'GEMINI.md');
2986
3083
  const agentsMdSrc = path.join(srcDir, '.agents', 'agents.md');
@@ -3034,11 +3131,16 @@ function injectHarnessRules() {
3034
3131
  const agyAgentsDir = path.join(geminiDir, 'config', 'agents');
3035
3132
  if (!fs.existsSync(agyAgentsDir)) fs.mkdirSync(agyAgentsDir, { recursive: true });
3036
3133
 
3134
+ const pipelineConfig = loadPipelineConfig();
3037
3135
  const agents = parseAgentsMd(agentsMdContent);
3038
3136
  for (const a of agents) {
3137
+ const slug = a.name.toLowerCase().replace(/_/g, '-');
3138
+ const resolved = resolveAgentConfig(slug, 'antigravity', pipelineConfig);
3039
3139
  const agentConfig = {
3040
3140
  name: a.name,
3041
3141
  description: a.role,
3142
+ model: resolved.model,
3143
+ model_tier: resolved.tier,
3042
3144
  enable_write_tools: true,
3043
3145
  enable_subagent_tools: true,
3044
3146
  enable_mcp_tools: true,
@@ -3053,22 +3155,34 @@ function injectHarnessRules() {
3053
3155
 
3054
3156
  installStep('compile Claude Code subagents', () => {
3055
3157
  if (agentsMdContent) {
3158
+ const pipelineConfig = loadPipelineConfig();
3056
3159
  const agents = parseAgentsMd(agentsMdContent);
3057
3160
  const claudeAgentsDir = path.join(homeDir, '.claude', 'agents');
3058
- compileClaudeAgents(agents, claudeAgentsDir);
3161
+ compileClaudeAgents(agents, claudeAgentsDir, pipelineConfig);
3059
3162
  log.step(`Compiled AGENTS.md to Claude Code subagents in ${claudeAgentsDir}`);
3060
3163
  }
3061
3164
  }, 'Claude Code agents unchanged');
3062
3165
 
3063
3166
  installStep('compile OpenCode subagents', () => {
3064
3167
  if (agentsMdContent) {
3168
+ const pipelineConfig = loadPipelineConfig();
3065
3169
  const agents = parseAgentsMd(agentsMdContent);
3066
3170
  const opencodeAgentsDir = path.join(homeDir, '.opencode', 'agents');
3067
- compileOpenCodeAgents(agents, opencodeAgentsDir);
3171
+ compileOpenCodeAgents(agents, opencodeAgentsDir, pipelineConfig);
3068
3172
  log.step(`Compiled AGENTS.md to OpenCode subagents in ${opencodeAgentsDir}`);
3069
3173
  }
3070
3174
  }, 'OpenCode agents unchanged');
3071
3175
 
3176
+ installStep('compile Codex subagents', () => {
3177
+ if (agentsMdContent) {
3178
+ const pipelineConfig = loadPipelineConfig();
3179
+ const agents = parseAgentsMd(agentsMdContent);
3180
+ const codexAgentsDir = path.join(homeDir, '.codex', 'agents');
3181
+ compileCodexAgents(agents, codexAgentsDir, pipelineConfig);
3182
+ log.step(`Compiled AGENTS.md to Codex subagents in ${codexAgentsDir}`);
3183
+ }
3184
+ }, 'Codex agents unchanged');
3185
+
3072
3186
  const claudeMdPath = path.join(currentDir, 'CLAUDE.md');
3073
3187
  installStep(`sync ${claudeMdPath}`, () => {
3074
3188
  let claudeContent = fs.existsSync(claudeMdPath) ? fs.readFileSync(claudeMdPath, 'utf8') : '';
@@ -3513,10 +3627,20 @@ function installProjectHarness() {
3513
3627
  }, 'go-gate / graph-gate enforcement stays inactive in this project.');
3514
3628
 
3515
3629
  installStep('copy agent definitions into project', () => {
3516
- const agentsSrc = path.join(srcDir, '.claude', 'agents');
3517
- if (fs.existsSync(agentsSrc)) {
3518
- copyDirRecursiveSync(agentsSrc, path.join(projectClaudeDir, 'agents'));
3519
- log.step(`Copied agent definitions to ${path.join(projectClaudeDir, 'agents')}`);
3630
+ const agentsMdSrc = path.join(srcDir, '.agents', 'agents.md');
3631
+ const pipelineConfig = loadPipelineConfig(currentDir);
3632
+ if (fs.existsSync(agentsMdSrc)) {
3633
+ const agents = parseAgentsMd(fs.readFileSync(agentsMdSrc, 'utf8'));
3634
+ compileClaudeAgents(agents, path.join(projectClaudeDir, 'agents'), pipelineConfig);
3635
+ compileOpenCodeAgents(agents, path.join(currentDir, '.opencode', 'agents'), pipelineConfig);
3636
+ compileCodexAgents(agents, path.join(projectCodexDir, 'agents'), pipelineConfig);
3637
+ log.step(`Compiled project agent definitions for Claude, OpenCode, and Codex`);
3638
+ } else {
3639
+ const agentsSrc = path.join(srcDir, '.claude', 'agents');
3640
+ if (fs.existsSync(agentsSrc)) {
3641
+ copyDirRecursiveSync(agentsSrc, path.join(projectClaudeDir, 'agents'));
3642
+ log.step(`Copied agent definitions to ${path.join(projectClaudeDir, 'agents')}`);
3643
+ }
3520
3644
  }
3521
3645
  }, 'The dispatcher runs, but its agent-file pointers resolve to nothing.');
3522
3646
 
@@ -4715,4 +4839,12 @@ module.exports = {
4715
4839
  flushSessionManifest,
4716
4840
  copyDirRecursiveSync,
4717
4841
  INSTALL_MANIFEST_PATH,
4842
+ // Agent compilers & pipeline helpers
4843
+ parseAgentsMd,
4844
+ compileClaudeAgents,
4845
+ compileOpenCodeAgents,
4846
+ compileCodexAgents,
4847
+ loadPipelineConfig,
4848
+ resolveAgentConfig,
4849
+ CANONICAL_TIERS,
4718
4850
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hybridlabor-api/aos",
3
- "version": "4.5.2",
3
+ "version": "4.6.0",
4
4
  "description": "AOS — A Curated AI AGENT OS. Optimized agent skills and add-ons like memB, OpenWiki, Heimdall Token Saver, and Godmode architectures.",
5
5
  "main": "installer.js",
6
6
  "engines": {
@@ -77,6 +77,8 @@ your head. Ask; do not default it on.
77
77
  holds content, merge it into `AGENTS.md` first and only then replace it with a
78
78
  symlink. Never silently overwrite it.
79
79
 
80
+ **Subagents & Multi-Harness Pipeline.** Offer to initialize `.aos/pipeline.json` using canonical tiers (or custom roles via `/subagent-setup`). Ensures subagents are automatically compiled across Claude Code, Antigravity, OpenCode, and Codex CLI.
81
+
80
82
  **With a GitHub remote, two more.** Skip both entirely without a remote — a
81
83
  local-only repo has nowhere to put them, and a skipped question is clearer than
82
84
  one answered "no".
@@ -0,0 +1,71 @@
1
+ ---
2
+ name: subagent-setup
3
+ description: Configure and synchronize multi-harness subagents (Claude Code, Google Antigravity, OpenCode, ChatGPT Codex CLI) with canonical model tiers and single source of truth in .aos/pipeline.json.
4
+ category: bdb-core
5
+ risk: low
6
+ source: bdb
7
+ date_added: "2026-09-20"
8
+ ---
9
+
10
+ # Skill: subagent-setup — Multi-Harness Subagent Configuration
11
+
12
+ Manages and synchronizes autonomous subagent roles across all four supported execution harnesses:
13
+ 1. **Claude Code** (`.claude/agents/*.md`)
14
+ 2. **Google Antigravity** (`~/.gemini/config/agents/*.json`)
15
+ 3. **OpenCode** (`.opencode/agents/*.md`)
16
+ 4. **ChatGPT Codex CLI** (`.codex/agents/*.toml` & `.codex/agents/*.md`)
17
+
18
+ Single Source of Truth: **`.aos/pipeline.json`** (compatible with AO Orchestrator Pipeline Wizard).
19
+
20
+ ---
21
+
22
+ ## 1. Canonical Model Tiers (Resilience against Model Churn)
23
+
24
+ To prevent breaking configurations when providers update model names, roles map to canonical tiers:
25
+
26
+ | Tier | Description | Claude Code | Antigravity | OpenCode | Codex CLI |
27
+ |---|---|---|---|---|---|
28
+ | `reasoning_max` | Deep reasoning, planning, adversarial review | `opus` | `gemini-3.1-pro-high` | `opencode/muse-spark-1.3-contributor-free` | `o3-mini` |
29
+ | `standard_fast` | Fast coding, frontend/backend engineering | `sonnet` | `gemini-3.8-flash-high` | `opencode/muse-spark-1.3-contributor-free` | `gpt-4o` |
30
+ | `trivial_low` | Mechanical tasks, summaries | `haiku` | `gemini-3.8-flash-low` | `opencode/muse-spark-1.3-contributor-free` | `gpt-4o-mini` |
31
+
32
+ *Note:* Custom model IDs can also be set directly per role and harness.
33
+
34
+ ---
35
+
36
+ ## 2. CLI Usage
37
+
38
+ ### View Current Pipeline Status
39
+ ```bash
40
+ node skills/global_config/subagent-setup/scripts/setup-subagents.mjs --show
41
+ ```
42
+
43
+ ### Initialize Default Pipeline Configuration
44
+ ```bash
45
+ node skills/global_config/subagent-setup/scripts/setup-subagents.mjs --init-default
46
+ ```
47
+
48
+ ### Update a Specific Role
49
+ ```bash
50
+ # Example: Set Reviewer to Codex with o3-mini
51
+ node skills/global_config/subagent-setup/scripts/setup-subagents.mjs \
52
+ --set-role reviewer --harness codex --model o3-mini --tier reasoning_max
53
+
54
+ # Example: Set Shipping to OpenCode with Free Tier
55
+ node skills/global_config/subagent-setup/scripts/setup-subagents.mjs \
56
+ --set-role shipping --harness opencode --model opencode/muse-spark-1.3-contributor-free
57
+
58
+ # Example: Enable or Disable a Role
59
+ node skills/global_config/subagent-setup/scripts/setup-subagents.mjs --set-role media_eventtech --enable
60
+ ```
61
+
62
+ ### Synchronize to All Harnesses
63
+ ```bash
64
+ node skills/global_config/subagent-setup/scripts/setup-subagents.mjs --sync
65
+ ```
66
+
67
+ ---
68
+
69
+ ## 3. Integration with `aos-project-init` & AO Orchestrator
70
+ - **AO Orchestrator (Port 3101)**: The Pipeline Wizard (Schritt 3 von 4: Agenten & Rollen) directly reads and writes `.aos/pipeline.json`.
71
+ - **`aos-project-init`**: Offers subagent configuration during project interview, defaulting to the canonical tier matrix.