@terreno/mcp 57.19.2 → 57.20.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/CHANGELOG.md +393 -0
- package/README.md +32 -269
- package/dist/bootstrap.d.ts +12 -0
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +77 -122
- package/dist/bootstrap.js.map +1 -1
- package/dist/docs/guidelines/ui/guidelines/core.md +1 -1
- package/dist/docs/resources/overview.md +4 -2
- package/dist/docs/resources/patterns.md +237 -176
- package/dist/docs/resources/ui.md +48 -17
- package/dist/docs/templates/bootstrap/frontend/app/(tabs)/profile.template.tsx +0 -26
- package/dist/docs/templates/bootstrap/frontend/app/_layout.template.tsx +3 -2
- package/dist/docs/templates/bootstrap/frontend/app/login.template.tsx +1 -1
- package/dist/docs/upgrades/57.20.0.md +238 -0
- package/dist/docs/versioned/next/approval-rubric.md +30 -12
- package/dist/docs/versioned/next/explanation/README.md +5 -0
- package/dist/docs/versioned/next/explanation/account-linking.md +169 -0
- package/dist/docs/versioned/next/explanation/admin-interface.md +1 -1
- package/dist/docs/versioned/next/explanation/agent-guidelines.md +173 -0
- package/dist/docs/versioned/next/explanation/ai-development-loop.md +196 -0
- package/dist/docs/versioned/next/explanation/authentication.md +45 -1
- package/dist/docs/versioned/next/explanation/consent-forms.md +105 -0
- package/dist/docs/versioned/next/explanation/example-coverage.md +1 -0
- package/dist/docs/versioned/next/explanation/local-first-data.md +1 -1
- package/dist/docs/versioned/next/explanation/organizations.md +37 -0
- package/dist/docs/versioned/next/explanation/planning-plugins.md +4 -0
- package/dist/docs/versioned/next/explanation/responsive-design.md +143 -0
- package/dist/docs/versioned/next/explanation/roadmap-seed-issues.md +11 -0
- package/dist/docs/versioned/next/explanation/schema-metadata.md +5 -0
- package/dist/docs/versioned/next/how-to/README.md +7 -2
- package/dist/docs/versioned/next/how-to/audit-log.md +22 -3
- package/dist/docs/versioned/next/how-to/automate-terreno-upgrades.md +169 -0
- package/dist/docs/versioned/next/how-to/build-list-detail-screens.md +160 -0
- package/dist/docs/versioned/next/how-to/circleci.md +15 -5
- package/dist/docs/versioned/next/how-to/configure-better-auth.md +673 -53
- package/dist/docs/versioned/next/how-to/create-a-terreno-app.md +8 -5
- package/dist/docs/versioned/next/how-to/debug-with-mcp.md +393 -23
- package/dist/docs/versioned/next/how-to/enable-mcp-oauth.md +54 -3
- package/dist/docs/versioned/next/how-to/migrate-rtk-to-syncdb.md +9 -0
- package/dist/docs/versioned/next/how-to/password-reset.md +1 -1
- package/dist/docs/versioned/next/how-to/recover-locked-out-user.md +112 -0
- package/dist/docs/versioned/next/how-to/run-tests-locally.md +37 -8
- package/dist/docs/versioned/next/how-to/set-up-social-login.md +424 -0
- package/dist/docs/versioned/next/how-to/set-up-terreno-mcp.md +241 -36
- package/dist/docs/versioned/next/how-to/sign-consent-on-behalf.md +139 -0
- package/dist/docs/versioned/next/how-to/upgrade-terreno.md +4 -0
- package/dist/docs/versioned/next/implementationPlans/ai-dev-loop-boost.md +47 -32
- package/dist/docs/versioned/next/implementationPlans/auth-experience.md +952 -0
- package/dist/docs/versioned/next/implementationPlans/consent-forms.md +8 -0
- package/dist/docs/versioned/next/implementationPlans/list-detail-layout.md +297 -0
- package/dist/docs/versioned/next/implementationPlans/login-redesign/HANDOFF.md +211 -0
- package/dist/docs/versioned/next/implementationPlans/login-redesign/boards/AnotherWay.html +121 -0
- package/dist/docs/versioned/next/implementationPlans/login-redesign/boards/BackupCode.html +72 -0
- package/dist/docs/versioned/next/implementationPlans/login-redesign/boards/Cancelled.html +87 -0
- package/dist/docs/versioned/next/implementationPlans/login-redesign/boards/ContinueEmail.html +64 -0
- package/dist/docs/versioned/next/implementationPlans/login-redesign/boards/FirstVisit.html +81 -0
- package/dist/docs/versioned/next/implementationPlans/login-redesign/boards/Main.html +88 -0
- package/dist/docs/versioned/next/implementationPlans/login-redesign/boards/ManageAccounts.html +77 -0
- package/dist/docs/versioned/next/implementationPlans/login-redesign/boards/NotLinked.html +92 -0
- package/dist/docs/versioned/next/implementationPlans/login-redesign/boards/SigningIn.html +60 -0
- package/dist/docs/versioned/next/implementationPlans/login-redesign/boards/TwoFactor.html +76 -0
- package/dist/docs/versioned/next/implementationPlans/login-redesign/boards/TwoFactorError.html +81 -0
- package/dist/docs/versioned/next/implementationPlans/login-redesign/boards/WrongPassword.html +69 -0
- package/dist/docs/versioned/next/implementationPlans/mcp-boost-parity.md +1 -1
- package/dist/docs/versioned/next/plans/2026-10-23-provisional-consent.md +297 -0
- package/dist/docs/versioned/next/plans/2026-10-29-fix-mcp-oauth-native-and-machine.md +68 -0
- package/dist/docs/versioned/next/reference/README.md +1 -0
- package/dist/docs/versioned/next/reference/account-security.md +700 -0
- package/dist/docs/versioned/next/reference/admin-backend.md +3 -1
- package/dist/docs/versioned/next/reference/admin-frontend.md +225 -1
- package/dist/docs/versioned/next/reference/api.md +461 -35
- package/dist/docs/versioned/next/reference/cli.md +1 -1
- package/dist/docs/versioned/next/reference/comms.md +8 -0
- package/dist/docs/versioned/next/reference/create-terreno-app.md +3 -1
- package/dist/docs/versioned/next/reference/environment-variables.md +9 -3
- package/dist/docs/versioned/next/reference/legacy/rtk.md +19 -3
- package/dist/docs/versioned/next/reference/lifecycle-plugin.md +6 -0
- package/dist/docs/versioned/next/reference/mcp-server.md +1158 -441
- package/dist/docs/versioned/next/reference/syncdb.md +8 -1
- package/dist/docs/versioned/next/reference/ui.md +1271 -27
- package/dist/docs/versioned/next/tasks/ai-dev-loop-boost.md +28 -16
- package/dist/docs/versioned/next/tutorials/README.md +4 -0
- package/dist/httpApp.d.ts +14 -0
- package/dist/httpApp.d.ts.map +1 -0
- package/dist/httpApp.js +99 -0
- package/dist/httpApp.js.map +1 -0
- package/dist/index.js +8 -90
- package/dist/index.js.map +1 -1
- package/dist/local/localTools.d.ts.map +1 -1
- package/dist/local/localTools.js +44 -14
- package/dist/local/localTools.js.map +1 -1
- package/dist/local/metro/metroDevSession.d.ts +18 -0
- package/dist/local/metro/metroDevSession.d.ts.map +1 -1
- package/dist/local/metro/metroDevSession.js +42 -3
- package/dist/local/metro/metroDevSession.js.map +1 -1
- package/dist/local/tools/databaseQuery.d.ts.map +1 -1
- package/dist/local/tools/databaseQuery.js +3 -13
- package/dist/local/tools/databaseQuery.js.map +1 -1
- package/dist/local/tools/databaseSchema.d.ts.map +1 -1
- package/dist/local/tools/databaseSchema.js +3 -13
- package/dist/local/tools/databaseSchema.js.map +1 -1
- package/dist/local/tools/localMongo.d.ts +10 -0
- package/dist/local/tools/localMongo.d.ts.map +1 -0
- package/dist/local/tools/localMongo.js +30 -0
- package/dist/local/tools/localMongo.js.map +1 -0
- package/dist/local/tools/runtime.d.ts +18 -2
- package/dist/local/tools/runtime.d.ts.map +1 -1
- package/dist/local/tools/runtime.js +75 -20
- package/dist/local/tools/runtime.js.map +1 -1
- package/dist/local/tools/syncDb.d.ts +11 -0
- package/dist/local/tools/syncDb.d.ts.map +1 -1
- package/dist/local/tools/syncDb.js +15 -3
- package/dist/local/tools/syncDb.js.map +1 -1
- package/dist/rateLimit.d.ts +35 -0
- package/dist/rateLimit.d.ts.map +1 -0
- package/dist/rateLimit.js +112 -0
- package/dist/rateLimit.js.map +1 -0
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +42 -60
- package/dist/tools.js.map +1 -1
- package/package.json +4 -3
- package/src/docs/guidelines/ui/guidelines/core.md +1 -1
- package/src/docs/resources/overview.md +4 -2
- package/src/docs/resources/patterns.md +237 -176
- package/src/docs/resources/ui.md +48 -17
- package/src/docs/templates/bootstrap/frontend/app/(tabs)/profile.template.tsx +0 -26
- package/src/docs/templates/bootstrap/frontend/app/_layout.template.tsx +3 -2
- package/src/docs/templates/bootstrap/frontend/app/login.template.tsx +1 -1
- package/src/docs/upgrades/57.20.0.md +238 -0
- package/src/docs/versioned/next/approval-rubric.md +30 -12
- package/src/docs/versioned/next/explanation/README.md +5 -0
- package/src/docs/versioned/next/explanation/account-linking.md +169 -0
- package/src/docs/versioned/next/explanation/admin-interface.md +1 -1
- package/src/docs/versioned/next/explanation/agent-guidelines.md +173 -0
- package/src/docs/versioned/next/explanation/ai-development-loop.md +196 -0
- package/src/docs/versioned/next/explanation/authentication.md +45 -1
- package/src/docs/versioned/next/explanation/consent-forms.md +105 -0
- package/src/docs/versioned/next/explanation/example-coverage.md +1 -0
- package/src/docs/versioned/next/explanation/local-first-data.md +1 -1
- package/src/docs/versioned/next/explanation/organizations.md +37 -0
- package/src/docs/versioned/next/explanation/planning-plugins.md +4 -0
- package/src/docs/versioned/next/explanation/responsive-design.md +143 -0
- package/src/docs/versioned/next/explanation/roadmap-seed-issues.md +11 -0
- package/src/docs/versioned/next/explanation/schema-metadata.md +5 -0
- package/src/docs/versioned/next/how-to/README.md +7 -2
- package/src/docs/versioned/next/how-to/audit-log.md +22 -3
- package/src/docs/versioned/next/how-to/automate-terreno-upgrades.md +169 -0
- package/src/docs/versioned/next/how-to/build-list-detail-screens.md +160 -0
- package/src/docs/versioned/next/how-to/circleci.md +15 -5
- package/src/docs/versioned/next/how-to/configure-better-auth.md +673 -53
- package/src/docs/versioned/next/how-to/create-a-terreno-app.md +8 -5
- package/src/docs/versioned/next/how-to/debug-with-mcp.md +393 -23
- package/src/docs/versioned/next/how-to/enable-mcp-oauth.md +54 -3
- package/src/docs/versioned/next/how-to/migrate-rtk-to-syncdb.md +9 -0
- package/src/docs/versioned/next/how-to/password-reset.md +1 -1
- package/src/docs/versioned/next/how-to/recover-locked-out-user.md +112 -0
- package/src/docs/versioned/next/how-to/run-tests-locally.md +37 -8
- package/src/docs/versioned/next/how-to/set-up-social-login.md +424 -0
- package/src/docs/versioned/next/how-to/set-up-terreno-mcp.md +241 -36
- package/src/docs/versioned/next/how-to/sign-consent-on-behalf.md +139 -0
- package/src/docs/versioned/next/how-to/upgrade-terreno.md +4 -0
- package/src/docs/versioned/next/implementationPlans/ai-dev-loop-boost.md +47 -32
- package/src/docs/versioned/next/implementationPlans/auth-experience.md +952 -0
- package/src/docs/versioned/next/implementationPlans/consent-forms.md +8 -0
- package/src/docs/versioned/next/implementationPlans/list-detail-layout.md +297 -0
- package/src/docs/versioned/next/implementationPlans/login-redesign/HANDOFF.md +211 -0
- package/src/docs/versioned/next/implementationPlans/login-redesign/boards/AnotherWay.html +121 -0
- package/src/docs/versioned/next/implementationPlans/login-redesign/boards/BackupCode.html +72 -0
- package/src/docs/versioned/next/implementationPlans/login-redesign/boards/Cancelled.html +87 -0
- package/src/docs/versioned/next/implementationPlans/login-redesign/boards/ContinueEmail.html +64 -0
- package/src/docs/versioned/next/implementationPlans/login-redesign/boards/FirstVisit.html +81 -0
- package/src/docs/versioned/next/implementationPlans/login-redesign/boards/Main.html +88 -0
- package/src/docs/versioned/next/implementationPlans/login-redesign/boards/ManageAccounts.html +77 -0
- package/src/docs/versioned/next/implementationPlans/login-redesign/boards/NotLinked.html +92 -0
- package/src/docs/versioned/next/implementationPlans/login-redesign/boards/SigningIn.html +60 -0
- package/src/docs/versioned/next/implementationPlans/login-redesign/boards/TwoFactor.html +76 -0
- package/src/docs/versioned/next/implementationPlans/login-redesign/boards/TwoFactorError.html +81 -0
- package/src/docs/versioned/next/implementationPlans/login-redesign/boards/WrongPassword.html +69 -0
- package/src/docs/versioned/next/implementationPlans/mcp-boost-parity.md +1 -1
- package/src/docs/versioned/next/plans/2026-10-23-provisional-consent.md +297 -0
- package/src/docs/versioned/next/plans/2026-10-29-fix-mcp-oauth-native-and-machine.md +68 -0
- package/src/docs/versioned/next/reference/README.md +1 -0
- package/src/docs/versioned/next/reference/account-security.md +700 -0
- package/src/docs/versioned/next/reference/admin-backend.md +3 -1
- package/src/docs/versioned/next/reference/admin-frontend.md +225 -1
- package/src/docs/versioned/next/reference/api.md +461 -35
- package/src/docs/versioned/next/reference/cli.md +1 -1
- package/src/docs/versioned/next/reference/comms.md +8 -0
- package/src/docs/versioned/next/reference/create-terreno-app.md +3 -1
- package/src/docs/versioned/next/reference/environment-variables.md +9 -3
- package/src/docs/versioned/next/reference/legacy/rtk.md +19 -3
- package/src/docs/versioned/next/reference/lifecycle-plugin.md +6 -0
- package/src/docs/versioned/next/reference/mcp-server.md +1158 -441
- package/src/docs/versioned/next/reference/syncdb.md +8 -1
- package/src/docs/versioned/next/reference/ui.md +1271 -27
- package/src/docs/versioned/next/tasks/ai-dev-loop-boost.md +28 -16
- package/src/docs/versioned/next/tutorials/README.md +4 -0
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
# Build a list/detail screen
|
|
2
|
+
|
|
3
|
+
Put the list and its detail route in one route group, and make `ListDetailLayout` the group's
|
|
4
|
+
layout. On a phone the list pushes the detail. On a tablet or a wide browser the list stays in a
|
|
5
|
+
left pane and the detail opens beside it. The URL always names the open item.
|
|
6
|
+
|
|
7
|
+
```text
|
|
8
|
+
app/mail/
|
|
9
|
+
_layout.tsx ListDetailLayout
|
|
10
|
+
index.tsx ListDetailIndex
|
|
11
|
+
[id].tsx the detail screen
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
```tsx
|
|
15
|
+
// app/mail/_layout.tsx
|
|
16
|
+
import {ListDetailLayout, Text} from "@terreno/ui";
|
|
17
|
+
import type React from "react";
|
|
18
|
+
|
|
19
|
+
import {MailList} from "@/components/MailList";
|
|
20
|
+
|
|
21
|
+
// A deep link to /mail/3 on a phone still has the list to go back to.
|
|
22
|
+
export const unstable_settings = {initialRouteName: "index"};
|
|
23
|
+
|
|
24
|
+
const MailLayout: React.FC = () => (
|
|
25
|
+
<ListDetailLayout
|
|
26
|
+
detailHref={(id) => `/mail/${id}`}
|
|
27
|
+
emptyDetail={<Text>Select a message</Text>}
|
|
28
|
+
indexHref="/mail"
|
|
29
|
+
list={<MailList />}
|
|
30
|
+
screenOptions={{title: "Inbox"}}
|
|
31
|
+
/>
|
|
32
|
+
);
|
|
33
|
+
export default MailLayout;
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
```tsx
|
|
37
|
+
// app/mail/index.tsx
|
|
38
|
+
import {ListDetailIndex} from "@terreno/ui";
|
|
39
|
+
import type React from "react";
|
|
40
|
+
|
|
41
|
+
const MailIndex: React.FC = () => <ListDetailIndex />;
|
|
42
|
+
export default MailIndex;
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
```tsx
|
|
46
|
+
// app/mail/[id].tsx
|
|
47
|
+
import {Page, Text} from "@terreno/ui";
|
|
48
|
+
import {useLocalSearchParams} from "expo-router";
|
|
49
|
+
import type React from "react";
|
|
50
|
+
|
|
51
|
+
const MailMessage: React.FC = () => {
|
|
52
|
+
const {id} = useLocalSearchParams<{id: string}>();
|
|
53
|
+
return (
|
|
54
|
+
<Page>
|
|
55
|
+
<Text>Message {id}</Text>
|
|
56
|
+
</Page>
|
|
57
|
+
);
|
|
58
|
+
};
|
|
59
|
+
export default MailMessage;
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Select rows from the list
|
|
63
|
+
|
|
64
|
+
Read the open item and open others with `useListDetail()`. Mark the open row as selected so
|
|
65
|
+
screen readers announce it. On web a clickable `Box` row sends this as `aria-current="true"`.
|
|
66
|
+
|
|
67
|
+
```tsx
|
|
68
|
+
import {Box, Text, useListDetail} from "@terreno/ui";
|
|
69
|
+
import type React from "react";
|
|
70
|
+
|
|
71
|
+
export const MailRow: React.FC<{id: string; subject: string}> = ({id, subject}) => {
|
|
72
|
+
const {select, selectedId} = useListDetail();
|
|
73
|
+
const isSelected = id === selectedId;
|
|
74
|
+
return (
|
|
75
|
+
<Box
|
|
76
|
+
accessibilityHint="Opens the message"
|
|
77
|
+
accessibilityLabel={subject}
|
|
78
|
+
accessibilityState={{selected: isSelected}}
|
|
79
|
+
color={isSelected ? "primary" : "base"}
|
|
80
|
+
onClick={() => select(id)}
|
|
81
|
+
padding={3}
|
|
82
|
+
testID={`mail-row-${id}`}
|
|
83
|
+
>
|
|
84
|
+
<Text color={isSelected ? "inverted" : "primary"}>{subject}</Text>
|
|
85
|
+
</Box>
|
|
86
|
+
);
|
|
87
|
+
};
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
| Call | Stacked (phone) | Split (tablet, wide web) |
|
|
91
|
+
| --- | --- | --- |
|
|
92
|
+
| `select(id)`, nothing open | Pushes `detailHref(id)` | Pushes `detailHref(id)` |
|
|
93
|
+
| `select(id)`, another item open | Pushes `detailHref(id)` | Replaces the open detail |
|
|
94
|
+
| `select(selectedId)` | Pushes again | Does nothing |
|
|
95
|
+
| `clear()` | `router.dismissTo(indexHref)`: pops back to the list inside this group | Same |
|
|
96
|
+
| `clear()`, nothing open | Does nothing | Does nothing |
|
|
97
|
+
|
|
98
|
+
Because split mode replaces the open detail, the stack is never deeper than the list plus one
|
|
99
|
+
detail, so back returns to the list after a rotation too. When split, the header's back button
|
|
100
|
+
(`list-detail-leave`) leaves the whole group instead, since the list is already on screen.
|
|
101
|
+
|
|
102
|
+
When another screen opens a detail directly, push it with `withAnchor` so the list sits below it
|
|
103
|
+
and back lands on the list instead of leaving the group:
|
|
104
|
+
|
|
105
|
+
```tsx
|
|
106
|
+
router.push("/mail/3", {withAnchor: true});
|
|
107
|
+
<Link href="/mail/3" withAnchor>Open message</Link>
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
`selectedId` is the `paramName` param (default `id`) of the route directly below `indexHref`
|
|
111
|
+
whose segment is `detailRoute` (default `[id]`). An `id` from a parent dynamic segment, such as
|
|
112
|
+
`/orgs/[id]/mail`, never counts.
|
|
113
|
+
|
|
114
|
+
## Publish the detail URL
|
|
115
|
+
|
|
116
|
+
A static web export (`web.output: "static"`) writes an HTML file only for paths
|
|
117
|
+
`generateStaticParams` returns. Without it, opening `/mail/3` directly is a 404 on a host that
|
|
118
|
+
does not rewrite unknown paths.
|
|
119
|
+
|
|
120
|
+
```tsx
|
|
121
|
+
// app/mail/[id].tsx
|
|
122
|
+
export const generateStaticParams = (): {id: string}[] =>
|
|
123
|
+
messages.map((message) => ({id: message.id}));
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Ids that are not known at build time need the host fallback from
|
|
127
|
+
[Build for web](build-for-web.md): Netlify `_redirects` with `/* /index.html 200`, or the Vercel
|
|
128
|
+
rewrite in [Deploy to Vercel](deploy-to-vercel.md). The demo inbox exports one page per fixture
|
|
129
|
+
message at `/demo/list-detail/:id` and `/demo/sidebar-navigation/mail/:id`. The Netlify demo
|
|
130
|
+
deploy also writes that fallback, so an id outside the fixtures still opens the missing-message
|
|
131
|
+
screen.
|
|
132
|
+
|
|
133
|
+
## Keep list state across the breakpoint
|
|
134
|
+
|
|
135
|
+
The open item survives a rotation or a browser resize. The `list` element does not: it moves
|
|
136
|
+
between the index screen and the left pane, so it remounts. Keep filters, search text, and other
|
|
137
|
+
list state in the route (`router.setParams`) or a store.
|
|
138
|
+
|
|
139
|
+
## Nest it inside a sidebar
|
|
140
|
+
|
|
141
|
+
`ListDetailLayout` measures its own width, so it splits correctly inside `SidebarNavigation` or
|
|
142
|
+
an admin rail. Make the group a screen of the sidebar navigator:
|
|
143
|
+
|
|
144
|
+
```text
|
|
145
|
+
app/workspace/
|
|
146
|
+
_layout.tsx SidebarNavigation with <SidebarNavigation.Screen name="mail" />
|
|
147
|
+
mail/_layout.tsx ListDetailLayout with indexHref="/workspace/mail"
|
|
148
|
+
mail/index.tsx
|
|
149
|
+
mail/[id].tsx
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## Choose SplitPage instead
|
|
153
|
+
|
|
154
|
+
Use `SplitPage` when the list and detail do not have their own routes, such as a picker inside a
|
|
155
|
+
modal. `SplitPage` keeps the selection in component state, so it has no URL, deep links, or back
|
|
156
|
+
navigation for the open item.
|
|
157
|
+
|
|
158
|
+
## Reference
|
|
159
|
+
|
|
160
|
+
Props, defaults, and testIDs: [`ListDetailLayout`](../reference/ui.md#listdetaillayout).
|
|
@@ -106,7 +106,9 @@ when the package imports them. Coverage-script unit tests run in the cheap
|
|
|
106
106
|
Playwright runs five shards after `e2e-prepare` (`auth`, `app`, `admin-core`,
|
|
107
107
|
`admin-table`, `syncdb`) instead of one container per spec file. Each shard
|
|
108
108
|
first checks the [affected gate](#e2e-affected-gate) and halts when no changed
|
|
109
|
-
file can reach it.
|
|
109
|
+
file can reach it. The cross-site bearer specs run beside them in `e2e-cross-site`,
|
|
110
|
+
which builds its own web bundle and backend (`playwright.config.ts` with
|
|
111
|
+
`E2E_CROSS_SITE_BEARER=true`), has no affected gate, and is not a required check. Repository
|
|
110
112
|
policy checks share one `repo-policies` job so eight small checkouts do not
|
|
111
113
|
sit in the concurrency queue. `repo-policies` uses Node 22.14 because Knip's
|
|
112
114
|
oxc-parser throws `ERR_REQUIRE_ESM` on the shared 22.11 executor.
|
|
@@ -316,6 +318,7 @@ the same commands through the parameterized `packages-ci` job, gated by
|
|
|
316
318
|
| Admin SPA Build and E2E | `admin-spa-ci` |
|
|
317
319
|
| Lint, compile, and coverage (matrix package) | `packages-ci` (`admin-backend`, `admin-frontend`, `api-health`, `feature-flags`, `test`) |
|
|
318
320
|
| E2E · `<shard>` | `e2e` (matrix `shard`: `auth`, `app`, `admin-core`, `admin-table`, `syncdb`) |
|
|
321
|
+
| _(cross-site bearer specs, not required)_ | `e2e-cross-site` (after `e2e-prepare`; also the explicit-linking pass) |
|
|
319
322
|
| E2E Load · syncdb-loadlab | `e2e-load` (trigger-gated, see below) |
|
|
320
323
|
| Admin SPA Backend Integration E2E | `admin-spa-integration` |
|
|
321
324
|
| _(e2e compile+export once)_ | `e2e-prepare` |
|
|
@@ -368,10 +371,17 @@ To teach the agent from what reviewers actually say, run
|
|
|
368
371
|
<file>` of pasted comments): it opens one PR editing `docs/approval-rubric.md` and the
|
|
369
372
|
path rules from the review comments since the last pass.
|
|
370
373
|
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
374
|
+
Levels and human approvals (defined in `docs/approval-rubric.md`):
|
|
375
|
+
|
|
376
|
+
| Level | Human approvals | Examples |
|
|
377
|
+
| --- | --- | --- |
|
|
378
|
+
| low | None once automated review and security checks are green | docs, copy, internal-only features, additive changes behind a flag |
|
|
379
|
+
| medium | One person | ordinary product changes, and sensitive areas such as caching, app updates, and AI system prompts |
|
|
380
|
+
| high | One person | security-related code: auth, permissions, secrets, crypto, PHI handling |
|
|
381
|
+
|
|
382
|
+
`approveLevels` is `["low"]`, so the App's approval satisfies master's one-review rule
|
|
383
|
+
for low PRs. Medium and high PRs get a `COMMENT` review that says the risk level and
|
|
384
|
+
why, and a human approves. The prompts and answers behind each
|
|
375
385
|
verdict are stored as the `brewery-approve` job artifact. Full reference:
|
|
376
386
|
[brewery `docs/approve.md`](https://github.com/joshgachnang/brewery/blob/master/docs/approve.md).
|
|
377
387
|
|