anhedral 0.1.10 → 0.4.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.
Files changed (87) hide show
  1. package/CHANGELOG.md +119 -0
  2. package/CONTRIBUTING.md +73 -0
  3. package/LICENSE +196 -17
  4. package/README.md +202 -145
  5. package/SECURITY.md +37 -0
  6. package/SKILL.md +244 -0
  7. package/bin/anhedral.js +1 -1
  8. package/dist/architecture/contributions.d.ts +28 -0
  9. package/dist/architecture/contributions.js +125 -0
  10. package/dist/architecture/index.d.ts +12 -0
  11. package/dist/architecture/index.js +6 -0
  12. package/dist/architecture/manifest.d.ts +53 -0
  13. package/dist/architecture/manifest.js +283 -0
  14. package/dist/architecture/modules.d.ts +37 -0
  15. package/dist/architecture/modules.js +184 -0
  16. package/dist/architecture/plan.d.ts +58 -0
  17. package/dist/architecture/plan.js +145 -0
  18. package/dist/architecture/templates.d.ts +10 -0
  19. package/dist/architecture/templates.js +23 -0
  20. package/dist/bin.d.ts +2 -0
  21. package/dist/bin.js +179 -0
  22. package/dist/cli.d.ts +24 -2
  23. package/dist/cli.js +189 -21
  24. package/dist/composers/root.d.ts +6 -0
  25. package/dist/composers/root.js +35 -0
  26. package/dist/dependencies.d.ts +31 -9
  27. package/dist/dependencies.js +227 -60
  28. package/dist/index.d.ts +8 -2
  29. package/dist/index.js +5 -31
  30. package/dist/print.js +15 -0
  31. package/dist/prompts.d.ts +5 -0
  32. package/dist/prompts.js +19 -0
  33. package/dist/render.d.ts +11 -0
  34. package/dist/render.js +74 -0
  35. package/dist/scaffold.d.ts +64 -12
  36. package/dist/scaffold.js +1726 -1150
  37. package/dist/template-source.d.ts +20 -0
  38. package/dist/template-source.js +180 -0
  39. package/dist/templates/api.d.ts +2 -0
  40. package/dist/templates/api.js +3122 -0
  41. package/dist/templates/assets-private-proxy.d.ts +3 -0
  42. package/dist/templates/assets-private-proxy.js +277 -0
  43. package/dist/templates/desktop.d.ts +2 -0
  44. package/dist/templates/desktop.js +639 -0
  45. package/dist/templates/electron-updater.d.ts +3 -0
  46. package/dist/templates/electron-updater.js +358 -0
  47. package/dist/templates/extension.d.ts +1 -1
  48. package/dist/templates/extension.js +322 -248
  49. package/dist/templates/mobile.d.ts +2 -0
  50. package/dist/templates/mobile.js +720 -0
  51. package/dist/templates/shared.d.ts +2 -0
  52. package/dist/templates/shared.js +520 -0
  53. package/dist/templates/web.d.ts +2 -0
  54. package/dist/templates/web.js +412 -0
  55. package/dist/toolchain.d.ts +0 -8
  56. package/dist/toolchain.js +0 -21
  57. package/dist/transaction.d.ts +22 -0
  58. package/dist/transaction.js +822 -0
  59. package/dist/ui.d.ts +33 -0
  60. package/dist/ui.js +199 -0
  61. package/dist/util.d.ts +1 -5
  62. package/dist/util.js +70 -159
  63. package/dist/version.d.ts +2 -0
  64. package/dist/version.js +2 -0
  65. package/dist/workspace-config.d.ts +11 -0
  66. package/dist/workspace-config.js +372 -0
  67. package/docs/conventions.md +92 -0
  68. package/docs/master-stack-map.md +192 -0
  69. package/docs/output-tree-contract.md +482 -0
  70. package/docs/references/manual-scaffolding.md +403 -0
  71. package/docs/references/provisioning.md +220 -0
  72. package/package.json +57 -13
  73. package/templates/api-fastify/apps/api/tsconfig.json +20 -0
  74. package/templates/catalog.json +23 -0
  75. package/templates/db-drizzle/packages/db/tsconfig.json +14 -0
  76. package/templates/desktop-electron/apps/desktop/tsconfig.json +37 -0
  77. package/templates/extension-wxt/apps/extension/tsconfig.json +41 -0
  78. package/templates/mobile-expo/apps/mobile/expo-env.d.ts +1 -0
  79. package/templates/web-next/apps/web/next-env.d.ts +6 -0
  80. package/dist/branding.d.ts +0 -5
  81. package/dist/branding.js +0 -17
  82. package/dist/commands.d.ts +0 -7
  83. package/dist/commands.js +0 -24
  84. package/dist/templates/backend.d.ts +0 -2
  85. package/dist/templates/backend.js +0 -2115
  86. package/dist/templates/frontend.d.ts +0 -2
  87. package/dist/templates/frontend.js +0 -1268
@@ -0,0 +1,35 @@
1
+ const ROOT_ENVIRONMENT_ORDER = [
2
+ 'ANHEDRAL_DEMO',
3
+ 'PORT',
4
+ 'TRUST_PROXY_HOPS',
5
+ 'CORS_ORIGINS',
6
+ 'BASE_URL',
7
+ 'DATABASE_URL',
8
+ 'CLERK_PUBLISHABLE_KEY',
9
+ 'CLERK_SECRET_KEY',
10
+ 'RC_WEBHOOK_SECRET',
11
+ 'RC_SECRET_API_KEY',
12
+ 'RC_ENTITLEMENT_ID',
13
+ 'ABLY_API_KEY',
14
+ 'R2_ACCOUNT_ID',
15
+ 'R2_ACCESS_KEY_ID',
16
+ 'R2_SECRET_ACCESS_KEY',
17
+ 'R2_BUCKET_NAME',
18
+ 'R2_PREFIX',
19
+ 'R2_PROXY_READ_URL_TTL_SECONDS',
20
+ 'DESKTOP_UPDATE_BASE_URL',
21
+ 'CLOUDFLARE_API_TOKEN',
22
+ 'CRON_SECRET',
23
+ ];
24
+ export function composeRootEnvironment(model, context) {
25
+ const environment = new Map(model.environment.map((entry) => [entry.name, entry.defaultValue]));
26
+ return Object.freeze(ROOT_ENVIRONMENT_ORDER.flatMap((name) => {
27
+ if (!environment.has(name))
28
+ return [];
29
+ const value = name === 'CORS_ORIGINS' ? context.corsOrigins.join(',') : environment.get(name);
30
+ return [`${name}=${value}`];
31
+ }));
32
+ }
33
+ export function composeVercelCrons(model) {
34
+ return Object.freeze(model.crons.map(({ path, schedule }) => Object.freeze({ path, schedule })));
35
+ }
@@ -1,37 +1,59 @@
1
- export declare const PACKAGE_MANAGER = "pnpm@10.15.1";
1
+ export declare const PACKAGE_MANAGER = "pnpm@10.34.5";
2
+ export declare const NODE_ENGINE = "^20.19.0 || >=22.12.0";
3
+ export declare const MOBILE_NODE_ENGINE = "^22.13.0 || ^24.3.0 || >=25";
2
4
  export type DependencyMap = Record<string, string>;
3
5
  export type DependencyGroup = {
4
6
  dependencies?: DependencyMap;
5
7
  devDependencies?: DependencyMap;
6
8
  };
7
- export declare const VERIFIED_AT = "2026-04-26";
8
9
  export declare const TOOLCHAIN_DEPENDENCIES: {
9
- readonly shadcn: "4.5.0";
10
- readonly reactNativeReusables: "0.7.1";
11
- readonly wxt: "0.20.25";
10
+ readonly shadcn: "4.13.0";
11
+ readonly wxt: "0.20.27";
12
+ readonly vercel: "56.2.1";
13
+ readonly 'eas-cli': "21.0.1";
14
+ readonly neonctl: "2.33.2";
15
+ readonly wrangler: "4.111.0";
12
16
  };
17
+ export declare const SECURITY_OVERRIDES: DependencyMap;
13
18
  export declare const ROOT_DEPENDENCIES: DependencyGroup;
14
19
  export declare const SHARED_DB_DEPENDENCIES: DependencyGroup;
15
20
  export declare const SHARED_PACKAGE_DEPENDENCIES: DependencyGroup;
16
21
  export declare const CONTRACTS_DEPENDENCIES: DependencyGroup;
17
22
  export declare const API_CLIENT_DEPENDENCIES: DependencyGroup;
23
+ export declare const REALTIME_DEPENDENCIES: DependencyGroup;
18
24
  export declare const BACKEND_DEPENDENCIES: DependencyGroup;
19
25
  export declare const EXTENSION_DEPENDENCIES: DependencyGroup;
20
26
  export declare const FRONTEND_ADDON_DEPENDENCIES: DependencyMap;
21
- export declare function withVersions(dependencies: DependencyMap): string[];
27
+ export declare const MOBILE_APP_DEPENDENCIES: DependencyGroup;
28
+ export declare const MOBILE_NATIVEWIND_DEPENDENCIES: DependencyGroup;
29
+ export declare const MOBILE_UNIWIND_DEPENDENCIES: DependencyGroup;
30
+ export declare const WEB_APP_DEPENDENCIES: DependencyGroup;
31
+ export declare const DESKTOP_DEPENDENCIES: DependencyGroup;
32
+ export declare const ELECTRON_UPDATER_DEPENDENCIES: DependencyGroup;
22
33
  export declare function dependencyManifest(): {
23
34
  verifiedAt: string;
24
35
  packageManager: string;
25
36
  toolchain: {
26
- readonly shadcn: "4.5.0";
27
- readonly reactNativeReusables: "0.7.1";
28
- readonly wxt: "0.20.25";
37
+ readonly shadcn: "4.13.0";
38
+ readonly wxt: "0.20.27";
39
+ readonly vercel: "56.2.1";
40
+ readonly 'eas-cli': "21.0.1";
41
+ readonly neonctl: "2.33.2";
42
+ readonly wrangler: "4.111.0";
29
43
  };
44
+ securityOverrides: DependencyMap;
30
45
  root: DependencyGroup;
31
46
  contracts: DependencyGroup;
32
47
  sharedDb: DependencyGroup;
33
48
  sharedPackages: DependencyGroup;
49
+ realtime: DependencyGroup;
34
50
  backend: DependencyGroup;
35
51
  extension: DependencyGroup;
36
52
  frontendAddons: DependencyMap;
53
+ mobileApp: DependencyGroup;
54
+ mobileNativewind: DependencyGroup;
55
+ mobileUniwind: DependencyGroup;
56
+ webApp: DependencyGroup;
57
+ desktop: DependencyGroup;
58
+ electronUpdater: DependencyGroup;
37
59
  };
@@ -1,17 +1,46 @@
1
- export const PACKAGE_MANAGER = 'pnpm@10.15.1';
2
- export const VERIFIED_AT = '2026-04-26';
1
+ export const PACKAGE_MANAGER = 'pnpm@10.34.5';
2
+ export const NODE_ENGINE = '^20.19.0 || >=22.12.0';
3
+ // Expo SDK 56 targets React Native 0.85, whose supported Node release lines start here.
4
+ export const MOBILE_NODE_ENGINE = '^22.13.0 || ^24.3.0 || >=25';
5
+ const VERIFIED_AT = '2026-07-15';
3
6
  export const TOOLCHAIN_DEPENDENCIES = {
4
7
  // 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
+ shadcn: '4.13.0',
8
9
  // renovate: datasource=npm depName=wxt
9
- wxt: '0.20.25',
10
+ wxt: '0.20.27',
11
+ // renovate: datasource=npm depName=vercel
12
+ vercel: '56.2.1',
13
+ // renovate: datasource=npm depName=eas-cli
14
+ 'eas-cli': '21.0.1',
15
+ // renovate: datasource=npm depName=neonctl
16
+ neonctl: '2.33.2',
17
+ // renovate: datasource=npm depName=wrangler
18
+ wrangler: '4.111.0',
19
+ };
20
+ export const SECURITY_OVERRIDES = {
21
+ // renovate: datasource=npm depName=adm-zip
22
+ 'adm-zip@<0.6.0': '0.6.0',
23
+ // renovate: datasource=npm depName=@vitejs/plugin-react
24
+ '@vitejs/plugin-react': '5.2.0',
25
+ // renovate: datasource=npm depName=postcss
26
+ postcss: '8.5.19',
27
+ // renovate: datasource=npm depName=esbuild
28
+ 'esbuild@<=0.24.2': '0.25.12',
29
+ // renovate: datasource=npm depName=esbuild
30
+ 'esbuild@>=0.27.3 <0.28.1': '0.28.1',
31
+ // renovate: datasource=npm depName=shell-quote
32
+ 'shell-quote@<=1.8.4': '1.10.0',
33
+ // renovate: datasource=npm depName=sharp
34
+ 'sharp@<0.35.0': '0.35.3',
35
+ // renovate: datasource=npm depName=tmp
36
+ 'tmp@<0.2.6': '0.2.7',
37
+ // renovate: datasource=npm depName=uuid
38
+ 'uuid@<11.1.1': '11.1.1',
10
39
  };
11
40
  export const ROOT_DEPENDENCIES = {
12
41
  devDependencies: {
13
42
  // renovate: datasource=npm depName=turbo
14
- turbo: '2.8.0',
43
+ turbo: '2.9.14',
15
44
  },
16
45
  };
17
46
  export const SHARED_DB_DEPENDENCIES = {
@@ -19,7 +48,7 @@ export const SHARED_DB_DEPENDENCIES = {
19
48
  // renovate: datasource=npm depName=@neondatabase/serverless
20
49
  '@neondatabase/serverless': '1.0.2',
21
50
  // renovate: datasource=npm depName=drizzle-orm
22
- 'drizzle-orm': '0.44.7',
51
+ 'drizzle-orm': '0.45.2',
23
52
  // renovate: datasource=npm depName=dotenv
24
53
  dotenv: '17.2.3',
25
54
  },
@@ -31,7 +60,7 @@ export const SHARED_DB_DEPENDENCIES = {
31
60
  // renovate: datasource=npm depName=typescript
32
61
  typescript: '5.9.3',
33
62
  // renovate: datasource=npm depName=@types/node
34
- '@types/node': '25.6.0',
63
+ '@types/node': '20.19.43',
35
64
  },
36
65
  };
37
66
  export const SHARED_PACKAGE_DEPENDENCIES = {
@@ -49,45 +78,41 @@ export const CONTRACTS_DEPENDENCIES = {
49
78
  };
50
79
  export const API_CLIENT_DEPENDENCIES = {
51
80
  dependencies: {
52
- '@shared/config': 'workspace:*',
53
81
  '@shared/contracts': 'workspace:*',
54
- '@shared/types': 'workspace:*',
55
82
  zod: CONTRACTS_DEPENDENCIES.dependencies.zod,
56
83
  },
57
84
  ...SHARED_PACKAGE_DEPENDENCIES,
58
85
  };
86
+ export const REALTIME_DEPENDENCIES = {
87
+ dependencies: {
88
+ '@shared/contracts': 'workspace:*',
89
+ // renovate: datasource=npm depName=ably
90
+ ably: '2.24.0',
91
+ },
92
+ ...SHARED_PACKAGE_DEPENDENCIES,
93
+ };
59
94
  export const BACKEND_DEPENDENCIES = {
60
95
  dependencies: {
61
96
  '@shared/contracts': 'workspace:*',
62
97
  '@shared/db': 'workspace:*',
63
98
  // renovate: datasource=npm depName=fastify
64
- fastify: '5.6.2',
65
- // renovate: datasource=npm depName=fastify-plugin
66
- 'fastify-plugin': '5.1.0',
99
+ fastify: '5.8.5',
67
100
  // renovate: datasource=npm depName=@fastify/cors
68
101
  '@fastify/cors': '11.1.0',
69
- // renovate: datasource=npm depName=@fastify/env
70
- '@fastify/env': '5.0.3',
71
102
  // renovate: datasource=npm depName=@fastify/compress
72
103
  '@fastify/compress': '8.3.0',
73
104
  // renovate: datasource=npm depName=@fastify/helmet
74
105
  '@fastify/helmet': '13.0.2',
75
106
  // renovate: datasource=npm depName=@fastify/rate-limit
76
107
  '@fastify/rate-limit': '10.3.0',
77
- // renovate: datasource=npm depName=@fastify/swagger
78
- '@fastify/swagger': '9.6.1',
79
- // renovate: datasource=npm depName=@fastify/swagger-ui
80
- '@fastify/swagger-ui': '5.2.3',
81
- // renovate: datasource=npm depName=@fastify/multipart
82
- '@fastify/multipart': '9.3.0',
83
108
  // renovate: datasource=npm depName=@clerk/fastify
84
- '@clerk/fastify': '3.1.26',
109
+ '@clerk/fastify': '3.1.51',
110
+ // renovate: datasource=npm depName=ably
111
+ ably: REALTIME_DEPENDENCIES.dependencies.ably,
85
112
  '@neondatabase/serverless': SHARED_DB_DEPENDENCIES.dependencies['@neondatabase/serverless'],
86
113
  'drizzle-orm': SHARED_DB_DEPENDENCIES.dependencies['drizzle-orm'],
87
114
  // renovate: datasource=npm depName=@aws-sdk/client-s3
88
115
  '@aws-sdk/client-s3': '3.1047.0',
89
- // renovate: datasource=npm depName=@aws-sdk/lib-storage
90
- '@aws-sdk/lib-storage': '3.1047.0',
91
116
  // renovate: datasource=npm depName=@aws-sdk/s3-request-presigner
92
117
  '@aws-sdk/s3-request-presigner': '3.1047.0',
93
118
  dotenv: SHARED_DB_DEPENDENCIES.dependencies.dotenv,
@@ -97,40 +122,26 @@ export const BACKEND_DEPENDENCIES = {
97
122
  typescript: SHARED_DB_DEPENDENCIES.devDependencies.typescript,
98
123
  tsx: SHARED_DB_DEPENDENCIES.devDependencies.tsx,
99
124
  '@types/node': SHARED_DB_DEPENDENCIES.devDependencies['@types/node'],
100
- 'drizzle-kit': SHARED_DB_DEPENDENCIES.devDependencies['drizzle-kit'],
101
125
  // renovate: datasource=npm depName=vitest
102
- vitest: '4.0.16',
126
+ vitest: '4.1.0',
103
127
  // renovate: datasource=npm depName=@vitest/coverage-v8
104
- '@vitest/coverage-v8': '4.0.16',
105
- // renovate: datasource=npm depName=eslint
106
- eslint: '9.39.2',
107
- // renovate: datasource=npm depName=@eslint/js
108
- '@eslint/js': '9.39.2',
109
- // renovate: datasource=npm depName=globals
110
- globals: '16.5.0',
111
- // renovate: datasource=npm depName=typescript-eslint
112
- 'typescript-eslint': '8.49.0',
113
- // renovate: datasource=npm depName=pino-pretty
114
- 'pino-pretty': '13.1.3',
128
+ '@vitest/coverage-v8': '4.1.0',
115
129
  },
116
130
  };
117
131
  export const EXTENSION_DEPENDENCIES = {
118
132
  dependencies: {
119
133
  '@shared/api-client': 'workspace:*',
134
+ '@shared/realtime': 'workspace:*',
120
135
  // renovate: datasource=npm depName=@clerk/chrome-extension
121
- '@clerk/chrome-extension': '3.1.25',
136
+ '@clerk/chrome-extension': '3.1.52',
122
137
  // renovate: datasource=npm depName=react
123
- react: '19.2.3',
138
+ react: '19.2.7',
124
139
  // renovate: datasource=npm depName=react-dom
125
- 'react-dom': '19.2.3',
140
+ 'react-dom': '19.2.7',
126
141
  // renovate: datasource=npm depName=clsx
127
142
  clsx: '2.1.1',
128
143
  // renovate: datasource=npm depName=tailwind-merge
129
144
  'tailwind-merge': '3.4.0',
130
- // renovate: datasource=npm depName=class-variance-authority
131
- 'class-variance-authority': '0.7.1',
132
- // renovate: datasource=npm depName=lucide-react
133
- 'lucide-react': '0.562.0',
134
145
  },
135
146
  devDependencies: {
136
147
  // renovate: datasource=npm depName=@types/chrome
@@ -140,46 +151,202 @@ export const EXTENSION_DEPENDENCIES = {
140
151
  // renovate: datasource=npm depName=@types/react-dom
141
152
  '@types/react-dom': '19.2.3',
142
153
  // renovate: datasource=npm depName=@wxt-dev/module-react
143
- '@wxt-dev/module-react': '1.1.5',
154
+ '@wxt-dev/module-react': '1.2.2',
144
155
  // renovate: datasource=npm depName=autoprefixer
145
156
  autoprefixer: '10.4.23',
146
157
  // renovate: datasource=npm depName=postcss
147
- postcss: '8.5.6',
158
+ postcss: '8.5.19',
148
159
  // renovate: datasource=npm depName=tailwindcss
149
160
  tailwindcss: '3.4.19',
150
161
  typescript: SHARED_DB_DEPENDENCIES.devDependencies.typescript,
151
162
  wxt: TOOLCHAIN_DEPENDENCIES.wxt,
163
+ // renovate: datasource=npm depName=vite
164
+ vite: '7.3.6',
152
165
  },
153
166
  };
154
167
  export const FRONTEND_ADDON_DEPENDENCIES = {
155
168
  '@shared/api-client': 'workspace:*',
156
169
  // renovate: datasource=npm depName=@clerk/expo
157
- '@clerk/expo': '3.2.11',
170
+ '@clerk/expo': '3.7.5',
171
+ // renovate: datasource=npm depName=expo-secure-store
172
+ 'expo-secure-store': '56.0.4',
158
173
  // renovate: datasource=npm depName=react-native-purchases
159
- 'react-native-purchases': '10.1.1',
174
+ 'react-native-purchases': '10.4.2',
160
175
  // renovate: datasource=npm depName=react-native-purchases-ui
161
- 'react-native-purchases-ui': '10.1.1',
162
- // renovate: datasource=npm depName=@revenuecat/purchases-js
163
- '@revenuecat/purchases-js': '1.11.1',
164
- };
165
- export function withVersions(dependencies) {
166
- return Object.entries(dependencies).map(([name, version]) => {
167
- if (version === 'workspace:*')
168
- return `${name}@workspace:*`;
169
- return `${name}@${version}`;
170
- });
171
- }
176
+ 'react-native-purchases-ui': '10.4.2',
177
+ };
178
+ export const MOBILE_APP_DEPENDENCIES = {
179
+ dependencies: {
180
+ '@shared/api-client': 'workspace:*',
181
+ '@shared/realtime': 'workspace:*',
182
+ '@rn-primitives/portal': '1.5.2',
183
+ '@rn-primitives/slot': '1.5.2',
184
+ // renovate: datasource=npm depName=class-variance-authority
185
+ 'class-variance-authority': '0.7.1',
186
+ clsx: EXTENSION_DEPENDENCIES.dependencies.clsx,
187
+ // renovate: datasource=npm depName=expo
188
+ expo: '56.0.16',
189
+ // renovate: datasource=npm depName=expo-constants
190
+ 'expo-constants': '56.0.21',
191
+ // renovate: datasource=npm depName=expo-linking
192
+ 'expo-linking': '56.0.15',
193
+ // renovate: datasource=npm depName=expo-router
194
+ 'expo-router': '56.2.15',
195
+ // renovate: datasource=npm depName=expo-status-bar
196
+ 'expo-status-bar': '56.0.4',
197
+ // renovate: datasource=npm depName=expo-system-ui
198
+ 'expo-system-ui': '56.0.5',
199
+ // renovate: datasource=npm depName=lucide-react-native
200
+ 'lucide-react-native': '1.21.0',
201
+ react: EXTENSION_DEPENDENCIES.dependencies.react,
202
+ 'react-dom': EXTENSION_DEPENDENCIES.dependencies['react-dom'],
203
+ // renovate: datasource=npm depName=react-native
204
+ 'react-native': '0.85.3',
205
+ // renovate: datasource=npm depName=react-native-gesture-handler
206
+ 'react-native-gesture-handler': '2.31.1',
207
+ // renovate: datasource=npm depName=react-native-reanimated
208
+ 'react-native-reanimated': '4.3.1',
209
+ // renovate: datasource=npm depName=react-native-safe-area-context
210
+ 'react-native-safe-area-context': '5.7.0',
211
+ // renovate: datasource=npm depName=react-native-screens
212
+ 'react-native-screens': '4.25.2',
213
+ // renovate: datasource=npm depName=react-native-worklets
214
+ 'react-native-worklets': '0.8.3',
215
+ // renovate: datasource=npm depName=react-native-web
216
+ 'react-native-web': '0.21.0',
217
+ // renovate: datasource=npm depName=react-native-svg
218
+ 'react-native-svg': '15.15.4',
219
+ 'tailwind-merge': '3.5.0',
220
+ // renovate: datasource=npm depName=tailwindcss-animate
221
+ 'tailwindcss-animate': '1.0.7',
222
+ },
223
+ devDependencies: {
224
+ // renovate: datasource=npm depName=@babel/core
225
+ '@babel/core': '7.29.6',
226
+ // expo-router's web test utilities expose @testing-library/user-event, whose DOM peer is explicit when autoInstallPeers is disabled.
227
+ // renovate: datasource=npm depName=@testing-library/dom
228
+ '@testing-library/dom': '10.4.1',
229
+ // renovate: datasource=npm depName=@react-native/metro-config
230
+ '@react-native/metro-config': '0.85.3',
231
+ // renovate: datasource=npm depName=@types/react
232
+ '@types/react': '19.2.10',
233
+ // renovate: datasource=npm depName=typescript
234
+ typescript: '6.0.3',
235
+ },
236
+ };
237
+ export const MOBILE_NATIVEWIND_DEPENDENCIES = {
238
+ dependencies: {
239
+ // renovate: datasource=npm depName=nativewind
240
+ nativewind: '4.2.6',
241
+ // NativeWind's Babel transform imports this runtime from application code,
242
+ // so pnpm's strict linker requires it as a direct dependency.
243
+ // renovate: datasource=npm depName=react-native-css-interop
244
+ 'react-native-css-interop': '0.2.6',
245
+ tailwindcss: EXTENSION_DEPENDENCIES.devDependencies.tailwindcss,
246
+ },
247
+ };
248
+ export const MOBILE_UNIWIND_DEPENDENCIES = {
249
+ dependencies: {
250
+ // renovate: datasource=npm depName=uniwind
251
+ uniwind: '1.9.0',
252
+ // renovate: datasource=npm depName=tailwindcss
253
+ tailwindcss: '4.2.1',
254
+ // renovate: datasource=npm depName=tw-animate-css
255
+ 'tw-animate-css': '1.4.0',
256
+ },
257
+ };
258
+ export const WEB_APP_DEPENDENCIES = {
259
+ dependencies: {
260
+ '@shared/api-client': 'workspace:*',
261
+ '@shared/realtime': 'workspace:*',
262
+ // renovate: datasource=npm depName=@clerk/nextjs
263
+ '@clerk/nextjs': '7.5.18',
264
+ // renovate: datasource=npm depName=@clerk/ui
265
+ '@clerk/ui': '1.25.3',
266
+ // renovate: datasource=npm depName=next
267
+ next: '16.2.11',
268
+ // renovate: datasource=npm depName=react
269
+ react: EXTENSION_DEPENDENCIES.dependencies.react,
270
+ // renovate: datasource=npm depName=react-dom
271
+ 'react-dom': EXTENSION_DEPENDENCIES.dependencies['react-dom'],
272
+ clsx: EXTENSION_DEPENDENCIES.dependencies.clsx,
273
+ 'tailwind-merge': EXTENSION_DEPENDENCIES.dependencies['tailwind-merge'],
274
+ },
275
+ devDependencies: {
276
+ // renovate: datasource=npm depName=@tailwindcss/postcss
277
+ '@tailwindcss/postcss': '4.1.18',
278
+ // renovate: datasource=npm depName=tailwindcss
279
+ tailwindcss: '4.1.18',
280
+ '@types/node': SHARED_DB_DEPENDENCIES.devDependencies['@types/node'],
281
+ '@types/react': EXTENSION_DEPENDENCIES.devDependencies['@types/react'],
282
+ '@types/react-dom': EXTENSION_DEPENDENCIES.devDependencies['@types/react-dom'],
283
+ typescript: SHARED_DB_DEPENDENCIES.devDependencies.typescript,
284
+ },
285
+ };
286
+ export const DESKTOP_DEPENDENCIES = {
287
+ dependencies: {
288
+ '@shared/api-client': 'workspace:*',
289
+ '@shared/realtime': 'workspace:*',
290
+ // renovate: datasource=npm depName=@clerk/clerk-js
291
+ '@clerk/clerk-js': '6.25.3',
292
+ '@clerk/ui': WEB_APP_DEPENDENCIES.dependencies['@clerk/ui'],
293
+ // Clerk's browser bundle imports @solana/wallet-adapter-react, whose web3 peer must be explicit when autoInstallPeers is disabled.
294
+ // renovate: datasource=npm depName=@solana/web3.js
295
+ '@solana/web3.js': '1.98.4',
296
+ // Clerk's Solana wallet adapter expects the current bs58 peer alongside web3.js.
297
+ // renovate: datasource=npm depName=bs58
298
+ bs58: '6.0.0',
299
+ react: EXTENSION_DEPENDENCIES.dependencies.react,
300
+ 'react-dom': EXTENSION_DEPENDENCIES.dependencies['react-dom'],
301
+ clsx: EXTENSION_DEPENDENCIES.dependencies.clsx,
302
+ 'tailwind-merge': EXTENSION_DEPENDENCIES.dependencies['tailwind-merge'],
303
+ },
304
+ devDependencies: {
305
+ '@tailwindcss/postcss': WEB_APP_DEPENDENCIES.devDependencies['@tailwindcss/postcss'],
306
+ // renovate: datasource=npm depName=@vitejs/plugin-react
307
+ '@vitejs/plugin-react': '5.2.0',
308
+ '@types/node': SHARED_DB_DEPENDENCIES.devDependencies['@types/node'],
309
+ '@types/react': EXTENSION_DEPENDENCIES.devDependencies['@types/react'],
310
+ '@types/react-dom': EXTENSION_DEPENDENCIES.devDependencies['@types/react-dom'],
311
+ // renovate: datasource=npm depName=electron
312
+ electron: '43.1.1',
313
+ // renovate: datasource=npm depName=electron-builder
314
+ 'electron-builder': '26.15.3',
315
+ // renovate: datasource=npm depName=electron-builder-squirrel-windows
316
+ 'electron-builder-squirrel-windows': '26.15.3',
317
+ // renovate: datasource=npm depName=tailwindcss
318
+ tailwindcss: '4.1.18',
319
+ postcss: EXTENSION_DEPENDENCIES.devDependencies.postcss,
320
+ typescript: SHARED_DB_DEPENDENCIES.devDependencies.typescript,
321
+ // renovate: datasource=npm depName=vite
322
+ vite: '7.3.6',
323
+ },
324
+ };
325
+ export const ELECTRON_UPDATER_DEPENDENCIES = {
326
+ dependencies: {
327
+ // renovate: datasource=npm depName=electron-updater
328
+ 'electron-updater': '6.8.9',
329
+ },
330
+ };
172
331
  export function dependencyManifest() {
173
332
  return {
174
333
  verifiedAt: VERIFIED_AT,
175
334
  packageManager: PACKAGE_MANAGER,
176
335
  toolchain: TOOLCHAIN_DEPENDENCIES,
336
+ securityOverrides: SECURITY_OVERRIDES,
177
337
  root: ROOT_DEPENDENCIES,
178
338
  contracts: CONTRACTS_DEPENDENCIES,
179
339
  sharedDb: SHARED_DB_DEPENDENCIES,
180
340
  sharedPackages: SHARED_PACKAGE_DEPENDENCIES,
341
+ realtime: REALTIME_DEPENDENCIES,
181
342
  backend: BACKEND_DEPENDENCIES,
182
343
  extension: EXTENSION_DEPENDENCIES,
183
344
  frontendAddons: FRONTEND_ADDON_DEPENDENCIES,
345
+ mobileApp: MOBILE_APP_DEPENDENCIES,
346
+ mobileNativewind: MOBILE_NATIVEWIND_DEPENDENCIES,
347
+ mobileUniwind: MOBILE_UNIWIND_DEPENDENCIES,
348
+ webApp: WEB_APP_DEPENDENCIES,
349
+ desktop: DESKTOP_DEPENDENCIES,
350
+ electronUpdater: ELECTRON_UPDATER_DEPENDENCIES,
184
351
  };
185
352
  }
package/dist/index.d.ts CHANGED
@@ -1,2 +1,8 @@
1
- #!/usr/bin/env tsx
2
- export {};
1
+ export { APP_MODULES, FEATURE_MODULES, USAGE, buildAddOptions, buildOptions, deriveDisplayName, deriveProjectName, normalizeModuleName, parseCli, parseNewProjectRequest, buildOptionsForRoot, parseUiAddOptions, } from './cli.js';
2
+ export type { AppModule, FeatureModule, ParsedFlags, SupportedModule } from './cli.js';
3
+ export { doctorProject, isSupportedProjectUpgrade, scaffoldAddModules, scaffoldProject, scaffoldUiComponents, scaffoldUpgradeProject, } from './scaffold.js';
4
+ export type { AddOptions, DoctorIssue, DoctorReport, InitOptions, ProjectOptions, UiAddOptions, UpgradeOptions, } from './scaffold.js';
5
+ export * from './architecture/index.js';
6
+ export { BundledTemplateSource, assertTemplateProvenance, hashTemplateDirectory, materializeTemplates, templateIdsForModules, } from './template-source.js';
7
+ export type { TemplateMaterializeRequest, TemplateSource, } from './template-source.js';
8
+ export { GENERATOR_VERSION } from './version.js';
package/dist/index.js CHANGED
@@ -1,31 +1,5 @@
1
- #!/usr/bin/env tsx
2
- import { argv, exit } from 'node:process';
3
- import { buildOptions, parseCli, USAGE } from './cli.js';
4
- import { scaffoldProject } from './scaffold.js';
5
- async function main() {
6
- const args = argv.slice(2);
7
- const command = args[0];
8
- if (!command || command === '--help' || command === '-h') {
9
- console.log(USAGE);
10
- exit(0);
11
- }
12
- if (command !== 'init') {
13
- console.error(`Unknown command: ${command}`);
14
- console.log(USAGE);
15
- exit(1);
16
- }
17
- const rawArgs = args.slice(1);
18
- if (rawArgs.includes('--help') || rawArgs.includes('-h')) {
19
- console.log(USAGE);
20
- exit(0);
21
- }
22
- try {
23
- const options = buildOptions(parseCli(rawArgs));
24
- await scaffoldProject(options);
25
- }
26
- catch (error) {
27
- console.error('Error:', error.message);
28
- exit(1);
29
- }
30
- }
31
- main();
1
+ export { APP_MODULES, FEATURE_MODULES, USAGE, buildAddOptions, buildOptions, deriveDisplayName, deriveProjectName, normalizeModuleName, parseCli, parseNewProjectRequest, buildOptionsForRoot, parseUiAddOptions, } from './cli.js';
2
+ export { doctorProject, isSupportedProjectUpgrade, scaffoldAddModules, scaffoldProject, scaffoldUiComponents, scaffoldUpgradeProject, } from './scaffold.js';
3
+ export * from './architecture/index.js';
4
+ export { BundledTemplateSource, assertTemplateProvenance, hashTemplateDirectory, materializeTemplates, templateIdsForModules, } from './template-source.js';
5
+ export { GENERATOR_VERSION } from './version.js';
package/dist/print.js CHANGED
@@ -1,5 +1,8 @@
1
1
  import { stdout } from 'node:process';
2
2
  const USE_COLOR = Boolean(stdout.isTTY) && process.env.NO_COLOR == null;
3
+ function isQuiet() {
4
+ return process.env.ANHEDRAL_QUIET === '1';
5
+ }
3
6
  function paint(code, message) {
4
7
  if (!USE_COLOR)
5
8
  return message;
@@ -13,21 +16,33 @@ const red = (value) => paint('31', value);
13
16
  const magenta = (value) => paint('35', value);
14
17
  export const anhedralPrint = {
15
18
  banner(message) {
19
+ if (isQuiet())
20
+ return;
16
21
  console.log(`${bold(magenta('>'))} ${bold(message)}\n`);
17
22
  },
18
23
  section(message) {
24
+ if (isQuiet())
25
+ return;
19
26
  console.log(`\n${cyan('==')} ${bold(message)}`);
20
27
  },
21
28
  step(message) {
29
+ if (isQuiet())
30
+ return;
22
31
  console.log(` ${cyan('>')} ${message}`);
23
32
  },
24
33
  done(message) {
34
+ if (isQuiet())
35
+ return;
25
36
  console.log(` ${green('ok')} ${message}`);
26
37
  },
27
38
  info(message) {
39
+ if (isQuiet())
40
+ return;
28
41
  console.log(` ${dim(message)}`);
29
42
  },
30
43
  fail(message) {
44
+ if (isQuiet())
45
+ return;
31
46
  console.log(` ${red('x')} ${message}`);
32
47
  },
33
48
  };
@@ -0,0 +1,5 @@
1
+ export declare function shouldPromptForInitModules(args: readonly string[], isTTY: boolean): boolean;
2
+ export declare function hasUiSelection(args: readonly string[]): boolean;
3
+ export declare function parsePromptModules(input: string, fallback: readonly string[]): string[];
4
+ export declare const DEFAULT_PROMPT_APP_MODULES: readonly ["web", "mobile", "api", "desktop", "extension"];
5
+ export declare const DEFAULT_PROMPT_FEATURE_MODULES: readonly ["db", "auth", "billing", "storage", "native-subscriptions", "electron-updater"];
@@ -0,0 +1,19 @@
1
+ import { APP_MODULES, FEATURE_MODULES, normalizeModuleName } from './cli.js';
2
+ function hasModuleSelection(args) {
3
+ return args.some((arg) => normalizeModuleName(arg.startsWith('--') ? arg.slice(2) : arg) != null);
4
+ }
5
+ export function shouldPromptForInitModules(args, isTTY) {
6
+ return isTTY && !args.includes('--json') && !hasModuleSelection(args);
7
+ }
8
+ export function hasUiSelection(args) {
9
+ return args.some((arg) => arg === '--ui' || arg.startsWith('--ui='));
10
+ }
11
+ export function parsePromptModules(input, fallback) {
12
+ const tokens = input
13
+ .split(/[\s,]+/)
14
+ .map((entry) => entry.trim())
15
+ .filter(Boolean);
16
+ return tokens.length > 0 ? tokens : [...fallback];
17
+ }
18
+ export const DEFAULT_PROMPT_APP_MODULES = APP_MODULES;
19
+ export const DEFAULT_PROMPT_FEATURE_MODULES = FEATURE_MODULES;
@@ -0,0 +1,11 @@
1
+ /** Serialize an arbitrary value as a JavaScript/TypeScript string literal. */
2
+ export declare function jsString(value: string): string;
3
+ /** Escape text placed directly in HTML rather than in a JS string. */
4
+ export declare function htmlText(value: string): string;
5
+ /** Keep generated Markdown headings on one line and prevent heading/code injection. */
6
+ export declare function markdownHeading(value: string): string;
7
+ export declare function assertPackageName(value: string): string;
8
+ /** Derive a valid, deterministic unscoped npm package name from arbitrary text. */
9
+ export declare function packageNameFromText(value: string): string;
10
+ export declare function childPackageName(projectName: string, suffix: string): string;
11
+ export declare function identifierSegment(value: string): string;