adapto:project-define
The most important setup step: it builds the project's brain — the local, multi-file knowledge base at
.adapto/project/ (see studio.md §2) that every content skill reads to stay
on-brand and on-scope. It works by deep guided discovery: a short, skippable interview for the things only
you know, then active research (your existing site + competitors + an initial keyword universe) to fill
in the rest. A flattened summary is stored in the CMS as _adapto_project_config; the rich facets stay
local. The whole step is optional — skills work without it, just less sharply.
When to use
- Setting up a project and you want the agent to deeply understand it before researching or writing content.
- Triggers: "define my project", "build the project brain", "tell Adapto about my product/brand/voice".
- Re-run to refresh the brain after big changes (it reconciles, never blindly clobbers your edits).
When not to use
- Consolidating findings you've already gathered while working →
adapto:project-learn.
- You'd rather not answer anything → skip it; content skills fall back to neutral defaults.
- Just checking the environment →
adapto:doctor.
Inputs
- A short interview (every question optional, pickable options + free-form, asked one at a time) for the
human-only facts: project type → what it does → audience/ICPs (pains, jobs-to-be-done) → brand voice →
writing do's & don'ts → one-line pitch → named competitors (URLs welcome) → your existing site URL (if any).
- Research inputs the interview unlocks: competitor URLs, your site URL, and any files you drop into
.adapto/sources/ (keyword lists, Search Console exports, notes) — all optional.
- The tenant's language (
adapto auth orgs --json) for the CMS summary.
Outputs
- The filled
.adapto/project/ brain: identity, audience, voice, glossary, competitors,
pillars, seo, inventory, INDEX, open-questions (+ a seeded learnings.md and a cadence.md stub).
- The CMS
_adapto_project_config collection with a one-item summary (identity + audience + voice + pitch), status draft.
- A read-only cache at
.adapto/project.md.
- Next step:
adapto:schema-design — propose the content schema from the brain you just built.
Discovery (the LLM + research step)
Three moves; everything is skippable; narrate briefly as you go (conventions.md §10):
Interview — human-only facts, one question at a time. Offer "skip all" up front. Tailor each question's
examples to prior answers (don't offer fintech verticals to a food blog). Cover, in order: project type
→ what it does (one sentence — grounds everything) → audience/ICPs (who, their pains,
jobs-to-be-done) → brand voice → do's & don'ts → one-line pitch (draft it from the answers; the
user confirms) → named competitors (URLs if handy) → existing site URL (if any). Stop as soon as the
user is done.
Research — dispatch adapto-researcher in parallel (one angle each; it returns cited findings and
never writes content — sub-agents.md):
- your site URL → crawl for existing pages/URLs → the internal-link inventory;
- each named competitor → positioning, notable content, gaps → competitors;
- type + what-it-does + audience → an initial keyword universe + search intent + AEO questions →
seo, and candidate content pillars → pillars;
- anything unresolved → open-questions.
Proactively offer: "drop any keyword lists / Search Console exports into
.adapto/sources/ and I'll fold
them in." Skip research entirely if the user prefers interview-only.
Synthesize the interview + research into every brain facet (Sonnet-class). Be proactive — surface
domain-relevant content ideas and angles, not just recorded answers. Before writing, batch-read any
facet that already exists (a re-run, or a brain the user has hand-edited) in a single call — the harness
blocks a Write to an unread existing file, and you must merge with what's there rather than replace it
(conventions §15). On a first run after adapto:scaffold the directory is empty, so there's nothing to
read and the writes are clean. Seed learnings.md with a dated
"discovery" entry; write a cadence.md stub (unset by default; optionally ask target volume/day/pillars).
Preconditions
- Preflight with the
adapto:doctor checks.
- Authenticated CLI + a selected tenant (the CMS summary write needs it; confirm the working tenant — never assume the active one).
- The
.adapto/ workspace should exist (created by adapto:scaffold, with project/ empty); if missing,
create the directories first — no stub facets, this skill writes the real ones.
adapto CLI >= 0.1.3.
Plan phase
After discovery (interview + research), before any writes, print a machine-parseable plan and ask as a
pickable question (Approve / Change something / Discuss this, plus free-form):
- The brain facets to be written, with a one-line summary of each (so the user sees what was learned).
- The CMS
_adapto_project_config summary fields + values (identity/audience/voice/pitch), draft.
- Whether
_adapto_project_config already exists (reuse) or will be created, and the slug used.
- The cache
.adapto/project.md. No cost/token figures. If the user skipped everything → nothing to
apply; say so and stop.
Apply phase
Runs only after approval. Research already happened (read-only); now write:
- Brain files — write/update each
.adapto/project/*.md facet from the synthesis. Reconcile, don't
clobber: if a facet already holds user content, merge rather than overwrite.
- Resolve language —
adapto auth orgs --json → the active tenant's first enabled code, verbatim.
- CMS summary — find or create
_adapto_project_config:
adapto collections get-by-slug _adapto_project_config --json → reuse its id if present.
- else
adapto collections create --name "Adapto Project Config" --slug _adapto_project_config --description "Project context summary for Adapto agent skills" --language <lang> --status draft --fields-json '<fields below>'.
- ⚠️ Reserved-slug fallback: if
_adapto_ is rejected, retry once with adapto-project-config; record which slug worked.
- Write the summary item:
adapto collections items create <id> --title "Project Config" --slug project-config --language <lang> --status draft --data-json '<summary>' (or items update if it exists).
- Cache
.adapto/project.md (read-only): the summary + the slug used + a pointer to the local brain.
- Report the brain facets written + the CMS collection/item ids. (No
--source — collections/items have no provenance.)
- Next step:
adapto:schema-design.
Fields (FieldDefinitionModel[] — the CMS summary, not the whole brain):
[
{"name":"project_type","label":"Project type","type":"text"},
{"name":"summary","label":"What it does (one-sentence purpose + scope)","type":"textarea"},
{"name":"vertical","label":"Vertical / industry","type":"text"},
{"name":"icps","label":"Target audience / ICPs","type":"textarea"},
{"name":"brand_voice","label":"Brand voice","type":"text"},
{"name":"tone_rules","label":"Writing do's and don'ts","type":"textarea"},
{"name":"value_prop","label":"One-line pitch (value proposition)","type":"textarea"}
]
The item's --data-json is the keyed summary; include only fields the interview/research produced.
Errors and recovery
- Not authenticated / no tenant → stop the CMS write; offer both auth paths —
Log in or Register (conventions §11) — then switch-tenant.
The brain is local, so you may still write it and defer the summary until login if the user wants.
_adapto_ slug rejected → auto-retry adapto-project-config; if that also fails, surface the error and stop.
- Research yields little (no site, no competitors, thin web results) → proceed with the interview facts,
note the gaps in
open-questions.md, and don't fabricate.
- Config item already exists → update it; never duplicate.
- Language discovery fails → ask for a tenant-enabled code; don't guess.
adapto-researcher unavailable → fall back to interview-only; write the brain from the interview and log
research as an open question.
Forbidden actions
- Never write without an approved plan (plan-then-apply); never assume the working tenant.
- Never pad the interview or force answers — every question and the whole step is skippable.
- Never clobber brain facets the user has edited — reconcile/merge.
- Never write CMS content beyond
_adapto_project_config; the rich facets stay local.
- Never cache secrets into
.adapto/ (studio.md); never fabricate competitor facts — cite via the researcher.
- Plus the global list in forbidden-actions.md — notably: never delete CMS content (archive instead; conventions §9a).
1---2name: adapto-project-define3description: Build the project's "brain" — a rich, local multi-file knowledge base — through deep guided discovery (a short skippable interview plus active web/competitor/keyword research), and store a summary in Adapto as _adapto_project_config so every other skill writes on-brand. Plan-then-apply; fully optional.4---56# adapto:project-define78The most important setup step: it builds the project's **brain** — the local, multi-file knowledge base at9`.adapto/project/` (see [studio.md](../../shared/studio.md) §2) that every content skill reads to stay10on-brand and on-scope. It works by **deep guided discovery**: a short, skippable interview for the things only11you know, then **active research** (your existing site + competitors + an initial keyword universe) to fill12in the rest. A flattened **summary** is stored in the CMS as `_adapto_project_config`; the rich facets stay13local. The whole step is **optional** — skills work without it, just less sharply.1415## When to use16- Setting up a project and you want the agent to deeply understand it before researching or writing content.17- Triggers: "define my project", "build the project brain", "tell Adapto about my product/brand/voice".18- Re-run to refresh the brain after big changes (it reconciles, never blindly clobbers your edits).1920## When not to use21- Consolidating findings you've already gathered while working → `adapto:project-learn`.22- You'd rather not answer anything → skip it; content skills fall back to neutral defaults.23- Just checking the environment → `adapto:doctor`.2425## Inputs26- **A short interview** (every question optional, pickable options + free-form, asked one at a time) for the27 **human-only facts**: project type → what it does → audience/ICPs (pains, jobs-to-be-done) → brand voice →28 writing do's & don'ts → one-line pitch → named competitors (URLs welcome) → your existing site URL (if any).29- **Research inputs** the interview unlocks: competitor URLs, your site URL, and any files you drop into30 `.adapto/sources/` (keyword lists, Search Console exports, notes) — all optional.31- The tenant's language (`adapto auth orgs --json`) for the CMS summary.3233## Outputs34- The filled **`.adapto/project/` brain**: `identity`, `audience`, `voice`, `glossary`, `competitors`,35 `pillars`, `seo`, `inventory`, `INDEX`, `open-questions` (+ a seeded `learnings.md` and a `cadence.md` stub).36- The CMS **`_adapto_project_config`** collection with a one-item **summary** (`identity + audience + voice +37 pitch`), status `draft`.38- A read-only cache at `.adapto/project.md`.39- **Next step:** `adapto:schema-design` — propose the content schema from the brain you just built.4041## Discovery (the LLM + research step)42Three moves; everything is skippable; narrate briefly as you go ([conventions.md](../../shared/conventions.md) §10):43441. **Interview — human-only facts, one question at a time.** Offer "skip all" up front. Tailor each question's45 examples to prior answers (don't offer fintech verticals to a food blog). Cover, in order: project **type**46 → **what it does** (one sentence — grounds everything) → **audience/ICPs** (who, their pains,47 jobs-to-be-done) → **brand voice** → **do's & don'ts** → **one-line pitch** (draft it from the answers; the48 user confirms) → **named competitors** (URLs if handy) → **existing site URL** (if any). Stop as soon as the49 user is done.50512. **Research — dispatch `adapto-researcher` in parallel** (one angle each; it returns cited findings and52 never writes content — [sub-agents.md](../../shared/sub-agents.md)):53 - **your site URL** → crawl for existing pages/URLs → the internal-link **inventory**;54 - **each named competitor** → positioning, notable content, gaps → **competitors**;55 - **type + what-it-does + audience** → an initial **keyword universe** + search intent + AEO questions →56 **seo**, and candidate **content pillars** → **pillars**;57 - anything unresolved → **open-questions**.58 Proactively offer: "drop any keyword lists / Search Console exports into `.adapto/sources/` and I'll fold59 them in." Skip research entirely if the user prefers interview-only.60613. **Synthesize** the interview + research into every brain facet (Sonnet-class). Be proactive — surface62 domain-relevant content ideas and angles, not just recorded answers. **Before writing, batch-read any63 facet that already exists** (a re-run, or a brain the user has hand-edited) in a single call — the harness64 blocks a `Write` to an unread existing file, and you must merge with what's there rather than replace it65 (conventions §15). On a first run after `adapto:scaffold` the directory is empty, so there's nothing to66 read and the writes are clean. Seed `learnings.md` with a dated67 "discovery" entry; write a `cadence.md` stub (unset by default; optionally ask target volume/day/pillars).6869## Preconditions70- **Preflight** with the `adapto:doctor` checks.71- **Authenticated CLI + a selected tenant** (the CMS summary write needs it; confirm the **working tenant** — never assume the active one).72- The `.adapto/` workspace should exist (created by `adapto:scaffold`, with `project/` empty); if missing,73 create the directories first — no stub facets, this skill writes the real ones.74- `adapto` CLI `>= 0.1.3`.7576## Plan phase77After discovery (interview + research), **before any writes**, print a machine-parseable plan and ask as a78**pickable question** (`Approve` / `Change something` / `Discuss this`, plus free-form):79- The **brain facets** to be written, with a one-line summary of each (so the user sees what was learned).80- The **CMS `_adapto_project_config` summary** fields + values (identity/audience/voice/pitch), `draft`.81- Whether `_adapto_project_config` already exists (reuse) or will be created, and the slug used.82- The cache `.adapto/project.md`. No cost/token figures. If the user skipped everything → nothing to83 apply; say so and stop.8485## Apply phase86Runs only after approval. Research already happened (read-only); now write:87881. **Brain files** — write/update each `.adapto/project/*.md` facet from the synthesis. **Reconcile, don't89 clobber:** if a facet already holds user content, merge rather than overwrite.902. **Resolve language** — `adapto auth orgs --json` → the active tenant's first enabled code, verbatim.913. **CMS summary** — find or create `_adapto_project_config`:92 - `adapto collections get-by-slug _adapto_project_config --json` → reuse its id if present.93 - else `adapto collections create --name "Adapto Project Config" --slug _adapto_project_config --description "Project context summary for Adapto agent skills" --language <lang> --status draft --fields-json '<fields below>'`.94 - ⚠️ **Reserved-slug fallback:** if `_adapto_` is rejected, retry once with `adapto-project-config`; record which slug worked.95 - Write the summary item: `adapto collections items create <id> --title "Project Config" --slug project-config --language <lang> --status draft --data-json '<summary>'` (or `items update` if it exists).964. **Cache** `.adapto/project.md` (read-only): the summary + the slug used + a pointer to the local brain.975. **Report** the brain facets written + the CMS collection/item ids. (No `--source` — collections/items have no provenance.)986. **Next step:** `adapto:schema-design`.99100Fields (`FieldDefinitionModel[]` — the CMS **summary**, not the whole brain):101```json102[103 {"name":"project_type","label":"Project type","type":"text"},104 {"name":"summary","label":"What it does (one-sentence purpose + scope)","type":"textarea"},105 {"name":"vertical","label":"Vertical / industry","type":"text"},106 {"name":"icps","label":"Target audience / ICPs","type":"textarea"},107 {"name":"brand_voice","label":"Brand voice","type":"text"},108 {"name":"tone_rules","label":"Writing do's and don'ts","type":"textarea"},109 {"name":"value_prop","label":"One-line pitch (value proposition)","type":"textarea"}110]111```112The item's `--data-json` is the keyed summary; include only fields the interview/research produced.113114## Errors and recovery115- **Not authenticated / no tenant** → stop the CMS write; offer both auth paths — `Log in` or `Register` (conventions §11) — then `switch-tenant`.116 The brain is local, so you may still write it and defer the summary until login if the user wants.117- **`_adapto_` slug rejected** → auto-retry `adapto-project-config`; if that also fails, surface the error and stop.118- **Research yields little** (no site, no competitors, thin web results) → proceed with the interview facts,119 note the gaps in `open-questions.md`, and don't fabricate.120- **Config item already exists** → update it; never duplicate.121- **Language discovery fails** → ask for a tenant-enabled code; don't guess.122- **`adapto-researcher` unavailable** → fall back to interview-only; write the brain from the interview and log123 research as an open question.124125## Forbidden actions126- Never write without an approved plan (plan-then-apply); never assume the working tenant.127- Never pad the interview or force answers — every question and the whole step is skippable.128- Never **clobber** brain facets the user has edited — reconcile/merge.129- Never write CMS content beyond `_adapto_project_config`; the rich facets stay local.130- Never cache secrets into `.adapto/` (studio.md); never fabricate competitor facts — cite via the researcher.131- Plus the global list in [forbidden-actions.md](../../shared/forbidden-actions.md) — notably: **never delete CMS content** (archive instead; conventions §9a).