Repo structure¶
Overview¶
Unlike a task script, a protocol has no code — it’s declarative YAML plus a small identity file. This page covers repo naming, namespace choice, and the file layout a TetraScience-maintained protocol repo follows.
Namespace¶
Everything in the common namespace should be client-agnostic — the data model doesn’t vary between customers. A protocol whose behavior depends on customer-specific configuration or a vendor tool whose output format varies by installation belongs in client-<name> instead. Self-serve protocols always use private-<org>.
Slug¶
Situation |
Slug template |
Example |
|---|---|---|
Vendor-specific instrument model |
|
|
Vendor-specific software |
|
|
Industry-standard file type |
|
|
Repo naming and layout¶
Protocol repo name: ts[-client-<client-name>]-protocol-<slug>.
ts[-client-<client-name>]-protocol-<slug>/
protocol.yml
manifest.json
README.md
e2e_test_configuration.json
docs/
images/
File or folder |
Description |
|---|---|
|
|
|
Identity fields ( |
|
Customer-facing documentation — see README conventions |
|
See Testing |
|
Optional. Files linked from |
|
Optional. Images referenced from |
A self-service protocol (scaffolded via ts-cli init protocol) is a bare tree alongside a sibling task-script directory, with only protocol.yml and manifest.json — no README.md, docs/, or e2e_test_configuration.json are required, and repo-name validation is skipped entirely:
protocol/
protocol.yml
manifest.json
Either way, there is no Python, no pyproject.toml, no requirements.txt, and no package directory — a protocol is pure declarative configuration.
manifest.json¶
Field |
Required |
Notes |
|---|---|---|
|
yes |
Must be |
|
yes |
|
|
yes |
See the slug table above |
|
yes |
|
|
no |
Display title; conventionally matches the README’s title |
|
no |
— |
|
no |
|
|
no |
Must be exactly |
|
no |
Glob patterns; |
|
no |
Catalog applicability — populate with registered Tetra Catalog terms; an unregistered term fails the release build |
|
no |
Deprecated in favor of |
For a self-serve protocol, only type, namespace, slug, and version are required.
Values duplicated between manifest.json and protocol.yml (namespace, slug, version, etc.) must agree — the build only warns, it does not fail, on a mismatch.