@hybridlabor-api/aos 4.1.0 → 4.2.0-beta.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.
- package/.agents/agents.md +77 -0
- package/.agents/graph.md +43 -0
- package/.agents/skills/firecrawl/SKILL.md +149 -0
- package/.agents/skills/firecrawl/rules/install.md +82 -0
- package/.agents/skills/firecrawl/rules/security.md +26 -0
- package/.agents/skills/firecrawl-agent/SKILL.md +58 -0
- package/.agents/skills/firecrawl-build/SKILL.md +39 -0
- package/.agents/skills/firecrawl-build-interact/SKILL.md +68 -0
- package/.agents/skills/firecrawl-build-onboarding/SKILL.md +103 -0
- package/.agents/skills/firecrawl-build-onboarding/references/auth-flow.md +39 -0
- package/.agents/skills/firecrawl-build-onboarding/references/project-setup.md +20 -0
- package/.agents/skills/firecrawl-build-onboarding/references/sdk-installation.md +17 -0
- package/.agents/skills/firecrawl-build-scrape/SKILL.md +69 -0
- package/.agents/skills/firecrawl-build-search/SKILL.md +69 -0
- package/.agents/skills/firecrawl-crawl/SKILL.md +59 -0
- package/.agents/skills/firecrawl-download/SKILL.md +70 -0
- package/.agents/skills/firecrawl-interact/SKILL.md +84 -0
- package/.agents/skills/firecrawl-map/SKILL.md +51 -0
- package/.agents/skills/firecrawl-scrape/SKILL.md +69 -0
- package/.agents/skills/firecrawl-search/SKILL.md +60 -0
- package/.agents/state.schema.json +6 -0
- package/.claude/workflows/startcycle-dispatch.mjs +126 -8
- package/CLAUDE.md +47 -0
- package/GEMINI.md +9 -1
- package/README.md +12 -6
- package/mcps/RhinoMCP/cc-plugin/.claude/settings.json +10 -0
- package/mcps/after-effects-mcp/build/index.js +840 -0
- package/mcps/after-effects-mcp/build/scripts/applyEffect.jsx +153 -0
- package/mcps/after-effects-mcp/build/scripts/applyEffectTemplate.jsx +218 -0
- package/mcps/after-effects-mcp/build/scripts/createComposition.jsx +71 -0
- package/mcps/after-effects-mcp/build/scripts/createShapeLayer.jsx +147 -0
- package/mcps/after-effects-mcp/build/scripts/createSolidLayer.jsx +114 -0
- package/mcps/after-effects-mcp/build/scripts/createTextLayer.jsx +115 -0
- package/mcps/after-effects-mcp/build/scripts/getLayerInfo.jsx +192 -0
- package/mcps/after-effects-mcp/build/scripts/getProjectInfo.jsx +90 -0
- package/mcps/after-effects-mcp/build/scripts/listCompositions.jsx +50 -0
- package/mcps/after-effects-mcp/build/scripts/mcp-bridge-auto.jsx +1773 -0
- package/mcps/after-effects-mcp/build/scripts/setLayerProperties.jsx +160 -0
- package/mcps/bdb-remoteos-mcp/queue.db +0 -0
- package/mcps/bdb-remoteos-mcp/src/bdb_remoteos_mcp/__pycache__/__init__.cpython-312.pyc +0 -0
- package/mcps/bdb-remoteos-mcp/src/bdb_remoteos_mcp/__pycache__/incus_client.cpython-312.pyc +0 -0
- package/mcps/bdb-remoteos-mcp/src/bdb_remoteos_mcp/__pycache__/main.cpython-312.pyc +0 -0
- package/mcps/bdb-remoteos-mcp/src/bdb_remoteos_mcp/__pycache__/queue.cpython-312.pyc +0 -0
- package/mcps/bdb-remoteos-mcp/src/bdb_remoteos_mcp/__pycache__/schemas.cpython-312.pyc +0 -0
- package/mcps/bdb-remoteos-mcp/src/bdb_remoteos_mcp/__pycache__/server.cpython-312.pyc +0 -0
- package/mcps/bdb-remoteos-mcp/src/bdb_remoteos_mcp/__pycache__/webhook.cpython-312.pyc +0 -0
- package/mcps/bdb-remoteos-mcp/tests/__pycache__/__init__.cpython-312.pyc +0 -0
- package/mcps/bdb-remoteos-mcp/tests/__pycache__/mock_incus.cpython-312.pyc +0 -0
- package/mcps/bdb-remoteos-mcp/tests/__pycache__/test_mcp_server.cpython-312-pytest-9.1.1.pyc +0 -0
- package/mcps/bdb-remoteos-mcp/tests/__pycache__/test_security_redteam.cpython-312-pytest-9.1.1.pyc +0 -0
- package/mcps/bdb-remoteos-mcp/tests/__pycache__/test_webhook.cpython-312-pytest-9.1.1.pyc +0 -0
- package/mcps/computer-use-mcp/dist/client.d.ts +150 -0
- package/mcps/computer-use-mcp/dist/client.js +136 -0
- package/mcps/computer-use-mcp/dist/entrypoint.d.ts +16 -0
- package/mcps/computer-use-mcp/dist/entrypoint.js +26 -0
- package/mcps/computer-use-mcp/dist/native.d.ts +212 -0
- package/mcps/computer-use-mcp/dist/native.js +50 -0
- package/mcps/computer-use-mcp/dist/server.d.ts +32 -0
- package/mcps/computer-use-mcp/dist/server.js +342 -0
- package/mcps/computer-use-mcp/dist/session.d.ts +101 -0
- package/mcps/computer-use-mcp/dist/session.js +2372 -0
- package/package.json +1 -1
- package/skills/basic/startcycle/SKILL.md +19 -0
- package/skills/basic/startcycle-graph/SKILL.md +27 -7
- package/skills/basic/startcycle-graph-user/SKILL.md +65 -11
- package/skills/bdbsaastraining/scripts/__pycache__/build_profile.cpython-314.pyc +0 -0
|
@@ -81,6 +81,14 @@ const MAX_ITERATIONS = 3;
|
|
|
81
81
|
// correct on the first draft.
|
|
82
82
|
let iteration = 0;
|
|
83
83
|
|
|
84
|
+
// Populated from a --skill=<name> flag (repeatable) in the invocation text --
|
|
85
|
+
// see extractMandatorySkills() and .agents/graph.md's "Mandatory Skill
|
|
86
|
+
// Injection" section. Empty when the user didn't ask for one. Module-level
|
|
87
|
+
// like `iteration` above, for the same reason: skillsNote() and the Reviewer
|
|
88
|
+
// prompt both need it and neither is in a position to thread it through as a
|
|
89
|
+
// parameter without touching every call site.
|
|
90
|
+
let mandatorySkills = [];
|
|
91
|
+
|
|
84
92
|
// Every sequential (non-build-role) agent gets the same note: read the full
|
|
85
93
|
// state, and explicitly set state.iteration to the dispatcher's current
|
|
86
94
|
// count so the persisted file (which .claude/hooks/graph-gate.mjs reads)
|
|
@@ -149,11 +157,27 @@ function reviewerStateNote() {
|
|
|
149
157
|
// Applies to every node, build and sequential alike.
|
|
150
158
|
function skillsNote(node) {
|
|
151
159
|
const skills = Array.isArray(node?.skills) ? node.skills : [];
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
160
|
+
const parts = [];
|
|
161
|
+
if (skills.length > 0) {
|
|
162
|
+
parts.push(
|
|
163
|
+
` Use these skills for this work: ${skills.join(', ')}. ` +
|
|
164
|
+
'Do not reach for skills outside this list unless the task genuinely requires it.'
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
// A --skill flag is a hard requirement from the user, not the registry's
|
|
168
|
+
// own suggested allowlist above -- it applies on top of, never instead of,
|
|
169
|
+
// that list. Only nodes that actually produce work get told to use it:
|
|
170
|
+
// build-role nodes, plus Architect (who should fold the skill's guidance
|
|
171
|
+
// into the plan itself, not just leave it for Build to discover cold).
|
|
172
|
+
// Reviewer gets a separate mention in its own prompt below, framed as a
|
|
173
|
+
// check rather than a use.
|
|
174
|
+
if (mandatorySkills.length > 0 && (node?.role === 'build' || node?.id === 'architect')) {
|
|
175
|
+
parts.push(
|
|
176
|
+
` The user explicitly required this run to use the following skill(s), via /startcycle-graph's --skill flag: ${mandatorySkills.join(', ')}. ` +
|
|
177
|
+
"This is a hard requirement, not a suggestion -- actually apply the skill's guidance in your work, and name in your returned summary how each one was applied."
|
|
178
|
+
);
|
|
179
|
+
}
|
|
180
|
+
return parts.join('');
|
|
157
181
|
}
|
|
158
182
|
|
|
159
183
|
// "a", "a or b", "a, b, or c" -- used for NODE_NAMES, itself derived from the
|
|
@@ -297,13 +321,97 @@ const techleadNode = { id: 'techlead', ...registryNodes.techlead };
|
|
|
297
321
|
const reviewerNode = { id: 'reviewer', ...registryNodes.reviewer };
|
|
298
322
|
const shippingNode = { id: 'shipping', ...registryNodes.shipping };
|
|
299
323
|
|
|
300
|
-
const
|
|
301
|
-
if (!
|
|
324
|
+
const rawGoal = typeof args === 'string' ? args : args?.goal;
|
|
325
|
+
if (!rawGoal) {
|
|
302
326
|
return escalate(
|
|
303
327
|
'startcycle-graph needs a goal, e.g. "Run /startcycle-graph on: add OAuth login with Google" -- nothing was invoked.'
|
|
304
328
|
);
|
|
305
329
|
}
|
|
306
330
|
|
|
331
|
+
// --skill=<name>, repeatable, extracted out of the raw goal text before
|
|
332
|
+
// anything else sees it -- e.g. "--skill=my-custom-skill Add OAuth login"
|
|
333
|
+
// becomes goal "Add OAuth login" plus one mandated skill name. This is the
|
|
334
|
+
// mechanism for injecting a skill this script has never heard of (a user's
|
|
335
|
+
// own private skill, never part of .agents/nodes.json's registry) -- see
|
|
336
|
+
// .agents/graph.md's "Mandatory Skill Injection" section.
|
|
337
|
+
function extractMandatorySkills(text) {
|
|
338
|
+
// The `|--skill=(?=\s|$)` alternative deliberately matches a flag with an
|
|
339
|
+
// EMPTY value ("--skill= add OAuth"). Without it, `\S+` simply fails to
|
|
340
|
+
// match, the flag falls through as ordinary prose, and the run proceeds
|
|
341
|
+
// with no skill injected AND the literal "--skill=" still glued to the
|
|
342
|
+
// goal text handed to Architect -- a silent no-op on a typo, which is the
|
|
343
|
+
// exact failure mode the validation below exists to prevent. Capturing it
|
|
344
|
+
// as an empty name instead routes it into `malformed` and escalates.
|
|
345
|
+
const flagPattern = /--skill=("[^"]+"|'[^']+'|\S+)|--skill=(?=\s|$)/g;
|
|
346
|
+
const skills = [];
|
|
347
|
+
let malformed = 0;
|
|
348
|
+
const goal = text
|
|
349
|
+
.replace(flagPattern, (_, val) => {
|
|
350
|
+
if (val === undefined) { malformed++; return ''; }
|
|
351
|
+
const unquoted =
|
|
352
|
+
(val.startsWith('"') && val.endsWith('"')) || (val.startsWith("'") && val.endsWith("'"))
|
|
353
|
+
? val.slice(1, -1)
|
|
354
|
+
: val;
|
|
355
|
+
if (unquoted.trim() === '') { malformed++; return ''; }
|
|
356
|
+
skills.push(unquoted);
|
|
357
|
+
return '';
|
|
358
|
+
})
|
|
359
|
+
.replace(/\s{2,}/g, ' ')
|
|
360
|
+
.trim();
|
|
361
|
+
return { skills, goal, malformed };
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
const { skills: skillsFromFlags, goal, malformed } = extractMandatorySkills(rawGoal);
|
|
365
|
+
if (malformed > 0) {
|
|
366
|
+
return await escalate(
|
|
367
|
+
`--skill was given with an empty value (${malformed} time(s)). Write --skill=<name>, e.g. --skill=my-custom-skill. ` +
|
|
368
|
+
'Refusing to proceed rather than silently running without the skill you asked for.'
|
|
369
|
+
);
|
|
370
|
+
}
|
|
371
|
+
if (!goal) {
|
|
372
|
+
return await escalate(
|
|
373
|
+
'startcycle-graph needs actual goal text, not just --skill flag(s) -- e.g. "--skill=my-custom-skill add OAuth login with Google", not "--skill=my-custom-skill" alone.'
|
|
374
|
+
);
|
|
375
|
+
}
|
|
376
|
+
// Object-form args may also carry a structured list directly, for a future
|
|
377
|
+
// caller that never goes through the string-flag convention at all.
|
|
378
|
+
const skillsFromArgs = Array.isArray(args?.mandatorySkills) ? args.mandatorySkills : [];
|
|
379
|
+
const mandatorySkillNames = [...new Set([...skillsFromFlags, ...skillsFromArgs])];
|
|
380
|
+
|
|
381
|
+
// Validate before anything else runs -- same "never silently fall back or
|
|
382
|
+
// guess" posture as the registry load above. This script has no filesystem
|
|
383
|
+
// access of its own (comment block item #1), so validation is itself an
|
|
384
|
+
// agent() call, not a local fs check.
|
|
385
|
+
if (mandatorySkillNames.length > 0) {
|
|
386
|
+
const skillCheckResult = await agent(
|
|
387
|
+
`Check whether each of these skill names resolves to an installed skill with a real SKILL.md: ${JSON.stringify(mandatorySkillNames)}. ` +
|
|
388
|
+
'Look under ~/.claude/skills/<name>/SKILL.md first (the global install location every harness syncs to); ' +
|
|
389
|
+
'if this project has its own skills/ directory, also accept skills/<name>/SKILL.md or skills/<container>/<name>/SKILL.md. ' +
|
|
390
|
+
'This is a read-only lookup, not a reasoning task -- do not invent a path that does not exist, and do not guess a close match for a name that is not actually there.\n\n' +
|
|
391
|
+
'Return only: { "found": string[], "missing": string[] }.',
|
|
392
|
+
{
|
|
393
|
+
label: 'validate-mandatory-skills',
|
|
394
|
+
model: 'haiku',
|
|
395
|
+
schema: {
|
|
396
|
+
type: 'object',
|
|
397
|
+
required: ['found', 'missing'],
|
|
398
|
+
properties: {
|
|
399
|
+
found: { type: 'array', items: { type: 'string' } },
|
|
400
|
+
missing: { type: 'array', items: { type: 'string' } },
|
|
401
|
+
},
|
|
402
|
+
},
|
|
403
|
+
}
|
|
404
|
+
);
|
|
405
|
+
const missing = skillCheckResult?.missing ?? [];
|
|
406
|
+
if (missing.length > 0) {
|
|
407
|
+
return await escalate(
|
|
408
|
+
`--skill named skill(s) that could not be found on this machine: ${missing.join(', ')}. ` +
|
|
409
|
+
'Refusing to silently proceed without a mandated skill -- check the name (it must match an installed skill directory) and re-run.'
|
|
410
|
+
);
|
|
411
|
+
}
|
|
412
|
+
mandatorySkills = skillCheckResult?.found ?? mandatorySkillNames;
|
|
413
|
+
}
|
|
414
|
+
|
|
307
415
|
// ---------------------------------------------------------------------
|
|
308
416
|
// Architect <-> TechLead: plan, then capability-map approval. Sequential --
|
|
309
417
|
// not part of the CHANGE 1 race, writes state.json directly as before.
|
|
@@ -323,7 +431,7 @@ while (!approved) {
|
|
|
323
431
|
: '') +
|
|
324
432
|
`Turn this goal into a system plan with an explicit capability map (module boundaries, ` +
|
|
325
433
|
`dependency direction, build order). Write it to production_artifacts/00_execution_plan.md. ` +
|
|
326
|
-
`Set state.goal, state.phase = "plan", state.artifacts.plan to that path. ` +
|
|
434
|
+
`Set state.goal, state.phase = "plan", state.artifacts.plan to that path, and state.mandatory_skills to ${JSON.stringify(mandatorySkills)}. ` +
|
|
327
435
|
`Decide whether the goal needs the Media_EventTech build node (TouchDesigner/show-control/3D/media work) -- most goals don't.\n\n` +
|
|
328
436
|
`Return only: { "planPath": string, "needsMedia": boolean }.`,
|
|
329
437
|
{
|
|
@@ -349,6 +457,11 @@ while (!approved) {
|
|
|
349
457
|
`You are acting as the ${techleadNode.label} agent (${techleadNode.personaFile}). ${dispatchNote(techleadNode)}${skillsNote(techleadNode)}\n\n` +
|
|
350
458
|
`Read the plan at ${planPath}. Approve it only if it has an explicit capability map: ` +
|
|
351
459
|
`module boundaries, dependency direction, and build order are all stated, not implicit. ` +
|
|
460
|
+
(mandatorySkills.length > 0
|
|
461
|
+
? `The user also required this run to use the following skill(s) via /startcycle-graph's --skill flag: ${mandatorySkills.join(', ')}. ` +
|
|
462
|
+
`Reject the plan if it does not actually account for them — catching that here costs one planning round, ` +
|
|
463
|
+
`whereas letting it through wastes a full build cycle before Reviewer flags it.\n`
|
|
464
|
+
: '') +
|
|
352
465
|
`Record your decision in state.json (plan approval, state.phase = "build" if approved).\n\n` +
|
|
353
466
|
`Return only: { "approved": boolean, "reason": string }.`,
|
|
354
467
|
{
|
|
@@ -459,6 +572,11 @@ while (!reviewedClean) {
|
|
|
459
572
|
}, and the actual code). ` +
|
|
460
573
|
`Do an adversarial review against the contract: find what is wrong, do not validate, do not summarize. ` +
|
|
461
574
|
`Do not assume the implementation is correct just because it exists. ` +
|
|
575
|
+
(mandatorySkills.length > 0
|
|
576
|
+
? `The user explicitly required these skill(s) to be used this run, via /startcycle-graph's --skill flag: ${mandatorySkills.join(', ')}. ` +
|
|
577
|
+
`If an artifact shows no sign of applying a mandated skill's guidance, that is a contract misread finding (blocking), owned by whichever build node should have applied it. ` +
|
|
578
|
+
`A mandated skill being merely available is not enough -- check for it actually being used.\n`
|
|
579
|
+
: '') +
|
|
462
580
|
`Classify every finding by precedence: contract misread > valid & actionable (blocking) > valid trade-off (advisory) > noise (discard). ` +
|
|
463
581
|
`Each finding must name which node owns fixing it: ${NODE_NAMES} -- no other value is valid. ` +
|
|
464
582
|
`If you are re-reviewing after a repair round and an issue you flagged before is still present and still unfixed, ` +
|
package/CLAUDE.md
CHANGED
|
@@ -15,6 +15,53 @@ Ask one question first: **do the workers need to see each other?**
|
|
|
15
15
|
|
|
16
16
|
"Runs in parallel" is not a reason to reach for a team — subagents already run in parallel. Peer communication and dynamic task claiming are the only things a team adds.
|
|
17
17
|
|
|
18
|
+
## Delegating to an external CLI
|
|
19
|
+
Some work is cheaper on another provider's compute (bulk scaffolding, exhaustive
|
|
20
|
+
test generation, long-context reads that distil to a digest). None of that tooling
|
|
21
|
+
ships with AOS — it depends on CLIs and Claude Code plugins the user installed
|
|
22
|
+
separately, so check what is actually present instead of assuming.
|
|
23
|
+
|
|
24
|
+
**Prefer a plugin's delegation subagent over shelling out to its CLI.** Where one
|
|
25
|
+
is installed it already handles the wrapper flags, cost discipline, and digest
|
|
26
|
+
contract: `antigravity:antigravity-delegate` (agy), `opencode:opencode-rescue`,
|
|
27
|
+
`codex:codex-rescue`. These are Claude Code plugins — on another harness, or a
|
|
28
|
+
machine without them, calling the CLI directly is the only path.
|
|
29
|
+
|
|
30
|
+
**Delegate only above the break-even.** A small, self-contained, or
|
|
31
|
+
judgement-heavy task costs more to hand off and verify than to just do. Keep the
|
|
32
|
+
digest, not the raw output.
|
|
33
|
+
|
|
34
|
+
**Give it a real timeout.** Measured 2026-09: a trivial headless `agy` prompt
|
|
35
|
+
took **605s**. `agy-delegate` defaults to `--print-timeout 5m`, so it aborts at
|
|
36
|
+
300s and reports an empty body while the answer is still coming — pass
|
|
37
|
+
`--timeout 15m` for anything non-trivial. A short timeout does not read as
|
|
38
|
+
"slow", it reads as "broken".
|
|
39
|
+
|
|
40
|
+
**Match the model to the task, not to the default.** `agy-delegate`'s tiers map
|
|
41
|
+
to models that can go stale (its built-in `flash` still points at Gemini 3.7
|
|
42
|
+
while 3.8 ships). Either pass `--model "<exact name from \`agy models\`>"` per
|
|
43
|
+
call, or remap the tiers once via the plugin's own options — as env vars those
|
|
44
|
+
belong in `~/.zshenv`, not `~/.zshrc`, since `.zshrc` is only sourced for
|
|
45
|
+
interactive shells and tool-invoked ones would never see them:
|
|
46
|
+
|
|
47
|
+
| Work | Model |
|
|
48
|
+
|---|---|
|
|
49
|
+
| media, fast/mechanical coding, boilerplate | `Gemini 3.8 Flash (Medium)` → `CLAUDE_PLUGIN_OPTION_TIER_FLASH` |
|
|
50
|
+
| trivial one-liners | `Gemini 3.8 Flash (Low)` → `CLAUDE_PLUGIN_OPTION_TIER_FLASH_LO` |
|
|
51
|
+
| review, architecture, hard reasoning | `Claude Sonnet 4.6 (Thinking)` → `CLAUDE_PLUGIN_OPTION_TIER_PRO` |
|
|
52
|
+
|
|
53
|
+
Adversarial review is the case that most repays a stronger model: a Flash tier
|
|
54
|
+
tends to agree with what it is shown, which is the one thing a reviewer must
|
|
55
|
+
not do. Re-check the names against `agy models` after an agy upgrade — the id
|
|
56
|
+
carries both the version and the effort suffix.
|
|
57
|
+
|
|
58
|
+
**Verify the result, never the status field.** A timed-out delegation returns
|
|
59
|
+
`{"status": "SUCCESS", "usage": {"total": 0}}` with an empty body — success by
|
|
60
|
+
every field except the one that matters, and the zero token counts are *not*
|
|
61
|
+
proof the prompt never arrived (headless usage reporting is simply unpopulated).
|
|
62
|
+
Check the returned content, treat an empty body as failure regardless of status,
|
|
63
|
+
and never report a delegated step as done on the strength of its own self-report.
|
|
64
|
+
|
|
18
65
|
## Safety Gate — mechanically enforced, not advisory
|
|
19
66
|
`git push`, `npm publish`, `npm version`, and recursive `rm` are blocked by `.claude/hooks/go-gate.mjs` (registered in `.claude/settings.json`) unless your immediately preceding message is the literal word **GO**. This is a hook, not a rule I read and try to follow — it cannot be argued around, and it doesn't depend on this file being loaded.
|
|
20
67
|
- A subagent does not inherit its orchestrator's GO.
|
package/GEMINI.md
CHANGED
|
@@ -47,4 +47,12 @@ Ask one question first: **do the workers need to see each other?**
|
|
|
47
47
|
- **Yes — they must react to each other, or claim work dynamically from a shared list** → an orchestrated agent team (via `send_message`). Currently only `/bdbrainstorm` qualifies, where the spec demands a real debate rather than parallel monologues. True Agent Teams were evaluated and deferred for `/startcycle-graph` (needs an interactive session; the graph runs headless) — see `.agents/graph.md` and F-17's addendum in `docs/sessions/audit-agents.md`.
|
|
48
48
|
- **Small task** → do it yourself. A two-file edit needs no agents.
|
|
49
49
|
|
|
50
|
-
"Runs in parallel" is not a reason to reach for a team — subagents already run in parallel. Peer communication and dynamic task claiming are the only things a team adds.
|
|
50
|
+
"Runs in parallel" is not a reason to reach for a team — subagents already run in parallel. Peer communication and dynamic task claiming are the only things a team adds.
|
|
51
|
+
|
|
52
|
+
## 9. Delegating to an external CLI
|
|
53
|
+
None of this tooling ships with AOS — it depends on CLIs and plugins the user installed separately, so check what is present rather than assuming.
|
|
54
|
+
- **Prefer a plugin's delegation subagent over shelling out to its CLI.** Where installed, it already handles the wrapper flags, cost discipline, and digest contract: `antigravity:antigravity-delegate` (agy), `opencode:opencode-rescue`, `codex:codex-rescue`. These are Claude Code plugins — on another harness, calling the CLI directly is the only path.
|
|
55
|
+
- **Delegate only above the break-even.** A small, self-contained, or judgement-heavy task costs more to hand off and verify than to just do. Keep the digest, not the raw output.
|
|
56
|
+
- **Give it a real timeout.** Measured 2026-09: a trivial headless `agy` prompt took **605s**. `agy-delegate` defaults to `--print-timeout 5m`, so it aborts at 300s and reports an empty body while the answer is still coming — pass `--timeout 15m` for anything non-trivial.
|
|
57
|
+
- **Match the model to the task, not to the default.** The wrapper's tiers map to models that go stale (built-in `flash` still points at Gemini 3.7 while 3.8 ships). Media and fast/mechanical coding → `Gemini 3.8 Flash (Medium)`; trivial → `Gemini 3.8 Flash (Low)`; review, architecture and hard reasoning → `Claude Sonnet 4.6 (Thinking)`. Adversarial review most repays the stronger model: a Flash tier tends to agree with what it is shown, which is exactly what a reviewer must not do. Pass `--model` per call, or remap the tiers once via `CLAUDE_PLUGIN_OPTION_TIER_{FLASH,FLASH_LO,PRO}` — in `~/.zshenv`, not `~/.zshrc`, which non-interactive tool shells never source. Re-check names against `agy models` after an upgrade.
|
|
58
|
+
- **Verify the result, never the status field.** A timed-out delegation returns `{"status": "SUCCESS", "usage": {"total": 0}}` with an empty body — success by every field except the one that matters, and the zero token counts are *not* proof the prompt never arrived (headless usage reporting is simply unpopulated). Treat an empty body as failure regardless of status, and never report a delegated step as done on the strength of its own self-report.
|
package/README.md
CHANGED
|
@@ -5,13 +5,19 @@
|
|
|
5
5
|
|
|
6
6
|
[](https://github.com/hybridlabor-api/aos/actions)
|
|
7
7
|
[](https://www.npmjs.com/package/@hybridlabor-api/aos)
|
|
8
|
-
[](https://www.npmjs.com/package/@hybridlabor-api/aos)
|
|
9
9
|
[](LICENSE)
|
|
10
|
-
[](https://github.com/hybridlabor-api/aos/stargazers)
|
|
11
|
+
[](https://github.com/hybridlabor-api/aos/commits/main)
|
|
12
|
+
|
|
13
|
+
[](docs/skills_table.md)
|
|
14
|
+
[](mcps/)
|
|
15
|
+
[](#-installation)
|
|
16
|
+
[](https://github.com/hybridlabor-api/aos)
|
|
11
17
|
|
|
12
|
-
> **Supercharging AI coding agents with
|
|
18
|
+
> **Supercharging AI coding agents with 169 hyper-curated skills, 21 local MCP wrappers, and a runnable multi-agent dispatcher graph.**
|
|
13
19
|
|
|
14
|
-
Welcome to **BDB Agent OS — AOS v4.0.0**:
|
|
20
|
+
Welcome to **BDB Agent OS — AOS v4.0.0**: 169 curated skills, 21 local MCP wrappers, and a dispatcher graph that turns them into a real multi-agent build pipeline, not just a prompt library. Point it at a goal and it plans, builds, reviews, and ships through seven coordinated agent nodes — with a mechanically enforced gate before anything actually goes live.
|
|
15
21
|
|
|
16
22
|
It is harness-neutral by design, not "optimized for one tool with others as an afterthought": the dispatcher graph runs on Claude Code's Dynamic Workflows, the same skills and MCP configuration install natively into **Google Antigravity, ChatGPT Codex / Codex CLI, Claude Desktop, Cursor, Aider, Roo Code, Cline, and Windsurf**, and the lightweight `/startcycle-graph-user` variant falls back to Claude Code's own subagents on any machine that has none of the above installed.
|
|
17
23
|
|
|
@@ -95,9 +101,9 @@ below for how the pipeline itself works.
|
|
|
95
101
|
|
|
96
102
|
---
|
|
97
103
|
|
|
98
|
-
## 🌟
|
|
104
|
+
## 🌟 169 Optimized Skills
|
|
99
105
|
|
|
100
|
-
We started with a massive pool of over 1,400 raw AI skills. After rigorous testing, filtering, and refinement, we've distilled them down to a hyper-curated set of **
|
|
106
|
+
We started with a massive pool of over 1,400 raw AI skills. After rigorous testing, filtering, and refinement, we've distilled them down to a hyper-curated set of **169 Optimized Skills** (featuring a native OpenWiki documentation engine, the **memB local semantic memory brain**, and **Universal Agent Harness synchronization**).
|
|
101
107
|
|
|
102
108
|
These skills are precision-engineered to ensure agents waste no time on redundant tasks and instead operate with maximum agency, strict architectural constraints, and robust context awareness.
|
|
103
109
|
|