Phase 7: serve the vet sample from the template tools and docs
- build.py: _TEMPLATE_COMPONENTS rewritten around the vet sample (53 kinds —
per-resource slices, jobs, worked appointment_reminder family, tests);
seed tokens dropped from the manifest ('sample: vet' instead)
- registry.py: get_app_component(kind) no longer renames item/example seeds;
prompts and tool docs updated to 'copy a slice and adapt'
- templates/README.md, 01_build_recipe, 40_ui_admin, wiki/03 updated off the
old seed scheme; repo inventory/config now exclude vet (docs move under
standards; react/vet itself is deleted in a later phase)
- regenerated MCP bundle, vendored templates, and site output
This commit is contained in:
@@ -927,58 +927,58 @@ environment-only; never commit them.</p>
|
||||
</span><span id="__span-3-15"><a id="__codelineno-3-15" name="__codelineno-3-15"></a><span class="k">-</span><span class="w"> </span>call <span class="sb">`find_library`</span> with <span class="sb">`db`</span>, <span class="sb">`di`</span>, <span class="sb">`routing`</span>, <span class="sb">`ingestion`</span>, <span class="sb">`pipeline`</span>, <span class="sb">`docs`</span>
|
||||
</span><span id="__span-3-16"><a id="__codelineno-3-16" name="__codelineno-3-16"></a> and note the Tier A libraries that already exist — never reimplement one;
|
||||
</span><span id="__span-3-17"><a id="__codelineno-3-17" name="__codelineno-3-17"></a><span class="k">-</span><span class="w"> </span>call <span class="sb">`list_app_components()`</span> and pull each file you need with
|
||||
</span><span id="__span-3-18"><a id="__codelineno-3-18" name="__codelineno-3-18"></a> <span class="sb">`get_app_component(kind, resource=..., family=...)`</span> instead of writing it from
|
||||
</span><span id="__span-3-19"><a id="__codelineno-3-19" name="__codelineno-3-19"></a> scratch.
|
||||
</span><span id="__span-3-20"><a id="__codelineno-3-20" name="__codelineno-3-20"></a>
|
||||
</span><span id="__span-3-21"><a id="__codelineno-3-21" name="__codelineno-3-21"></a><span class="gu">## Steps</span>
|
||||
</span><span id="__span-3-22"><a id="__codelineno-3-22" name="__codelineno-3-22"></a>
|
||||
</span><span id="__span-3-23"><a id="__codelineno-3-23" name="__codelineno-3-23"></a><span class="k">1.</span> <span class="gs">**Scaffold**</span> — copy <span class="sb">`standards/src/templates/app/`</span> into <span class="sb">`apps/<your-app>/`</span>
|
||||
</span><span id="__span-3-24"><a id="__codelineno-3-24" name="__codelineno-3-24"></a> (or pull the same tree via <span class="sb">`get_app_template`</span>). Keep the tree: <span class="sb">`domain/`</span>,
|
||||
</span><span id="__span-3-25"><a id="__codelineno-3-25" name="__codelineno-3-25"></a> <span class="sb">`infra/`</span>, <span class="sb">`interfaces/`</span>, <span class="sb">`pipelines/`</span>, <span class="sb">`tests/`</span>, <span class="sb">`scripts/`</span>, plus
|
||||
</span><span id="__span-3-26"><a id="__codelineno-3-26" name="__codelineno-3-26"></a> <span class="sb">`pyproject.toml`</span>, <span class="sb">`openapi.yaml`</span>, <span class="sb">`config.py`</span>, <span class="sb">`init.py`</span>, <span class="sb">`main.py`</span>,
|
||||
</span><span id="__span-3-27"><a id="__codelineno-3-27" name="__codelineno-3-27"></a> <span class="sb">`worker.py`</span>, <span class="sb">`Dockerfile`</span>, <span class="sb">`docker-compose.yaml`</span>, <span class="sb">`.env.example`</span>.
|
||||
</span><span id="__span-3-28"><a id="__codelineno-3-28" name="__codelineno-3-28"></a>
|
||||
</span><span id="__span-3-29"><a id="__codelineno-3-29" name="__codelineno-3-29"></a><span class="k">2.</span> <span class="gs">**Author the spec (app-specific)**</span> — write <span class="sb">`openapi.yaml`</span>: resources,
|
||||
</span><span id="__span-3-30"><a id="__codelineno-3-30" name="__codelineno-3-30"></a> schemas, <span class="sb">`operationId`</span>s, security, and extension metadata. This is the
|
||||
</span><span id="__span-3-31"><a id="__codelineno-3-31" name="__codelineno-3-31"></a> contract and drives all routing. Every operation MUST have an <span class="sb">`operationId`</span>.
|
||||
</span><span id="__span-3-32"><a id="__codelineno-3-32" name="__codelineno-3-32"></a>
|
||||
</span><span id="__span-3-33"><a id="__codelineno-3-33" name="__codelineno-3-33"></a><span class="k">3.</span> <span class="gs">**Generate the scaffold (codegen)**</span> — from the spec, generate the wire
|
||||
</span><span id="__span-3-34"><a id="__codelineno-3-34" name="__codelineno-3-34"></a> models and the exact handler signatures:
|
||||
</span><span id="__span-3-35"><a id="__codelineno-3-35" name="__codelineno-3-35"></a><span class="sb"> ```bash</span>
|
||||
</span><span id="__span-3-36"><a id="__codelineno-3-36" name="__codelineno-3-36"></a><span class="w"> </span>openapi-first<span class="w"> </span>models<span class="w"> </span>openapi.yaml<span class="w"> </span>-o<span class="w"> </span>_gen/models.py
|
||||
</span><span id="__span-3-37"><a id="__codelineno-3-37" name="__codelineno-3-37"></a><span class="w"> </span>openapi-first<span class="w"> </span>routes<span class="w"> </span>openapi.yaml<span class="w"> </span>-o<span class="w"> </span>_gen/routes<span class="w"> </span><span class="se">\</span>
|
||||
</span><span id="__span-3-38"><a id="__codelineno-3-38" name="__codelineno-3-38"></a><span class="w"> </span>--use-models<span class="w"> </span>--models-module<span class="w"> </span>_gen.models<span class="w"> </span>--inject-request<span class="w"> </span>--package<span class="w"> </span>--template-style
|
||||
</span><span id="__span-3-39"><a id="__codelineno-3-39" name="__codelineno-3-39"></a><span class="sb"> ```</span>
|
||||
</span><span id="__span-3-40"><a id="__codelineno-3-40" name="__codelineno-3-40"></a> <span class="sb">`_gen/models.py`</span> is the <span class="gs">**wire contract**</span> (Pydantic, one class per
|
||||
</span><span id="__span-3-41"><a id="__codelineno-3-41" name="__codelineno-3-41"></a> <span class="sb">`components.schemas`</span> entry). <span class="sb">`_gen/routes/<resource>/routes.py`</span> lists every
|
||||
</span><span id="__span-3-42"><a id="__codelineno-3-42" name="__codelineno-3-42"></a> <span class="sb">`operationId`</span> with its exact parameter signature. <span class="sb">`--template-style`</span> makes
|
||||
</span><span id="__span-3-43"><a id="__codelineno-3-43" name="__codelineno-3-43"></a> those stubs <span class="sb">`async def`</span> with a <span class="sb">`body`</span> parameter, matching the handlers you
|
||||
</span><span id="__span-3-44"><a id="__codelineno-3-44" name="__codelineno-3-44"></a> keep in <span class="sb">`interfaces/`</span> (without it they are sync <span class="sb">`def`</span> stubs taking
|
||||
</span><span id="__span-3-45"><a id="__codelineno-3-45" name="__codelineno-3-45"></a> <span class="sb">`payload`</span>; both bind the same way). Treat <span class="sb">`_gen/`</span> as generated
|
||||
</span><span id="__span-3-46"><a id="__codelineno-3-46" name="__codelineno-3-46"></a> (never hand-edit it) — the canonical handlers live in <span class="sb">`interfaces/`</span>.
|
||||
</span><span id="__span-3-47"><a id="__codelineno-3-47" name="__codelineno-3-47"></a>
|
||||
</span><span id="__span-3-48"><a id="__codelineno-3-48" name="__codelineno-3-48"></a><span class="k">4.</span> <span class="gs">**Write each CRUD slice (app-specific)**</span> — per resource create the four-file
|
||||
</span><span id="__span-3-49"><a id="__codelineno-3-49" name="__codelineno-3-49"></a> slice: <span class="sb">`models.py`</span> (domain model, <span class="gs">**no `id`**</span>), <span class="sb">`ports/db.py`</span>
|
||||
</span><span id="__span-3-50"><a id="__codelineno-3-50" name="__codelineno-3-50"></a> (<span class="sb">`class XDocument(BaseDocument, X)`</span> — id comes from <span class="sb">`BaseDocument`</span>),
|
||||
</span><span id="__span-3-51"><a id="__codelineno-3-51" name="__codelineno-3-51"></a> <span class="sb">`ports/service.py`</span>, and optional <span class="sb">`converters.py`</span>. Follow the CRUD template.
|
||||
</span><span id="__span-3-52"><a id="__codelineno-3-52" name="__codelineno-3-52"></a>
|
||||
</span><span id="__span-3-53"><a id="__codelineno-3-53" name="__codelineno-3-53"></a><span class="k">5.</span> <span class="gs">**Wire the composition root**</span> — in <span class="sb">`init.py`</span>, build leaf repositories, then
|
||||
</span><span id="__span-3-54"><a id="__codelineno-3-54" name="__codelineno-3-54"></a> dependent repositories, then services; add infra adapters (db, cache, stores,
|
||||
</span><span id="__span-3-55"><a id="__codelineno-3-55" name="__codelineno-3-55"></a> progress bus, fetchers). Expose <span class="sb">`get_svc`</span> overloads.
|
||||
</span><span id="__span-3-56"><a id="__codelineno-3-56" name="__codelineno-3-56"></a>
|
||||
</span><span id="__span-3-57"><a id="__codelineno-3-57" name="__codelineno-3-57"></a><span class="k">6.</span> <span class="gs">**Add routes**</span> — create <span class="sb">`interfaces/<resource>/routes.py`</span> thin handlers whose
|
||||
</span><span id="__span-3-58"><a id="__codelineno-3-58" name="__codelineno-3-58"></a> names match the <span class="sb">`operationId`</span>s (use the signatures from step 3 as your
|
||||
</span><span id="__span-3-59"><a id="__codelineno-3-59" name="__codelineno-3-59"></a> checklist) and re-export them in <span class="sb">`interfaces/openapi.py`</span>. Add the cache
|
||||
</span><span id="__span-3-60"><a id="__codelineno-3-60" name="__codelineno-3-60"></a> decorator to read endpoints.
|
||||
</span><span id="__span-3-61"><a id="__codelineno-3-61" name="__codelineno-3-61"></a>
|
||||
</span><span id="__span-3-62"><a id="__codelineno-3-62" name="__codelineno-3-62"></a><span class="k">7.</span> <span class="gs">**Bootstrap app and worker**</span> — confirm <span class="sb">`main.py`</span> runs the OpenAPI-first app
|
||||
</span><span id="__span-3-63"><a id="__codelineno-3-63" name="__codelineno-3-63"></a> with its lifespan. If the app has long-running jobs, adapt <span class="sb">`worker.py`</span> to poll
|
||||
</span><span id="__span-3-64"><a id="__codelineno-3-64" name="__codelineno-3-64"></a> the job collection, run the pipeline, and publish progress.
|
||||
</span><span id="__span-3-65"><a id="__codelineno-3-65" name="__codelineno-3-65"></a>
|
||||
</span><span id="__span-3-66"><a id="__codelineno-3-66" name="__codelineno-3-66"></a><span class="k">8.</span> <span class="gs">**Add pipeline families (only if data-driven)**</span> — copy <span class="sb">`pipelines/example/`</span>
|
||||
</span><span id="__span-3-67"><a id="__codelineno-3-67" name="__codelineno-3-67"></a> to <span class="sb">`pipelines/<family>/`</span> with <span class="sb">`abc.py`</span>, <span class="sb">`impl.py`</span>, <span class="sb">`pipeline.yaml`</span>,
|
||||
</span><span id="__span-3-68"><a id="__codelineno-3-68" name="__codelineno-3-68"></a> <span class="sb">`resources/`</span>, and reuse <span class="sb">`pipelines/shared/`</span> (loader + registry). Register the
|
||||
</span><span id="__span-3-69"><a id="__codelineno-3-69" name="__codelineno-3-69"></a> root. Add fixtures and a parity test.
|
||||
</span><span id="__span-3-18"><a id="__codelineno-3-18" name="__codelineno-3-18"></a> <span class="sb">`get_app_component(kind)`</span> instead of writing it from scratch.
|
||||
</span><span id="__span-3-19"><a id="__codelineno-3-19" name="__codelineno-3-19"></a>
|
||||
</span><span id="__span-3-20"><a id="__codelineno-3-20" name="__codelineno-3-20"></a><span class="gu">## Steps</span>
|
||||
</span><span id="__span-3-21"><a id="__codelineno-3-21" name="__codelineno-3-21"></a>
|
||||
</span><span id="__span-3-22"><a id="__codelineno-3-22" name="__codelineno-3-22"></a><span class="k">1.</span> <span class="gs">**Scaffold**</span> — copy <span class="sb">`standards/src/templates/app/`</span> into <span class="sb">`apps/<your-app>/`</span>
|
||||
</span><span id="__span-3-23"><a id="__codelineno-3-23" name="__codelineno-3-23"></a> (or pull the same tree via <span class="sb">`get_app_template`</span>). Keep the tree: <span class="sb">`domain/`</span>,
|
||||
</span><span id="__span-3-24"><a id="__codelineno-3-24" name="__codelineno-3-24"></a> <span class="sb">`infra/`</span>, <span class="sb">`interfaces/`</span>, <span class="sb">`pipelines/`</span>, <span class="sb">`tests/`</span>, <span class="sb">`scripts/`</span>, plus
|
||||
</span><span id="__span-3-25"><a id="__codelineno-3-25" name="__codelineno-3-25"></a> <span class="sb">`pyproject.toml`</span>, <span class="sb">`openapi.yaml`</span>, <span class="sb">`config.py`</span>, <span class="sb">`init.py`</span>, <span class="sb">`main.py`</span>,
|
||||
</span><span id="__span-3-26"><a id="__codelineno-3-26" name="__codelineno-3-26"></a> <span class="sb">`worker.py`</span>, <span class="sb">`Dockerfile`</span>, <span class="sb">`docker-compose.yaml`</span>, <span class="sb">`.env.example`</span>.
|
||||
</span><span id="__span-3-27"><a id="__codelineno-3-27" name="__codelineno-3-27"></a>
|
||||
</span><span id="__span-3-28"><a id="__codelineno-3-28" name="__codelineno-3-28"></a><span class="k">2.</span> <span class="gs">**Author the spec (app-specific)**</span> — write <span class="sb">`openapi.yaml`</span>: resources,
|
||||
</span><span id="__span-3-29"><a id="__codelineno-3-29" name="__codelineno-3-29"></a> schemas, <span class="sb">`operationId`</span>s, security, and extension metadata. This is the
|
||||
</span><span id="__span-3-30"><a id="__codelineno-3-30" name="__codelineno-3-30"></a> contract and drives all routing. Every operation MUST have an <span class="sb">`operationId`</span>.
|
||||
</span><span id="__span-3-31"><a id="__codelineno-3-31" name="__codelineno-3-31"></a>
|
||||
</span><span id="__span-3-32"><a id="__codelineno-3-32" name="__codelineno-3-32"></a><span class="k">3.</span> <span class="gs">**Generate the scaffold (codegen)**</span> — from the spec, generate the wire
|
||||
</span><span id="__span-3-33"><a id="__codelineno-3-33" name="__codelineno-3-33"></a> models and the exact handler signatures:
|
||||
</span><span id="__span-3-34"><a id="__codelineno-3-34" name="__codelineno-3-34"></a><span class="sb"> ```bash</span>
|
||||
</span><span id="__span-3-35"><a id="__codelineno-3-35" name="__codelineno-3-35"></a><span class="w"> </span>openapi-first<span class="w"> </span>models<span class="w"> </span>openapi.yaml<span class="w"> </span>-o<span class="w"> </span>_gen/models.py
|
||||
</span><span id="__span-3-36"><a id="__codelineno-3-36" name="__codelineno-3-36"></a><span class="w"> </span>openapi-first<span class="w"> </span>routes<span class="w"> </span>openapi.yaml<span class="w"> </span>-o<span class="w"> </span>_gen/routes<span class="w"> </span><span class="se">\</span>
|
||||
</span><span id="__span-3-37"><a id="__codelineno-3-37" name="__codelineno-3-37"></a><span class="w"> </span>--use-models<span class="w"> </span>--models-module<span class="w"> </span>_gen.models<span class="w"> </span>--inject-request<span class="w"> </span>--package<span class="w"> </span>--template-style
|
||||
</span><span id="__span-3-38"><a id="__codelineno-3-38" name="__codelineno-3-38"></a><span class="sb"> ```</span>
|
||||
</span><span id="__span-3-39"><a id="__codelineno-3-39" name="__codelineno-3-39"></a> <span class="sb">`_gen/models.py`</span> is the <span class="gs">**wire contract**</span> (Pydantic, one class per
|
||||
</span><span id="__span-3-40"><a id="__codelineno-3-40" name="__codelineno-3-40"></a> <span class="sb">`components.schemas`</span> entry). <span class="sb">`_gen/routes/<resource>/routes.py`</span> lists every
|
||||
</span><span id="__span-3-41"><a id="__codelineno-3-41" name="__codelineno-3-41"></a> <span class="sb">`operationId`</span> with its exact parameter signature. <span class="sb">`--template-style`</span> makes
|
||||
</span><span id="__span-3-42"><a id="__codelineno-3-42" name="__codelineno-3-42"></a> those stubs <span class="sb">`async def`</span> with a <span class="sb">`body`</span> parameter, matching the handlers you
|
||||
</span><span id="__span-3-43"><a id="__codelineno-3-43" name="__codelineno-3-43"></a> keep in <span class="sb">`interfaces/`</span> (without it they are sync <span class="sb">`def`</span> stubs taking
|
||||
</span><span id="__span-3-44"><a id="__codelineno-3-44" name="__codelineno-3-44"></a> <span class="sb">`payload`</span>; both bind the same way). Treat <span class="sb">`_gen/`</span> as generated
|
||||
</span><span id="__span-3-45"><a id="__codelineno-3-45" name="__codelineno-3-45"></a> (never hand-edit it) — the canonical handlers live in <span class="sb">`interfaces/`</span>.
|
||||
</span><span id="__span-3-46"><a id="__codelineno-3-46" name="__codelineno-3-46"></a>
|
||||
</span><span id="__span-3-47"><a id="__codelineno-3-47" name="__codelineno-3-47"></a><span class="k">4.</span> <span class="gs">**Write each CRUD slice (app-specific)**</span> — per resource create the four-file
|
||||
</span><span id="__span-3-48"><a id="__codelineno-3-48" name="__codelineno-3-48"></a> slice: <span class="sb">`models.py`</span> (domain model, <span class="gs">**no `id`**</span>), <span class="sb">`ports/db.py`</span>
|
||||
</span><span id="__span-3-49"><a id="__codelineno-3-49" name="__codelineno-3-49"></a> (<span class="sb">`class XDocument(BaseDocument, X)`</span> — id comes from <span class="sb">`BaseDocument`</span>),
|
||||
</span><span id="__span-3-50"><a id="__codelineno-3-50" name="__codelineno-3-50"></a> <span class="sb">`ports/service.py`</span>, and optional <span class="sb">`converters.py`</span>. Follow the CRUD template.
|
||||
</span><span id="__span-3-51"><a id="__codelineno-3-51" name="__codelineno-3-51"></a>
|
||||
</span><span id="__span-3-52"><a id="__codelineno-3-52" name="__codelineno-3-52"></a><span class="k">5.</span> <span class="gs">**Wire the composition root**</span> — in <span class="sb">`init.py`</span>, build leaf repositories, then
|
||||
</span><span id="__span-3-53"><a id="__codelineno-3-53" name="__codelineno-3-53"></a> dependent repositories, then services; add infra adapters (db, cache, stores,
|
||||
</span><span id="__span-3-54"><a id="__codelineno-3-54" name="__codelineno-3-54"></a> progress bus, fetchers). Expose <span class="sb">`get_svc`</span> overloads.
|
||||
</span><span id="__span-3-55"><a id="__codelineno-3-55" name="__codelineno-3-55"></a>
|
||||
</span><span id="__span-3-56"><a id="__codelineno-3-56" name="__codelineno-3-56"></a><span class="k">6.</span> <span class="gs">**Add routes**</span> — create <span class="sb">`interfaces/<resource>/routes.py`</span> thin handlers whose
|
||||
</span><span id="__span-3-57"><a id="__codelineno-3-57" name="__codelineno-3-57"></a> names match the <span class="sb">`operationId`</span>s (use the signatures from step 3 as your
|
||||
</span><span id="__span-3-58"><a id="__codelineno-3-58" name="__codelineno-3-58"></a> checklist) and re-export them in <span class="sb">`interfaces/openapi.py`</span>. Add the cache
|
||||
</span><span id="__span-3-59"><a id="__codelineno-3-59" name="__codelineno-3-59"></a> decorator to read endpoints.
|
||||
</span><span id="__span-3-60"><a id="__codelineno-3-60" name="__codelineno-3-60"></a>
|
||||
</span><span id="__span-3-61"><a id="__codelineno-3-61" name="__codelineno-3-61"></a><span class="k">7.</span> <span class="gs">**Bootstrap app and worker**</span> — confirm <span class="sb">`main.py`</span> runs the OpenAPI-first app
|
||||
</span><span id="__span-3-62"><a id="__codelineno-3-62" name="__codelineno-3-62"></a> with its lifespan. If the app has long-running jobs, adapt <span class="sb">`worker.py`</span> to poll
|
||||
</span><span id="__span-3-63"><a id="__codelineno-3-63" name="__codelineno-3-63"></a> the job collection, run the pipeline, and publish progress.
|
||||
</span><span id="__span-3-64"><a id="__codelineno-3-64" name="__codelineno-3-64"></a>
|
||||
</span><span id="__span-3-65"><a id="__codelineno-3-65" name="__codelineno-3-65"></a><span class="k">8.</span> <span class="gs">**Add pipeline families (only if data-driven)**</span> — copy the worked family
|
||||
</span><span id="__span-3-66"><a id="__codelineno-3-66" name="__codelineno-3-66"></a> <span class="sb">`pipelines/appointment_reminder/`</span> to <span class="sb">`pipelines/<family>/`</span> with <span class="sb">`abc.py`</span>,
|
||||
</span><span id="__span-3-67"><a id="__codelineno-3-67" name="__codelineno-3-67"></a> <span class="sb">`impl.py`</span>, <span class="sb">`pipeline.yaml`</span>, <span class="sb">`resources/`</span>, and reuse <span class="sb">`pipelines/shared/`</span>
|
||||
</span><span id="__span-3-68"><a id="__codelineno-3-68" name="__codelineno-3-68"></a> (loader + registry). Register the root, add the <span class="sb">`job.kind`</span> handler in
|
||||
</span><span id="__span-3-69"><a id="__codelineno-3-69" name="__codelineno-3-69"></a> <span class="sb">`worker.py`</span>. Add fixtures and a parity test.
|
||||
</span><span id="__span-3-70"><a id="__codelineno-3-70" name="__codelineno-3-70"></a>
|
||||
</span><span id="__span-3-71"><a id="__codelineno-3-71" name="__codelineno-3-71"></a><span class="k">9.</span> <span class="gs">**Add infrastructure only where needed**</span> — Tier A capability: use the
|
||||
</span><span id="__span-3-72"><a id="__codelineno-3-72" name="__codelineno-3-72"></a> library. Tier B capability: copy the template. Never hand-write a Tier A
|
||||
|
||||
@@ -713,7 +713,7 @@ Read it from the MCP bundle:</p>
|
||||
</span></code></pre></div></td></tr></table></div>
|
||||
<p>The app's own spec carries the per-resource values; the catalog explains what
|
||||
each field does. The template's <code>openapi.yaml</code> shows the convention on the
|
||||
example <code>Item</code> and <code>Job</code> schemas.</p>
|
||||
example <code>Job</code> schema.</p>
|
||||
<hr />
|
||||
<h2 id="golden-rules">Golden rules</h2>
|
||||
<ol>
|
||||
@@ -735,8 +735,10 @@ example <code>Item</code> and <code>Job</code> schemas.</p>
|
||||
<li>The server template ships authless by default (see
|
||||
<a href="../22_auth_integration/">22 – Auth Integration</a>); the client template pairs
|
||||
with it and degrades to "no login" until a security scheme is declared.</li>
|
||||
<li><code>react/vet</code> is the full-stack reference implementation: spec with x-
|
||||
extensions, server, and the consuming client in one tree.</li>
|
||||
<li>The standards <strong>app + client templates</strong> are the full-stack reference: the
|
||||
server spec carries the x- extensions, and the client renders the admin from
|
||||
it. The wiki's <strong>Reference App</strong> walkthrough (<code>06_reference_app</code>) documents
|
||||
the pairing end to end.</li>
|
||||
</ul>
|
||||
|
||||
|
||||
|
||||
@@ -693,7 +693,7 @@ chosen by what the repository produces:</p>
|
||||
<td><strong>C — Docker deployment</strong></td>
|
||||
<td><code>templates/drone/service-docker.yaml</code></td>
|
||||
<td>An image pushed to the registry and run as a container</td>
|
||||
<td><code>auth-server</code>, <code>vet</code></td>
|
||||
<td><code>auth-server</code></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
@@ -620,9 +620,9 @@
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#services-apps-type-c" class="md-nav__link">
|
||||
<a href="#services-type-c" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
Services & Apps (Type C)
|
||||
Services (Type C)
|
||||
</span>
|
||||
</a>
|
||||
|
||||
@@ -780,7 +780,7 @@ source is <code>package.json</code>; Drone file is <code>npm-lib.yaml</code> (ta
|
||||
</tbody>
|
||||
</table>
|
||||
<hr />
|
||||
<h2 id="services-apps-type-c">Services & Apps (Type C)</h2>
|
||||
<h2 id="services-type-c">Services (Type C)</h2>
|
||||
<p>A container image pushed to the registry and run on the Docker host. Version
|
||||
source is the <code>VERSION</code> file; Drone file is <code>service-docker.yaml</code>.</p>
|
||||
<table>
|
||||
@@ -788,7 +788,6 @@ source is the <code>VERSION</code> file; Drone file is <code>service-docker.yaml
|
||||
<tr>
|
||||
<th>Repo</th>
|
||||
<th>Path</th>
|
||||
<th>Type</th>
|
||||
<th>Trigger</th>
|
||||
<th>Docs</th>
|
||||
</tr>
|
||||
@@ -797,17 +796,9 @@ source is the <code>VERSION</code> file; Drone file is <code>service-docker.yaml
|
||||
<tr>
|
||||
<td><code>auth-server</code></td>
|
||||
<td><code>auth-server</code></td>
|
||||
<td>service</td>
|
||||
<td>tag</td>
|
||||
<td>api, lib, wiki</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>vet</code></td>
|
||||
<td><code>react/vet</code></td>
|
||||
<td>app</td>
|
||||
<td>tag</td>
|
||||
<td>lib, wiki</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>Tag-triggered and enforces <code>tag == VERSION</code>.</p>
|
||||
@@ -836,7 +827,7 @@ source is the <code>VERSION</code> file; Drone file is <code>service-docker.yaml
|
||||
<td><code>npm-lib.yaml</code></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>service / app</td>
|
||||
<td>service</td>
|
||||
<td><code>VERSION</code></td>
|
||||
<td><code>CHANGELOG.md</code></td>
|
||||
<td><code>service-docker.yaml</code></td>
|
||||
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user