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.
Files changed (27) hide show
  1. package/README.md +30 -8
  2. package/dist/cli.js +71 -3
  3. package/dist/cli.js.map +1 -1
  4. package/package.json +1 -1
  5. package/registry/agents/orchestrator-business.md +17 -0
  6. package/registry/agents/orchestrator-design.md +17 -0
  7. package/registry/agents/orchestrator-engineering.md +17 -0
  8. package/registry/agents/orchestrator-marketing.md +33 -9
  9. package/registry/agents/orchestrator-research.md +17 -0
  10. package/registry/agents/orchestrator-security.md +17 -0
  11. package/registry/agents/orchestrator-system-architecture.md +17 -0
  12. package/registry/agents/subagent-compliance-grc-specialist.md +21 -0
  13. package/registry/agents/subagent-frontend-architect.md +21 -0
  14. package/registry/agents/subagent-marketing-campaign-specialist.md +21 -0
  15. package/registry/agents/subagent-marketing-content-strategist.md +21 -0
  16. package/registry/agents/subagent-marketing-conversion-specialist.md +21 -0
  17. package/registry/agents/subagent-marketing-creative-designer.md +21 -0
  18. package/registry/agents/subagent-marketing-growth-strategist.md +21 -0
  19. package/registry/agents/subagent-qa-automation-lead.md +21 -0
  20. package/registry/agents/subagent-seo-specialist.md +21 -0
  21. package/registry/bundles.json +174 -31
  22. package/registry/workflows/workflow-agency-ad-creative-sprint.md +6 -0
  23. package/registry/workflows/workflow-agency-brand-design-system.md +6 -0
  24. package/registry/workflows/workflow-agency-client-pitch-proposal.md +7 -1
  25. package/registry/workflows/workflow-agency-cro-funnel-teardown.md +6 -0
  26. package/registry/workflows/workflow-agency-full-campaign.md +7 -1
  27. 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` 🚧 | *(Currently under development)* | `orchestrator-digital-agency-director` |
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` 🚧)**: *(Currently under development)*
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
- 1. **Create a Feature Branch**: Always branch from `dev`:
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 checkout dev
547
- git pull origin dev
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. **Submit Pull Request**: Open a PR targeting the `dev` branch with a concise description of changes and test results.
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
- 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.
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(content, canonicalRel);
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",