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 +34 -12
- package/dist/cli.js +209 -72
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
- package/registry/agents/orchestrator-marketing.md +31 -9
- 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 +20 -0
- 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
|
@@ -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**:
|
|
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`
|
|
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
|
|
|
@@ -297,9 +297,13 @@ agents remove mobile-development -g -y
|
|
|
297
297
|
---
|
|
298
298
|
|
|
299
299
|
### `agents start <bundle> [prompt]`
|
|
300
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
543
|
-
git
|
|
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. **
|
|
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
|
-
*
|
|
345
|
+
* Managed marker inserted after YAML frontmatter in every rendered artifact.
|
|
346
346
|
*/
|
|
347
|
-
static
|
|
347
|
+
static marker(canonicalRelPath) {
|
|
348
348
|
const normCanonical = canonicalRelPath.replace(/\\/g, "/");
|
|
349
|
-
|
|
350
|
-
|
|
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
|
|
354
|
-
|
|
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
|
-
|
|
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(
|
|
384
|
+
parsed = yaml.parse(match[1]) || {};
|
|
368
385
|
} catch {
|
|
369
386
|
parsed = {};
|
|
370
387
|
}
|
|
371
|
-
const
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
if (parsed.
|
|
377
|
-
|
|
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 =
|
|
402
|
+
const bodyStr = match[2].trim();
|
|
380
403
|
return `---
|
|
381
404
|
${frontmatterStr}
|
|
382
405
|
---
|
|
383
|
-
${marker}
|
|
406
|
+
${this.marker(canonicalRelPath)}
|
|
384
407
|
|
|
385
|
-
${
|
|
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
|
-
|
|
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
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
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}/
|
|
516
|
-
content: JSON.stringify(
|
|
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.
|
|
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:
|
|
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:
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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" : "
|
|
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:
|
|
3766
|
-
|
|
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 (
|
|
3978
|
-
|
|
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:
|
|
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
|
-
|
|
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 &
|
|
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 &
|
|
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(`
|
|
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) {
|