CLI command
icp
Ideal customer profiles kept as versions: list, compare, create, edit and retire.
Invocation#
echo-cli icp list --product <id>
echo-cli icp show --product <id> --name <name>
echo-cli icp create --product <id> --name <name> --persona <text> [--attribute <key>=<value>]... [--pain <text>]... [--exclude <text>]... --by <name>
echo-cli icp edit --product <id> --name <name> [--persona <text>] [--attribute <key>=<value>]... [--pain <text>]... [--exclude <text>]... --by <name>
echo-cli icp retire --product <id> --name <name> --by <name>Inputs and output#
JSON. list writes the latest version of each of the product's profiles; show writes every version of one, newest first, each with generation_runs, the blog generation runs written for that version, newest first. Each version has id, product_id, name, version, persona, firmographics (named attributes), pains, exclusions, created_by, created_at, and retired_by and retired_at (null until retired). create, edit and retire write the version they wrote or stamped.
State effect#
Every verb calls Echo Web's authenticated /api/analytics/icp or /api/analytics/icp/retire with ECHO_INTERNAL_BEARER at ECHO_WEB_BASE_URL; the Ideal customer profiles section of the tracking screen and the Ideal customer profiles section of Echo Desktop's GEO screen call the same operations and compare a profile's versions side by side with the generation runs written for each (the Desktop's Edit sends only the fields typed, so an empty field keeps the latest value), and echo-mcp reads profiles (echo_list_icp_profiles, echo_icp_profile_versions) but cannot change them. A profile is named within its product. create writes version 1; --attribute, --pain and --exclude repeat once per entry, and a list none of whose flags is given is stored empty. edit writes the next version from the latest one with only the fields it names: --persona replaces the persona and the flags of a list replace that whole list, while a list none of whose flags is given is carried over. No version is ever overwritten, so show always holds every earlier version. retire stamps the latest version with who retired it and when; a retired profile stays readable and takes no further edit. The generators write for the profiles in force — each profile's latest version not retired: a blog generation run of a surface that answers to the product (echo-cli glossary surface) is planned, drafted and revised for their personas, firmographics, pains and exclusions and keeps every version it read in blog_generation_profiles, which show answers as generation_runs; and a draft crafted from an AI: brief for a campaign that speaks for the product (echo-cli email brand) is written for them beside the approved messaging. A product with no profile in force gives them none.
Refusals#
- A wrong invocation is refused before anything is sent: "icp takes <every verb's usage, separated by semicolons>; got <word>", "icp <verb> does not take <flag>; it takes …", "<flag> needs a value", "icp <verb> needs <flag>" for each flag the verb needs, and "--attribute takes <key>=<value>, such as industry=fintech; got <text>".
- Echo Web answers a bad request with "product_id is required: …", "name is required: …", "persona is required: who the profile buys as, in words", "firmographics must be an object of named attributes …", "firmographics.<key> must be a non-empty string", "pains must be an array of the problems the persona has; [] when none are stated", "exclusions must be an array of who is not a fit; [] when none are stated", "pains[<n>] must be a non-empty string" (and exclusions[<n>]), "an edit changes at least one of persona, firmographics, pains, exclusions", "profile <name> was retired by <who> at <time>; a retired profile takes no edit", "profile <name> was already retired by <who> at <time>" or "created_by is required: an internal caller has no signed-in user, so it names who is acting" (edited_by, retired_by); not found with "no product has id <id>; echo-cli products lists the ones that exist" or "product <id> has no profile named <name>; echo-cli icp list --product <id> lists them"; and a conflict with "product <id> already has a profile named <name>; echo-cli icp edit adds a version to it", "profile <name> reached version <n> while this write ran; read it with echo-cli icp show and edit again" or "profile <name> was retired while this retire ran; read it with echo-cli icp show". The command prints Echo Web's sentence and exits non-zero.