@terreno/mcp 57.6.1 → 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/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/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
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# Implementation Plan: Support answering agent (`@terreno/support`)
|
|
2
2
|
|
|
3
3
|
**Status:** Draft — awaiting approval (Grow ran unattended; every Decisions row marked `assumed` is a recommended default the reviewer can change before Approve)
|
|
4
|
+
**Roadmap:** Area=`ai`, Target=`Future`, Impact=`Feature`
|
|
4
5
|
**Branch:** `cursor/support-agent-grow-fd63`
|
|
5
6
|
**Owner:** unassigned
|
|
6
7
|
**Created:** 2026-09-15
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Implementation Plan: @terreno/syncdb-codegen
|
|
2
2
|
|
|
3
3
|
**Status:** Complete — shipped as `syncdb/src/codegen` + `terreno-syncdb-codegen`
|
|
4
|
-
**Roadmap issue:** https://github.com/TerrenoLabs/terreno/issues/
|
|
4
|
+
**Roadmap issue:** https://github.com/TerrenoLabs/terreno/issues/1110
|
|
5
5
|
**Branch:** cursor/syncdb-codegen-in-package-746d
|
|
6
6
|
**Owner:**
|
|
7
7
|
**Created:** 2026-07-08
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# @terreno/langfuse
|
|
2
2
|
|
|
3
3
|
**Roadmap issue:** https://github.com/TerrenoLabs/terreno/issues/1093
|
|
4
|
-
**Status:**
|
|
4
|
+
**Status:** Complete
|
|
5
5
|
|
|
6
6
|
> **See also:** Native in-app observability (prompts, traces, evals, experiments, review queue) is specified in [ai-observability.md](./ai-observability.md). This IP remains the **Langfuse Cloud/self-host vendor plugin**. Both plugins may be registered; traces/scores fan out (see that IP).
|
|
7
7
|
|
|
@@ -14,7 +14,7 @@ loops that invoke those stages; they are not stages and must not appear as `stag
|
|
|
14
14
|
| `terreno-2-pick` | approved task + branch/state | one implemented slice, then Roast, then the next task | Roast, or Brew when the list is done |
|
|
15
15
|
| `terreno-3-roast` | Pick result + current diff | independent requirement/evidence verdict for the current task | emit Pick if tasks remain, else Brew; never invoke Pick; pass a task-scoped briefing; do not spawn two unconstrained reviewers |
|
|
16
16
|
| `terreno-4-brew` | Roast PASS for every in-scope task + branch/evidence | pushed head + PR + product-CI trigger check + review-bot wait + attached evidence | Taste |
|
|
17
|
-
| `terreno-5-taste` | PR + current state | one current-head reaction; before push:
|
|
17
|
+
| `terreno-5-taste` | PR + current state | one current-head reaction; before push: fetch latest `master` (merge only when needed), re-verify last-run failed tests locally, run root `prepush` when present (otherwise affected-package checks) in a no-context subagent, then watch CI; invoked directly, repeats bounded reactions until terminal | null or fresh Taste |
|
|
18
18
|
|
|
19
19
|
Outer loops (not stages):
|
|
20
20
|
|
|
@@ -51,7 +51,7 @@ until async review bots (Bugbot, CodeQL, and similar) on the current head have r
|
|
|
51
51
|
preferring provider CLI watch hooks or harness event subscriptions over sleep polling.
|
|
52
52
|
Taste then waits in a loop for product CI using GitHub CLI (`gh pr checks --watch`,
|
|
53
53
|
`gh run watch`) or CircleCI CLI (`circleci run watch`) until jobs are terminal or the
|
|
54
|
-
wait times out. Before any push, Taste
|
|
54
|
+
wait times out. Before any push, Taste fetches latest `master` (merging it only when needed), records last-run
|
|
55
55
|
failed tests and re-verifies them locally, then spawns a
|
|
56
56
|
fresh subagent with no parent conversation. If the repository root defines a `prepush`
|
|
57
57
|
package script, Taste runs it as the authoritative local gate; otherwise it falls back
|
|
@@ -148,7 +148,7 @@ the demo compiles. Add a story plus `demoConfig.tsx` registration for new
|
|
|
148
148
|
components, or an allowlist entry with a specific reason — not "hard to demo".
|
|
149
149
|
The allowlist is limited to shell/providers, React context objects, thin RN
|
|
150
150
|
list wrappers, subcomponents already exercised by a parent story
|
|
151
|
-
(
|
|
151
|
+
(DropdownPanel, Table, DateTimeField, HeightField, ConsentFormScreen), and
|
|
152
152
|
product surfaces that belong in `example-frontend` rather than the isolated
|
|
153
153
|
UI demo (announcements and in-app notifications).
|
|
154
154
|
Standalone picker sheets (`NumberPickerActionSheet`, `DecimalRangeActionSheet`)
|
|
@@ -226,6 +226,69 @@ overrides it:
|
|
|
226
226
|
| Helper | `{testID}.helper` |
|
|
227
227
|
| Show/hide toggle | `{testID}.visibility-toggle` |
|
|
228
228
|
|
|
229
|
+
### DropdownPanel
|
|
230
|
+
|
|
231
|
+
`DropdownPanel` is the compositional dropdown behind the DataTable filter popovers. A
|
|
232
|
+
trigger opens an anchored panel of arbitrary composed content with an optional
|
|
233
|
+
Apply / Clear / Cancel footer, so it also fits non-filter panels (bulk actions, column
|
|
234
|
+
pickers, sort menus).
|
|
235
|
+
|
|
236
|
+
``````typescript
|
|
237
|
+
<DropdownPanel
|
|
238
|
+
label="Filters"
|
|
239
|
+
onApply={applyDraft}
|
|
240
|
+
onCancel={resetDraft}
|
|
241
|
+
onClear={clearDraft}
|
|
242
|
+
onOpenChange={(isOpen) => isOpen && seedDraft()}
|
|
243
|
+
width={340}
|
|
244
|
+
>
|
|
245
|
+
<FilterSelectMenu title="Due date" options={DUE_DATE_OPTIONS} value={dueDate} onChange={setDueDate} />
|
|
246
|
+
<FilterBoolean title="Urgent tasks only" value={urgentOnly} onChange={setUrgentOnly} />
|
|
247
|
+
</DropdownPanel>
|
|
248
|
+
``````
|
|
249
|
+
|
|
250
|
+
> `Filter` is the former name and stays exported as a deprecated alias (with `FilterProps`)
|
|
251
|
+
> until Terreno 58. The `FilterSelectMenu` / `FilterBoolean` / `FilterAccordion` /
|
|
252
|
+
> `FilterChangesBadge` controls keep their names.
|
|
253
|
+
|
|
254
|
+
#### Positioning
|
|
255
|
+
|
|
256
|
+
The panel never renders inside its parent's clipping or stacking context: on web it is
|
|
257
|
+
portaled to `document.body` with fixed positioning, and on native it is teleported to the
|
|
258
|
+
`TerrenoProvider` portal host (falling back to an inline absolute overlay when no host is
|
|
259
|
+
mounted). `computeDropdownPanelLayout` then anchors it to the measured trigger:
|
|
260
|
+
|
|
261
|
+
| Situation | Behavior |
|
|
262
|
+
| --- | --- |
|
|
263
|
+
| Panel fits beside the trigger | Left edges line up (`align="start"`) |
|
|
264
|
+
| Left-aligned panel would cross the right viewport edge | Right edges line up instead (`align="auto"`, the default) |
|
|
265
|
+
| Panel is wider than the viewport | Narrowed to the viewport minus the 8px screen margins |
|
|
266
|
+
| Less than 160px below the trigger, and more above | Flipped above the trigger |
|
|
267
|
+
| Content taller than the space on screen | Panel body scrolls; the footer stays pinned |
|
|
268
|
+
|
|
269
|
+
Pass `align="start"` or `align="end"` to pin the side explicitly, and `maxPanelHeight` to
|
|
270
|
+
cap the height below what the viewport allows.
|
|
271
|
+
|
|
272
|
+
#### Trigger
|
|
273
|
+
|
|
274
|
+
The default trigger is a `Button` (or a compact icon trigger with `iconOnly`). Style it
|
|
275
|
+
with `triggerVariant` (any `Button` variant), `triggerSize`, and `fullWidth`, or replace
|
|
276
|
+
it entirely with `renderTrigger` when the design needs chrome the button variants do not
|
|
277
|
+
cover:
|
|
278
|
+
|
|
279
|
+
``````typescript
|
|
280
|
+
<DropdownPanel
|
|
281
|
+
fullWidth
|
|
282
|
+
renderTrigger={({isOpen, toggle}) => <MyPill active={isOpen} onPress={toggle} />}
|
|
283
|
+
width={300}
|
|
284
|
+
>
|
|
285
|
+
{fields}
|
|
286
|
+
</DropdownPanel>
|
|
287
|
+
``````
|
|
288
|
+
|
|
289
|
+
`variant` still sets both the trigger and the Apply button; `triggerVariant` and
|
|
290
|
+
`applyButtonVariant` override each independently.
|
|
291
|
+
|
|
229
292
|
### GPTChat
|
|
230
293
|
|
|
231
294
|
Streaming chat surface for `@terreno/ai`. Histories, messages, submit, and optional MCP/tools stay under consumer control.
|
|
@@ -811,10 +874,10 @@ columns; web shows one **More filters** popover and native includes them in the
|
|
|
811
874
|
|
|
812
875
|
| Platform | Chrome |
|
|
813
876
|
| --- | --- |
|
|
814
|
-
| Web | Toolbar search + per-column `
|
|
877
|
+
| Web | Toolbar search + per-column `DropdownPanel` popovers (`column.filter`) |
|
|
815
878
|
| Native | Toolbar search + one **Filters** sheet (`Modal`) with the same fields |
|
|
816
879
|
|
|
817
|
-
Column headers use `
|
|
880
|
+
Column headers use `DropdownPanel` with `iconOnly`, which renders a compact icon trigger
|
|
818
881
|
(24px at the default `triggerSize="sm"`, 32px with `triggerSize="default"`) instead
|
|
819
882
|
of a labeled button. Give it an accessible name with `triggerAccessibilityLabel`.
|
|
820
883
|
|
|
@@ -4,7 +4,7 @@ IP: [can-as-permission-seam.md](../implementationPlans/can-as-permission-seam.md
|
|
|
4
4
|
|
|
5
5
|
## Phase 1 — `assertAllowed`
|
|
6
6
|
|
|
7
|
-
- [
|
|
7
|
+
- [x] **Task 1.1**: Helper + unit tests
|
|
8
8
|
- Delivers: `assertAllowed` implements legacy `checkPermissions` and `accessControl.can()`; double-gate test (access allow + permissions deny → allow)
|
|
9
9
|
- Files: `api/src/rbac/assertAllowed.ts`, `api/src/rbac/assertAllowed.test.ts`
|
|
10
10
|
- Blocked by: none (can land before MCP adapters; executors wiring waits on unified writes if MCP still duplicates checks)
|
|
@@ -12,7 +12,7 @@ IP: [can-as-permission-seam.md](../implementationPlans/can-as-permission-seam.md
|
|
|
12
12
|
|
|
13
13
|
## Phase 2 — Hot path
|
|
14
14
|
|
|
15
|
-
- [
|
|
15
|
+
- [x] **Task 2.1**: Middleware + executors
|
|
16
16
|
- Delivers: `permissionMiddleware` and `executeCreate/Update/Delete` call `assertAllowed`; `buildAccessPermissions` not used on requests
|
|
17
17
|
- Files: `api/src/permissions.ts`, `api/src/sync/executors.ts`, `api/src/api.ts`, `api/src/rbac/modelRouterAccess.ts`, tests
|
|
18
18
|
- Blocked by: 1.1; unified-mutation-executors Phase 2 so MCP is included automatically
|
|
@@ -20,12 +20,12 @@ IP: [can-as-permission-seam.md](../implementationPlans/can-as-permission-seam.md
|
|
|
20
20
|
|
|
21
21
|
## Phase 3 — Consumers and docs
|
|
22
22
|
|
|
23
|
-
- [
|
|
23
|
+
- [x] **Task 3.1**: example-backend dual config
|
|
24
24
|
- Delivers: routers with `access` drop redundant AND `permissions` where RBAC is the intent
|
|
25
25
|
- Files: `example-backend/src/**` model routers
|
|
26
26
|
- Blocked by: 2.1
|
|
27
27
|
- Acceptance: example-backend tests pass
|
|
28
|
-
- [
|
|
28
|
+
- [x] **Task 3.2**: Docs + breaking changelog
|
|
29
29
|
- Files: `docs/reference/api.md`, `docs/how-to/create-a-model.md`, `docs/implementationPlans/rbac-permissions.md` pointer, changelog
|
|
30
30
|
- Blocked by: 2.1
|
|
31
31
|
- Skills: `update-docs`
|
|
@@ -4,12 +4,12 @@ IP: [collection-registry.md](../implementationPlans/collection-registry.md)
|
|
|
4
4
|
|
|
5
5
|
## Phase 1 — Dual-write catalog
|
|
6
6
|
|
|
7
|
-
- [
|
|
7
|
+
- [x] **Task 1.1**: `CollectionRegistry` module
|
|
8
8
|
- Delivers: `registerCollection`, `replaceCollectionOptions`, `getCollection`, `listCollections`, `clearCollectionRegistry` with unit tests (unknown path no-op, options replace)
|
|
9
9
|
- Files: `api/src/collectionRegistry.ts`, `api/src/collectionRegistry.test.ts`
|
|
10
10
|
- Blocked by: none
|
|
11
11
|
- Acceptance: bun tests for the module pass without wiring modelRouter
|
|
12
|
-
- [
|
|
12
|
+
- [x] **Task 1.2**: Dual-write from `modelRouter`
|
|
13
13
|
- Delivers: `modelRouter` / `_buildModelRouter` write the catalog in addition to existing `register*` / `update*`
|
|
14
14
|
- Files: `api/src/api.ts`
|
|
15
15
|
- Blocked by: 1.1
|
|
@@ -17,12 +17,12 @@ IP: [collection-registry.md](../implementationPlans/collection-registry.md)
|
|
|
17
17
|
|
|
18
18
|
## Phase 2 — Surfaces read the catalog
|
|
19
19
|
|
|
20
|
-
- [
|
|
20
|
+
- [x] **Task 2.1**: MCP and realtime views
|
|
21
21
|
- Delivers: `getMCPRegistry` / realtime finders read `CollectionRegistry`; arrays in those files removed
|
|
22
22
|
- Files: `api/src/mcp/registry.ts`, `api/src/realtime/registry.ts`, related tests
|
|
23
23
|
- Blocked by: 1.2
|
|
24
24
|
- Acceptance: MCP and realtime tests pass; `updateMCPRegistryOptions` updates the shared record
|
|
25
|
-
- [
|
|
25
|
+
- [x] **Task 2.2**: Sync view + keep validation
|
|
26
26
|
- Delivers: sync lookup uses catalog; `registerSync` validation + index promises still run
|
|
27
27
|
- Files: `api/src/sync/registry.ts`, `api/src/sync/*.test.ts`
|
|
28
28
|
- Blocked by: 1.2
|
|
@@ -30,12 +30,12 @@ IP: [collection-registry.md](../implementationPlans/collection-registry.md)
|
|
|
30
30
|
|
|
31
31
|
## Phase 3 — Contract
|
|
32
32
|
|
|
33
|
-
- [
|
|
33
|
+
- [x] **Task 3.1**: Single writer + clear-all
|
|
34
34
|
- Delivers: `modelRouter` only writes `CollectionRegistry`; wrapper register/update/clear functions; tests that used independent clears updated
|
|
35
35
|
- Files: `api/src/api.ts`, registry wrappers, tests
|
|
36
36
|
- Blocked by: 2.1, 2.2
|
|
37
37
|
- Acceptance: one `replaceCollectionOptions` is enough for MCP+sync options identity
|
|
38
|
-
- [
|
|
38
|
+
- [x] **Task 3.2**: Docs + changelog
|
|
39
39
|
- Files: `docs/explanation/modular-api-design.md`, `docs/reference/api.md`, changelog
|
|
40
40
|
- Blocked by: 3.1
|
|
41
41
|
- Skills: `update-docs`
|
|
@@ -4,12 +4,12 @@ IP: [describe-model-schema.md](../implementationPlans/describe-model-schema.md)
|
|
|
4
4
|
|
|
5
5
|
## Phase 1 — Descriptor + MCP
|
|
6
6
|
|
|
7
|
-
- [
|
|
7
|
+
- [x] **Task 1.1**: `describeModel` / `describeModelForRouter`
|
|
8
8
|
- Delivers: field graph + snapshot tests on a fixture schema
|
|
9
9
|
- Files: `api/src/schemaMetadata.ts`, `api/src/schemaMetadata.test.ts`
|
|
10
10
|
- Blocked by: none
|
|
11
11
|
- Acceptance: snapshots for enum, ref, array, subdocument, system fields
|
|
12
|
-
- [
|
|
12
|
+
- [x] **Task 1.2**: MCP Zod from descriptor
|
|
13
13
|
- Delivers: `schemaGenerator.ts` maps `FieldDescription`; no SchemaType switch for kinds already in the descriptor
|
|
14
14
|
- Files: `api/src/mcp/schemaGenerator.ts`, `api/src/mcp/schemaGenerator.test.ts`
|
|
15
15
|
- Blocked by: 1.1
|
|
@@ -17,7 +17,7 @@ IP: [describe-model-schema.md](../implementationPlans/describe-model-schema.md)
|
|
|
17
17
|
|
|
18
18
|
## Phase 2 — Admin
|
|
19
19
|
|
|
20
|
-
- [
|
|
20
|
+
- [x] **Task 2.1**: `extractFieldMeta` from descriptor
|
|
21
21
|
- Delivers: admin config fields built from `describeModel`, not OpenAPI property walk
|
|
22
22
|
- Files: `admin-backend/src/adminApp.ts`, admin-backend tests
|
|
23
23
|
- Blocked by: 1.1
|
|
@@ -25,12 +25,12 @@ IP: [describe-model-schema.md](../implementationPlans/describe-model-schema.md)
|
|
|
25
25
|
|
|
26
26
|
## Phase 3 — OpenAPI + docs
|
|
27
27
|
|
|
28
|
-
- [
|
|
28
|
+
- [x] **Task 3.1**: `getOpenApiSpecForModel` from descriptor
|
|
29
29
|
- Delivers: OpenAPI properties derived from `ModelDescription`; populate still applied
|
|
30
30
|
- Files: `api/src/populate.ts`, `api/src/openApi.test.ts` / example-backend openapi snapshot if required
|
|
31
31
|
- Blocked by: 1.1
|
|
32
32
|
- Acceptance: OpenAPI tests pass; any snapshot diff is reviewed in the PR
|
|
33
|
-
- [
|
|
33
|
+
- [x] **Task 3.2**: Docs + export
|
|
34
34
|
- Files: `docs/explanation/schema-metadata.md`, `docs/reference/api.md`, `docs/how-to/create-a-model.md`, admin reference, `api/src/index.ts`, changelog
|
|
35
35
|
- Blocked by: 1.2, 2.1, 3.1
|
|
36
36
|
- Skills: `update-docs`
|
|
@@ -103,19 +103,21 @@ Research: [`docs/implementationPlans/migrate-cicd-to-circleci-research.md`](../i
|
|
|
103
103
|
- Files: `.circleci/continue-config.yml`
|
|
104
104
|
- Depends on: Task 0.2, Task 1.3
|
|
105
105
|
- Acceptance: preview deploy URL posted or visible; prod deploy on master path filter.
|
|
106
|
-
- Note:
|
|
106
|
+
- Note: CircleCI is the only Netlify deployer; jobs fail when `terreno-netlify` is empty. PR close triggers CircleCI `preview-cleanup` through `preview-cleanup.yml`.
|
|
107
107
|
|
|
108
108
|
- [ ] **Task 4.2**: Preview cleanup port
|
|
109
109
|
- Description: On PR close, clean Netlify/GCP preview resources from CircleCI (webhook or GitHub App → pipeline). Prefer OIDC over `GCP_SA_KEY`.
|
|
110
110
|
- Files: `.circleci/continue-config.yml`
|
|
111
111
|
- Depends on: Task 4.1
|
|
112
112
|
- Acceptance: closing a PR removes preview resources; no orphaned Cloud Run `pr-N` services in a test PR.
|
|
113
|
+
- Note: Cutover code landed on branch `move-cd-to-circleci` (GHA deploy workflows disabled; CircleCI deploy jobs fail on empty contexts). Check off after contexts are filled and the acceptance is observed.
|
|
113
114
|
|
|
114
115
|
- [ ] **Task 4.3**: Dual-run cutover for Netlify
|
|
115
116
|
- Description: Delete GHA deploy workflows after CircleCI trusted.
|
|
116
117
|
- Files: `.github/workflows/demo-deploy.yml`, `frontend-example-deploy.yml`, `docs-deploy.yml`, `preview-cleanup.yml`
|
|
117
118
|
- Depends on: Task 4.1, Task 4.2
|
|
118
119
|
- Acceptance: GHA deploy twins deleted.
|
|
120
|
+
- Note: Cutover code landed on branch `move-cd-to-circleci` (GHA deploy workflows disabled; CircleCI deploy jobs fail on empty contexts). Check off after contexts are filled and the acceptance is observed.
|
|
119
121
|
|
|
120
122
|
## Phase 5: EAS + fingerprint
|
|
121
123
|
|
|
@@ -150,13 +152,14 @@ Research: [`docs/implementationPlans/migrate-cicd-to-circleci-research.md`](../i
|
|
|
150
152
|
- Files: `.circleci/continue-config.yml`
|
|
151
153
|
- Depends on: Task 6.1
|
|
152
154
|
- Acceptance: terraform preview on PR; apply+deploy on master for a safe test path; GitHub Deployment records optional but documented.
|
|
153
|
-
- Note:
|
|
155
|
+
- Note: CircleCI is the only GCP deployer; jobs fail when `terreno-gcp` is empty. `gcp-cd-prod` runs MCP `test:ci` before the MCP deploy.
|
|
154
156
|
|
|
155
157
|
- [ ] **Task 6.3**: Dual-run cutover for CD
|
|
156
158
|
- Description: Single deployer: disable GHA `cd.yml` when CircleCI CD is required; remove GitHub OIDC provider only after GHA CD is gone (or keep read-only if other repos need it — document).
|
|
157
159
|
- Files: `.github/workflows/cd.yml`, terraform OIDC
|
|
158
160
|
- Depends on: Task 6.2
|
|
159
161
|
- Acceptance: only CircleCI performs terreno CD; no double apply.
|
|
162
|
+
- Note: Cutover code landed on branch `move-cd-to-circleci` (GHA deploy workflows disabled; CircleCI deploy jobs fail on empty contexts). Check off after contexts are filled and the acceptance is observed.
|
|
160
163
|
|
|
161
164
|
## Phase 7: npm publish
|
|
162
165
|
|
|
@@ -200,7 +203,7 @@ Research: [`docs/implementationPlans/migrate-cicd-to-circleci-research.md`](../i
|
|
|
200
203
|
- Depends on: Task 0.2
|
|
201
204
|
- Acceptance: Security tab still receives results **or** explicit maintainer sign-off on alternative.
|
|
202
205
|
|
|
203
|
-
- [ ] **Task 9.2**: Replace Dependabot auto-merge + triage +
|
|
206
|
+
- [ ] **Task 9.2**: Replace Dependabot auto-merge + triage + docs-audit (roadmap workflows stay on GitHub Actions, decided 2026-09-26)
|
|
204
207
|
- Description: Implement CircleCI (or Renovate) equivalents; wire issue/schedule triggers without leaving required logic on GHA.
|
|
205
208
|
- Files: `.circleci/continue-config.yml`, corresponding GHA deletions
|
|
206
209
|
- Depends on: Task 0.2
|
package/package.json
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"@modelcontextprotocol/node": "^2.0.0",
|
|
12
12
|
"@modelcontextprotocol/server": "^2.0.0",
|
|
13
13
|
"@sentry/bun": "^10.39.0",
|
|
14
|
-
"@terreno/api": "57.
|
|
14
|
+
"@terreno/api": "57.7.0",
|
|
15
15
|
"express": "^5.2.1",
|
|
16
16
|
"luxon": "^3.7.2",
|
|
17
17
|
"minisearch": "^7.2.0",
|
|
@@ -104,5 +104,5 @@
|
|
|
104
104
|
"test:coverage": "bun run ../scripts/check-coverage.ts"
|
|
105
105
|
},
|
|
106
106
|
"type": "module",
|
|
107
|
-
"version": "57.
|
|
107
|
+
"version": "57.7.0"
|
|
108
108
|
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Upgrading to 57.7.0
|
|
2
|
+
|
|
3
|
+
**Action required:** No
|
|
4
|
+
**Affected packages:** @terreno/ui
|
|
5
|
+
|
|
6
|
+
## Summary
|
|
7
|
+
|
|
8
|
+
Bump every `@terreno/*` package together to `57.7.0`. `@terreno/ui`'s `Filter` is now `DropdownPanel`. Existing `Filter` and `FilterProps` imports keep working until Terreno 58. Panels stay on screen, render through the `TerrenoProvider` portal on native, and accept styled or custom triggers. No Expo upgrade is required if you are already on `57.x`.
|
|
9
|
+
|
|
10
|
+
## Breaking changes
|
|
11
|
+
|
|
12
|
+
None
|
|
13
|
+
|
|
14
|
+
## Deprecations
|
|
15
|
+
|
|
16
|
+
### `Filter` and `FilterProps`
|
|
17
|
+
|
|
18
|
+
**What changed**
|
|
19
|
+
|
|
20
|
+
`Filter` is renamed to `DropdownPanel`. `Filter` and `FilterProps` stay exported as deprecated aliases and are removed in Terreno 58. `FilterSelectMenu`, `FilterBoolean`, `FilterAccordion`, and `FilterChangesBadge` keep their names.
|
|
21
|
+
|
|
22
|
+
**Why**
|
|
23
|
+
|
|
24
|
+
The control is a general compositional dropdown (trigger, anchored panel, optional Apply/Clear/Cancel footer), not a filter-only widget.
|
|
25
|
+
|
|
26
|
+
**Migration**
|
|
27
|
+
|
|
28
|
+
```tsx
|
|
29
|
+
// Before
|
|
30
|
+
import {Filter} from "@terreno/ui";
|
|
31
|
+
|
|
32
|
+
<Filter label="Status">{children}</Filter>;
|
|
33
|
+
|
|
34
|
+
// After
|
|
35
|
+
import {DropdownPanel} from "@terreno/ui";
|
|
36
|
+
|
|
37
|
+
<DropdownPanel label="Status">{children}</DropdownPanel>;
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Changed behavior
|
|
41
|
+
|
|
42
|
+
### Panels stay on screen and escape clipping
|
|
43
|
+
|
|
44
|
+
**What changed**
|
|
45
|
+
|
|
46
|
+
`DropdownPanel` (including the `Filter` alias) right-aligns to its trigger when a left-aligned panel would cross the right viewport edge, clamps to an 8px screen margin, flips above the trigger when there is no usable room below, and scrolls its body with the footer pinned when the content is taller than the space available. On native it renders through the `TerrenoProvider` portal host, so the panel is no longer clipped inside scroll views or cards. Without a host it stays an inline overlay.
|
|
47
|
+
|
|
48
|
+
**Why**
|
|
49
|
+
|
|
50
|
+
Left-aligned panels ran off screen, and inline overlays were clipped by parent scroll views.
|
|
51
|
+
|
|
52
|
+
**Migration**
|
|
53
|
+
|
|
54
|
+
No call-site change is required. Pass `align` or `maxPanelHeight` to override the automatic layout. Apps that position their own panels can call `computeDropdownPanelLayout`.
|
|
55
|
+
|
|
56
|
+
## New capabilities
|
|
57
|
+
|
|
58
|
+
`DropdownPanel` triggers accept `triggerVariant` (any `Button` variant), `applyButtonVariant`, `triggerSize` on labeled triggers, `fullWidth`, and `renderTrigger` for a fully custom trigger.
|
|
59
|
+
|
|
60
|
+
## Verification
|
|
61
|
+
|
|
62
|
+
- `bun add` every `@terreno/*` dependency to `57.7.0`, then `bun run compile` at the app root
|
|
63
|
+
- Open a screen that uses `Filter` or `DropdownPanel` and confirm the panel stays inside the viewport, including near the right edge and inside a scrolling parent
|
|
64
|
+
- Replace `Filter` imports with `DropdownPanel` before upgrading to Terreno 58
|
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
This file is a placeholder until Terreno 58 is cut. When that release ships, expand this page into a full upgrade note.
|
|
4
4
|
|
|
5
|
+
## `Filter` and `FilterProps` are removed
|
|
6
|
+
|
|
7
|
+
`@terreno/ui` removes the `Filter` and `FilterProps` aliases added as deprecations in 57.7.0. Import `DropdownPanel` and `DropdownPanelProps`. `FilterSelectMenu`, `FilterBoolean`, `FilterAccordion`, and `FilterChangesBadge` keep their names. See [57.7.0](57.7.0.md).
|
|
8
|
+
|
|
5
9
|
## HTTP rate limiting defaults on
|
|
6
10
|
|
|
7
11
|
`TerrenoApp` will enable HTTP rate limiting by default (memory store unless you pass `store`). Apps that must stay unlimited must pass an explicit off once 58 defines that API.
|
|
@@ -49,7 +49,7 @@ the inner loop until the approved task list is done. Roast never invokes Pick. B
|
|
|
49
49
|
Taste additionally wait while async review bots are running, preferring provider CLI
|
|
50
50
|
watch hooks or harness event subscriptions over timer polling. Taste also waits in a
|
|
51
51
|
loop for product CI with `gh` or `circleci` until jobs are terminal or the wait times
|
|
52
|
-
out. Before any push it
|
|
52
|
+
out. Before any push it fetches latest `master` (merging it only when needed), then records last-run failed tests
|
|
53
53
|
and re-verifies them locally, then runs the repository's root
|
|
54
54
|
`prepush` package script in a no-context subagent when present (falling back to affected
|
|
55
55
|
package lint, typecheck, and tests), then pushes and watches CI.
|
|
@@ -82,8 +82,8 @@ acceptance criteria. Taste is one reactive iteration, not an unbounded fix-until
|
|
|
82
82
|
daemon. It waits until async review bots (Bugbot, CodeQL, and similar) on the current
|
|
83
83
|
head have reported, then waits in a loop for product CI using GitHub CLI
|
|
84
84
|
(`gh pr checks --watch`, `gh run watch`) or CircleCI CLI (`circleci run watch`) until
|
|
85
|
-
jobs are terminal or the wait times out. Before any push it
|
|
86
|
-
`master
|
|
85
|
+
jobs are terminal or the wait times out. Before any push it fetches latest
|
|
86
|
+
`master` (merging it only when needed), records last-run failed tests and re-verifies them locally, then runs root
|
|
87
87
|
`prepush` when present in a fresh subagent with no parent
|
|
88
88
|
conversation. If absent, it proves affected-package lint, typecheck, and tests instead.
|
|
89
89
|
It then pushes and watches CI, emits `PASS`, `FAIL`, `BLOCKED`, or `PENDING`, and exits.
|
|
@@ -139,6 +139,35 @@ or transports it and Brew excludes it from commits unless repository policy says
|
|
|
139
139
|
otherwise. Stage results follow the plugin's JSON-schema-backed YAML contract and never
|
|
140
140
|
contain chain-of-thought or transcripts.
|
|
141
141
|
|
|
142
|
+
## Commits and pushes
|
|
143
|
+
|
|
144
|
+
Every pushed commit starts a full CI run. Harnesses such as Cursor cloud agents push
|
|
145
|
+
every commit automatically, so commit count turns directly into CI runs. Before these
|
|
146
|
+
rules, one 30-commit dashboard PR had ten "mark slice roasted" commits and ten "harden"
|
|
147
|
+
follow-ups, and `ui-ci` stayed red on every commit after the first.
|
|
148
|
+
|
|
149
|
+
- One behavior-scoped commit per task, after Roast `PASS`: code, tests, docs, and the
|
|
150
|
+
task-file mark together. Roast-driven fixes fold into that commit.
|
|
151
|
+
- Progress lives in execution state, not in standalone task-file commits.
|
|
152
|
+
- Pick and Roast never push. Brew pushes once. Taste pushes at most once per reaction.
|
|
153
|
+
- Pick does not continue on a head whose product CI shows a branch-caused failure.
|
|
154
|
+
- Pick lists a behavior's edge cases before coding, so Roast proves them instead of
|
|
155
|
+
discovering them.
|
|
156
|
+
- Roast runs the gate CI will run (root `prepush`, which mirrors the triggered CI jobs),
|
|
157
|
+
not only the task's test file.
|
|
158
|
+
- Taste fetches `master` before every push but merges it only when the PR conflicts, a
|
|
159
|
+
failure traces to base drift, or the branch is otherwise merge-ready.
|
|
160
|
+
|
|
161
|
+
## Direct invocation
|
|
162
|
+
|
|
163
|
+
Outer loops (`terreno-planning-loop`, `terreno-taste-sweep`) consume Taste `PENDING`
|
|
164
|
+
and invoke Taste again. When a human invokes Taste directly, no loop is waiting, so a
|
|
165
|
+
`PENDING` would only tell them to come back later. In that case Taste uses
|
|
166
|
+
**standalone entry**: it waits in-process with native watches and reacts again. It
|
|
167
|
+
stops on `PASS`, `BLOCKED`, or `FAIL`, or after 3 fix pushes or 3 hours of waiting,
|
|
168
|
+
which ends as `BLOCKED` with one concrete human action. A directly invoked Brew
|
|
169
|
+
starts Taste as its next stage instead of exiting.
|
|
170
|
+
|
|
142
171
|
## Retry and stop rules
|
|
143
172
|
|
|
144
173
|
- Pick implements one task, Roast proves it, then Pick takes the next unblocked task.
|
|
@@ -51,11 +51,18 @@ as GitHub App checks; they are not CircleCI jobs.
|
|
|
51
51
|
|
|
52
52
|
**Path:** Settings → Environments
|
|
53
53
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
**
|
|
58
|
-
|
|
54
|
+
`cd.yml` is disabled; CircleCI `gcp-cd-preview` performs GCP previews and
|
|
55
|
+
halts on fork PRs. While the GitHub WIF provider still exists, keep the
|
|
56
|
+
`gcp-cd-preview` environment restricted with a **deployment branch policy** or
|
|
57
|
+
**required reviewers** so a fork that re-enables `cd.yml` cannot mint a prod
|
|
58
|
+
WIF token.
|
|
59
|
+
|
|
60
|
+
### Actions secrets for CircleCI hooks
|
|
61
|
+
|
|
62
|
+
`preview-cleanup.yml` (PR close) and `publish-on-tag.yml` (manual publish demo
|
|
63
|
+
redeploy) start CircleCI pipelines. Set the secret `CIRCLECI_TOKEN` and the
|
|
64
|
+
variable `CIRCLECI_PIPELINE_DEFINITION_ID` under Settings → Secrets and
|
|
65
|
+
variables → Actions.
|
|
59
66
|
|
|
60
67
|
## Merge settings
|
|
61
68
|
|
|
@@ -88,11 +88,10 @@ half applies:
|
|
|
88
88
|
| 1 | Announcements | Announcement | Maintainers only | Official release notes, breaking changes, deprecations, and launch updates from the Terreno team. |
|
|
89
89
|
| 2 | Q&A | Question / Answer | Anyone | Ask how to use Terreno. Search existing threads first; accepted answers may become how-to guides in `docs/how-to/`. |
|
|
90
90
|
| 3 | Ideas | Open-ended | Anyone | Feature ideas and improvements before they are shaped. This is the intake funnel — do not open a tracking issue until a maintainer promotes your idea. |
|
|
91
|
-
| 4 |
|
|
92
|
-
| 5 |
|
|
93
|
-
| 6 |
|
|
94
|
-
| 7 |
|
|
95
|
-
| 8 | Docs feedback | Open-ended | Anyone | Report missing or confusing documentation. Link the page URL; recurring feedback becomes docs PRs. |
|
|
91
|
+
| 4 | Agents & AI | Open-ended | Anyone | MCP setup, Cursor/Claude skills, agent workflows, and prompt patterns for building with Terreno. |
|
|
92
|
+
| 5 | RFCs | Open-ended | Anyone | Substantial proposals that change public API or add packages. Use the RFC discussion template; accepted RFCs become IPs. |
|
|
93
|
+
| 6 | Show and tell | Open-ended | Anyone | Apps and experiments built with Terreno. Share what you shipped and what friction you hit. |
|
|
94
|
+
| 7 | Docs feedback | Open-ended | Anyone | Report missing or confusing documentation. Link the page URL; recurring feedback becomes docs PRs. |
|
|
96
95
|
|
|
97
96
|
### Pinned posts
|
|
98
97
|
|
|
@@ -127,24 +126,29 @@ When an answer repeats, maintainers turn it into a how-to doc via PR.
|
|
|
127
126
|
- Do **not** open a feature issue directly — maintainers promote accepted ideas to tracked issues on the [Terreno Roadmap](https://github.com/TerrenoLabs/terreno/projects) board.
|
|
128
127
|
- For API/package-level design, use the **RFCs** category instead.
|
|
129
128
|
- Bugs → [Bug report](https://github.com/TerrenoLabs/terreno/issues/new?template=bug_report.yml).
|
|
129
|
+
- **Hacktoberfest pitches live here too.** Tick the Hacktoberfest box on the form; maintainers apply the [`hacktoberfest`](https://github.com/TerrenoLabs/terreno/discussions?discussions_q=label%3Ahacktoberfest) label. 👍 the pitches you want built.
|
|
130
130
|
```
|
|
131
131
|
|
|
132
|
-
#### Hacktoberfest
|
|
132
|
+
#### Hacktoberfest (inside Ideas)
|
|
133
133
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
1. [Start a Hacktoberfest discussion](https://github.com/TerrenoLabs/terreno/discussions/new?category=hacktoberfest) — the form asks for the idea, area, rough size, and what "done" looks like.
|
|
138
|
-
2. Upvote and comment on other pitches. Upvotes are how maintainers rank them.
|
|
139
|
-
3. Maintainers turn popular, well-scoped ideas into issues labeled [`hacktoberfest`](https://github.com/TerrenoLabs/terreno/issues?q=is%3Aissue+is%3Aopen+label%3Ahacktoberfest) and link them back here. Pick one up by commenting on the issue.
|
|
134
|
+
Hacktoberfest does not get its own category. Pitches are Ideas discussions carrying the
|
|
135
|
+
`hacktoberfest` label, so upvotes, promotion, and search all use the same path as any other
|
|
136
|
+
idea.
|
|
140
137
|
|
|
141
|
-
|
|
142
|
-
|
|
138
|
+
1. [Start an Ideas discussion](https://github.com/TerrenoLabs/terreno/discussions/new?category=ideas)
|
|
139
|
+
and tick **This is a Hacktoberfest pitch**. Give the area, rough size, and what "done" looks
|
|
140
|
+
like.
|
|
141
|
+
2. A maintainer applies the [`hacktoberfest`](https://github.com/TerrenoLabs/terreno/discussions?discussions_q=label%3Ahacktoberfest)
|
|
142
|
+
label and the matching `area:*` label. Upvotes are how maintainers rank pitches.
|
|
143
|
+
3. Popular, well-scoped pitches become issues labeled
|
|
144
|
+
[`hacktoberfest`](https://github.com/TerrenoLabs/terreno/issues?q=is%3Aissue+is%3Aopen+label%3Ahacktoberfest),
|
|
145
|
+
linked back to the discussion. Pick one up by commenting on the issue.
|
|
143
146
|
|
|
144
|
-
Promotion follows the Ideas path, with one change: a Hacktoberfest
|
|
147
|
+
Promotion follows the Ideas path, with one change: a Hacktoberfest pitch small enough to finish
|
|
145
148
|
in a weekend becomes a `hacktoberfest` + `good first issue` work item directly (see
|
|
146
149
|
[GitHub issue lifecycle](../how-to/github-issue-lifecycle.md)) instead of a `Shaping` roadmap
|
|
147
|
-
item. Larger ones go through `roadmap-promote` like any
|
|
150
|
+
item. Larger ones get `hacktoberfest` + `help wanted` and go through `roadmap-promote` like any
|
|
151
|
+
other idea.
|
|
148
152
|
|
|
149
153
|
#### Agents & AI
|
|
150
154
|
|
|
@@ -397,10 +401,10 @@ do not claim completion until done.
|
|
|
397
401
|
|
|
398
402
|
| Workflow | Trigger | Purpose |
|
|
399
403
|
| -------- | ------- | ------- |
|
|
400
|
-
| [`.github/workflows/triage.yml`](https://github.com/TerrenoLabs/terreno/blob/master/.github/workflows/triage.yml) | Issue opened | `status:needs-triage` + `area:*` from package dropdown + `type:*` from Kind when present |
|
|
404
|
+
| [`.github/workflows/triage.yml`](https://github.com/TerrenoLabs/terreno/blob/master/.github/workflows/triage.yml) | Issue opened | `status:needs-triage` + `area:*` from package dropdown + `type:*` from Kind when present; `area:*` / `type:*` labels the issue was opened with win, so `roadmap:sync` issues are not asked for an area |
|
|
401
405
|
| [`.github/workflows/roadmap-generate.yml`](https://github.com/TerrenoLabs/terreno/blob/master/.github/workflows/roadmap-generate.yml) | Daily + manual | `roadmap:sync --check` for board drift, then regenerate `ROADMAP.md` from the board and open a pull request when it changes |
|
|
402
406
|
| [`.github/workflows/roadmap-sync.yml`](https://github.com/TerrenoLabs/terreno/blob/master/.github/workflows/roadmap-sync.yml) | Taxonomy files change on `master` + manual | Apply labels and reconcile the board's fields and items |
|
|
403
|
-
| [`.github/workflows/roadmap-reconcile.yml`](https://github.com/TerrenoLabs/terreno/blob/master/.github/workflows/roadmap-reconcile.yml) | IP or task files change on `master` + manual | Advance status from IP headers, push to the board, regenerate `ROADMAP.md` |
|
|
407
|
+
| [`.github/workflows/roadmap-reconcile.yml`](https://github.com/TerrenoLabs/terreno/blob/master/.github/workflows/roadmap-reconcile.yml) | IP or task files change on `master` + manual | Advance status from IP headers, add an entry for every new IP, open its tracking issue, push to the board, regenerate `ROADMAP.md` |
|
|
404
408
|
All three share the `roadmap` concurrency group. They write the same board, and interleaving
|
|
405
409
|
them produces confusing partial states. After the group lock is acquired, each job refreshes
|
|
406
410
|
to the latest branch HEAD so a queued `roadmap-sync` cannot overwrite statuses that
|
|
@@ -413,7 +417,7 @@ The full loop, each arrow with exactly one writer:
|
|
|
413
417
|
|
|
414
418
|
```
|
|
415
419
|
docs/implementationPlans/*.md ──roadmap:reconcile──▶ roadmap-seed-issues.md
|
|
416
|
-
docs/tasks/*.md
|
|
420
|
+
docs/tasks/*.md (Status + new entries) │
|
|
417
421
|
roadmap:sync
|
|
418
422
|
▼
|
|
419
423
|
Project board
|
|
@@ -439,6 +443,24 @@ reported by `--check` and is never overwritten. Cards that are not in
|
|
|
439
443
|
[`roadmap-seed-issues.md`](roadmap-seed-issues.md) are also `--check` failures; apply does
|
|
440
444
|
not delete them. Maintainers own the board's *state* and `Community interest`.
|
|
441
445
|
|
|
446
|
+
**New IPs reach the roadmap on merge.** When a merged plan has no entry,
|
|
447
|
+
`roadmap:reconcile --fix` scaffolds one: the title from the IP's H1, the summary from the first
|
|
448
|
+
paragraph of `## Goal`, and links to the IP and its task list (when `docs/tasks/<slug>.md`
|
|
449
|
+
exists). Area, Target, and Impact come from an optional IP header:
|
|
450
|
+
|
|
451
|
+
```markdown
|
|
452
|
+
**Roadmap:** Area=`api`, Target=`Next`, Impact=`Feature`
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
Without that header they are inferred: Area from the packages named in the header block
|
|
456
|
+
(default `dx`); Target `Released` for shipped work, `Future` for drafts, `58` when a
|
|
457
|
+
`**Target:**` line names 58, otherwise `Next`; Impact `Breaking` when the `**Target:**` line
|
|
458
|
+
says so, otherwise `Feature`. Edit the scaffolded section afterward if a guess is wrong. The
|
|
459
|
+
workflow then runs `roadmap:sync --create-missing-ip-issues`, which opens a tracking issue
|
|
460
|
+
only for entries backed by an IP. Drafts land as `Shaping`. Moving an entry to `Shipped` also
|
|
461
|
+
moves its Target to `Released`. `ROADMAP.md` links each entry's IP and, when one exists, its
|
|
462
|
+
task list.
|
|
463
|
+
|
|
442
464
|
**Status automation is monotonic.** `roadmap:reconcile --fix` advances status and applies
|
|
443
465
|
supersessions, but never walks a status backwards and never revives declined work. IP headers
|
|
444
466
|
go stale far more often than boards do — several plans still read `Draft` for work that
|