agents-united 0.6.0 → 0.7.1
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/README.md +30 -8
- package/dist/cli.js +71 -3
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
- package/registry/agents/orchestrator-business.md +17 -0
- package/registry/agents/orchestrator-design.md +17 -0
- package/registry/agents/orchestrator-engineering.md +17 -0
- package/registry/agents/orchestrator-marketing.md +33 -9
- package/registry/agents/orchestrator-research.md +17 -0
- package/registry/agents/orchestrator-security.md +17 -0
- package/registry/agents/orchestrator-system-architecture.md +17 -0
- package/registry/agents/subagent-compliance-grc-specialist.md +21 -0
- package/registry/agents/subagent-frontend-architect.md +21 -0
- package/registry/agents/subagent-marketing-campaign-specialist.md +21 -0
- package/registry/agents/subagent-marketing-content-strategist.md +21 -0
- package/registry/agents/subagent-marketing-conversion-specialist.md +21 -0
- package/registry/agents/subagent-marketing-creative-designer.md +21 -0
- package/registry/agents/subagent-marketing-growth-strategist.md +21 -0
- package/registry/agents/subagent-qa-automation-lead.md +21 -0
- package/registry/agents/subagent-seo-specialist.md +21 -0
- package/registry/bundles.json +174 -31
- package/registry/workflows/workflow-agency-ad-creative-sprint.md +6 -0
- package/registry/workflows/workflow-agency-brand-design-system.md +6 -0
- package/registry/workflows/workflow-agency-client-pitch-proposal.md +7 -1
- package/registry/workflows/workflow-agency-cro-funnel-teardown.md +6 -0
- package/registry/workflows/workflow-agency-full-campaign.md +7 -1
- package/registry/workflows/workflow-agency-seo-content-engine.md +6 -0
package/README.md
CHANGED
|
@@ -119,7 +119,7 @@ Agents United provides **24 curated bundles**, **46 specialized agents** (8 Orch
|
|
|
119
119
|
| **🔒 Security Operations** | `security-operations` | — | `orchestrator-security` |
|
|
120
120
|
| **🔬 Deep Technical Research** | `deep-research` | — | `orchestrator-research` |
|
|
121
121
|
| **💼 Business Strategy & Economics** | `business-strategy` | — | `orchestrator-business` |
|
|
122
|
-
| **🏢 Organization Bundles (Experimental)** | `digital-agency`
|
|
122
|
+
| **🏢 Organization Bundles (Experimental)** | `digital-agency` ⚡ | *(Cross-functional composite)* | `orchestrator-marketing` (Campaign Director / Chris) |
|
|
123
123
|
|
|
124
124
|
<details>
|
|
125
125
|
<summary><strong>🔍 Click to expand full Department & Agent Roster Breakdown</strong></summary>
|
|
@@ -173,7 +173,7 @@ Agents United provides **24 curated bundles**, **46 specialized agents** (8 Orch
|
|
|
173
173
|
- **Essentials Base (`business-strategy`)**: `subagent-business-panel-experts`
|
|
174
174
|
|
|
175
175
|
#### 🏢 Organization Bundles (Tier 2 / Experimental)
|
|
176
|
-
- **Digital Product Agency (`digital-agency`
|
|
176
|
+
- **Digital Product Agency (`digital-agency` ⚡)**: 10-agent cross-functional AstrolabsAI team (Chris / Ava / Kaan / Jamileh / Yavuz / Jale + engineering, QA & compliance) with Tri-Tier MCP execution modes and the Subagent-First Planning Dialogue Loop (ADR 0014).
|
|
177
177
|
|
|
178
178
|
</details>
|
|
179
179
|
|
|
@@ -415,6 +415,23 @@ Organization bundles operate across three dynamic execution envelopes:
|
|
|
415
415
|
> [!TIP]
|
|
416
416
|
> **Zero Friction Onboarding**: You can start working with your Lead Orchestrator immediately using native tools. If your task needs live integrations (e.g. *"Set up Playwright browser testing"*), your Orchestrator will inspect your OS, configure the exact MCP server, test the connection, and activate it interactively!
|
|
417
417
|
|
|
418
|
+
### Subagent-First Planning Dialogue Loop (ADR 0014)
|
|
419
|
+
|
|
420
|
+
Organization bundles can opt into a **delegation-first planning protocol**: the Lead Orchestrator plans *with the user* (Socratic grilling via `/grill-me` / `/grill-with-docs`) and *with the team* — spawning up to 2 **Planning Sidekicks** into the planning conversation, running a bounded **Specialist Council** (every relevant specialist returns a ≤150-word Scope-of-Work Statement), and presenting a **Delegation Map** before any execution starts. Inter-specialist discussion is bounded by a declarative **Consultation Budget**, and each specialist's per-invocation run is hard-capped via Cline `maxIterations`:
|
|
421
|
+
|
|
422
|
+
| Budget cap | Default | Meaning |
|
|
423
|
+
| :--- | :--- | :--- |
|
|
424
|
+
| `maxPlanningRounds` | 2 | Orchestrator ↔ council cycles per task |
|
|
425
|
+
| `maxPeerExchangesPerPair` | 2 | Directed questions per specialist pair |
|
|
426
|
+
| `summaryWordCap` | 150 | Words per Scope-of-Work Statement |
|
|
427
|
+
| `maxIterations` | 8 | Per-invocation iteration cap (`.cline/agents/*.yml`) |
|
|
428
|
+
|
|
429
|
+
Enabled for `digital-agency`. See [ADR 0014](./docs/adr/0014-subagent-first-planning-loop.md) and [Plan 012](./plans/012-subagent-first-planning-loop.md).
|
|
430
|
+
|
|
431
|
+
### Planner-Orchestrator Mode (ADR 0015)
|
|
432
|
+
|
|
433
|
+
**Tier-1 Domain Bundles** operate in **Planner-Orchestrator Mode**: the orchestrator plans **solo** with the user — Socratic alignment via `/grill-me` / `/grill-with-docs`, direct skill consultation, no specialist spawns during planning. A **Planning Aid Boundary** allows provisional estimates during planning but defers concrete deliverables to the delegation map. Execution is then delegated to `subagent_*` tools via a solo-composed **Delegation Map**. This mode is the default for all 30 domain bundles (engineering, design, security, business, research, architecture, marketing); `digital-agency` and future Organization Bundles remain in Subagent-First Mode. See [ADR 0015](./docs/adr/0015-planner-orchestrator-mode-for-domain-bundles.md) and [Plan 013](./plans/013-planner-orchestrator-mode-for-domain-bundles.md).
|
|
434
|
+
|
|
418
435
|
---
|
|
419
436
|
## 🌐 One Library, Every Assistant
|
|
420
437
|
|
|
@@ -541,20 +558,25 @@ When contributing new skills or adapting external skills:
|
|
|
541
558
|
3. **Deterministic Verifications**: Include clear validation commands, error recovery procedures, and code exemplars.
|
|
542
559
|
|
|
543
560
|
### 6. Pull Request (PR) Workflow
|
|
544
|
-
|
|
561
|
+
|
|
562
|
+
We use a two-line branch model — `main` is the release line, `dev` is the **protected** integration line. Full walkthrough: [`docs/workflow-guide.md`](docs/workflow-guide.md).
|
|
563
|
+
|
|
564
|
+
1. **Branch from a fresh `dev`** (direct pushes to `dev` are rejected — changes arrive via PR only):
|
|
545
565
|
```bash
|
|
546
|
-
git
|
|
547
|
-
git
|
|
548
|
-
git checkout -b feat/your-feature-name
|
|
566
|
+
git switch dev && git pull origin dev
|
|
567
|
+
git switch -c feat/your-feature-name # or fix/, docs/, ci/
|
|
549
568
|
```
|
|
550
569
|
2. **Follow TDD (Red-Green-Refactor)**: Author failing unit/E2E tests in `tests/` before implementing code.
|
|
551
570
|
3. **Run Pre-PR Verification**:
|
|
552
571
|
```bash
|
|
572
|
+
npm run typecheck && npm test
|
|
553
573
|
npm run build
|
|
554
|
-
npm test
|
|
555
574
|
git diff --cached # Audit staged files for accidental secrets or temp files
|
|
556
575
|
```
|
|
557
|
-
4. **
|
|
576
|
+
4. **Push early & open PR #1 → base `dev`**: CI runs automatically (typecheck, build, full Vitest suite on `ubuntu-latest`). The PR can only merge once the required **`test`** status check passes.
|
|
577
|
+
5. **Release via PR #2 → base `main`** (compare `dev`): merging triggers **semantic-release** — `feat:` bumps the minor version, `fix:` the patch — then the sync workflow auto-merges `main` back into `dev`.
|
|
578
|
+
|
|
579
|
+
> Commit messages follow **Conventional Commits**: `feat:` / `fix:` drive releases; `docs:`, `ci:`, `chore:`, `refactor:`, `test:`, `perf:` accumulate without releasing. Emergency production hotfixes branch from `main` and PR directly into it.
|
|
558
580
|
|
|
559
581
|
---
|
|
560
582
|
|
package/dist/cli.js
CHANGED
|
@@ -41,6 +41,7 @@ var RegistryResolver = class {
|
|
|
41
41
|
throw new Error(`Registry bundles.json not found at ${manifestPath}`);
|
|
42
42
|
}
|
|
43
43
|
this.bundlesManifest = await fs.readJson(manifestPath);
|
|
44
|
+
this.validateBundles(this.bundlesManifest);
|
|
44
45
|
return this.bundlesManifest;
|
|
45
46
|
}
|
|
46
47
|
async getBundle(bundleName) {
|
|
@@ -193,6 +194,35 @@ var RegistryResolver = class {
|
|
|
193
194
|
workflows: matchedWorkflows
|
|
194
195
|
};
|
|
195
196
|
}
|
|
197
|
+
/**
|
|
198
|
+
* ADR 0015 — fail-fast validation of planningLoop configuration.
|
|
199
|
+
* @throws if any bundle violates planner-orchestrator invariants.
|
|
200
|
+
*/
|
|
201
|
+
validateBundles(manifest) {
|
|
202
|
+
const validModes = ["subagent-first", "planner-orchestrator"];
|
|
203
|
+
for (const [name, bundle] of Object.entries(manifest.bundles)) {
|
|
204
|
+
const pl = bundle.planningLoop;
|
|
205
|
+
if (!pl || !pl.enabled) continue;
|
|
206
|
+
const mode = pl.mode ?? "subagent-first";
|
|
207
|
+
if (!validModes.includes(mode)) {
|
|
208
|
+
throw new Error(
|
|
209
|
+
`Registry validation error: bundle "${name}" has unknown planningLoop.mode "${mode}". Valid modes: ${validModes.join(", ")}`
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
if (mode === "planner-orchestrator") {
|
|
213
|
+
if (pl.budget) {
|
|
214
|
+
throw new Error(
|
|
215
|
+
`Registry validation error: bundle "${name}" has planningLoop.mode "planner-orchestrator" but also declares a Consultation Budget (budget). Planner-orchestrator bundles must not declare budget.`
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
if (pl.sidekicks) {
|
|
219
|
+
throw new Error(
|
|
220
|
+
`Registry validation error: bundle "${name}" has planningLoop.mode "planner-orchestrator" but also declares sidekicks. Planner-orchestrator bundles must not declare sidekicks.`
|
|
221
|
+
);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
196
226
|
};
|
|
197
227
|
|
|
198
228
|
// src/core/installer.ts
|
|
@@ -374,7 +404,7 @@ complete the role in the main session.`;
|
|
|
374
404
|
* canonical agent markdown content. Cline 3.x consumes YAML files with
|
|
375
405
|
* frontmatter (name, description) and treats the body as the agent system prompt.
|
|
376
406
|
*/
|
|
377
|
-
static renderConfiguredAgent(canonicalContent, canonicalRelPath) {
|
|
407
|
+
static renderConfiguredAgent(canonicalContent, canonicalRelPath, defaultMaxIterations) {
|
|
378
408
|
const match = canonicalContent.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);
|
|
379
409
|
if (!match) {
|
|
380
410
|
throw new Error(`Canonical agent ${canonicalRelPath} is missing YAML frontmatter.`);
|
|
@@ -393,6 +423,11 @@ complete the role in the main session.`;
|
|
|
393
423
|
if (typeof parsed.description === "string" && parsed.description.trim().length > 0) {
|
|
394
424
|
cleanFrontmatter.description = parsed.description.trim();
|
|
395
425
|
}
|
|
426
|
+
if (typeof parsed.maxIterations === "number") {
|
|
427
|
+
cleanFrontmatter.maxIterations = parsed.maxIterations;
|
|
428
|
+
} else if (typeof defaultMaxIterations === "number") {
|
|
429
|
+
cleanFrontmatter.maxIterations = defaultMaxIterations;
|
|
430
|
+
}
|
|
396
431
|
const frontmatterStr = yaml.stringify(cleanFrontmatter).trim();
|
|
397
432
|
const bodyStr = match[2].trim();
|
|
398
433
|
return `---
|
|
@@ -518,6 +553,19 @@ ${bodyStr}
|
|
|
518
553
|
fallbacks: ["adaptive-session", "single-orchestrator"]
|
|
519
554
|
}
|
|
520
555
|
};
|
|
556
|
+
if (bundle.planningLoop?.enabled) {
|
|
557
|
+
const mode = bundle.planningLoop.mode ?? "subagent-first";
|
|
558
|
+
manifest.planningLoop = {
|
|
559
|
+
enabled: true,
|
|
560
|
+
mode,
|
|
561
|
+
// Only emit budget/sidekicks for subagent-first bundles
|
|
562
|
+
...mode === "subagent-first" && bundle.planningLoop.budget ? { budget: bundle.planningLoop.budget } : {},
|
|
563
|
+
...mode === "subagent-first" && bundle.planningLoop.sidekicks ? { sidekicks: bundle.planningLoop.sidekicks } : {}
|
|
564
|
+
};
|
|
565
|
+
if (bundle.personaAliases && Object.keys(bundle.personaAliases).length > 0) {
|
|
566
|
+
manifest.personas = Object.entries(bundle.personaAliases).map(([persona, role]) => ({ persona, role }));
|
|
567
|
+
}
|
|
568
|
+
}
|
|
521
569
|
return yaml.stringify(manifest);
|
|
522
570
|
}
|
|
523
571
|
/**
|
|
@@ -539,6 +587,20 @@ ${bodyStr}
|
|
|
539
587
|
const addonSection = addons.length > 0 ? `
|
|
540
588
|
### Recommended Addon Policy
|
|
541
589
|
When user tasks require capabilities from: ${addons.join(", ")}, explain the capability and request user confirmation to install via \`agents add <addon> -t cline -y\` before running the installation.` : "";
|
|
590
|
+
const planning = bundle.planningLoop?.enabled === true ? bundle.planningLoop : void 0;
|
|
591
|
+
const mode = planning?.mode ?? "subagent-first";
|
|
592
|
+
const budget = planning?.budget;
|
|
593
|
+
const delegationStep = planning ? mode === "subagent-first" ? "2. **Subagent-First Delegation Policy (ADR 0014)**: execute specialist work through the configured `subagent_*` agent tools (projected under `.cline/agents/`), assigning non-overlapping scopes. Complete specialist work in the main session ONLY if the subagent tools are genuinely absent from this runtime or the task is trivial (single-file read, one-line answer, formatting) \u2014 never as a convenience or speed choice." : "2. **Planner-Orchestrator Delegation Policy (ADR 0015)**: execute specialist work through the configured `subagent_*` agent tools (projected under `.cline/agents/`), assigning non-overlapping scopes. Complete specialist work in the main session ONLY if the subagent tools are genuinely absent from this runtime or the task is trivial (single-file read, one-line answer, formatting) \u2014 never as a convenience or speed choice." : "2. Delegate specialist tasks using the configured `subagent_*` agent tools (projected under `.cline/agents/`) when available, assigning non-overlapping scopes; fall back to Agent Teams (`team_spawn_teammate`) or session subagents as needed.";
|
|
594
|
+
const planningSection = planning ? mode === "subagent-first" ? "\n\n## Subagent-First Planning Dialogue Loop (ADR 0014)Run this loop BEFORE any substantive execution on a non-trivial task. Delegation-first is mandatory, not advisory.\n\n### Phase 0 \u2014 User Alignment\nIf the user's brief is ambiguous, grill it Socratically with the user first: `/grill-me` (strategy / non-code) or `/grill-with-docs` (code & docs; writes ADRs and updates CONTEXT.md).\n\n### Phase 0.5 \u2014 Sidekick Clarification\nSpawn at most " + (planning.sidekicks?.max ?? 2) + " relevant specialists (spawnable `subagent_*` tools) INTO this planning conversation to resolve remaining ambiguity. Sidekicks advise you; you relay their questions to the user.\n\n### Phase 1 \u2014 Specialist Council\nHave every relevant specialist return a Scope-of-Work Statement (max " + (budget?.summaryWordCap ?? 150) + " words): (1) my scope, (2) inputs I need from peers, (3) my deliverable per my own workflows, (4) at most 2 open questions.\n\n### Phase 2 \u2014 Delegation Map\nSynthesize the council output into a task \u2192 specialist map and present it to the user BEFORE execution. Then delegate per the map.\n\n### Consultation Budget (hard caps)\n- Planning rounds (orchestrator \u2194 council): max " + (budget?.maxPlanningRounds ?? 2) + "\n- Peer exchanges per specialist pair: max " + (budget?.maxPeerExchangesPerPair ?? 2) + " directed questions\n- Scope-of-Work statement length: max " + (budget?.summaryWordCap ?? 150) + " words\n- Specialist per-invocation iteration cap: maxIterations: " + (budget?.maxIterations ?? 8) + " (rendered into .cline/agents/*.yml)" : "\n\n## Planner-Orchestrator Policy (ADR 0015)Plan solo, delegate execution. This mode replaces the Subagent-First Planning Dialogue Loop for single-discipline domain bundles.\n\n### Phase 0 \u2014 User Alignment (solo)\nIf the user's brief is ambiguous, grill it Socratically yourself: `/grill-me` (strategy / non-code) or `/grill-with-docs` (code & docs). Consult the bundle's skills directly whenever they help you plan \u2014 you have the same skill access as your specialists. Do NOT spawn specialists during planning.\n\n### Planning Aid Boundary\nWhile planning you may consult skills and reason to give the user PROVISIONAL answers and estimates. A concrete deliverable \u2014 data analysis, code, assets, documents \u2014 is specialist work: defer it to the delegation map, never produce it yourself during planning.\n\n### Phase 2 \u2014 Delegation Map (solo-composed)\nCompose the task \u2192 specialist map from your own domain expertise and the skill runbooks, and present it to the user BEFORE execution.\n\n### Execution\nDelegate every deliverable to the configured `subagent_*` agent tools (projected under `.cline/agents/`), assigning non-overlapping scopes. Complete specialist work in the main session ONLY if the subagent tools are genuinely absent from this runtime or the task is trivial (single-file read, one-line answer, formatting) \u2014 never as a convenience or speed choice." : "";
|
|
595
|
+
const personaSection = planning && bundle.personaAliases && Object.keys(bundle.personaAliases).length > 0 ? `
|
|
596
|
+
|
|
597
|
+
### Persona \u2192 Spawnable Tool Map
|
|
598
|
+
| Persona | Role / Spawnable tool |
|
|
599
|
+
|---|---|
|
|
600
|
+
${Object.entries(bundle.personaAliases).map(([persona, role]) => {
|
|
601
|
+
const target = role.startsWith("subagent-") ? `${role} \u2192 \`subagent_${this.stripSubagentPrefix(role).replace(/-/g, "_")}\`` : `${role} (you, the coordinator)`;
|
|
602
|
+
return `| ${persona} | ${target} |`;
|
|
603
|
+
}).join("\n")}` : "";
|
|
542
604
|
return `# Agents United \u2014 ${bundle.name} Coordinator Rule
|
|
543
605
|
${marker}
|
|
544
606
|
|
|
@@ -548,9 +610,10 @@ ${marker}
|
|
|
548
610
|
|
|
549
611
|
## Activation Protocol
|
|
550
612
|
1. At session start, read the Team Manifest (\`${manifestRelPath}\`) and coordinator role prompt (\`.agents/${coordinatorCanonical}\`).
|
|
551
|
-
|
|
613
|
+
${delegationStep}
|
|
552
614
|
3. For lightweight read-only research, use session subagents.
|
|
553
615
|
4. Only specialist roles declared in the Team Manifest are active in this workspace.
|
|
616
|
+
${planningSection}${personaSection}
|
|
554
617
|
${specialistLines.length > 0 ? `
|
|
555
618
|
### Installed Specialist Roles
|
|
556
619
|
${specialistLines.join("\n")}` : ""}
|
|
@@ -582,7 +645,12 @@ ${addonSection}
|
|
|
582
645
|
const srcPath = path4.join(registryDir, "agents", agentFile);
|
|
583
646
|
if (await fs2.pathExists(srcPath)) {
|
|
584
647
|
const content = await fs2.readFile(srcPath, "utf8");
|
|
585
|
-
const rendered = this.renderConfiguredAgent(
|
|
648
|
+
const rendered = this.renderConfiguredAgent(
|
|
649
|
+
content,
|
|
650
|
+
canonicalRel,
|
|
651
|
+
bundle.planningLoop?.enabled === true ? bundle.planningLoop.budget?.maxIterations : void 0
|
|
652
|
+
// ADR 0015: planner-orchestrator has no budget → undefined → key absent from .yml
|
|
653
|
+
);
|
|
586
654
|
const roleName = this.stripSubagentPrefix(agentFile.replace(/\.md$/i, ""));
|
|
587
655
|
artifacts.push({
|
|
588
656
|
kind: "role",
|