agents-united 0.5.0 → 0.7.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/README.md CHANGED
@@ -17,7 +17,7 @@ Curated teams of orchestrators, sub-agents, skills, and workflows — installed
17
17
 
18
18
  - **ðŸŠķ Essentials-First & On-Demand Growth**: Every department installs as a lean **Essentials bundle** by default. When a task requires specialized capabilities, the Lead Orchestrator automatically detects the gap, recommends the exact addon, and can auto-install it directly into your project scope.
19
19
  - **🌐 One Library, Every Assistant**: Author in `.agents/` as your single source of truth. Agents United automatically projects and translates compatible configurations to **Google Antigravity 2.0 / Gemini**, **Anthropic Claude Code**, **Cursor**, **Cline**, **OpenCode**, and **Codex / AGENTS.md**.
20
- - **🚀 Cline Native Activation**: Launch specialized teams into Cline CLI sessions with `agents start`, featuring packaged native plugins with `package.json` manifests in `.agents/plugins/<bundle>/`, skill toolkits, coordinator rules, and declarative team manifests.
20
+ - **🚀 Cline Native Activation**: Bundles activate **automatically** in any Cline CLI session — skills discovered natively from `.agents/skills/`, configured-agent roles (`.cline/agents/*.yml`) exposed as spawnable `subagent_*` tools, coordinator rules (`.cline/rules/`), slash-command workflows (`.cline/workflows/`), and spec-conformant Agent Plugin packages (`plugin.json`, agent-plugins.org) in `.agents/plugins/<bundle>/`. No install step required; `agents start` remains available as an optional pre-seeded team-session launcher.
21
21
  - **🏛ïļ 8 Department Domains & 26 Bundles**: Complete coverage across Software Engineering, System Architecture, Product Design, Growth & Marketing, Security, Deep Research, Business Strategy, and Universal Meta-Skills.
22
22
  - **ðŸĪ– 58 Specialized Agents, 91 Skills & 69 Workflows**: 8 Lead Orchestrators coordinating 50 domain sub-agents, backed by 91 production-grade runbooks and 69 deterministic workflows.
23
23
  - **⚡ Modern Cloud & AI Tooling**: First-class runbooks for Modal.com, Replicate, RunPod, local LLMs/vLLM, LangChain, LlamaIndex, Qdrant, Vercel, Supabase, Turso, and Azure Bicep.
@@ -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
 
@@ -297,9 +297,13 @@ agents remove mobile-development -g -y
297
297
  ---
298
298
 
299
299
  ### `agents start <bundle> [prompt]`
300
- Starts an installed team bundle in its host runtime. **By design, this command currently targets the Cline CLI** because Cline provides an open, programmatic CLI (`cline "prompt"`) that allows us to inject a team context directly from the terminal (unlike other editors which do not yet expose this).
300
+ Launches an **optional pre-seeded team session** in the Cline CLI. Activation itself is automatic (ADR 0013 native discovery): after `agents add`, *any* `cline` session in the workspace already sees the bundle's skills, `subagent_*` agent tools, rules, and workflow commands. What `agents start` adds on top:
301
301
 
302
- It automatically resolves project vs. global installations, verifies that Cline projections are up-to-date, probes for the `cline` executable on your system, constructs safe non-shell evaluated arguments, and launches the session.
302
+ 1. **Coordinator persona bootstrap** — the session starts *as* the bundle's Lead Orchestrator (reads the Team Manifest and coordinator role prompt).
303
+ 2. **Persistent team state** — `--team-name au-<bundle>-<hash>` gives a resumable team board (`~/.cline/data/teams/`).
304
+ 3. **Addon pre-authorization** — `--allow-addons` skips per-addon consent prompts for the session.
305
+
306
+ **By design, this command currently targets the Cline CLI** because Cline provides an open, programmatic CLI (`cline "prompt"`) that allows us to inject a team context directly from the terminal (unlike other editors which do not yet expose this). It automatically resolves project vs. global installations, probes for the `cline` executable on your system (Windows node-wrapper, `cmd.exe` shim bridge, or POSIX binary), constructs safe non-shell evaluated arguments, and launches the session.
303
307
 
304
308
  ```bash
305
309
  # Start an installed team in Cline
@@ -363,7 +367,7 @@ Audits workspace agent directories, verifies frontmatter schema validity, valida
363
367
  # General workspace health audit
364
368
  agents doctor
365
369
 
366
- # Audit Cline runtime installation, capability probe, and compound projection integrity
370
+ # Audit Cline runtime installation, capability probe, and native discovery projection integrity
367
371
  agents doctor --host cline
368
372
  ```
369
373
 
@@ -411,6 +415,19 @@ Organization bundles operate across three dynamic execution envelopes:
411
415
  > [!TIP]
412
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!
413
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
+ Currently enabled for `digital-agency` (`planningLoop.enabled` in `registry/bundles.json`); rollout to the remaining bundles is tracked in [`ROADMAP.md`](ROADMAP.md). See [ADR 0014](./docs/adr/0014-subagent-first-planning-loop.md) and [Plan 012](./plans/012-subagent-first-planning-loop.md).
430
+
414
431
  ---
415
432
  ## 🌐 One Library, Every Assistant
416
433
 
@@ -537,20 +554,25 @@ When contributing new skills or adapting external skills:
537
554
  3. **Deterministic Verifications**: Include clear validation commands, error recovery procedures, and code exemplars.
538
555
 
539
556
  ### 6. Pull Request (PR) Workflow
540
- 1. **Create a Feature Branch**: Always branch from `dev`:
557
+
558
+ 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).
559
+
560
+ 1. **Branch from a fresh `dev`** (direct pushes to `dev` are rejected — changes arrive via PR only):
541
561
  ```bash
542
- git checkout dev
543
- git pull origin dev
544
- git checkout -b feat/your-feature-name
562
+ git switch dev && git pull origin dev
563
+ git switch -c feat/your-feature-name # or fix/, docs/, ci/
545
564
  ```
546
565
  2. **Follow TDD (Red-Green-Refactor)**: Author failing unit/E2E tests in `tests/` before implementing code.
547
566
  3. **Run Pre-PR Verification**:
548
567
  ```bash
568
+ npm run typecheck && npm test
549
569
  npm run build
550
- npm test
551
570
  git diff --cached # Audit staged files for accidental secrets or temp files
552
571
  ```
553
- 4. **Submit Pull Request**: Open a PR targeting the `dev` branch with a concise description of changes and test results.
572
+ 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.
573
+ 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`.
574
+
575
+ > 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.
554
576
 
555
577
  ---
556
578
 
package/dist/cli.js CHANGED
@@ -342,47 +342,120 @@ import path4 from "path";
342
342
  import fs2 from "fs-extra";
343
343
  var ClineProjector = class {
344
344
  /**
345
- * Render a Cline role definition from canonical agent markdown content.
345
+ * Managed marker inserted after YAML frontmatter in every rendered artifact.
346
346
  */
347
- static renderRole(canonicalContent, canonicalRelPath) {
347
+ static marker(canonicalRelPath) {
348
348
  const normCanonical = canonicalRelPath.replace(/\\/g, "/");
349
- const marker = `<!-- managed-by: agents-united | profile: cline | canonical: ${normCanonical} | do not edit -->`;
350
- const preamble = `## Cline runtime note
349
+ return `<!-- managed-by: agents-united | profile: cline | canonical: ${normCanonical} | do not edit -->`;
350
+ }
351
+ static runtimeNote = `## Cline runtime note
351
352
 
352
353
  Use the equivalent capabilities available in this Cline session. Canonical tool names describe
353
- intent and may differ from Cline's runtime tool names. For delegation, prefer Agent Teams when
354
- available, then session subagents; otherwise complete the role in the main session.`;
354
+ intent and may differ from Cline's runtime tool names. For delegation, prefer the configured
355
+ subagent_* agent tools (projected under .cline/agents/), then session subagents; otherwise
356
+ complete the role in the main session.`;
357
+ /**
358
+ * Strip the canonical `subagent-` prefix. Cline prefixes configured-agent tool
359
+ * names with `subagent_` itself, so keeping the prefix would produce names like
360
+ * `subagent_subagent_marketing_growth_strategist`.
361
+ */
362
+ static stripSubagentPrefix(name) {
363
+ return name.trim().replace(/^subagent-/, "");
364
+ }
365
+ /**
366
+ * Slugify a workflow display name into a usable slash-command name
367
+ * (e.g. "Digital Agency Full-Funnel Campaign Orchestration" -> "digital-agency-full-funnel-campaign-orchestration").
368
+ */
369
+ static slugifyWorkflowName(name) {
370
+ return name.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "");
371
+ }
372
+ /**
373
+ * Render a Cline Configured Agent definition (.cline/agents/<role>.yml) from
374
+ * canonical agent markdown content. Cline 3.x consumes YAML files with
375
+ * frontmatter (name, description) and treats the body as the agent system prompt.
376
+ */
377
+ static renderConfiguredAgent(canonicalContent, canonicalRelPath, defaultMaxIterations) {
355
378
  const match = canonicalContent.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);
356
379
  if (!match) {
357
- return `${marker}
358
-
359
- ${preamble}
360
-
361
- ${canonicalContent.trim()}`;
380
+ throw new Error(`Canonical agent ${canonicalRelPath} is missing YAML frontmatter.`);
362
381
  }
363
- const rawYaml = match[1];
364
- const rawBody = match[2];
365
382
  let parsed = {};
366
383
  try {
367
- parsed = yaml.parse(rawYaml) || {};
384
+ parsed = yaml.parse(match[1]) || {};
368
385
  } catch {
369
386
  parsed = {};
370
387
  }
371
- const cleanFrontmatter = {};
372
- if (parsed.name) cleanFrontmatter.name = parsed.name;
373
- if (parsed.description) cleanFrontmatter.description = parsed.description;
374
- if (parsed.providerId) cleanFrontmatter.providerId = parsed.providerId;
375
- if (parsed.modelId) cleanFrontmatter.modelId = parsed.modelId;
376
- if (parsed.cwd) cleanFrontmatter.cwd = parsed.cwd;
377
- if (parsed.maxIterations) cleanFrontmatter.maxIterations = parsed.maxIterations;
388
+ const baseName = canonicalRelPath.replace(/\\/g, "/").split("/").pop() ?? "";
389
+ const rawName = typeof parsed.name === "string" && parsed.name.trim().length > 0 ? parsed.name.trim() : baseName.replace(/\.md$/i, "");
390
+ const cleanFrontmatter = {
391
+ name: this.stripSubagentPrefix(rawName)
392
+ };
393
+ if (typeof parsed.description === "string" && parsed.description.trim().length > 0) {
394
+ cleanFrontmatter.description = parsed.description.trim();
395
+ }
396
+ if (typeof parsed.maxIterations === "number") {
397
+ cleanFrontmatter.maxIterations = parsed.maxIterations;
398
+ } else if (typeof defaultMaxIterations === "number") {
399
+ cleanFrontmatter.maxIterations = defaultMaxIterations;
400
+ }
378
401
  const frontmatterStr = yaml.stringify(cleanFrontmatter).trim();
379
- const bodyStr = rawBody.trim();
402
+ const bodyStr = match[2].trim();
380
403
  return `---
381
404
  ${frontmatterStr}
382
405
  ---
383
- ${marker}
406
+ ${this.marker(canonicalRelPath)}
384
407
 
385
- ${preamble}
408
+ ${this.runtimeNote}
409
+
410
+ ${bodyStr}
411
+ `;
412
+ }
413
+ /**
414
+ * Derive the slash-command slug for a workflow from its frontmatter name,
415
+ * falling back to the canonical filename. Kept separate from the renderer so the
416
+ * projection filename and the frontmatter `name` are guaranteed to match.
417
+ */
418
+ static workflowSlug(canonicalContent, canonicalRelPath) {
419
+ const match = canonicalContent.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);
420
+ let humanName;
421
+ if (match) {
422
+ try {
423
+ const parsed = yaml.parse(match[1]) || {};
424
+ if (typeof parsed.name === "string" && parsed.name.trim().length > 0) {
425
+ humanName = parsed.name.trim();
426
+ }
427
+ } catch {
428
+ }
429
+ }
430
+ const baseName = canonicalRelPath.replace(/\\/g, "/").split("/").pop() ?? "";
431
+ return this.slugifyWorkflowName(humanName ?? baseName.replace(/\.md$/i, ""));
432
+ }
433
+ /**
434
+ * Render a Cline workflow projection (.cline/workflows/<slug>.md). The frontmatter
435
+ * `name` is slugified so the workflow surfaces as a usable /<slug> command; the
436
+ * human-readable title stays in `description` and the untouched body.
437
+ */
438
+ static renderWorkflowProjection(canonicalContent, canonicalRelPath) {
439
+ const slug = this.workflowSlug(canonicalContent, canonicalRelPath);
440
+ const match = canonicalContent.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);
441
+ let description;
442
+ if (match) {
443
+ try {
444
+ const parsed = yaml.parse(match[1]) || {};
445
+ if (typeof parsed.description === "string" && parsed.description.trim().length > 0) {
446
+ description = parsed.description.trim();
447
+ }
448
+ } catch {
449
+ }
450
+ }
451
+ const cleanFrontmatter = { name: slug };
452
+ if (description) cleanFrontmatter.description = description;
453
+ const frontmatterStr = yaml.stringify(cleanFrontmatter).trim();
454
+ const bodyStr = match ? match[2].trim() : canonicalContent.trim();
455
+ return `---
456
+ ${frontmatterStr}
457
+ ---
458
+ ${this.marker(canonicalRelPath)}
386
459
 
387
460
  ${bodyStr}
388
461
  `;
@@ -450,6 +523,12 @@ ${bodyStr}
450
523
  fallbacks: ["adaptive-session", "single-orchestrator"]
451
524
  }
452
525
  };
526
+ if (bundle.planningLoop?.enabled) {
527
+ manifest.planningLoop = bundle.planningLoop;
528
+ if (bundle.personaAliases && Object.keys(bundle.personaAliases).length > 0) {
529
+ manifest.personas = Object.entries(bundle.personaAliases).map(([persona, role]) => ({ persona, role }));
530
+ }
531
+ }
453
532
  return yaml.stringify(manifest);
454
533
  }
455
534
  /**
@@ -471,6 +550,40 @@ ${bodyStr}
471
550
  const addonSection = addons.length > 0 ? `
472
551
  ### Recommended Addon Policy
473
552
  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.` : "";
553
+ const planning = bundle.planningLoop?.enabled === true ? bundle.planningLoop : void 0;
554
+ const budget = planning?.budget;
555
+ const delegationStep = planning ? "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. 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.";
556
+ const planningSection = planning ? `
557
+
558
+ ## Subagent-First Planning Dialogue Loop (ADR 0014)
559
+ Run this loop BEFORE any substantive execution on a non-trivial task. Delegation-first is mandatory, not advisory.
560
+
561
+ ### Phase 0 \u2014 User Alignment
562
+ If 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).
563
+
564
+ ### Phase 0.5 \u2014 Sidekick Clarification
565
+ Spawn 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.
566
+
567
+ ### Phase 1 \u2014 Specialist Council
568
+ Have 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.
569
+
570
+ ### Phase 2 \u2014 Delegation Map
571
+ Synthesize the council output into a task \u2192 specialist map and present it to the user BEFORE execution. Then delegate per the map.
572
+
573
+ ### Consultation Budget (hard caps)
574
+ - Planning rounds (orchestrator \u2194 council): max ${budget?.maxPlanningRounds ?? 2}
575
+ - Peer exchanges per specialist pair: max ${budget?.maxPeerExchangesPerPair ?? 2} directed questions
576
+ - Scope-of-Work statement length: max ${budget?.summaryWordCap ?? 150} words
577
+ - Specialist per-invocation iteration cap: maxIterations: ${budget?.maxIterations ?? 8} (rendered into .cline/agents/*.yml)` : "";
578
+ const personaSection = planning && bundle.personaAliases && Object.keys(bundle.personaAliases).length > 0 ? `
579
+
580
+ ### Persona \u2192 Spawnable Tool Map
581
+ | Persona | Role / Spawnable tool |
582
+ |---|---|
583
+ ${Object.entries(bundle.personaAliases).map(([persona, role]) => {
584
+ const target = role.startsWith("subagent-") ? `${role} \u2192 \`subagent_${this.stripSubagentPrefix(role).replace(/-/g, "_")}\`` : `${role} (you, the coordinator)`;
585
+ return `| ${persona} | ${target} |`;
586
+ }).join("\n")}` : "";
474
587
  return `# Agents United \u2014 ${bundle.name} Coordinator Rule
475
588
  ${marker}
476
589
 
@@ -480,9 +593,10 @@ ${marker}
480
593
 
481
594
  ## Activation Protocol
482
595
  1. At session start, read the Team Manifest (\`${manifestRelPath}\`) and coordinator role prompt (\`.agents/${coordinatorCanonical}\`).
483
- 2. Delegate specialist tasks using **Agent Teams** (\`team_spawn_teammate\`, \`team_delegate_task\`) when available, assigning non-overlapping scopes.
596
+ ${delegationStep}
484
597
  3. For lightweight read-only research, use session subagents.
485
598
  4. Only specialist roles declared in the Team Manifest are active in this workspace.
599
+ ${planningSection}${personaSection}
486
600
  ${specialistLines.length > 0 ? `
487
601
  ### Installed Specialist Roles
488
602
  ${specialistLines.join("\n")}` : ""}
@@ -497,23 +611,16 @@ ${addonSection}
497
611
  static async planCompoundProjection(bundle, scope, resolved, registryDir, excludeAddons = []) {
498
612
  const artifacts = [];
499
613
  const baseDir = `.agents/plugins/${bundle.name}`;
500
- const pluginManifest = {
501
- name: `agents-united-${bundle.name}`,
502
- version: "1.0.0",
503
- description: bundle.description || "",
504
- cline: {
505
- plugins: [
506
- {
507
- capabilities: ["skills", "tools", "workflows"],
508
- skills: ["./skills"]
509
- }
510
- ]
511
- }
614
+ const agentPluginManifest = {
615
+ $schema: "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
616
+ name: bundle.name,
617
+ version: bundle.version || "1.0.0",
618
+ description: bundle.description || ""
512
619
  };
513
620
  artifacts.push({
514
621
  kind: "plugin-manifest",
515
- relPath: `${baseDir}/package.json`.replace(/\\/g, "/"),
516
- content: JSON.stringify(pluginManifest, null, 2),
622
+ relPath: `${baseDir}/plugin.json`.replace(/\\/g, "/"),
623
+ content: JSON.stringify(agentPluginManifest, null, 2),
517
624
  managedMarker: false
518
625
  });
519
626
  for (const agentFile of resolved.agents) {
@@ -521,11 +628,16 @@ ${addonSection}
521
628
  const srcPath = path4.join(registryDir, "agents", agentFile);
522
629
  if (await fs2.pathExists(srcPath)) {
523
630
  const content = await fs2.readFile(srcPath, "utf8");
524
- const rendered = this.renderRole(content, canonicalRel);
631
+ const rendered = this.renderConfiguredAgent(
632
+ content,
633
+ canonicalRel,
634
+ bundle.planningLoop?.enabled === true ? bundle.planningLoop.budget?.maxIterations : void 0
635
+ );
636
+ const roleName = this.stripSubagentPrefix(agentFile.replace(/\.md$/i, ""));
525
637
  artifacts.push({
526
638
  kind: "role",
527
639
  canonical: canonicalRel,
528
- relPath: `${baseDir}/agents/${agentFile}`.replace(/\\/g, "/"),
640
+ relPath: `.cline/agents/${roleName}.yml`.replace(/\\/g, "/"),
529
641
  content: rendered,
530
642
  managedMarker: true
531
643
  });
@@ -564,10 +676,26 @@ ${addonSection}
564
676
  }
565
677
  }
566
678
  }
679
+ for (const workflowFile of resolved.workflows) {
680
+ const canonicalRel = `workflows/${workflowFile}`;
681
+ const srcPath = path4.join(registryDir, "workflows", workflowFile);
682
+ if (await fs2.pathExists(srcPath)) {
683
+ const content = await fs2.readFile(srcPath, "utf8");
684
+ const slug = this.workflowSlug(content, canonicalRel);
685
+ const rendered = this.renderWorkflowProjection(content, canonicalRel);
686
+ artifacts.push({
687
+ kind: "workflow",
688
+ canonical: canonicalRel,
689
+ relPath: `.cline/workflows/${slug}.md`.replace(/\\/g, "/"),
690
+ content: rendered,
691
+ managedMarker: true
692
+ });
693
+ }
694
+ }
567
695
  const ruleContent = this.renderCoordinatorRule(bundle, scope, excludeAddons);
568
696
  artifacts.push({
569
697
  kind: "rule",
570
- relPath: `${baseDir}/rules/agents-united-${bundle.name}.md`.replace(/\\/g, "/"),
698
+ relPath: `.cline/rules/agents-united-${bundle.name}.md`.replace(/\\/g, "/"),
571
699
  content: ruleContent,
572
700
  managedMarker: true
573
701
  });
@@ -675,7 +803,7 @@ var HostProjector = class _HostProjector {
675
803
  return { content: content2, warnings };
676
804
  }
677
805
  if (profile === "cline") {
678
- const content2 = ClineProjector.renderRole(md, canonicalRelPath);
806
+ const content2 = ClineProjector.renderConfiguredAgent(md, canonicalRelPath);
679
807
  return { content: content2, warnings };
680
808
  }
681
809
  const out = {};
@@ -1014,21 +1142,6 @@ var InstallEngine = class _InstallEngine {
1014
1142
  }
1015
1143
  }
1016
1144
  }
1017
- if (lockfile.files) {
1018
- for (const [canonKey, fileMeta] of Object.entries(lockfile.files)) {
1019
- if (fileMeta.projectedTo) {
1020
- const staleClinePaths = fileMeta.projectedTo.filter((p) => p.startsWith(".cline/"));
1021
- for (const stalePath of staleClinePaths) {
1022
- const absPath = path5.join(root, stalePath);
1023
- if (await fs3.pathExists(absPath)) {
1024
- await fs3.remove(absPath);
1025
- await this.removeEmptyProjectionDirs(root, stalePath);
1026
- }
1027
- this.removeProjectedTo(lockfile, canonKey, stalePath);
1028
- }
1029
- }
1030
- }
1031
- }
1032
1145
  for (const artifact of artifacts) {
1033
1146
  const dest = path5.join(root, artifact.relPath);
1034
1147
  if (await fs3.pathExists(dest) && !options.force) {
@@ -1116,7 +1229,8 @@ var InstallEngine = class _InstallEngine {
1116
1229
  const content = await fs3.readFile(path5.join(registryDir, "agents", agentFile), "utf8");
1117
1230
  const canonicalRel = this.canonicalRelAgent(agentFile);
1118
1231
  const res = HostProjector.projectAgent(content, HOST_REGISTRY[host].profile, canonicalRel);
1119
- const dest = path5.join(base, subdir, agentFile);
1232
+ const projName = host === "cline" ? `${agentFile.replace(/\.md$/i, "").replace(/^subagent-/, "")}.yml` : agentFile;
1233
+ const dest = path5.join(base, subdir, projName);
1120
1234
  if (await fs3.pathExists(dest) && !options.force) {
1121
1235
  const existing = await fs3.readFile(dest, "utf8");
1122
1236
  if (!HostProjector.hasManagedMarker(existing)) {
@@ -2030,6 +2144,14 @@ var ClineCapabilityProbe = class {
2030
2144
  source: "node-wrapper"
2031
2145
  };
2032
2146
  }
2147
+ const ext = path9.extname(fullPath).toLowerCase();
2148
+ if (ext === ".cmd" || ext === ".bat") {
2149
+ return {
2150
+ executable: "cmd.exe",
2151
+ prefixArgs: ["/c", fullPath],
2152
+ source: "path-executable"
2153
+ };
2154
+ }
2033
2155
  return {
2034
2156
  executable: fullPath,
2035
2157
  prefixArgs: [],
@@ -2202,7 +2324,7 @@ var DoctorEngine = class {
2202
2324
  for (const [projRelPath, proj] of Object.entries(manifest.projections)) {
2203
2325
  const absPath = path10.join(workspaceRoot, projRelPath);
2204
2326
  if (!await fs8.pathExists(absPath)) {
2205
- warnings.push(`Missing compound projection ${projRelPath} (owners: ${proj.owners.join(", ")}).`);
2327
+ warnings.push(`Missing Cline projection ${projRelPath} (owners: ${proj.owners.join(", ")}).`);
2206
2328
  continue;
2207
2329
  }
2208
2330
  if (proj.managedMarker) {
@@ -2373,14 +2495,14 @@ var ClineLauncher = class _ClineLauncher {
2373
2495
  const coordinatorFile = (orchestrator || "orchestrator-engineering.md").replace(/\.md$/, "");
2374
2496
  const coordinatorCanonical = `.agents/agents/${coordinatorFile}.md`;
2375
2497
  const addonPolicyText = allowAddons ? "Addon auto-installation is pre-authorized for this session." : `Before installing any recommended addon, explain the requirement to the user and request explicit confirmation to run: agents add <addon> -t cline ${scope === "global" ? "-g " : ""}-y.`;
2376
- const pluginInstallText = `Before proceeding, ensure you have installed this bundle's plugin by running: cline plugin install .agents/plugins/${bundleName}`;
2498
+ const deploymentNoteText = `Deployment note: this bundle is already projected natively for this workspace (skills, rules, workflows, and configured subagent roles) - no "cline plugin install" step is needed.`;
2377
2499
  const taskText = prompt && prompt.trim().length > 0 ? `User task: ${prompt.trim()}` : "Please introduce your coordinator role to the user and ask for their first task.";
2378
2500
  const bootstrapPrompt = [
2379
2501
  `You are coordinating the "${bundleName}" team in Agents United.`,
2380
2502
  `Read the Team Manifest at "${manifestRel}" and your coordinator role definition at "${coordinatorCanonical}" before acting.`,
2381
2503
  `Use specialist roles only when necessary.`,
2382
2504
  addonPolicyText,
2383
- pluginInstallText,
2505
+ deploymentNoteText,
2384
2506
  taskText
2385
2507
  ].join("\n\n");
2386
2508
  const argv = [...command.prefixArgs];
@@ -3344,7 +3466,7 @@ cli.command("add [identifier]", "Add a bundle, agent, skill, or workflow to proj
3344
3466
  {
3345
3467
  value: "cline",
3346
3468
  label: HOST_REGISTRY.cline.label,
3347
- hint: detectedHosts.includes("cline") ? "found in this project" : "roles, skills, coordinator rules & team manifests for Cline"
3469
+ hint: detectedHosts.includes("cline") ? "found in this project" : "configured agents, skills, rules, workflows & team manifests for Cline"
3348
3470
  },
3349
3471
  {
3350
3472
  value: "opencode",
@@ -3699,6 +3821,12 @@ ${renderProjections(result.projections)}` : ""),
3699
3821
  "Installation Success"
3700
3822
  );
3701
3823
  const hasClineProjection = result.projections.some((p) => p.host === "cline");
3824
+ if (hasClineProjection && !options.dryRun) {
3825
+ note(
3826
+ pc.green(`Already active: any Cline session in this workspace now sees this bundle's skills, subagent_* agent tools, rules & workflow commands (ADR 0013 native discovery).`),
3827
+ "Native Activation"
3828
+ );
3829
+ }
3702
3830
  if (options.start && !hasClineProjection) {
3703
3831
  throw new Error("--start requires Cline projection. Add -t cline or --fanout cline.");
3704
3832
  }
@@ -3762,8 +3890,10 @@ ${renderProjections(result.projections)}` : ""),
3762
3890
  if (!options.dryRun && hosts.includes("agents") && result.projections.length === 0) {
3763
3891
  note(
3764
3892
  pc.yellow(
3765
- `Tip: only Antigravity reads the main library (.agents/) directly.
3766
- To use this bundle in Cline, Claude Code & others: agents update ${identifier} --fanout cline,claude`
3893
+ `Tip: Antigravity reads the main library (.agents/) directly, and Cline natively
3894
+ discovers skills from .agents/skills/ (ADR 0013). For Cline configured agents,
3895
+ rules & workflows run: agents update ${identifier} --fanout cline
3896
+ (add claude, cursor, opencode, codex for other assistants)`
3767
3897
  ),
3768
3898
  "One library, every assistant"
3769
3899
  );
@@ -3974,8 +4104,8 @@ Updates Available: ${report.outdatedCount > 0 ? pc.yellow(pc.bold(`${report.outd
3974
4104
  if (unprojected.length > 0) {
3975
4105
  note(
3976
4106
  pc.yellow(
3977
- `Tip: not synced to other assistants yet (only Antigravity reads .agents/).
3978
- To add Cline & friends: agents update ${unprojected[0]} --fanout cline,claude`
4107
+ `Tip: not fully synced to other assistants yet (Antigravity reads .agents/ directly; Cline natively discovers .agents/skills/).
4108
+ For Cline configured agents, rules & workflows: agents update ${unprojected[0]} --fanout cline`
3979
4109
  ),
3980
4110
  "One library, every assistant"
3981
4111
  );
@@ -4398,6 +4528,12 @@ Projections:
4398
4528
  ${renderProjections(result.projections)}` : ""),
4399
4529
  "Installation Success"
4400
4530
  );
4531
+ if (result.projections.some((p) => p.host === "cline")) {
4532
+ note(
4533
+ pc.green(`Already active: any Cline session in this workspace now sees this bundle's skills, subagent_* agent tools, rules & workflow commands (ADR 0013 native discovery). Use "agents start ${bundle.name}" for a pre-seeded team session.`),
4534
+ "Native Activation"
4535
+ );
4536
+ }
4401
4537
  outro(pc.green(`\u2728 Installation of "${bundle.name}" complete!`));
4402
4538
  } catch (err) {
4403
4539
  installSpinner.stop(pc.red("Installation failed"));
@@ -4453,7 +4589,7 @@ cli.command("list", "List available bundles grouped by department domain").alias
4453
4589
  domainOptions.push({
4454
4590
  value: "__full_tree__",
4455
4591
  label: "\u{1F333} View Full Static Catalog Tree",
4456
- hint: "expand all 18 bundles and 8 departments at once"
4592
+ hint: `expand all ${bundles.length} bundles and ${new Set(bundles.map((b) => b.domain).filter(Boolean)).size} departments at once`
4457
4593
  });
4458
4594
  const selectedDomain = await select({
4459
4595
  message: "Select Department Domain to explore:",
@@ -4730,10 +4866,11 @@ cli.command("doctor", "Verify health of installed agents, frontmatter schemas, a
4730
4866
  console.log(pc.bold(pc.cyan("\u{1F4A1} Get Started:")));
4731
4867
  console.log(` \u{1F449} ${pc.bold("agents add")} Launch the interactive installation wizard`);
4732
4868
  console.log(` \u{1F449} ${pc.bold("agents add software-engineering")} Install the engineering essentials team`);
4733
- console.log(` \u{1F449} ${pc.bold("agents list")} Browse all 23 bundles and 8 departments
4869
+ const bundleCount = (await registry.listBundles()).length;
4870
+ console.log(` \u{1F449} ${pc.bold("agents list")} Browse all ${bundleCount} bundles by department
4734
4871
  `);
4735
4872
  if (report.clineCapability) {
4736
- console.log(pc.bold(pc.cyan("Cline Runtime & Compound Projection Audit:")));
4873
+ console.log(pc.bold(pc.cyan("Cline Runtime & Native Discovery Audit:")));
4737
4874
  console.log(` Installed: ${report.clineCapability.installed ? pc.green("\u2714 Detected") : pc.yellow("\u2716 Not Found")}`);
4738
4875
  if (report.clineCapability.version) {
4739
4876
  console.log(` Version: ${report.clineCapability.version}`);
@@ -4754,13 +4891,13 @@ cli.command("doctor", "Verify health of installed agents, frontmatter schemas, a
4754
4891
  console.log(` \u{1F504} Installed Workflows: ${pc.bold(report.workflowsCount.toString())}
4755
4892
  `);
4756
4893
  if (report.clineCapability) {
4757
- console.log(pc.bold(pc.cyan("Cline Runtime & Compound Projection Audit:")));
4894
+ console.log(pc.bold(pc.cyan("Cline Runtime & Native Discovery Audit:")));
4758
4895
  console.log(` Installed: ${report.clineCapability.installed ? pc.green("\u2714 Detected") : pc.yellow("\u2716 Not Found")}`);
4759
4896
  if (report.clineCapability.version) {
4760
4897
  console.log(` Version: ${report.clineCapability.version}`);
4761
4898
  }
4762
4899
  console.log(` Named Teams: ${report.clineCapability.namedTeams ? pc.green("\u2714 Supported") : pc.yellow("\u2716 Unsupported (Adaptive fallback)")}`);
4763
- console.log(` Role Definitions: ${report.agentsCount} prepared (activation via "agents start")
4900
+ console.log(` Configured Agents: ${report.agentsCount} active natively in any Cline session ("agents start" = optional team-session launcher)
4764
4901
  `);
4765
4902
  }
4766
4903
  if (report.issues.length > 0) {