Командалар анықтамалығы
zinnector --help тізімдеген тәртіппен барлық 36 пәрмен. «Жаздырылып алынды» деп белгіленген шығыстар осы нұсқаның нақты жұмысынан көшірілді; қалғандары мысал мәндері бар пәрмен шығаратын дәл пішінді көрсетеді — сіздің домендеріңіз, идентификаторларыңыз және көрсеткіштеріңіз өзгеше болады.
Жаһандық опциялар, кез келген команданың алдында қабылданады:
| Параметр | Қызметі |
|---|
-V, --version | print the version |
--profile <name> | use a named credential profile |
-h, --help | Кез келген пәрменнің көмегін көрсету. |
zinnector new
scaffold a WordPress project you can run immediately
zinnector new [options] [name]
| Аргумент | Міндетті | Қызметі |
|---|
name | жоқ | |
| Параметр | Қызметі | Әдепкілік |
|---|
-t, --template <kind> | one of: site, plugin, theme | "site" |
--php <version> | PHP version to develop against | "8.3" |
--wp <version> | WordPress version for the local runtime | "latest" |
--runtime <name> | playground or docker | "playground" |
--here | scaffold into the current directory instead of a new one | |
Мысал
zinnector new my-site
Көріп тұрғаныңыз — captured — 0.1.2 on Linux
Created my-site · site
──────────────────────────
+ .gitignore
+ README.md
+ wp-content/mu-plugins/000-zinnector-dev.php
+ wp-content/plugins/.gitkeep
+ wp-content/themes/.gitkeep
+ zinnector.json
php 8.3
wordpress latest
runtime playground
→ run it:
cd my-site
zinnector dev
→ then, when you have a hosting slot:
zinnector link # point it at a site
zinnector check # pre-flight before you push
zinnector pushzinnector dev
run this project locally — no Docker required
zinnector dev [options]
| Параметр | Қызметі | Әдепкілік |
|---|
--php <version> | PHP version to run (5.2–8.5 on playground, 7.4–8.5 on docker) | |
--wp <version> | WordPress version | |
-p, --port <port> | port to serve on | |
--runtime <name> | playground (default) or docker | |
--login | log in as admin automatically | true |
--no-login | do not log in automatically | |
--once | boot, report what is running, then stop | |
--yes | install the local runtime without asking | |
--reset-runtime | delete the installed runtime and install it again | |
-v, --verbose | show the runtime's own output | |
Мысал
cd my-site
zinnector dev
Көріп тұрғаныңыз — captured — 0.1.2. The first run asks once to download the WordPress runtime (~570 MB); pass --yes to skip the question
my-site · WordPress Playground (WASM, no Docker)
───────────────────────────────────────────────────
serving a WordPress project
from /home/you/my-site
php 8.3
wordpress latest
✔ running at http://127.0.0.1:9400
admin: http://127.0.0.1:9400/wp-admin (already signed in)
Ctrl-C to stop
zinnector login
sign in — with your own account in the browser, or with an API key
zinnector login [options]
| Параметр | Қызметі | Әдепкілік |
|---|
--profile <name> | store under a named profile | "default" |
--api <url> | API base URL | "https://api.zinndigital.com" |
--api-key | paste a per-organisation API key instead of signing in as yourself | |
--issuer <url> | the sign-in service | "https://auth.zinndigital.com/realms/zinn" |
--no-browser | print the sign-in link without trying to open a browser | |
Мысал
zinnector login
Көріп тұрғаныңыз — the key is typed at the prompt, never on the command line. In CI, pipe it: echo "$ZINN_API_KEY" | zinnector login --profile ci
Sign in to Zinn Digital · https://api.zinndigital.com
────────────────────────────────────────────────────
API key: ••••••••••••••••••••••••••••
✔ signed in as you@example.com (Acme Ltd) — profile “default”
→ next: zinnector sites
zinnector logout
forget a stored sign-in
zinnector logout [options]
| Параметр | Қызметі | Әдепкілік |
|---|
--profile <name> | which profile to forget | "default" |
Мысал
zinnector logout
Көріп тұрғаныңыз
✔ signed out of profile “default”
zinnector whoami
show who this CLI is signed in as, and what it can reach
zinnector whoami [options]
| Параметр | Қызметі | Әдепкілік |
|---|
--profile <name> | use a named profile | |
--scopes | list the permissions an API key carries | |
--json | machine-readable output | |
Мысал
zinnector whoami --scopes
Көріп тұрғаныңыз
Signed in · https://api.zinndigital.com
─────────────────────────────────────────
key zdk_live_…3f9a
organisation Acme Ltd
profile default
· sites.read
· sites.deploy
· dns.manage
zinnector sites
list the sites this key can see
zinnector sites [options]
| Параметр | Қызметі | Әдепкілік |
|---|
--json | machine-readable output | |
--status <status> | only sites in this status | |
Мысал
zinnector sites
Көріп тұрғаныңыз
Sites · 2
───────────
domain status php target id
example.com active php 8.3 fleet 01a03f39-730a-7dc4-84b0-5d4f7582dd04
shop.test active php 8.2 fleet 01a03f39-9c11-7b02-a7e0-2e4d0c5f1b77
zinnector status
everything the platform knows about one site
zinnector status [options] [site]
| Аргумент | Міндетті | Қызметі |
|---|
site | жоқ | |
| Параметр | Қызметі | Әдепкілік |
|---|
--json | machine-readable output | |
Мысал
zinnector status example.com
Көріп тұрғаныңыз
example.com · 01a03f39-730a-7dc4-84b0-5d4f7582dd04
────────────────────────────────────────────────────
status active
product line mainstream
stack wordpress
● PHP
version 8.3
applied yes
● Quota
disk 412 MB of 10 GB
files 18,204 of 250,000
● Deploy
repository acme/example-site (main)
last 2 hours ago — success
zinnector share
give one person access to ONE site — a developer, a designer, a client
zinnector share [options] <site> <email>
| Аргумент | Міндетті | Қызметі |
|---|
site | Иә | |
email | Иә | |
| Параметр | Қызметі | Әдепкілік |
|---|
--role <role> | what they may do: viewer, editor, manager | |
--reason <text> | why they need it — kept with the grant for the audit trail | |
--until <date> | when access ends on its own (YYYY-MM-DD); omit for until-revoked | |
--json | machine-readable output | |
Мысал
zinnector share example.com dev@agency.test --role editor --reason "rebuild the checkout"
Көріп тұрғаныңыз — the exact shape the command prints, from the source (W40-DEVTOOL added these after this file was last captured); your domains, ids and dates will differ
Shared example.com · 01a03f39-730a-7dc4-84b0-5d4f7582dd04
────────────────────────────────────────────────────────────
✔ invited dev@agency.test as editor
They have no account yet, so an invitation has been emailed. Until they
sign in and accept it they can see nothing; the moment they do, the site is theirs.
→ what they do next, on their own machine:
npm i -g zinnector && zinnector login # sign in as themselves
zinnector clone example.com # pull the files down
zinnector collaborators
who has been given access to a site, and whether they have accepted
zinnector collaborators [options] [site]
| Аргумент | Міндетті | Қызметі |
|---|
site | жоқ | |
| Параметр | Қызметі | Әдепкілік |
|---|
--json | machine-readable output | |
Мысал
zinnector collaborators example.com
Көріп тұрғаныңыз — the exact shape the command prints, from the source (W40-DEVTOOL added these after this file was last captured); your domains, ids and dates will differ
Access to example.com · 2
────────────────────────────
who role status ends why grant
dev@agency.test editor invited — not yet accepted — rebuild the checkout 01a03f39-9c11-7b02-a7e0-2e4d0c5f1b77
ana@studio.test viewer active until 2026-12-31 quarterly audit 01a03f39-af52-7e19-93c1-6b0d2a7c4e11
zinnector unshare
take a person's access to a site back — by email or grant id
zinnector unshare [options] <site> <who>
| Аргумент | Міндетті | Қызметі |
|---|
site | Иә | |
who | Иә | |
| Параметр | Қызметі | Әдепкілік |
|---|
--yes | do not ask | |
Мысал
zinnector unshare example.com dev@agency.test --yes
Көріп тұрғаныңыз — the exact shape the command prints, from the source (W40-DEVTOOL added these after this file was last captured); your domains, ids and dates will differ
✔ withdrew the invitation to dev@agency.test
zinnector invitations
the invitations waiting for you, and accept one
zinnector invitations [options] [command]
Мысал
zinnector invitations
Көріп тұрғаныңыз — the exact shape the command prints, from the source (W40-DEVTOOL added these after this file was last captured); your domains, ids and dates will differ; with no subcommand it runs `list`
Invitations · 1
──────────────────
Acme Ltd has shared example.com with you as editor 01a03f39-9c11-7b02-a7e0-2e4d0c5f1b77
→ accept one: zinnector invitations accept <id>
zinnector invitations list
invitations addressed to the account you are signed in as
zinnector invitations list [options]
| Параметр | Қызметі | Әдепкілік |
|---|
--json | machine-readable output | |
Мысал
zinnector invitations list
Көріп тұрғаныңыз — the exact shape the command prints, from the source (W40-DEVTOOL added these after this file was last captured); your domains, ids and dates will differ
Invitations · 1
──────────────────
Acme Ltd has shared example.com with you as editor 01a03f39-9c11-7b02-a7e0-2e4d0c5f1b77
→ accept one: zinnector invitations accept <id>
zinnector invitations accept
accept an invitation — the site is yours the moment this returns
zinnector invitations accept [options] <id>
| Аргумент | Міндетті | Қызметі |
|---|
id | Иә | |
Мысал
zinnector invitations accept 01a03f39-9c11-7b02-a7e0-2e4d0c5f1b77
Көріп тұрғаныңыз — the exact shape the command prints, from the source (W40-DEVTOOL added these after this file was last captured); your domains, ids and dates will differ
✔ you now have access to example.com
zinnector link
point this project at a hosting slot (and connect its repository)
zinnector link [options] [site]
| Аргумент | Міндетті | Қызметі |
|---|
site | жоқ | |
| Параметр | Қызметі | Әдепкілік |
|---|
--repo <owner/name> | connect this repository to the site on the platform | |
--provider <github|gitlab> | git provider, when it cannot be inferred | |
--branch <name> | branch a push deploys from | |
--no-repo | only write zinnector.json; do not touch the platform | |
Мысал
zinnector link example.com --repo acme/example-site --branch main
Көріп тұрғаныңыз
✔ this project deploys to example.com (01a03f39-730a-7dc4-84b0-5d4f7582dd04)
written to zinnector.json — commit it so everyone deploys to the same slot
✔ the platform will deploy acme/example-site (main)
→ next: zinnector check
zinnector pull
pull a hosted site's files into this project for local dev — and re-run to re-sync
zinnector pull [options] [site]
| Аргумент | Міндетті | Қызметі |
|---|
site | жоқ | |
| Параметр | Қызметі | Әдепкілік |
|---|
--via <seam> | auto (default), git, or backup | "auto" |
--fresh | take a new backup rather than using the latest one (spends an on-demand slot) | |
--max-age <hours> | accept the latest backup if it is younger than this | "24" |
--full | the whole document root, WordPress core included (default: wp-content only) | |
--no-uploads | leave wp-content/uploads (media) behind | |
--live-config | also write wp-config.php — it holds the LIVE database credentials | |
--clean | empty wp-content before extracting, so deletions on the site are mirrored | |
--dry-run | say what would happen and stop | |
--yes | do not ask | |
Мысал
zinnector pull
Көріп тұрғаныңыз
Pull example.com · 01a03f39-730a-7dc4-84b0-5d4f7582dd04
─────────────────────────────────────────────────────────────
● via git — the site syncs to its own repository and this is a clone of it
✔ fast-forwarded 3 commits 4f1c2a9b → 9d2e7c14
● not synced, and why
✖ database the local playground has its own; the site's is not copied
✖ offloaded media objects in storage are not in the site's files
✖ anything outside the repository only wp-content syncs
→ next: zinnector dev
zinnector clone
make a local project from a hosted site: clone its repository or pull its files
zinnector clone [options] <site> [dir]
| Аргумент | Міндетті | Қызметі |
|---|
site | Иә | |
dir | жоқ | |
| Параметр | Қызметі | Әдепкілік |
|---|
--via <seam> | auto (default), git, or backup | "auto" |
--fresh | take a new backup rather than using the latest one | |
--full | the whole document root, WordPress core included | |
--no-uploads | leave wp-content/uploads (media) behind | |
--live-config | also write wp-config.php — it holds the LIVE database credentials | |
--yes | do not ask | |
Мысал
zinnector clone client.example.com
Көріп тұрғаныңыз
Clone client.example.com · client.example.com
──────────────────────────────────────────────────────
✔ wrote client.example.com/zinnector.json (php 8.3, wordpress 6.7.1)
● via backup — the site does not sync to a repository
✔ downloaded 214 MB and extracted wp-content
● not synced, and why
✖ database the local playground has its own; the site's is not copied
✖ offloaded media objects in storage are not in the site's files
✖ wp-config.php holds the live database credentials (--live-config to write it)
✖ WordPress core the runtime supplies the version the slot runs (--full to take it)
→ next: zinnector dev
→ run it:
cd client.example.com
zinnector devzinnector check
compare this project against the slot you are about to deploy to
zinnector check [options] [site]
| Аргумент | Міндетті | Қызметі |
|---|
site | жоқ | |
| Параметр | Қызметі | Әдепкілік |
|---|
--probe | boot the local runtime and MEASURE its php, rather than trusting zinnector.json | |
--all | show passing checks too | |
--strict | also fail when something could not be checked | |
--json | machine-readable output | |
Мысал
zinnector check
Көріп тұрғаныңыз — captured from a real run against a slot on PHP 7.4 — the whole point of the command
Pre-flight — example.com · 01a03f39-730a-7dc4-84b0-5d4f7582dd04
──────────────────────────────────────────────────────────────────
local php 8.3 1,284 files, 12.4 MB
slot php 7.4.33 target fleet
local php is the version DECLARED in zinnector.json — run with --probe to measure it
✖ high php 8.3 locally, 7.4 on the slot
You built against PHP 8.3, which is newer than the PHP 7.4 the
slot runs. Code that uses syntax or functions added after the
slot's version will fatal at runtime, not at deploy time.
try zinnector php 8.3
⚠ warn the slot runs php 7.4, which is past end of life
try zinnector php --list
? unknown local php extensions could not be enumerated
try zinnector dev --once
5 passed · 3 to look at · 2 could not be checked
none of this blocks a deploy — zinnector push --force proceeds anywayzinnector push
pre-flight, push your commits, and deploy
zinnector push [options] [site]
| Аргумент | Міндетті | Қызметі |
|---|
site | жоқ | |
| Параметр | Қызметі | Әдепкілік |
|---|
-f, --force | deploy even when pre-flight has findings | |
--skip-checks | do not run pre-flight at all | |
--probe | measure the local runtime during pre-flight instead of trusting zinnector.json | |
--no-wait | trigger the deploy and exit without watching it | |
--no-git | do not run git push; deploy whatever the platform already has | |
--dry-run | do everything except the deploy | |
Мысал
zinnector push
Көріп тұрғаныңыз
Deploy to example.com · 01a03f39-730a-7dc4-84b0-5d4f7582dd04
───────────────────────────────────────────────────────────────
✔ pre-flight: 8 passed · 0 to look at · 2 could not be checked
→ pushing main (4f1c2a9b add the contact form)
✔ pushed
● deploy 7c0e… started — watching
✔ deployed 4f1c2a9b in 48s
status success
commit 4f1c2a9b
url https://example.com
zinnector deploy
redeploy what the platform already has, without pushing
zinnector deploy [options] [site]
| Аргумент | Міндетті | Қызметі |
|---|
site | жоқ | |
| Параметр | Қызметі | Әдепкілік |
|---|
--no-wait | trigger and exit | |
Мысал
zinnector deploy example.com
Көріп тұрғаныңыз
Redeploy example.com · 01a03f39-730a-7dc4-84b0-5d4f7582dd04
───────────────────────────────────────────────────────────────
● deploy 7c0e… started — watching
✔ deployed 4f1c2a9b in 41s
zinnector deploys
a site's deploy history
zinnector deploys [options] [site]
| Аргумент | Міндетті | Қызметі |
|---|
site | жоқ | |
| Параметр | Қызметі | Әдепкілік |
|---|
--json | machine-readable output | |
-n, --limit <n> | how many to show | "10" |
Мысал
zinnector deploys example.com
Көріп тұрғаныңыз
Deploys — example.com · 3
───────────────────────────
status commit branch trigger started message
success 4f1c2a9b main cli 2 hours ago add the contact form
success b21d70e4 main push yesterday fix footer links
failed 9e8a0c13 main push 3 days ago build: composer install exited 1
zinnector php
show or switch a site's PHP version
zinnector php [options] [version]
| Аргумент | Міндетті | Қызметі |
|---|
version | жоқ | |
| Параметр | Қызметі | Әдепкілік |
|---|
-s, --site <site> | site id or domain | |
--list | list the versions the platform offers | |
--json | machine-readable output | |
Мысал
zinnector php 8.3 --site example.com
Көріп тұрғаныңыз — with no version it shows the current one; --list shows what the platform offers for this site's product line
PHP — example.com
─────────────────
version 7.4 → 8.3
applied the machine will confirm shortly
switch example.com to php 8.3? [y/N] y
✔ php 8.3 requested
⚠ recorded, but the machine has not confirmed it yet
zinnector quota
disk, files and database usage against what the plan grants
zinnector quota [options] [site]
| Аргумент | Міндетті | Қызметі |
|---|
site | жоқ | |
| Параметр | Қызметі | Әдепкілік |
|---|
--json | machine-readable output | |
Мысал
zinnector quota example.com
Көріп тұрғаныңыз
Quota — example.com
───────────────────
disk 412 MB of 10 GB (4%)
files 18,204 of 250,000 (7%)
database 38 MB of 1 GB (4%)
zinnector db
database size, and single-use links into phpMyAdmin and the file manager
zinnector db [options] [site]
| Аргумент | Міндетті | Қызметі |
|---|
site | жоқ | |
| Параметр | Қызметі | Әдепкілік |
|---|
--json | machine-readable output | |
Мысал
zinnector db example.com
Көріп тұрғаныңыз — the phpMyAdmin and file-manager links are single-use and expire; do not paste them anywhere
Database — example.com
──────────────────────
engine mariadb 10.11
size 38 MB
phpmyadmin https://…/pma/sso?token=… (single use)
files https://…/files/sso?token=… (single use)
zinnector logs
tail a site's access and error logs
zinnector logs [options] [site]
| Аргумент | Міндетті | Қызметі |
|---|
site | жоқ | |
| Параметр | Қызметі | Әдепкілік |
|---|
--access | only the access log | |
--error | only the error log | |
--build | the build log of the most recent deploy instead | |
--json | machine-readable output | |
Мысал
zinnector logs example.com --error
Көріп тұрғаныңыз — --access for the access log, --build for the last deploy's build log; with no flag both site logs are shown
Error log — example.com
───────────────────────
[06-Sep-2026 10:12:44 UTC] PHP Warning: Undefined variable $x in /wp-content/plugins/my-plugin/my-plugin.php on line 12
zinnector wp
run an allow-listed WP-CLI command on a site
zinnector wp [options] <command...>
| Аргумент | Міндетті | Қызметі |
|---|
command... | Иә | |
| Параметр | Қызметі | Әдепкілік |
|---|
-s, --site <site> | site id or domain | |
--commands | list what the platform will run | |
--json | machine-readable output | |
Мысал
zinnector wp plugin list --site example.com
Көріп тұрғаныңыз — the allow-list is served by the platform — zinnector wp --commands prints it
+-----------------+----------+--------+---------+
| name | status | update | version |
+-----------------+----------+--------+---------+
| my-plugin | active | none | 1.0.0 |
| zinn-cache | active | none | 2.4.1 |
+-----------------+----------+--------+---------+
zinnector backup
list and take site backups
zinnector backup [options] [command]
Мысал
zinnector backup list example.com
`backup` on its own prints its subcommands; see `backup list` and `backup now` below
zinnector backup list
list a site's backups and what its plan grants
zinnector backup list [options] [site]
| Аргумент | Міндетті | Қызметі |
|---|
site | жоқ | |
| Параметр | Қызметі | Әдепкілік |
|---|
--json | machine-readable output | |
Мысал
zinnector backup list example.com
Көріп тұрғаныңыз
Backups — example.com · 3
───────────────────────────
status taken size id
complete today 03:00 412 MB bk_01a0…
complete yesterday 410 MB bk_019f…
complete 2 days ago 409 MB bk_019e…
retention 30 days
off-site yes
zinnector backup now
take an on-demand backup
zinnector backup now [options] [site]
| Аргумент | Міндетті | Қызметі |
|---|
site | жоқ | |
Мысал
zinnector backup now example.com
Көріп тұрғаныңыз
✔ backup started — zinnector backup list example.com shows it when it completes
zinnector domains
list the domains this key can see
zinnector domains [options]
| Параметр | Қызметі | Әдепкілік |
|---|
--json | machine-readable output | |
Мысал
zinnector domains
Көріп тұрғаныңыз
Domains · 2
─────────────
domain status registrar renewal expires
example.com active zinn auto 2027-03-14
shop.test active external — —
zinnector dns
read and change DNS records
zinnector dns [options] [command]
Мысал
zinnector dns list example.com
`dns` on its own prints its subcommands; see `dns list`, `dns add` and `dns rm` below
zinnector dns list
list a domain's DNS records
zinnector dns list [options] <domain>
| Аргумент | Міндетті | Қызметі |
|---|
domain | Иә | |
| Параметр | Қызметі | Әдепкілік |
|---|
--type <type> | only records of this type | |
--json | machine-readable output | |
Мысал
zinnector dns list example.com
Көріп тұрғаныңыз
DNS — example.com · 4 records
───────────────────────────────
type name value ttl
A @ 203.0.113.10 300 rec_7f…
A www 203.0.113.10 300 rec_80…
MX @ 10 mail.example.com 3600 rec_81…
TXT @ "v=spf1 -all" 3600 rec_82…
zinnector dns add
create a DNS record
zinnector dns add [options] <domain> <type> <name> <value>
| Аргумент | Міндетті | Қызметі |
|---|
domain | Иә | |
type | Иә | |
name | Иә | |
value | Иә | |
| Параметр | Қызметі | Әдепкілік |
|---|
--ttl <seconds> | time to live | "3600" |
--priority <n> | priority, for MX and SRV | |
--proxied | route through the CDN | |
-y, --yes | do not ask | |
Мысал
zinnector dns add example.com TXT _acme "token" --ttl 300
Көріп тұрғаныңыз — the record is shown and confirmed before it is written; pass --yes to skip the question
Add a DNS record to example.com
───────────────────────────────
type TXT
name _acme
value "token"
ttl 300
create it? [y/N] y
✔ created TXT _acme
zinnector dns rm
delete a DNS record
zinnector dns rm [options] <domain> <recordId>
| Аргумент | Міндетті | Қызметі |
|---|
domain | Иә | |
recordId | Иә | |
| Параметр | Қызметі | Әдепкілік |
|---|
-y, --yes | do not ask | |
Мысал
zinnector dns rm example.com rec_7f3a
Көріп тұрғаныңыз
⚠ deleting A @ 203.0.113.10 from example.com
delete it? [y/N] y
✔ deleted
zinnector mail
list mail services
zinnector mail [options]
| Параметр | Қызметі | Әдепкілік |
|---|
--json | machine-readable output | |
Мысал
zinnector mail
Көріп тұрғаныңыз
Mail services · 1
───────────────────
domain status provider mailboxes dns
example.com active zinn 3 ok
zinnector bulk
run one operation across many sites (cache_purge, malware_scan, sitemap, block_ip)
zinnector bulk [options] <operation>
| Аргумент | Міндетті | Қызметі |
|---|
operation | Иә | |
| Параметр | Қызметі | Әдепкілік |
|---|
--all | every site this key can see | |
--site <site...> | specific sites, by id or domain | |
--status <status> | every site in this status | |
-y, --yes | do not ask | |
--json | machine-readable output | |
Мысал
zinnector bulk cache_purge --all
Көріп тұрғаныңыз — one call to the platform for the whole selection, not one per site; the selection is shown and confirmed first
Bulk cache_purge · 2 sites
────────────────────────────
· example.com
· shop.test
run cache_purge on 2 sites? [y/N] y
✔ cache_purge queued for 2 sites
zinnector ai
ask the Zinn Digital assistant, with this project as context
zinnector ai [options] <question...>
| Аргумент | Міндетті | Қызметі |
|---|
question... | Иә | |
| Параметр | Қызметі | Әдепкілік |
|---|
-s, --site <site> | ask about a particular site | |
--no-context | do not send anything about the local project | |
--json | machine-readable output | |
Мысал
zinnector ai "why is my deploy failing?"
Көріп тұрғаныңыз — runs on the platform against your own account; from inside a project it sends the project's shape and site id, never file contents
Zinn Digital assistant
──────────────────────
Your last deploy of example.com failed at the build step: `composer install` exited 1 because
`vendor/` is committed alongside a lock file that no longer matches it. Remove `vendor/` from
the repository or run `composer update` and commit the new lock file, then `zinnector push`.