anhedral 0.8.6 → 0.9.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/README.md +141 -38
- package/assets/anhedral-cli-init-technical.svg +15 -15
- package/assets/anhedral-cli-init.svg +16 -16
- package/dist/access.d.ts +10 -0
- package/dist/access.js +93 -0
- package/dist/auth-schema-snapshot.d.ts +346 -0
- package/dist/auth-schema-snapshot.js +347 -0
- package/dist/auth-schema.d.ts +1 -0
- package/dist/auth-schema.js +57 -0
- package/dist/bin.js +345 -39
- package/dist/bounded-file.d.ts +2 -0
- package/dist/bounded-file.js +30 -0
- package/dist/capabilities.d.ts +24 -42
- package/dist/capabilities.js +73 -75
- package/dist/cloudflare.d.ts +14 -0
- package/dist/cloudflare.js +66 -0
- package/dist/command.js +12 -3
- package/dist/delivery.d.ts +118 -0
- package/dist/delivery.js +611 -0
- package/dist/dependencies.d.ts +24 -3
- package/dist/dependencies.js +112 -74
- package/dist/dependency-order.d.ts +2 -0
- package/dist/dependency-order.js +24 -0
- package/dist/index.d.ts +18 -3
- package/dist/index.js +12 -2
- package/dist/managed-hosting.d.ts +49 -0
- package/dist/managed-hosting.js +373 -0
- package/dist/management.d.ts +3 -0
- package/dist/management.js +47 -0
- package/dist/platforms/desktop.d.ts +2 -2
- package/dist/platforms/desktop.js +25 -15
- package/dist/platforms/extension.d.ts +2 -2
- package/dist/platforms/extension.js +104 -66
- package/dist/platforms/mobile.d.ts +2 -2
- package/dist/platforms/mobile.js +13 -7
- package/dist/pnpm-policy.d.ts +0 -2
- package/dist/pnpm-policy.js +18 -13
- package/dist/project-state.d.ts +28 -0
- package/dist/project-state.js +226 -0
- package/dist/provider-readiness.d.ts +30 -0
- package/dist/provider-readiness.js +87 -0
- package/dist/provision.d.ts +46 -0
- package/dist/provision.js +197 -0
- package/dist/readiness.d.ts +4 -2
- package/dist/readiness.js +81 -14
- package/dist/registry/add.d.ts +22 -0
- package/dist/registry/add.js +198 -0
- package/dist/registry/bootstrap.d.ts +2 -0
- package/dist/registry/bootstrap.js +14 -0
- package/dist/registry/commands.d.ts +2 -0
- package/dist/registry/commands.js +99 -0
- package/dist/registry/context.d.ts +3 -0
- package/dist/registry/context.js +21 -0
- package/dist/registry/options.d.ts +2 -0
- package/dist/registry/options.js +65 -0
- package/dist/registry/receipt.d.ts +3 -0
- package/dist/registry/receipt.js +73 -0
- package/dist/registry/remote.d.ts +25 -0
- package/dist/registry/remote.js +168 -0
- package/dist/registry/resolve.d.ts +10 -0
- package/dist/registry/resolve.js +98 -0
- package/dist/registry/types.d.ts +64 -0
- package/dist/registry/usage.d.ts +1 -0
- package/dist/registry/usage.js +38 -0
- package/dist/render.d.ts +0 -4
- package/dist/render.js +3 -16
- package/dist/repository.d.ts +24 -0
- package/dist/repository.js +96 -0
- package/dist/scaffold/api.d.ts +2 -0
- package/dist/scaffold/api.js +13 -0
- package/dist/scaffold/auth.d.ts +3 -0
- package/dist/scaffold/auth.js +95 -0
- package/dist/scaffold/bootstrap.d.ts +2 -0
- package/dist/scaffold/bootstrap.js +34 -0
- package/dist/scaffold/compose.d.ts +4 -0
- package/dist/scaffold/compose.js +34 -0
- package/dist/scaffold/database.d.ts +2 -0
- package/dist/scaffold/database.js +43 -0
- package/dist/scaffold/documentation.d.ts +3 -0
- package/dist/scaffold/documentation.js +91 -0
- package/dist/scaffold/environment.d.ts +2 -0
- package/dist/scaffold/environment.js +5 -0
- package/dist/scaffold/files.d.ts +25 -0
- package/dist/scaffold/files.js +108 -0
- package/dist/scaffold/integrations.d.ts +3 -0
- package/dist/scaffold/integrations.js +7 -0
- package/dist/scaffold/services.d.ts +5 -0
- package/dist/scaffold/services.js +84 -0
- package/dist/scaffold/web.d.ts +2 -0
- package/dist/scaffold/web.js +102 -0
- package/dist/scaffold/workspace.d.ts +3 -0
- package/dist/scaffold/workspace.js +150 -0
- package/dist/security-backports.js +7 -2
- package/dist/stack-registry.d.ts +80 -0
- package/dist/stack-registry.js +424 -0
- package/dist/standard.d.ts +6 -19
- package/dist/standard.js +46 -653
- package/dist/transaction.js +47 -56
- package/dist/util.js +12 -2
- package/dist/vercel.d.ts +98 -0
- package/dist/vercel.js +796 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/vinext.d.ts +1 -0
- package/dist/vinext.js +83 -0
- package/dist/workspace-graph.d.ts +7 -0
- package/dist/workspace-graph.js +73 -0
- package/docs/application-stack-standard.md +76 -91
- package/docs/delivery-workflow.md +83 -0
- package/docs/managed-hosting-architecture.md +87 -0
- package/docs/sponsorships.md +25 -0
- package/package.json +23 -29
- package/dist/evidence-validation.d.ts +0 -2
- package/dist/evidence-validation.js +0 -18
- package/dist/foundation.d.ts +0 -6
- package/dist/foundation.js +0 -49
- package/dist/progress-view.d.ts +0 -57
- package/dist/progress-view.js +0 -69
- package/dist/progress.d.ts +0 -95
- package/dist/progress.js +0 -327
- package/dist/project.d.ts +0 -5
- package/dist/standard-products.d.ts +0 -2
- package/dist/standard-products.js +0 -6
- /package/assets/{images/svg/logo-white-subtract.svg → anhedral-mark.svg} +0 -0
- /package/dist/{project.js → registry/types.js} +0 -0
package/dist/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const GENERATOR_VERSION = "0.
|
|
1
|
+
export declare const GENERATOR_VERSION = "0.9.0";
|
package/dist/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const GENERATOR_VERSION = '0.
|
|
1
|
+
export const GENERATOR_VERSION = '0.9.0';
|
package/dist/vinext.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function configureVinext(root: string, workerName: string, bindings: Record<string, unknown>): void;
|
package/dist/vinext.js
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { existsSync, readFileSync, rmSync } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { writeFile } from './util.js';
|
|
4
|
+
// Official Vinext App Router integration using the supported Wrangler/Vite adapter.
|
|
5
|
+
// Wrangler's generated dist/server config preserves binding IDs and built assets.
|
|
6
|
+
export function configureVinext(root, workerName, bindings) {
|
|
7
|
+
const put = (file, value) => writeFile(path.join(root, 'apps/web', file), value);
|
|
8
|
+
const pkg = JSON.parse(readFileSync(path.join(root, 'apps/web/package.json'), 'utf8'));
|
|
9
|
+
delete pkg.dependencies?.['@opennextjs/cloudflare'];
|
|
10
|
+
pkg.type = 'module';
|
|
11
|
+
pkg.dependencies = {
|
|
12
|
+
...pkg.dependencies,
|
|
13
|
+
vinext: '1.1.0',
|
|
14
|
+
next: '16.4.0',
|
|
15
|
+
react: '19.2.8',
|
|
16
|
+
'react-dom': '19.2.8',
|
|
17
|
+
'react-server-dom-webpack': '19.2.8',
|
|
18
|
+
};
|
|
19
|
+
pkg.devDependencies = {
|
|
20
|
+
...pkg.devDependencies,
|
|
21
|
+
vite: '8.3.4',
|
|
22
|
+
'@cloudflare/vite-plugin': '1.63.1',
|
|
23
|
+
'@vitejs/plugin-rsc': '0.5.36',
|
|
24
|
+
'@vitejs/plugin-react': '6.1.2',
|
|
25
|
+
wrangler: '4.149.0',
|
|
26
|
+
};
|
|
27
|
+
pkg.scripts = {
|
|
28
|
+
...pkg.scripts,
|
|
29
|
+
dev: 'vite dev --host 127.0.0.1 --port 3000',
|
|
30
|
+
build: 'vite build',
|
|
31
|
+
start: 'vinext start',
|
|
32
|
+
preview: 'wrangler dev --config dist/server/wrangler.json --persist-to .wrangler/state',
|
|
33
|
+
deploy: 'vite build && wrangler deploy --config dist/server/wrangler.json',
|
|
34
|
+
'build:worker': 'vite build',
|
|
35
|
+
typecheck: 'wrangler types --env-interface CloudflareEnv cloudflare-env.d.ts && tsc --noEmit',
|
|
36
|
+
};
|
|
37
|
+
put('package.json', JSON.stringify(pkg, null, 2) + '\n');
|
|
38
|
+
put('vite.config.ts', `import { defineConfig } from 'vite';
|
|
39
|
+
import vinext from 'vinext';
|
|
40
|
+
import { cloudflare } from '@cloudflare/vite-plugin';
|
|
41
|
+
export default defineConfig({ plugins: [vinext(), cloudflare({ viteEnvironment: { name: 'rsc', childEnvironments: ['ssr'] } })] });
|
|
42
|
+
`);
|
|
43
|
+
put('wrangler.jsonc', JSON.stringify({
|
|
44
|
+
$schema: 'node_modules/wrangler/config-schema.json',
|
|
45
|
+
name: workerName,
|
|
46
|
+
main: 'vinext/server/fetch-handler',
|
|
47
|
+
compatibility_date: '2026-10-05',
|
|
48
|
+
compatibility_flags: ['nodejs_compat'],
|
|
49
|
+
assets: { binding: 'ASSETS', not_found_handling: 'none' },
|
|
50
|
+
observability: { enabled: true },
|
|
51
|
+
...bindings,
|
|
52
|
+
}, null, 2) + '\n');
|
|
53
|
+
put('next.config.ts', `import type { NextConfig } from 'next';
|
|
54
|
+
const config: NextConfig = { transpilePackages: ['@workspace/ui'] };
|
|
55
|
+
export default config;
|
|
56
|
+
`);
|
|
57
|
+
for (const file of [
|
|
58
|
+
'next.config.js',
|
|
59
|
+
'next.config.mjs',
|
|
60
|
+
'open-next.config.ts',
|
|
61
|
+
'vercel.json',
|
|
62
|
+
'next-env.d.ts',
|
|
63
|
+
])
|
|
64
|
+
rmSync(path.join(root, 'apps/web', file), { force: true });
|
|
65
|
+
const tsFile = path.join(root, 'apps/web/tsconfig.json');
|
|
66
|
+
if (existsSync(tsFile)) {
|
|
67
|
+
const ts = JSON.parse(readFileSync(tsFile, 'utf8'));
|
|
68
|
+
delete ts.compilerOptions?.plugins;
|
|
69
|
+
// Respect the UI package exports (globals.css lives in src/styles, not src).
|
|
70
|
+
if (ts.compilerOptions?.paths)
|
|
71
|
+
delete ts.compilerOptions.paths['@workspace/ui/*'];
|
|
72
|
+
ts.include = ['**/*.ts', '**/*.tsx', '**/*.mts'];
|
|
73
|
+
put('tsconfig.json', JSON.stringify(ts, null, 2) + '\n');
|
|
74
|
+
}
|
|
75
|
+
put('vinext-env.d.ts', '/// <reference types="vinext/types" />\n/// <reference types="vite/client" />\n');
|
|
76
|
+
put('.dev.vars.example', '# Worker secrets are local-only and ignored by Git.\n');
|
|
77
|
+
const uiFile = path.join(root, 'packages/ui/package.json');
|
|
78
|
+
if (existsSync(uiFile)) {
|
|
79
|
+
const ui = JSON.parse(readFileSync(uiFile, 'utf8'));
|
|
80
|
+
ui.dependencies = { ...ui.dependencies, react: '19.2.8', 'react-dom': '19.2.8' };
|
|
81
|
+
writeFile(uiFile, JSON.stringify(ui, null, 2) + '\n');
|
|
82
|
+
}
|
|
83
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { existsSync, lstatSync, readFileSync, readdirSync } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { dependencyOrder } from './dependency-order.js';
|
|
4
|
+
const dependencyFields = [
|
|
5
|
+
'dependencies',
|
|
6
|
+
'devDependencies',
|
|
7
|
+
'peerDependencies',
|
|
8
|
+
'optionalDependencies',
|
|
9
|
+
];
|
|
10
|
+
function readManifest(file, directory) {
|
|
11
|
+
if (!existsSync(file))
|
|
12
|
+
throw new Error(`Workspace manifest missing: ${directory}.`);
|
|
13
|
+
if (lstatSync(file).isSymbolicLink())
|
|
14
|
+
throw new Error(`Workspace symlinks are unsupported: ${directory}/package.json.`);
|
|
15
|
+
const value = JSON.parse(readFileSync(file, 'utf8'));
|
|
16
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
17
|
+
throw new Error(`Invalid workspace manifest: ${directory}.`);
|
|
18
|
+
const manifest = value;
|
|
19
|
+
if (typeof manifest.name !== 'string' || !manifest.name)
|
|
20
|
+
throw new Error(`Workspace name missing: ${directory}.`);
|
|
21
|
+
for (const field of dependencyFields) {
|
|
22
|
+
const dependencies = manifest[field];
|
|
23
|
+
if (dependencies === undefined)
|
|
24
|
+
continue;
|
|
25
|
+
if (!dependencies ||
|
|
26
|
+
typeof dependencies !== 'object' ||
|
|
27
|
+
Array.isArray(dependencies) ||
|
|
28
|
+
Object.values(dependencies).some((version) => typeof version !== 'string'))
|
|
29
|
+
throw new Error(`Invalid workspace dependencies: ${directory}/${field}.`);
|
|
30
|
+
}
|
|
31
|
+
return manifest;
|
|
32
|
+
}
|
|
33
|
+
/** Validate manifests and references, then traverse the indexed dependency graph. */
|
|
34
|
+
export function inspectWorkspaceGraph(root) {
|
|
35
|
+
const packages = new Map();
|
|
36
|
+
for (const group of ['apps', 'packages']) {
|
|
37
|
+
const parent = path.join(root, group);
|
|
38
|
+
if (!existsSync(parent))
|
|
39
|
+
continue;
|
|
40
|
+
if (lstatSync(parent).isSymbolicLink())
|
|
41
|
+
throw new Error(`Workspace symlinks are unsupported: ${group}.`);
|
|
42
|
+
for (const entry of readdirSync(parent, { withFileTypes: true })) {
|
|
43
|
+
const directory = `${group}/${entry.name}`;
|
|
44
|
+
if (entry.isSymbolicLink())
|
|
45
|
+
throw new Error(`Workspace symlinks are unsupported: ${directory}.`);
|
|
46
|
+
if (!entry.isDirectory())
|
|
47
|
+
continue;
|
|
48
|
+
const manifest = readManifest(path.join(root, directory, 'package.json'), directory);
|
|
49
|
+
if (packages.has(manifest.name))
|
|
50
|
+
throw new Error(`Duplicate workspace package: ${manifest.name}.`);
|
|
51
|
+
packages.set(manifest.name, { directory, manifest });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
const graph = [...packages]
|
|
55
|
+
.map(([name, { directory, manifest }]) => {
|
|
56
|
+
const dependencies = new Set();
|
|
57
|
+
for (const field of dependencyFields) {
|
|
58
|
+
for (const [dependency, version] of Object.entries(manifest[field] ?? {})) {
|
|
59
|
+
if (!version.startsWith('workspace:'))
|
|
60
|
+
continue;
|
|
61
|
+
if (!['workspace:*', 'workspace:^', 'workspace:~'].includes(version))
|
|
62
|
+
throw new Error(`Unsupported workspace reference ${name} -> ${dependency}: ${version}.`);
|
|
63
|
+
if (!packages.has(dependency))
|
|
64
|
+
throw new Error(`Missing workspace dependency: ${name} -> ${dependency}.`);
|
|
65
|
+
dependencies.add(dependency);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return { name, directory, dependencies: [...dependencies].sort() };
|
|
69
|
+
})
|
|
70
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
71
|
+
dependencyOrder(new Map(graph.map((node) => [node.name, node.dependencies])), 'Workspace');
|
|
72
|
+
return graph;
|
|
73
|
+
}
|
|
@@ -1,119 +1,104 @@
|
|
|
1
1
|
# Anhedral Application Stack & Delivery Standard
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Anhedral builds client-owned applications using established frameworks and provider tools. Default web apps use Vinext, React, TypeScript, Tailwind, shadcn/ui and Lucide on Cloudflare Workers. Native Next.js on Vercel is the established alternative. React is the UI layer within these full-stack frameworks, not a standalone web-app recipe. Add components only when the product needs them, prefer free-first plans where suitable, and keep source, accounts, data, billing and recovery customer-owned.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Respect existing account, budget, audience and release authorization. Request only missing approval for paid activation, material spending, architecture changes or release.
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
- **Selection:** consider workload, runtime compatibility, operations, total cost, data constraints, and client requirements. Cloudflare and GitHub are preferred when suitable; preserve appropriate existing architecture.
|
|
9
|
-
- **Cost:** start economically where suitable. Free tiers do not override reliability or workload requirements. Establish a project-specific budget and authority for material spending.
|
|
10
|
-
- **Authority:** honor existing authorization. Ask only for missing decisions or consequential commitments, including paid activation, broader access, terms, and production changes outside the authorized scope. A local-development instruction does not authorize shipping.
|
|
11
|
-
- **Evidence:** distinguish declared requirements, generated code, configured resources, deployed artifacts, and tested product behavior. Record account, resource, environment, source revision, evidence source and verification limits; recheck stale evidence. Preserve failures independently: configuration, deployment, or an agent assertion cannot override a current failed check on another resource or product flow.
|
|
7
|
+
## Stack selection
|
|
12
8
|
|
|
13
|
-
|
|
9
|
+
Cloudflare first. **Default** = preferred when needed; **Option** = choose for the stated requirement. Alternatives are grouped beside their defaults. Preserve justified existing stacks.
|
|
14
10
|
|
|
15
|
-
|
|
11
|
+
### Foundation and clients
|
|
16
12
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
| Need | Preferred recipe | Selection criteria / alternatives |
|
|
13
|
+
| Capability | Default — when | Options — when |
|
|
20
14
|
| --- | --- | --- |
|
|
21
|
-
|
|
|
22
|
-
| Web |
|
|
23
|
-
|
|
|
24
|
-
|
|
|
25
|
-
|
|
|
26
|
-
|
|
|
27
|
-
| Next.js hosting | Cloudflare Workers + OpenNext | Verify framework/adapter compatibility. Vercel or other suitable hosting is a normal project choice. |
|
|
28
|
-
| Compute | Workers | Check runtime limits. Containers or another platform when native/Linux dependencies or workload requirements warrant them. |
|
|
29
|
-
| PostgreSQL | Neon + Drizzle | Generated Worker recipe uses Hyperdrive; direct serverless access is another integration choice. Select for query/transaction behavior, pooling, latency, and runtime support. |
|
|
30
|
-
| SQLite | D1 + Drizzle, or device-local SQLite | D1 for suitable hosted SQLite semantics; local data for offline/device-resident requirements. |
|
|
31
|
-
| Identity | Clerk or Better Auth | Managed or application-managed authentication; omit when accounts are unnecessary. |
|
|
32
|
-
| Files | Private R2 accessed through Workers | Local filesystem for device-local files; authorize each private file operation. |
|
|
33
|
-
| Cache/config | KV | Eventually consistent cache/configuration, never authoritative transactional state. |
|
|
34
|
-
| Realtime | Durable Objects + WebSockets | Stateful coordination, rooms, presence, collaboration. |
|
|
35
|
-
| Background work | Queues / Cron Triggers / Workflows | Deferred jobs / schedules / resumable processes; define retries, idempotency, concurrency, and failures. |
|
|
36
|
-
| AI | OpenAI SDK or AI SDK | Direct OpenAI integration or streaming/tools/provider abstraction. Workers AI and AI Gateway when their capabilities justify them. |
|
|
37
|
-
| Domain | Client-selected registrar; Cloudflare DNS when selected | Registration and brokerage are separate services. Preserve existing DNS/registrar unless a change is needed. |
|
|
38
|
-
| Mail | Email Routing; transactional Email Sending or Resend | Routing/processing and application sending are separate from a business mailbox service. |
|
|
39
|
-
| Payments | Stripe; RevenueCat when needed | Web billing and optional cross-store entitlements. Separate billing, entitlements, quotas, and consumption. |
|
|
40
|
-
| Operations | Cloudflare Observability; Sentry when needed | Logs, latency, errors, and deployment investigation; platform crash diagnostics where relevant. |
|
|
41
|
-
| Analytics | Basin or PostHog when needed | Basin supplies ingestion, tables, and SQL; define events, reports, retention, and access. Choose PostHog for required product analytics features. |
|
|
42
|
-
| Source / CI | Git + GitHub / GitHub Actions | Other existing or suitable platforms are ordinary selections with equivalent controls. |
|
|
43
|
-
|
|
44
|
-
Do not activate every service in the table. Capabilities vary by platform and recipe; generated factories, interfaces, and configuration are not completed product behavior.
|
|
45
|
-
|
|
46
|
-
## 3. Repository and version policy
|
|
47
|
-
|
|
48
|
-
Initialize the selected application directly. The [shadcn monorepo starter](https://ui.shadcn.com/docs/monorepo) is a web foundation, not a prerequisite for mobile, API, extension, or native work. Multi-app workspaces use `apps/*` and `packages/*`; create shared packages only for genuine reuse. Keep client-safe contracts/domain logic separate from privileged server integrations and platform-specific UI. Shared styling may include design tokens; use consistent package names.
|
|
49
|
-
|
|
50
|
-
Anhedral's current CLI generates Next.js, Expo, Electron, WXT, and Hono starters plus selected capabilities. Dependency checks retain upstream findings and verify reviewed backports against exact installed bytes; unremediated high/critical findings block delivery. Expo also requires native flows and a signed build. The single-app CLI layout currently supports a root Hono API; other generated recipes use workspaces. WXT currently generates side-panel or popup UI; other surfaces require targeted implementation. Consult its plan and generated README for each capability's delivered code, supported combinations, and remaining setup. GPUI/Rust, alternative web frameworks, Containers, and other adaptations require project-specific implementation rather than an advertised generator flag. Existing projects are inspected and changed incrementally, never silently reinitialized.
|
|
51
|
-
|
|
52
|
-
Pin tested generator/tool inputs and supported runtime versions, commit output lockfiles, and retain compatibility evidence. External templates/registries may still change: verify generated output, review upgrades, and define maintenance and deprecation ownership. A vendor's newest recommendation does not automatically replace a tested recipe. The maintained support contract is the CLI plan and capability registry (`src/capabilities.ts`), foundation inputs (`src/foundation.ts`), platform version inputs (`src/dependencies.ts`), recipe tests (`tests/test-generated-apps.mjs`), and CI host/runtime matrix (`.github/workflows/ci.yml`). Report which checks actually ran: generation/compiler/package/web builds do not establish installed native/device behavior, provider access, or every capability combination. Block a relevant release on failed checks; review updates and retire unsupported recipes explicitly.
|
|
15
|
+
| Shared source | **Default:** [TypeScript](https://www.typescriptlang.org/docs/), [pnpm](https://pnpm.io/), [Turborepo](https://turborepo.dev/docs), [Zod](https://zod.dev/) — shared code, builds and validation. | — |
|
|
16
|
+
| Web | **Default:** [Vinext + React](https://developers.cloudflare.com/workers/framework-guides/web-apps/nextjs/) — full-stack web on Workers. | **Option:** [Next.js + OpenNext](https://opennext.js.org/cloudflare) — existing Next app on Workers; [Next.js + Vercel](https://vercel.com/docs/frameworks/nextjs) — native Next hosting. |
|
|
17
|
+
| UI | **Default:** [Tailwind](https://tailwindcss.com/docs/), [shadcn/ui](https://ui.shadcn.com/docs) — web styling/components. | **Option:** [CSS Modules](https://nextjs.org/docs/app/getting-started/css) — bespoke styling or existing CSS. |
|
|
18
|
+
| Mobile | **Default:** [Expo](https://docs.expo.dev/) — React Native iOS/Android. | **Option:** [SwiftUI](https://developer.apple.com/documentation/swiftui) / [Compose](https://developer.android.com/compose) — platform-specific UI; [Flutter](https://docs.flutter.dev/) — Dart shared UI; [Capacitor](https://capacitorjs.com/docs) — package web UI with native access. |
|
|
19
|
+
| Desktop | **Default:** [Electron](https://www.electronjs.org/docs/latest/) — reuse web UI with Chromium/Node. | **Option:** [Tauri](https://v2.tauri.app/) — smaller system-webview packages; [GPUI](https://github.com/zed-industries/zed/blob/main/crates/gpui/README.md) — GPU-rendered Rust UI, separate UI code and pre-1.0 APIs; [SwiftUI/AppKit](https://developer.apple.com/documentation/appkit) — Apple-specific desktop experience. |
|
|
20
|
+
| Extensions | **Default:** [WXT](https://wxt.dev/guide/introduction.html) — browser extensions. | **Option:** [Chrome extension APIs](https://developer.chrome.com/docs/extensions) — direct implementation or existing extension. |
|
|
53
21
|
|
|
54
|
-
|
|
22
|
+
### Backend and data
|
|
55
23
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
24
|
+
| Capability | Default — when | Options — when |
|
|
25
|
+
| --- | --- | --- |
|
|
26
|
+
| API/runtime | **Default:** [Workers](https://developers.cloudflare.com/workers/) + [Hono](https://hono.dev/docs/getting-started/cloudflare-workers) — APIs, webhooks and services. | **Option:** framework server routes — integrated web backend; [Containers](https://developers.cloudflare.com/containers/) — Linux/native dependencies. |
|
|
27
|
+
| Database | **Default:** [Neon serverless driver](https://neon.com/docs/serverless/serverless-driver) + [Drizzle](https://orm.drizzle.team/docs/connect-neon) — direct HTTP for CRUD and independent queries; no Hyperdrive required. | **Option:** [Hyperdrive + Neon](https://developers.cloudflare.com/hyperdrive/examples/connect-to-postgres/postgres-database-providers/neon/) — pg/postgres.js, connection reuse or optional caching, justified by workload/latency measurements; Neon WebSocket driver — session/interactive transactions; [D1 + Drizzle](https://orm.drizzle.team/docs/sqlite/connect-cloudflare-d1) — Worker-native SQLite; [SQLite](https://www.sqlite.org/docs.html) / [IndexedDB](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API) — local/offline data. |
|
|
28
|
+
| Authentication | **Default:** [Better Auth](https://better-auth.com/docs/adapters/drizzle) — own identities, sessions and organizations. | **Option:** [Clerk](https://clerk.com/docs) — managed authentication and identity features. |
|
|
29
|
+
| Files | **Default:** [R2](https://developers.cloudflare.com/r2/) — uploads, attachments and archives. | **Option:** local files — device-only apps; existing S3-compatible storage — migration has no benefit. |
|
|
30
|
+
| Realtime/state | **Default:** [Durable Objects + hibernating WebSockets](https://developers.cloudflare.com/durable-objects/best-practices/websockets/) — rooms, presence and coordinated events. | **Option:** [SSE](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events) — one-way updates; polling — infrequent changes; [KV](https://developers.cloudflare.com/kv/) — read-heavy, eventually consistent cache/config. |
|
|
31
|
+
| Background work | **Default:** [Queues](https://developers.cloudflare.com/queues/) — jobs/retries; [Workflows](https://developers.cloudflare.com/workflows/) — durable multi-step work; [Cron](https://developers.cloudflare.com/workers/configuration/cron-triggers/) — schedules. | **Option:** [DO alarms](https://developers.cloudflare.com/durable-objects/api/alarms/) — entity timers; [K2](https://developers.cloudflare.com/k2/) — retained replayable streams, beta acceptable. |
|
|
32
|
+
| Placement | **Default:** standard Workers placement — request-proximate execution. | **Option:** [Placement](https://developers.cloudflare.com/workers/configuration/placement/) — database/backend round trips dominate. |
|
|
59
33
|
|
|
60
|
-
|
|
34
|
+
Start with direct Neon HTTP; use non-interactive transaction batches where suitable, or WebSocket/standard-driver transactions when interactive sessions are needed. Benchmark before adding Hyperdrive. Its pooling operates on Cloudflare infrastructure; Neon PgBouncer operates near Postgres. With Hyperdrive use pg/postgres.js against Neon’s non-pooled endpoint, not the Neon serverless driver or stacked poolers. Disable result caching for authoritative auth, permissions, entitlements and balances. Neither Neon nor D1 is universally faster/cheaper; offline sync remains application work.
|
|
61
35
|
|
|
62
|
-
|
|
63
|
-
- **Domain:** client registrar access, renewal/billing/recovery responsibility, and DNS access. If Cloudflare DNS is selected, add the zone, preserve required records, set its assigned nameservers, and verify activation before application/mail changes. Registration remains with the registrar.
|
|
64
|
-
- **Database:** authorized project access, runtime/migration credentials and roles, and selected connection configuration. [Neon supports direct serverless access as well as Hyperdrive](https://developers.cloudflare.com/workers/databases/third-party-integrations/neon/). Review pooling, transactions, and cache correctness; avoid cached authorization, balances, quotas, or paid-unit decisions.
|
|
65
|
-
- **Private R2 / Basin Pipelines:** Worker bindings and scoped sink writes. Cloudflare's managed Pipelines setup may require its Workers Pipelines app's **Pipelines Setup** grant. Keep ingestion private unless public access is explicitly designed and authorized.
|
|
66
|
-
- **Mail:** verified domain, routing destinations, sender authentication, and selected sending credentials/bindings. [Cloudflare Email Sending](https://developers.cloudflare.com/email-service/) is transactional, beta, and requires Workers Paid; verify eligibility and use a suitable alternative when needed. Email Routing is inbound forwarding/processing, not a full business mailbox.
|
|
67
|
-
- **Optional providers / CI:** selected auth secrets/URLs or Clerk keys; AI, billing, mail, analytics, and observability credentials; verified webhooks; repository access and environment-scoped deployment secrets.
|
|
36
|
+
### AI, media and communication
|
|
68
37
|
|
|
69
|
-
|
|
38
|
+
| Capability | Default — when | Options — when |
|
|
39
|
+
| --- | --- | --- |
|
|
40
|
+
| Inference | **Default:** [Workers AI](https://developers.cloudflare.com/workers-ai/) — supported models fit; [AI Gateway](https://developers.cloudflare.com/ai-gateway/) — routing/controls/telemetry. | **Option:** [OpenAI/other providers through Gateway](https://developers.cloudflare.com/ai-gateway/usage/providers/) — required models; [AI SDK](https://ai-sdk.dev/docs/introduction) — shared model interfaces and streaming UI. |
|
|
41
|
+
| Retrieval/agents | **Default:** [AI Search](https://developers.cloudflare.com/ai-search/) — managed RAG. | **Option:** [Vectorize](https://developers.cloudflare.com/vectorize/) — custom vector pipeline; [Agents SDK](https://developers.cloudflare.com/agents/) — stateful agents. |
|
|
42
|
+
| Isolated execution | — | **Option:** [Sandboxes](https://developers.cloudflare.com/sandbox/) — user/agent code; [Browser Run](https://developers.cloudflare.com/browser-run/) — automation, screenshots/PDFs; [Containers](https://developers.cloudflare.com/containers/) — custom runtime. |
|
|
43
|
+
| Calls | **Default:** [RealtimeKit](https://developers.cloudflare.com/realtime/realtimekit/) — audio/video/screensharing. | **Option:** [Realtime SFU + TURN](https://developers.cloudflare.com/realtime/) — custom WebRTC; [LiveKit](https://docs.livekit.io/) — existing ecosystem or voice-agent requirements. |
|
|
44
|
+
| Images/video | **Default:** [Images](https://developers.cloudflare.com/images/) — transforms/delivery; [Stream](https://developers.cloudflare.com/stream/) — encoding/playback/live video. | **Option:** [R2](https://developers.cloudflare.com/r2/) — originals/downloads without managed processing; [Media over QUIC](https://developers.cloudflare.com/moq/) — specialized low-latency transport. |
|
|
45
|
+
| Email | **Default:** [Email Service](https://developers.cloudflare.com/email-service/) — email workflows, sending beta acceptable. | **Option:** [Resend](https://resend.com/docs) — established transactional email provider. |
|
|
46
|
+
| Notifications | **Default:** [Expo Push](https://docs.expo.dev/push-notifications/overview/) — Expo mobile notifications. | **Option:** [APNs](https://developer.apple.com/documentation/usernotifications) / [FCM](https://firebase.google.com/docs/cloud-messaging) — direct native delivery; [Web Push](https://developer.mozilla.org/en-US/docs/Web/API/Push_API) — browser notifications. |
|
|
70
47
|
|
|
71
|
-
|
|
48
|
+
Durable Objects coordinate calls/events; SFU/TURN handle media. WebSockets do not replace background push.
|
|
72
49
|
|
|
73
|
-
|
|
50
|
+
### Commerce and access
|
|
74
51
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
-
|
|
79
|
-
|
|
80
|
-
- Define product acceptance: important flows, failure cases, accessibility, relevant browsers/devices, and performance budgets. A deployment response or health endpoint alone does not prove readiness.
|
|
52
|
+
| Capability | Default — when | Options — when |
|
|
53
|
+
| --- | --- | --- |
|
|
54
|
+
| Web billing | **Default:** [Stripe Checkout](https://docs.stripe.com/payments/checkout) + [Billing](https://docs.stripe.com/billing) — payments, subscriptions and usage billing. | **Option:** [Connect](https://docs.stripe.com/connect) — marketplaces/payouts; [Tax](https://docs.stripe.com/tax) — tax calculation. |
|
|
55
|
+
| Cross-store purchases | **Default:** [RevenueCat](https://www.revenuecat.com/docs/web/integrations/stripe) — supported store/web subscriptions and entitlements. | **Option:** [StoreKit](https://developer.apple.com/documentation/storekit) / [Play Billing](https://developer.android.com/google/play/billing) — own purchase lifecycle integrations. |
|
|
56
|
+
| Access enforcement | **Default:** Workers + chosen database — entitlement projections, seats, grants and credit/usage ledger. | **Option:** [Monetization Gateway](https://developers.cloudflare.com/monetization-gateway/) — eligible x402 requests, closed beta acceptable. |
|
|
81
57
|
|
|
82
|
-
|
|
58
|
+
Stripe/stores remain purchase authorities; RevenueCat does not cover every Stripe pricing model. Verify webhooks, process idempotently and reconcile refunds/restores. Cloudflare hosts enforcement; it does not replace payment processing.
|
|
83
59
|
|
|
84
|
-
|
|
85
|
-
| --- | --- |
|
|
86
|
-
| Before implementation | Intended users and critical flows; selected recipes and reasons; necessary data/services; observable acceptance criteria and relevant performance/recovery objectives. |
|
|
87
|
-
| Before external changes | Intended account/environment/resource identities; owner/admin, billing and recovery access; budget/authority and any unresolved consequential decision. |
|
|
88
|
-
| Before release | Exact source revision/artifact; applicable local and external check results with date/source/scope; failed or unverified criteria; migration/rollback or forward-fix procedure and authority to release. |
|
|
89
|
-
| At handoff | Runnable/installable or live result as authorized, setup/run/test instructions, resource references and safe secret-store locations, verified flows and remaining limits, monitoring/recovery and maintenance owner. |
|
|
60
|
+
### Security, analytics and operations
|
|
90
61
|
|
|
91
|
-
|
|
62
|
+
| Capability | Default — when | Options — when |
|
|
63
|
+
| --- | --- | --- |
|
|
64
|
+
| Public protection | **Default:** [DNS/TLS](https://developers.cloudflare.com/directory/), [WAF](https://developers.cloudflare.com/waf/), [Turnstile](https://developers.cloudflare.com/turnstile/) — domains, HTTPS and abuse controls. | **Option:** [API Shield](https://developers.cloudflare.com/api-shield/) — additional API protection; [Access + Tunnel](https://developers.cloudflare.com/cloudflare-one/) — staff tools/private origins. |
|
|
65
|
+
| Specialized security/networking | — | **Option:** [Load Balancing](https://developers.cloudflare.com/load-balancing/) — multiple origins; [Spectrum](https://developers.cloudflare.com/spectrum/) — TCP/UDP proxying; [Data Localization](https://developers.cloudflare.com/data-localization/) — regional processing requirements. |
|
|
66
|
+
| Credentials | **Default:** [Worker secrets](https://developers.cloudflare.com/workers/configuration/secrets/) — server credentials. | **Option:** [Secrets Store](https://developers.cloudflare.com/secrets-store/) — shared account secrets, beta acceptable. |
|
|
67
|
+
| Website analytics | **Default:** [free Web Analytics](https://www.cloudflare.com/web-analytics/) — traffic/performance. | **Option:** [PostHog](https://posthog.com/docs) — product funnels, cohorts and replay. |
|
|
68
|
+
| Operational telemetry | **Default:** [Workers Observability](https://developers.cloudflare.com/workers/observability/) — logs/traces/errors. | **Option:** [Sentry](https://docs.sentry.io/platforms/javascript/) — cross-client error monitoring; [Analytics Engine](https://developers.cloudflare.com/analytics/analytics-engine/) — custom telemetry; [Basin](https://developers.cloudflare.com/basin/) — event ingestion and analytical SQL on R2/Iceberg. |
|
|
69
|
+
| Feature delivery | — | **Option:** [Flagship](https://developers.cloudflare.com/flagship/) — targeted exposure; [PostHog](https://posthog.com/docs/feature-flags) — existing flags/experiments. |
|
|
70
|
+
| Content/source tooling | — | **Option:** [Artifacts](https://developers.cloudflare.com/artifacts/) — durable versioned source/artifacts, beta acceptable; [GitHub](https://docs.github.com/) — customer-owned Git source. |
|
|
71
|
+
| Customer platforms | — | **Option:** [Cloudflare for SaaS](https://developers.cloudflare.com/cloudflare-for-platforms/cloudflare-for-saas/) — customer domains; [Workers for Platforms](https://developers.cloudflare.com/cloudflare-for-platforms/workers-for-platforms/) — customer code. |
|
|
72
|
+
|
|
73
|
+
### Development, releases and accounts
|
|
74
|
+
|
|
75
|
+
| Capability | Default — when | Options — when |
|
|
76
|
+
| --- | --- | --- |
|
|
77
|
+
| Agent tooling | **Default:** [Cloudflare Codex plugin](https://developers.cloudflare.com/agent-setup/codex/) — Cloudflare Skills/MCP and agent operations. | **Option:** [cf CLI](https://developers.cloudflare.com/cf/) — broad API/project operations, beta acceptable. |
|
|
78
|
+
| Cloud releases | **Default:** [Wrangler](https://developers.cloudflare.com/workers/wrangler/) + [Workers Builds](https://developers.cloudflare.com/workers/ci-cd/builds/) — Worker development/releases. | **Option:** [GitHub Actions](https://docs.github.com/en/actions) — custom CI; [Vercel](https://vercel.com/docs/deployments) — selected native Next stack. |
|
|
79
|
+
| Native builds | **Default:** [EAS](https://docs.expo.dev/build/introduction/) — hosted Expo builds. | **Option:** [local Expo builds](https://docs.expo.dev/build-reference/local-builds/) — local CI; platform toolchains — GPUI/Tauri/native clients. |
|
|
80
|
+
| Distribution/accounts | **Default:** customer-owned [Apple](https://developer.apple.com/programs/), [Play](https://play.google.com/console/about/), [Chrome](https://developer.chrome.com/docs/webstore/register) accounts — selected stores. | **Option:** direct desktop distribution — signed/notarized packages; [free Cloudflare account creation](https://developers.cloudflare.com/changelog/post/2026-08-04-free-dashboard-button/) — eligible separate customer accounts. |
|
|
92
81
|
|
|
93
|
-
Use
|
|
82
|
+
Use customer-owned resources. Implement backup/recovery, authorization, replay, offline sync and ledger correctness explicitly. Select specialized capabilities as needed; alternatives are choices, not dependencies to install together.
|
|
94
83
|
|
|
95
|
-
|
|
84
|
+
The CLI generates Vinext, Next.js, Expo, Electron, WXT and Hono applications plus selected provider starters. Neon starters use the direct serverless HTTP driver with Drizzle. Alternatives in the table require deliberate project implementation. A starter does not establish configured infrastructure or working product behavior. The bundled capability registry and `new --dry-run --json` describe generated requirements.
|
|
96
85
|
|
|
97
|
-
|
|
86
|
+
The bundled stack registry in `src/stack-registry.ts` owns each item’s identity, version, source recipe, setup requirements, environment variables, bindings, destinations and composition constraints. Product IDs and capability views derive from that catalog. Foundations include pnpm/Turborepo, TypeScript, ESLint and shared UI; the official shadcn bootstrap is pinned in `src/dependencies.ts`. The resolver validates selections and orders dependencies; focused modules under `src/scaffold/` install the resolved recipes inside the staging transaction. `registry list|view` exposes the catalog, dry-run plans expose concrete destinations, and `anhedral.registry.json` records installed recipes and local workspace references. Package names must be unique, workspace references must resolve, and dependency cycles fail before commit. `doctor` verifies the installed receipt and workspace graph against the setup plan. To add a supported part, declare one catalog entry with its recipe and composition policy, then exercise composition and rollback in the registry tests. Build and release tooling regenerate matching plugin catalogs. Incremental `add` stages bundled or declarative local/HTTPS registry items, resolves dependencies, rejects unsafe paths and installation hooks, and refuses to replace edited source. Receipts record source integrity and generated-file hashes. Runtime relocation and older projects without fingerprints require explicit migration. This is an Anhedral recipe schema; shadcn JSON interoperability is not supported. Stack alternatives without generator recipes remain deliberate implementation choices.
|
|
98
87
|
|
|
99
|
-
|
|
88
|
+
## Implementation rules
|
|
100
89
|
|
|
101
|
-
|
|
90
|
+
- Start new projects with the official shadcn pnpm/Turborepo monorepo; use `apps/*` and genuinely shared `packages/*`. Web/Electron use React, TypeScript, Tailwind, shadcn/ui and Lucide; Expo uses React Native Reusables; WXT uses Chrome Side Panel. Preserve suitable existing architecture.
|
|
91
|
+
- Vinext is the default Worker framework; verify its actual compatibility. Native Next.js uses Vercel; explicit Next.js on Workers uses OpenNext. Shared/mobile APIs use Hono/OpenAPI; web-only endpoints can use framework routes.
|
|
92
|
+
- Select one database and one identity provider. Generator alternatives remain deliberate flags, not automatic migrations. Better Auth requires a database; authentication is optional. Configure origins/sessions and enforce tenant/resource authorization server-side. Hosting privacy is separate from product identity.
|
|
93
|
+
- Keep R2 private and authorize file operations in Workers. Keep secrets server-side, environments separate and migrations reviewed. KV is not authoritative transactional state. Bound retries, concurrency, AI usage and paid consumption; implement idempotency, quotas and recovery.
|
|
94
|
+
- Use customer-owned source, accounts, billing and recovery. Domain registration/brokerage uses GoDaddy and Cloudflare DNS; preserve existing mail/DNSSEC. Configure actual sender domains and inbound destinations; routing does not migrate mailboxes.
|
|
95
|
+
- Codex and browser/native tools implement and verify product flows; Fallow audits TS/JS. A starter, installed package or successful deployment does not prove a configured integration or working application.
|
|
96
|
+
- Record decisions and connections in the application's `docs/architecture.md`; keep tested behavior, environment, release/source identity and unresolved gaps in `docs/verification.md`. Update these existing files after relevant changes.
|
|
102
97
|
|
|
103
|
-
|
|
98
|
+
Follow the [delivery workflow](delivery-workflow.md) for release, acceptance and recovery. The [managed-hosting contract](https://github.com/anhedral/anhedral-init/blob/main/docs/managed-hosting-architecture.md) describes an undeployed client/backend boundary, not an available service. Installed versions, publication and live acceptance require separate evidence.
|
|
104
99
|
|
|
105
|
-
|
|
106
|
-
| --- | --- |
|
|
107
|
-
| OpenAI / Codex + Anhedral | Planning, setup, implementation, verification, operations, and architecture visualization. |
|
|
108
|
-
| Cloudflare | Selected infrastructure, configuration, deployment, and observability through available plugin/API/CLI tools. |
|
|
109
|
-
| GitHub | Source, PRs, checks, reviews, and releases. |
|
|
110
|
-
| Neon | Database projects, branches, migrations, and operations. |
|
|
111
|
-
| Computer Use / Control Chrome | Interactive workflows and visual/product verification when needed. |
|
|
112
|
-
| [Cloudflare security audit](https://github.com/cloudflare/security-audit-skill) | Repository security review and verified findings. |
|
|
113
|
-
| Fallow / framework skills | Supported codebase auditing and framework conventions. |
|
|
114
|
-
| Stripe / RevenueCat / mail / Vercel | Selected provider integrations and operations. |
|
|
115
|
-
| Slack | Project context and explicitly authorized communication. |
|
|
100
|
+
## Maintenance
|
|
116
101
|
|
|
117
|
-
|
|
102
|
+
This file owns stack choices; the delivery guide owns lifecycle/acceptance; the managed contract owns its API; sponsorship owns support information. Update the owning file in the same change when behavior or provider requirements change. Remove stale claims and unused options. Verify current official guidance when selecting a provider; beta availability is not guaranteed. Do not add catalogs, duplicated analyses or progress reports to `docs`. The plugin's bundled stack/delivery files are generated copies, never separate sources of truth.
|
|
118
103
|
|
|
119
|
-
|
|
104
|
+
Generated `pnpm audit:deps` checks all dependencies and verifies reviewed security backports against patch hashes, installed package hashes and regression checks. Unknown advisories and altered backports fail closed.
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# Build and deliver an application
|
|
2
|
+
|
|
3
|
+
Codex implements the product; the CLI supplies scaffolding, selected resource reconciliation and source/provider evidence. Customer-account delivery exists. Managed hosting has a local client foundation, not an operated service. Start with users, flows, audience, budget and observable acceptance criteria; preserve suitable existing apps.
|
|
4
|
+
|
|
5
|
+
## Plan and implement
|
|
6
|
+
|
|
7
|
+
1. Choose only needed components from the [stack standard](application-stack-standard.md). Record decisions, ownership, environment/cost assumptions and actual connections in the application's `docs/architecture.md`.
|
|
8
|
+
2. Match installed plugin, registry `cliVersion` and executable versions. Check Node/pnpm, Git identity, toolchains and customer provider access. For unpublished development use `pnpm build` and `node dist/bin.js`; never silently substitute `@latest`.
|
|
9
|
+
3. Inspect `new <unused-directory> <flags> --dry-run --json`, then generate with those choices. Review README, AGENTS, setup manifests and resolved lockfile. For initialized apps, preview `add <directory> <items...> --dry-run --json`; additions protect edited source and record registry provenance. Use `--registry <file|https-url>` for reviewed declarative registries. Older projects and runtime relocation require explicit migration. `doctor --providers --json` checks access without configuring infrastructure or certifying production.
|
|
10
|
+
4. Implement screens, APIs, persistence, authorization and integration behavior. Replace placeholders with working flows. Configure real secrets, origins and reviewed migrations using provider tools; starters do not establish setup completion. Keep credentials out of source, logs and handoffs.
|
|
11
|
+
|
|
12
|
+
## Source and release authority
|
|
13
|
+
|
|
14
|
+
Use customer-owned accounts and a reviewed clean commit. Default to a private repository in the selected account; organizations require selection.
|
|
15
|
+
|
|
16
|
+
```sh
|
|
17
|
+
anhedral repository my-app --create --json
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
This verifies the app's Git root, owner, visibility, write access and exact remote commit. Reuse matching origins without `--create`; do not replace remotes, change visibility or force-push. Connected repository identity is retained and rechecked.
|
|
21
|
+
|
|
22
|
+
Choose one release path per change: checked `ship`, or checks followed by an authorized Git push, active production confirmation and `adopt`. Git integration can deploy independently of CLI checks; configure required CI/branch/deployment policy explicitly. Do not routinely deploy the same commit twice.
|
|
23
|
+
|
|
24
|
+
## Cloudflare delivery
|
|
25
|
+
|
|
26
|
+
Vinext/Workers is the default web recipe. Explicit Next.js on Workers uses `--next --hosting=cloudflare`. Select persistence, identity and AI from the standard. Cloudflare manifests use `anhedral.project.json`; mixed apps append `--provider cloudflare` to lifecycle operations.
|
|
27
|
+
|
|
28
|
+
```sh
|
|
29
|
+
anhedral connect my-app --audience private --allow-email owner@example.com
|
|
30
|
+
anhedral provision my-app --dry-run --json
|
|
31
|
+
anhedral provision my-app --json
|
|
32
|
+
anhedral ship my-app --dry-run --json
|
|
33
|
+
anhedral ship my-app --json
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Connect verifies the sole accessible or explicitly selected `--account` and preserves audience/account choices. Public access requires authorization. Private hosting needs Zero Trust and scoped Access/Workers permissions; verify routes, domains and previews before and after deployment. Whole-Worker Access does not cover WebSockets: design and verify private realtime separately.
|
|
37
|
+
|
|
38
|
+
Provision reconciles D1, private R2, KV and Queues/dead-letter queues; it does not implement schemas or integrations. Configure reviewed migrations, direct Neon (or selected Hyperdrive), Basin and external providers separately. The Neon starter uses direct serverless HTTP with a server-side DATABASE_URL. Reconcile partial operations before retrying. Shipping requires clean source, checks account/bindings, runs application checks and confirms active versions/traffic. Multiple Workers are not an atomic release; web deploys last by default.
|
|
39
|
+
|
|
40
|
+
## Native Next.js/Vercel delivery
|
|
41
|
+
|
|
42
|
+
Select `--next`, authenticate the intended customer account and choose an eligible plan. Hobby is personal/non-commercial; commercial use requires an eligible existing plan.
|
|
43
|
+
|
|
44
|
+
```sh
|
|
45
|
+
anhedral connect my-app --scope customer-team --audience private --use personal --create --git
|
|
46
|
+
pnpm --dir my-app run check
|
|
47
|
+
anhedral repository my-app --json
|
|
48
|
+
# Wait for the connected production Git deployment.
|
|
49
|
+
anhedral adopt my-app --json
|
|
50
|
+
anhedral verify my-app --json
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Connect checks project/framework/root, repository link and audience. New private projects establish independently verified all-deployment Vercel Authentication before code or Git deployment. Hosting membership is separate from product identity; do not add members, seats or paid upgrades automatically. Existing protection changes need authorization. Mixed apps provision/ship Cloudflare services first, then verify the web-to-service flow.
|
|
54
|
+
|
|
55
|
+
## Acceptance and operating limits
|
|
56
|
+
|
|
57
|
+
Run relevant lint/types/Fallow, dependency audits, meaningful tests and actual runtime builds. Exercise browser flows, installed extension permissions, packaged desktop behavior and signed/native device flows where selected. Deployment or HTTP 200 alone does not establish product completion.
|
|
58
|
+
|
|
59
|
+
Verify anonymous rejection at primary/deployment URLs, permitted-user login, denied-user and cross-tenant behavior. Verify selected private files, realtime reconnect/replay, duplicate jobs/webhooks, bounded AI, purchase/restore/refund, email/push and offline conflicts. Provider-authenticated requests do not prove visitor login or app authorization. Protected automation may use Vercel curl or authorized origin-scoped Trusted Sources; never weaken protection for testing.
|
|
60
|
+
|
|
61
|
+
Record service quotas, maximum retries/concurrency/AI work, alert ownership and shutdown controls within the authorized budget. Test spikes, duplicate execution, partial deployment and backup restoration. Review migrations and compatibility before rollback; code rollback does not restore data.
|
|
62
|
+
|
|
63
|
+
## Operations and handoff
|
|
64
|
+
|
|
65
|
+
| Command | Boundary |
|
|
66
|
+
| --- | --- |
|
|
67
|
+
| `register` | Stable app identity; generated apps register automatically. |
|
|
68
|
+
| `status --refresh` | Independently refresh provider state. |
|
|
69
|
+
| `manage` / `manage --local` | Provider overview / explicitly historical local view. |
|
|
70
|
+
| `adopt` | Verify active Vercel Git source/repository and record its checked release; no push/deploy. |
|
|
71
|
+
| `recover` | Reconcile current provider state after cloning; no invented historical tests/releases. |
|
|
72
|
+
| `verify` | Run meaningful root `test:live` with actual URL/release and source/provider checks. |
|
|
73
|
+
| `rollback --release <id> --data-compatible` | Restore recorded code after compatibility review; no migration reversal/data restore. |
|
|
74
|
+
|
|
75
|
+
Open the actual app URL or installable artifact and exercise acceptance. Maintain the application's existing `docs/verification.md`: exact versions, source/release, repository, provider identity, audience, configured versus tested integrations, reproducible results and remaining actions. Refresh after changes; acceptance becomes stale when production changes. After rollback, restore matching clean source before verifying.
|
|
76
|
+
|
|
77
|
+
Committed manifests preserve identity. Ignored `.anhedral/` receipts are local history; back them up when needed. Before removing an interrupted shared lock, confirm no active process and inspect provider state. Maintain alerts, dependencies, costs and tested recovery. Recurring monitoring requires an authorized schedule. Release artifacts need exact contents, secret checks and integrity verification; never replace published version bytes.
|
|
78
|
+
|
|
79
|
+
## Evidence and maintenance
|
|
80
|
+
|
|
81
|
+
Local/mocked coverage is distinct from live GitHub/Vercel private setup, fresh-clone recovery, installed fresh-chat workflow and connected integrations. Retained HTTP/CRUD/redeploy/rollback runs prove only their tested profile. Sites' inventory, visitor connectors and managed sharing require separate platform implementation. No operated managed backend or issued app URL is established here; see the [managed contract](https://github.com/anhedral/anhedral-init/blob/main/docs/managed-hosting-architecture.md).
|
|
82
|
+
|
|
83
|
+
Before release, check the exact candidate's runtime, current dependency advisories, remote CI, installed-plugin and selected provider/native acceptance. Unresolved high-severity production audit failures block shipping. Keep dated results with release/test artifacts. Update this guide when commands, lifecycle or acceptance requirements change, and regenerate its bundled plugin copy.
|