@terreno/mcp 57.6.0 → 57.7.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.
- package/dist/docs/upgrades/57.7.0.md +64 -0
- package/dist/docs/upgrades/58.0.0.md +4 -0
- package/dist/docs/versioned/next/explanation/loop-engineering.md +32 -3
- package/dist/docs/versioned/next/explanation/repository-settings.md +12 -5
- package/dist/docs/versioned/next/explanation/roadmap-process.md +41 -19
- package/dist/docs/versioned/next/explanation/roadmap-seed-issues.md +271 -22
- package/dist/docs/versioned/next/explanation/static-analysis.md +3 -2
- package/dist/docs/versioned/next/explanation/test-isolation.md +42 -0
- package/dist/docs/versioned/next/how-to/circleci.md +95 -53
- package/dist/docs/versioned/next/how-to/github-actions-ci.md +4 -3
- package/dist/docs/versioned/next/how-to/run-tests-locally.md +23 -2
- package/dist/docs/versioned/next/implementationPlans/IP_TEMPLATE.md +3 -1
- package/dist/docs/versioned/next/implementationPlans/admin-improvements.md +1 -1
- package/dist/docs/versioned/next/implementationPlans/admin-scripts-durable-jobs.md +2 -1
- package/dist/docs/versioned/next/implementationPlans/agent-ui-blocks.md +1 -0
- package/dist/docs/versioned/next/implementationPlans/ai-agents-and-failover.md +1 -0
- package/dist/docs/versioned/next/implementationPlans/ai-observability.md +1 -0
- package/dist/docs/versioned/next/implementationPlans/announcements-surfaces.md +1 -1
- package/dist/docs/versioned/next/implementationPlans/announcements.md +2 -1
- package/dist/docs/versioned/next/implementationPlans/app-mcp-server.md +1 -0
- package/dist/docs/versioned/next/implementationPlans/better-auth-strict-oauth-provider.md +2 -1
- package/dist/docs/versioned/next/implementationPlans/can-as-permission-seam.md +1 -1
- package/dist/docs/versioned/next/implementationPlans/collection-registry.md +1 -1
- package/dist/docs/versioned/next/implementationPlans/comms-adapter-expo-push.md +1 -1
- package/dist/docs/versioned/next/implementationPlans/comms-adapter-twilio-sms.md +1 -1
- package/dist/docs/versioned/next/implementationPlans/comms-admin-dashboard.md +1 -1
- package/dist/docs/versioned/next/implementationPlans/compile-pipeline-dedup.md +2 -1
- package/dist/docs/versioned/next/implementationPlans/datatable-server-side-filtering.md +1 -1
- package/dist/docs/versioned/next/implementationPlans/describe-model-schema.md +1 -1
- package/dist/docs/versioned/next/implementationPlans/docs-reference-coverage.md +1 -1
- package/dist/docs/versioned/next/implementationPlans/docs-site-and-versioning.md +1 -1
- package/dist/docs/versioned/next/implementationPlans/examples-demo-coverage.md +1 -1
- package/dist/docs/versioned/next/implementationPlans/framework-audit-log.md +1 -1
- package/dist/docs/versioned/next/implementationPlans/gpt-chat-mascot.md +1 -0
- package/dist/docs/versioned/next/implementationPlans/inbound-webhooks.md +1 -1
- package/dist/docs/versioned/next/implementationPlans/knip-cleanup.md +1 -0
- package/dist/docs/versioned/next/implementationPlans/mcp-doc-sync-off-compile-path.md +2 -1
- package/dist/docs/versioned/next/implementationPlans/mcp-service-tokens.md +2 -1
- package/dist/docs/versioned/next/implementationPlans/migrate-admin-to-syncdb.md +2 -1
- package/dist/docs/versioned/next/implementationPlans/migrate-cicd-to-circleci.md +1 -1
- package/dist/docs/versioned/next/implementationPlans/mongodb-migrations-tooling.md +1 -1
- package/dist/docs/versioned/next/implementationPlans/notification-center.md +1 -1
- package/dist/docs/versioned/next/implementationPlans/org-management-ui.md +1 -1
- package/dist/docs/versioned/next/implementationPlans/password-reset-and-email-verification.md +1 -1
- package/dist/docs/versioned/next/implementationPlans/rate-limiting.md +1 -1
- package/dist/docs/versioned/next/implementationPlans/remove-legacy-realtime.md +1 -0
- package/dist/docs/versioned/next/implementationPlans/support-agent.md +1 -0
- package/dist/docs/versioned/next/implementationPlans/syncdb-codegen.md +1 -1
- package/dist/docs/versioned/next/implementationPlans/terreno-langfuse-integration.md +1 -1
- package/dist/docs/versioned/next/implementationPlans/upgrade-guides-and-skill.md +1 -1
- package/dist/docs/versioned/next/reference/api.md +16 -0
- package/dist/docs/versioned/next/reference/lifecycle-plugin.md +2 -2
- package/dist/docs/versioned/next/reference/test.md +1 -1
- package/dist/docs/versioned/next/reference/ui.md +65 -2
- package/dist/docs/versioned/next/tasks/can-as-permission-seam.md +4 -4
- package/dist/docs/versioned/next/tasks/collection-registry.md +6 -6
- package/dist/docs/versioned/next/tasks/describe-model-schema.md +5 -5
- package/dist/docs/versioned/next/tasks/migrate-cicd-to-circleci.md +6 -3
- package/package.json +2 -2
- package/src/docs/upgrades/57.7.0.md +64 -0
- package/src/docs/upgrades/58.0.0.md +4 -0
- package/src/docs/versioned/next/explanation/loop-engineering.md +32 -3
- package/src/docs/versioned/next/explanation/repository-settings.md +12 -5
- package/src/docs/versioned/next/explanation/roadmap-process.md +41 -19
- package/src/docs/versioned/next/explanation/roadmap-seed-issues.md +271 -22
- package/src/docs/versioned/next/explanation/static-analysis.md +3 -2
- package/src/docs/versioned/next/explanation/test-isolation.md +42 -0
- package/src/docs/versioned/next/how-to/circleci.md +95 -53
- package/src/docs/versioned/next/how-to/github-actions-ci.md +4 -3
- package/src/docs/versioned/next/how-to/run-tests-locally.md +23 -2
- package/src/docs/versioned/next/implementationPlans/IP_TEMPLATE.md +3 -1
- package/src/docs/versioned/next/implementationPlans/admin-improvements.md +1 -1
- package/src/docs/versioned/next/implementationPlans/admin-scripts-durable-jobs.md +2 -1
- package/src/docs/versioned/next/implementationPlans/agent-ui-blocks.md +1 -0
- package/src/docs/versioned/next/implementationPlans/ai-agents-and-failover.md +1 -0
- package/src/docs/versioned/next/implementationPlans/ai-observability.md +1 -0
- package/src/docs/versioned/next/implementationPlans/announcements-surfaces.md +1 -1
- package/src/docs/versioned/next/implementationPlans/announcements.md +2 -1
- package/src/docs/versioned/next/implementationPlans/app-mcp-server.md +1 -0
- package/src/docs/versioned/next/implementationPlans/better-auth-strict-oauth-provider.md +2 -1
- package/src/docs/versioned/next/implementationPlans/can-as-permission-seam.md +1 -1
- package/src/docs/versioned/next/implementationPlans/collection-registry.md +1 -1
- package/src/docs/versioned/next/implementationPlans/comms-adapter-expo-push.md +1 -1
- package/src/docs/versioned/next/implementationPlans/comms-adapter-twilio-sms.md +1 -1
- package/src/docs/versioned/next/implementationPlans/comms-admin-dashboard.md +1 -1
- package/src/docs/versioned/next/implementationPlans/compile-pipeline-dedup.md +2 -1
- package/src/docs/versioned/next/implementationPlans/datatable-server-side-filtering.md +1 -1
- package/src/docs/versioned/next/implementationPlans/describe-model-schema.md +1 -1
- package/src/docs/versioned/next/implementationPlans/docs-reference-coverage.md +1 -1
- package/src/docs/versioned/next/implementationPlans/docs-site-and-versioning.md +1 -1
- package/src/docs/versioned/next/implementationPlans/examples-demo-coverage.md +1 -1
- package/src/docs/versioned/next/implementationPlans/framework-audit-log.md +1 -1
- package/src/docs/versioned/next/implementationPlans/gpt-chat-mascot.md +1 -0
- package/src/docs/versioned/next/implementationPlans/inbound-webhooks.md +1 -1
- package/src/docs/versioned/next/implementationPlans/knip-cleanup.md +1 -0
- package/src/docs/versioned/next/implementationPlans/mcp-doc-sync-off-compile-path.md +2 -1
- package/src/docs/versioned/next/implementationPlans/mcp-service-tokens.md +2 -1
- package/src/docs/versioned/next/implementationPlans/migrate-admin-to-syncdb.md +2 -1
- package/src/docs/versioned/next/implementationPlans/migrate-cicd-to-circleci.md +1 -1
- package/src/docs/versioned/next/implementationPlans/mongodb-migrations-tooling.md +1 -1
- package/src/docs/versioned/next/implementationPlans/notification-center.md +1 -1
- package/src/docs/versioned/next/implementationPlans/org-management-ui.md +1 -1
- package/src/docs/versioned/next/implementationPlans/password-reset-and-email-verification.md +1 -1
- package/src/docs/versioned/next/implementationPlans/rate-limiting.md +1 -1
- package/src/docs/versioned/next/implementationPlans/remove-legacy-realtime.md +1 -0
- package/src/docs/versioned/next/implementationPlans/support-agent.md +1 -0
- package/src/docs/versioned/next/implementationPlans/syncdb-codegen.md +1 -1
- package/src/docs/versioned/next/implementationPlans/terreno-langfuse-integration.md +1 -1
- package/src/docs/versioned/next/implementationPlans/upgrade-guides-and-skill.md +1 -1
- package/src/docs/versioned/next/reference/api.md +16 -0
- package/src/docs/versioned/next/reference/lifecycle-plugin.md +2 -2
- package/src/docs/versioned/next/reference/test.md +1 -1
- package/src/docs/versioned/next/reference/ui.md +65 -2
- package/src/docs/versioned/next/tasks/can-as-permission-seam.md +4 -4
- package/src/docs/versioned/next/tasks/collection-registry.md +6 -6
- package/src/docs/versioned/next/tasks/describe-model-schema.md +5 -5
- package/src/docs/versioned/next/tasks/migrate-cicd-to-circleci.md +6 -3
|
@@ -137,7 +137,7 @@ support, organized around batteries included, universal by default, and AI-nativ
|
|
|
137
137
|
**Title:** `Reference documentation coverage`
|
|
138
138
|
|
|
139
139
|
**Labels:** `area:docs`, `type:docs`
|
|
140
|
-
**Project fields:** Area=`docs`, Target=`
|
|
140
|
+
**Project fields:** Area=`docs`, Target=`Released`, Impact=`Improvement`, IP=`docs-reference-coverage`, Status=`Shipped`
|
|
141
141
|
|
|
142
142
|
Gives every published Terreno package a real README and a public docs/reference page instead
|
|
143
143
|
of stubs. Adds missing reference pages, de-stubs package READMEs, sanitizes internal
|
|
@@ -209,7 +209,7 @@ websocket verification. Requires a spike on backend hosting options.
|
|
|
209
209
|
**Title:** `Upgrade guides and upgrading-terreno skill`
|
|
210
210
|
|
|
211
211
|
**Labels:** `area:mcp`, `type:docs`
|
|
212
|
-
**Project fields:** Area=`mcp`, Target=`
|
|
212
|
+
**Project fields:** Area=`mcp`, Target=`Released`, Impact=`Improvement`, IP=`upgrade-guides-and-skill`, Status=`Shipped`
|
|
213
213
|
|
|
214
214
|
Makes upgrading Terreno across lockstep-published packages a documented, repeatable process.
|
|
215
215
|
Backfills upgrade notes, adds versioning policy, ships an upgrading-terreno skill, and
|
|
@@ -262,7 +262,7 @@ using only public docs and skills, then publishes a friction log and blog post.
|
|
|
262
262
|
**Title:** `Examples, demo, and test coverage`
|
|
263
263
|
|
|
264
264
|
**Labels:** `area:examples`, `type:chore`
|
|
265
|
-
**Project fields:** Area=`examples`, Target=`
|
|
265
|
+
**Project fields:** Area=`examples`, Target=`Released`, Impact=`Improvement`, IP=`examples-demo-coverage`, Status=`Shipped`
|
|
266
266
|
|
|
267
267
|
Closes credibility gaps in examples, the UI demo app, and CI coverage gates. Adds missing demo
|
|
268
268
|
stories, extends coverage enforcement, and publishes an example-app feature matrix.
|
|
@@ -352,7 +352,7 @@ roadmap item, so apps only install the SDKs they use.
|
|
|
352
352
|
**Title:** `Comms adapter — Expo push notifications`
|
|
353
353
|
|
|
354
354
|
**Labels:** `area:api`, `type:feature`
|
|
355
|
-
**Project fields:** Area=`api`, Target=`
|
|
355
|
+
**Project fields:** Area=`api`, Target=`Released`, Impact=`Feature`, IP=`comms-adapter-expo-push`, Status=`Shipped`
|
|
356
356
|
|
|
357
357
|
Implements the `@terreno/comms` push provider on Expo's push service using
|
|
358
358
|
`expo-server-sdk` (already a dependency of `@terreno/api`, currently unused). Covers token
|
|
@@ -371,7 +371,7 @@ half — `getExpoPushTokenAsync` registration — already exists in example-fron
|
|
|
371
371
|
**Title:** `Comms adapter — Twilio SMS`
|
|
372
372
|
|
|
373
373
|
**Labels:** `area:api`, `type:feature`
|
|
374
|
-
**Project fields:** Area=`api`, Target=`Next`, Impact=`Feature`, IP=`comms-adapter-twilio-sms`, Status=`
|
|
374
|
+
**Project fields:** Area=`api`, Target=`Next`, Impact=`Feature`, IP=`comms-adapter-twilio-sms`, Status=`In progress`
|
|
375
375
|
|
|
376
376
|
Implements the `@terreno/comms` SMS provider on Twilio Programmable Messaging: send via
|
|
377
377
|
messaging service or from-number, delivery status callbacks through the inbound-webhook
|
|
@@ -390,7 +390,7 @@ catalog.
|
|
|
390
390
|
**Title:** `Comms adapter — Twilio Verify (OTP)`
|
|
391
391
|
|
|
392
392
|
**Labels:** `area:api`, `type:feature`
|
|
393
|
-
**Project fields:** Area=`api`, Target=`
|
|
393
|
+
**Project fields:** Area=`api`, Target=`Released`, Impact=`Feature`, IP=`comms-adapter-twilio-verify`, Status=`Shipped`
|
|
394
394
|
|
|
395
395
|
Implements the `@terreno/comms` verification provider on Twilio Verify for SMS and email
|
|
396
396
|
one-time codes. This is the delivery channel for phone verification and for the future MFA
|
|
@@ -427,7 +427,7 @@ SES, SMTP) get their own items when demand appears.
|
|
|
427
427
|
**Title:** `Comms admin dashboard (errors, retries, log digging)`
|
|
428
428
|
|
|
429
429
|
**Labels:** `area:admin`, `type:feature`
|
|
430
|
-
**Project fields:** Area=`admin`, Target=`
|
|
430
|
+
**Project fields:** Area=`admin`, Target=`Released`, Impact=`Feature`, IP=`comms-admin-dashboard`, Status=`Shipped`
|
|
431
431
|
|
|
432
432
|
Makes the admin panel the operations surface for the `@terreno/comms` layer: filterable
|
|
433
433
|
delivery logs (channel, provider, status, error code/class, recipient, date range, free
|
|
@@ -448,7 +448,7 @@ comms abstraction.
|
|
|
448
448
|
**Title:** `Password reset and email verification`
|
|
449
449
|
|
|
450
450
|
**Labels:** `area:auth`, `type:feature`
|
|
451
|
-
**Project fields:** Area=`auth`, Target=`
|
|
451
|
+
**Project fields:** Area=`auth`, Target=`Released`, Impact=`Feature`, IP=`password-reset-and-email-verification`, Status=`Shipped`
|
|
452
452
|
|
|
453
453
|
Closes a functional hole: the `@terreno/rtk` client already exposes a `resetPassword`
|
|
454
454
|
endpoint but no backend route implements it, and there is no email verification flow.
|
|
@@ -467,7 +467,7 @@ equivalents, and sends the emails through `@terreno/comms`.
|
|
|
467
467
|
**Title:** `Inbound webhook framework`
|
|
468
468
|
|
|
469
469
|
**Labels:** `area:api`, `type:feature`
|
|
470
|
-
**Project fields:** Area=`api`, Target=`
|
|
470
|
+
**Project fields:** Area=`api`, Target=`Released`, Impact=`Feature`, IP=`inbound-webhooks`, Status=`Shipped`
|
|
471
471
|
|
|
472
472
|
**GitHub:** https://github.com/TerrenoLabs/terreno/issues/1172
|
|
473
473
|
|
|
@@ -545,7 +545,7 @@ billing can later enforce. Emails go through `@terreno/comms`.
|
|
|
545
545
|
**Title:** `Organizations as a first-class primitive (admin UI + RBAC)`
|
|
546
546
|
|
|
547
547
|
**Labels:** `area:api`, `type:feature`
|
|
548
|
-
**Project fields:** Area=`api`, Target=`
|
|
548
|
+
**Project fields:** Area=`api`, Target=`Released`, Impact=`Feature`, IP=`org-management-ui`, Status=`Shipped`
|
|
549
549
|
|
|
550
550
|
Native Organization and Membership models, RBAC (`org-admin`, `operator`, `superadmin`),
|
|
551
551
|
and admin-panel directory / switcher / members / settings. Operators manage all orgs;
|
|
@@ -585,7 +585,7 @@ are a separate item.
|
|
|
585
585
|
**Title:** `Native module baseline for the next major release`
|
|
586
586
|
|
|
587
587
|
**Labels:** `area:ui`, `type:chore`, `breaking`
|
|
588
|
-
**Project fields:** Area=`ui`, Target=`Next`, Impact=`Breaking`, IP
|
|
588
|
+
**Project fields:** Area=`ui`, Target=`Next`, Impact=`Breaking`, IP=`native-module-baseline`, Status=`Shaping`
|
|
589
589
|
|
|
590
590
|
Adding a native module to a Terreno app forces a new dev-client/store binary, so every
|
|
591
591
|
native dependency the B2B program needs lands in one major release: Stripe payment sheet,
|
|
@@ -663,7 +663,7 @@ root views and system chrome follow the scheme.
|
|
|
663
663
|
**Title:** `DataTable server-side filtering and search`
|
|
664
664
|
|
|
665
665
|
**Labels:** `area:ui`, `type:feature`
|
|
666
|
-
**Project fields:** Area=`ui`, Target=`
|
|
666
|
+
**Project fields:** Area=`ui`, Target=`Released`, Impact=`Feature`, IP=`datatable-server-side-filtering`, Status=`Shipped`
|
|
667
667
|
|
|
668
668
|
DataTable sorts and paginates but has no filter UI. Adds per-column filter controls and a
|
|
669
669
|
search box that emit modelRouter-compatible query params (`queryFields`, `$and`/`$or`), so
|
|
@@ -700,7 +700,7 @@ native module baseline regardless, so this lands as a JS/OTA feature when schedu
|
|
|
700
700
|
**Title:** `In-app notification center`
|
|
701
701
|
|
|
702
702
|
**Labels:** `area:ui`, `type:feature`
|
|
703
|
-
**Project fields:** Area=`ui`, Target=`
|
|
703
|
+
**Project fields:** Area=`ui`, Target=`Released`, Impact=`Feature`, IP=`notification-center` (Approved), Status=`Shipped`
|
|
704
704
|
|
|
705
705
|
Adds a Notification model with per-user preferences, realtime delivery over the existing
|
|
706
706
|
change-stream socket layer, and a bell/inbox UI in `@terreno/ui` with read/unread state —
|
|
@@ -827,7 +827,7 @@ enforcement hooks in the permission layer.
|
|
|
827
827
|
**Title:** `Framework-level audit log`
|
|
828
828
|
|
|
829
829
|
**Labels:** `area:api`, `type:feature`
|
|
830
|
-
**Project fields:** Area=`api`, Target=`
|
|
830
|
+
**Project fields:** Area=`api`, Target=`Released`, Impact=`Feature`, IP=`framework-audit-log`, Status=`Shipped`
|
|
831
831
|
|
|
832
832
|
Generalizes the admin/consent audit patterns into a first-class audit log: an AuditEvent
|
|
833
833
|
model, modelRouter hooks that record who changed what (with before/after diffs), org
|
|
@@ -849,7 +849,7 @@ Shipping this work **closes** https://github.com/TerrenoLabs/terreno/issues/1186
|
|
|
849
849
|
**Title:** `API rate limiting`
|
|
850
850
|
|
|
851
851
|
**Labels:** `area:api`, `type:feature`
|
|
852
|
-
**Project fields:** Area=`api`, Target=`
|
|
852
|
+
**Project fields:** Area=`api`, Target=`Released`, Impact=`Feature`, IP=`rate-limiting`, Status=`Shipped`
|
|
853
853
|
|
|
854
854
|
Adds opt-in HTTP rate limiting to `@terreno/api`: per-user or per-IP keys, stricter
|
|
855
855
|
auth/OTP buckets (including login), memory Redis or Mongo stores, and 429 rate-limit
|
|
@@ -892,7 +892,7 @@ Shipping this work **closes** https://github.com/TerrenoLabs/terreno/issues/1188
|
|
|
892
892
|
**Title:** `MongoDB migrations tooling`
|
|
893
893
|
|
|
894
894
|
**Labels:** `area:api`, `type:feature`
|
|
895
|
-
**Project fields:** Area=`api`, Target=`
|
|
895
|
+
**Project fields:** Area=`api`, Target=`Released`, Impact=`Feature`, IP=`mongodb-migrations-tooling`, Status=`Shipped`
|
|
896
896
|
|
|
897
897
|
A migrations runner for Terreno apps: versioned migration files, up/down with a lock
|
|
898
898
|
collection, CI checks, CLI generate-from-schema-diff, optional boot apply, and an admin
|
|
@@ -937,7 +937,7 @@ permission, hook, field-view, or soft-delete fix lands once instead of twice.
|
|
|
937
937
|
**Title:** `[Roadmap] One collection registry`
|
|
938
938
|
|
|
939
939
|
**Labels:** `area:api`, `type:chore`
|
|
940
|
-
**Project fields:** Area=`api`, Target=`
|
|
940
|
+
**Project fields:** Area=`api`, Target=`Released`, Impact=`Improvement`, IP=`collection-registry`, Status=`Shipped`
|
|
941
941
|
|
|
942
942
|
Registers a `modelRouter` collection once. MCP, realtime, and Sync each keep a process-global
|
|
943
943
|
array plus an `update*RegistryOptions` call today, so every RBAC or MCP change has to touch
|
|
@@ -956,7 +956,7 @@ options, surfaces}` and the existing per-surface lookups become views over it.
|
|
|
956
956
|
**Title:** `[Roadmap] can() as the permission seam`
|
|
957
957
|
|
|
958
958
|
**Labels:** `area:api`, `type:chore`
|
|
959
|
-
**Project fields:** Area=`api`, Target=`
|
|
959
|
+
**Project fields:** Area=`api`, Target=`Released`, Impact=`Improvement`, IP=`can-as-permission-seam`, Status=`Shipped`
|
|
960
960
|
|
|
961
961
|
Finishes the RBAC work by making `accessControl.can()` the enforcement engine wherever a
|
|
962
962
|
router declares `access`. Today RBAC roles and statements are compiled down into legacy
|
|
@@ -975,7 +975,7 @@ must pass both `access` and `permissions` and the two can disagree.
|
|
|
975
975
|
**Title:** `[Roadmap] describeModel() schema metadata`
|
|
976
976
|
|
|
977
977
|
**Labels:** `area:api`, `type:chore`
|
|
978
|
-
**Project fields:** Area=`api`, Target=`
|
|
978
|
+
**Project fields:** Area=`api`, Target=`Released`, Impact=`Improvement`, IP=`describe-model-schema`, Status=`Shipped`
|
|
979
979
|
|
|
980
980
|
Walks each Mongoose schema once into a shared `ModelDescription`. OpenAPI generation, the
|
|
981
981
|
admin field-widget extractor, and the MCP Zod tool generator each re-interpret `schema.paths`
|
|
@@ -1009,6 +1009,254 @@ stay gated behind capability flags.
|
|
|
1009
1009
|
|
|
1010
1010
|
---
|
|
1011
1011
|
|
|
1012
|
+
## mcp-doc-sync-off-compile-path
|
|
1013
|
+
|
|
1014
|
+
**Title:** `Move mcp-server doc-sync off the compile path`
|
|
1015
|
+
|
|
1016
|
+
**Labels:** `area:dx`, `type:chore`
|
|
1017
|
+
**Project fields:** Area=`dx`, Target=`Released`, Impact=`Improvement`, IP=`mcp-doc-sync-off-compile-path`, Status=`Shipped`
|
|
1018
|
+
|
|
1019
|
+
Take the three doc-sync scripts and the `cp` off mcp-server's `compile` script so a normal `bun run compile` type-checks only. This removes ~5s of fixed I/O from every cold build and — critically — eliminates a Bun `cpSync` race in `sync-versioned-docs` that intermittently fails the full concurrent build (observed 1/3 runs once Slice B raises build concurrency).
|
|
1020
|
+
|
|
1021
|
+
- **Implementation plan:** [mcp-doc-sync-off-compile-path.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/implementationPlans/mcp-doc-sync-off-compile-path.md)
|
|
1022
|
+
- **Tasks:** [mcp-doc-sync-off-compile-path.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/tasks/mcp-doc-sync-off-compile-path.md)
|
|
1023
|
+
|
|
1024
|
+
---
|
|
1025
|
+
|
|
1026
|
+
## admin-scripts-durable-jobs
|
|
1027
|
+
|
|
1028
|
+
**Title:** `Admin scripts via durable jobs`
|
|
1029
|
+
|
|
1030
|
+
**Labels:** `area:admin`, `type:chore`
|
|
1031
|
+
**Project fields:** Area=`admin`, Target=`Released`, Impact=`Improvement`, IP=`admin-scripts-durable-jobs`, Status=`Shipped`
|
|
1032
|
+
|
|
1033
|
+
Admin HTTP script runs (`POST /admin/scripts/:name/run`) enqueue `@terreno/jobs` job `admin/script` when `JobsApp` is registered, while the Scripts UI keeps polling `BackgroundTask` by `taskId`.
|
|
1034
|
+
|
|
1035
|
+
- **Implementation plan:** [admin-scripts-durable-jobs.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/implementationPlans/admin-scripts-durable-jobs.md)
|
|
1036
|
+
- **Tasks:** [admin-scripts-durable-jobs.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/tasks/admin-scripts-durable-jobs.md)
|
|
1037
|
+
|
|
1038
|
+
---
|
|
1039
|
+
|
|
1040
|
+
## announcements
|
|
1041
|
+
|
|
1042
|
+
**Title:** `Product Update Announcements — In-App Core Feature`
|
|
1043
|
+
|
|
1044
|
+
**Labels:** `area:api`, `type:feature`
|
|
1045
|
+
**Project fields:** Area=`api`, Target=`Released`, Impact=`Feature`, IP=`announcements`, Status=`Shipped`
|
|
1046
|
+
|
|
1047
|
+
Ship a **core Terreno feature** for admin-managed, in-app product update announcements — similar in scope to feature flags and consent forms. Admins create markdown announcements with scheduling, targeting metadata, and lifecycle controls. Authenticated users see a **priority-ordered modal queue** (one at a time) and can browse a **changelog feed**. Consumers (e.g. Flourish) configure audience matching and acknowledgement policy without forking the package.
|
|
1048
|
+
|
|
1049
|
+
- **Implementation plan:** [announcements.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/implementationPlans/announcements.md)
|
|
1050
|
+
- **Tasks:** [announcements.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/tasks/announcements.md)
|
|
1051
|
+
|
|
1052
|
+
---
|
|
1053
|
+
|
|
1054
|
+
## gpt-chat-mascot
|
|
1055
|
+
|
|
1056
|
+
**Title:** `GPTChat optional mascot`
|
|
1057
|
+
|
|
1058
|
+
**Labels:** `area:ui`, `type:feature`
|
|
1059
|
+
**Project fields:** Area=`ui`, Target=`Released`, Impact=`Feature`, IP=`gpt-chat-mascot`, Status=`Shipped`
|
|
1060
|
+
|
|
1061
|
+
Let consuming apps brand the GPT screen with their own mascot. Terreno does not ship a default character.
|
|
1062
|
+
|
|
1063
|
+
- **Implementation plan:** [gpt-chat-mascot.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/implementationPlans/gpt-chat-mascot.md)
|
|
1064
|
+
- **Tasks:** [gpt-chat-mascot.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/tasks/gpt-chat-mascot.md)
|
|
1065
|
+
|
|
1066
|
+
---
|
|
1067
|
+
|
|
1068
|
+
## knip-cleanup
|
|
1069
|
+
|
|
1070
|
+
**Title:** `Remove the Knip baseline`
|
|
1071
|
+
|
|
1072
|
+
**Labels:** `area:dx`, `type:chore`
|
|
1073
|
+
**Project fields:** Area=`dx`, Target=`Released`, Impact=`Improvement`, IP=`knip-cleanup`, Status=`Shipped`
|
|
1074
|
+
|
|
1075
|
+
`bun run analyze:full` stays green and Knip has no baseline file. Every finding that existed on 2026-09-08 (~1076 fingerprints: 529 default + 547 production) is either **gone from the live Knip report** (fixed) or **declared in `knip.jsonc` with a one-line reason** (disabled).
|
|
1076
|
+
|
|
1077
|
+
- **Implementation plan:** [knip-cleanup.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/implementationPlans/knip-cleanup.md)
|
|
1078
|
+
- **Tasks:** [knip-cleanup.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/tasks/knip-cleanup.md)
|
|
1079
|
+
|
|
1080
|
+
---
|
|
1081
|
+
|
|
1082
|
+
## agent-ui-blocks
|
|
1083
|
+
|
|
1084
|
+
**Title:** `Agent UI Blocks — a strict YAML DSL for agent-rendered Terreno components`
|
|
1085
|
+
|
|
1086
|
+
**Labels:** `area:ai`, `type:feature`
|
|
1087
|
+
**Project fields:** Area=`ai`, Target=`Next`, Impact=`Feature`, IP=`agent-ui-blocks`, Status=`Planned`
|
|
1088
|
+
|
|
1089
|
+
Let an agent answer with **components, not just prose**. When UI blocks are enabled for a chat, **every assistant reply is one YAML document**: a short, ordered list of **blocks** (heading, text, metric, chart, table, actions, columns, card, …) plus named **datasets** that charts and tables bind to. Prose is a `text` block. Terreno owns the grammar, the validator, and the renderer, so the agent can only ever produce `@terreno/ui` components painted from the app theme — never HTML, JSX, or hex colors.
|
|
1090
|
+
|
|
1091
|
+
- **Implementation plan:** [agent-ui-blocks.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/implementationPlans/agent-ui-blocks.md)
|
|
1092
|
+
- **Tasks:** [agent-ui-blocks.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/tasks/agent-ui-blocks.md)
|
|
1093
|
+
|
|
1094
|
+
---
|
|
1095
|
+
|
|
1096
|
+
## app-mcp-server
|
|
1097
|
+
|
|
1098
|
+
**Title:** `App MCP server`
|
|
1099
|
+
|
|
1100
|
+
**Labels:** `area:mcp`, `type:feature`
|
|
1101
|
+
**Project fields:** Area=`mcp`, Target=`Future`, Impact=`Feature`, IP=`app-mcp-server`, Status=`Shaping`
|
|
1102
|
+
|
|
1103
|
+
A Terreno backend exposes a complete MCP product surface — tools, prompts, resources, named HTTP servers, OAuth 2.1 for remote clients, Inspector/test DX, a Streamable HTTP client, and hosted generators for those primitives — without giving up generated CRUD tools that stay aligned with `modelRouter` permissions.
|
|
1104
|
+
|
|
1105
|
+
- **Implementation plan:** [app-mcp-server.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/implementationPlans/app-mcp-server.md)
|
|
1106
|
+
- **Tasks:** [app-mcp-server.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/tasks/app-mcp-server.md)
|
|
1107
|
+
|
|
1108
|
+
---
|
|
1109
|
+
|
|
1110
|
+
## migrate-admin-to-syncdb
|
|
1111
|
+
|
|
1112
|
+
**Title:** `Migrate built-in admin to syncdb`
|
|
1113
|
+
|
|
1114
|
+
**Labels:** `area:admin`, `type:chore`
|
|
1115
|
+
**Project fields:** Area=`admin`, Target=`Released`, Impact=`Improvement`, IP=`migrate-admin-to-syncdb`, Status=`Shipped`
|
|
1116
|
+
|
|
1117
|
+
Move **built-in admin model list/read/create/update/delete** for collections that already use **String `_id`** onto **windowed local-first syncdb**, with **REST remaining the membership source** (search, sort, pagination, RBAC). Remaining admin RPC (config, scripts, roles, comms, AI, consent, documents, version-config, background-tasks) leaves RTK `injectEndpoints` for a **tiny native `fetch` wrapper** with **host-injected auth**.
|
|
1118
|
+
|
|
1119
|
+
- **Implementation plan:** [migrate-admin-to-syncdb.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/implementationPlans/migrate-admin-to-syncdb.md)
|
|
1120
|
+
- **Tasks:** [migrate-admin-to-syncdb.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/tasks/migrate-admin-to-syncdb.md)
|
|
1121
|
+
|
|
1122
|
+
---
|
|
1123
|
+
|
|
1124
|
+
## remove-legacy-realtime
|
|
1125
|
+
|
|
1126
|
+
**Title:** `Remove legacy RTK realtime in Terreno 58`
|
|
1127
|
+
|
|
1128
|
+
**Labels:** `area:api`, `type:feature`
|
|
1129
|
+
**Project fields:** Area=`api`, Target=`58`, Impact=`Breaking`, IP=`remove-legacy-realtime`, Status=`Planned`
|
|
1130
|
+
|
|
1131
|
+
Delete the **legacy RTK cache-patching realtime path** in Terreno 58. Collection live updates go through `@terreno/syncdb` (`sync` on `modelRouter` + `sync:delta`). This IP does **not** remove `RealtimeApp`: that plugin still hosts Socket.io, change streams, and the syncdb socket channel.
|
|
1132
|
+
|
|
1133
|
+
- **Implementation plan:** [remove-legacy-realtime.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/implementationPlans/remove-legacy-realtime.md)
|
|
1134
|
+
- **Tasks:** [remove-legacy-realtime.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/tasks/remove-legacy-realtime.md)
|
|
1135
|
+
|
|
1136
|
+
---
|
|
1137
|
+
|
|
1138
|
+
## ai-observability
|
|
1139
|
+
|
|
1140
|
+
**Title:** `AI observability (Langfuse-light, pluggable)`
|
|
1141
|
+
|
|
1142
|
+
**Labels:** `area:ai`, `type:feature`
|
|
1143
|
+
**Project fields:** Area=`ai`, Target=`Future`, Impact=`Feature`, IP=`ai-observability`, Status=`Shaping`
|
|
1144
|
+
|
|
1145
|
+
Ship **Langfuse-like** prompt versioning, nested traces (user / session / cost), multidimensional evaluators (LLM-as-judge + structured I/O), datasets, experiments, and a **local human review queue** — **inside Terreno**, as **plugins on `@terreno/ai`**, with an operator UI in **`admin-frontend` only**.
|
|
1146
|
+
|
|
1147
|
+
- **Implementation plan:** [ai-observability.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/implementationPlans/ai-observability.md)
|
|
1148
|
+
- **Tasks:** [ai-observability.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/tasks/ai-observability.md)
|
|
1149
|
+
|
|
1150
|
+
---
|
|
1151
|
+
|
|
1152
|
+
## better-auth-strict-oauth-provider
|
|
1153
|
+
|
|
1154
|
+
**Title:** `Better Auth sync omits unset oauthProvider`
|
|
1155
|
+
|
|
1156
|
+
**Labels:** `area:auth`, `type:bug`
|
|
1157
|
+
**Project fields:** Area=`auth`, Target=`Released`, Impact=`Fix`, IP=`better-auth-strict-oauth-provider`, Status=`Shipped`
|
|
1158
|
+
|
|
1159
|
+
Email/password Better Auth users sync into a consumer `User` model that uses `strict: "throw"` and does **not** declare `oauthProvider`. The first authenticated `modelRouter` request after sign-up populates `req.user` (not 401).
|
|
1160
|
+
|
|
1161
|
+
- **Implementation plan:** [better-auth-strict-oauth-provider.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/implementationPlans/better-auth-strict-oauth-provider.md)
|
|
1162
|
+
- **Tasks:** [better-auth-strict-oauth-provider.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/tasks/better-auth-strict-oauth-provider.md)
|
|
1163
|
+
|
|
1164
|
+
---
|
|
1165
|
+
|
|
1166
|
+
## mcp-service-tokens
|
|
1167
|
+
|
|
1168
|
+
**Title:** `MCP service tokens`
|
|
1169
|
+
|
|
1170
|
+
**Labels:** `area:mcp`, `type:feature`
|
|
1171
|
+
**Project fields:** Area=`mcp`, Target=`Released`, Impact=`Feature`, IP=`mcp-service-tokens`, Status=`Shipped`
|
|
1172
|
+
|
|
1173
|
+
Authenticated users mint **personal MCP service tokens** that act as that user on the consumer app's `POST /mcp` endpoint only. They copy an **MCP URL** plus a **Bearer `mcp_…` key** into external clients (Perplexity custom connectors, Claude Code, Cursor, Inspector) without pasting a session JWT. Admins list and revoke any user's tokens from the admin panel.
|
|
1174
|
+
|
|
1175
|
+
- **Implementation plan:** [mcp-service-tokens.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/implementationPlans/mcp-service-tokens.md)
|
|
1176
|
+
- **Tasks:** [mcp-service-tokens.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/tasks/mcp-service-tokens.md)
|
|
1177
|
+
|
|
1178
|
+
---
|
|
1179
|
+
|
|
1180
|
+
## compile-pipeline-dedup
|
|
1181
|
+
|
|
1182
|
+
**Title:** `Compile pipeline dedup (remove redundant recompiles)`
|
|
1183
|
+
|
|
1184
|
+
**Labels:** `area:dx`, `type:chore`
|
|
1185
|
+
**Project fields:** Area=`dx`, Target=`Released`, Impact=`Improvement`, IP=`compile-pipeline-dedup`, Status=`Shipped`
|
|
1186
|
+
|
|
1187
|
+
Make each `@terreno/*` package compile **exactly once** per cold `bun run compile` by relying on Bun's built-in workspace dependency ordering, instead of the current pipeline that recompiles shared packages many times. Target contribution to the scan goal: ~60–90s.
|
|
1188
|
+
|
|
1189
|
+
- **Implementation plan:** [compile-pipeline-dedup.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/implementationPlans/compile-pipeline-dedup.md)
|
|
1190
|
+
- **Tasks:** [compile-pipeline-dedup.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/tasks/compile-pipeline-dedup.md)
|
|
1191
|
+
|
|
1192
|
+
---
|
|
1193
|
+
|
|
1194
|
+
## support-agent
|
|
1195
|
+
|
|
1196
|
+
**Title:** `Support answering agent (@terreno/support)`
|
|
1197
|
+
|
|
1198
|
+
**Labels:** `area:ai`, `type:feature`
|
|
1199
|
+
**Project fields:** Area=`ai`, Target=`Future`, Impact=`Feature`, IP=`support-agent`, Status=`Shaping`
|
|
1200
|
+
|
|
1201
|
+
Ship `@terreno/support`, a `TerrenoPlugin` that:
|
|
1202
|
+
|
|
1203
|
+
1. **Ingests knowledge** from pluggable `KnowledgeSource` adapters into a Mongo-backed,
|
|
1204
|
+
chunked, searchable index. Built in: announcements, markdown docs folder, and a generic
|
|
1205
|
+
Mongoose-model adapter.
|
|
1206
|
+
2. **Answers support questions** with `@terreno/ai`'s `AIService`, grounded only in
|
|
1207
|
+
retrieved chunks, returning `answer`, `sources`, `confidence`, and `shouldEscalate`.
|
|
1208
|
+
3. **Exposes the agent as MCP tools** on the app's existing `/mcp` server
|
|
1209
|
+
(`support_ask`, `support_search`, `support_get_document`, `support_list_sources`) and
|
|
1210
|
+
as REST `modelRouter` actions, so ChatGPT, Claude, Cursor, an in-app widget, or a
|
|
1211
|
+
human-support tool can all call the same agent.
|
|
1212
|
+
4. **Closes the loop for AI authors**: a `support/kb/` docs convention, a
|
|
1213
|
+
`write-support-docs` skill, a `terreno-support check` validator, and a
|
|
1214
|
+
"knowledge gaps" report (low-confidence / thumbs-down questions) that tells agents which
|
|
1215
|
+
doc to write next.
|
|
1216
|
+
|
|
1217
|
+
- **Implementation plan:** [support-agent.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/implementationPlans/support-agent.md)
|
|
1218
|
+
- **Tasks:** [support-agent.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/tasks/support-agent.md)
|
|
1219
|
+
|
|
1220
|
+
---
|
|
1221
|
+
|
|
1222
|
+
## ai-agents-and-failover
|
|
1223
|
+
|
|
1224
|
+
**Title:** `AI agents and provider failover`
|
|
1225
|
+
|
|
1226
|
+
**Labels:** `area:ai`, `type:feature`
|
|
1227
|
+
**Project fields:** Area=`ai`, Target=`Future`, Impact=`Feature`, IP=`ai-agents-and-failover`, Status=`Shaping`
|
|
1228
|
+
|
|
1229
|
+
Add two additive library seams to `@terreno/ai` so app code can:
|
|
1230
|
+
|
|
1231
|
+
1. Define a reusable **Agent** (`name`, `instructions`, `tools`, optional `schema`, optional `middleware`) that runs through existing `AIService` logging.
|
|
1232
|
+
2. Wrap one or more Vercel AI SDK `LanguageModel`s in **`createFailoverModel`** so 429/502/503/overloaded failures try the next model. Every `AIService` method inherits failover without per-method changes.
|
|
1233
|
+
|
|
1234
|
+
- **Implementation plan:** [ai-agents-and-failover.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/implementationPlans/ai-agents-and-failover.md)
|
|
1235
|
+
- **Tasks:** [ai-agents-and-failover.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/tasks/ai-agents-and-failover.md)
|
|
1236
|
+
|
|
1237
|
+
---
|
|
1238
|
+
|
|
1239
|
+
## terreno-58
|
|
1240
|
+
|
|
1241
|
+
**Title:** `Terreno 58`
|
|
1242
|
+
|
|
1243
|
+
**Labels:** `area:dx`, `type:chore`, `breaking`
|
|
1244
|
+
**Project fields:** Area=`dx`, Target=`58`, Impact=`Breaking`, IP=*(not yet written)*, Status=`Planned`
|
|
1245
|
+
|
|
1246
|
+
Umbrella for the Terreno 58 / Expo SDK 58 major release: every breaking change that was
|
|
1247
|
+
deprecated during 57.x lands together so consumers upgrade once. Each change keeps its own
|
|
1248
|
+
IP and tracking issue; this entry is the release checklist, not a plan.
|
|
1249
|
+
|
|
1250
|
+
- Remove legacy RTK realtime (`modelRouter` `realtime`, RTK cache patching) — [remove-legacy-realtime](https://github.com/TerrenoLabs/terreno/blob/master/docs/implementationPlans/remove-legacy-realtime.md)
|
|
1251
|
+
- Remove admin `api` / `injectEndpoints` and `useAdminApi`; admin runs on syncdb — follow-up to [migrate-admin-to-syncdb](https://github.com/TerrenoLabs/terreno/blob/master/docs/implementationPlans/migrate-admin-to-syncdb.md)
|
|
1252
|
+
- Native module baseline (new dev-client binary) — [native-module-baseline](https://github.com/TerrenoLabs/terreno/blob/master/docs/implementationPlans/native-module-baseline.md)
|
|
1253
|
+
- HTTP rate limiting on by default — [rate-limiting](https://github.com/TerrenoLabs/terreno/blob/master/docs/implementationPlans/rate-limiting.md)
|
|
1254
|
+
- Expo SDK 58 upgrade — release PR [#1310](https://github.com/TerrenoLabs/terreno/pull/1310)
|
|
1255
|
+
- **RTK flag:** Breaking
|
|
1256
|
+
- **Depends on:** remove-legacy-realtime, migrate-admin-to-syncdb, native-module-baseline
|
|
1257
|
+
|
|
1258
|
+
---
|
|
1259
|
+
|
|
1012
1260
|
# Shipped, umbrella, and declined IPs
|
|
1013
1261
|
|
|
1014
1262
|
Tracking issues created for IPs that previously lacked a `**Roadmap issue:**` header.
|
|
@@ -1035,20 +1283,21 @@ this table supplies only the issue number.
|
|
|
1035
1283
|
| `design-blend-skill` | https://github.com/TerrenoLabs/terreno/issues/1083 | `Shipped` | `dx` | `Released` | `Feature` | `type:feature` |
|
|
1036
1284
|
| `ModularAPI` | https://github.com/TerrenoLabs/terreno/issues/1084 | `Shipped` | `api` | `Released` | `Feature` | `type:feature` |
|
|
1037
1285
|
| `mcp-boost-parity` | https://github.com/TerrenoLabs/terreno/issues/1085 | `In progress` | `mcp` | `Next` | `Feature` | `type:feature` |
|
|
1038
|
-
| `docs-site-and-versioning` | https://github.com/TerrenoLabs/terreno/issues/1086 | `
|
|
1286
|
+
| `docs-site-and-versioning` | https://github.com/TerrenoLabs/terreno/issues/1086 | `Shipped` | `docs` | `Released` | `Feature` | `type:docs` |
|
|
1039
1287
|
| `syncdb-codegen` | https://github.com/TerrenoLabs/terreno/issues/1110 | `Shipped` | `syncdb` | `Released` | `Feature` | `type:feature` |
|
|
1040
1288
|
| `migrate-cicd-to-circleci` | https://github.com/TerrenoLabs/terreno/issues/1088 | `In progress` | `dx` | `Next` | `Improvement` | `type:chore` |
|
|
1041
1289
|
| `rbac-permissions` | https://github.com/TerrenoLabs/terreno/issues/1089 | `Shipped` | `api` | `Released` | `Feature` | `type:feature` |
|
|
1042
1290
|
| `infra-mcp` | https://github.com/TerrenoLabs/terreno/issues/1090 | `Planned` | `mcp` | `Future` | `Feature` | `type:feature` |
|
|
1043
|
-
| `comms-admin-dashboard` | https://github.com/TerrenoLabs/terreno/issues/1091 | `
|
|
1291
|
+
| `comms-admin-dashboard` | https://github.com/TerrenoLabs/terreno/issues/1091 | `Shipped` | `admin` | `Released` | `Feature` | `type:feature` |
|
|
1044
1292
|
| `model-router-mcp` | https://github.com/TerrenoLabs/terreno/issues/1092 | `Shipped` | `mcp` | `Released` | `Feature` | `type:feature` |
|
|
1045
|
-
| `terreno-langfuse-integration` | https://github.com/TerrenoLabs/terreno/issues/1093 | `
|
|
1293
|
+
| `terreno-langfuse-integration` | https://github.com/TerrenoLabs/terreno/issues/1093 | `Shipped` | `ai` | `Released` | `Feature` | `type:feature` |
|
|
1046
1294
|
| `oss-launch-program` | https://github.com/TerrenoLabs/terreno/issues/1094 | `In progress` | `dx` | `Next` | `Improvement` | `type:chore` |
|
|
1047
1295
|
| `b2b-platform-program` | https://github.com/TerrenoLabs/terreno/issues/1095 | `Planned` | `api` | `Next` | `Feature` | `type:feature` |
|
|
1048
1296
|
| `offline-mode` | https://github.com/TerrenoLabs/terreno/issues/1096 | `Declined` | `syncdb` | `Future` | `Feature` | `type:feature` |
|
|
1049
1297
|
| `model-router-actions` | https://github.com/TerrenoLabs/terreno/issues/1097 | `Declined` | `api` | `Future` | `Feature` | `type:feature` |
|
|
1050
1298
|
| `feature-flags` | https://github.com/TerrenoLabs/terreno/issues/1098 | `Declined` | `api` | `Future` | `Feature` | `type:feature` |
|
|
1051
1299
|
| `admin-improvements` | https://github.com/TerrenoLabs/terreno/issues/1099 | `Declined` | `admin` | `Future` | `Improvement` | `type:feature` |
|
|
1300
|
+
| `better-auth-strict-oauth-provider` | https://github.com/TerrenoLabs/terreno/issues/1218 | `Shipped` | `auth` | `Released` | `Fix` | `type:bug` |
|
|
1052
1301
|
|
|
1053
1302
|
**Duplicate to retire:** [#1087](https://github.com/TerrenoLabs/terreno/issues/1087)
|
|
1054
1303
|
covers the same `syncdb-codegen` IP as [#1110](https://github.com/TerrenoLabs/terreno/issues/1110).
|
|
@@ -4,8 +4,9 @@ Run `bun run analyze:full` before pushing changes that alter imports, exports, p
|
|
|
4
4
|
dependencies, or module boundaries.
|
|
5
5
|
|
|
6
6
|
Taste does not need to infer that policy in this repository. The root `prepush` package
|
|
7
|
-
script is the canonical local gate
|
|
8
|
-
analysis
|
|
7
|
+
script is the canonical local gate. It runs lint and TypeScript compilation, then the
|
|
8
|
+
local mirror of every CI job the branch triggers, including full static analysis when
|
|
9
|
+
repo policies apply (see [Run tests locally](../how-to/run-tests-locally.md#prepush-mirrors-ci)):
|
|
9
10
|
|
|
10
11
|
```bash
|
|
11
12
|
bun run prepush
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Test isolation in Bun suites
|
|
2
|
+
|
|
3
|
+
`bun test` runs every test file of a package in one process. `mock.module` replaces a
|
|
4
|
+
module for that whole process, and `mock.restore()` does not undo it. A test that
|
|
5
|
+
mocks a module can pass on its own, then break other files, or be broken by them,
|
|
6
|
+
when the whole package runs. CI always runs the whole package, so this kind of
|
|
7
|
+
failure shows up only after a push.
|
|
8
|
+
|
|
9
|
+
## The rule
|
|
10
|
+
|
|
11
|
+
A branch may not add a `mock.module` call to a shared suite, meaning any `*.test.*` or
|
|
12
|
+
`*.spec.*` file outside an `isolated/` directory. Existing calls are grandfathered. The
|
|
13
|
+
check only counts lines the branch adds.
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
bun run check:test-isolation # vs merge-base with origin/master
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
`bun run prepush` and the CircleCI `repo-policies` job both run it.
|
|
20
|
+
|
|
21
|
+
## Fixes, in order of preference
|
|
22
|
+
|
|
23
|
+
1. **Inject the dependency.** Pass a fake through props, options, or a parameter
|
|
24
|
+
instead of replacing the module.
|
|
25
|
+
2. **Isolate the file.** Move the test to `src/isolated/<name>.isolated.ts(x)`. Packages
|
|
26
|
+
whose `test:coverage` uses `scripts/check-coverage.ts` run each isolated file in its
|
|
27
|
+
own `bun test` process and merge the coverage.
|
|
28
|
+
3. **Mock once in the preload.** Register the mock in the package's bun preload (for
|
|
29
|
+
example `src/tests/bunSetup.ts`) so every file sees the same module.
|
|
30
|
+
4. **Mark an identical mock.** When the call matches the preload exactly, put
|
|
31
|
+
`// isolation-safe: <reason>` on the line above it.
|
|
32
|
+
|
|
33
|
+
## Why a ratchet
|
|
34
|
+
|
|
35
|
+
Terreno has about 80 existing shared-suite files that call `mock.module`. Most mock
|
|
36
|
+
native modules the same way everywhere, which is harmless. Blocking new calls stops
|
|
37
|
+
the problem from growing without forcing a migration of working tests. Both
|
|
38
|
+
"passes alone, fails in the suite" fixes on the AI observability branch (#1196) came
|
|
39
|
+
from new module mocks.
|
|
40
|
+
|
|
41
|
+
Roast also runs the package's full CI test command, not only the changed test file,
|
|
42
|
+
so any remaining order-dependent failure shows up before push.
|