@terreno/mcp 56.0.0-beta.0 → 56.0.0-beta.2

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 (154) hide show
  1. package/LICENSE +21 -0
  2. package/dist/bootstrap.js +7 -7
  3. package/dist/bootstrap.js.map +1 -1
  4. package/dist/docs/templates/bootstrap/backend/types/models/userTypes.template.md +5 -4
  5. package/dist/docs/templates/tools/model.template.md +4 -2
  6. package/dist/docs/upgrades/0.31.0.md +60 -0
  7. package/dist/docs/upgrades/56.0.0-beta.2.md +59 -0
  8. package/dist/docs/versioned/next/README.md +1 -0
  9. package/dist/docs/versioned/next/explanation/README.md +7 -1
  10. package/dist/docs/versioned/next/explanation/deployment-architecture-gcp.md +65 -0
  11. package/dist/docs/versioned/next/explanation/deployment-baseline.md +78 -0
  12. package/dist/docs/versioned/next/explanation/positioning.md +164 -0
  13. package/dist/docs/versioned/next/explanation/repository-settings.md +44 -0
  14. package/dist/docs/versioned/next/explanation/roadmap-process.md +330 -0
  15. package/dist/docs/versioned/next/explanation/roadmap-seed-issues.md +887 -0
  16. package/dist/docs/versioned/next/how-to/README.md +8 -0
  17. package/dist/docs/versioned/next/how-to/build-for-web.md +69 -0
  18. package/dist/docs/versioned/next/how-to/deploy-backend-to-cloud-run.md +115 -0
  19. package/dist/docs/versioned/next/how-to/deploy-to-gcp.md +20 -228
  20. package/dist/docs/versioned/next/how-to/deploy-web-to-gcs-cdn.md +183 -0
  21. package/dist/docs/versioned/next/implementationPlans/PLAN_INDEX.md +31 -0
  22. package/dist/docs/versioned/next/implementationPlans/README.md +56 -30
  23. package/dist/docs/versioned/next/implementationPlans/agentic-sdlc-plugin.md +2 -1
  24. package/dist/docs/versioned/next/implementationPlans/ai-dev-loop-boost.md +1 -0
  25. package/dist/docs/versioned/next/implementationPlans/b2b-platform-program.md +115 -0
  26. package/dist/docs/versioned/next/implementationPlans/billing-stripe.md +158 -0
  27. package/dist/docs/versioned/next/implementationPlans/build-terreno-app-validation.md +1 -0
  28. package/dist/docs/versioned/next/implementationPlans/comms-abstraction.md +323 -0
  29. package/dist/docs/versioned/next/implementationPlans/comms-adapter-expo-push.md +107 -0
  30. package/dist/docs/versioned/next/implementationPlans/comms-adapter-sendgrid.md +157 -0
  31. package/dist/docs/versioned/next/implementationPlans/comms-adapter-twilio-sms.md +155 -0
  32. package/dist/docs/versioned/next/implementationPlans/comms-adapter-twilio-verify.md +99 -0
  33. package/dist/docs/versioned/next/implementationPlans/comms-admin-dashboard.md +180 -0
  34. package/dist/docs/versioned/next/implementationPlans/deploy-to-gcp.md +1 -0
  35. package/dist/docs/versioned/next/implementationPlans/deploy-to-vercel.md +1 -0
  36. package/dist/docs/versioned/next/implementationPlans/deployment-foundation.md +1 -0
  37. package/dist/docs/versioned/next/implementationPlans/docs-reference-coverage.md +1 -0
  38. package/dist/docs/versioned/next/implementationPlans/docs-tutorials-ai-first.md +1 -0
  39. package/dist/docs/versioned/next/implementationPlans/examples-demo-coverage.md +1 -0
  40. package/dist/docs/versioned/next/implementationPlans/infra-mcp-research.md +188 -0
  41. package/dist/docs/versioned/next/implementationPlans/infra-mcp.md +269 -0
  42. package/dist/docs/versioned/next/implementationPlans/migrate-cicd-to-circleci-research.md +126 -0
  43. package/dist/docs/versioned/next/implementationPlans/migrate-cicd-to-circleci.md +269 -0
  44. package/dist/docs/versioned/next/implementationPlans/native-module-baseline.md +105 -0
  45. package/dist/docs/versioned/next/implementationPlans/orgs-and-teams.md +158 -0
  46. package/dist/docs/versioned/next/implementationPlans/oss-governance-baseline.md +1 -0
  47. package/dist/docs/versioned/next/implementationPlans/password-reset-and-email-verification.md +147 -0
  48. package/dist/docs/versioned/next/implementationPlans/positioning-django-rails-universal.md +1 -0
  49. package/dist/docs/versioned/next/implementationPlans/public-roadmap-github.md +1 -0
  50. package/dist/docs/versioned/next/implementationPlans/upgrade-guides-and-skill.md +1 -0
  51. package/dist/docs/versioned/next/implementationPlans/web-ssr-and-admin-spa.md +1 -0
  52. package/dist/docs/versioned/next/reference/README.md +5 -0
  53. package/dist/docs/versioned/next/reference/admin-spa.md +130 -0
  54. package/dist/docs/versioned/next/reference/ai.md +519 -0
  55. package/dist/docs/versioned/next/reference/comms.md +132 -0
  56. package/dist/docs/versioned/next/reference/environment-variables.md +229 -382
  57. package/dist/docs/versioned/next/reference/test.md +108 -0
  58. package/dist/docs/versioned/next/roadmap.md +9 -0
  59. package/dist/docs/versioned/next/tasks/README.md +42 -0
  60. package/dist/docs/versioned/next/tasks/agentic-sdlc-plugin.md +5 -5
  61. package/dist/docs/versioned/next/tasks/billing-stripe.md +75 -0
  62. package/dist/docs/versioned/next/tasks/comms-abstraction.md +90 -0
  63. package/dist/docs/versioned/next/tasks/comms-adapter-expo-push.md +29 -0
  64. package/dist/docs/versioned/next/tasks/comms-adapter-sendgrid.md +39 -0
  65. package/dist/docs/versioned/next/tasks/comms-adapter-twilio-sms.md +39 -0
  66. package/dist/docs/versioned/next/tasks/comms-adapter-twilio-verify.md +19 -0
  67. package/dist/docs/versioned/next/tasks/comms-admin-dashboard.md +52 -0
  68. package/dist/docs/versioned/next/tasks/deploy-to-gcp.md +11 -11
  69. package/dist/docs/versioned/next/tasks/deployment-foundation.md +12 -12
  70. package/dist/docs/versioned/next/tasks/docs-reference-coverage.md +4 -4
  71. package/dist/docs/versioned/next/tasks/infra-mcp.md +43 -0
  72. package/dist/docs/versioned/next/tasks/migrate-cicd-to-circleci.md +215 -0
  73. package/dist/docs/versioned/next/tasks/native-module-baseline.md +42 -0
  74. package/dist/docs/versioned/next/tasks/orgs-and-teams.md +70 -0
  75. package/dist/docs/versioned/next/tasks/oss-governance-baseline.md +18 -18
  76. package/dist/docs/versioned/next/tasks/password-reset-and-email-verification.md +60 -0
  77. package/dist/docs/versioned/next/tasks/positioning-django-rails-universal.md +4 -4
  78. package/dist/docs/versioned/next/tasks/public-roadmap-github.md +15 -15
  79. package/package.json +4 -3
  80. package/src/docs/templates/bootstrap/backend/types/models/userTypes.template.md +5 -4
  81. package/src/docs/templates/tools/model.template.md +4 -2
  82. package/src/docs/upgrades/0.31.0.md +60 -0
  83. package/src/docs/upgrades/56.0.0-beta.2.md +59 -0
  84. package/src/docs/versioned/next/README.md +1 -0
  85. package/src/docs/versioned/next/explanation/README.md +7 -1
  86. package/src/docs/versioned/next/explanation/deployment-architecture-gcp.md +65 -0
  87. package/src/docs/versioned/next/explanation/deployment-baseline.md +78 -0
  88. package/src/docs/versioned/next/explanation/positioning.md +164 -0
  89. package/src/docs/versioned/next/explanation/repository-settings.md +44 -0
  90. package/src/docs/versioned/next/explanation/roadmap-process.md +330 -0
  91. package/src/docs/versioned/next/explanation/roadmap-seed-issues.md +887 -0
  92. package/src/docs/versioned/next/how-to/README.md +8 -0
  93. package/src/docs/versioned/next/how-to/build-for-web.md +69 -0
  94. package/src/docs/versioned/next/how-to/deploy-backend-to-cloud-run.md +115 -0
  95. package/src/docs/versioned/next/how-to/deploy-to-gcp.md +20 -228
  96. package/src/docs/versioned/next/how-to/deploy-web-to-gcs-cdn.md +183 -0
  97. package/src/docs/versioned/next/implementationPlans/PLAN_INDEX.md +31 -0
  98. package/src/docs/versioned/next/implementationPlans/README.md +56 -30
  99. package/src/docs/versioned/next/implementationPlans/agentic-sdlc-plugin.md +2 -1
  100. package/src/docs/versioned/next/implementationPlans/ai-dev-loop-boost.md +1 -0
  101. package/src/docs/versioned/next/implementationPlans/b2b-platform-program.md +115 -0
  102. package/src/docs/versioned/next/implementationPlans/billing-stripe.md +158 -0
  103. package/src/docs/versioned/next/implementationPlans/build-terreno-app-validation.md +1 -0
  104. package/src/docs/versioned/next/implementationPlans/comms-abstraction.md +323 -0
  105. package/src/docs/versioned/next/implementationPlans/comms-adapter-expo-push.md +107 -0
  106. package/src/docs/versioned/next/implementationPlans/comms-adapter-sendgrid.md +157 -0
  107. package/src/docs/versioned/next/implementationPlans/comms-adapter-twilio-sms.md +155 -0
  108. package/src/docs/versioned/next/implementationPlans/comms-adapter-twilio-verify.md +99 -0
  109. package/src/docs/versioned/next/implementationPlans/comms-admin-dashboard.md +180 -0
  110. package/src/docs/versioned/next/implementationPlans/deploy-to-gcp.md +1 -0
  111. package/src/docs/versioned/next/implementationPlans/deploy-to-vercel.md +1 -0
  112. package/src/docs/versioned/next/implementationPlans/deployment-foundation.md +1 -0
  113. package/src/docs/versioned/next/implementationPlans/docs-reference-coverage.md +1 -0
  114. package/src/docs/versioned/next/implementationPlans/docs-tutorials-ai-first.md +1 -0
  115. package/src/docs/versioned/next/implementationPlans/examples-demo-coverage.md +1 -0
  116. package/src/docs/versioned/next/implementationPlans/infra-mcp-research.md +188 -0
  117. package/src/docs/versioned/next/implementationPlans/infra-mcp.md +269 -0
  118. package/src/docs/versioned/next/implementationPlans/migrate-cicd-to-circleci-research.md +126 -0
  119. package/src/docs/versioned/next/implementationPlans/migrate-cicd-to-circleci.md +269 -0
  120. package/src/docs/versioned/next/implementationPlans/native-module-baseline.md +105 -0
  121. package/src/docs/versioned/next/implementationPlans/orgs-and-teams.md +158 -0
  122. package/src/docs/versioned/next/implementationPlans/oss-governance-baseline.md +1 -0
  123. package/src/docs/versioned/next/implementationPlans/password-reset-and-email-verification.md +147 -0
  124. package/src/docs/versioned/next/implementationPlans/positioning-django-rails-universal.md +1 -0
  125. package/src/docs/versioned/next/implementationPlans/public-roadmap-github.md +1 -0
  126. package/src/docs/versioned/next/implementationPlans/upgrade-guides-and-skill.md +1 -0
  127. package/src/docs/versioned/next/implementationPlans/web-ssr-and-admin-spa.md +1 -0
  128. package/src/docs/versioned/next/reference/README.md +5 -0
  129. package/src/docs/versioned/next/reference/admin-spa.md +130 -0
  130. package/src/docs/versioned/next/reference/ai.md +519 -0
  131. package/src/docs/versioned/next/reference/comms.md +132 -0
  132. package/src/docs/versioned/next/reference/environment-variables.md +229 -382
  133. package/src/docs/versioned/next/reference/test.md +108 -0
  134. package/src/docs/versioned/next/roadmap.md +9 -0
  135. package/src/docs/versioned/next/tasks/README.md +42 -0
  136. package/src/docs/versioned/next/tasks/agentic-sdlc-plugin.md +5 -5
  137. package/src/docs/versioned/next/tasks/billing-stripe.md +75 -0
  138. package/src/docs/versioned/next/tasks/comms-abstraction.md +90 -0
  139. package/src/docs/versioned/next/tasks/comms-adapter-expo-push.md +29 -0
  140. package/src/docs/versioned/next/tasks/comms-adapter-sendgrid.md +39 -0
  141. package/src/docs/versioned/next/tasks/comms-adapter-twilio-sms.md +39 -0
  142. package/src/docs/versioned/next/tasks/comms-adapter-twilio-verify.md +19 -0
  143. package/src/docs/versioned/next/tasks/comms-admin-dashboard.md +52 -0
  144. package/src/docs/versioned/next/tasks/deploy-to-gcp.md +11 -11
  145. package/src/docs/versioned/next/tasks/deployment-foundation.md +12 -12
  146. package/src/docs/versioned/next/tasks/docs-reference-coverage.md +4 -4
  147. package/src/docs/versioned/next/tasks/infra-mcp.md +43 -0
  148. package/src/docs/versioned/next/tasks/migrate-cicd-to-circleci.md +215 -0
  149. package/src/docs/versioned/next/tasks/native-module-baseline.md +42 -0
  150. package/src/docs/versioned/next/tasks/orgs-and-teams.md +70 -0
  151. package/src/docs/versioned/next/tasks/oss-governance-baseline.md +18 -18
  152. package/src/docs/versioned/next/tasks/password-reset-and-email-verification.md +60 -0
  153. package/src/docs/versioned/next/tasks/positioning-django-rails-universal.md +4 -4
  154. package/src/docs/versioned/next/tasks/public-roadmap-github.md +15 -15
@@ -14,37 +14,37 @@ See: [`docs/implementationPlans/oss-governance-baseline.md`](../implementationPl
14
14
 
15
15
  ## Phase 1: Legal baseline
16
16
 
17
- - [ ] **Task 1.1**: Add root `LICENSE` and `NOTICE`
17
+ - [x] **Task 1.1**: Add root `LICENSE` and `NOTICE`
18
18
  - Description: Copy the MIT License text to a new root `LICENSE` (use the standard MIT template; `mcp-server` already ships MIT). Create `NOTICE` containing the project name, the copyright line `Copyright 2026 Flourish Health, Inc.`, and a one-line statement that the project is licensed under MIT. Include acknowledgement of vendored `api/src/vendor/wesleytodd-openapi/` with a pointer to its own `LICENSE`.
19
19
  - Files: `LICENSE` (new), `NOTICE` (new)
20
20
  - Depends on: none
21
21
  - Acceptance: `LICENSE` exists at repo root with standard MIT text; `NOTICE` mentions the vendored openapi code. Do not compare against `api/LICENSE` or `ui/LICENSE` — those remain Apache-2.0 until Task 1.4.
22
22
 
23
- - [ ] **Task 1.2**: Audit license coverage across published packages
23
+ - [x] **Task 1.2**: Audit license coverage across published packages
24
24
  - Description: Read `.github/workflows/publish-on-tag.yml` and list every package it publishes. For each one, record in a scratch table: whether a `LICENSE` file exists, whether `package.json` has a `files` array, whether `LICENSE` is included in that array, and the `license` field value. Write the findings as a markdown table in the PR description. Do not fix anything in this task.
25
25
  - Files: none (findings go in the PR body)
26
26
  - Depends on: none
27
27
  - Acceptance: PR body contains a table with one row per published package and the four columns above; the table is derived from the actual repo, not copied from the IP.
28
28
 
29
- - [ ] **Task 1.3**: Add `LICENSE` to every published package
29
+ - [x] **Task 1.3**: Add `LICENSE` to every published package
30
30
  - Description: For each package identified in Task 1.2 that lacks a `LICENSE`, create one by copying the root `LICENSE`. Packages to cover: `rtk`, `ai`, `admin-backend`, `admin-frontend`, `admin-spa`, `api-health`, `feature-flags`, `mcp-server`, `test`. Do not create `LICENSE` files in non-published directories (`demo`, `example-frontend`, `example-backend`, `website`, `terraform`).
31
31
  - Files: `rtk/LICENSE`, `ai/LICENSE`, `admin-backend/LICENSE`, `admin-frontend/LICENSE`, `admin-spa/LICENSE`, `api-health/LICENSE`, `feature-flags/LICENSE`, `mcp-server/LICENSE`, `test/LICENSE` (all new)
32
32
  - Depends on: Task 1.1, Task 1.2
33
33
  - Acceptance: every published package directory contains a `LICENSE` identical to the root `LICENSE`.
34
34
 
35
- - [ ] **Task 1.4**: Align `license` fields and `files` arrays
35
+ - [x] **Task 1.4**: Align `license` fields and `files` arrays
36
36
  - Description: Set `"license": "MIT"` in the root `package.json` and in every published package's `package.json` (relicense `api`/`ui` from Apache-2.0). For every package that has an explicit `files` array, add `"LICENSE"` to it (`ui`, `rtk`, `admin-frontend`, `admin-spa`, `mcp-server` at minimum — confirm against Task 1.2 findings). Do not otherwise reorder or reformat `package.json`.
37
37
  - Files: `package.json`, `ui/package.json`, `rtk/package.json`, `admin-frontend/package.json`, `admin-spa/package.json`, `mcp-server/package.json`, plus any others found in Task 1.2
38
38
  - Depends on: Task 1.3
39
39
  - Acceptance: `bun pm pack --dry-run` run inside each published package lists `LICENSE` among the packed files; no `package.json` declares a license other than `MIT`.
40
40
 
41
- - [ ] **Task 1.5**: Verify relicensing consent for `api` and `ui`
41
+ - [x] **Task 1.5**: Verify relicensing consent for `api` and `ui`
42
42
  - Description: Run `git log --format='%an <%ae>' -- api/ ui/ | sort -u` and list every distinct author. Report the list in the PR body, flagging any address that is not a `@flourish.health` address or a known bot. Do **not** proceed to merge the Apache-2.0 → MIT change for `api`/`ui` if a non-Flourish human contributor appears; instead leave a `TODO` note in the PR body requesting sign-off. (`mcp-server` is already MIT.)
43
43
  - Files: none (findings go in the PR body)
44
44
  - Depends on: Task 1.4
45
45
  - Acceptance: PR body lists all `api`/`ui` authors and explicitly states either "all Flourish/bot — safe to relicense" or names the contributors needing sign-off.
46
46
 
47
- - [ ] **Task 1.6**: Add a license-coverage CI check
47
+ - [x] **Task 1.6**: Add a license-coverage CI check
48
48
  - Description: Create `scripts/check-license-coverage.ts` (Bun, TypeScript, `const` arrow functions, explicit return types). It should: read the list of published packages from `.github/workflows/publish-on-tag.yml` (parse job names or a hardcoded list with a comment pointing at the workflow), then for each assert (a) `LICENSE` exists, (b) `package.json` `license` equals the root `package.json` `license`, (c) if a `files` array exists it contains `LICENSE`. Print one line per failure and `process.exit(1)` when any check fails. Add a `check:licenses` script to the root `package.json` and a job to `.github/workflows/repo-policies.yml` that runs it.
49
49
  - Files: `scripts/check-license-coverage.ts` (new), `package.json`, `.github/workflows/repo-policies.yml`
50
50
  - Depends on: Task 1.4
@@ -52,25 +52,25 @@ See: [`docs/implementationPlans/oss-governance-baseline.md`](../implementationPl
52
52
 
53
53
  ## Phase 2: Contribution process
54
54
 
55
- - [ ] **Task 2.1**: Write `CONTRIBUTING.md`
55
+ - [x] **Task 2.1**: Write `CONTRIBUTING.md`
56
56
  - Description: Create `CONTRIBUTING.md` covering, in this order: (1) Code of Conduct link; (2) ways to contribute (issue, discussion, docs fix, code); (3) development setup — `bun run bootstrap`, Bun version requirement, MongoDB replica-set requirement for `example-backend` (single-node replset is enough, change streams need it), the seeded users `test@example.com` / `superuser@example.com` with password `testpassword123`; (4) per-package commands table pulled from the root `package.json` scripts (`bun run api:test`, `bun run ui:test`, `bun run lint`, `bun run compile`); (5) code style pointers — link `AGENTS.md`, call out the no-barrel-imports rule and `bun run check:no-barrel-imports`, the Luxon requirement, and the logging conventions; (6) test expectations — new features ship with tests, coverage must not drop; (7) the IP process — link `docs/implementationPlans/README.md` and `IP_TEMPLATE.md`, explain when an IP is required (new package, new public API, cross-package change) versus not (bug fix, docs); (8) DCO sign-off instructions (`git commit -s`); (9) PR expectations — draft by default, CI green, screenshots for UI changes.
57
57
  - Files: `CONTRIBUTING.md` (new)
58
58
  - Depends on: none
59
59
  - Acceptance: every command shown in `CONTRIBUTING.md` exists in a `package.json` `scripts` block; the seeded credentials match `example-backend/src/scripts/`; no reference to `.claude/` or other agent-private paths.
60
60
 
61
- - [ ] **Task 2.2**: Add `CODE_OF_CONDUCT.md`
61
+ - [x] **Task 2.2**: Add `CODE_OF_CONDUCT.md`
62
62
  - Description: Add Contributor Covenant 2.1 verbatim, with the enforcement contact set to `conduct@terreno.app`. Do not modify the covenant text other than the contact line and the project name.
63
63
  - Files: `CODE_OF_CONDUCT.md` (new)
64
64
  - Depends on: none
65
65
  - Acceptance: file states "Contributor Covenant" and version 2.1; contact address is present and is not a placeholder.
66
66
 
67
- - [ ] **Task 2.3**: Add `SECURITY.md`
67
+ - [x] **Task 2.3**: Add `SECURITY.md`
68
68
  - Description: Create `SECURITY.md` with: a supported-versions table (current minor supported; previous minor receives security fixes only), reporting instructions naming GitHub private vulnerability reporting as the primary channel and `security@terreno.app` as fallback, a 5-business-day acknowledgement commitment, a statement that reporters should not open public issues for vulnerabilities, and a note that CodeQL runs on the repo (`.github/workflows/codeql-analysis.yml`).
69
69
  - Files: `SECURITY.md` (new)
70
70
  - Depends on: none
71
71
  - Acceptance: file exists at repo root so GitHub surfaces it under Security → Policy; both reporting channels are named.
72
72
 
73
- - [ ] **Task 2.4**: Add a DCO check for external PRs
73
+ - [x] **Task 2.4**: Add a DCO check for external PRs
74
74
  - Description: Add a workflow job (either in `repo-policies.yml` or a new `.github/workflows/dco.yml`) that, for pull requests whose head repository differs from the base repository, verifies every commit message contains a `Signed-off-by:` line matching the commit author. Skip the check for PRs from the same repo and for bot authors (`dependabot[bot]`, `cursor[bot]`). Follow the repo's existing convention of validating required inputs before use.
75
75
  - Files: `.github/workflows/dco.yml` (new) or `.github/workflows/repo-policies.yml`
76
76
  - Depends on: Task 2.1
@@ -78,19 +78,19 @@ See: [`docs/implementationPlans/oss-governance-baseline.md`](../implementationPl
78
78
 
79
79
  ## Phase 3: Changelog
80
80
 
81
- - [ ] **Task 3.1**: Create the root `CHANGELOG.md` and backfill releases
81
+ - [x] **Task 3.1**: Create the root `CHANGELOG.md` and backfill releases
82
82
  - Description: Create `CHANGELOG.md` in Keep-a-Changelog format with an `## [Unreleased]` section at the top, then one section per released version, newest first. Source the content from `gh release list --limit 40` and `gh release view <tag>` for each release from 0.20.0 to the current version. Group each entry under `Added` / `Changed` / `Fixed` / `Deprecated` / `Removed`. Include a header note that all `@terreno/*` packages are versioned in lockstep and a link to `docs/implementationPlans/oss-launch-program.md` is **not** needed here. Do not invent entries — if a release has no notes, write `- No published release notes.` under that version.
83
83
  - Files: `CHANGELOG.md` (new)
84
84
  - Depends on: none
85
85
  - Acceptance: every version tag returned by `gh release list` between 0.20.0 and current has a section; no section is empty; the file states the lockstep versioning rule.
86
86
 
87
- - [ ] **Task 3.2**: Reduce `api/CHANGELOG.md` to a pointer
87
+ - [x] **Task 3.2**: Reduce `api/CHANGELOG.md` to a pointer
88
88
  - Description: Replace the contents of `api/CHANGELOG.md` with a short note that the changelog moved to the repo root, linking `../CHANGELOG.md`. Preserve the historical entries by moving them into the corresponding root `CHANGELOG.md` sections first if they contain detail the GitHub releases lack.
89
89
  - Files: `api/CHANGELOG.md`, `CHANGELOG.md`
90
90
  - Depends on: Task 3.1
91
91
  - Acceptance: `api/CHANGELOG.md` is under 10 lines and links to the root changelog; no historical detail was lost.
92
92
 
93
- - [ ] **Task 3.3**: Make changelog updates part of the release process
93
+ - [x] **Task 3.3**: Make changelog updates part of the release process
94
94
  - Description: Edit `.rulesync/skills/release/SKILL.md` to add a required step: before tagging, move `## [Unreleased]` content into a new version section in the root `CHANGELOG.md` with today's date (via Luxon-formatted ISO date), and confirm the section is non-empty. Then run `bun run rules` to regenerate the mirrored skill files under `.cursor/`, `.claude/`, `.devin/`, `.github/`, and `.agents/`.
95
95
  - Files: `.rulesync/skills/release/SKILL.md`, plus generated mirrors
96
96
  - Depends on: Task 3.1
@@ -98,31 +98,31 @@ See: [`docs/implementationPlans/oss-governance-baseline.md`](../implementationPl
98
98
 
99
99
  ## Phase 4: GitHub templates
100
100
 
101
- - [ ] **Task 4.1**: Add issue forms
101
+ - [x] **Task 4.1**: Add issue forms
102
102
  - Description: Create three GitHub issue forms. `bug_report.yml`: fields for affected package (dropdown listing all published `@terreno/*` packages plus `docs`, `examples`, `mcp`), version, platform (dropdown: iOS / Android / Web / Backend / N/A), reproduction steps (required textarea), expected vs actual, and a checkbox confirming the reporter searched existing issues. `feature_request.yml`: problem statement (required), proposed solution, alternatives considered, and a checkbox asking whether the requester is willing to open a PR. `docs_issue.yml`: page URL, what is wrong or missing, and suggested fix. Add `config.yml` with `blank_issues_enabled: false` and contact links to Discussions (Q&A and Ideas categories) and `SECURITY.md`.
103
103
  - Files: `.github/ISSUE_TEMPLATE/bug_report.yml`, `.github/ISSUE_TEMPLATE/feature_request.yml`, `.github/ISSUE_TEMPLATE/docs_issue.yml`, `.github/ISSUE_TEMPLATE/config.yml` (all new)
104
104
  - Depends on: Task 2.3
105
105
  - Acceptance: all four files parse as valid YAML; the package dropdown in `bug_report.yml` matches the packages published by `publish-on-tag.yml`; `config.yml` disables blank issues.
106
106
 
107
- - [ ] **Task 4.2**: Add a PR template
107
+ - [x] **Task 4.2**: Add a PR template
108
108
  - Description: Create `.github/PULL_REQUEST_TEMPLATE.md` with sections: Summary; Related IP or issue; Type of change (checkboxes); Testing performed (with a reminder that frontend changes require screenshots or video per `AGENTS.md`); Checklist (tests added, `bun run lint` passes, `bun run compile` passes, docs updated, changelog `Unreleased` entry added for user-facing changes, DCO signed off). Keep it short enough that contributors actually fill it in — under 40 lines.
109
109
  - Files: `.github/PULL_REQUEST_TEMPLATE.md` (new)
110
110
  - Depends on: Task 2.1, Task 3.1
111
111
  - Acceptance: template is under 40 lines; references the changelog and the frontend-verification requirement.
112
112
 
113
- - [ ] **Task 4.3**: Add `CODEOWNERS`
113
+ - [x] **Task 4.3**: Add `CODEOWNERS`
114
114
  - Description: Create `.github/CODEOWNERS` mapping each package directory to its owning team or maintainer, plus a catch-all root owner. Use GitHub team handles if they exist; otherwise use individual maintainer usernames. Include entries for `docs/`, `.github/`, `.rulesync/`, and `terraform/`.
115
115
  - Files: `.github/CODEOWNERS` (new)
116
116
  - Depends on: none
117
117
  - Acceptance: every top-level package directory has an owner; the file has a catch-all `*` line; GitHub's CODEOWNERS validation (visible in repo settings) reports no errors.
118
118
 
119
- - [ ] **Task 4.4**: Document required repository settings
119
+ - [x] **Task 4.4**: Document required repository settings
120
120
  - Description: Add a short section to `CONTRIBUTING.md` (or a new `docs/explanation/repository-settings.md` if it exceeds 30 lines) listing the GitHub settings a maintainer must enable manually because they cannot be committed: Discussions enabled with the categories from [`public-roadmap-github.md`](../implementationPlans/public-roadmap-github.md), private vulnerability reporting enabled, branch protection on `master` requiring the CI checks, "Allow squash merging" only, and auto-delete of merged branches.
121
121
  - Files: `CONTRIBUTING.md` or `docs/explanation/repository-settings.md`
122
122
  - Depends on: Task 2.1
123
123
  - Acceptance: the list names each setting and where to find it in the GitHub UI; no setting is described as already enabled unless verified.
124
124
 
125
- - [ ] **Task 4.5**: Append the governance section to `README.md`
125
+ - [x] **Task 4.5**: Append the governance section to `README.md`
126
126
  - Description: Add a `## License` section and a `## Contributing` section near the end of `README.md`, plus a license badge next to the existing npm badges. Link `LICENSE`, `CONTRIBUTING.md`, `CODE_OF_CONDUCT.md`, and `SECURITY.md`. Do not modify any other README content — positioning changes belong to a different IP.
127
127
  - Files: `README.md`
128
128
  - Depends on: Task 1.1, Task 2.1, Task 2.2, Task 2.3
@@ -0,0 +1,60 @@
1
+ # Tasks: Password reset and email verification
2
+
3
+ IP: [password-reset-and-email-verification](../implementationPlans/password-reset-and-email-verification.md)
4
+
5
+ ## Phase 1 — Token infrastructure
6
+
7
+ - [ ] **Task 1.1**: `AuthToken` model + issue/consume statics
8
+ - Description: hashed single-use tokens with TTL expiry per IP
9
+ - Files: `api/src/authTokens.ts`, type files
10
+ - Depends on: none
11
+ - Acceptance: atomic single-use test (parallel consumes → one winner); expiry test
12
+ - [ ] **Task 1.2**: `emailVerificationPlugin`
13
+ - Description: `emailVerified` field plugin for user schemas
14
+ - Files: `api/src/plugins.ts`
15
+ - Depends on: none
16
+ - Acceptance: plugin test; example User adopts it
17
+
18
+ ## Phase 2 — JWT routes + mail
19
+
20
+ - [ ] **Task 2.1**: forgot/reset routes
21
+ - Description: 202-always forgot; reset validates+consumes token, `setPassword`, invalidates refresh tokens; RTK client path/shape contract verified
22
+ - Files: `api/src/authRecovery.ts`, `api/src/auth.ts`
23
+ - Depends on: 1.1, comms-abstraction
24
+ - Acceptance: enumeration-safety + happy-path supertest; RTK-shape test
25
+ - [ ] **Task 2.2**: verification routes + `requireEmailVerification` option
26
+ - Description: sendVerification/verifyEmail; 403 `email-not-verified` gating on login when enabled
27
+ - Files: `api/src/authRecovery.ts`, `api/src/auth.ts`
28
+ - Depends on: 1.2, 2.1
29
+ - Acceptance: gating on/off supertest
30
+ - [ ] **Task 2.3**: Mail templates
31
+ - Description: `resetPassword` + `verifyEmail` templates with app-override hook and `publicAppUrl` links
32
+ - Files: `comms/src/templates.ts`
33
+ - Depends on: comms-abstraction Phase 1
34
+ - Acceptance: rendered output snapshot tests
35
+
36
+ ## Phase 3 — Better Auth parity
37
+
38
+ - [ ] **Task 3.1**: Better Auth hooks
39
+ - Description: `sendResetPassword`/`sendVerificationEmail` wired to the same templates
40
+ - Files: `api/src/betterAuthSetup.ts`
41
+ - Depends on: 2.3
42
+ - Acceptance: parity test asserting identical template usage
43
+
44
+ ## Phase 4 — Client + docs
45
+
46
+ - [ ] **Task 4.1**: example-frontend reset screen + verify banner
47
+ - Description: `/resetPassword` route + profile banner with re-send; SDK regen
48
+ - Files: `example-frontend/app/resetPassword.tsx`, `app/(tabs)/profile.tsx`, `store/openApiSdk.ts`
49
+ - Depends on: Phase 2
50
+ - Acceptance: end-to-end flow with console adapter; UI verification evidence per verify-ui-changes
51
+ - [ ] **Task 4.2**: `LoginScreen` forgot-password link prop
52
+ - Description: optional `onForgotPassword` on `@terreno/ui` LoginScreen
53
+ - Files: `ui/src/login/LoginScreen.tsx` + tests + demo story
54
+ - Depends on: none
55
+ - Acceptance: renders only when provided; story added
56
+ - [ ] **Task 4.3**: Docs
57
+ - Description: how-to + env reference + rulesync
58
+ - Files: `docs/how-to/password-reset.md`, `docs/reference/environment-variables.md`, `.rulesync/**`
59
+ - Depends on: Phase 2
60
+ - Acceptance: `bun run rules:check` passes
@@ -13,19 +13,19 @@ See: [`docs/implementationPlans/positioning-django-rails-universal.md`](../imple
13
13
 
14
14
  ## Phase 1: Canonical copy
15
15
 
16
- - [ ] **Task 1.1**: Write `docs/explanation/positioning.md`
16
+ - [x] **Task 1.1**: Write `docs/explanation/positioning.md`
17
17
  - Description: New explainer containing five clearly-labeled copy blocks in fenced code blocks (so they can be copied verbatim without markdown rendering surprises): `tagline` (one line), `elevator` (2–3 sentences), `pillars` (three bullets, in the order batteries-included / universal-by-default / AI-native), `aiPillar` (2–3 sentences naming both AI layers per IP question PO7 — the MCP tool layer and the `/terreno-*` SDLC pipeline process layer), and `pitch` (~150 words). Then a "Why the Django/Rails analogy" section, then the honest comparison table from the IP. Then a "Language rules" section restating the four rules from the program doc (lead with the analogy, say "universal app", never claim unshipped features, keep superlatives off reference pages) plus a fifth: never describe one AI layer without the other.
18
18
  - Files: `docs/explanation/positioning.md` (new)
19
19
  - Depends on: none
20
20
  - Acceptance: five fenced copy blocks present and labeled; the `aiPillar` block names both the MCP tools and the `/terreno-*` pipeline; comparison table has at least eight rows including at least three honest gaps with IP links; language rules section has all five rules.
21
21
 
22
- - [ ] **Task 1.2**: Verify every claim in the comparison table
22
+ - [x] **Task 1.2**: Verify every claim in the comparison table
23
23
  - Description: For each row of the comparison table, confirm the Terreno side exists by finding it in source: `modelRouter` in `api/src/api.ts`, admin packages, `Permissions` in `api/src/permissions.ts`, Better Auth in `api/src/betterAuth*.ts`, MCP tools in `mcp-server/src/tools.ts`, and the SDLC pipeline in `plugins/terreno-planning/skills/`. For each "not shipped" row (background jobs, SSR, RBAC), confirm it is genuinely absent and link the IP or roadmap item tracking it. Correct any row that turns out to be wrong.
24
24
  - Files: `docs/explanation/positioning.md`
25
25
  - Depends on: Task 1.1
26
26
  - Acceptance: every "shipped" row cites a source path; the generator row cites both `mcp-server/src/tools.ts` and `plugins/terreno-planning/`; every "not shipped" row links an IP file that exists in `docs/implementationPlans/`.
27
27
 
28
- - [ ] **Task 1.3**: Gate the pipeline claim on its portability work
28
+ - [x] **Task 1.3**: Gate the pipeline claim on its portability work
29
29
  - Description: The `/terreno-*` pipeline currently only runs inside this monorepo (see [`agentic-sdlc-plugin`](../implementationPlans/agentic-sdlc-plugin.md), "It only works here"). Do not publish positioning copy that implies consumers can use it until that IP's Phase 2 is complete. Check the state of `agentic-sdlc-plugin` Task 2.5 before writing the `aiPillar` block; if portability is not done, write the block describing the tool layer only and add a `TODO` in the IP to revisit, rather than making a claim that fails on first use.
30
30
  - Files: `docs/explanation/positioning.md`
31
31
  - Depends on: Task 1.1
@@ -87,7 +87,7 @@ See: [`docs/implementationPlans/positioning-django-rails-universal.md`](../imple
87
87
  - Depends on: Task 1.1
88
88
  - Acceptance: every published package has a `description` matching the pattern, plus `repository`, `homepage`, and `bugs` fields; `bun install` still resolves cleanly.
89
89
 
90
- - [ ] **Task 5.2**: Document the GitHub repository metadata
90
+ - [x] **Task 5.2**: Document the GitHub repository metadata
91
91
  - Description: The repo description and topics cannot be set from a commit. Add a "Repository metadata" subsection to `docs/explanation/positioning.md` giving the exact description string (the short tagline variant from PO1 option C) and the exact topic list to set: `typescript`, `react-native`, `expo`, `express`, `mongoose`, `framework`, `mcp`, `ai`, `universal-apps`, `full-stack`. Mark it as a maintainer action.
92
92
  - Files: `docs/explanation/positioning.md`
93
93
  - Depends on: Task 1.1
@@ -13,19 +13,19 @@ See: [`docs/implementationPlans/public-roadmap-github.md`](../implementationPlan
13
13
 
14
14
  ## Phase 1: Discussions
15
15
 
16
- - [ ] **Task 1.1**: Document Discussion category setup
16
+ - [x] **Task 1.1**: Document Discussion category setup
17
17
  - Description: Create `docs/explanation/roadmap-process.md`. Start with a "Maintainer setup" section listing the seven Discussion categories from the IP with their exact names, formats (Announcement / Question-Answer / Open-ended), descriptions, and display order. For each, include the description text to paste into the GitHub UI (one to two sentences, written for outside users). Note that Discussions must first be enabled in Settings → General → Features.
18
18
  - Files: `docs/explanation/roadmap-process.md` (new)
19
19
  - Depends on: none
20
20
  - Acceptance: all seven categories are listed with name, format, description, and order; the Announcements category is marked maintainers-only.
21
21
 
22
- - [ ] **Task 1.2**: Write the pinned intro posts
22
+ - [x] **Task 1.2**: Write the pinned intro posts
23
23
  - Description: In `docs/explanation/roadmap-process.md`, add a "Pinned posts" section containing the full markdown body for one pinned post per category. Each should say what belongs there, what does not, and where to go instead. The Ideas post must explain that ideas are the intake funnel and that maintainers promote them to issues. The Agents & AI post must point at the MCP setup docs and the skills directory. The Q&A post must link `docs/how-to/` and note that recurring questions become how-to guides.
24
24
  - Files: `docs/explanation/roadmap-process.md`
25
25
  - Depends on: Task 1.1
26
26
  - Acceptance: seven post bodies exist, each under 200 words, each naming an alternative destination for off-topic content.
27
27
 
28
- - [ ] **Task 1.3**: Add Discussion templates
28
+ - [x] **Task 1.3**: Add Discussion templates
29
29
  - Description: Create `.github/DISCUSSION_TEMPLATE/rfc.yml` with fields: title guidance, Summary (required), Motivation (required), Detailed design (required), Alternatives considered (required), Drawbacks, Unresolved questions, and a checkbox acknowledging that accepted RFCs become IPs in `docs/implementationPlans/`. Create `.github/DISCUSSION_TEMPLATE/ideas.yml` with: Problem you are hitting (required), What you tried, Rough idea for a solution, and Would you be willing to help implement. Both must set the correct `labels:` and target the right category via the filename convention.
30
30
  - Files: `.github/DISCUSSION_TEMPLATE/rfc.yml` (new), `.github/DISCUSSION_TEMPLATE/ideas.yml` (new)
31
31
  - Depends on: Task 1.1
@@ -33,13 +33,13 @@ See: [`docs/implementationPlans/public-roadmap-github.md`](../implementationPlan
33
33
 
34
34
  ## Phase 2: Project board
35
35
 
36
- - [ ] **Task 2.1**: Document Project board setup
36
+ - [x] **Task 2.1**: Document Project board setup
37
37
  - Description: Add a "Project board" section to `docs/explanation/roadmap-process.md` specifying: the Project name (`Terreno Roadmap`), whether it is repo- or org-level, the six fields with their exact types and option values from the IP, and the four views with their layout, grouping, and filters. Include the `gh project` commands a maintainer can run for the parts the CLI supports, and mark the rest as UI-only.
38
38
  - Files: `docs/explanation/roadmap-process.md`
39
39
  - Depends on: Task 1.1
40
40
  - Acceptance: all six fields and four views are specified precisely enough to recreate without further decisions; option values match the IP tables exactly.
41
41
 
42
- - [ ] **Task 2.2**: Write the tracking-issue bodies for this program's IPs
42
+ - [x] **Task 2.2**: Write the tracking-issue bodies for this program's IPs
43
43
  - Description: Create `docs/explanation/roadmap-seed-issues.md` containing one ready-to-paste issue body per IP listed in `docs/implementationPlans/oss-launch-program.md`. Each body must include: a one-paragraph summary written for an outside reader (not internal shorthand), a link to the IP file, a link to the task file, the RTK deprecation flag, the dependencies, and the labels and Project field values to set (`Area`, `Target`, `Impact`, `IP`). Read each IP file to write its summary — do not paraphrase from the program index alone.
44
44
  - Files: `docs/explanation/roadmap-seed-issues.md` (new)
45
45
  - Depends on: Task 2.1
@@ -47,19 +47,19 @@ See: [`docs/implementationPlans/public-roadmap-github.md`](../implementationPlan
47
47
 
48
48
  ## Phase 3: Labels and triage
49
49
 
50
- - [ ] **Task 3.1**: Define the label set as data
50
+ - [x] **Task 3.1**: Define the label set as data
51
51
  - Description: Create `.github/labels.yml` listing every label from the IP taxonomy with `name`, `color`, and `description`. Use a consistent color family per prefix (for example one hue for `area:`, another for `type:`, another for `status:`, and distinct colors for the bare labels). Add a "Labels" section to `docs/explanation/roadmap-process.md` explaining that `.github/labels.yml` is the source of truth and how to apply it (`gh label create` loop or a label-sync action), plus which GitHub default labels to delete.
52
52
  - Files: `.github/labels.yml` (new), `docs/explanation/roadmap-process.md`
53
53
  - Depends on: Task 1.1
54
54
  - Acceptance: `.github/labels.yml` parses as valid YAML and contains every label in the IP taxonomy table with no duplicates; colors are valid six-digit hex without `#`.
55
55
 
56
- - [ ] **Task 3.2**: Add the triage workflow
56
+ - [x] **Task 3.2**: Add the triage workflow
57
57
  - Description: Create `.github/workflows/triage.yml`. On `issues: [opened]`, add the `status:needs-triage` label. Then read the issue body for the package dropdown value rendered by the issue forms and map it to the matching `area:*` label (for example `@terreno/api` → `area:api`, `docs` → `area:docs`). Implement the mapping in an inline `actions/github-script` step with an explicit lookup object; if no match is found, add no area label and leave a comment asking the reporter to specify. Validate required inputs before use per the repo convention.
58
58
  - Files: `.github/workflows/triage.yml` (new)
59
59
  - Depends on: Task 3.1
60
60
  - Acceptance: workflow parses as valid YAML; the mapping object covers every option in `bug_report.yml`'s package dropdown; the no-match path does not throw.
61
61
 
62
- - [ ] **Task 3.3**: Document the backfill triage pass
62
+ - [x] **Task 3.3**: Document the backfill triage pass
63
63
  - Description: Add a "One-time backfill" section to `docs/explanation/roadmap-process.md` describing how to triage existing open issues and PRs onto the new taxonomy: run `gh issue list --state open --limit 200 --json number,title,labels`, assign one `area:` and one `type:` label each, add anything still relevant to the board with `Status = Inbox`, and close or label `status:wontfix` anything stale beyond six months. Include the read-only `gh` commands for producing the working list.
64
64
  - Files: `docs/explanation/roadmap-process.md`
65
65
  - Depends on: Task 3.1
@@ -67,25 +67,25 @@ See: [`docs/implementationPlans/public-roadmap-github.md`](../implementationPlan
67
67
 
68
68
  ## Phase 4: Roadmap generation
69
69
 
70
- - [ ] **Task 4.1**: Write the roadmap generator
70
+ - [x] **Task 4.1**: Write the roadmap generator
71
71
  - Description: Create `scripts/generate-roadmap.ts` (Bun, TypeScript, `const` arrow functions with explicit return types, no new dependencies). It queries the GitHub GraphQL API for the `Terreno Roadmap` ProjectV2 items and their field values, then writes `ROADMAP.md`: a header explaining that the board is the source of truth and that no dates are promised, then sections grouped by `Target` (current release first, then `Next`, then `Future`), and within each, subsections by `Area`. Each item renders as a bullet with its title, issue link, `Impact`, and an IP link when the `IP` field is set. Exclude items with `Status` of `Declined`. Read the token from `GITHUB_TOKEN` and the project number from `TERRENO_PROJECT_NUMBER`; fail with a clear message listing missing variables when either is absent. Use Luxon for the generated-at timestamp.
72
72
  - Files: `scripts/generate-roadmap.ts` (new), `package.json` (add a `roadmap:generate` script)
73
73
  - Depends on: Task 2.1
74
74
  - Acceptance: running with both env vars unset prints an error naming both and exits non-zero; with a valid token it writes a `ROADMAP.md` matching the described structure; `bun run lint` passes.
75
75
 
76
- - [ ] **Task 4.2**: Add the roadmap workflow
76
+ - [x] **Task 4.2**: Add the roadmap workflow
77
77
  - Description: Create `.github/workflows/roadmap-generate.yml` running on `schedule` (daily) and `workflow_dispatch`. Validate `GITHUB_TOKEN`/PAT and `TERRENO_PROJECT_NUMBER` at job start with the repo's fail-fast pattern. Run `bun run roadmap:generate`, then commit and push `ROADMAP.md` only if `git diff --quiet` reports changes. Use a bot identity for the commit.
78
78
  - Files: `.github/workflows/roadmap-generate.yml` (new)
79
79
  - Depends on: Task 4.1
80
80
  - Acceptance: workflow parses as valid YAML; the secret-validation step lists every required variable; the commit step is conditional on a real diff.
81
81
 
82
- - [ ] **Task 4.3**: Seed `ROADMAP.md` and link it
82
+ - [x] **Task 4.3**: Seed `ROADMAP.md` and link it
83
83
  - Description: Commit an initial hand-written `ROADMAP.md` (the generator will overwrite it later) built from the IPs in `docs/implementationPlans/oss-launch-program.md` plus the active plans in `PLAN_INDEX.md`. Add a note at the top that it is generated from the Project board. Link it from `README.md` and add it to the docs site sidebar in `website/docusaurus.config.ts` (or the sidebars file if navigation is defined there — check both).
84
84
  - Files: `ROADMAP.md` (new), `README.md`, `website/docusaurus.config.ts` or `website/sidebars.ts`
85
85
  - Depends on: Task 4.1
86
86
  - Acceptance: `ROADMAP.md` lists every IP in the program with a `Target`; the docs site builds (`bun run website:build`) with the new nav entry; the README links it.
87
87
 
88
- - [ ] **Task 4.4**: Add the docs feedback footer link
88
+ - [x] **Task 4.4**: Add the docs feedback footer link
89
89
  - Description: In `website/docusaurus.config.ts`, add a footer link (or theme config item) pointing at the Docs feedback Discussions category. If Docusaurus's `editUrl` mechanism is the better fit for per-page feedback, add the discussion link alongside the existing `editUrl` rather than replacing it.
90
90
  - Files: `website/docusaurus.config.ts`
91
91
  - Depends on: Task 1.1
@@ -93,19 +93,19 @@ See: [`docs/implementationPlans/public-roadmap-github.md`](../implementationPlan
93
93
 
94
94
  ## Phase 5: Linear bridge
95
95
 
96
- - [ ] **Task 5.1**: Document the Linear bridge rules
96
+ - [x] **Task 5.1**: Document the Linear bridge rules
97
97
  - Description: Add a "Linear bridge" section to `docs/explanation/roadmap-process.md` covering: which artifacts live where (GitHub = public discussion, issues, roadmap state; Linear = sprint execution; `docs/implementationPlans/` = design), the one-way GitHub → Linear intake triggered by the `tracked` label, the rule that Linear status is not synced back and that GitHub state changes via `Fixes #NNN` on merge, how internally-originated public work gets a manual GitHub issue, and an explicit statement that internal-only Linear work is never mirrored. Explain *why* status is not two-way synced.
98
98
  - Files: `docs/explanation/roadmap-process.md`
99
99
  - Depends on: Task 3.1
100
100
  - Acceptance: the section states the direction of every sync, names the trigger label, and gives the reason two-way status sync was rejected.
101
101
 
102
- - [ ] **Task 5.2**: Document the intake flow in `CONTRIBUTING.md`
102
+ - [x] **Task 5.2**: Document the intake flow in `CONTRIBUTING.md`
103
103
  - Description: Add a "How work gets planned" section to `CONTRIBUTING.md`, under 30 lines: file an Ideas discussion → maintainer promotes to an issue → issue is triaged onto the roadmap board → substantial work gets an IP → implementation. Add the RFC path for public API changes and new packages. Link `ROADMAP.md`, the Discussions categories, and `docs/implementationPlans/README.md`.
104
104
  - Files: `CONTRIBUTING.md`
105
105
  - Depends on: Task 5.1
106
106
  - Acceptance: the section is under 30 lines, links all three destinations, and matches the flow diagram in the IP.
107
107
 
108
- - [ ] **Task 5.3**: Add the release announcement step
108
+ - [x] **Task 5.3**: Add the release announcement step
109
109
  - Description: Edit `.rulesync/skills/release/SKILL.md` to add a step: after publishing a release that includes breaking changes or deprecations, post a discussion in the Announcements category summarizing the change, linking the changelog section and the relevant upgrade note in `mcp-server/src/docs/upgrades/`. Regenerate mirrors with `bun run rules`.
110
110
  - Files: `.rulesync/skills/release/SKILL.md` plus generated mirrors
111
111
  - Depends on: Task 1.1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@terreno/mcp",
3
- "version": "56.0.0-beta.0",
3
+ "version": "56.0.0-beta.2",
4
4
  "description": "MCP server for Terreno - provides documentation, tools, and prompts for building full-stack apps",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -27,9 +27,9 @@
27
27
  "dependencies": {
28
28
  "@modelcontextprotocol/sdk": "^1.27.0",
29
29
  "@sentry/bun": "^10.39.0",
30
- "@terreno/api": "56.0.0-beta.0",
30
+ "@terreno/api": "56.0.0-beta.2",
31
31
  "minisearch": "^7.2.0",
32
- "mongoose": "8.23.0"
32
+ "mongoose": "9.7.4"
33
33
  },
34
34
  "devDependencies": {
35
35
  "@biomejs/biome": "^2.3.6",
@@ -38,6 +38,7 @@
38
38
  "typescript": "~6.0.3"
39
39
  },
40
40
  "files": [
41
+ "LICENSE",
41
42
  "dist",
42
43
  "src/docs"
43
44
  ],
@@ -1,16 +1,17 @@
1
- /// <reference types="passport-local-mongoose" />
2
1
  import type {APIErrorConstructor} from "@terreno/api";
3
2
  import type mongoose from "mongoose";
4
- import type {Document, FilterQuery, Model} from "mongoose";
3
+ import type {Document, Model} from "mongoose";
4
+
5
+ type ModelQuery<T> = Partial<Record<keyof T, unknown>> & Record<string, unknown>;
5
6
 
6
7
  export interface DefaultStatics<T> {
7
8
  findOneOrNone(
8
- query: FilterQuery<T>,
9
+ query: ModelQuery<T>,
9
10
  errorArgs?: Partial<APIErrorConstructor>
10
11
  ): Promise<(Document & T) | null>;
11
12
 
12
13
  findExactlyOne(
13
- query: FilterQuery<T>,
14
+ query: ModelQuery<T>,
14
15
  errorArgs?: Partial<APIErrorConstructor>
15
16
  ): Promise<Document & T>;
16
17
  }
@@ -5,9 +5,11 @@ interface {{Name}}Document extends mongoose.Document {
5
5
  {{interfaceFields}}
6
6
  }
7
7
 
8
+ type ModelQuery<T> = Partial<Record<keyof T, unknown>> & Record<string, unknown>;
9
+
8
10
  interface {{Name}}Model extends mongoose.Model<{{Name}}Document> {
9
- findOneOrNone(query: mongoose.FilterQuery<{{Name}}Document>): Promise<{{Name}}Document | null>;
10
- findExactlyOne(query: mongoose.FilterQuery<{{Name}}Document>): Promise<{{Name}}Document>;
11
+ findOneOrNone(query: ModelQuery<{{Name}}Document>): Promise<{{Name}}Document | null>;
12
+ findExactlyOne(query: ModelQuery<{{Name}}Document>): Promise<{{Name}}Document>;
11
13
  }
12
14
 
13
15
  const {{lowerName}}Schema = new mongoose.Schema<{{Name}}Document, {{Name}}Model>(
@@ -0,0 +1,60 @@
1
+ # 0.31.0
2
+
3
+ Terreno packages move in lockstep. Nothing in this release removes or renames a public
4
+ export, so most apps upgrade by bumping the `@terreno/*` versions and running:
5
+
6
+ - `bun run compile` and `bun run lint` at the repo root
7
+ - `cd <your frontend> && bun run sdk` after any `@terreno/api` route or model surface change
8
+
9
+ ## Mongoose 9 is now supported (Mongoose 8 still works)
10
+
11
+ Every published package that talks to Mongoose (`api`, `test`, `admin-backend`, `ai`,
12
+ `feature-flags`) widened its peer dependency to `^8.0.0 || ^9.0.0`. Terreno itself
13
+ develops against Mongoose 9.7.4.
14
+
15
+ You can stay on Mongoose 8 with no changes. If you upgrade your app to Mongoose 9, the
16
+ changes that mattered inside Terreno will most likely matter in your code too:
17
+
18
+ ```typescript
19
+ // Before (Mongoose 8)
20
+ await Model.findOneAndUpdate(filter, update, {new: true});
21
+
22
+ // After (Mongoose 9)
23
+ await Model.findOneAndUpdate(filter, update, {returnDocument: "after"});
24
+ ```
25
+
26
+ - Aggregation-pipeline updates must pass `updatePipeline: true` to `updateMany`.
27
+ - Query middleware no longer takes the legacy `next()` callback — use the async form.
28
+ - Array schema paths expose `getEmbeddedSchemaType()`; the private `caster` property is gone.
29
+ - Mongoose 9 ships its own types, so `@types/mongodb` and
30
+ `@types/passport-local-mongoose` should be removed from your dev dependencies.
31
+ - Pin `bson` to `7.2.0` if your lockfile resolves an older copy alongside Mongoose 9.
32
+
33
+ Mongoose 9 requires Node >= 20.19.0. Terreno's root `package.json` now declares that
34
+ engine range for local development.
35
+
36
+ ## `@terreno/api` type changes
37
+
38
+ Both changes widen or relax types; they are source-compatible for normal usage, but
39
+ explicit annotations may need updating:
40
+
41
+ - `modelRouter` now accepts `Model<T, any, any, any, any, any>` instead of `Model<T>`,
42
+ so models with custom query helpers, methods, or virtuals no longer need a cast.
43
+ - `findOneOrNoneFor(model, query)` takes `ModelQuery<T>` (a partial record keyed by the
44
+ document fields) instead of Mongoose's `FilterQuery<T>`. If you were building a
45
+ `FilterQuery<T>` value to pass in, it still works; if you were annotating the variable
46
+ as `FilterQuery<T>` and relying on operator typing, switch to `ModelQuery<T>`.
47
+
48
+ ## `@terreno/admin-backend` array field metadata
49
+
50
+ `GET /admin/config` derives array item metadata (`itemType`, `itemRef`, `itemEnum`) from
51
+ Mongoose's public `getEmbeddedSchemaType()` when available, falling back to the Mongoose 8
52
+ `caster` shape. `itemEnum` is only emitted when the embedded enum is an array, so an enum
53
+ declared as an object map no longer produces a malformed `itemEnum`. Admin clients that
54
+ read `itemEnum` should treat it as optional.
55
+
56
+ ## License changed from Apache-2.0 to MIT
57
+
58
+ All published `@terreno/*` packages are now MIT licensed and ship a `LICENSE` file in the
59
+ package tarball. No code change is required; update any license inventory or attribution
60
+ list that pinned Terreno as Apache-2.0.
@@ -0,0 +1,59 @@
1
+ # 56.0.0-beta.2
2
+
3
+ Second beta of the Expo SDK 56 line. Packages publish under the npm `beta` dist-tag;
4
+ `npm install @terreno/ui` (no tag) still resolves to the stable `0.x` release.
5
+
6
+ ```bash
7
+ bun add @terreno/ui@beta @terreno/api@beta @terreno/rtk@beta
8
+ # optional local-first data layer
9
+ bun add @terreno/syncdb@beta
10
+ ```
11
+
12
+ ## Upgrade Expo before Terreno
13
+
14
+ This line targets Expo SDK 56. Upgrade the app first, then install Terreno betas:
15
+
16
+ | Package | Version |
17
+ |---------|---------|
18
+ | `expo` | `~56.0.12` |
19
+ | `react-native` | `0.85.3` |
20
+ | `react` | `19.2.3` |
21
+ | `typescript` | `~6.0.3` |
22
+
23
+ Follow Expo's SDK 56 upgrade guide, then bump `@terreno/*` to `56.0.0-beta.2` (or `@beta`).
24
+ Run `bun run compile` / `bun run lint` at the app root and regenerate the OpenAPI SDK after
25
+ any `@terreno/api` surface change (`bun run sdk` in the frontend).
26
+
27
+ Terreno's version major now tracks the Expo SDK major. Stay on the latest `0.x` packages
28
+ until you are ready to move the app to Expo 56.
29
+
30
+ ## New package: `@terreno/syncdb`
31
+
32
+ Optional local-first layer (TinyBase MergeableStore, durable outbox, websocket delta sync,
33
+ encrypted web persistence). Install as `@terreno/syncdb@beta` (or the exact version). See:
34
+
35
+ - [`docs/how-to/migrate-rtk-to-syncdb.md`](https://github.com/FlourishHealth/terreno/blob/master/docs/how-to/migrate-rtk-to-syncdb.md)
36
+ - [`docs/reference/syncdb.md`](https://github.com/FlourishHealth/terreno/blob/master/docs/reference/syncdb.md)
37
+
38
+ `@terreno/syncdb` does not replace the generated OpenAPI SDK, Better Auth wiring, or
39
+ feature flags — only collection sync/CRUD offline paths.
40
+
41
+ ## `excludeArchivedPlugin` now filters `findOne`
42
+
43
+ `excludeArchivedPlugin` applies the same archived filter to `findOne` that it already
44
+ applied to `find`, matching `isDeletedPlugin`. Code that relied on `findOne` returning
45
+ archived documents must query with an explicit archived override or a different plugin
46
+ configuration.
47
+
48
+ ## Sync / REST error codes
49
+
50
+ Sync and REST CRUD executors preserve kebab-case error `code` values
51
+ (`create-not-allowed`, `update-not-allowed`, `delete-not-allowed`, `invalid-request-body`)
52
+ and status-specific error names on hook-rejection paths. Clients that matched on older
53
+ code strings should update.
54
+
55
+ ## From `56.0.0-beta.0`
56
+
57
+ `beta.0` was cut from `release-56.0.0`. This beta is cut from `master` after that branch
58
+ merged (`#976`), and also includes `@terreno/comms` plus the sync/Mongoose 9 fixes listed
59
+ in `CHANGELOG.md` for this version.
@@ -21,6 +21,7 @@ Documentation for the Terreno monorepo: shared packages for full-stack applicati
21
21
  | [@terreno/admin-backend](reference/admin-backend.md) | Admin panel backend plugin |
22
22
  | [@terreno/admin-frontend](reference/admin-frontend.md) | Admin panel frontend screens |
23
23
  | [@terreno/api-health](reference/api-health.md) | Health check endpoint plugin |
24
+ | [@terreno/comms](reference/comms.md) | Pluggable communications providers and delivery logging |
24
25
  | [@terreno/mcp](reference/mcp-server.md) | AI coding assistant integration (MCP) |
25
26
 
26
27
  ## Quick links
@@ -2,13 +2,19 @@
2
2
 
3
3
  Understanding-oriented documentation: concepts, architecture, and context.
4
4
 
5
+ ## Deployment
6
+
7
+ - [Deployment baseline](deployment-baseline.md) — seven requirements for production Terreno apps
8
+ - [GCP deployment architecture](deployment-architecture-gcp.md) — Cloud Run + GCS/CDN topology and tradeoffs
9
+ - [GCP hosting architecture](gcp-hosting-architecture.md) — static site hosting with GCS and Cloud CDN (legacy detail)
10
+
5
11
  ## Contents
6
12
 
7
13
  - [AI-powered workflows](ai-workflows.md) — Autonomous documentation, testing, and maintenance workflows
8
14
  - [Authentication architecture](authentication.md) — How JWT, OAuth, and token refresh work
9
15
  - [Configuration system](configuration-system.md) — Runtime configuration with database persistence
10
16
  - [Dependency management](dependency-management.md) — Dependabot, auto-merge, and security practices
11
- - [GCP hosting architecture](gcp-hosting-architecture.md) — Static site hosting with GCS and Cloud CDN
12
17
  - [Modular API design](modular-api-design.md) — 🚧 Why TerrenoApp replaces setupServer
13
18
  - [modelRouter actions](model-router-actions.md) — Named collection and instance operations on modelRouter
14
19
  - [No barrel imports](no-barrel-imports.md) — Import concrete modules, not `index` re-export barrels
20
+ - [Positioning](positioning.md) — Canonical copy blocks and the honest Django/Rails comparison