anhedral 0.4.1 → 0.6.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 (85) hide show
  1. package/README.md +29 -256
  2. package/assets/anhedral-cli-init-technical.svg +322 -0
  3. package/assets/anhedral-cli-init.svg +257 -173
  4. package/dist/bin.js +28 -162
  5. package/dist/dependencies.d.ts +7 -56
  6. package/dist/dependencies.js +96 -305
  7. package/dist/index.d.ts +2 -7
  8. package/dist/index.js +1 -4
  9. package/dist/{templates → platforms}/desktop.d.ts +1 -1
  10. package/dist/{templates → platforms}/desktop.js +28 -266
  11. package/dist/{templates → platforms}/extension.d.ts +1 -1
  12. package/dist/platforms/extension.js +401 -0
  13. package/dist/{templates → platforms}/mobile.d.ts +1 -1
  14. package/dist/platforms/mobile.js +232 -0
  15. package/dist/project.d.ts +4 -0
  16. package/dist/project.js +1 -0
  17. package/dist/standard-products.d.ts +2 -0
  18. package/dist/standard-products.js +6 -0
  19. package/dist/standard.d.ts +18 -0
  20. package/dist/standard.js +578 -0
  21. package/dist/version.d.ts +1 -1
  22. package/dist/version.js +1 -1
  23. package/docs/application-stack-standard.md +700 -0
  24. package/package.json +34 -49
  25. package/CHANGELOG.md +0 -132
  26. package/CONTRIBUTING.md +0 -73
  27. package/SECURITY.md +0 -37
  28. package/SKILL.md +0 -244
  29. package/assets/images/svg/ably-symbol-color.svg +0 -8
  30. package/bin/anhedral.js +0 -2
  31. package/dist/architecture/contributions.d.ts +0 -28
  32. package/dist/architecture/contributions.js +0 -125
  33. package/dist/architecture/index.d.ts +0 -12
  34. package/dist/architecture/index.js +0 -6
  35. package/dist/architecture/manifest.d.ts +0 -53
  36. package/dist/architecture/manifest.js +0 -283
  37. package/dist/architecture/modules.d.ts +0 -37
  38. package/dist/architecture/modules.js +0 -184
  39. package/dist/architecture/plan.d.ts +0 -58
  40. package/dist/architecture/plan.js +0 -145
  41. package/dist/architecture/templates.d.ts +0 -10
  42. package/dist/architecture/templates.js +0 -23
  43. package/dist/cli.d.ts +0 -32
  44. package/dist/cli.js +0 -235
  45. package/dist/composers/root.d.ts +0 -6
  46. package/dist/composers/root.js +0 -35
  47. package/dist/print.d.ts +0 -8
  48. package/dist/print.js +0 -48
  49. package/dist/prompts.d.ts +0 -5
  50. package/dist/prompts.js +0 -19
  51. package/dist/scaffold.d.ts +0 -76
  52. package/dist/scaffold.js +0 -1895
  53. package/dist/template-source.d.ts +0 -20
  54. package/dist/template-source.js +0 -180
  55. package/dist/templates/api.d.ts +0 -2
  56. package/dist/templates/api.js +0 -3122
  57. package/dist/templates/assets-private-proxy.d.ts +0 -3
  58. package/dist/templates/assets-private-proxy.js +0 -277
  59. package/dist/templates/electron-updater.d.ts +0 -3
  60. package/dist/templates/electron-updater.js +0 -358
  61. package/dist/templates/extension.js +0 -732
  62. package/dist/templates/mobile.js +0 -720
  63. package/dist/templates/shared.d.ts +0 -2
  64. package/dist/templates/shared.js +0 -520
  65. package/dist/templates/web.d.ts +0 -2
  66. package/dist/templates/web.js +0 -412
  67. package/dist/toolchain.d.ts +0 -3
  68. package/dist/toolchain.js +0 -8
  69. package/dist/ui.d.ts +0 -33
  70. package/dist/ui.js +0 -199
  71. package/dist/workspace-config.d.ts +0 -11
  72. package/dist/workspace-config.js +0 -372
  73. package/docs/conventions.md +0 -92
  74. package/docs/master-stack-map.md +0 -199
  75. package/docs/output-tree-contract.md +0 -482
  76. package/docs/references/manual-scaffolding.md +0 -403
  77. package/docs/references/provisioning.md +0 -220
  78. package/scripts/render-master-stack-map.mjs +0 -510
  79. package/templates/api-fastify/apps/api/tsconfig.json +0 -20
  80. package/templates/catalog.json +0 -23
  81. package/templates/db-drizzle/packages/db/tsconfig.json +0 -14
  82. package/templates/desktop-electron/apps/desktop/tsconfig.json +0 -37
  83. package/templates/extension-wxt/apps/extension/tsconfig.json +0 -41
  84. package/templates/mobile-expo/apps/mobile/expo-env.d.ts +0 -1
  85. package/templates/web-next/apps/web/next-env.d.ts +0 -6
@@ -1,199 +0,0 @@
1
- # Anhedral master stack map
2
-
3
- This is the canonical whole-stack map for Anhedral. It shows the ordered flow
4
- from skill-led planning through deterministic generation, source layout,
5
- connected capabilities, cloud provisioning, command-driven operations, agent
6
- experience, and production verification.
7
-
8
- ![Anhedral master stack diagram](../assets/anhedral-cli-init.svg)
9
-
10
- The diagram is generated from `scripts/render-master-stack-map.mjs`. Change the
11
- content or geometry there, then run `pnpm docs:stack-map`; do not hand-edit the
12
- SVG. The fixed-width map below remains the detailed text and accessibility
13
- reference.
14
-
15
- Read top to bottom. Arrows represent lifecycle order, not runtime network calls.
16
- Runtime and provider connections are stated explicitly inside each stage.
17
-
18
- ```text
19
- +==========================================================================================================================+
20
- | ANHEDRAL MASTER STACK MAP |
21
- +--------------------------------------------------------------------------------------------------------------------------+
22
- |OUTCOME One readable TypeScript codebase and one command surface connecting every application, cloud resource, release |
23
- |path, runbook, and coding agent. |
24
- |PRINCIPLE Ordinary framework code, source ownership, and generated integration boundaries. Anhedral assembles the stack; |
25
- |it is not the application runtime. |
26
- +==========================================================================================================================+
27
- |
28
- v
29
- +==========================================================================================================================+
30
- | 1 SELECT + PLAN |
31
- +--------------------------------------------------------------------------------------------------------------------------+
32
- |SKILL FIRST Install and invoke $anhedral-init. Ask for project name and custom-domain status before generating or |
33
- |provisioning. |
34
- |CREATE anhedral new <directory> | anhedral init EXTEND anhedral add <modules> | anhedral ui add <components> |
35
- |INSPECT anhedral doctor AUTOMATE --dry-run | --json | --verbose | --skip-install |
36
- |SURFACES web | mobile | api | desktop | extension |
37
- |FEATURES db | auth | billing | storage | native-subscriptions | electron-updater |
38
- |UI shadcn/ui for DOM clients | React Native Reusables for Expo | NativeWind or Uniwind |
39
- |CLOSURE auth -> api + db | billing -> auth | storage -> auth | native-subscriptions -> mobile + billing | |
40
- |electron-updater -> desktop |
41
- +==========================================================================================================================+
42
- |
43
- v
44
- +==========================================================================================================================+
45
- | 2 GENERATE SAFELY |
46
- +--------------------------------------------------------------------------------------------------------------------------+
47
- |PIPELINE Resolve modules -> select immutable templates -> verify SHA-256 catalog -> stage files -> compose typed |
48
- |contributions. |
49
- |PIPELINE Run pinned UI providers only in staging -> record provenance and ownership -> atomic commit -> one root pnpm |
50
- |install. |
51
- |REFUSES traversal | symlinks | nested repositories/workspaces | caches | oversized files | unowned collisions | managed |
52
- |drift. |
53
- |OWNERSHIP Product source plus README/PRODUCTION are user-owned | root configuration is mergeable | integration substrate |
54
- |is managed. |
55
- |STATE anhedral.json records modules, versions, template/UI provenance, styling, file hashes, modes, and ownership. |
56
- |WHY Deterministic, inspectable generation and safe incremental adds without replacing user work. |
57
- +==========================================================================================================================+
58
- |
59
- v
60
- +==========================================================================================================================+
61
- | 3 ONE PNPM + TURBOREPO TYPESCRIPT WORKSPACE |
62
- +--------------------------------------------------------------------------------------------------------------------------+
63
- |apps/web Next.js App Router + React + shadcn/ui. WHY: SSR, routing, server-first web, and source-owned UI. |
64
- |apps/mobile Expo Router + React Native Reusables. WHY: one native TypeScript product for iOS and Android. |
65
- |apps/api Fastify + validation/security plugins. WHY: thin routes, services, structured logs, and explicit boundaries. |
66
- |apps/desktop Electron + Vite + sandboxed React renderer. WHY: cross-platform desktop with a narrow privileged bridge. |
67
- |apps/extension WXT + React + MV3 entrypoints. WHY: browser permissions, side panel/background, builds, and packaging. |
68
- |apps/assets-private-proxy Cloudflare Worker + private R2 binding. WHY: controlled GET/HEAD media delivery without bucket |
69
- |listing. |
70
- |apps/desktop-updater-worker Cloudflare Worker + private R2 binding. WHY: custom-domain Electron metadata, ranges, and |
71
- |downloads. |
72
- |packages/contracts Zod schemas. WHY: one validated network contract shared across every boundary. |
73
- |packages/api-client Typed client-safe HTTP. WHY: one request path for web, mobile, desktop, and extension. |
74
- |packages/db Drizzle schema + reviewed SQL migrations. WHY: readable TypeScript schema and explicit release artifacts. |
75
- |packages/realtime Ably client. WHY: scoped invalidation events while clients refetch authoritative state. |
76
- +==========================================================================================================================+
77
- |
78
- v
79
- +==========================================================================================================================+
80
- | 4 CONNECTED PRODUCT CAPABILITIES |
81
- +--------------------------------------------------------------------------------------------------------------------------+
82
- |REQUESTS Zod contract -> service/Drizzle query -> Fastify route -> typed API client -> every selected client. |
83
- |IDENTITY Clerk sessions in clients -> verified server identity; never trust a client-supplied user ID. |
84
- |DATABASE Fastify -> Drizzle -> managed Neon Postgres with isolated dev/preview/production; no generated local Postgres. |
85
- |STORAGE API presigns R2 PUT -> client uploads -> API confirms -> Worker streams confirmed assets or owner-authorized |
86
- |reads. |
87
- |BILLING Expo purchase -> RevenueCat -> signed webhook -> Neon entitlement + transactional outbox. |
88
- |REALTIME Outbox -> scoped Ably event -> every client refetches the authoritative entitlement. |
89
- |DESKTOP UPDATE Signed native build -> artifacts then latest metadata -> private R2 -> updates.<domain> Worker -> |
90
- |electron-updater. |
91
- |SECURITY Server-only secrets | exact CORS | rate limits/headers | Electron isolation | least privilege | private buckets. |
92
- +==========================================================================================================================+
93
- |
94
- v
95
- +==========================================================================================================================+
96
- | 5 PROVISION + CONFIGURE THE CLOUD |
97
- +--------------------------------------------------------------------------------------------------------------------------+
98
- |DOMAIN Buy/confirm domain -> add Cloudflare zone -> preserve mail records -> delegate nameservers -> activate DNSSEC. |
99
- |GITHUB + CI Organization repository, protected environments, pinned Actions, PR checks, branches, and release artifacts. |
100
- |NEON Projects/branches per environment, pooled DATABASE_URL, backups, reviewed migrations, and controlled deploy gates. |
101
- |CLERK Development/production instances, publishable/secret keys, domains, OAuth, redirects, webhooks, native and CRX IDs. |
102
- |CLOUDFLARE Authoritative DNS, private R2 buckets, scoped tokens, CORS/lifecycle, Worker bindings, logs, and custom |
103
- |domains. |
104
- |VERCEL Services deployment for web/API, rewrites, environment scopes, preview/production, cron endpoints, domains, and |
105
- |TLS. |
106
- |REVENUECAT + ABLY Products, offerings, entitlements, store credentials, signed webhook, scoped realtime, and retry cron. |
107
- |EAS + STORES Expo project, credentials, internal builds, TestFlight/Play testing, metadata, privacy, review, and rollout. |
108
- |BROWSER STORE Stable extension ID, least host permissions, OAuth sync, privacy disclosure, trusted testing, and review. |
109
- |DESKTOP Native-OS signing/notarization, electron-builder installers, private update channel, upgrade tests, and rollback. |
110
- |DNS app.<domain> points from Cloudflare DNS to Vercel and stays DNS-only; assets/updates are Cloudflare Worker Custom |
111
- |Domains. |
112
- |AGENT STOPS User handles sign-in/MFA, purchases, secret generation/reveal, destructive confirmations, and final |
113
- |submissions. |
114
- +==========================================================================================================================+
115
- |
116
- v
117
- +==========================================================================================================================+
118
- | 6 GENERATED package.json COMMAND SURFACE |
119
- +--------------------------------------------------------------------------------------------------------------------------+
120
- |WORKSPACE dev | build | typecheck | verify WHY: run and validate exactly the selected monorepo. |
121
- |APP LOOPS dev:web | dev:mobile | dev:api | dev:desktop | dev:extension |
122
- |APP CHECKS verify:web | verify:mobile | verify:api | verify:desktop | verify:extension |
123
- |VERCEL deploy:vercel:{link,preview,production,inspect,domain:inspect} WHY: connect, release, diagnose, and configure DNS. |
124
- |MOBILE mobile:eas:{login,init} | mobile:build:{internal,production}:{ios,android} | mobile:submit:{ios,android} |
125
- |DATABASE neon:{login,project:create} | db:{generate,migrate,check,studio} | verify:db |
126
- |STORAGE r2:{login,bucket:create,cors:list,cors:set} | assets:proxy:{check,dev,deploy} | verify:assets-proxy |
127
- |UPDATES desktop:updates:{cloudflare:login,bucket:create,provision,publish} |
128
- |UPDATES desktop:updates:worker:{check,dev,deploy,types} | desktop:updates:build:{mac,win,linux} | verify:desktop-updates |
129
- |DESKTOP desktop:build | verify:desktop EXTENSION extension:zip | verify:extension |
130
- |STRUCTURE anhedral doctor | add/ui --dry-run WHY: detect drift and preview safe structural changes. |
131
- +==========================================================================================================================+
132
- |
133
- v
134
- +==========================================================================================================================+
135
- | 7 DEVELOPER, AGENT + COMPUTER-USE EXPERIENCE |
136
- +--------------------------------------------------------------------------------------------------------------------------+
137
- |DOCS README.md first run/source map | docs/DEVELOPMENT.md recipes | docs/STACK.md tool map | PRODUCTION.md cloud runbook. |
138
- |CONTROL SKILL.md agent workflow | ANHEDRAL.md ownership notes | anhedral.json source of truth | .env.example inventories. |
139
- |CODING AGENT Ask name/domain -> resolve modules -> generate -> read docs/manifest -> doctor -> provision -> verify -> |
140
- |hand off. |
141
- |SUBAGENTS Lead owns mutations; delegate docs/env inventory, read-only DNS checks, and final verification without secrets. |
142
- |COMPUTER USE Drive provider consoles after user authentication; configure accounts, domains, OAuth, DNS, stores, and |
143
- |rollout. |
144
- |SECRET HANDOFF Stop before Generate/Reveal/Create; name the variable/file; user pastes directly into uncommitted |
145
- |env/provider UI. |
146
- |UI DX Source-owned components, target routing, accessibility, ordinary framework APIs, and no hidden proprietary runtime. |
147
- |OPERATIONS DX Exact root commands, selection-aware docs/scripts, machine-readable plans, provider ledger, and explicit |
148
- |stop gates. |
149
- +==========================================================================================================================+
150
- |
151
- v
152
- +==========================================================================================================================+
153
- | 8 VERIFY, RELEASE + OPERATE |
154
- +--------------------------------------------------------------------------------------------------------------------------+
155
- |LOCAL Smallest package check -> typecheck -> full verify -> build -> doctor; never weaken a failing gate. |
156
- |DATABASE Generate -> review/commit SQL -> drift gate -> controlled migrate -> health/readiness checks. |
157
- |RUNTIME API coverage, auth/CORS, billing replay/order, Ably reconnect, R2 upload/read/range/cache, Worker method/host |
158
- |security. |
159
- |CLIENTS Next build | Expo compatibility/device checks | packaged Electron smoke/upgrade | live WXT MV3 worker in Chrome. |
160
- |INFRA Confirm provider team/resource names, protected env presence, DNS answers, TLS, Vercel health, Worker bindings, and |
161
- |logs. |
162
- |CI Pinned toolchain, strict pnpm policy, allowed build scripts, OSV audit, secret scan, deterministic outputs, and |
163
- |release checks. |
164
- |RELEASES Vercel preview/prod | TestFlight/Play tracks | browser-store trusted/review | signed desktop staged update |
165
- |channel. |
166
- |RECOVERY Transaction rollback, provider backups, database rollback plan, staged/phased rollout, telemetry, and documented |
167
- |owners. |
168
- +==========================================================================================================================+
169
- ```
170
-
171
- ## Runtime connection summary
172
-
173
- ```text
174
- web / mobile / desktop / extension
175
- |
176
- v
177
- packages/api-client
178
- |
179
- v
180
- Fastify API + Zod contracts
181
- | | |
182
- v v v
183
- Clerk identity Neon private R2
184
- |
185
- v
186
- RevenueCat entitlement
187
- |
188
- v
189
- Ably event
190
- |
191
- v
192
- clients refetch state
193
-
194
- signed desktop release -> private update R2 -> updates.<domain> Worker -> electron-updater
195
- ```
196
-
197
- The runtime summary is intentionally smaller than the lifecycle map. It shows
198
- only application data flow; DNS, provisioning, release gates, and agent actions
199
- remain in the master map above.
@@ -1,482 +0,0 @@
1
- # Generated Output-Tree Contract
2
-
3
- <!-- Generated by tests/update-output-tree-contracts.js. Do not edit by hand. -->
4
-
5
- These source-only trees are generated with the stable toolchain and `--skip-install`.
6
- Each contract records every file or symlink path, Unix mode, byte length, and SHA-256 digest.
7
- Installed dependencies, compiler output, and framework caches are forbidden.
8
- Deterministic provider-placeholder `.env.example` files are hashed by the contract; generated real `.env` files are forbidden.
9
-
10
- Runtime E2E builds use disposable operating-system temp directories and are not part of these golden trees.
11
- A generated project may contain only the root `pnpm-workspace.yaml` and root `pnpm-lock.yaml`; nested pnpm workspace islands are rejected.
12
-
13
- Regenerate after an intentional scaffold change:
14
-
15
- ```sh
16
- pnpm build
17
- node tests/update-output-tree-contracts.js
18
- ```
19
-
20
- ## Scenario summary
21
-
22
- | Scenario | Apps | Features | Contract | Entries | Tree SHA-256 |
23
- | --- | --- | --- | --- | ---: | --- |
24
- | `expo-extension` | web, mobile, api, desktop, extension | database, auth, billing, storage, nativeSubscriptions, electronUpdater | deterministic golden | 145 | `bc2ffd2b31666349e9fbf385b5c8e2df520968a6a2ef1eeba9c431f3b1690ed2` |
25
- | `web-api-minimal` | web, api | database, auth | deterministic golden | 65 | `3311e164a5ec03c232dbfeabb35209f9c8206422c1864179d39a65d2d54cf443` |
26
- | `api-only` | api | | deterministic golden | 32 | `3f0c4317a7c3aa06d5e51f7196dc835c6f47ec34c0a4d6daf8d17355a541baaa` |
27
- | `add-desktop-flow` | api, desktop | database, auth | deterministic golden | 67 | `f78d74dc4d32688ebb5b88bbe16bc01f68590254c1799be8b7b18f3566ed8c7a` |
28
-
29
- ## expo-extension
30
-
31
- All app surfaces and feature modules
32
-
33
- ```text
34
- expo-extension-sample/
35
- ├── .env.example
36
- ├── .github/
37
- │ └── workflows/
38
- │ └── anhedral-ci.yml
39
- ├── .gitignore
40
- ├── .vercelignore
41
- ├── ANHEDRAL.md
42
- ├── PRODUCTION.md
43
- ├── README.md
44
- ├── SKILL.md
45
- ├── anhedral.json
46
- ├── apps/
47
- │ ├── api/
48
- │ │ ├── .env.example
49
- │ │ ├── .gitignore
50
- │ │ ├── package.json
51
- │ │ ├── src/
52
- │ │ │ ├── application.ts
53
- │ │ │ ├── auth.ts
54
- │ │ │ ├── billing.ts
55
- │ │ │ ├── env.ts
56
- │ │ │ ├── index.ts
57
- │ │ │ ├── realtime.ts
58
- │ │ │ ├── routes/
59
- │ │ │ │ └── app.ts
60
- │ │ │ ├── routes.ts
61
- │ │ │ └── storage.ts
62
- │ │ ├── tests/
63
- │ │ │ ├── env.test.ts
64
- │ │ │ ├── health.test.ts
65
- │ │ │ ├── revenuecat-webhook.test.ts
66
- │ │ │ └── storage.test.ts
67
- │ │ ├── tsconfig.json
68
- │ │ └── vitest.config.ts
69
- │ ├── assets-private-proxy/
70
- │ │ ├── package.json
71
- │ │ ├── src/
72
- │ │ │ └── index.js
73
- │ │ └── wrangler.jsonc
74
- │ ├── desktop/
75
- │ │ ├── .env.example
76
- │ │ ├── components.json
77
- │ │ ├── electron-builder.env.example
78
- │ │ ├── index.html
79
- │ │ ├── package.json
80
- │ │ ├── postcss.config.mjs
81
- │ │ ├── scripts/
82
- │ │ │ ├── dev.mjs
83
- │ │ │ └── publish-updates.mjs
84
- │ │ ├── src/
85
- │ │ │ ├── main/
86
- │ │ │ │ ├── app-window.ts
87
- │ │ │ │ ├── main.ts
88
- │ │ │ │ └── preload.cts
89
- │ │ │ └── renderer/
90
- │ │ │ ├── components/
91
- │ │ │ │ └── ui/
92
- │ │ │ │ └── button.tsx
93
- │ │ │ ├── hooks/
94
- │ │ │ │ └── use-entitlement.ts
95
- │ │ │ ├── lib/
96
- │ │ │ │ ├── api.ts
97
- │ │ │ │ ├── auth.ts
98
- │ │ │ │ └── utils.ts
99
- │ │ │ ├── main.tsx
100
- │ │ │ └── styles.css
101
- │ │ ├── tsconfig.json
102
- │ │ ├── tsconfig.main.json
103
- │ │ └── vite.config.ts
104
- │ ├── desktop-updater-worker/
105
- │ │ ├── package.json
106
- │ │ ├── src/
107
- │ │ │ └── index.js
108
- │ │ ├── tests/
109
- │ │ │ └── worker.test.js
110
- │ │ └── wrangler.jsonc
111
- │ ├── extension/
112
- │ │ ├── .env.example
113
- │ │ ├── README.md
114
- │ │ ├── components.json
115
- │ │ ├── package.json
116
- │ │ ├── postcss.config.cjs
117
- │ │ ├── src/
118
- │ │ │ ├── components/
119
- │ │ │ │ └── ui/
120
- │ │ │ │ └── button.tsx
121
- │ │ │ ├── contexts/
122
- │ │ │ │ └── auth-context.tsx
123
- │ │ │ ├── entrypoints/
124
- │ │ │ │ ├── background.ts
125
- │ │ │ │ └── sidepanel/
126
- │ │ │ │ ├── app.tsx
127
- │ │ │ │ ├── index.html
128
- │ │ │ │ └── main.tsx
129
- │ │ │ ├── hooks/
130
- │ │ │ │ └── use-entitlement.ts
131
- │ │ │ ├── lib/
132
- │ │ │ │ ├── api.ts
133
- │ │ │ │ └── utils.ts
134
- │ │ │ └── styles/
135
- │ │ │ └── main.css
136
- │ │ ├── tailwind.config.cjs
137
- │ │ ├── tsconfig.json
138
- │ │ └── wxt.config.ts
139
- │ ├── mobile/
140
- │ │ ├── .env.example
141
- │ │ ├── .gitignore
142
- │ │ ├── app/
143
- │ │ │ ├── _layout.tsx
144
- │ │ │ └── index.tsx
145
- │ │ ├── app.json
146
- │ │ ├── babel.config.js
147
- │ │ ├── components/
148
- │ │ │ └── account-controls.tsx
149
- │ │ ├── components.json
150
- │ │ ├── eas.json
151
- │ │ ├── expo-env.d.ts
152
- │ │ ├── global.css
153
- │ │ ├── hooks/
154
- │ │ │ ├── use-api-client.ts
155
- │ │ │ └── use-entitlement.ts
156
- │ │ ├── lib/
157
- │ │ │ ├── api.ts
158
- │ │ │ ├── subscriptions.ts
159
- │ │ │ └── utils.ts
160
- │ │ ├── metro.config.js
161
- │ │ ├── nativewind-env.d.ts
162
- │ │ ├── package.json
163
- │ │ ├── tailwind.config.js
164
- │ │ └── tsconfig.json
165
- │ └── web/
166
- │ ├── .env.example
167
- │ ├── app/
168
- │ │ ├── globals.css
169
- │ │ ├── layout.tsx
170
- │ │ └── page.tsx
171
- │ ├── components/
172
- │ │ ├── account-actions.tsx
173
- │ │ ├── subscription-status.tsx
174
- │ │ └── ui/
175
- │ │ ├── button.tsx
176
- │ │ └── card.tsx
177
- │ ├── components.json
178
- │ ├── hooks/
179
- │ │ ├── use-api-client.ts
180
- │ │ └── use-entitlement.ts
181
- │ ├── lib/
182
- │ │ ├── api.ts
183
- │ │ └── utils.ts
184
- │ ├── next-env.d.ts
185
- │ ├── next.config.ts
186
- │ ├── package.json
187
- │ ├── postcss.config.mjs
188
- │ └── tsconfig.json
189
- ├── cloudflare/
190
- │ ├── README.md
191
- │ ├── desktop-updates.md
192
- │ └── r2-cors.template.json
193
- ├── docs/
194
- │ ├── DEVELOPMENT.md
195
- │ └── STACK.md
196
- ├── package.json
197
- ├── packages/
198
- │ ├── api-client/
199
- │ │ ├── package.json
200
- │ │ ├── src/
201
- │ │ │ ├── app.ts
202
- │ │ │ ├── generated.ts
203
- │ │ │ └── index.ts
204
- │ │ └── tsconfig.json
205
- │ ├── contracts/
206
- │ │ ├── package.json
207
- │ │ ├── src/
208
- │ │ │ ├── app.ts
209
- │ │ │ ├── generated.ts
210
- │ │ │ └── index.ts
211
- │ │ └── tsconfig.json
212
- │ ├── db/
213
- │ │ ├── .env.example
214
- │ │ ├── drizzle.config.ts
215
- │ │ ├── migrations/
216
- │ │ │ └── .gitkeep
217
- │ │ ├── package.json
218
- │ │ ├── src/
219
- │ │ │ ├── app-schema.ts
220
- │ │ │ ├── generated-schema.ts
221
- │ │ │ ├── index.ts
222
- │ │ │ ├── migrate.ts
223
- │ │ │ └── schema.ts
224
- │ │ └── tsconfig.json
225
- │ └── realtime/
226
- │ ├── package.json
227
- │ ├── src/
228
- │ │ └── index.ts
229
- │ └── tsconfig.json
230
- ├── pnpm-workspace.yaml
231
- ├── scripts/
232
- │ └── verify-db-migrations.mjs
233
- ├── turbo.json
234
- └── vercel.json
235
- ```
236
-
237
- ## web-api-minimal
238
-
239
- Next.js, Fastify, database, and auth
240
-
241
- ```text
242
- web-api-minimal/
243
- ├── .env.example
244
- ├── .github/
245
- │ └── workflows/
246
- │ └── anhedral-ci.yml
247
- ├── .gitignore
248
- ├── .vercelignore
249
- ├── ANHEDRAL.md
250
- ├── PRODUCTION.md
251
- ├── README.md
252
- ├── SKILL.md
253
- ├── anhedral.json
254
- ├── apps/
255
- │ ├── api/
256
- │ │ ├── .env.example
257
- │ │ ├── .gitignore
258
- │ │ ├── package.json
259
- │ │ ├── src/
260
- │ │ │ ├── application.ts
261
- │ │ │ ├── auth.ts
262
- │ │ │ ├── env.ts
263
- │ │ │ ├── index.ts
264
- │ │ │ ├── routes/
265
- │ │ │ │ └── app.ts
266
- │ │ │ └── routes.ts
267
- │ │ ├── tests/
268
- │ │ │ ├── env.test.ts
269
- │ │ │ └── health.test.ts
270
- │ │ ├── tsconfig.json
271
- │ │ └── vitest.config.ts
272
- │ └── web/
273
- │ ├── .env.example
274
- │ ├── app/
275
- │ │ ├── globals.css
276
- │ │ ├── layout.tsx
277
- │ │ └── page.tsx
278
- │ ├── components/
279
- │ │ ├── account-actions.tsx
280
- │ │ └── ui/
281
- │ │ ├── button.tsx
282
- │ │ └── card.tsx
283
- │ ├── components.json
284
- │ ├── hooks/
285
- │ │ └── use-api-client.ts
286
- │ ├── lib/
287
- │ │ ├── api.ts
288
- │ │ └── utils.ts
289
- │ ├── next-env.d.ts
290
- │ ├── next.config.ts
291
- │ ├── package.json
292
- │ ├── postcss.config.mjs
293
- │ └── tsconfig.json
294
- ├── docs/
295
- │ ├── DEVELOPMENT.md
296
- │ └── STACK.md
297
- ├── package.json
298
- ├── packages/
299
- │ ├── api-client/
300
- │ │ ├── package.json
301
- │ │ ├── src/
302
- │ │ │ ├── app.ts
303
- │ │ │ ├── generated.ts
304
- │ │ │ └── index.ts
305
- │ │ └── tsconfig.json
306
- │ ├── contracts/
307
- │ │ ├── package.json
308
- │ │ ├── src/
309
- │ │ │ ├── app.ts
310
- │ │ │ ├── generated.ts
311
- │ │ │ └── index.ts
312
- │ │ └── tsconfig.json
313
- │ └── db/
314
- │ ├── .env.example
315
- │ ├── drizzle.config.ts
316
- │ ├── migrations/
317
- │ │ └── .gitkeep
318
- │ ├── package.json
319
- │ ├── src/
320
- │ │ ├── app-schema.ts
321
- │ │ ├── generated-schema.ts
322
- │ │ ├── index.ts
323
- │ │ ├── migrate.ts
324
- │ │ └── schema.ts
325
- │ └── tsconfig.json
326
- ├── pnpm-workspace.yaml
327
- ├── scripts/
328
- │ └── verify-db-migrations.mjs
329
- ├── turbo.json
330
- └── vercel.json
331
- ```
332
-
333
- ## api-only
334
-
335
- Minimal Fastify API without database or auth
336
-
337
- ```text
338
- api-only/
339
- ├── .env.example
340
- ├── .github/
341
- │ └── workflows/
342
- │ └── anhedral-ci.yml
343
- ├── .gitignore
344
- ├── .vercelignore
345
- ├── ANHEDRAL.md
346
- ├── PRODUCTION.md
347
- ├── README.md
348
- ├── SKILL.md
349
- ├── anhedral.json
350
- ├── apps/
351
- │ └── api/
352
- │ ├── .env.example
353
- │ ├── .gitignore
354
- │ ├── package.json
355
- │ ├── src/
356
- │ │ ├── application.ts
357
- │ │ ├── env.ts
358
- │ │ ├── index.ts
359
- │ │ ├── routes/
360
- │ │ │ └── app.ts
361
- │ │ └── routes.ts
362
- │ ├── tests/
363
- │ │ ├── env.test.ts
364
- │ │ └── health.test.ts
365
- │ ├── tsconfig.json
366
- │ └── vitest.config.ts
367
- ├── docs/
368
- │ ├── DEVELOPMENT.md
369
- │ └── STACK.md
370
- ├── package.json
371
- ├── packages/
372
- │ └── contracts/
373
- │ ├── package.json
374
- │ ├── src/
375
- │ │ ├── app.ts
376
- │ │ ├── generated.ts
377
- │ │ └── index.ts
378
- │ └── tsconfig.json
379
- ├── pnpm-workspace.yaml
380
- ├── turbo.json
381
- └── vercel.json
382
- ```
383
-
384
- ## add-desktop-flow
385
-
386
- API-first project with desktop added afterward
387
-
388
- ```text
389
- add-desktop-flow/
390
- ├── .env.example
391
- ├── .github/
392
- │ └── workflows/
393
- │ └── anhedral-ci.yml
394
- ├── .gitignore
395
- ├── .vercelignore
396
- ├── ANHEDRAL.md
397
- ├── PRODUCTION.md
398
- ├── README.md
399
- ├── SKILL.md
400
- ├── anhedral.json
401
- ├── apps/
402
- │ ├── api/
403
- │ │ ├── .env.example
404
- │ │ ├── .gitignore
405
- │ │ ├── package.json
406
- │ │ ├── src/
407
- │ │ │ ├── application.ts
408
- │ │ │ ├── auth.ts
409
- │ │ │ ├── env.ts
410
- │ │ │ ├── index.ts
411
- │ │ │ ├── routes/
412
- │ │ │ │ └── app.ts
413
- │ │ │ └── routes.ts
414
- │ │ ├── tests/
415
- │ │ │ ├── env.test.ts
416
- │ │ │ └── health.test.ts
417
- │ │ ├── tsconfig.json
418
- │ │ └── vitest.config.ts
419
- │ └── desktop/
420
- │ ├── .env.example
421
- │ ├── components.json
422
- │ ├── index.html
423
- │ ├── package.json
424
- │ ├── postcss.config.mjs
425
- │ ├── scripts/
426
- │ │ └── dev.mjs
427
- │ ├── src/
428
- │ │ ├── main/
429
- │ │ │ ├── app-window.ts
430
- │ │ │ ├── main.ts
431
- │ │ │ └── preload.cts
432
- │ │ └── renderer/
433
- │ │ ├── components/
434
- │ │ │ └── ui/
435
- │ │ │ └── button.tsx
436
- │ │ ├── lib/
437
- │ │ │ ├── api.ts
438
- │ │ │ ├── auth.ts
439
- │ │ │ └── utils.ts
440
- │ │ ├── main.tsx
441
- │ │ └── styles.css
442
- │ ├── tsconfig.json
443
- │ ├── tsconfig.main.json
444
- │ └── vite.config.ts
445
- ├── docs/
446
- │ ├── DEVELOPMENT.md
447
- │ └── STACK.md
448
- ├── package.json
449
- ├── packages/
450
- │ ├── api-client/
451
- │ │ ├── package.json
452
- │ │ ├── src/
453
- │ │ │ ├── app.ts
454
- │ │ │ ├── generated.ts
455
- │ │ │ └── index.ts
456
- │ │ └── tsconfig.json
457
- │ ├── contracts/
458
- │ │ ├── package.json
459
- │ │ ├── src/
460
- │ │ │ ├── app.ts
461
- │ │ │ ├── generated.ts
462
- │ │ │ └── index.ts
463
- │ │ └── tsconfig.json
464
- │ └── db/
465
- │ ├── .env.example
466
- │ ├── drizzle.config.ts
467
- │ ├── migrations/
468
- │ │ └── .gitkeep
469
- │ ├── package.json
470
- │ ├── src/
471
- │ │ ├── app-schema.ts
472
- │ │ ├── generated-schema.ts
473
- │ │ ├── index.ts
474
- │ │ ├── migrate.ts
475
- │ │ └── schema.ts
476
- │ └── tsconfig.json
477
- ├── pnpm-workspace.yaml
478
- ├── scripts/
479
- │ └── verify-db-migrations.mjs
480
- ├── turbo.json
481
- └── vercel.json
482
- ```