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
package/package.json CHANGED
@@ -1,55 +1,99 @@
1
1
  {
2
2
  "name": "anhedral",
3
- "version": "0.1.10",
4
- "description": "Opinionated init CLI for Expo, Fastify, WXT, shared packages, Neon, Drizzle, Clerk, RevenueCat, Stripe, R2, and Vercel.",
3
+ "version": "0.4.0",
4
+ "description": "Generate a complete, readable TypeScript product stack with Next.js, Expo, Fastify, Neon, Drizzle, Clerk, R2, Electron updates, WXT, and Vercel.",
5
5
  "type": "module",
6
+ "exports": {
7
+ ".": {
8
+ "types": "./dist/index.d.ts",
9
+ "import": "./dist/index.js"
10
+ }
11
+ },
12
+ "types": "./dist/index.d.ts",
13
+ "sideEffects": false,
6
14
  "bin": {
7
15
  "anhedral": "bin/anhedral.js"
8
16
  },
9
17
  "files": [
10
18
  "bin",
11
19
  "dist",
20
+ "docs/conventions.md",
21
+ "docs/master-stack-map.md",
22
+ "docs/output-tree-contract.md",
23
+ "docs/references",
24
+ "templates",
25
+ "SKILL.md",
26
+ "CHANGELOG.md",
27
+ "CONTRIBUTING.md",
12
28
  "LICENSE",
13
29
  "README.md",
30
+ "SECURITY.md",
14
31
  "anhedral.svg",
15
32
  "favicon.ico"
16
33
  ],
34
+ "homepage": "https://github.com/anhedral/anhedral-init#readme",
17
35
  "repository": {
18
36
  "type": "git",
19
37
  "url": "git+https://github.com/anhedral/anhedral-init.git"
20
38
  },
21
- "homepage": "https://github.com/anhedral/anhedral-init#readme",
22
39
  "bugs": {
23
40
  "url": "https://github.com/anhedral/anhedral-init/issues"
24
41
  },
42
+ "author": "Anhedral, Inc.",
25
43
  "publishConfig": {
26
44
  "access": "public"
27
45
  },
28
46
  "engines": {
29
- "node": ">=20.0.0"
47
+ "node": "^20.19.0 || >=22.12.0"
30
48
  },
31
49
  "scripts": {
32
- "scaffold": "node dist/index.js init",
33
- "build": "tsc",
50
+ "scaffold": "node dist/bin.js init",
51
+ "clean": "node scripts/clean.mjs",
52
+ "build": "pnpm clean && tsc",
34
53
  "prepare": "pnpm build",
35
54
  "typecheck": "tsc --noEmit",
55
+ "check:hygiene": "node scripts/check-source-hygiene.mjs",
56
+ "check:security": "node scripts/check-security-policy.mjs",
57
+ "check:release-policy": "node scripts/check-release-policy.mjs",
58
+ "check:release-secrets": "node scripts/check-release-secrets.mjs",
59
+ "lint": "pnpm typecheck && pnpm check:hygiene && pnpm check:release-policy",
60
+ "audit:osv": "pnpm build && node scripts/audit-osv.mjs --generator",
36
61
  "test": "pnpm test:cli",
62
+ "test:coverage": "pnpm build && c8 --all --include='dist/**/*.js' --reporter=text --reporter=json-summary --check-coverage --lines 84 --statements 84 --functions 84 --branches 80 node tests/test-cli.js",
37
63
  "pretest": "pnpm build",
38
64
  "prepublishOnly": "pnpm test:all",
39
65
  "test:cli": "node tests/test-cli.js",
40
66
  "test:cli:validation": "node tests/test-cli-validation.js",
41
67
  "test:deps": "pnpm build && node tests/test-dependency-manifest.js",
68
+ "test:vercel-schema": "pnpm build && node tests/test-vercel-services-schema.js",
69
+ "test:pack": "pnpm build && node tests/test-packed-cli.js",
70
+ "test:pack:exact": "node tests/test-packed-cli.js release-artifact/metadata.json",
71
+ "test:packlist": "pnpm build && node tests/test-packlist.js",
72
+ "test:release-tooling": "node tests/test-release-tooling.js",
73
+ "test:topologies": "pnpm build && node tests/test-module-topology-invariants.js",
74
+ "test:templates": "pnpm build && node tests/test-template-source.js",
75
+ "pretest:e2e": "pnpm build",
42
76
  "test:e2e": "node tests/test-e2e-public-stacks.js",
77
+ "pretest:e2e:latest": "pnpm build",
43
78
  "test:e2e:latest": "node tests/test-e2e-public-stacks.js --toolchain latest",
44
- "test:all": "pnpm test && pnpm test:deps && pnpm test:e2e",
45
- "release:check": "pnpm test:all && npm pack --dry-run",
79
+ "test:acceptance:desktop": "pnpm build && node tests/test-runtime-acceptance.js desktop",
80
+ "test:acceptance:extension": "pnpm build && node tests/test-runtime-acceptance.js extension",
81
+ "test:acceptance:mobile": "pnpm build && node tests/test-runtime-acceptance.js mobile",
82
+ "test:all": "pnpm lint && pnpm check:security && pnpm audit:osv && pnpm test:coverage && pnpm test:deps && pnpm test:templates && pnpm test:vercel-schema && pnpm test:pack && pnpm test:packlist && pnpm test:e2e",
83
+ "release:check": "pnpm check:release-policy && pnpm test:all && npm pack --dry-run --ignore-scripts",
84
+ "release:pack": "pnpm build && node scripts/create-release-artifact.mjs && node scripts/check-release-secrets.mjs release-artifact/metadata.json",
85
+ "release:artifact:verify": "node scripts/verify-release-artifact.mjs release-artifact/metadata.json && node scripts/check-release-secrets.mjs release-artifact/metadata.json",
86
+ "release:artifact:smoke": "node tests/test-packed-cli.js release-artifact/metadata.json",
46
87
  "demo:refresh": "pnpm build && node tests/refresh-demo.js"
47
88
  },
48
89
  "keywords": [
49
90
  "cli",
50
91
  "scaffold",
92
+ "typescript",
93
+ "nextjs",
51
94
  "fastify",
52
95
  "expo",
96
+ "electron",
53
97
  "clerk",
54
98
  "drizzle",
55
99
  "neondb",
@@ -57,11 +101,11 @@
57
101
  "wxt",
58
102
  "vercel"
59
103
  ],
60
- "license": "MIT",
61
- "packageManager": "pnpm@10.15.1",
104
+ "license": "Apache-2.0",
105
+ "packageManager": "pnpm@10.34.5",
62
106
  "devDependencies": {
63
- "@types/node": "^24.5.2",
64
- "tsx": "^4.20.5",
65
- "typescript": "^5.9.2"
107
+ "@types/node": "20.19.43",
108
+ "c8": "11.0.0",
109
+ "typescript": "5.9.3"
66
110
  }
67
111
  }
@@ -0,0 +1,20 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ESNext",
4
+ "module": "ESNext",
5
+ "moduleResolution": "Bundler",
6
+ "strict": true,
7
+ "noUncheckedIndexedAccess": true,
8
+ "skipLibCheck": true,
9
+ "noEmit": true,
10
+ "types": [
11
+ "node"
12
+ ],
13
+ "verbatimModuleSyntax": true,
14
+ "isolatedModules": true
15
+ },
16
+ "include": [
17
+ "src/**/*",
18
+ "tests/**/*"
19
+ ]
20
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "version": 1,
3
+ "templates": {
4
+ "api-fastify": {
5
+ "sha256": "7ec1b5fffa1a53405fc55238d09c013ace048986afcefe3a653322f060688e51"
6
+ },
7
+ "db-drizzle": {
8
+ "sha256": "5d141a4982d7a97aba5ffc0977c871761b15507ec1694f6e841a53416e1bdbd1"
9
+ },
10
+ "desktop-electron": {
11
+ "sha256": "2aa217fa7ce1031aea3e87f5d522628998d7bca90e11c74c18064209f6e479e1"
12
+ },
13
+ "extension-wxt": {
14
+ "sha256": "1832bd1c9d83b74326c70448f88da29eb8f1cfd5863eb51f9b9d6e3efd81a75b"
15
+ },
16
+ "mobile-expo": {
17
+ "sha256": "d63c4645953d4dbd60bd6ea82f43053a1ba644544eaed6145754fb0fc873c4fc"
18
+ },
19
+ "web-next": {
20
+ "sha256": "96b9d5decd26c7a417d08fec33a62cce42040b68f45633c731da13eb9b29def6"
21
+ }
22
+ }
23
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ESNext",
4
+ "module": "ESNext",
5
+ "moduleResolution": "Bundler",
6
+ "strict": true,
7
+ "noUncheckedIndexedAccess": true,
8
+ "skipLibCheck": true,
9
+ "noEmit": true
10
+ },
11
+ "include": [
12
+ "src/**/*"
13
+ ]
14
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "useDefineForClassFields": true,
5
+ "lib": [
6
+ "DOM",
7
+ "DOM.Iterable",
8
+ "ES2022"
9
+ ],
10
+ "allowJs": false,
11
+ "skipLibCheck": true,
12
+ "esModuleInterop": true,
13
+ "allowSyntheticDefaultImports": true,
14
+ "strict": true,
15
+ "forceConsistentCasingInFileNames": true,
16
+ "module": "ESNext",
17
+ "moduleResolution": "Bundler",
18
+ "resolveJsonModule": true,
19
+ "isolatedModules": true,
20
+ "noEmit": true,
21
+ "jsx": "react-jsx",
22
+ "types": [
23
+ "node",
24
+ "vite/client"
25
+ ],
26
+ "paths": {
27
+ "@/*": [
28
+ "./src/renderer/*"
29
+ ]
30
+ }
31
+ },
32
+ "include": [
33
+ "src/**/*",
34
+ "vite.config.ts"
35
+ ],
36
+ "references": []
37
+ }
@@ -0,0 +1,41 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ESNext",
4
+ "module": "ESNext",
5
+ "moduleResolution": "Bundler",
6
+ "strict": true,
7
+ "esModuleInterop": true,
8
+ "skipLibCheck": true,
9
+ "forceConsistentCasingInFileNames": true,
10
+ "resolveJsonModule": true,
11
+ "isolatedModules": true,
12
+ "allowImportingTsExtensions": true,
13
+ "noEmit": true,
14
+ "jsx": "react-jsx",
15
+ "lib": [
16
+ "DOM",
17
+ "DOM.Iterable",
18
+ "ESNext"
19
+ ],
20
+ "types": [
21
+ "wxt/browser",
22
+ "@wxt-dev/module-react",
23
+ "chrome"
24
+ ],
25
+ "paths": {
26
+ "@/*": [
27
+ "./src/*"
28
+ ]
29
+ }
30
+ },
31
+ "include": [
32
+ "**/*.ts",
33
+ "**/*.tsx",
34
+ ".wxt/wxt.d.ts"
35
+ ],
36
+ "exclude": [
37
+ "node_modules",
38
+ ".output",
39
+ "dist"
40
+ ]
41
+ }
@@ -0,0 +1 @@
1
+ /// <reference types="expo/types" />
@@ -0,0 +1,6 @@
1
+ /// <reference types="next" />
2
+ /// <reference types="next/image-types/global" />
3
+ import "./.next/types/routes.d.ts";
4
+
5
+ // NOTE: This file should not be edited
6
+ // see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
@@ -1,5 +0,0 @@
1
- export declare const ANHEDRAL_LOGO_FILE_NAME = "anhedral.svg";
2
- export declare const ANHEDRAL_LOGO_PUBLIC_PATH = "/anhedral.svg";
3
- export declare const ANHEDRAL_FAVICON_FILE_NAME = "favicon.ico";
4
- export declare function writeAnhedralLogo(root: string): void;
5
- export declare function writeAnhedralWebBranding(root: string): void;
package/dist/branding.js DELETED
@@ -1,17 +0,0 @@
1
- import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
2
- import path from 'node:path';
3
- import { writeFile } from './util.js';
4
- export const ANHEDRAL_LOGO_FILE_NAME = 'anhedral.svg';
5
- export const ANHEDRAL_LOGO_PUBLIC_PATH = `/${ANHEDRAL_LOGO_FILE_NAME}`;
6
- export const ANHEDRAL_FAVICON_FILE_NAME = 'favicon.ico';
7
- const ANHEDRAL_LOGO_SVG = readFileSync(new URL('../anhedral.svg', import.meta.url), 'utf8');
8
- const ANHEDRAL_FAVICON = readFileSync(new URL(`../${ANHEDRAL_FAVICON_FILE_NAME}`, import.meta.url));
9
- export function writeAnhedralLogo(root) {
10
- writeFile(path.join(root, 'public', ANHEDRAL_LOGO_FILE_NAME), ANHEDRAL_LOGO_SVG);
11
- }
12
- export function writeAnhedralWebBranding(root) {
13
- writeAnhedralLogo(root);
14
- const faviconPath = path.join(root, 'app', ANHEDRAL_FAVICON_FILE_NAME);
15
- mkdirSync(path.dirname(faviconPath), { recursive: true });
16
- writeFileSync(faviconPath, ANHEDRAL_FAVICON);
17
- }
@@ -1,7 +0,0 @@
1
- export type ScaffoldCommand = {
2
- cmd: string;
3
- command: string;
4
- args: string[];
5
- };
6
- export declare function getBackendInstallCommands(): ScaffoldCommand[];
7
- export declare function getSkillCommands(): string[];
package/dist/commands.js DELETED
@@ -1,24 +0,0 @@
1
- import { BACKEND_DEPENDENCIES, withVersions } from './dependencies.js';
2
- export function getBackendInstallCommands() {
3
- const dependencies = withVersions(BACKEND_DEPENDENCIES.dependencies ?? {});
4
- const devDependencies = withVersions(BACKEND_DEPENDENCIES.devDependencies ?? {});
5
- return [
6
- {
7
- cmd: `pnpm add ${dependencies.join(' ')}`,
8
- command: 'pnpm',
9
- args: ['add', ...dependencies],
10
- },
11
- {
12
- cmd: `pnpm add -D ${devDependencies.join(' ')}`,
13
- command: 'pnpm',
14
- args: ['add', '-D', ...devDependencies],
15
- },
16
- ];
17
- }
18
- export function getSkillCommands() {
19
- return [
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',
22
- 'pnpm dlx skills add https://github.com/stripe/ai --skill stripe-best-practices',
23
- ];
24
- }
@@ -1,2 +0,0 @@
1
- import type { ProjectOptions } from '../scaffold.js';
2
- export declare function scaffoldBackend(root: string, { projectName, displayName, frontendUrl, skipInstall }: ProjectOptions): Promise<void>;