@hybridlabor-api/aos 4.2.0-beta.0 → 4.3.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/graph.md +3 -1
- package/.agents/nodes.json +4 -2
- package/.claude/workflows/startcycle-dispatch.mjs +18 -5
- package/.claude/workflows/teamwork-dispatch.mjs +287 -0
- package/CLAUDE.md +37 -84
- package/CODEX.md +31 -12
- package/GEMINI.md +51 -58
- package/README.de.md +13 -12
- package/README.md +13 -12
- package/README.pt.md +13 -12
- package/THIRD_PARTY_NOTICES.md +104 -0
- package/docs/skills_table.md +1 -0
- package/installer.js +27 -10
- package/package.json +6 -1
- package/scripts/validate-skills.mjs +402 -0
- package/skills/basic/bdbmediastorm/SKILL.md +7 -5
- package/skills/basic/godmode-engineering/SKILL.md +1 -1
- package/skills/basic/godmode-shipping/SKILL.md +1 -1
- package/skills/basic/startcycle/SKILL.md +3 -1
- package/skills/basic/startcycle-graph/SKILL.md +18 -2
- package/skills/basic/startcycle-graph-user/SKILL.md +3 -1
- package/skills/basic/teamwork-preview/SKILL.md +209 -0
- package/skills/bdbrainstorm/SKILL.md +4 -3
- package/skills/github-repo/SKILL.md +1 -0
- package/skills/global_config/agent-tool-builder/SKILL.md +5 -4
- package/skills/global_config/ai-product/SKILL.md +3 -2
- package/skills/global_config/ask-tim/SKILL.md +75 -6
- package/skills/global_config/{bdb-adobe-suite-mcp.md → bdb-adobe-suite-mcp/SKILL.md} +1 -0
- package/skills/global_config/{bdb-after-effects-mcp.md → bdb-after-effects-mcp/SKILL.md} +1 -0
- package/skills/global_config/{bdb-blender-mcp.md → bdb-blender-mcp/SKILL.md} +1 -0
- package/skills/global_config/{bdb-computer-use-mcp.md → bdb-computer-use-mcp/SKILL.md} +1 -0
- package/skills/global_config/{bdb-davinci-mcp.md → bdb-davinci-mcp/SKILL.md} +1 -0
- package/skills/global_config/bdb-ecosystem-health/SKILL.md +3 -3
- package/skills/global_config/{bdb-grandma3-mcp.md → bdb-grandma3-mcp/SKILL.md} +1 -0
- package/skills/global_config/{bdb-memb-mcp.md → bdb-memb-mcp/SKILL.md} +10 -0
- package/skills/global_config/{bdb-resolume-mcp.md → bdb-resolume-mcp/SKILL.md} +1 -0
- package/skills/global_config/{bdb-rhino-mcp.md → bdb-rhino-mcp/SKILL.md} +1 -0
- package/skills/global_config/{bdb-touchdesigner-mcp.md → bdb-touchdesigner-mcp/SKILL.md} +1 -0
- package/skills/global_config/{bdb-unreal-mcp.md → bdb-unreal-mcp/SKILL.md} +1 -0
- package/skills/global_config/{bdb-vectorworks-mcp.md → bdb-vectorworks-mcp/SKILL.md} +1 -0
- package/skills/global_config/bdbresilience/SKILL.md +216 -0
- package/skills/global_config/bdbresilience/contracts/nodes-integration.md +225 -0
- package/skills/global_config/bdbresilience/references/cicd-triage.md +179 -0
- package/skills/global_config/bdbresilience/references/distributed-locking.md +235 -0
- package/skills/global_config/bdbresilience/references/error-recovery.md +210 -0
- package/skills/global_config/bdbresilience/references/two-phase-go-gate.md +151 -0
- package/skills/global_config/bdbsaashost/SKILL.md +50 -50
- package/skills/global_config/browser-automation/SKILL.md +4 -4
- package/skills/global_config/crewai/SKILL.md +3 -2
- package/skills/global_config/debugger/SKILL.md +3 -6
- package/skills/global_config/domain-modeling/ADR-FORMAT.md +47 -0
- package/skills/global_config/domain-modeling/CONTEXT-FORMAT.md +60 -0
- package/skills/global_config/domain-modeling/SKILL.md +77 -0
- package/skills/global_config/git-advanced-workflows/SKILL.md +0 -1
- package/skills/global_config/github-actions-templates/SKILL.md +0 -2
- package/skills/global_config/google-sheets-automation/SKILL.md +2 -2
- package/skills/global_config/grill-me/SKILL.md +14 -0
- package/skills/global_config/grill-with-docs/SKILL.md +24 -0
- package/skills/global_config/grilling/SKILL.md +42 -0
- package/skills/global_config/neon-postgres/SKILL.md +3 -2
- package/skills/global_config/openwiki-skill/scripts/install_daemon.sh +55 -12
- package/skills/global_config/playwright-skill/SKILL.md +1 -1
- package/skills/global_config/posix-shell-pro/SKILL.md +0 -1
- package/skills/global_config/postgres-best-practices/SKILL.md +1 -1
- package/skills/global_config/prompt-engineering-patterns/SKILL.md +0 -1
- package/skills/global_config/rag-engineer/SKILL.md +4 -3
- package/skills/global_config/react-best-practices/SKILL.md +1 -1
- package/skills/global_config/remotion/SKILL.md +0 -1
- package/skills/global_config/seo/SKILL.md +6 -41
- package/skills/global_config/systematic-debugging/CREATION-LOG.md +1 -1
- package/skills/global_config/systematic-debugging/root-cause-tracing.md +1 -1
- package/skills/global_config/turborepo-caching/SKILL.md +0 -1
- package/skills/global_config/using-neon/SKILL.md +1 -47
- package/skills/global_config/vector-database-engineer/SKILL.md +0 -1
- package/skills/global_config/web-artifacts-builder/LICENSE.txt +1 -1
- package/skills/global_config/web-artifacts-builder/SKILL.md +1 -1
- package/skills/global_config/webapp-testing/LICENSE.txt +1 -1
- package/skills/global_config/webapp-testing/SKILL.md +1 -1
- package/.agents/skills/firecrawl/SKILL.md +0 -149
- package/.agents/skills/firecrawl/rules/install.md +0 -82
- package/.agents/skills/firecrawl/rules/security.md +0 -26
- package/.agents/skills/firecrawl-agent/SKILL.md +0 -58
- package/.agents/skills/firecrawl-build/SKILL.md +0 -39
- package/.agents/skills/firecrawl-build-interact/SKILL.md +0 -68
- package/.agents/skills/firecrawl-build-onboarding/SKILL.md +0 -103
- package/.agents/skills/firecrawl-build-onboarding/references/auth-flow.md +0 -39
- package/.agents/skills/firecrawl-build-onboarding/references/project-setup.md +0 -20
- package/.agents/skills/firecrawl-build-onboarding/references/sdk-installation.md +0 -17
- package/.agents/skills/firecrawl-build-scrape/SKILL.md +0 -69
- package/.agents/skills/firecrawl-build-search/SKILL.md +0 -69
- package/.agents/skills/firecrawl-crawl/SKILL.md +0 -59
- package/.agents/skills/firecrawl-download/SKILL.md +0 -70
- package/.agents/skills/firecrawl-interact/SKILL.md +0 -84
- package/.agents/skills/firecrawl-map/SKILL.md +0 -51
- package/.agents/skills/firecrawl-scrape/SKILL.md +0 -69
- package/.agents/skills/firecrawl-search/SKILL.md +0 -60
- package/mcps/RhinoMCP/cc-plugin/.claude/settings.json +0 -10
- package/mcps/after-effects-mcp/build/index.js +0 -840
- package/mcps/after-effects-mcp/build/scripts/applyEffect.jsx +0 -153
- package/mcps/after-effects-mcp/build/scripts/applyEffectTemplate.jsx +0 -218
- package/mcps/after-effects-mcp/build/scripts/createComposition.jsx +0 -71
- package/mcps/after-effects-mcp/build/scripts/createShapeLayer.jsx +0 -147
- package/mcps/after-effects-mcp/build/scripts/createSolidLayer.jsx +0 -114
- package/mcps/after-effects-mcp/build/scripts/createTextLayer.jsx +0 -115
- package/mcps/after-effects-mcp/build/scripts/getLayerInfo.jsx +0 -192
- package/mcps/after-effects-mcp/build/scripts/getProjectInfo.jsx +0 -90
- package/mcps/after-effects-mcp/build/scripts/listCompositions.jsx +0 -50
- package/mcps/after-effects-mcp/build/scripts/mcp-bridge-auto.jsx +0 -1773
- package/mcps/after-effects-mcp/build/scripts/setLayerProperties.jsx +0 -160
- 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 +0 -150
- package/mcps/computer-use-mcp/dist/client.js +0 -136
- package/mcps/computer-use-mcp/dist/entrypoint.d.ts +0 -16
- package/mcps/computer-use-mcp/dist/entrypoint.js +0 -26
- package/mcps/computer-use-mcp/dist/native.d.ts +0 -212
- package/mcps/computer-use-mcp/dist/native.js +0 -50
- package/mcps/computer-use-mcp/dist/server.d.ts +0 -32
- package/mcps/computer-use-mcp/dist/server.js +0 -342
- package/mcps/computer-use-mcp/dist/session.d.ts +0 -101
- package/mcps/computer-use-mcp/dist/session.js +0 -2372
- package/skills/bdbsaastraining/scripts/__pycache__/build_profile.cpython-314.pyc +0 -0
package/.agents/graph.md
CHANGED
|
@@ -45,7 +45,9 @@ the registry's own per-node allowlist would have reached for.
|
|
|
45
45
|
- The dispatcher script (`startcycle-dispatch.mjs`) extracts every
|
|
46
46
|
`--skill=` flag from the invocation text before anything else runs, then
|
|
47
47
|
validates each name resolves to a real installed skill (a `SKILL.md`
|
|
48
|
-
under
|
|
48
|
+
under any harness's global skills directory — `~/.claude/skills/<name>/`,
|
|
49
|
+
`~/.agents/skills/`, `~/.codex/skills/`, `~/.cursor/skills/`, `~/.roo/skills/`,
|
|
50
|
+
all of which the installer writes — or this project's own `skills/` tree) via
|
|
49
51
|
a read-only lookup agent. **A name that doesn't resolve escalates
|
|
50
52
|
immediately** — same "never silently fall back or guess" posture as a
|
|
51
53
|
missing registry node id. This is a fail-fast check specifically so a
|
package/.agents/nodes.json
CHANGED
|
@@ -72,7 +72,8 @@
|
|
|
72
72
|
"drizzle-orm-expert",
|
|
73
73
|
"postgres-best-practices",
|
|
74
74
|
"typescript-pro",
|
|
75
|
-
"python-pro"
|
|
75
|
+
"python-pro",
|
|
76
|
+
"bdbresilience"
|
|
76
77
|
],
|
|
77
78
|
"instructions": "Implement the backend per the plan: DDD models, type-safe schemas, API routes, Clean Architecture. Write production_artifacts/02_backend_schema.md and the code."
|
|
78
79
|
},
|
|
@@ -128,7 +129,8 @@
|
|
|
128
129
|
"seo-audit",
|
|
129
130
|
"wcag-audit-patterns",
|
|
130
131
|
"github-repo",
|
|
131
|
-
"clean-code"
|
|
132
|
+
"clean-code",
|
|
133
|
+
"bdbresilience"
|
|
132
134
|
],
|
|
133
135
|
"instructions": null
|
|
134
136
|
}
|
|
@@ -385,10 +385,17 @@ const mandatorySkillNames = [...new Set([...skillsFromFlags, ...skillsFromArgs])
|
|
|
385
385
|
if (mandatorySkillNames.length > 0) {
|
|
386
386
|
const skillCheckResult = await agent(
|
|
387
387
|
`Check whether each of these skill names resolves to an installed skill with a real SKILL.md: ${JSON.stringify(mandatorySkillNames)}. ` +
|
|
388
|
-
'
|
|
389
|
-
'
|
|
390
|
-
'
|
|
391
|
-
'
|
|
388
|
+
'The installer syncs the same skill set to every harness it detects, so check all of these global locations, not just the first: ' +
|
|
389
|
+
'~/.claude/skills/<name>/SKILL.md, ~/.agents/skills/<name>/SKILL.md, ~/.codex/skills/<name>/SKILL.md, ' +
|
|
390
|
+
'~/.cursor/skills/<name>/SKILL.md, ~/.roo/skills/<name>/SKILL.md. A skill present in any one of them counts as installed — ' +
|
|
391
|
+
'this workflow may be driven from a harness whose directory is not ~/.claude. ' +
|
|
392
|
+
'If this project has its own skills/ directory, also accept skills/<name>/SKILL.md or skills/<container>/<name>/SKILL.md. ' +
|
|
393
|
+
'This is a read-only lookup, not a reasoning task -- do not invent a path that does not exist, and never report a close match as `found`.\n\n' +
|
|
394
|
+
'For any name that does NOT resolve, list up to five installed skills whose directory names are plausible near-misses ' +
|
|
395
|
+
'(substring, obvious typo, or the same words in another order) in `suggestions`. Read the real directory listing to do this -- ' +
|
|
396
|
+
'suggest only names that actually exist on disk. `--skill=` requires an exact directory name, and a user who mistyped one ' +
|
|
397
|
+
'has no way to discover the right spelling from an error that only says "not found".\n\n' +
|
|
398
|
+
'Return only: { "found": string[], "missing": string[], "suggestions": string[] }.',
|
|
392
399
|
{
|
|
393
400
|
label: 'validate-mandatory-skills',
|
|
394
401
|
model: 'haiku',
|
|
@@ -398,15 +405,21 @@ if (mandatorySkillNames.length > 0) {
|
|
|
398
405
|
properties: {
|
|
399
406
|
found: { type: 'array', items: { type: 'string' } },
|
|
400
407
|
missing: { type: 'array', items: { type: 'string' } },
|
|
408
|
+
suggestions: { type: 'array', items: { type: 'string' } },
|
|
401
409
|
},
|
|
402
410
|
},
|
|
403
411
|
}
|
|
404
412
|
);
|
|
405
413
|
const missing = skillCheckResult?.missing ?? [];
|
|
406
414
|
if (missing.length > 0) {
|
|
415
|
+
const near = skillCheckResult?.suggestions ?? [];
|
|
407
416
|
return await escalate(
|
|
408
417
|
`--skill named skill(s) that could not be found on this machine: ${missing.join(', ')}. ` +
|
|
409
|
-
|
|
418
|
+
(near.length
|
|
419
|
+
? `Did you mean: ${near.join(', ')}? `
|
|
420
|
+
: 'No installed skill has a similar name. ') +
|
|
421
|
+
'--skill= takes the exact skill directory name; run /ask-tim to find the one you want. ' +
|
|
422
|
+
'Refusing to silently proceed without a mandated skill.'
|
|
410
423
|
);
|
|
411
424
|
}
|
|
412
425
|
mandatorySkills = skillCheckResult?.found ?? mandatorySkillNames;
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
// Dispatcher for /teamwork-preview. Turns the 9-step prompt-crafting protocol
|
|
2
|
+
// from skills/basic/teamwork-preview/SKILL.md into an actual runnable sequence.
|
|
3
|
+
//
|
|
4
|
+
// Why a script and not prose: this repo has already paid for the alternative
|
|
5
|
+
// once, recorded verbatim in skills/basic/startcycle-graph/SKILL.md --
|
|
6
|
+
//
|
|
7
|
+
// "an earlier version of this file embedded the full pipeline description in
|
|
8
|
+
// prose, and the model followed it 'in spirit' inline instead of invoking the
|
|
9
|
+
// script -- silently skipping the whole graph, with no state.json, no
|
|
10
|
+
// subagents, no Reviewer, and no quality gate ever running."
|
|
11
|
+
//
|
|
12
|
+
// A 9-step protocol with acceptance criteria and integrity modes is exactly the
|
|
13
|
+
// kind of thing that gets followed approximately. A script either runs or it
|
|
14
|
+
// does not.
|
|
15
|
+
//
|
|
16
|
+
// Runtime constraints inherited from startcycle-dispatch.mjs, all four of which
|
|
17
|
+
// this script obeys:
|
|
18
|
+
// 1. No filesystem access from the script itself. Every read and write happens
|
|
19
|
+
// inside an agent() call; the script branches on schema-validated returns.
|
|
20
|
+
// 2. No module loading. `agent`, `args` are ambient globals injected by the
|
|
21
|
+
// runtime, not imports.
|
|
22
|
+
// 3. Concurrent agents writing one file race. This script is deliberately
|
|
23
|
+
// sequential -- each step's answers reshape the next question, so there is
|
|
24
|
+
// nothing to parallelise and no fragment/merge dance is needed.
|
|
25
|
+
// 4. Prompts are the interface. An agent that returns prose instead of the
|
|
26
|
+
// declared schema breaks the branch, so every step declares one.
|
|
27
|
+
//
|
|
28
|
+
// This is NOT Antigravity's /teamwork-preview. That command is compiled into the
|
|
29
|
+
// agy binary (its own conductor/orchestrator/auditor agent types, maintained by
|
|
30
|
+
// Google). This is an independent implementation of the same idea, on a
|
|
31
|
+
// different runtime, and it will behave differently.
|
|
32
|
+
|
|
33
|
+
export const meta = {
|
|
34
|
+
name: 'teamwork-dispatch',
|
|
35
|
+
description:
|
|
36
|
+
'Interactive 9-step prompt crafting for multi-agent delegation: elicit, disambiguate, set integrity mode, draft requirements, design verification, set acceptance criteria, then assemble and validate a spec. Produces prompt_draft.md; does not build anything.',
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
// The user's answers accumulate here. Each step gets the answers so far, so a
|
|
40
|
+
// later question can be shaped by an earlier one -- which is the whole point of
|
|
41
|
+
// an interview and the reason these run sequentially rather than in parallel.
|
|
42
|
+
const spec = {
|
|
43
|
+
idea: null,
|
|
44
|
+
scale: null,
|
|
45
|
+
integrityMode: null,
|
|
46
|
+
requirements: [],
|
|
47
|
+
verification: null,
|
|
48
|
+
acceptanceCriteria: [],
|
|
49
|
+
infrastructure: null,
|
|
50
|
+
workingDirectory: null,
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
// One shared preamble. Every step is an interview turn, not a build turn: the
|
|
54
|
+
// agent asks, the human answers, nothing gets implemented. Stated once here
|
|
55
|
+
// rather than restated nine times, where the ninth copy would drift.
|
|
56
|
+
const INTERVIEW_RULE =
|
|
57
|
+
'You are conducting one step of an interactive interview. Ask the user, wait for their answer, and record it. ' +
|
|
58
|
+
'Do NOT implement anything, do NOT write project code, and do NOT proceed past your own step. ' +
|
|
59
|
+
'Finding facts is your job, not the user\'s: if a question can be answered by reading the filesystem or running a command, ' +
|
|
60
|
+
'do that yourself instead of asking. The decisions are the user\'s: put each to them and wait. ' +
|
|
61
|
+
'If the user has already answered something in an earlier step, do not ask it again -- the answers so far are given below.';
|
|
62
|
+
|
|
63
|
+
function answersSoFar() {
|
|
64
|
+
const known = Object.entries(spec).filter(([, v]) =>
|
|
65
|
+
Array.isArray(v) ? v.length > 0 : v !== null
|
|
66
|
+
);
|
|
67
|
+
if (known.length === 0) return 'Nothing settled yet -- this is the first step.';
|
|
68
|
+
return `Answers settled so far:\n${JSON.stringify(Object.fromEntries(known), null, 2)}`;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
async function step(n, title, instruction, schema, label) {
|
|
72
|
+
return await agent(
|
|
73
|
+
`${INTERVIEW_RULE}\n\n` +
|
|
74
|
+
`## Step ${n} of 9: ${title}\n\n${instruction}\n\n` +
|
|
75
|
+
`${answersSoFar()}\n\n` +
|
|
76
|
+
'Return only the declared JSON.',
|
|
77
|
+
{ label: label || `step-${n}`, schema }
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const goal = typeof args === 'string' ? args : args?.goal;
|
|
82
|
+
|
|
83
|
+
// ---------------------------------------------------------------------
|
|
84
|
+
// Steps 1-3: what is this, how big, and what is it allowed to use
|
|
85
|
+
// ---------------------------------------------------------------------
|
|
86
|
+
|
|
87
|
+
const s1 = await step(
|
|
88
|
+
1,
|
|
89
|
+
'Elicit the idea',
|
|
90
|
+
'Ask what the user wants to build, what its purpose is (production, demo, eval, or prototype), and who the audience is. ' +
|
|
91
|
+
'Condense their answer into a description of one or two sentences -- not a paragraph, and not a restatement of the question.' +
|
|
92
|
+
(goal ? `\n\nThe user already said: ${JSON.stringify(goal)}. Start from that; ask only what it leaves open.` : ''),
|
|
93
|
+
{
|
|
94
|
+
type: 'object',
|
|
95
|
+
required: ['description', 'purpose'],
|
|
96
|
+
properties: {
|
|
97
|
+
description: { type: 'string' },
|
|
98
|
+
purpose: { type: 'string', enum: ['production', 'demo', 'eval', 'prototype'] },
|
|
99
|
+
audience: { type: 'string' },
|
|
100
|
+
},
|
|
101
|
+
}
|
|
102
|
+
);
|
|
103
|
+
spec.idea = s1;
|
|
104
|
+
|
|
105
|
+
const s2 = await step(
|
|
106
|
+
2,
|
|
107
|
+
'Identify ambiguity and scale',
|
|
108
|
+
'Probe every point that has more than one reasonable interpretation -- data sources, third-party services, where the scope stops. ' +
|
|
109
|
+
'Then establish the shape of the effort:\n' +
|
|
110
|
+
'- a single self-contained fix or feature (one implementer plus repeated adversarial review)\n' +
|
|
111
|
+
'- math, formal proofs, or a massive search space (may warrant a large agent team)\n' +
|
|
112
|
+
'- a standard multi-agent build\n\n' +
|
|
113
|
+
'Ambiguity you leave unresolved here becomes a wrong assumption baked into the spec, so be thorough now rather than agreeable.',
|
|
114
|
+
{
|
|
115
|
+
type: 'object',
|
|
116
|
+
required: ['scale'],
|
|
117
|
+
properties: {
|
|
118
|
+
scale: { type: 'string', enum: ['single-focused', 'large-scale', 'standard'] },
|
|
119
|
+
ambiguitiesResolved: { type: 'array', items: { type: 'string' } },
|
|
120
|
+
},
|
|
121
|
+
}
|
|
122
|
+
);
|
|
123
|
+
spec.scale = s2;
|
|
124
|
+
|
|
125
|
+
const s3 = await step(
|
|
126
|
+
3,
|
|
127
|
+
'Determine integrity mode',
|
|
128
|
+
'Clarify the operational boundaries: may code be copied from existing open-source projects? Are pre-built libraries allowed for the core logic ' +
|
|
129
|
+
'(as opposed to the scaffolding)? May the implementer inspect the tests before writing the code?\n\n' +
|
|
130
|
+
'Map the answers: unrestricted → `development`; some shortcuts acceptable because it is a showcase → `demo`; ' +
|
|
131
|
+
'strict isolation, zero external leakage → `benchmark`.\n\n' +
|
|
132
|
+
'The last question matters more than it looks: an implementer who can read the tests first can satisfy them without solving the problem.',
|
|
133
|
+
{
|
|
134
|
+
type: 'object',
|
|
135
|
+
required: ['integrityMode'],
|
|
136
|
+
properties: {
|
|
137
|
+
integrityMode: { type: 'string', enum: ['development', 'demo', 'benchmark'] },
|
|
138
|
+
rationale: { type: 'string' },
|
|
139
|
+
},
|
|
140
|
+
}
|
|
141
|
+
);
|
|
142
|
+
spec.integrityMode = s3.integrityMode;
|
|
143
|
+
|
|
144
|
+
// ---------------------------------------------------------------------
|
|
145
|
+
// Steps 4-6: what must be true, and how anyone would know
|
|
146
|
+
// ---------------------------------------------------------------------
|
|
147
|
+
|
|
148
|
+
const s4 = await step(
|
|
149
|
+
4,
|
|
150
|
+
'Draft requirements',
|
|
151
|
+
'Write two to five requirement blocks (R1, R2, ...). Each states **what** is required, never **how** to implement it.\n\n' +
|
|
152
|
+
'Apply the litmus test to every one: would a senior engineer feel over-constrained by this? If yes, prune it. ' +
|
|
153
|
+
'A requirement that dictates implementation removes the judgement you are hiring the implementer for.',
|
|
154
|
+
{
|
|
155
|
+
type: 'object',
|
|
156
|
+
required: ['requirements'],
|
|
157
|
+
properties: {
|
|
158
|
+
requirements: {
|
|
159
|
+
type: 'array',
|
|
160
|
+
minItems: 2,
|
|
161
|
+
maxItems: 5,
|
|
162
|
+
items: {
|
|
163
|
+
type: 'object',
|
|
164
|
+
required: ['id', 'text'],
|
|
165
|
+
properties: { id: { type: 'string' }, text: { type: 'string' } },
|
|
166
|
+
},
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
}
|
|
170
|
+
);
|
|
171
|
+
spec.requirements = s4.requirements;
|
|
172
|
+
|
|
173
|
+
const s5 = await step(
|
|
174
|
+
5,
|
|
175
|
+
'Design the verification mechanism',
|
|
176
|
+
'This is the forcing function, and it is the step that decides whether the whole exercise works.\n\n' +
|
|
177
|
+
'Its job is to create an objective target that forces a real build → test → debug loop and makes premature self-certification impossible. ' +
|
|
178
|
+
'An agent that can declare its own work done, will.\n\n' +
|
|
179
|
+
'Prefer something programmatic: a unit test suite, a test runner invocation, a CLI script that asserts. ' +
|
|
180
|
+
'Only if that is genuinely infeasible, draft an explicit agent-as-judge rubric -- and say why programmatic was not possible. ' +
|
|
181
|
+
'Ask whether the user has existing test suites, schemas, or a reference implementation to hand the implementer.',
|
|
182
|
+
{
|
|
183
|
+
type: 'object',
|
|
184
|
+
required: ['mechanism', 'isProgrammatic'],
|
|
185
|
+
properties: {
|
|
186
|
+
mechanism: { type: 'string' },
|
|
187
|
+
isProgrammatic: { type: 'boolean' },
|
|
188
|
+
resources: { type: 'array', items: { type: 'string' } },
|
|
189
|
+
},
|
|
190
|
+
}
|
|
191
|
+
);
|
|
192
|
+
spec.verification = s5;
|
|
193
|
+
|
|
194
|
+
const s6 = await step(
|
|
195
|
+
6,
|
|
196
|
+
'Set acceptance criteria',
|
|
197
|
+
'Convert the verification mechanism into checkable criteria -- each one a thing that is either true or false, never a judgement call.\n\n' +
|
|
198
|
+
`Calibrate to the stated purpose (${spec.idea.purpose}): a demo must be achievable in a rapid time budget; ` +
|
|
199
|
+
'production needs real coverage, error handling and readiness; an eval needs reproducible metrics far more than polish.\n\n' +
|
|
200
|
+
'A criterion nobody can mechanically check is a wish, not a criterion.',
|
|
201
|
+
{
|
|
202
|
+
type: 'object',
|
|
203
|
+
required: ['criteria'],
|
|
204
|
+
properties: { criteria: { type: 'array', minItems: 1, items: { type: 'string' } } },
|
|
205
|
+
}
|
|
206
|
+
);
|
|
207
|
+
spec.acceptanceCriteria = s6.criteria;
|
|
208
|
+
|
|
209
|
+
// ---------------------------------------------------------------------
|
|
210
|
+
// Steps 7-8: where it runs
|
|
211
|
+
// ---------------------------------------------------------------------
|
|
212
|
+
|
|
213
|
+
const s7 = await step(
|
|
214
|
+
7,
|
|
215
|
+
'Infrastructure constraints',
|
|
216
|
+
'Only if the work reaches outside the local workspace: define the sandboxing or controlled APIs for remote file operations, ' +
|
|
217
|
+
'job launching, and outbound network calls.\n\n' +
|
|
218
|
+
'If the project stays entirely within local workspace files, say so and skip -- do not invent constraints to fill this step.',
|
|
219
|
+
{
|
|
220
|
+
type: 'object',
|
|
221
|
+
required: ['applicable'],
|
|
222
|
+
properties: { applicable: { type: 'boolean' }, constraints: { type: 'string' } },
|
|
223
|
+
}
|
|
224
|
+
);
|
|
225
|
+
spec.infrastructure = s7.applicable ? s7.constraints : null;
|
|
226
|
+
|
|
227
|
+
const s8 = await step(
|
|
228
|
+
8,
|
|
229
|
+
'Choose the working directory',
|
|
230
|
+
'Confirm where this runs. Default to a path inside the current repository if the work belongs to it, ' +
|
|
231
|
+
`otherwise \`~/teamwork_projects/<project_name>\`. Check that the path exists or can be created, and say which.`,
|
|
232
|
+
{
|
|
233
|
+
type: 'object',
|
|
234
|
+
required: ['workingDirectory'],
|
|
235
|
+
properties: { workingDirectory: { type: 'string' }, exists: { type: 'boolean' } },
|
|
236
|
+
}
|
|
237
|
+
);
|
|
238
|
+
spec.workingDirectory = s8.workingDirectory;
|
|
239
|
+
|
|
240
|
+
// ---------------------------------------------------------------------
|
|
241
|
+
// Step 9: assemble, validate, and stop for approval
|
|
242
|
+
// ---------------------------------------------------------------------
|
|
243
|
+
|
|
244
|
+
const s9 = await agent(
|
|
245
|
+
'You are assembling the final specification from a completed 9-step interview. Do NOT implement any of it.\n\n' +
|
|
246
|
+
`Write \`prompt_draft.md\` into ${JSON.stringify(spec.workingDirectory)} with this structure:\n\n` +
|
|
247
|
+
'- the one-to-two sentence project description\n' +
|
|
248
|
+
'- `Working directory: <path>`\n' +
|
|
249
|
+
'- `Integrity mode: <mode>`\n' +
|
|
250
|
+
'- a team-scaling directive, if the scale calls for one\n' +
|
|
251
|
+
'- `## Requirements` — the R1..Rn blocks\n' +
|
|
252
|
+
'- `## Verification` — the mechanism, and the resources it may use\n' +
|
|
253
|
+
'- `## Acceptance Criteria` — as markdown checkboxes (`- [ ]`)\n' +
|
|
254
|
+
(spec.infrastructure ? '- `## Infrastructure Constraints`\n' : '') +
|
|
255
|
+
'\nThen validate it against three checks and report each honestly:\n' +
|
|
256
|
+
'1. Does every acceptance criterion trace back to a stated requirement? An orphan criterion means the interview missed a requirement.\n' +
|
|
257
|
+
'2. Is every criterion mechanically checkable — true or false, no judgement call?\n' +
|
|
258
|
+
'3. Does any requirement dictate *how* rather than *what*?\n\n' +
|
|
259
|
+
'Report failures rather than quietly fixing them: a validation step that edits its own input proves nothing.\n\n' +
|
|
260
|
+
`The interview produced:\n${JSON.stringify(spec, null, 2)}`,
|
|
261
|
+
{
|
|
262
|
+
label: 'step-9-assemble',
|
|
263
|
+
schema: {
|
|
264
|
+
type: 'object',
|
|
265
|
+
required: ['draftPath', 'validationsPassed'],
|
|
266
|
+
properties: {
|
|
267
|
+
draftPath: { type: 'string' },
|
|
268
|
+
validationsPassed: { type: 'boolean' },
|
|
269
|
+
issues: { type: 'array', items: { type: 'string' } },
|
|
270
|
+
},
|
|
271
|
+
},
|
|
272
|
+
}
|
|
273
|
+
);
|
|
274
|
+
|
|
275
|
+
// Deliberately stops here. Delegation is a separate, human-approved act: the
|
|
276
|
+
// spec is the deliverable of this workflow, not a launch command. Handing an
|
|
277
|
+
// unapproved spec straight to a swarm is precisely the premature
|
|
278
|
+
// self-certification step 5 exists to prevent.
|
|
279
|
+
return {
|
|
280
|
+
phase: s9.validationsPassed ? 'ready_for_approval' : 'validation_failed',
|
|
281
|
+
draftPath: s9.draftPath,
|
|
282
|
+
issues: s9.issues ?? [],
|
|
283
|
+
integrityMode: spec.integrityMode,
|
|
284
|
+
reason: s9.validationsPassed
|
|
285
|
+
? `Spec assembled at ${s9.draftPath}. Review it, then delegate to the execution harness of your choice — this workflow deliberately does not launch anything.`
|
|
286
|
+
: `Spec assembled at ${s9.draftPath} but validation found issues; resolve them before delegating.`,
|
|
287
|
+
};
|
package/CLAUDE.md
CHANGED
|
@@ -1,97 +1,50 @@
|
|
|
1
|
-
#
|
|
1
|
+
# AOS — Claude Code
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
- `/startcycle-graph-user` — throwaway 2-4 node fan-out, nothing persistent left behind (`skills/basic/startcycle-graph-user/SKILL.md`)
|
|
3
|
+
**Read [AGENTS.md](AGENTS.md) first.** It holds every rule that applies to all
|
|
4
|
+
harnesses: the non-negotiables, the release gate, Conventional Commits, the
|
|
5
|
+
skill contract and category routing, the pipeline variants, and the delegation
|
|
6
|
+
policy. Nothing from it is repeated here — a rule that lives in two files is a
|
|
7
|
+
rule that will eventually disagree with itself.
|
|
9
8
|
|
|
10
|
-
|
|
11
|
-
Ask one question first: **do the workers need to see each other?**
|
|
12
|
-
- **No — independent sub-tasks** → subagents. Each gets a self-contained slice, returns a result, done. The normal case, and what all three pipelines above already use.
|
|
13
|
-
- **Yes — they must react to each other, or claim work dynamically from a shared list** → an agent team. Currently only `/bdbrainstorm` qualifies, where the spec demands a real debate rather than parallel monologues. 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` before reversing that.
|
|
14
|
-
- **Small task** → do it yourself. A two-file edit needs no agents.
|
|
9
|
+
This file covers only what is specific to Claude Code.
|
|
15
10
|
|
|
16
|
-
|
|
11
|
+
## The release gate is a real hook here
|
|
17
12
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
13
|
+
`.claude/hooks/go-gate.mjs` (registered in `.claude/settings.json`) mechanically
|
|
14
|
+
blocks `git push`, `npm publish`, `npm version`, and recursive `rm` unless your
|
|
15
|
+
immediately preceding message is the literal word **GO**. On this harness the
|
|
16
|
+
gate is enforced, not merely honoured — you cannot argue around it, and it works
|
|
17
|
+
whether or not this file was loaded. See AGENTS.md for the policy layer and the
|
|
18
|
+
three clarifications that have caused real incidents.
|
|
23
19
|
|
|
24
|
-
|
|
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.
|
|
20
|
+
## Delegation subagents available on this harness
|
|
29
21
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
22
|
+
These ship as Claude Code plugins and are the preferred path over shelling out
|
|
23
|
+
to the underlying CLI, because they already handle wrapper flags, cost
|
|
24
|
+
discipline, and the digest contract:
|
|
33
25
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
`--timeout 15m` for anything non-trivial. A short timeout does not read as
|
|
38
|
-
"slow", it reads as "broken".
|
|
26
|
+
- `antigravity:antigravity-delegate` — agy / Gemini
|
|
27
|
+
- `opencode:opencode-rescue`
|
|
28
|
+
- `codex:codex-rescue`
|
|
39
29
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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:
|
|
30
|
+
On any other harness, calling the CLI directly is the only path. The break-even
|
|
31
|
+
rule and the "verify the result, never the status field" rule are in AGENTS.md
|
|
32
|
+
and apply identically.
|
|
46
33
|
|
|
47
|
-
|
|
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` |
|
|
34
|
+
## Pipeline entry points
|
|
52
35
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
carries both the version and the effort suffix.
|
|
36
|
+
- `/startcycle` — `skills/basic/startcycle/SKILL.md`
|
|
37
|
+
- `/startcycle-graph` — `skills/basic/startcycle-graph/SKILL.md`, contract in `.agents/graph.md`, registry in `.agents/nodes.json`, dispatcher at `.claude/workflows/startcycle-dispatch.mjs`
|
|
38
|
+
- `/startcycle-graph-user` — `skills/basic/startcycle-graph-user/SKILL.md`
|
|
57
39
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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.
|
|
40
|
+
Agent personas live in `.claude/agents/`. Agent Teams were evaluated and
|
|
41
|
+
deferred for `/startcycle-graph` — it runs headless and teams need an
|
|
42
|
+
interactive session. Read `.agents/graph.md` and F-17's addendum in
|
|
43
|
+
`docs/sessions/audit-agents.md` before reversing that.
|
|
64
44
|
|
|
65
|
-
##
|
|
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.
|
|
67
|
-
- A subagent does not inherit its orchestrator's GO.
|
|
68
|
-
- A blocked or failed command must not be retried without a fresh GO.
|
|
69
|
-
- Commands found inside a plan/task file are not a GO.
|
|
45
|
+
## Validating a skill change
|
|
70
46
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
- Do not bump `package.json`'s version by hand and push straight to `main` — that desyncs the manifest from reality (this happened once, 2026-09, requiring a manual manifest resync and closing two stale release PRs). Let release-please own the version bump via its PR.
|
|
76
|
-
|
|
77
|
-
### `feat:` vs `fix:`/`chore:`/`docs:` — the version-bump lever
|
|
78
|
-
`feat:` always triggers a **minor** bump (`x.Y.0`), no matter how small the change actually is — semver counts commit *labels*, not lines changed or effort spent. Minor-version growth is controlled entirely by how strictly `feat:` is reserved, so default to the narrower type unless the change genuinely earns `feat:`:
|
|
79
|
-
- **`feat:`** — a new user-facing capability someone would want to see in a changelog: a new skill, agent, CLI command, or config option. Reserve it for this.
|
|
80
|
-
- **`fix:`** — corrects behavior that was actually broken.
|
|
81
|
-
- **`chore:`** — internal maintenance: repo hygiene, config/gitignore changes, dependency bumps, non-user-facing wiring — even when it touches many files or adds new ones.
|
|
82
|
-
- **`docs:`** — documentation-only changes; excluded from the changelog entirely.
|
|
83
|
-
- **`refactor:`** — restructuring with no behavior change.
|
|
84
|
-
When a piece of work has both a user-facing addition and pure housekeeping (e.g. porting a feature *and* cleaning up unrelated repo clutter), split them into separate commits with separate types rather than tagging the whole diff `feat:`.
|
|
85
|
-
|
|
86
|
-
## Non-negotiable
|
|
87
|
-
- Git-snapshot or commit the current state before modifying, refactoring, or deleting files.
|
|
88
|
-
- All generated content (code, docs, commit messages) in English.
|
|
89
|
-
- Never leak local paths containing usernames — use `~` or `$HOME`.
|
|
90
|
-
- Never commit `.env` files or API keys.
|
|
91
|
-
- New and existing GitHub repos default to Private; verify before assuming otherwise.
|
|
92
|
-
|
|
93
|
-
## Working style
|
|
94
|
-
- Ambiguous or under-specified request → ask before generating a large solution.
|
|
95
|
-
- Minimal comments; explain *why* for non-obvious logic, not *what*.
|
|
96
|
-
- Don't invent APIs, libraries, or CLI commands — verify against docs or code first.
|
|
97
|
-
- Before redeploying or reconfiguring a cloud service: check whether an existing API/CLI/MCP tool can do it first.
|
|
47
|
+
```bash
|
|
48
|
+
npm run validate # the skill contract, as CI enforces it
|
|
49
|
+
npm test # selftest + validate
|
|
50
|
+
```
|
package/CODEX.md
CHANGED
|
@@ -1,26 +1,45 @@
|
|
|
1
|
-
#
|
|
1
|
+
# AOS — Codex CLI & ChatGPT Codex
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**Read [AGENTS.md](AGENTS.md) first.** It holds every rule that applies to all
|
|
4
|
+
harnesses: the non-negotiables, the release gate, Conventional Commits, the
|
|
5
|
+
skill contract and category routing, the pipeline variants, and the delegation
|
|
6
|
+
policy. Nothing from it is repeated here.
|
|
4
7
|
|
|
5
|
-
|
|
8
|
+
This file covers only installation and what Codex agents get.
|
|
6
9
|
|
|
7
|
-
|
|
10
|
+
## Installation
|
|
11
|
+
|
|
12
|
+
Via the Codex CLI marketplace:
|
|
8
13
|
|
|
9
14
|
```bash
|
|
10
15
|
codex plugin marketplace add hybridlabor-api/bdb-dev-optimized-agent-skills
|
|
11
16
|
codex plugin add bdb-dev-optimized-agent-skills
|
|
12
17
|
```
|
|
13
18
|
|
|
14
|
-
Or
|
|
19
|
+
Or universally, across every AI environment detected on the machine:
|
|
15
20
|
|
|
16
21
|
```bash
|
|
17
|
-
npx @hybridlabor-api/
|
|
22
|
+
npx @hybridlabor-api/aos@latest -y
|
|
18
23
|
```
|
|
19
24
|
|
|
20
|
-
|
|
25
|
+
Skills install to `~/.codex/skills/` alongside the other harness directories.
|
|
26
|
+
|
|
27
|
+
## Nothing enforces the gate here — you are the enforcement
|
|
28
|
+
|
|
29
|
+
`.claude/hooks/go-gate.mjs` is a Claude Code hook and does not run under Codex.
|
|
30
|
+
Nothing is mechanically blocked for you.
|
|
31
|
+
|
|
32
|
+
So the full rule in AGENTS.md applies here in its entirety, not just its
|
|
33
|
+
hook-enforced subset: when the user asks for a plan, review, audit or
|
|
34
|
+
multi-step action, you are read-only until they answer with the literal **GO**
|
|
35
|
+
— including file writes and `git commit`. There is no backstop on this harness,
|
|
36
|
+
which makes this where the rule matters most, not least.
|
|
37
|
+
|
|
38
|
+
## What ships
|
|
21
39
|
|
|
22
|
-
-
|
|
23
|
-
-
|
|
24
|
-
-
|
|
25
|
-
-
|
|
26
|
-
-
|
|
40
|
+
- **memB Engine** — offline-first, zero-compute long-term memory vault.
|
|
41
|
+
- **OpenWiki** — autonomous project documentation and release-note builder.
|
|
42
|
+
- **Heimdall TokenSaver** — context-window compression.
|
|
43
|
+
- **CAD & Hardware Studio** — Text-to-CAD (STEP, STL, 3MF), URDF/SRDF robotics, DXF, G-code slicing.
|
|
44
|
+
- **Video & Media Production** — OpenMontage, Palmier Pro, local ComfyUI rendering pipelines.
|
|
45
|
+
- **Build pipelines** — `/startcycle`, `/startcycle-graph`, `/startcycle-graph-user`. Agent personas are portable; the dispatcher script is Claude-Code-specific, so on Codex the invoker drives each step itself, exactly as `/startcycle` describes.
|