@terreno/mcp 57.6.1 → 57.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/dist/docs/resources/ui.md +5 -4
  2. package/dist/docs/upgrades/57.7.0.md +64 -0
  3. package/dist/docs/upgrades/57.8.0.md +61 -0
  4. package/dist/docs/upgrades/58.0.0.md +4 -0
  5. package/dist/docs/versioned/next/explanation/example-coverage.md +1 -0
  6. package/dist/docs/versioned/next/explanation/loop-engineering.md +32 -3
  7. package/dist/docs/versioned/next/explanation/model-router-actions.md +1 -1
  8. package/dist/docs/versioned/next/explanation/repository-settings.md +12 -5
  9. package/dist/docs/versioned/next/explanation/roadmap-process.md +41 -19
  10. package/dist/docs/versioned/next/explanation/roadmap-seed-issues.md +285 -22
  11. package/dist/docs/versioned/next/explanation/static-analysis.md +3 -2
  12. package/dist/docs/versioned/next/explanation/test-isolation.md +42 -0
  13. package/dist/docs/versioned/next/how-to/circleci.md +121 -64
  14. package/dist/docs/versioned/next/how-to/github-actions-ci.md +4 -3
  15. package/dist/docs/versioned/next/how-to/preview-demo.md +19 -0
  16. package/dist/docs/versioned/next/how-to/product-announcements.md +3 -0
  17. package/dist/docs/versioned/next/how-to/run-tests-locally.md +23 -2
  18. package/dist/docs/versioned/next/implementationPlans/IP_TEMPLATE.md +3 -1
  19. package/dist/docs/versioned/next/implementationPlans/admin-improvements.md +1 -1
  20. package/dist/docs/versioned/next/implementationPlans/admin-scripts-durable-jobs.md +2 -1
  21. package/dist/docs/versioned/next/implementationPlans/agent-ui-blocks.md +1 -0
  22. package/dist/docs/versioned/next/implementationPlans/ai-agents-and-failover.md +1 -0
  23. package/dist/docs/versioned/next/implementationPlans/ai-observability.md +1 -0
  24. package/dist/docs/versioned/next/implementationPlans/announcements-surfaces.md +1 -1
  25. package/dist/docs/versioned/next/implementationPlans/announcements.md +2 -1
  26. package/dist/docs/versioned/next/implementationPlans/app-mcp-server.md +1 -0
  27. package/dist/docs/versioned/next/implementationPlans/better-auth-strict-oauth-provider.md +2 -1
  28. package/dist/docs/versioned/next/implementationPlans/can-as-permission-seam.md +1 -1
  29. package/dist/docs/versioned/next/implementationPlans/collection-registry.md +1 -1
  30. package/dist/docs/versioned/next/implementationPlans/comms-adapter-expo-push.md +1 -1
  31. package/dist/docs/versioned/next/implementationPlans/comms-adapter-twilio-sms.md +1 -1
  32. package/dist/docs/versioned/next/implementationPlans/comms-admin-dashboard.md +1 -1
  33. package/dist/docs/versioned/next/implementationPlans/compile-pipeline-dedup.md +2 -1
  34. package/dist/docs/versioned/next/implementationPlans/datatable-server-side-filtering.md +1 -1
  35. package/dist/docs/versioned/next/implementationPlans/demo-workshop.md +219 -0
  36. package/dist/docs/versioned/next/implementationPlans/describe-model-schema.md +1 -1
  37. package/dist/docs/versioned/next/implementationPlans/docs-reference-coverage.md +1 -1
  38. package/dist/docs/versioned/next/implementationPlans/docs-site-and-versioning.md +1 -1
  39. package/dist/docs/versioned/next/implementationPlans/examples-demo-coverage.md +1 -1
  40. package/dist/docs/versioned/next/implementationPlans/framework-audit-log.md +1 -1
  41. package/dist/docs/versioned/next/implementationPlans/gpt-chat-mascot.md +1 -0
  42. package/dist/docs/versioned/next/implementationPlans/inbound-webhooks.md +1 -1
  43. package/dist/docs/versioned/next/implementationPlans/knip-cleanup.md +1 -0
  44. package/dist/docs/versioned/next/implementationPlans/mcp-doc-sync-off-compile-path.md +2 -1
  45. package/dist/docs/versioned/next/implementationPlans/mcp-service-tokens.md +2 -1
  46. package/dist/docs/versioned/next/implementationPlans/migrate-admin-to-syncdb.md +2 -1
  47. package/dist/docs/versioned/next/implementationPlans/migrate-cicd-to-circleci.md +1 -1
  48. package/dist/docs/versioned/next/implementationPlans/mongodb-migrations-tooling.md +1 -1
  49. package/dist/docs/versioned/next/implementationPlans/notification-center.md +1 -1
  50. package/dist/docs/versioned/next/implementationPlans/org-management-ui.md +1 -1
  51. package/dist/docs/versioned/next/implementationPlans/password-reset-and-email-verification.md +1 -1
  52. package/dist/docs/versioned/next/implementationPlans/rate-limiting.md +1 -1
  53. package/dist/docs/versioned/next/implementationPlans/remove-legacy-realtime.md +1 -0
  54. package/dist/docs/versioned/next/implementationPlans/support-agent.md +1 -0
  55. package/dist/docs/versioned/next/implementationPlans/syncdb-codegen.md +1 -1
  56. package/dist/docs/versioned/next/implementationPlans/terreno-langfuse-integration.md +1 -1
  57. package/dist/docs/versioned/next/implementationPlans/upgrade-guides-and-skill.md +1 -1
  58. package/dist/docs/versioned/next/reference/ai.md +3 -1
  59. package/dist/docs/versioned/next/reference/announcement-release-packs.md +146 -0
  60. package/dist/docs/versioned/next/reference/announcements.md +7 -3
  61. package/dist/docs/versioned/next/reference/api.md +1 -0
  62. package/dist/docs/versioned/next/reference/environment-variables.md +1 -0
  63. package/dist/docs/versioned/next/reference/lifecycle-plugin.md +2 -2
  64. package/dist/docs/versioned/next/reference/test.md +1 -1
  65. package/dist/docs/versioned/next/reference/ui.md +79 -8
  66. package/dist/docs/versioned/next/tasks/can-as-permission-seam.md +4 -4
  67. package/dist/docs/versioned/next/tasks/collection-registry.md +6 -6
  68. package/dist/docs/versioned/next/tasks/demo-workshop.md +150 -0
  69. package/dist/docs/versioned/next/tasks/describe-model-schema.md +5 -5
  70. package/dist/docs/versioned/next/tasks/migrate-cicd-to-circleci.md +6 -3
  71. package/package.json +2 -2
  72. package/src/docs/resources/ui.md +5 -4
  73. package/src/docs/upgrades/57.7.0.md +64 -0
  74. package/src/docs/upgrades/57.8.0.md +61 -0
  75. package/src/docs/upgrades/58.0.0.md +4 -0
  76. package/src/docs/versioned/next/explanation/example-coverage.md +1 -0
  77. package/src/docs/versioned/next/explanation/loop-engineering.md +32 -3
  78. package/src/docs/versioned/next/explanation/model-router-actions.md +1 -1
  79. package/src/docs/versioned/next/explanation/repository-settings.md +12 -5
  80. package/src/docs/versioned/next/explanation/roadmap-process.md +41 -19
  81. package/src/docs/versioned/next/explanation/roadmap-seed-issues.md +285 -22
  82. package/src/docs/versioned/next/explanation/static-analysis.md +3 -2
  83. package/src/docs/versioned/next/explanation/test-isolation.md +42 -0
  84. package/src/docs/versioned/next/how-to/circleci.md +121 -64
  85. package/src/docs/versioned/next/how-to/github-actions-ci.md +4 -3
  86. package/src/docs/versioned/next/how-to/preview-demo.md +19 -0
  87. package/src/docs/versioned/next/how-to/product-announcements.md +3 -0
  88. package/src/docs/versioned/next/how-to/run-tests-locally.md +23 -2
  89. package/src/docs/versioned/next/implementationPlans/IP_TEMPLATE.md +3 -1
  90. package/src/docs/versioned/next/implementationPlans/admin-improvements.md +1 -1
  91. package/src/docs/versioned/next/implementationPlans/admin-scripts-durable-jobs.md +2 -1
  92. package/src/docs/versioned/next/implementationPlans/agent-ui-blocks.md +1 -0
  93. package/src/docs/versioned/next/implementationPlans/ai-agents-and-failover.md +1 -0
  94. package/src/docs/versioned/next/implementationPlans/ai-observability.md +1 -0
  95. package/src/docs/versioned/next/implementationPlans/announcements-surfaces.md +1 -1
  96. package/src/docs/versioned/next/implementationPlans/announcements.md +2 -1
  97. package/src/docs/versioned/next/implementationPlans/app-mcp-server.md +1 -0
  98. package/src/docs/versioned/next/implementationPlans/better-auth-strict-oauth-provider.md +2 -1
  99. package/src/docs/versioned/next/implementationPlans/can-as-permission-seam.md +1 -1
  100. package/src/docs/versioned/next/implementationPlans/collection-registry.md +1 -1
  101. package/src/docs/versioned/next/implementationPlans/comms-adapter-expo-push.md +1 -1
  102. package/src/docs/versioned/next/implementationPlans/comms-adapter-twilio-sms.md +1 -1
  103. package/src/docs/versioned/next/implementationPlans/comms-admin-dashboard.md +1 -1
  104. package/src/docs/versioned/next/implementationPlans/compile-pipeline-dedup.md +2 -1
  105. package/src/docs/versioned/next/implementationPlans/datatable-server-side-filtering.md +1 -1
  106. package/src/docs/versioned/next/implementationPlans/demo-workshop.md +219 -0
  107. package/src/docs/versioned/next/implementationPlans/describe-model-schema.md +1 -1
  108. package/src/docs/versioned/next/implementationPlans/docs-reference-coverage.md +1 -1
  109. package/src/docs/versioned/next/implementationPlans/docs-site-and-versioning.md +1 -1
  110. package/src/docs/versioned/next/implementationPlans/examples-demo-coverage.md +1 -1
  111. package/src/docs/versioned/next/implementationPlans/framework-audit-log.md +1 -1
  112. package/src/docs/versioned/next/implementationPlans/gpt-chat-mascot.md +1 -0
  113. package/src/docs/versioned/next/implementationPlans/inbound-webhooks.md +1 -1
  114. package/src/docs/versioned/next/implementationPlans/knip-cleanup.md +1 -0
  115. package/src/docs/versioned/next/implementationPlans/mcp-doc-sync-off-compile-path.md +2 -1
  116. package/src/docs/versioned/next/implementationPlans/mcp-service-tokens.md +2 -1
  117. package/src/docs/versioned/next/implementationPlans/migrate-admin-to-syncdb.md +2 -1
  118. package/src/docs/versioned/next/implementationPlans/migrate-cicd-to-circleci.md +1 -1
  119. package/src/docs/versioned/next/implementationPlans/mongodb-migrations-tooling.md +1 -1
  120. package/src/docs/versioned/next/implementationPlans/notification-center.md +1 -1
  121. package/src/docs/versioned/next/implementationPlans/org-management-ui.md +1 -1
  122. package/src/docs/versioned/next/implementationPlans/password-reset-and-email-verification.md +1 -1
  123. package/src/docs/versioned/next/implementationPlans/rate-limiting.md +1 -1
  124. package/src/docs/versioned/next/implementationPlans/remove-legacy-realtime.md +1 -0
  125. package/src/docs/versioned/next/implementationPlans/support-agent.md +1 -0
  126. package/src/docs/versioned/next/implementationPlans/syncdb-codegen.md +1 -1
  127. package/src/docs/versioned/next/implementationPlans/terreno-langfuse-integration.md +1 -1
  128. package/src/docs/versioned/next/implementationPlans/upgrade-guides-and-skill.md +1 -1
  129. package/src/docs/versioned/next/reference/ai.md +3 -1
  130. package/src/docs/versioned/next/reference/announcement-release-packs.md +146 -0
  131. package/src/docs/versioned/next/reference/announcements.md +7 -3
  132. package/src/docs/versioned/next/reference/api.md +1 -0
  133. package/src/docs/versioned/next/reference/environment-variables.md +1 -0
  134. package/src/docs/versioned/next/reference/lifecycle-plugin.md +2 -2
  135. package/src/docs/versioned/next/reference/test.md +1 -1
  136. package/src/docs/versioned/next/reference/ui.md +79 -8
  137. package/src/docs/versioned/next/tasks/can-as-permission-seam.md +4 -4
  138. package/src/docs/versioned/next/tasks/collection-registry.md +6 -6
  139. package/src/docs/versioned/next/tasks/demo-workshop.md +150 -0
  140. package/src/docs/versioned/next/tasks/describe-model-schema.md +5 -5
  141. package/src/docs/versioned/next/tasks/migrate-cicd-to-circleci.md +6 -3
  142. package/dist/docs/ui-types-documentation.json +0 -33
  143. package/src/docs/ui-types-documentation.json +0 -33
@@ -4,17 +4,17 @@ CircleCI CI/CD source of truth. See
4
4
  [`docs/implementationPlans/migrate-cicd-to-circleci.md`](../implementationPlans/migrate-cicd-to-circleci.md).
5
5
 
6
6
  **Status:** CircleCI owns package CI, repo policies, Playwright e2e, Maestro web
7
- e2e, architectural PR review, and semver-tag npm releases. Path filters start
8
- CircleCI Netlify and GCP production/preview jobs, but those jobs **skip green**
9
- until `terreno-netlify` and `terreno-gcp` are filled. GitHub Actions still
10
- owns live Netlify/GCP deploys in this window. Do not leave both applying
11
- terraform once CircleCI GCP deploys succeed — set the GHA deploy workflows
12
- back to `push.branches-ignore: ["**"]` in the same change. GitHub-native security, Cursor GitHub App
13
- checks (Approval / Security / Bugbot), and repository automation remain
14
- enabled. EAS PR updates and the fingerprint gate are temporarily disabled;
15
- manual EAS development dispatch remains available in CircleCI. Preview
16
- **cleanup** on PR close is GitHub `preview-cleanup.yml` plus the manual
17
- CircleCI `run-preview-cleanup` parameter.
7
+ e2e, architectural PR review, semver-tag npm releases, and all continuous
8
+ deploys (Netlify demo / example frontend / docs, GCP terraform, Cloud Run
9
+ backend + tasks, MCP). The GitHub Actions deploy workflows are disabled and
10
+ kept only for rollback. CircleCI deploy jobs **fail** when `terreno-netlify`
11
+ or `terreno-gcp` is missing a value; they never skip green. GitHub-native
12
+ security, Cursor GitHub App checks (Approval / Security / Bugbot), and
13
+ repository automation remain enabled. EAS PR updates and the fingerprint gate
14
+ are temporarily disabled; manual EAS development dispatch remains available in
15
+ CircleCI. Preview **cleanup** on PR close is a thin GitHub
16
+ `preview-cleanup.yml` hook that starts a CircleCI `run-preview-cleanup`
17
+ pipeline.
18
18
 
19
19
  ## Project setup (maintainers)
20
20
 
@@ -23,9 +23,8 @@ CircleCI `run-preview-cleanup` parameter.
23
23
  3. Enable **dynamic config** / setup workflows for the project (required for
24
24
  `.circleci/config.yml` `setup: true`).
25
25
  4. Create the contexts below (`terreno-netlify`, `terreno-gcp`, and the rest).
26
- Copy Netlify and GCP values from GitHub Actions secrets/vars. Until they
27
- are set, CircleCI deploy jobs skip with exit 0 and GHA remains the live
28
- deployer.
26
+ Copy Netlify and GCP values from GitHub Actions secrets/vars. CircleCI is
27
+ the only deployer, so deploy jobs fail until these are set.
29
28
  5. Set project Environment Variable `CODECOV_TOKEN` (Codecov upload token) so
30
29
  package CI can upload `coverage/lcov.info`. Uploads skip when it is unset.
31
30
  Mirror the same secret as GitHub Actions `CODECOV_TOKEN` for retained twins.
@@ -34,7 +33,7 @@ CircleCI `run-preview-cleanup` parameter.
34
33
  6. Build forked PRs if you want DCO + rulesync on forks.
35
34
 
36
35
  GitHub App org/project slug (API and CLI):
37
- `circleci/6UHiK7pThPXbhnNi3umQNe/W3HZeMJujyMB2sYiUXaQbs`.
36
+ `circleci/6UHiK7pThPXbhnNi3umQNe/LdjghuhydHjFMyFjcEXMA2`.
38
37
 
39
38
  Do not query `gh/TerrenoLabs/terreno` — that slug returns `404 Project not found`.
40
39
  Cloud agents use `CIRCLECI_TOKEN` (accepted alias of CircleCI's `CIRCLE_TOKEN`). Send
@@ -166,28 +165,62 @@ non-PR branch builds.
166
165
  | Path (examples) | Parameter | PR job | `master` job |
167
166
  | --- | --- | --- | --- |
168
167
  | `demo/**`, `ui/**` | `run-deploy-demo` | `deploy-demo-preview` | `deploy-demo` |
169
- | `example-frontend/**`, `admin-frontend/**`, `rtk/**` | `run-deploy-frontend` | `deploy-frontend-preview` | `deploy-frontend` |
168
+ | `example-frontend/**`, `admin-frontend/**`, `rtk/**`, `ui/**`, `ai/**`, `syncdb/**`, `bun.lock` | `run-deploy-frontend` | `deploy-frontend-preview` | `deploy-frontend` |
170
169
  | `docs/**`, `website/**` | `run-deploy-docs` | `deploy-docs-preview` | `deploy-docs` |
171
- | `example-backend/**`, `api/**`, `comms/**` | `run-cd-backend` | `gcp-cd-preview` | `gcp-cd-prod` |
170
+ | `example-backend/**`, `api/**`, `comms/**`, `jobs/**`, `admin-spa/**`, `feature-flags/**`, `announcements/**`, plus every frontend path above | `run-cd-backend` | `gcp-cd-preview` | `gcp-cd-prod` |
172
171
  | `terraform/**` | `run-cd-terraform` | `gcp-cd-preview` | `gcp-cd-prod` |
173
- | `mcp-server/**` | `run-cd-mcp` | _(none)_ | `gcp-cd-prod` |
174
-
175
- Until `terreno-netlify` is populated, GitHub Actions `docs-deploy` /
176
- `demo-deploy` / `frontend-example-deploy` publish the live sites (including
177
- PR aliases). CircleCI `deploy-*-preview` jobs still start from path filters
178
- and skip when `NETLIFY_AUTH_TOKEN` or the site id is missing. The same skip
179
- applies to `gcp-cd-*` when `terreno-gcp` lacks WIF or SA emails, so GitHub
180
- `cd.yml` remains the live GCP writer. GitHub `terraform-preview` and
181
- `backend-deploy-preview` run only when
182
- `github.event.pull_request.head.repo.full_name == github.repository`.
183
- Terraform preview always describes the Infra Manager preview (state,
184
- `errorCode`, `errorLogs`) before delete, including when `previews create`
185
- fails. Fork PRs still present `repository: TerrenoLabs/terreno` on the
186
- OIDC token, so
187
- WIF would accept them if those jobs ran. Netlify GHA jobs fail closed on
188
- forks (secrets withheld). After filling a context, confirm a CircleCI deploy
189
- URL, then set the matching GHA workflows to `push.branches-ignore: ["**"]`. Turn off Netlify's
190
- GitHub auto-build so only one system publishes.
172
+ | `mcp-server/**`, `ui/**` | `run-cd-mcp` | _(none)_ | `gcp-cd-prod` (runs `mcp-server` `test:ci` first) |
173
+
174
+ The backend image bundles the admin SPA (ui, rtk, admin-frontend, syncdb), so
175
+ those paths redeploy the backend too. Every frontend PR preview therefore gets
176
+ an isolated `pr-N` backend: `deploy-frontend-preview` always points
177
+ `EXPO_PUBLIC_API_URL` at it (the prod backend rejects preview CORS) and waits
178
+ up to 20 minutes for its `/health` before publishing, because `gcp-cd-preview`
179
+ runs in a separate workflow.
180
+
181
+ Backend previews prune not-Ready tagged revisions from traffic
182
+ (`rebuild-cloud-run-ready-traffic.sh`), deploy untagged with
183
+ `--revision-suffix`, then point the `pr-N` tag at that revision. Terraform
184
+ preview always describes the Infra Manager preview (state, `errorCode`,
185
+ `errorLogs`) before delete, including when `previews create` fails. Fork PRs
186
+ still present `repository: TerrenoLabs/terreno` on the OIDC token, so WIF
187
+ would accept them if those jobs ran. Preview jobs halt on fork PRs, where CircleCI withholds contexts.
188
+ GitHub App builds do not set `CIRCLE_PR_USERNAME` / `CIRCLE_PR_REPONAME`;
189
+ `skip_if_fork_deploy` asks the pulls API and halts before
190
+ `require_*_context` would fail on those withheld secrets.
191
+
192
+ ### GitHub Deployment records
193
+
194
+ Deploy scripts wrap the publish step in `with_github_deployment`
195
+ (`scripts/ci/github-deployment-lib.sh`): the deployment is created as
196
+ `in_progress` with the CircleCI job as `log_url`, then set to `success`
197
+ (with the environment URL) or `failure`. PR previews are transient; the rest
198
+ are production environments. Environment names match the retired GitHub
199
+ workflows, so history stays continuous:
200
+
201
+ | Job | Environment | URL |
202
+ | --- | --- | --- |
203
+ | `deploy-demo` / `deploy-demo-preview` | `demo` / `demo-preview-pr-N` | `terreno-demo.netlify.app` / `pr-N--terreno-demo.netlify.app` |
204
+ | `deploy-frontend` / `deploy-frontend-preview` | `example-frontend` / `example-frontend-preview-pr-N` | `terreno-frontend.netlify.app` / `pr-N--terreno-frontend.netlify.app` |
205
+ | `deploy-docs` / `deploy-docs-preview` | `docs` / `docs-preview-pr-N` | `terreno-docs.netlify.app` / `docs-pr-N--terreno-docs.netlify.app` |
206
+ | `gcp-cd-prod` backend / `gcp-cd-preview` | `example-backend-production` / `example-backend-preview-pr-N` | Cloud Run URL / `pr-N---` tag URL |
207
+ | `gcp-cd-prod` MCP | `mcp-production` | Cloud Run `terreno-mcp` URL |
208
+
209
+ Records are posted to `GITHUB_REPOSITORY` when that is set, otherwise
210
+ `TerrenoLabs/terreno`. CircleCI does not set `GITHUB_REPOSITORY`, and
211
+ `CIRCLE_PROJECT_USERNAME` can still be the pre-transfer `FlourishHealth`
212
+ project link, so the script does not use it. Recording is best-effort: an
213
+ unset `GITHUB_DEPLOYMENTS_TOKEN` or a GitHub API error prints a warning and
214
+ never fails the deploy. Terraform applies are not recorded. PR close
215
+ deactivates the preview environments (`preview-cleanup.yml`). The token lives
216
+ in its own context so the GitHub write scope is limited to deployments.
217
+ Same-repo PR pipelines can read every context their jobs attach, so keep this
218
+ token scoped to deployments.
219
+
220
+ Each deploy job has a `serial-group`: production jobs queue per target, and
221
+ previews queue per branch, so two master merges never apply terraform or roll
222
+ Cloud Run at the same time. Turn off Netlify's GitHub auto-build so only
223
+ CircleCI publishes.
191
224
 
192
225
  ## Contexts (create empty shells, then fill)
193
226
 
@@ -204,6 +237,7 @@ restrict `terreno-release` and `terreno-npm` to tag/manual release pipelines.
204
237
  | `terreno-release` | `REPO_ADMIN_TOKEN`, `ZOOM_WEBHOOK_URL`, `ZOOM_WEBHOOK_TOKEN` | stable version bump + release notification |
205
238
  | `terreno-agentic` | `CURSOR_API_KEY`, optional `CURSOR_MODEL` | `architectural-pr-review` |
206
239
  | `terreno-github-api` | PAT (`pull-requests`, `contents`, …) | `dco`, `architectural-pr-review` |
240
+ | `terreno-github-deployments` | `GITHUB_DEPLOYMENTS_TOKEN`: fine-grained PAT on `TerrenoLabs/terreno` with **Deployments: read/write** and **Pull requests: read** only | GitHub Deployment records + preview PR lookup in every Netlify/GCP deploy job |
207
241
 
208
242
  Until contexts exist, e2e jobs may use **project env vars for `E2E_*` secrets only**
209
243
  (or the in-job `ci-e2e-*-secret` fallbacks). **Do not** put `GITHUB_TOKEN` (or any
@@ -215,10 +249,9 @@ project, leave fork-PR secret passing off, and attach that context **only** to
215
249
  unset, and it skips fork PRs. The job checks out `origin/master` before running
216
250
  the review script so a PR cannot rewrite the reviewer.
217
251
 
218
- Netlify and GCP jobs **halt as the first step** when `terreno-netlify` /
219
- `terreno-gcp` are empty, before checkout or `bun install`. Path filters still
220
- start those jobs so filling the context turns deploys on without a config
221
- change; skip-green no longer pays for a full `large` install. Docker Layer
252
+ Netlify and GCP jobs **validate their context as the first step** and fail,
253
+ before checkout or `bun install`, listing the missing variables. Preview jobs
254
+ halt earlier on fork PRs, where CircleCI withholds contexts. Docker Layer
222
255
  Caching is off (200 credits per job). The docs Netlify target disables
223
256
  Docusaurus minification so the build stays within the 8 GB `large` executor.
224
257
 
@@ -284,13 +317,13 @@ the same commands through the parameterized `packages-ci` job, gated by
284
317
 
285
318
  CD replacement map:
286
319
 
287
- | GHA job `name:` / workflow (not yet ported) | Planned CircleCI job |
320
+ | GHA job `name:` / workflow | CircleCI job |
288
321
  |---------------------------------------------|----------------------|
289
322
  | Fingerprint gate (`fingerprint-gate.yml`) | Temporarily disabled; no CircleCI automatic gate |
290
323
  | EAS PR update/build (`eas-pr.yml`) | Temporarily disabled; use manual EAS dispatch |
291
324
  | EAS dev build (`eas-dev-build.yml`) | CircleCI manual `eas-dev-target` |
292
325
  | CD terraform / Cloud Run (`cd.yml`) | `gcp-cd-prod` (master) and `gcp-cd-preview` (PRs) |
293
- | Preview cleanup (`preview-cleanup.yml`) | CircleCI manual `run-preview-cleanup` |
326
+ | Preview cleanup (`preview-cleanup.yml`) | `preview-cleanup`, started by the GitHub PR-close hook |
294
327
  | Netlify demo / frontend / docs deploys | production + `*-preview` jobs |
295
328
  | Publish on tag (`publish-on-tag.yml`) | `publish-release` |
296
329
  | Appium Android / iOS | Not ported (Maestro web is `maestro-e2e`) |
@@ -318,26 +351,52 @@ a closed PR.
318
351
  `manual-publish-package` also accepts `feature-flags`. Versions must be semver.
319
352
  Semver git tags (`57.3.0`, `57.3.0-beta.1`) automatically start
320
353
  `publish-release`; prereleases publish to their prerelease npm dist-tag.
321
- `scripts/ci/publish-package.sh` pins `workspace:*` to the tag version for the
322
- tarball, then compiles and tests against the root workspace install. It must
323
- not `bun install` after that pin: sibling `@terreno/*` packages are not on npm
324
- yet, so bun would look up `@terreno/test@X.Y.Z` (and similar) on the registry
325
- and fail the whole job. Tests use `test:ci` when that script exists, not
326
- `test`. `@terreno/ui`'s `test` is `bun test --watch` and would hang the
327
- publish step after the suite finishes. `publish-release` uses a 20-minute
328
- no-output timeout as a backstop. If a package's tag version is already on npm,
329
- `publish-package.sh` skips it so a recut of the same tag can finish the rest.
330
-
331
- Only stable tags (`57.3.0`) run `deploy-demo` after publish. Use
354
+ `publish-release` compiles the 16 lockstep packages once with
355
+ `bun run --filter ... compile` (dependency order), then runs
356
+ `scripts/ci/publish-package.sh` for all of them in parallel with
357
+ `TERRENO_PUBLISH_PREBUILT=1`. It does not rerun tests: the tagged commit
358
+ already passed CI on master, and rerunning every suite per package made
359
+ releases take 20+ minutes. The job has no Mongo sidecar. Each publish writes
360
+ its own temporary npmrc (`NPM_CONFIG_USERCONFIG`) so parallel publishes do not
361
+ remove each other's token.
362
+
363
+ `publish-package.sh` pins `workspace:*` to the tag version for the tarball.
364
+ It must not `bun install` after that pin: sibling `@terreno/*` packages are
365
+ not on npm yet, so bun would look up `@terreno/test@X.Y.Z` (and similar) on
366
+ the registry and fail the whole job. Without `TERRENO_PUBLISH_PREBUILT` (the
367
+ manual single-package publish), it compiles the package and its workspace
368
+ dependencies and runs `test:ci` when that script exists, not `test`.
369
+ `@terreno/ui`'s `test` is `bun test --watch` and would hang. If a package's
370
+ tag version is already on npm, `publish-package.sh` skips it so a recut of
371
+ the same tag can finish the rest.
372
+
373
+ Only stable tags (`57.3.0`) run `deploy-demo`. It builds the demo from source,
374
+ so it runs alongside `publish-release` instead of waiting for it. Use
332
375
  `{"run-demo-deploy":true}` on `master` if a prerelease must also refresh the
333
376
  demo site.
334
377
 
335
- PR preview **cleanup** is manual because CircleCI does not receive GitHub
336
- `pull_request.closed` events. Configure a GitHub App/webhook to call
337
- `run-preview-cleanup` if automatic lifecycle cleanup is required. Path-filtered
378
+ `scripts/ci/netlify-deploy.sh` builds each site itself and calls
379
+ `netlify deploy --no-build`. Without `--no-build`, netlify-cli runs the root
380
+ `netlify.toml` docs build (wipe `node_modules`, reinstall, full Docusaurus),
381
+ which added about 3.5 minutes to every demo and frontend deploy.
382
+
383
+ CircleCI does not receive GitHub `pull_request.closed` events, so
384
+ `.github/workflows/preview-cleanup.yml` forwards them: it runs master's
385
+ `scripts/ci/trigger-circleci-pipeline.sh` with `{"run-preview-cleanup":"<PR>"}`
386
+ and deactivates the PR's old GitHub Deployments. The manual GHA publisher
387
+ (`publish-on-tag.yml`) uses the same script to start `{"run-demo-deploy":true}`
388
+ on `master`. Both need the GitHub secret `CIRCLECI_TOKEN` (a CircleCI personal
389
+ or project API token) and the repository variable
390
+ `CIRCLECI_PIPELINE_DEFINITION_ID` (Project Settings → Pipelines, or
391
+ `GET /api/v2/projects/<project id>/pipeline-definitions`; the project id comes from
392
+ `GET /api/v2/project/<slug>`). Set the
393
+ optional variable `CIRCLECI_PROJECT_SLUG` if re-linking the project changes
394
+ its slug. Path-filtered
338
395
  preview **deploys** run on open PRs from this repository; fork PRs are skipped.
339
396
  If `CIRCLE_PULL_REQUEST` is unset (GitHub App `push` pipelines), the job looks
340
- up the open PR for `CIRCLE_BRANCH` via the GitHub API.
397
+ up the open PR for `CIRCLE_BRANCH` via the GitHub API on `TerrenoLabs/terreno`
398
+ (`GITHUB_REPOSITORY` when set). It does not use `CIRCLE_PROJECT_USERNAME`,
399
+ which can still be the pre-transfer `FlourishHealth` project link.
341
400
 
342
401
  `mcp-server-docker` is push-only, matching GitHub Actions. It uses
343
402
  `resolve-preview-pr.sh` for that lookup and skips when a PR exists. Its
@@ -348,8 +407,7 @@ tree.
348
407
  ## Path-filter parity guard
349
408
 
350
409
  `bun run check:circleci-parity` guards active GitHub/CircleCI twins. Deploy
351
- workflows are dual-run until CircleCI contexts are filled; they are not in
352
- the parity mapping. New CircleCI-only path rules still belong in
410
+ workflows are disabled on GitHub, so they are not in the parity mapping. New CircleCI-only path rules still belong in
353
411
  `.circleci/config.yml` and config tests. The checker prefers live `config.yml`
354
412
  when `setup: true`.
355
413
 
@@ -401,12 +459,11 @@ circleci config validate .circleci/continue-config.yml
401
459
 
402
460
  ## Disabled GitHub workflows
403
461
 
404
- Package CI, e2e, and npm tag workflows stay `push.branches-ignore: ["**"]`. Netlify/GCP deploy
405
- workflows are **re-enabled** until CircleCI contexts have the same secrets.
406
- After a successful CircleCI production or preview deploy, set
407
- `docs-deploy.yml`, `demo-deploy.yml`, `frontend-example-deploy.yml`, `cd.yml`,
408
- and `preview-cleanup.yml` back to `push.branches-ignore: ["**"]` in the same PR. Never enable both
409
- npm tag publishers. Never leave both GCP terraform applies enabled.
462
+ Package CI, e2e, npm tag, and deploy workflows (`docs-deploy.yml`,
463
+ `demo-deploy.yml`, `frontend-example-deploy.yml`, `cd.yml`) stay
464
+ `push.branches-ignore: ["**"]` for rollback. `preview-cleanup.yml` stays live
465
+ only as the PR-close trigger. Never enable both npm tag publishers. Never
466
+ re-enable `cd.yml` while CircleCI deploys: both would apply terraform.
410
467
 
411
468
  ## Cursor GitHub App checks
412
469
 
@@ -1,8 +1,9 @@
1
1
  # GitHub Actions CI (Terreno)
2
2
 
3
- GitHub Actions is the CI of record. Operator map for the expensive jobs:
4
- [GitHub Actions CI](github-actions-ci.md). CircleCI twins are parked; see
5
- [CircleCI](circleci.md).
3
+ CircleCI is the CI/CD of record; see [CircleCI](circleci.md). The GitHub
4
+ Actions CI and deploy workflows below are disabled
5
+ (`push.branches-ignore: ["**"]`) and kept only for rollback. This page
6
+ describes how they behaved if one is ever re-enabled.
6
7
 
7
8
  ## Docs site (`docs-deploy.yml`)
8
9
 
@@ -0,0 +1,19 @@
1
+ # Preview a component demo
2
+
3
+ Open a component demo and change the shareable query. The preview bar is on demo and
4
+ dev component routes. `?embed=1` applies the same query and hides the bar.
5
+
6
+ ```text
7
+ /demo/Button?theme=dark&viewport=375&background=inverse&locale=en-US&rtl=1&reducedMotion=1
8
+ ```
9
+
10
+ | Query | Values |
11
+ | --- | --- |
12
+ | `theme` | `light` (default) or `dark` (canonical dark role remap) |
13
+ | `viewport` | `full` (default), `320`, `375`, `1024`, `1280` |
14
+ | `background` | `default`, `inverse`, `transparent` |
15
+ | `locale` | Passed to components that already read a locale, such as consent |
16
+ | `rtl` | `1` sets document direction to `rtl` on web |
17
+ | `reducedMotion` | `1` sets `data-reduced-motion="1"` on the document element |
18
+
19
+ Reload keeps the query. The bar shows the current query when any value is not the default. Choosing a control's default removes that key from the URL. Leaving the component route restores the app theme and, on web, document direction and reduced motion. Custom palettes stay on `/palette`.
@@ -11,6 +11,7 @@ import {AnnouncementsApp} from "@terreno/announcements";
11
11
 
12
12
  new AnnouncementsApp({
13
13
  defaultAcknowledgementPolicy: "dismiss-only",
14
+ uploadToken: process.env.ANNOUNCEMENTS_UPLOAD_TOKEN,
14
15
  // audienceType staff/patient/all is applied inside the plugin via matchAudienceByType.
15
16
  isStaff: (user) => (user as {admin?: boolean}).admin === true,
16
17
  matchAudience: (user, announcement) => {
@@ -46,6 +47,8 @@ For Flourish-style surfaces on one collection:
46
47
 
47
48
  2. Create announcements in admin (draft → publish). Use `AnnouncementOverview`, `AnnouncementEditor`, and (optionally) `AnnouncementList` from `@terreno/admin-frontend` with dedicated Expo routes (see `example-frontend/app/admin/announcements/`). The built-in admin screen widget key `announcements` renders the overview when your host uses `AdminScreenRouter` for custom screens. Published `title`/`body` edits auto-increment `version`, which re-shows the surface to users who only acknowledged the previous version.
48
49
 
50
+ For release-driven batches, use an [announcement release pack](../reference/announcement-release-packs.md). It keeps one `pack.yaml` manifest plus multiple Markdown announcements in source control, validates release and build versioning, and can import idempotent drafts or explicitly publish the whole pack through a dedicated bearer token. The example Cloud Run service accepts `Authorization: Bearer terreno-example-announcement-upload` (Terraform variable `announcements_upload_token`).
51
+
49
52
  ### Admin editor fields
50
53
 
51
54
  `AnnouncementEditor` exposes structured targeting controls (no raw `requiresAcknowledgement` boolean):
@@ -8,7 +8,28 @@ the example-backend **dev** server need a replica-set `mongod` (see
8
8
  [AGENTS.md](https://github.com/TerrenoLabs/terreno/blob/master/AGENTS.md) Cursor Cloud
9
9
  section).
10
10
 
11
- ## Do now — package tests
11
+ ## Do now — prepush mirrors CI
12
+
13
+ ```bash
14
+ bun run prepush # lint, compile, then every CI job this branch triggers
15
+ bun run prepush --dry-run # print the plan only
16
+ bun run prepush --all # every check, regardless of changed files
17
+ ```
18
+
19
+ `prepush` diffs committed, staged, unstaged, and untracked files against the merge-base
20
+ with `origin/master`. It applies the CircleCI path-filter mapping in
21
+ `.circleci/config.yml`, then runs the local command for each triggered job: package
22
+ `test:coverage` plus the 90% new-file LCOV gate, `ui` types, demo typecheck,
23
+ example-backend and example-frontend tests, every `repo-policies` step, rulesync drift,
24
+ and the typedoc API reference when `api/src` or `rtk/src` changes. Every step runs even
25
+ after a failure, so a single pass lists every problem. Fix them all, then push once.
26
+
27
+ Jobs that need infrastructure (Playwright e2e, Maestro, admin-spa integration, Docker)
28
+ are listed at the end with the command to run by hand. A test in
29
+ `scripts/ci/prepush/plan.test.ts` fails when the mapping gains a parameter that
30
+ `prepush` neither runs nor lists.
31
+
32
+ ## Package tests
12
33
 
13
34
  From the repo root after `bun bootstrap`:
14
35
 
@@ -39,7 +60,7 @@ bun test --only-failures <path>
39
60
  | `example-frontend-ci` | `bun run frontend:test` |
40
61
  | `ui-demo-ci` | `cd demo && bun run test:ci` then `bun run check:demo-coverage` |
41
62
  | `new-file-coverage` | `bun run check:new-file-coverage --base=origin/master --threshold=90` |
42
- | `repo-policies` | `bun run prepush` (lint, compile, `analyze:full`) |
63
+ | `repo-policies` | `bun run prepush` (runs every repo-policies step) |
43
64
 
44
65
  Coverage gate for a published package: `cd <package> && bun run test:coverage`.
45
66
 
@@ -3,9 +3,11 @@
3
3
  Copy to `docs/implementationPlans/<slug>.md` and replace placeholders. Pair with
4
4
  `docs/tasks/<slug>.md`. Add `**Parent IP:** [other](other.md)` only when this plan
5
5
  rides on another plan's roadmap entry instead of getting its own. A filled Parent
6
- IP header skips reconcile for that file.
6
+ IP header skips reconcile for that file. `**Roadmap:**` sets the Area / Target / Impact
7
+ the roadmap entry is scaffolded with on merge; omit it to have them inferred.
7
8
 
8
9
  **Status:** Draft | Approved | In progress | Complete | Deferred
10
+ **Roadmap:** Area=`api`, Target=`Next`, Impact=`Feature`
9
11
  **Branch:**
10
12
  **Owner:**
11
13
  **Created:** YYYY-MM-DD
@@ -1,6 +1,6 @@
1
1
  # Implementation Plan: Admin Improvements (post–Admin UI v2)
2
2
 
3
- **Status:** Approved
3
+ **Status:** Deferred — roadmap declined #1099; Phase 7 (rules, MCP generator, migration guide, telemetry) not started
4
4
  **Branch:** (implementation TBD)
5
5
  **Owner:** Josh Gachnang
6
6
  **Created:** 2026-06-01 (original); revised 2026-08-20 post–v2 gap analysis
@@ -1,6 +1,7 @@
1
1
  # Implementation Plan: Admin scripts via durable jobs
2
2
 
3
- **Status:** Approved (operator) — 2026-09-14
3
+ **Status:** Complete
4
+ **Roadmap:** Area=`admin`, Target=`Released`, Impact=`Improvement`
4
5
  **Branch:** `cursor/scripts-via-durable-jobs-803d`
5
6
  **Task list:** [admin-scripts-durable-jobs.md](../tasks/admin-scripts-durable-jobs.md)
6
7
  **Depends on:** [job-queues.md](job-queues.md)
@@ -1,6 +1,7 @@
1
1
  # Agent UI Blocks — a strict YAML DSL for agent-rendered Terreno components
2
2
 
3
3
  **Status:** Approved 2026-09-15 (grilling rounds 1–2 closed: D1, D2, D4, D6, D8, D15, D17, D18 confirmed; remaining `assumed` rows are engineering defaults Pick may revise with a note)
4
+ **Roadmap:** Area=`ai`, Target=`Next`, Impact=`Feature`
4
5
  **Branch:** `cursor/agent-ui-blocks-grow-e5c0`
5
6
  **Owner:** unassigned
6
7
  **Created:** 2026-09-15
@@ -1,6 +1,7 @@
1
1
  # Implementation plan: AI agents and provider failover
2
2
 
3
3
  **Status:** Draft
4
+ **Roadmap:** Area=`ai`, Target=`Future`, Impact=`Feature`
4
5
  **Branch:** `cursor/ai-agents-and-failover-ip-97fd`
5
6
  **Owner:** unassigned
6
7
  **Created:** 2026-08-24
@@ -1,6 +1,7 @@
1
1
  # Implementation Plan: AI observability (Langfuse-light, pluggable)
2
2
 
3
3
  **Status:** Draft
4
+ **Roadmap:** Area=`ai`, Target=`Future`, Impact=`Feature`
4
5
  **Created:** 2026-08-24
5
6
  **Owner:** unassigned
6
7
  **Branch:** `cursor/ai-observability-ip-64ca`
@@ -1,6 +1,6 @@
1
1
  # Announcement Surfaces, Targeting, and Click Tracking
2
2
 
3
- **Status:** Implementation complete — Phase 4 verified; Taste in progress
3
+ **Status:** Complete — shipped with announcements
4
4
  **Parent IP:** [announcements](announcements.md)
5
5
  **Branch:** `cursor/announcements-grow-bf9c`
6
6
  **Owner:** Terreno
@@ -1,6 +1,7 @@
1
1
  # Product Update Announcements — In-App Core Feature
2
2
 
3
- **Status:** In progress — implementation and Roast complete; pending Brew
3
+ **Status:** Complete — shipped with @terreno/announcements (57.6.x)
4
+ **Roadmap:** Area=`api`, Target=`Released`, Impact=`Feature`
4
5
  **Branch:** `cursor/announcements-grow-bf9c`
5
6
  **Owner:** Terreno
6
7
  **Created:** 2026-09-08
@@ -1,6 +1,7 @@
1
1
  # Implementation Plan: App MCP server
2
2
 
3
3
  **Status:** Draft
4
+ **Roadmap:** Area=`mcp`, Target=`Future`, Impact=`Feature`
4
5
  **Created:** 2026-08-24
5
6
  **Owner:** unassigned
6
7
  **Depends on:** [model-router-mcp.md](model-router-mcp.md) (shipped), [mcp-boost-parity.md](mcp-boost-parity.md) (dev-time MCP — sibling, not a blocker)
@@ -1,6 +1,7 @@
1
1
  # Implementation plan: Better Auth sync omits unset `oauthProvider`
2
2
 
3
- **Status:** In progress
3
+ **Status:** Complete — fix on master (`syncBetterAuthUser` omits unset `oauthProvider`)
4
+ **Roadmap:** Area=`auth`, Target=`Released`, Impact=`Fix`
4
5
  **Issue:** https://github.com/TerrenoLabs/terreno/issues/1218
5
6
  **Branch:** `cursor/better-auth-strict-oauth-provider-3b37`
6
7
  **Created:** 2026-08-30
@@ -1,6 +1,6 @@
1
1
  # `can()` as the permission seam
2
2
 
3
- **Status:** Approved — 2026-08-24
3
+ **Status:** Complete
4
4
  **Branch:** `cursor/architecture-ips-a7ec`
5
5
  **Owner:** —
6
6
  **Created:** 2026-08-24
@@ -1,6 +1,6 @@
1
1
  # One collection registry
2
2
 
3
- **Status:** Approved — 2026-08-24
3
+ **Status:** Complete
4
4
  **Branch:** `cursor/architecture-ips-a7ec`
5
5
  **Owner:** —
6
6
  **Created:** 2026-08-24
@@ -1,6 +1,6 @@
1
1
  # Implementation Plan: Comms adapter — Expo push notifications
2
2
 
3
- **Status:** In progress
3
+ **Status:** Complete — shipped in #1204
4
4
  **Roadmap issue:** https://github.com/TerrenoLabs/terreno/issues/1019
5
5
  **Priority:** High
6
6
  **Effort:** Small batch
@@ -1,6 +1,6 @@
1
1
  # Implementation Plan: Comms adapter — Twilio SMS
2
2
 
3
- **Status:** Approved
3
+ **Status:** In progress — Phase 1 send path shipped; Phase 2 (status callbacks, STOP/START opt-out) open
4
4
  **Roadmap issue:** https://github.com/TerrenoLabs/terreno/issues/1020
5
5
  **Priority:** Medium
6
6
  **Effort:** Small batch
@@ -1,6 +1,6 @@
1
1
  # Implementation Plan: Comms admin dashboard (errors, retries, log digging)
2
2
 
3
- **Status:** Approved
3
+ **Status:** Complete
4
4
  **Roadmap issue:** https://github.com/TerrenoLabs/terreno/issues/1091
5
5
  **Priority:** High
6
6
  **Effort:** Medium batch
@@ -1,6 +1,7 @@
1
1
  # Implementation Plan: Compile pipeline dedup (remove redundant recompiles)
2
2
 
3
- **Status:** Approved (2026-09-22)
3
+ **Status:** Complete — shipped in #1360
4
+ **Roadmap:** Area=`dx`, Target=`Released`, Impact=`Improvement`
4
5
  **Scan goal:** reduce-cold-compile-time ([charter](../scans/reduce-cold-compile-time/charter.md)) — cold `bun run compile` 305s → 214s
5
6
  **Slice:** pipeline-ordering-dedup (round 1, top slice)
6
7
  **Findings:** redundant-explicit-prefix (high, S), compile-workspace-deps-overlap (high, M)
@@ -1,6 +1,6 @@
1
1
  # Implementation Plan: DataTable server-side filtering and search
2
2
 
3
- **Status:** Approved
3
+ **Status:** Complete — shipped in #1303
4
4
  **Branch:** `cursor/datatable-server-side-filtering-191d`
5
5
  **Owner:** —
6
6
  **Created:** 2026-09-10