Agent CLI suite. Brand, voice, visual, content, and outcomes form the durable foundation; member runtimes transform that foundation through a shared protocol layer. New capabilities should usually be extensions over this foundation, not new product cores.
Source-of-truth docs:
docs/capability-model.md— foundation, runtimes, extensions, product ruledocs/principal-patterns.md— small-core operating modeldocs/design-md-fidelity.md—DESIGN.mdevidence-first visual contract
| Dir | Bin | Role |
|---|---|---|
protocols/ |
(lib) | Shared schemas + adapters + narrow helper utilities — agentcy-protocols pip package |
voice/ |
agentcy-voice |
Persona management — create, test, optimize, export |
briefs/ |
agentcy-briefs |
Brand planning — brand kit + prompt → brief.v1 |
forecast/ |
agentcy-forecast |
Swarm prediction — docs + requirement → social forecast |
studio/ |
agentcy-studio |
Comms runtime — brief → draft → render → publish (TypeScript) |
measure/ |
agentcy-measure |
Measurement + calibration + study — run_result.v1 → performance.v1 |
Social-credential boundary (atum): brand-token social posting on this server is owned solely by
atelier/publish(~/agents/_skills/atelier/).studio/shares the{PLATFORM}_{BRAND}_*env convention, so don't run agentcy publishers against/home/deploy/.envhere — that's atelier's lane. agentcy publishers are for the product's own runs and creds.
agentcy-briefs plan run "<brief>" --brand <id> --voice-pack-id <brand>.voice.default \
--brief-v1-output <brief.v1.json> -f json → brief.v1
agentcy-studio run social.post --brand <id> --brief-file brief.v1.json --json → inspectable Studio artifacts
That is the default core. Voice, Forecast, publish, and Measure are opt-in extensions:
agentcy-voice --json export <persona> --to voice-pack.v1 → voice_pack.v1
agentcy-forecast run --files docs/ --brief brief.v1.json --json → forecast.v1
agentcy-studio publish <run_id> --json → run_result.v1
agentcy-measure adapt --run-result ... --sidecar ... --output performance.v1.json → performance.v1
The root dispatcher now also exposes a lightweight pipeline layer:
agentcy pipeline run ...persists a pipeline manifest underartifacts/pipelines/<pipeline_id>/manifest.json, writes a module-first bundle, supports stable named folders via--pipeline-id, and defaults tobrief.v1plus deterministic Studio artifactsagentcy pipeline rundoes not run Voice, Forecast, publish, Measure, or provider-backed image generation by default- use
--persona,--persona-eval,--with-forecast --files ..., and--publishto turn on heavier stages explicitly agentcy pipeline update --manifest ... --run-result ... --performance ...backfills later-stage canonical artifact paths after Studio publish / Measure adapt finishagentcy pipeline study --manifest ...reopens that manifest and runsagentcy-measure studywith auto-discovered forecast / voice eval sidecars- root
--providerand--modelflags are forwarded asLLM_PROVIDER/CLAUDE_MODELto members that support them; the pipeline layer also maps compatible values onto Briefs asAGENTCY_BRIEFS_LLM_PROVIDER/AGENTCY_BRIEFS_LLM_MODEL
# Python tools + repo-local dev commands
uv sync --group dev
# TypeScript Studio runtime (under studio/)
cd studio && pnpm install
# Protocol seam tests call the Studio launcher, so this install is also required for `make check-python`
# Forecast full simulation runtime, isolated on Python 3.11
make install-forecast-simulation
# Full live pipeline (requires make install-forecast-simulation + make install-studio)
make pipeline brand=givecare persona=my-persona files=docs/ req="predict adoption" sidecar=sidecar.json
# GiveCare-specific pipeline targets
make pipeline-givecare req="your brief" files=docs/ # live run
make pipeline-givecare-preview req="your brief" # smoke + dry publish
# Fixture-backed downstream smoke path
make pipeline-fixtures sidecar=protocols/tests/fixtures/run_result_to_performance_v1/sidecar.rich.json- Python: uv workspace (
pyproject.tomlat root) - TypeScript: pnpm for Studio (standalone in
studio/) - Lint: ruff (Python), tsc + vitest (TypeScript)
All inter-tool contracts live in protocols/:
brief.v1.schema.json— Briefs → Forecast, Studioforecast.v1.schema.json— Forecast → Measure calibraterun_result.v1.schema.json— Studio → Measure adaptperformance.v1.schema.json— Measure adapt output; Measure calibrate inputvoice_pack.v1.schema.json— Voice → Briefs, Studio
Current operator contract:
agentcy doctor --jsonreturns the normalized suite-wide readiness envelopeagentcy catalog --jsonreturns foundation, extension, member ownership, install profile, and positioning metadata in one root envelopeagentcy quickstart --profile ... --jsonreturns the smallest install path for a chosen suite profileagentcy-measure --jsonnow emits{"status": "ok"|"error", "command": str, "data": {...}}foradapt,calibrate,study, anddoctoragentcy-voiceuses a global--jsonflagagentcy-forecastandagentcy-studioexpose subcommand-level--jsonagentcy pipeline run/update/study --jsonemit root-level normalized envelopesagentcy member <member> --json ...wraps any member in one normalized root envelope, even when the member's native JSON contract differsagentcy-briefsexposes a global--jsonpreference across compatible data-producing commands, plus--json-envelopefor normalized success envelopes- Exit:
0success,1user error,2runtime error
Do not assume every member subcommand has the same JSON envelope yet; use the documented command form for each tool.
trashnotrmgit add <files>never.- Forecast's simulation env keeps
camel-oasis==0.2.5/camel-ai==0.2.78pinned inforecast/requirements-simulation.txt— do not upgrade - prefer
agentcy-forecast run --smokewhen you need a fast e2e artifact proof on Python 3.12 or when the live OASIS runtime is too slow for validation; smoke now fully skips ontology/graph/profiles — no LLM calls - CLI automation for full Forecast runs should exit cleanly on its own; command-waiting mode is for debug/service workflows, not the operator happy path
- Never delete
forecast/uploads/runs/— artifacts are immutable products - Persona authoring/testing/export lives in
agentcy-voice; Briefs has no persona surface agentcy-measure calibrateis the single calibration surface (absorbed legacyagentcy-lab)- Voice personas live in
voice/personas/*.yaml; the CLI reads them directly from the repo (override viaAGENTCY_PERSONAS_DIRif needed) - Brand kits live at
brands/<name>/{BRAND.md, DESIGN.md, brand.yml, assets/}at the repo root; Studio auto-detects by walking up from CWD looking forbrands/<id>/BRAND.md - Forecast smoke
forecast.v1emits"smoke": trueand omitsconfidence— treat these forecasts as plumbing checks, not real predictions
Each protocol artifact carries the same agentcy-* name in both writer.repo and writer.module:
voice_pack.v1→agentcy-voicebrief.v1→agentcy-briefsforecast.v1→agentcy-forecastrun_result.v1→agentcy-studioperformance.v1→agentcy-measure
Python module imports match these names with underscores: agentcy_voice, agentcy_briefs, agentcy_forecast, agentcy_measure.