anhedral 0.1.3 → 0.1.5

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/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # anhedral
2
2
 
3
- Opinionated init CLI for product teams shipping with Next.js, Expo, Fastify, Drizzle, Neon, Clerk, Stripe, RevenueCat, and Cloudflare R2.
3
+ Opinionated init CLI for product teams shipping one stable stack: Expo + React Native Reusables, Fastify, WXT, Drizzle, Neon, Clerk, RevenueCat + Stripe, Cloudflare R2/CDN, and Vercel.
4
4
 
5
5
  ## Requirements
6
6
 
@@ -13,16 +13,17 @@ Run the latest published CLI directly without installing it globally:
13
13
 
14
14
  ```sh
15
15
  pnpm dlx anhedral@latest init
16
- pnpm dlx anhedral@latest init --next
17
- pnpm dlx anhedral@latest init --extension
18
- pnpm dlx anhedral@latest init --next --extension
19
16
  ```
20
17
 
21
18
  ```sh
22
19
  npx anhedral@latest init
23
- npx anhedral@latest init --next
24
- npx anhedral@latest init --extension
25
- npx anhedral@latest init --next --extension
20
+ ```
21
+
22
+ Use `--skip-install` when you want deterministic file generation without running dependency installation during init:
23
+
24
+ ```sh
25
+ pnpm dlx anhedral@latest init --skip-install
26
+ pnpm install
26
27
  ```
27
28
 
28
29
  Global install also works:
@@ -37,16 +38,123 @@ npm install -g anhedral@latest
37
38
  anhedral init
38
39
  ```
39
40
 
40
- ## Stacks
41
+ ## Stack
42
+
43
+ `init` generates the only supported stack:
44
+
45
+ - Expo + React Native Reusables frontend
46
+ - Fastify backend
47
+ - WXT extension
48
+ - Neon + Drizzle
49
+ - Cloudflare R2/CDN
50
+ - Clerk auth
51
+ - RevenueCat + Stripe
52
+ - Vercel deploy
53
+
54
+ The scaffold is a pnpm workspace with top-level `Frontend`, `Backend`, `Extension`, and `packages/*` folders. Shared code such as the Drizzle schema lives under `packages/db` so apps do not need separate database schemas.
55
+
56
+ Each scaffold writes a `stack.json` file with the selected architecture, generated outputs, and the verified dependency manifest used for that run.
57
+
58
+ ## Vercel Deployment
59
+
60
+ The generated workspace is one Git repository with two Vercel projects:
61
+
62
+ - `Frontend`: Expo web build. Build command: `pnpm build:web`. Output directory: `dist`.
63
+ - `Backend`: Fastify API. Build command: `pnpm build`. Vercel detects `src/index.ts` as the Fastify entrypoint.
64
+
65
+ The `Frontend` source is also the EAS source for iOS and Android builds; Vercel only deploys its web export.
66
+
67
+ Import the same repository twice in Vercel and set each project Root Directory to the app path above. Enable source access outside the app root so `packages/*` workspace dependencies are available during builds.
68
+
69
+ Vercel deployments are Git-driven. After both projects are connected, pushes and pull requests deploy the Expo web app and Fastify API automatically from GitHub commits.
70
+
71
+ Generated projects also include `PRODUCTION.md` with the provider checklist and these root verification scripts:
72
+
73
+ ```sh
74
+ pnpm verify
75
+ pnpm verify:frontend
76
+ pnpm verify:backend
77
+ pnpm verify:extension
78
+ ```
79
+
80
+ ## Native App Deployment
81
+
82
+ Use `Frontend` as the Expo project root for iOS and Android. Vercel only deploys the web export from this app; native builds go through EAS.
83
+
84
+ ```sh
85
+ cd Frontend
86
+ pnpm dlx eas-cli@latest login
87
+ pnpm dlx eas-cli@latest init
88
+ ```
89
+
90
+ The scaffold generates `Frontend/eas.json` with `development`, `preview`, and `production` profiles.
91
+
92
+ Build commands:
93
+
94
+ ```sh
95
+ # Android
96
+ pnpm dlx eas-cli@latest build --platform android --profile production
97
+
98
+ # iOS
99
+ pnpm dlx eas-cli@latest build --platform ios --profile production
100
+
101
+ # Both platforms
102
+ pnpm dlx eas-cli@latest build --platform all --profile production
103
+ ```
104
+
105
+ Submit latest successful builds to the stores:
106
+
107
+ ```sh
108
+ # Google Play
109
+ pnpm dlx eas-cli@latest submit --platform android --latest --profile production
110
+
111
+ # App Store Connect / TestFlight
112
+ pnpm dlx eas-cli@latest submit --platform ios --latest --profile production
113
+
114
+ # Both platforms
115
+ pnpm dlx eas-cli@latest submit --platform all --latest --profile production
116
+ ```
117
+
118
+ One-step build and submit:
119
+
120
+ ```sh
121
+ pnpm dlx eas-cli@latest build --platform android --profile production --auto-submit
122
+ pnpm dlx eas-cli@latest build --platform ios --profile production --auto-submit
123
+ pnpm dlx eas-cli@latest build --platform all --profile production --auto-submit
124
+ ```
125
+
126
+ Useful release checks:
41
127
 
42
- - `init`: Expo app plus Fastify backend. This is the default.
43
- - `init --next`: Next.js frontend plus Fastify backend.
44
- - `init --extension`: default Expo fullstack plus a WXT Chrome extension.
45
- - `init --next --extension`: Next.js fullstack plus a WXT Chrome extension.
128
+ ```sh
129
+ pnpm dlx eas-cli@latest build:list
130
+ pnpm dlx eas-cli@latest build:version:get --platform all --profile production
131
+ pnpm dlx eas-cli@latest credentials
132
+ ```
133
+
134
+ ## Extension Release
135
+
136
+ The WXT extension is built from `Extension`. It is not deployed by Vercel.
137
+
138
+ ```sh
139
+ cd Extension
140
+ pnpm build
141
+ pnpm zip
142
+ ```
143
+
144
+ The Chrome ZIP is generated under `.output/`. Upload that ZIP in the Chrome Web Store Developer Dashboard:
46
145
 
47
- Every scaffold is a pnpm workspace with `apps/*` and `packages/*`. Shared code such as the Drizzle schema lives under `packages/db` so apps do not need separate database schemas.
146
+ 1. Open the Chrome Web Store Developer Dashboard.
147
+ 2. Create the item the first time, or open the existing extension item.
148
+ 3. Upload the generated Chrome ZIP.
149
+ 4. Complete or update the store listing, screenshots, privacy practices, permissions justification, and distribution settings.
150
+ 5. Submit the item for review.
48
151
 
49
- Each scaffold writes a `stack.json` file with the selected architecture and generated outputs.
152
+ For automated store submissions later, WXT supports:
153
+
154
+ ```sh
155
+ pnpm wxt submit init
156
+ pnpm wxt submit
157
+ ```
50
158
 
51
159
  ## Local Development
52
160
 
@@ -84,20 +192,28 @@ npm publish --provenance=false --ignore-scripts
84
192
 
85
193
  ## Maintenance
86
194
 
87
- This repo is now maintained in two lanes:
195
+ This repo is maintained in two lanes:
88
196
 
89
- - `stable`: the default user-facing toolchain, pinned to known-good upstream CLI versions in `src/toolchain.ts`.
197
+ - `stable`: the default user-facing toolchain, pinned to known-good upstream CLI and package versions in `src/dependencies.ts`.
90
198
  - `latest`: an early-warning lane that tracks upstream scaffold tools without pinning, so breakage is detected before it reaches the default path.
91
199
 
92
- The practical rule is simple: detect drift on `latest`, verify it, then promote the pinned `stable` versions only after the e2e matrix passes.
200
+ The practical rule is simple: users get the latest verified Anhedral release, not uncontrolled registry drift at init time. Detect drift on `latest`, verify it, then promote the pinned dependency manifest only after the e2e matrix passes.
201
+
202
+ ### Dependency policy
203
+
204
+ - Runtime dependency versions for generated projects live in `src/dependencies.ts`.
205
+ - Generated package manifests and install commands must read from that manifest.
206
+ - Avoid raw `@latest` and caret ranges in generated output unless a package manager or platform command explicitly requires it.
207
+ - `pnpm dlx anhedral@latest init` means the newest published Anhedral CLI. The generated project should still be reproducible for that exact Anhedral version.
208
+ - `stack.json` records the dependency manifest so support and debugging can identify exactly what was generated.
93
209
 
94
210
  ### Recommended automation
95
211
 
96
- - Renovate is configured in `renovate.json` to keep this repo's own dependencies current.
212
+ - Renovate is configured in `renovate.json` to keep this repo's own dependencies and generated dependency manifest current.
97
213
  - GitHub Actions CI runs on pushes and pull requests in `.github/workflows/ci.yml`.
98
214
  - Weekly toolchain drift checks run in `.github/workflows/toolchain-drift.yml` for both `stable` and `latest`.
99
215
  - Automatic releases publish through `.github/workflows/release-on-main.yml`; `.github/workflows/release.yml` is for manual retry only.
100
- - Stable toolchain pins in `src/toolchain.ts` are annotated so Renovate can open PRs when upstream scaffold CLIs publish updates.
216
+ - Stable dependency pins in `src/dependencies.ts` are annotated so Renovate can open PRs when upstream packages and scaffold CLIs publish updates.
101
217
  - `prepublishOnly` stays strict for manual local publishing. GitHub Actions skips npm lifecycle scripts during publish after running `pnpm release:check`.
102
218
 
103
219
  ### Upgrade workflow
@@ -117,7 +233,7 @@ If you want to validate upstream scaffold drift manually, use the explicit lates
117
233
  pnpm test:e2e:latest
118
234
  ```
119
235
 
120
- When a toolchain pin PR passes and the generated outputs look good, update the `verifiedAt` date in `src/toolchain.ts` and release normally.
236
+ When a dependency pin PR passes and the generated outputs look good, update the `VERIFIED_AT` date in `src/dependencies.ts` and release normally.
121
237
 
122
238
  ### Release policy
123
239
 
package/dist/cli.d.ts CHANGED
@@ -1,10 +1,8 @@
1
- import type { FrontendMode, InitOptions } from './scaffold.js';
2
- export declare const DEFAULT_FRONTEND_MODE: FrontendMode;
3
- export declare const USAGE = "\nanhedral init [--next] [--extension] [--toolchain <latest|stable>]\n\nCommands:\n anhedral init\n Expo, Fastify, Drizzle ORM, Neon Postgres, Clerk Auth, RevenueCat + Stripe, Cloudflare R2, shared packages\n\n anhedral init --next\n Next.js App Router, shadcn/ui, Tailwind CSS, TypeScript, Fastify, Drizzle ORM, Neon Postgres, Clerk Auth, Stripe, Cloudflare R2, shared packages\n\n anhedral init --extension\n Expo + Fastify plus a WXT Chrome extension\n\n anhedral init --next --extension\n Next.js + Fastify plus a WXT Chrome extension\n";
1
+ import type { InitOptions } from './scaffold.js';
2
+ export declare const USAGE = "\nanhedral init [--toolchain <latest|stable>] [--skip-install]\n\nCommands:\n anhedral init\n Expo + React Native Reusables, Fastify, WXT extension, Neon + Drizzle, Cloudflare R2/CDN, Clerk, RevenueCat + Stripe, Vercel\n";
4
3
  export type ParsedFlags = {
5
- next: boolean;
6
- extension: boolean;
7
4
  toolchain?: string;
5
+ skipInstall?: boolean;
8
6
  };
9
7
  export declare function parseCli(args: string[]): ParsedFlags;
10
8
  export declare function deriveProjectName(cwd: string): string;
package/dist/cli.js CHANGED
@@ -1,39 +1,22 @@
1
1
  import path from 'node:path';
2
2
  import { env } from 'node:process';
3
3
  import { TOOLCHAIN_CHANNELS, resolveToolchainChannel } from './toolchain.js';
4
- export const DEFAULT_FRONTEND_MODE = 'expo';
5
4
  export const USAGE = `
6
- anhedral init [--next] [--extension] [--toolchain <latest|stable>]
5
+ anhedral init [--toolchain <latest|stable>] [--skip-install]
7
6
 
8
7
  Commands:
9
8
  anhedral init
10
- Expo, Fastify, Drizzle ORM, Neon Postgres, Clerk Auth, RevenueCat + Stripe, Cloudflare R2, shared packages
11
-
12
- anhedral init --next
13
- Next.js App Router, shadcn/ui, Tailwind CSS, TypeScript, Fastify, Drizzle ORM, Neon Postgres, Clerk Auth, Stripe, Cloudflare R2, shared packages
14
-
15
- anhedral init --extension
16
- Expo + Fastify plus a WXT Chrome extension
17
-
18
- anhedral init --next --extension
19
- Next.js + Fastify plus a WXT Chrome extension
9
+ Expo + React Native Reusables, Fastify, WXT extension, Neon + Drizzle, Cloudflare R2/CDN, Clerk, RevenueCat + Stripe, Vercel
20
10
  `;
21
11
  export function parseCli(args) {
22
- const flags = {
23
- next: false,
24
- extension: false,
25
- };
12
+ const flags = {};
26
13
  for (let index = 0; index < args.length; index += 1) {
27
14
  const token = args[index];
28
15
  if (!token.startsWith('--')) {
29
- throw new Error(`Unexpected argument: ${token}. Use flags: --next, --extension, --toolchain`);
30
- }
31
- if (token === '--next') {
32
- flags.next = true;
33
- continue;
16
+ throw new Error(`Unexpected argument: ${token}. Use flags: --toolchain, --skip-install`);
34
17
  }
35
- if (token === '--extension') {
36
- flags.extension = true;
18
+ if (token === '--skip-install') {
19
+ flags.skipInstall = true;
37
20
  continue;
38
21
  }
39
22
  if (token === '--toolchain') {
@@ -70,17 +53,15 @@ export function buildOptions(flags) {
70
53
  throw new Error(`--toolchain must be one of: ${TOOLCHAIN_CHANNELS.join(', ')}`);
71
54
  }
72
55
  return {
73
- frontend: flags.next ? 'next' : DEFAULT_FRONTEND_MODE,
74
- extension: flags.extension,
75
56
  projectName,
76
57
  displayName,
77
58
  auth: 'clerk',
78
- payments: flags.next ? 'stripe' : 'revenuecat',
59
+ payments: 'revenuecat_stripe',
79
60
  db: 'neon',
80
61
  orm: 'drizzle',
81
62
  storage: 'r2',
82
63
  api: 'fastify',
83
- monorepo: true,
64
+ skipInstall: flags.skipInstall === true || env.ANHEDRAL_SKIP_INSTALL === '1',
84
65
  toolchainChannel: resolveToolchainChannel(flags.toolchain ?? env.ANHEDRAL_TOOLCHAIN),
85
66
  };
86
67
  }
@@ -1,11 +1,7 @@
1
- import type { InitOptions } from './scaffold.js';
2
- import { type ToolchainSpec } from './toolchain.js';
3
1
  export type ScaffoldCommand = {
4
2
  cmd: string;
5
- stdinInput?: string;
6
- skippable?: boolean;
3
+ command: string;
4
+ args: string[];
7
5
  };
8
- export declare function getDefaultWebInitCommand(toolchain: ToolchainSpec, projectName: string): ScaffoldCommand;
9
- export declare function getDefaultWebDependencyCommands(): ScaffoldCommand[];
10
6
  export declare function getBackendInstallCommands(): ScaffoldCommand[];
11
- export declare function getSkillCommands(options: Pick<InitOptions, 'frontend' | 'extension'>): string[];
7
+ export declare function getSkillCommands(): string[];
package/dist/commands.js CHANGED
@@ -1,50 +1,24 @@
1
- import { toolPackageRef } from './toolchain.js';
2
- export function getDefaultWebInitCommand(toolchain, projectName) {
3
- return {
4
- cmd: [
5
- 'pnpm',
6
- 'dlx',
7
- toolPackageRef('shadcn', toolchain.shadcn),
8
- 'init',
9
- '-t',
10
- 'next',
11
- '-n',
12
- projectName,
13
- '-d',
14
- '-y',
15
- '--css-variables',
16
- ].join(' '),
17
- };
18
- }
19
- export function getDefaultWebDependencyCommands() {
20
- return [
21
- {
22
- cmd: 'pnpm add @clerk/nextjs drizzle-orm @neondatabase/serverless stripe @aws-sdk/client-s3 @aws-sdk/lib-storage @aws-sdk/s3-request-presigner',
23
- skippable: true,
24
- },
25
- {
26
- cmd: 'pnpm add -D babel-plugin-react-compiler drizzle-kit tsx dotenv',
27
- skippable: true,
28
- },
29
- ];
30
- }
1
+ import { BACKEND_DEPENDENCIES, withVersions } from './dependencies.js';
31
2
  export function getBackendInstallCommands() {
3
+ const dependencies = withVersions(BACKEND_DEPENDENCIES.dependencies ?? {});
4
+ const devDependencies = withVersions(BACKEND_DEPENDENCIES.devDependencies ?? {});
32
5
  return [
33
6
  {
34
- cmd: 'pnpm add fastify fastify-plugin @fastify/cors @fastify/env @fastify/compress @fastify/helmet @fastify/rate-limit @fastify/swagger @fastify/swagger-ui @fastify/multipart @clerk/fastify @neondatabase/serverless drizzle-orm @aws-sdk/client-s3 @aws-sdk/lib-storage @aws-sdk/s3-request-presigner dotenv',
7
+ cmd: `pnpm add ${dependencies.join(' ')}`,
8
+ command: 'pnpm',
9
+ args: ['add', ...dependencies],
35
10
  },
36
11
  {
37
- cmd: 'pnpm add -D typescript@5.9.3 tsx @types/node@25.5.0 drizzle-kit vitest @vitest/coverage-v8 @vercel/node eslint@9.39.4 @eslint/js@9.39.4 globals typescript-eslint pino-pretty',
12
+ cmd: `pnpm add -D ${devDependencies.join(' ')}`,
13
+ command: 'pnpm',
14
+ args: ['add', '-D', ...devDependencies],
38
15
  },
39
16
  ];
40
17
  }
41
- export function getSkillCommands(options) {
42
- const commands = [
18
+ export function getSkillCommands() {
19
+ return [
43
20
  'pnpm dlx skills add https://github.com/clerk/skills --skill clerk-custom-ui',
21
+ 'pnpm dlx skills add https://github.com/revenuecat/revenuecat-skill --skill revenuecat',
44
22
  'pnpm dlx skills add https://github.com/stripe/ai --skill stripe-best-practices',
45
23
  ];
46
- if (options.frontend === 'expo') {
47
- commands.splice(1, 0, 'pnpm dlx skills add https://github.com/revenuecat/revenuecat-skill --skill revenuecat');
48
- }
49
- return commands;
50
24
  }
@@ -0,0 +1,35 @@
1
+ export declare const PACKAGE_MANAGER = "pnpm@10.15.1";
2
+ export type DependencyMap = Record<string, string>;
3
+ export type DependencyGroup = {
4
+ dependencies?: DependencyMap;
5
+ devDependencies?: DependencyMap;
6
+ };
7
+ export declare const VERIFIED_AT = "2026-04-26";
8
+ export declare const TOOLCHAIN_DEPENDENCIES: {
9
+ readonly shadcn: "4.5.0";
10
+ readonly reactNativeReusables: "0.7.1";
11
+ readonly wxt: "0.20.25";
12
+ };
13
+ export declare const ROOT_DEPENDENCIES: DependencyGroup;
14
+ export declare const SHARED_DB_DEPENDENCIES: DependencyGroup;
15
+ export declare const SHARED_PACKAGE_DEPENDENCIES: DependencyGroup;
16
+ export declare const API_CLIENT_DEPENDENCIES: DependencyGroup;
17
+ export declare const BACKEND_DEPENDENCIES: DependencyGroup;
18
+ export declare const EXTENSION_DEPENDENCIES: DependencyGroup;
19
+ export declare const FRONTEND_ADDON_DEPENDENCIES: DependencyMap;
20
+ export declare function withVersions(dependencies: DependencyMap): string[];
21
+ export declare function dependencyManifest(): {
22
+ verifiedAt: string;
23
+ packageManager: string;
24
+ toolchain: {
25
+ readonly shadcn: "4.5.0";
26
+ readonly reactNativeReusables: "0.7.1";
27
+ readonly wxt: "0.20.25";
28
+ };
29
+ root: DependencyGroup;
30
+ sharedDb: DependencyGroup;
31
+ sharedPackages: DependencyGroup;
32
+ backend: DependencyGroup;
33
+ extension: DependencyGroup;
34
+ frontendAddons: DependencyMap;
35
+ };
@@ -0,0 +1,173 @@
1
+ export const PACKAGE_MANAGER = 'pnpm@10.15.1';
2
+ export const VERIFIED_AT = '2026-04-26';
3
+ export const TOOLCHAIN_DEPENDENCIES = {
4
+ // renovate: datasource=npm depName=shadcn
5
+ shadcn: '4.5.0',
6
+ // renovate: datasource=npm depName=@react-native-reusables/cli
7
+ reactNativeReusables: '0.7.1',
8
+ // renovate: datasource=npm depName=wxt
9
+ wxt: '0.20.25',
10
+ };
11
+ export const ROOT_DEPENDENCIES = {
12
+ devDependencies: {
13
+ // renovate: datasource=npm depName=turbo
14
+ turbo: '2.8.0',
15
+ },
16
+ };
17
+ export const SHARED_DB_DEPENDENCIES = {
18
+ dependencies: {
19
+ // renovate: datasource=npm depName=@neondatabase/serverless
20
+ '@neondatabase/serverless': '1.0.2',
21
+ // renovate: datasource=npm depName=drizzle-orm
22
+ 'drizzle-orm': '0.44.7',
23
+ // renovate: datasource=npm depName=dotenv
24
+ dotenv: '17.2.3',
25
+ },
26
+ devDependencies: {
27
+ // renovate: datasource=npm depName=drizzle-kit
28
+ 'drizzle-kit': '0.31.7',
29
+ // renovate: datasource=npm depName=tsx
30
+ tsx: '4.20.6',
31
+ // renovate: datasource=npm depName=typescript
32
+ typescript: '5.9.3',
33
+ // renovate: datasource=npm depName=@types/node
34
+ '@types/node': '25.6.0',
35
+ },
36
+ };
37
+ export const SHARED_PACKAGE_DEPENDENCIES = {
38
+ devDependencies: {
39
+ // renovate: datasource=npm depName=typescript
40
+ typescript: '5.9.3',
41
+ },
42
+ };
43
+ export const API_CLIENT_DEPENDENCIES = {
44
+ dependencies: {
45
+ '@anhedral/config': 'workspace:*',
46
+ '@anhedral/types': 'workspace:*',
47
+ },
48
+ ...SHARED_PACKAGE_DEPENDENCIES,
49
+ };
50
+ export const BACKEND_DEPENDENCIES = {
51
+ dependencies: {
52
+ '@anhedral/db': 'workspace:*',
53
+ // renovate: datasource=npm depName=fastify
54
+ fastify: '5.6.2',
55
+ // renovate: datasource=npm depName=fastify-plugin
56
+ 'fastify-plugin': '5.1.0',
57
+ // renovate: datasource=npm depName=@fastify/cors
58
+ '@fastify/cors': '11.1.0',
59
+ // renovate: datasource=npm depName=@fastify/env
60
+ '@fastify/env': '5.0.3',
61
+ // renovate: datasource=npm depName=@fastify/compress
62
+ '@fastify/compress': '8.3.0',
63
+ // renovate: datasource=npm depName=@fastify/helmet
64
+ '@fastify/helmet': '13.0.2',
65
+ // renovate: datasource=npm depName=@fastify/rate-limit
66
+ '@fastify/rate-limit': '10.3.0',
67
+ // renovate: datasource=npm depName=@fastify/swagger
68
+ '@fastify/swagger': '9.6.1',
69
+ // renovate: datasource=npm depName=@fastify/swagger-ui
70
+ '@fastify/swagger-ui': '5.2.3',
71
+ // renovate: datasource=npm depName=@fastify/multipart
72
+ '@fastify/multipart': '9.3.0',
73
+ // renovate: datasource=npm depName=@clerk/fastify
74
+ '@clerk/fastify': '3.1.26',
75
+ '@neondatabase/serverless': SHARED_DB_DEPENDENCIES.dependencies['@neondatabase/serverless'],
76
+ 'drizzle-orm': SHARED_DB_DEPENDENCIES.dependencies['drizzle-orm'],
77
+ // renovate: datasource=npm depName=@aws-sdk/client-s3
78
+ '@aws-sdk/client-s3': '3.1047.0',
79
+ // renovate: datasource=npm depName=@aws-sdk/lib-storage
80
+ '@aws-sdk/lib-storage': '3.1047.0',
81
+ // renovate: datasource=npm depName=@aws-sdk/s3-request-presigner
82
+ '@aws-sdk/s3-request-presigner': '3.1047.0',
83
+ dotenv: SHARED_DB_DEPENDENCIES.dependencies.dotenv,
84
+ },
85
+ devDependencies: {
86
+ typescript: SHARED_DB_DEPENDENCIES.devDependencies.typescript,
87
+ tsx: SHARED_DB_DEPENDENCIES.devDependencies.tsx,
88
+ '@types/node': SHARED_DB_DEPENDENCIES.devDependencies['@types/node'],
89
+ 'drizzle-kit': SHARED_DB_DEPENDENCIES.devDependencies['drizzle-kit'],
90
+ // renovate: datasource=npm depName=vitest
91
+ vitest: '4.0.16',
92
+ // renovate: datasource=npm depName=@vitest/coverage-v8
93
+ '@vitest/coverage-v8': '4.0.16',
94
+ // renovate: datasource=npm depName=eslint
95
+ eslint: '9.39.2',
96
+ // renovate: datasource=npm depName=@eslint/js
97
+ '@eslint/js': '9.39.2',
98
+ // renovate: datasource=npm depName=globals
99
+ globals: '16.5.0',
100
+ // renovate: datasource=npm depName=typescript-eslint
101
+ 'typescript-eslint': '8.49.0',
102
+ // renovate: datasource=npm depName=pino-pretty
103
+ 'pino-pretty': '13.1.3',
104
+ },
105
+ };
106
+ export const EXTENSION_DEPENDENCIES = {
107
+ dependencies: {
108
+ '@anhedral/api-client': 'workspace:*',
109
+ // renovate: datasource=npm depName=@clerk/chrome-extension
110
+ '@clerk/chrome-extension': '3.1.25',
111
+ // renovate: datasource=npm depName=react
112
+ react: '19.2.3',
113
+ // renovate: datasource=npm depName=react-dom
114
+ 'react-dom': '19.2.3',
115
+ // renovate: datasource=npm depName=clsx
116
+ clsx: '2.1.1',
117
+ // renovate: datasource=npm depName=tailwind-merge
118
+ 'tailwind-merge': '3.4.0',
119
+ // renovate: datasource=npm depName=class-variance-authority
120
+ 'class-variance-authority': '0.7.1',
121
+ // renovate: datasource=npm depName=lucide-react
122
+ 'lucide-react': '0.562.0',
123
+ },
124
+ devDependencies: {
125
+ // renovate: datasource=npm depName=@types/chrome
126
+ '@types/chrome': '0.1.9',
127
+ // renovate: datasource=npm depName=@types/react
128
+ '@types/react': '19.2.7',
129
+ // renovate: datasource=npm depName=@types/react-dom
130
+ '@types/react-dom': '19.2.3',
131
+ // renovate: datasource=npm depName=@wxt-dev/module-react
132
+ '@wxt-dev/module-react': '1.1.5',
133
+ // renovate: datasource=npm depName=autoprefixer
134
+ autoprefixer: '10.4.23',
135
+ // renovate: datasource=npm depName=postcss
136
+ postcss: '8.5.6',
137
+ // renovate: datasource=npm depName=tailwindcss
138
+ tailwindcss: '3.4.19',
139
+ typescript: SHARED_DB_DEPENDENCIES.devDependencies.typescript,
140
+ wxt: TOOLCHAIN_DEPENDENCIES.wxt,
141
+ },
142
+ };
143
+ export const FRONTEND_ADDON_DEPENDENCIES = {
144
+ '@anhedral/api-client': 'workspace:*',
145
+ // renovate: datasource=npm depName=@clerk/expo
146
+ '@clerk/expo': '3.2.11',
147
+ // renovate: datasource=npm depName=react-native-purchases
148
+ 'react-native-purchases': '10.1.1',
149
+ // renovate: datasource=npm depName=react-native-purchases-ui
150
+ 'react-native-purchases-ui': '10.1.1',
151
+ // renovate: datasource=npm depName=@revenuecat/purchases-js
152
+ '@revenuecat/purchases-js': '1.11.1',
153
+ };
154
+ export function withVersions(dependencies) {
155
+ return Object.entries(dependencies).map(([name, version]) => {
156
+ if (version === 'workspace:*')
157
+ return `${name}@workspace:*`;
158
+ return `${name}@${version}`;
159
+ });
160
+ }
161
+ export function dependencyManifest() {
162
+ return {
163
+ verifiedAt: VERIFIED_AT,
164
+ packageManager: PACKAGE_MANAGER,
165
+ toolchain: TOOLCHAIN_DEPENDENCIES,
166
+ root: ROOT_DEPENDENCIES,
167
+ sharedDb: SHARED_DB_DEPENDENCIES,
168
+ sharedPackages: SHARED_PACKAGE_DEPENDENCIES,
169
+ backend: BACKEND_DEPENDENCIES,
170
+ extension: EXTENSION_DEPENDENCIES,
171
+ frontendAddons: FRONTEND_ADDON_DEPENDENCIES,
172
+ };
173
+ }
@@ -1,10 +1,8 @@
1
1
  import { type ToolchainChannel } from './toolchain.js';
2
- export type FrontendMode = 'expo' | 'next';
3
- export type AuthMode = 'clerk' | 'betterauth';
4
- export type PaymentsMode = 'none' | 'stripe' | 'revenuecat';
2
+ export type FrontendMode = 'expo';
3
+ export type AuthMode = 'clerk';
4
+ export type PaymentsMode = 'revenuecat_stripe';
5
5
  export interface InitOptions {
6
- frontend: FrontendMode;
7
- extension: boolean;
8
6
  projectName: string;
9
7
  displayName: string;
10
8
  auth: AuthMode;
@@ -12,8 +10,8 @@ export interface InitOptions {
12
10
  db: 'neon';
13
11
  orm: 'drizzle';
14
12
  storage: 'r2';
15
- api: 'fastify' | null;
16
- monorepo: boolean;
13
+ api: 'fastify';
14
+ skipInstall: boolean;
17
15
  toolchainChannel: ToolchainChannel;
18
16
  }
19
17
  export interface ProjectOptions {
@@ -21,5 +19,6 @@ export interface ProjectOptions {
21
19
  displayName: string;
22
20
  githubOrg: string | null;
23
21
  frontendUrl?: string;
22
+ skipInstall?: boolean;
24
23
  }
25
24
  export declare function scaffoldProject(options: InitOptions): Promise<void>;