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.
- package/CHANGELOG.md +119 -0
- package/CONTRIBUTING.md +73 -0
- package/LICENSE +196 -17
- package/README.md +202 -145
- package/SECURITY.md +37 -0
- package/SKILL.md +244 -0
- package/bin/anhedral.js +1 -1
- package/dist/architecture/contributions.d.ts +28 -0
- package/dist/architecture/contributions.js +125 -0
- package/dist/architecture/index.d.ts +12 -0
- package/dist/architecture/index.js +6 -0
- package/dist/architecture/manifest.d.ts +53 -0
- package/dist/architecture/manifest.js +283 -0
- package/dist/architecture/modules.d.ts +37 -0
- package/dist/architecture/modules.js +184 -0
- package/dist/architecture/plan.d.ts +58 -0
- package/dist/architecture/plan.js +145 -0
- package/dist/architecture/templates.d.ts +10 -0
- package/dist/architecture/templates.js +23 -0
- package/dist/bin.d.ts +2 -0
- package/dist/bin.js +179 -0
- package/dist/cli.d.ts +24 -2
- package/dist/cli.js +189 -21
- package/dist/composers/root.d.ts +6 -0
- package/dist/composers/root.js +35 -0
- package/dist/dependencies.d.ts +31 -9
- package/dist/dependencies.js +227 -60
- package/dist/index.d.ts +8 -2
- package/dist/index.js +5 -31
- package/dist/print.js +15 -0
- package/dist/prompts.d.ts +5 -0
- package/dist/prompts.js +19 -0
- package/dist/render.d.ts +11 -0
- package/dist/render.js +74 -0
- package/dist/scaffold.d.ts +64 -12
- package/dist/scaffold.js +1726 -1150
- package/dist/template-source.d.ts +20 -0
- package/dist/template-source.js +180 -0
- package/dist/templates/api.d.ts +2 -0
- package/dist/templates/api.js +3122 -0
- package/dist/templates/assets-private-proxy.d.ts +3 -0
- package/dist/templates/assets-private-proxy.js +277 -0
- package/dist/templates/desktop.d.ts +2 -0
- package/dist/templates/desktop.js +639 -0
- package/dist/templates/electron-updater.d.ts +3 -0
- package/dist/templates/electron-updater.js +358 -0
- package/dist/templates/extension.d.ts +1 -1
- package/dist/templates/extension.js +322 -248
- package/dist/templates/mobile.d.ts +2 -0
- package/dist/templates/mobile.js +720 -0
- package/dist/templates/shared.d.ts +2 -0
- package/dist/templates/shared.js +520 -0
- package/dist/templates/web.d.ts +2 -0
- package/dist/templates/web.js +412 -0
- package/dist/toolchain.d.ts +0 -8
- package/dist/toolchain.js +0 -21
- package/dist/transaction.d.ts +22 -0
- package/dist/transaction.js +822 -0
- package/dist/ui.d.ts +33 -0
- package/dist/ui.js +199 -0
- package/dist/util.d.ts +1 -5
- package/dist/util.js +70 -159
- package/dist/version.d.ts +2 -0
- package/dist/version.js +2 -0
- package/dist/workspace-config.d.ts +11 -0
- package/dist/workspace-config.js +372 -0
- package/docs/conventions.md +92 -0
- package/docs/master-stack-map.md +192 -0
- package/docs/output-tree-contract.md +482 -0
- package/docs/references/manual-scaffolding.md +403 -0
- package/docs/references/provisioning.md +220 -0
- package/package.json +57 -13
- package/templates/api-fastify/apps/api/tsconfig.json +20 -0
- package/templates/catalog.json +23 -0
- package/templates/db-drizzle/packages/db/tsconfig.json +14 -0
- package/templates/desktop-electron/apps/desktop/tsconfig.json +37 -0
- package/templates/extension-wxt/apps/extension/tsconfig.json +41 -0
- package/templates/mobile-expo/apps/mobile/expo-env.d.ts +1 -0
- package/templates/web-next/apps/web/next-env.d.ts +6 -0
- package/dist/branding.d.ts +0 -5
- package/dist/branding.js +0 -17
- package/dist/commands.d.ts +0 -7
- package/dist/commands.js +0 -24
- package/dist/templates/backend.d.ts +0 -2
- package/dist/templates/backend.js +0 -2115
- package/dist/templates/frontend.d.ts +0 -2
- 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
|
+
}
|
package/dist/dependencies.d.ts
CHANGED
|
@@ -1,37 +1,59 @@
|
|
|
1
|
-
export declare const PACKAGE_MANAGER = "pnpm@10.
|
|
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.
|
|
10
|
-
readonly
|
|
11
|
-
readonly
|
|
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
|
|
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.
|
|
27
|
-
readonly
|
|
28
|
-
readonly
|
|
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
|
};
|
package/dist/dependencies.js
CHANGED
|
@@ -1,17 +1,46 @@
|
|
|
1
|
-
export const PACKAGE_MANAGER = 'pnpm@10.
|
|
2
|
-
export const
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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': '
|
|
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.
|
|
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.
|
|
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
|
|
126
|
+
vitest: '4.1.0',
|
|
103
127
|
// renovate: datasource=npm depName=@vitest/coverage-v8
|
|
104
|
-
'@vitest/coverage-v8': '4.0
|
|
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.
|
|
136
|
+
'@clerk/chrome-extension': '3.1.52',
|
|
122
137
|
// renovate: datasource=npm depName=react
|
|
123
|
-
react: '19.2.
|
|
138
|
+
react: '19.2.7',
|
|
124
139
|
// renovate: datasource=npm depName=react-dom
|
|
125
|
-
'react-dom': '19.2.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
174
|
+
'react-native-purchases': '10.4.2',
|
|
160
175
|
// renovate: datasource=npm depName=react-native-purchases-ui
|
|
161
|
-
'react-native-purchases-ui': '10.
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
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
|
-
|
|
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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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"];
|
package/dist/prompts.js
ADDED
|
@@ -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;
|
package/dist/render.d.ts
ADDED
|
@@ -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;
|