@maestro-js/agent-skills 1.0.0-alpha.22 → 1.0.0-alpha.3

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 (27) hide show
  1. package/dist/bin.js +9 -5
  2. package/package.json +1 -1
  3. package/skills/maestro-examples/references/cadence/cadence-web/app/components/date-range.tsx +26 -3
  4. package/skills/maestro-examples/references/cadence/cadence-web/app/features/request-context.server.ts +1 -1
  5. package/skills/maestro-examples/references/cadence/cadence-web/app/routes/auth.reset-password.tsx +14 -1
  6. package/skills/maestro-examples/references/cadence/cadence-web/package.json +6 -6
  7. package/skills/maestro-examples/references/cadence/package.json +4 -4
  8. package/skills/maestro-examples/references/cadence/packages/schemas/package.json +1 -1
  9. package/skills/maestro-examples/references/cadence/packages/services/package.json +19 -19
  10. package/skills/maestro-examples/references/cadence/packages/services/src/auth/auth-use-cases.ts +5 -4
  11. package/skills/maestro-examples/references/cadence/specs/multi-tenant-security.md +1 -1
  12. package/skills/maestro-examples/references/chorus/chorus-web/app/features/request-context.server.ts +2 -2
  13. package/skills/maestro-examples/references/chorus/chorus-web/package.json +6 -6
  14. package/skills/maestro-examples/references/chorus/infrastructure/package.json +2 -2
  15. package/skills/maestro-examples/references/chorus/package.json +4 -4
  16. package/skills/maestro-examples/references/chorus/packages/schemas/package.json +1 -1
  17. package/skills/maestro-examples/references/chorus/packages/services/package.json +21 -21
  18. package/skills/maestro-examples/references/chorus/packages/services/src/auth/auth-use-cases.ts +2 -2
  19. package/skills/maestro-examples/references/chorus/packages/services/src/auth/password-reset-token-db-provider.ts +2 -1
  20. package/skills/maestro-examples/references/chorus/packages/services/src/maestro.ts +1 -3
  21. package/skills/maestro-examples/references/setlist/infrastructure/package.json +2 -2
  22. package/skills/maestro-examples/references/setlist/package.json +4 -4
  23. package/skills/maestro-examples/references/setlist/packages/schemas/package.json +1 -1
  24. package/skills/maestro-examples/references/setlist/packages/services/package.json +15 -15
  25. package/skills/maestro-examples/references/setlist/queue-processor/package.json +2 -2
  26. package/skills/maestro-examples/references/setlist/setlist-web/app/features/request-context.server.ts +1 -1
  27. package/skills/maestro-examples/references/setlist/setlist-web/package.json +3 -3
package/dist/bin.js CHANGED
@@ -1,8 +1,9 @@
1
1
  #!/usr/bin/env node
2
+ #!/usr/bin/env node
2
3
 
3
4
  // src/bin.ts
4
5
  import path from "path";
5
- import { spawnSync } from "child_process";
6
+ import { execSync } from "child_process";
6
7
  import { parseArgs } from "util";
7
8
  var { values } = parseArgs({
8
9
  options: {
@@ -12,8 +13,11 @@ var { values } = parseArgs({
12
13
  strict: false
13
14
  });
14
15
  var skillsPath = path.resolve(import.meta.dirname, "..");
15
- var args = ["skills", "add", skillsPath, "-a", "claude-code"];
16
- if (!values.interactive) args.push("-s", "*", "-y");
16
+ var args = ["npx", "skills", "add", skillsPath];
17
+ if (!values.interactive) args.push("--all");
17
18
  if (values.copy) args.push("--copy");
18
- var result = spawnSync("npx", args, { stdio: "inherit" });
19
- if (result.status !== 0) process.exit(1);
19
+ try {
20
+ execSync(args.join(" "), { stdio: "inherit" });
21
+ } catch {
22
+ process.exit(1);
23
+ }
package/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "devDependencies": {
12
12
  "@types/node": "^22.19.11"
13
13
  },
14
- "version": "1.0.0-alpha.22",
14
+ "version": "1.0.0-alpha.3",
15
15
  "publishConfig": {
16
16
  "access": "restricted"
17
17
  },
@@ -16,7 +16,6 @@ import {
16
16
  import { twMerge } from 'tailwind-merge'
17
17
  import { parseDate, type CalendarDate, type DateValue } from '@internationalized/date'
18
18
  import type { Iso } from 'iso-fns'
19
- import { Icon } from './icon'
20
19
 
21
20
  export type DateRangeRootAdditionalProps = {
22
21
  defaultStart: Iso.Date | null
@@ -78,11 +77,11 @@ export function DateRangePicker(props: DateRangePickerProps) {
78
77
  >
79
78
  <header className="flex items-center justify-between mb-2 px-1">
80
79
  <Button slot="previous" className="p-1 hover:bg-neutral-100 rounded cursor-pointer">
81
- <Icon name="chevron-left" />
80
+ <ChevronLeft />
82
81
  </Button>
83
82
  <Heading className="text-sm font-semibold text-neutral-900 flex-1 text-center" />
84
83
  <Button slot="next" className="p-1 hover:bg-neutral-100 rounded cursor-pointer">
85
- <Icon name="chevron-right" />
84
+ <ChevronRight />
86
85
  </Button>
87
86
  </header>
88
87
  <div className="flex gap-4">
@@ -139,3 +138,27 @@ export function DateRangePicker(props: DateRangePickerProps) {
139
138
  </I18nProvider>
140
139
  )
141
140
  }
141
+
142
+ function ChevronLeft() {
143
+ return (
144
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" className="w-4 h-4">
145
+ <path
146
+ fillRule="evenodd"
147
+ d="M11.78 5.22a.75.75 0 0 1 0 1.06L8.06 10l3.72 3.72a.75.75 0 1 1-1.06 1.06l-4.25-4.25a.75.75 0 0 1 0-1.06l4.25-4.25a.75.75 0 0 1 1.06 0Z"
148
+ clipRule="evenodd"
149
+ />
150
+ </svg>
151
+ )
152
+ }
153
+
154
+ function ChevronRight() {
155
+ return (
156
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" className="w-4 h-4">
157
+ <path
158
+ fillRule="evenodd"
159
+ d="M8.22 5.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.75.75 0 1 1-1.06-1.06L11.94 10 8.22 6.28a.75.75 0 0 1 0-1.06Z"
160
+ clipRule="evenodd"
161
+ />
162
+ </svg>
163
+ )
164
+ }
@@ -17,7 +17,7 @@ export const requestContextMiddleware: MiddlewareFunction<Response> = async ({ r
17
17
  const requestId = randomUUID()
18
18
  const cookieHeader = request.headers.get('Cookie')
19
19
  const session = await Session.getSession(cookieHeader)
20
- const deviceContext = Helpers.getDeviceContext(request, 'none')
20
+ const deviceContext = Helpers.getDeviceContext(request)
21
21
  const authResult = await Auth.authenticate({ session, cookieHeader, deviceContext })
22
22
  const profile = authResult.id ? await AuthService.GetProfileByUserId({ userId: authResult.id }) : null
23
23
 
@@ -3,7 +3,7 @@ import type { LoaderFunctionArgs, ActionFunctionArgs } from 'react-router'
3
3
  import { z } from 'zod'
4
4
  import { getRequestContext } from '~/features/request-context.server'
5
5
  import { redirectWithToast } from '~/features/redirect-with-toast.server'
6
- import { AuthService, Log } from '~/services.server'
6
+ import { AuthService, Db, Log } from '~/services.server'
7
7
  import { Form } from '~/components/form'
8
8
  import { TextField } from '~/components/text-field'
9
9
  import { Button } from '~/components/button'
@@ -46,8 +46,21 @@ export async function action({ request, context }: ActionFunctionArgs) {
46
46
 
47
47
  const { token, newPassword } = parsed.data
48
48
 
49
+ // Extract selector from token to look up authenticatableId
50
+ const [selector] = token.split('|')
51
+ if (!selector) {
52
+ return Form.customValidationError({ message: 'Invalid reset token.', formData })
53
+ }
54
+
55
+ const rows = await Db.select('SELECT userId FROM passwordResetTokens WHERE selector = ?', [selector])
56
+ const row = rows[0] as { userId: number } | undefined
57
+ if (!row) {
58
+ return Form.customValidationError({ message: 'Invalid or expired reset token.', formData })
59
+ }
60
+
49
61
  try {
50
62
  await AuthService.ResetPassword({
63
+ authenticatableId: row.userId,
51
64
  token,
52
65
  newPassword
53
66
  })
@@ -14,10 +14,10 @@
14
14
  "@cadence/schemas": "workspace:*",
15
15
  "@cadence/services": "workspace:*",
16
16
  "@internationalized/date": "^3.11.0",
17
- "@maestro-js/custom-errors": "^1.0.0-alpha.22",
18
- "@maestro-js/log": "^1.0.0-alpha.22",
19
- "@maestro-js/form": "^1.0.0-alpha.22",
20
- "@maestro-js/permissions": "^1.0.0-alpha.22",
17
+ "@maestro-js/custom-errors": "^1.0.0-alpha.3",
18
+ "@maestro-js/log": "^1.0.0-alpha.3",
19
+ "@maestro-js/form": "^1.0.0-alpha.3",
20
+ "@maestro-js/permissions": "^1.0.0-alpha.3",
21
21
  "@react-aria/interactions": "^3.27.0",
22
22
  "@react-aria/utils": "^3.33.0",
23
23
  "@react-router/node": "^7.9.0",
@@ -41,8 +41,8 @@
41
41
  "zod": "^4.0.0"
42
42
  },
43
43
  "devDependencies": {
44
- "@maestro-js/cli": "^1.0.0-alpha.22",
45
- "@maestro-js/react-router-file-routes": "^1.0.0-alpha.22",
44
+ "@maestro-js/cli": "^1.0.0-alpha.3",
45
+ "@maestro-js/react-router-file-routes": "^1.0.0-alpha.3",
46
46
  "@playwright/test": "^1.52.0",
47
47
  "@react-router/dev": "^7.9.0",
48
48
  "@tailwindcss/typography": "^0.5.19",
@@ -6,12 +6,12 @@
6
6
  "fks-restrict": "maestro config:run --config services -- node ./scripts/foreign-key-delete-behavior.ts restrict"
7
7
  },
8
8
  "dependencies": {
9
- "@maestro-js/config": "^1.0.0-alpha.22"
9
+ "@maestro-js/config": "^1.0.0-alpha.3"
10
10
  },
11
11
  "devDependencies": {
12
- "@maestro-js/cli": "^1.0.0-alpha.22",
13
- "@maestro-js/db-migrate": "^1.0.0-alpha.22",
14
- "@maestro-js/db": "^1.0.0-alpha.22",
12
+ "@maestro-js/cli": "^1.0.0-alpha.3",
13
+ "@maestro-js/db-migrate": "^1.0.0-alpha.3",
14
+ "@maestro-js/db": "^1.0.0-alpha.3",
15
15
  "@types/node": "^22.19.11"
16
16
  }
17
17
  }
@@ -11,7 +11,7 @@
11
11
  "dependencies": {
12
12
  "iso-fns": "npm:iso-fns@2.0.0-alpha.26",
13
13
  "zod": "^4.3.0",
14
- "@maestro-js/iso-zod": "^1.0.0-alpha.22"
14
+ "@maestro-js/iso-zod": "^1.0.0-alpha.3"
15
15
  },
16
16
  "devDependencies": {}
17
17
  }
@@ -12,30 +12,30 @@
12
12
  "dependencies": {
13
13
  "@aws-sdk/client-ses": "^3.1004.0",
14
14
  "@cadence/schemas": "workspace:*",
15
- "@maestro-js/auth": "^1.0.0-alpha.22",
16
- "@maestro-js/cache": "^1.0.0-alpha.22",
17
- "@maestro-js/config": "^1.0.0-alpha.22",
18
- "@maestro-js/crypt": "^1.0.0-alpha.22",
19
- "@maestro-js/custom-errors": "^1.0.0-alpha.22",
20
- "@maestro-js/db": "^1.0.0-alpha.22",
21
- "@maestro-js/exceptions": "^1.0.0-alpha.22",
22
- "@maestro-js/hash": "^1.0.0-alpha.22",
23
- "@maestro-js/helpers": "^1.0.0-alpha.22",
24
- "@maestro-js/iso-zod": "^1.0.0-alpha.22",
25
- "@maestro-js/log": "^1.0.0-alpha.22",
26
- "@maestro-js/mail": "^1.0.0-alpha.22",
27
- "@maestro-js/password": "^1.0.0-alpha.22",
28
- "@maestro-js/permissions": "^1.0.0-alpha.22",
29
- "@maestro-js/queue": "^1.0.0-alpha.22",
30
- "@maestro-js/rate-limiting": "^1.0.0-alpha.22",
31
- "@maestro-js/recurring-jobs": "^1.0.0-alpha.22",
32
- "@maestro-js/session": "^1.0.0-alpha.22",
15
+ "@maestro-js/auth": "^1.0.0-alpha.3",
16
+ "@maestro-js/cache": "^1.0.0-alpha.3",
17
+ "@maestro-js/config": "^1.0.0-alpha.3",
18
+ "@maestro-js/crypt": "^1.0.0-alpha.3",
19
+ "@maestro-js/custom-errors": "^1.0.0-alpha.3",
20
+ "@maestro-js/db": "^1.0.0-alpha.3",
21
+ "@maestro-js/exceptions": "^1.0.0-alpha.3",
22
+ "@maestro-js/hash": "^1.0.0-alpha.3",
23
+ "@maestro-js/helpers": "^1.0.0-alpha.3",
24
+ "@maestro-js/iso-zod": "^1.0.0-alpha.3",
25
+ "@maestro-js/log": "^1.0.0-alpha.3",
26
+ "@maestro-js/mail": "^1.0.0-alpha.3",
27
+ "@maestro-js/password": "^1.0.0-alpha.3",
28
+ "@maestro-js/permissions": "^1.0.0-alpha.3",
29
+ "@maestro-js/queue": "^1.0.0-alpha.3",
30
+ "@maestro-js/rate-limiting": "^1.0.0-alpha.3",
31
+ "@maestro-js/recurring-jobs": "^1.0.0-alpha.3",
32
+ "@maestro-js/session": "^1.0.0-alpha.3",
33
33
  "iso-fns": "npm:iso-fns@2.0.0-alpha.26",
34
34
  "sanitize-html": "^2.17.2",
35
35
  "zod": "^4.3.0"
36
36
  },
37
37
  "devDependencies": {
38
- "@maestro-js/cli": "^1.0.0-alpha.22",
38
+ "@maestro-js/cli": "^1.0.0-alpha.3",
39
39
  "@types/node": "^22.0.0",
40
40
  "@types/sanitize-html": "^2.16.1",
41
41
  "beartest-js": "^8.0.2"
@@ -122,7 +122,7 @@ export const RequestPasswordReset = z
122
122
  await RateLimiting.increment(throttleKey, 1, REQUEST_RESET_THROTTLE_SECONDS)
123
123
  }
124
124
 
125
- const token = await Password.createPasswordResetToken(user.id, { expirationMinutes: 60 })
125
+ const token = await Password.createPasswordResetToken(user.id)
126
126
 
127
127
  await Mail.send({
128
128
  to: email,
@@ -141,15 +141,16 @@ export const ResetPassword = z
141
141
  .function({
142
142
  input: [
143
143
  z.object({
144
+ authenticatableId: z.number(),
144
145
  token: z.string(),
145
146
  newPassword: z.string().min(8)
146
147
  })
147
148
  ]
148
149
  })
149
- .implement(async ({ token, newPassword }) => {
150
- await Password.resetPassword({ token, newPassword })
150
+ .implement(async ({ authenticatableId, token, newPassword }) => {
151
+ await Password.resetPassword({ authenticatableId, token, newPassword })
151
152
 
152
153
  // credentialsInvalidBefore is set by Password.resetPassword() internally,
153
154
  // which invalidates all existing sessions
154
- log.info('Password reset completed', { action: 'auth.resetPassword' })
155
+ log.info('Password reset completed', { action: 'auth.resetPassword', userId: authenticatableId })
155
156
  })
@@ -215,7 +215,7 @@ const deleteInteraction = z.function(
215
215
  3. `Password.createPasswordResetToken(userId)` generates a selector-verifier token pair, hashes the verifier, and stores the record
216
216
  4. The token is sent to the user's email (via `@maestro-js/mail`)
217
217
  5. User clicks the link and submits a new password
218
- 6. `Password.resetPassword({ token, newPassword })` validates the token, updates the hash, and sets `credentialsInvalidBefore` to now — invalidating all existing sessions
218
+ 6. `Password.resetPassword({ authenticatableId, token, newPassword })` validates the token, updates the hash, and sets `credentialsInvalidBefore` to now — invalidating all existing sessions
219
219
 
220
220
  Built-in protections:
221
221
  - **Throttling** — A new reset token cannot be generated within 60 seconds of the previous one
@@ -17,8 +17,8 @@ export const requestContextMiddleware: MiddlewareFunction<Response> = async ({ r
17
17
  const requestId = randomUUID()
18
18
  const cookieHeader = request.headers.get('Cookie')
19
19
  const session = await Session.getSession(cookieHeader)
20
- const deviceContext = Helpers.getDeviceContext(request, 'none')
21
- const authResult = await Auth.authenticate({ session, cookieHeader, deviceContext })
20
+ const deviceContext = Helpers.getDeviceContext(request)
21
+ const authResult = await Auth.authenticate({ session, cookieHeader, deviceContext: Helpers.getDeviceContext(request) })
22
22
  const profile = authResult.id ? await AuthService.GetProfileById({ profileId: authResult.id }) : null
23
23
 
24
24
  context.set(requestContext, { profile, requestId, session, deviceContext })
@@ -13,9 +13,9 @@
13
13
  "dependencies": {
14
14
  "@bundled-es-modules/pdfjs-dist": "3.6.172-alpha.1",
15
15
  "@internationalized/date": "^3.11.0",
16
- "@maestro-js/form": "^1.0.0-alpha.22",
17
- "@maestro-js/permissions": "^1.0.0-alpha.22",
18
- "@maestro-js/custom-errors": "^1.0.0-alpha.22",
16
+ "@maestro-js/form": "^1.0.0-alpha.3",
17
+ "@maestro-js/permissions": "^1.0.0-alpha.3",
18
+ "@maestro-js/custom-errors": "^1.0.0-alpha.3",
19
19
  "@react-aria/interactions": "^3.27.0",
20
20
  "@react-aria/utils": "^3.33.0",
21
21
  "@react-router/node": "^7.9.0",
@@ -28,7 +28,7 @@
28
28
  "react": "^19.0.0",
29
29
  "react-aria-components": "^1.15.1",
30
30
  "react-dom": "^19.0.0",
31
- "react-pdf-hook": "^1.0.4",
31
+ "react-pdf-hook": "^1.0.3",
32
32
  "react-router": "^7.9.0",
33
33
  "tailwind-merge": "^3.5.0",
34
34
  "vaul": "^1.1.2",
@@ -36,8 +36,8 @@
36
36
  "@sentry/react-router": "^9"
37
37
  },
38
38
  "devDependencies": {
39
- "@maestro-js/cli": "^1.0.0-alpha.22",
40
- "@maestro-js/react-router-file-routes": "^1.0.0-alpha.22",
39
+ "@maestro-js/cli": "^1.0.0-alpha.3",
40
+ "@maestro-js/react-router-file-routes": "^1.0.0-alpha.3",
41
41
  "@playwright/test": "^1.58.2",
42
42
  "@react-router/dev": "^7.9.0",
43
43
  "@tailwindcss/vite": "^4.2.0",
@@ -10,8 +10,8 @@
10
10
  "aws-whoami": "aws sts get-caller-identity"
11
11
  },
12
12
  "dependencies": {
13
- "@maestro-js/aws-cdk-recipes": "^1.0.0-alpha.22",
14
- "@maestro-js/db-migrate": "^1.0.0-alpha.22",
13
+ "@maestro-js/aws-cdk-recipes": "^1.0.0-alpha.3",
14
+ "@maestro-js/db-migrate": "^1.0.0-alpha.3",
15
15
  "aws-cdk": "^2.1106.1",
16
16
  "aws-cdk-lib": "^2.178.0",
17
17
  "constructs": "^10.4.2",
@@ -6,12 +6,12 @@
6
6
  "fks-restrict": "maestro config:run --config services -- node ./scripts/foreign-key-delete-behavior.ts restrict"
7
7
  },
8
8
  "dependencies": {
9
- "@maestro-js/config": "^1.0.0-alpha.22"
9
+ "@maestro-js/config": "^1.0.0-alpha.3"
10
10
  },
11
11
  "devDependencies": {
12
- "@maestro-js/cli": "^1.0.0-alpha.22",
13
- "@maestro-js/db-migrate": "^1.0.0-alpha.22",
14
- "@maestro-js/db": "^1.0.0-alpha.22",
12
+ "@maestro-js/cli": "^1.0.0-alpha.3",
13
+ "@maestro-js/db-migrate": "^1.0.0-alpha.3",
14
+ "@maestro-js/db": "^1.0.0-alpha.3",
15
15
  "@types/node": "^22.19.11"
16
16
  }
17
17
  }
@@ -11,7 +11,7 @@
11
11
  "dependencies": {
12
12
  "iso-fns": "npm:iso-fns@2.0.0-alpha.26",
13
13
  "zod": "^4.3.0",
14
- "@maestro-js/iso-zod": "^1.0.0-alpha.22"
14
+ "@maestro-js/iso-zod": "^1.0.0-alpha.3"
15
15
  },
16
16
  "devDependencies": {}
17
17
  }
@@ -14,33 +14,33 @@
14
14
  "@aws-sdk/client-ses": "^3.1004.0",
15
15
  "@dicebear/collection": "^9.4.0",
16
16
  "@dicebear/core": "^9.4.0",
17
- "@maestro-js/auth": "^1.0.0-alpha.22",
18
- "@maestro-js/cache": "^1.0.0-alpha.22",
19
- "@maestro-js/config": "^1.0.0-alpha.22",
20
- "@maestro-js/crypt": "^1.0.0-alpha.22",
21
- "@maestro-js/custom-errors": "^1.0.0-alpha.22",
22
- "@maestro-js/db": "^1.0.0-alpha.22",
23
- "@maestro-js/exceptions": "^1.0.0-alpha.22",
24
- "@maestro-js/file-storage": "^1.0.0-alpha.22",
25
- "@maestro-js/hash": "^1.0.0-alpha.22",
26
- "@maestro-js/helpers": "^1.0.0-alpha.22",
27
- "@maestro-js/iso-zod": "^1.0.0-alpha.22",
28
- "@maestro-js/log": "^1.0.0-alpha.22",
29
- "@maestro-js/mail": "^1.0.0-alpha.22",
30
- "@maestro-js/password": "^1.0.0-alpha.22",
31
- "@maestro-js/permissions": "^1.0.0-alpha.22",
32
- "@maestro-js/queue": "^1.0.0-alpha.22",
33
- "@maestro-js/rate-limiting": "^1.0.0-alpha.22",
34
- "@maestro-js/recurring-jobs": "^1.0.0-alpha.22",
35
- "@maestro-js/session": "^1.0.0-alpha.22",
36
- "@maestro-js/signed-url": "^1.0.0-alpha.22",
17
+ "@maestro-js/auth": "^1.0.0-alpha.3",
18
+ "@maestro-js/cache": "^1.0.0-alpha.3",
19
+ "@maestro-js/config": "^1.0.0-alpha.3",
20
+ "@maestro-js/crypt": "^1.0.0-alpha.3",
21
+ "@maestro-js/custom-errors": "^1.0.0-alpha.3",
22
+ "@maestro-js/db": "^1.0.0-alpha.3",
23
+ "@maestro-js/exceptions": "^1.0.0-alpha.3",
24
+ "@maestro-js/file-storage": "^1.0.0-alpha.3",
25
+ "@maestro-js/hash": "^1.0.0-alpha.3",
26
+ "@maestro-js/helpers": "^1.0.0-alpha.3",
27
+ "@maestro-js/iso-zod": "^1.0.0-alpha.3",
28
+ "@maestro-js/log": "^1.0.0-alpha.3",
29
+ "@maestro-js/mail": "^1.0.0-alpha.3",
30
+ "@maestro-js/password": "^1.0.0-alpha.3",
31
+ "@maestro-js/permissions": "^1.0.0-alpha.3",
32
+ "@maestro-js/queue": "^1.0.0-alpha.3",
33
+ "@maestro-js/rate-limiting": "^1.0.0-alpha.3",
34
+ "@maestro-js/recurring-jobs": "^1.0.0-alpha.3",
35
+ "@maestro-js/session": "^1.0.0-alpha.3",
36
+ "@maestro-js/signed-url": "^1.0.0-alpha.3",
37
37
  "@chorus/email-templates": "workspace:*",
38
38
  "@chorus/schemas": "workspace:*",
39
39
  "iso-fns": "npm:iso-fns@2.0.0-alpha.26",
40
40
  "zod": "^4.3.0"
41
41
  },
42
42
  "devDependencies": {
43
- "@maestro-js/cli": "^1.0.0-alpha.22",
43
+ "@maestro-js/cli": "^1.0.0-alpha.3",
44
44
  "@types/node": "^22.0.0",
45
45
  "beartest-js": "^8.0.2"
46
46
  }
@@ -136,7 +136,7 @@ export const ForgotPassword = z
136
136
 
137
137
  if (!user) return
138
138
 
139
- const token = await Password.createPasswordResetToken(user.id, { expirationMinutes: 15 })
139
+ const token = await Password.createPasswordResetToken(user.id)
140
140
  const signedUrlSearchParams = await SignedUrl.signURL(
141
141
  new URLSearchParams({
142
142
  token,
@@ -173,6 +173,6 @@ export const ResetPassword = z
173
173
  ]
174
174
  })
175
175
  .implement(async ({ token, authenticatableId, newPassword, session, deviceContext }) => {
176
- await Password.resetPassword({ token, newPassword })
176
+ await Password.resetPassword({ authenticatableId, token, newPassword })
177
177
  return Auth.loginById({ id: authenticatableId, session, deviceContext })
178
178
  })
@@ -54,5 +54,6 @@ export const passwordResetTokenDbProvider = {
54
54
  create,
55
55
  getBySelector,
56
56
  getByAuthenticatableId,
57
- deleteByAuthenticatableId
57
+ deleteByAuthenticatableId,
58
+ tokenExpirationMinutes: 15
58
59
  }
@@ -70,9 +70,7 @@ Password.Provider.register(
70
70
  updatePasswordHash: authenticatableDbProvider.updatePasswordHash,
71
71
  updateCredentialsInvalidBefore: authenticatableDbProvider.updateCredentialsInvalidBefore,
72
72
  hash: Hash.provider('bcrypt'),
73
- passwordResetOptions: {
74
- ...passwordResetTokenDbProvider
75
- }
73
+ passwordResetOptions: passwordResetTokenDbProvider
76
74
  })
77
75
  )
78
76
 
@@ -10,8 +10,8 @@
10
10
  "aws-whoami": "aws sts get-caller-identity"
11
11
  },
12
12
  "dependencies": {
13
- "@maestro-js/aws-cdk-recipes": "^1.0.0-alpha.22",
14
- "@maestro-js/db-migrate": "^1.0.0-alpha.22",
13
+ "@maestro-js/aws-cdk-recipes": "^1.0.0-alpha.3",
14
+ "@maestro-js/db-migrate": "^1.0.0-alpha.3",
15
15
  "aws-cdk": "^2.1106.1",
16
16
  "aws-cdk-lib": "^2.178.0",
17
17
  "constructs": "^10.4.2",
@@ -6,13 +6,13 @@
6
6
  "fks-restrict": "maestro config:run --config services -- node ./scripts/foreign-key-delete-behavior.ts restrict"
7
7
  },
8
8
  "dependencies": {
9
- "@maestro-js/config": "^1.0.0-alpha.22",
9
+ "@maestro-js/config": "^1.0.0-alpha.3",
10
10
  "@setlist/services": "workspace:*"
11
11
  },
12
12
  "devDependencies": {
13
- "@maestro-js/cli": "^1.0.0-alpha.22",
14
- "@maestro-js/db-migrate": "^1.0.0-alpha.22",
15
- "@maestro-js/db": "^1.0.0-alpha.22",
13
+ "@maestro-js/cli": "^1.0.0-alpha.3",
14
+ "@maestro-js/db-migrate": "^1.0.0-alpha.3",
15
+ "@maestro-js/db": "^1.0.0-alpha.3",
16
16
  "@types/node": "^22.19.11",
17
17
  "tsx": "^4.21.0"
18
18
  }
@@ -12,7 +12,7 @@
12
12
  "dependencies": {
13
13
  "iso-fns": "npm:iso-fns@2.0.0-alpha.26",
14
14
  "zod": "^4.3.0",
15
- "@maestro-js/iso-zod": "^1.0.0-alpha.22"
15
+ "@maestro-js/iso-zod": "^1.0.0-alpha.3"
16
16
  },
17
17
  "devDependencies": {
18
18
  "tsup": "^8.0.2",
@@ -10,27 +10,27 @@
10
10
  "typecheck": "tsc --noEmit"
11
11
  },
12
12
  "dependencies": {
13
- "@maestro-js/auth": "^1.0.0-alpha.22",
14
- "@maestro-js/cache": "^1.0.0-alpha.22",
15
- "@maestro-js/crypt": "^1.0.0-alpha.22",
16
- "@maestro-js/custom-errors": "^1.0.0-alpha.22",
17
- "@maestro-js/db": "^1.0.0-alpha.22",
18
- "@maestro-js/iso-zod": "^1.0.0-alpha.22",
19
- "@maestro-js/hash": "^1.0.0-alpha.22",
20
- "@maestro-js/helpers": "^1.0.0-alpha.22",
21
- "@maestro-js/log": "^1.0.0-alpha.22",
22
- "@maestro-js/mail": "^1.0.0-alpha.22",
23
- "@maestro-js/queue": "^1.0.0-alpha.22",
24
- "@maestro-js/rate-limiting": "^1.0.0-alpha.22",
25
- "@maestro-js/recurring-jobs": "^1.0.0-alpha.22",
26
- "@maestro-js/session": "^1.0.0-alpha.22",
13
+ "@maestro-js/auth": "^1.0.0-alpha.3",
14
+ "@maestro-js/cache": "^1.0.0-alpha.3",
15
+ "@maestro-js/crypt": "^1.0.0-alpha.3",
16
+ "@maestro-js/custom-errors": "^1.0.0-alpha.3",
17
+ "@maestro-js/db": "^1.0.0-alpha.3",
18
+ "@maestro-js/iso-zod": "^1.0.0-alpha.3",
19
+ "@maestro-js/hash": "^1.0.0-alpha.3",
20
+ "@maestro-js/helpers": "^1.0.0-alpha.3",
21
+ "@maestro-js/log": "^1.0.0-alpha.3",
22
+ "@maestro-js/mail": "^1.0.0-alpha.3",
23
+ "@maestro-js/queue": "^1.0.0-alpha.3",
24
+ "@maestro-js/rate-limiting": "^1.0.0-alpha.3",
25
+ "@maestro-js/recurring-jobs": "^1.0.0-alpha.3",
26
+ "@maestro-js/session": "^1.0.0-alpha.3",
27
27
  "@setlist/email-templates": "workspace:*",
28
28
  "@setlist/schemas": "workspace:*",
29
29
  "iso-fns": "npm:iso-fns@2.0.0-alpha.26",
30
30
  "zod": "^4.3.0"
31
31
  },
32
32
  "devDependencies": {
33
- "@maestro-js/cli": "^1.0.0-alpha.22",
33
+ "@maestro-js/cli": "^1.0.0-alpha.3",
34
34
  "@aws-sdk/client-ses": "^3.0.0",
35
35
  "@types/node": "^22.0.0",
36
36
  "mailtrap": "^4.0.0",
@@ -6,11 +6,11 @@
6
6
  "start": "maestro config:run --config queue-processor -- tsx src/index.ts"
7
7
  },
8
8
  "dependencies": {
9
- "@maestro-js/config": "^1.0.0-alpha.22",
9
+ "@maestro-js/config": "^1.0.0-alpha.3",
10
10
  "@setlist/services": "workspace:*"
11
11
  },
12
12
  "devDependencies": {
13
- "@maestro-js/cli": "^1.0.0-alpha.22",
13
+ "@maestro-js/cli": "^1.0.0-alpha.3",
14
14
  "@types/node": "^22.19.11",
15
15
  "tsx": "^4.21.0"
16
16
  }
@@ -21,7 +21,7 @@ export const requestContextMiddleware: MiddlewareFunction<Response> = async ({ r
21
21
  const requestId = randomUUID()
22
22
  const cookieHeader = request.headers.get('Cookie')
23
23
  const session = await Session.getSession(cookieHeader)
24
- const deviceContext = Helpers.getDeviceContext(request, 'none')
24
+ const deviceContext = Helpers.getDeviceContext(request)
25
25
  const authResult = await Auth.authenticate({ session, cookieHeader, deviceContext })
26
26
 
27
27
  let user: User | null = null
@@ -16,8 +16,8 @@
16
16
  "@dnd-kit/core": "^6.3.1",
17
17
  "@dnd-kit/sortable": "^10.0.0",
18
18
  "@dnd-kit/utilities": "^3.2.2",
19
- "@maestro-js/form": "^1.0.0-alpha.22",
20
- "@maestro-js/react-router-file-routes": "^1.0.0-alpha.22",
19
+ "@maestro-js/form": "^1.0.0-alpha.3",
20
+ "@maestro-js/react-router-file-routes": "^1.0.0-alpha.3",
21
21
  "@react-aria/interactions": "^3.27.0",
22
22
  "@react-aria/utils": "^3.33.0",
23
23
  "@react-router/node": "^7.9.0",
@@ -36,7 +36,7 @@
36
36
  "zod": "^4.0.0"
37
37
  },
38
38
  "devDependencies": {
39
- "@maestro-js/cli": "^1.0.0-alpha.22",
39
+ "@maestro-js/cli": "^1.0.0-alpha.3",
40
40
  "@react-router/dev": "^7.9.0",
41
41
  "@tailwindcss/vite": "^4.2.0",
42
42
  "@types/node": "^22.19.11",