@hybridlabor-api/aos 4.2.0-beta.0 → 4.2.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/THIRD_PARTY_NOTICES.md +50 -0
- package/docs/skills_table.md +1 -0
- package/installer.js +15 -0
- package/package.json +1 -1
- package/skills/basic/bdbmediastorm/SKILL.md +7 -5
- 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/global_config/ask-tim/SKILL.md +73 -6
- 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/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/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/openwiki-skill/scripts/install_daemon.sh +55 -12
- 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/THIRD_PARTY_NOTICES.md
CHANGED
|
@@ -127,6 +127,56 @@ SOFTWARE.
|
|
|
127
127
|
|
|
128
128
|
---
|
|
129
129
|
|
|
130
|
+
## mattpocock/skills
|
|
131
|
+
|
|
132
|
+
<https://github.com/mattpocock/skills> — MIT.
|
|
133
|
+
|
|
134
|
+
The grilling family and the domain-modeling discipline it composes with:
|
|
135
|
+
|
|
136
|
+
| In AOS | Upstream |
|
|
137
|
+
|---|---|
|
|
138
|
+
| `skills/global_config/grilling/` | `skills/productivity/grilling/` |
|
|
139
|
+
| `skills/global_config/grill-me/` | `skills/productivity/grill-me/` |
|
|
140
|
+
| `skills/global_config/grill-with-docs/` | `skills/engineering/grill-with-docs/` |
|
|
141
|
+
| `skills/global_config/domain-modeling/` | `skills/engineering/domain-modeling/` (incl. `ADR-FORMAT.md`, `CONTEXT-FORMAT.md`) |
|
|
142
|
+
|
|
143
|
+
`grilling`'s interview protocol and `domain-modeling` are carried over
|
|
144
|
+
essentially verbatim; `grill-me` and `grill-with-docs` are rewritten to name AOS's
|
|
145
|
+
own pipelines in their hand-off sections, but keep upstream's composition — both
|
|
146
|
+
are thin wrappers that invoke the primitive rather than restating it. Upstream's
|
|
147
|
+
`agents/openai.yaml` under `domain-modeling` is harness-specific to that project
|
|
148
|
+
and was not carried over.
|
|
149
|
+
|
|
150
|
+
`skills/global_config/ask-tim/` is derived from upstream's `ask-matt` router. It
|
|
151
|
+
is not a copy: the flow it maps is AOS's own, since most of the skills on
|
|
152
|
+
upstream's main flow have no AOS equivalent.
|
|
153
|
+
|
|
154
|
+
```
|
|
155
|
+
MIT License
|
|
156
|
+
|
|
157
|
+
Copyright (c) 2026 Matt Pocock
|
|
158
|
+
|
|
159
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
160
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
161
|
+
in the Software without restriction, including without limitation the rights
|
|
162
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
163
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
164
|
+
furnished to do so, subject to the following conditions:
|
|
165
|
+
|
|
166
|
+
The above copyright notice and this permission notice shall be included in all
|
|
167
|
+
copies or substantial portions of the Software.
|
|
168
|
+
|
|
169
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
170
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
171
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
172
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
173
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
174
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
175
|
+
SOFTWARE.
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
130
180
|
## Note on `mcps/`
|
|
131
181
|
|
|
132
182
|
Sub-repositories vendored under `mcps/` carry their own `LICENSE` files in
|
package/docs/skills_table.md
CHANGED
|
@@ -48,6 +48,7 @@
|
|
|
48
48
|
| `subagent-driven-development` | Use when executing implementation plans with independent tasks in the current session |
|
|
49
49
|
| `tdd-workflow` | Test-Driven Development workflow principles. RED-GREEN-REFACTOR cycle. |
|
|
50
50
|
| `tmux` | Expert tmux session, window, and pane management for terminal multiplexing, persistent remote workflows, and shell scripting automation. |
|
|
51
|
+
| `teamwork-preview` | Interactive 9-step prompt crafting and delegation protocol for autonomous multi-agent teams across harnesses. |
|
|
51
52
|
|
|
52
53
|
#### 🎨 Frontend & UI/UX
|
|
53
54
|
| Skill Name | Description |
|
package/installer.js
CHANGED
|
@@ -2554,6 +2554,21 @@ function injectHarnessRules() {
|
|
|
2554
2554
|
log.step(`Installed GEMINI.md to ${path.join(geminiDir, 'GEMINI.md')}`);
|
|
2555
2555
|
}, 'The harness injection below still runs.');
|
|
2556
2556
|
|
|
2557
|
+
// Dispatcher scripts must land in ~/.claude/workflows/, because that is
|
|
2558
|
+
// where the skills that route to them look: startcycle-graph's SKILL.md
|
|
2559
|
+
// and teamwork-preview's both tell the model to call `Workflow` with
|
|
2560
|
+
// scriptPath `$HOME/.claude/workflows/<name>.mjs`. installProjectHarness()
|
|
2561
|
+
// copies them into a *project*, which only helps a project that opted into
|
|
2562
|
+
// the local harness -- on a plain global install those paths did not exist
|
|
2563
|
+
// at all, so the skill pointed at a file that was never delivered.
|
|
2564
|
+
installStep(`install dispatcher workflows to ${path.join(homeDir, '.claude', 'workflows')}`, () => {
|
|
2565
|
+
const workflowsSrc = path.join(srcDir, '.claude', 'workflows');
|
|
2566
|
+
if (fs.existsSync(workflowsSrc)) {
|
|
2567
|
+
copyDirRecursiveSync(workflowsSrc, path.join(homeDir, '.claude', 'workflows'));
|
|
2568
|
+
log.step(`Installed dispatcher workflows to ${path.join(homeDir, '.claude', 'workflows')}`);
|
|
2569
|
+
}
|
|
2570
|
+
}, '/startcycle-graph and /teamwork-preview fall back to their prose protocols.');
|
|
2571
|
+
|
|
2557
2572
|
const startcycleWorkflowSrc = path.join(srcDir, '.agents', 'workflows', 'startcycle.md');
|
|
2558
2573
|
const sources = installStep('read the global rule sources', () => ({
|
|
2559
2574
|
globalRules: fs.readFileSync(geminiMdSrc, 'utf8'),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hybridlabor-api/aos",
|
|
3
|
-
"version": "4.2.0
|
|
3
|
+
"version": "4.2.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
|
"bin": {
|
|
@@ -26,9 +26,11 @@ Ideation must never be performed in isolation. Spawn specialized subagents to an
|
|
|
26
26
|
|
|
27
27
|
---
|
|
28
28
|
|
|
29
|
-
## 2. Interactive
|
|
29
|
+
## 2. Interactive Technical Interview
|
|
30
30
|
|
|
31
|
-
Before drafting signal flow diagrams or system configs,
|
|
31
|
+
Before drafting signal flow diagrams or system configs, **invoke the `grill-with-docs` skill** (or `grill-me` when there is no working directory) and run it to completion. Those skills hold the interview protocol — design tree, frontier rounds, numbered questions each with a recommended answer — and it is not restated here.
|
|
32
|
+
|
|
33
|
+
What this domain adds to that protocol: deeply challenge the user's technical assumptions and hardware readiness. The frontier questions for a show-control build are:
|
|
32
34
|
|
|
33
35
|
* **Signal & Network Protocols:**
|
|
34
36
|
- What protocols govern data movement? (OSC, Art-Net, sACN, MIDI, SMPTE Timecode, NDI)?
|
|
@@ -48,7 +50,7 @@ Before drafting signal flow diagrams or system configs, execute a mandatory `/gr
|
|
|
48
50
|
|
|
49
51
|
## 3. Target Directory & Scaffolding
|
|
50
52
|
|
|
51
|
-
After aligning on system architecture through the
|
|
53
|
+
After aligning on system architecture through the grilling interview:
|
|
52
54
|
1. **Confirm Output Directory:** Ask the user: *"In which project directory should the output show-control plan and architecture files be stored?"*
|
|
53
55
|
2. **Scaffold Foundational Files:** Once confirmed, write the core show specification files (`agent.md`, `signal-flow.md`, `network-patch.json`, `failover-matrix.md`).
|
|
54
56
|
|
|
@@ -94,7 +96,7 @@ BDB MediaStorm is the master ideation and brainstorming engine for live show-con
|
|
|
94
96
|
- **Exclude:** Do not use for generating video timelines or 3D meshes.
|
|
95
97
|
|
|
96
98
|
## Core Process
|
|
97
|
-
1. Run
|
|
99
|
+
1. Run `grill-with-docs` (or `grill-me`) to challenge assumptions about protocols, hardware, and bandwidth.
|
|
98
100
|
2. Scaffold foundational files (`agent.md`, `signal-flow.md`, `network-patch.json`).
|
|
99
101
|
3. Generate a strict Mermaid.js signal flow diagram mapping all protocols.
|
|
100
102
|
4. Document a main/backup redundancy and failover matrix.
|
|
@@ -115,7 +117,7 @@ BDB MediaStorm is the master ideation and brainstorming engine for live show-con
|
|
|
115
117
|
|
|
116
118
|
## Verification
|
|
117
119
|
|
|
118
|
-
- [ ]
|
|
120
|
+
- [ ] The grilling interview was completed with answers regarding protocols and bandwidth.
|
|
119
121
|
- [ ] Output includes a Mermaid.js signal flow diagram.
|
|
120
122
|
- [ ] A dedicated failover/blackout mechanism is documented.
|
|
121
123
|
|
|
@@ -88,7 +88,9 @@ Run only the streams the goal actually needs. A plain backend feature does not n
|
|
|
88
88
|
> does the work `startcycle-graph`'s script does for you: extract the
|
|
89
89
|
> `--skill=` flag(s) from the invocation text before anything else runs,
|
|
90
90
|
> confirm each name resolves to a real `SKILL.md` (under
|
|
91
|
-
>
|
|
91
|
+
> any harness's global skills directory — `~/.claude/skills/<name>/`,
|
|
92
|
+
> `~/.agents/skills/`, `~/.codex/skills/`, `~/.cursor/skills/` or `~/.roo/skills/`
|
|
93
|
+
> — or this project's own `skills/` tree) — stop
|
|
92
94
|
> and tell the user if one doesn't, don't silently proceed without it —
|
|
93
95
|
> note the validated list in `00_execution_plan.md`, and include it as a
|
|
94
96
|
> **hard requirement, not a suggestion** in each Build stream's dispatch
|
|
@@ -56,8 +56,24 @@ rather than guessing one.
|
|
|
56
56
|
(repeatable, quote a name with spaces) forces that skill into this run as a
|
|
57
57
|
hard requirement for the build nodes, validated to exist before anything
|
|
58
58
|
else runs — this is how you make the pipeline use your own private skill
|
|
59
|
-
that isn't part of `.agents/nodes.json`'s registry.
|
|
60
|
-
|
|
59
|
+
that isn't part of `.agents/nodes.json`'s registry.
|
|
60
|
+
|
|
61
|
+
`<name>` is the **exact skill directory name**, not a description — `ui-component`,
|
|
62
|
+
not "the UI one". Two ways to find it without leaving the terminal:
|
|
63
|
+
|
|
64
|
+
- `/ask-tim` — the routing skill; start there when you know the *job* but not the name
|
|
65
|
+
- list the installed skills directly, if you half-remember the spelling. The installer
|
|
66
|
+
syncs the same set to every harness it detects, so use whichever path is yours:
|
|
67
|
+
`~/.claude/skills`, `~/.agents/skills`, `~/.codex/skills`, `~/.cursor/skills`, or
|
|
68
|
+
`~/.roo/skills`. `ls ~/.agents/skills` is the safest guess on an unknown machine —
|
|
69
|
+
that one is written on every install regardless of harness.
|
|
70
|
+
|
|
71
|
+
A name that does not resolve halts the run before any agent works, and the
|
|
72
|
+
error now lists installed near-misses rather than only saying "not found".
|
|
73
|
+
That is deliberate: silently running without a skill you explicitly demanded
|
|
74
|
+
is worse than stopping.
|
|
75
|
+
|
|
76
|
+
See [`.agents/graph.md`](../../../.agents/graph.md)'s "Mandatory Skill
|
|
61
77
|
Injection" section for the full mechanics; nothing about it needs handling
|
|
62
78
|
in this router file, since `args` is passed through as raw text either way.
|
|
63
79
|
|
|
@@ -36,7 +36,9 @@ with spaces) forces that skill into this run as a hard requirement — for a
|
|
|
36
36
|
private skill of the user's own this throwaway graph would otherwise never
|
|
37
37
|
know to reach for. Extract any `--skill=` flag(s) from the invocation text
|
|
38
38
|
before step 1, confirm each name resolves to a real `SKILL.md` (under
|
|
39
|
-
|
|
39
|
+
any harness's global skills directory — `~/.claude/skills/<name>/`,
|
|
40
|
+
`~/.agents/skills/`, `~/.codex/skills/`, `~/.cursor/skills/`, `~/.roo/skills/` —
|
|
41
|
+
or this project's own `skills/` tree if it has
|
|
40
42
|
one) — stop and tell the user if one doesn't, never silently proceed
|
|
41
43
|
without it — and include it as a **hard requirement, not a suggestion** in
|
|
42
44
|
the Plan node's and every Worker node's prompt. The Review node checks the
|