@agentuity/cli 2.0.11 → 3.0.0-alpha.1
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/dist/cmd/ai/prompt/index.d.ts.map +1 -1
- package/dist/cmd/ai/prompt/index.js +2 -7
- package/dist/cmd/ai/prompt/index.js.map +1 -1
- package/dist/cmd/build/adapters/generic.d.ts +29 -0
- package/dist/cmd/build/adapters/generic.d.ts.map +1 -0
- package/dist/cmd/build/adapters/generic.js +190 -0
- package/dist/cmd/build/adapters/generic.js.map +1 -0
- package/dist/cmd/build/adapters/index.d.ts +15 -0
- package/dist/cmd/build/adapters/index.d.ts.map +1 -0
- package/dist/cmd/build/adapters/index.js +24 -0
- package/dist/cmd/build/adapters/index.js.map +1 -0
- package/dist/cmd/build/adapters/nextjs.d.ts +11 -0
- package/dist/cmd/build/adapters/nextjs.d.ts.map +1 -0
- package/dist/cmd/build/adapters/nextjs.js +118 -0
- package/dist/cmd/build/adapters/nextjs.js.map +1 -0
- package/dist/cmd/build/adapters/static-server.d.ts +23 -0
- package/dist/cmd/build/adapters/static-server.d.ts.map +1 -0
- package/dist/cmd/build/adapters/static-server.js +137 -0
- package/dist/cmd/build/adapters/static-server.js.map +1 -0
- package/dist/cmd/build/adapters/types.d.ts +71 -0
- package/dist/cmd/build/adapters/types.d.ts.map +1 -0
- package/dist/cmd/build/adapters/types.js +8 -0
- package/dist/cmd/build/adapters/types.js.map +1 -0
- package/dist/cmd/build/detect/engine.d.ts +24 -0
- package/dist/cmd/build/detect/engine.d.ts.map +1 -0
- package/dist/cmd/build/detect/engine.js +91 -0
- package/dist/cmd/build/detect/engine.js.map +1 -0
- package/dist/cmd/build/detect/frameworks.d.ts +66 -0
- package/dist/cmd/build/detect/frameworks.d.ts.map +1 -0
- package/dist/cmd/build/detect/frameworks.js +278 -0
- package/dist/cmd/build/detect/frameworks.js.map +1 -0
- package/dist/cmd/build/detect/generic.d.ts +13 -0
- package/dist/cmd/build/detect/generic.d.ts.map +1 -0
- package/dist/cmd/build/detect/generic.js +62 -0
- package/dist/cmd/build/detect/generic.js.map +1 -0
- package/dist/cmd/build/detect/index.d.ts +27 -0
- package/dist/cmd/build/detect/index.d.ts.map +1 -0
- package/dist/cmd/build/detect/index.js +76 -0
- package/dist/cmd/build/detect/index.js.map +1 -0
- package/dist/cmd/build/detect/types.d.ts +91 -0
- package/dist/cmd/build/detect/types.d.ts.map +1 -0
- package/dist/cmd/build/detect/types.js +9 -0
- package/dist/cmd/build/detect/types.js.map +1 -0
- package/dist/cmd/build/detect/util.d.ts +41 -0
- package/dist/cmd/build/detect/util.d.ts.map +1 -0
- package/dist/cmd/build/detect/util.js +101 -0
- package/dist/cmd/build/detect/util.js.map +1 -0
- package/dist/cmd/build/index.d.ts.map +1 -1
- package/dist/cmd/build/index.js +49 -22
- package/dist/cmd/build/index.js.map +1 -1
- package/dist/cmd/build/package/index.d.ts +30 -0
- package/dist/cmd/build/package/index.d.ts.map +1 -0
- package/dist/cmd/build/package/index.js +39 -0
- package/dist/cmd/build/package/index.js.map +1 -0
- package/dist/cmd/build/package/launch.d.ts +56 -0
- package/dist/cmd/build/package/launch.d.ts.map +1 -0
- package/dist/cmd/build/package/launch.js +56 -0
- package/dist/cmd/build/package/launch.js.map +1 -0
- package/dist/cmd/build/typecheck.d.ts.map +1 -1
- package/dist/cmd/build/typecheck.js +8 -0
- package/dist/cmd/build/typecheck.js.map +1 -1
- package/dist/cmd/cloud/deploy.d.ts.map +1 -1
- package/dist/cmd/cloud/deploy.js +63 -13
- package/dist/cmd/cloud/deploy.js.map +1 -1
- package/dist/cmd/coder/create.js +7 -7
- package/dist/cmd/coder/create.js.map +1 -1
- package/dist/cmd/coder/update.js +8 -8
- package/dist/cmd/coder/update.js.map +1 -1
- package/dist/cmd/coder/workspace/create.js +9 -9
- package/dist/cmd/coder/workspace/create.js.map +1 -1
- package/dist/cmd/dev/index.d.ts +9 -0
- package/dist/cmd/dev/index.d.ts.map +1 -1
- package/dist/cmd/dev/index.js +127 -923
- package/dist/cmd/dev/index.js.map +1 -1
- package/dist/cmd/project/auth/shared.d.ts.map +1 -1
- package/dist/cmd/project/auth/shared.js +14 -38
- package/dist/cmd/project/auth/shared.js.map +1 -1
- package/dist/cmd/project/create.d.ts.map +1 -1
- package/dist/cmd/project/create.js +12 -19
- package/dist/cmd/project/create.js.map +1 -1
- package/dist/cmd/project/frameworks-ai-examples.d.ts +15 -0
- package/dist/cmd/project/frameworks-ai-examples.d.ts.map +1 -0
- package/dist/cmd/project/frameworks-ai-examples.js +160 -0
- package/dist/cmd/project/frameworks-ai-examples.js.map +1 -0
- package/dist/cmd/project/frameworks-landing-pages.d.ts +17 -0
- package/dist/cmd/project/frameworks-landing-pages.d.ts.map +1 -0
- package/dist/cmd/project/frameworks-landing-pages.js +242 -0
- package/dist/cmd/project/frameworks-landing-pages.js.map +1 -0
- package/dist/cmd/project/frameworks.d.ts +58 -0
- package/dist/cmd/project/frameworks.d.ts.map +1 -0
- package/dist/cmd/project/frameworks.js +152 -0
- package/dist/cmd/project/frameworks.js.map +1 -0
- package/dist/cmd/project/reconcile.d.ts.map +1 -1
- package/dist/cmd/project/reconcile.js +10 -23
- package/dist/cmd/project/reconcile.js.map +1 -1
- package/dist/cmd/project/remote-import.js +1 -1
- package/dist/cmd/project/scaffold.d.ts +58 -0
- package/dist/cmd/project/scaffold.d.ts.map +1 -0
- package/dist/cmd/project/scaffold.js +223 -0
- package/dist/cmd/project/scaffold.js.map +1 -0
- package/dist/cmd/project/template-flow.d.ts +8 -4
- package/dist/cmd/project/template-flow.d.ts.map +1 -1
- package/dist/cmd/project/template-flow.js +93 -144
- package/dist/cmd/project/template-flow.js.map +1 -1
- package/dist/deploy-metadata.d.ts +49 -0
- package/dist/deploy-metadata.d.ts.map +1 -0
- package/dist/deploy-metadata.js +183 -0
- package/dist/deploy-metadata.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +24 -30
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +13 -8
- package/src/cmd/ai/prompt/index.ts +2 -7
- package/src/cmd/build/adapters/generic.ts +239 -0
- package/src/cmd/build/adapters/index.ts +30 -0
- package/src/cmd/build/adapters/nextjs.ts +146 -0
- package/src/cmd/build/adapters/static-server.ts +143 -0
- package/src/cmd/build/adapters/types.ts +93 -0
- package/src/cmd/build/detect/engine.ts +111 -0
- package/src/cmd/build/detect/frameworks.ts +335 -0
- package/src/cmd/build/detect/generic.ts +71 -0
- package/src/cmd/build/detect/index.ts +122 -0
- package/src/cmd/build/detect/types.ts +109 -0
- package/src/cmd/build/detect/util.ts +104 -0
- package/src/cmd/build/index.ts +64 -24
- package/src/cmd/build/package/index.ts +66 -0
- package/src/cmd/build/package/launch.ts +104 -0
- package/src/cmd/build/typecheck.ts +9 -0
- package/src/cmd/cloud/deploy.ts +86 -13
- package/src/cmd/coder/create.ts +8 -8
- package/src/cmd/coder/update.ts +7 -7
- package/src/cmd/coder/workspace/create.ts +10 -10
- package/src/cmd/dev/index.ts +155 -1059
- package/src/cmd/project/auth/shared.ts +14 -39
- package/src/cmd/project/create.ts +14 -19
- package/src/cmd/project/frameworks-ai-examples.ts +166 -0
- package/src/cmd/project/frameworks-landing-pages.ts +267 -0
- package/src/cmd/project/frameworks.ts +223 -0
- package/src/cmd/project/reconcile.ts +10 -22
- package/src/cmd/project/remote-import.ts +1 -1
- package/src/cmd/project/scaffold.ts +300 -0
- package/src/cmd/project/template-flow.ts +102 -156
- package/src/deploy-metadata.ts +253 -0
- package/src/index.ts +0 -2
- package/src/types.ts +0 -31
- package/dist/agents-docs.d.ts +0 -23
- package/dist/agents-docs.d.ts.map +0 -1
- package/dist/agents-docs.js +0 -56
- package/dist/agents-docs.js.map +0 -1
- package/dist/cmd/ai/prompt/agent.d.ts +0 -10
- package/dist/cmd/ai/prompt/agent.d.ts.map +0 -1
- package/dist/cmd/ai/prompt/agent.js +0 -28
- package/dist/cmd/ai/prompt/agent.js.map +0 -1
- package/dist/cmd/build/app-router-detector.d.ts +0 -39
- package/dist/cmd/build/app-router-detector.d.ts.map +0 -1
- package/dist/cmd/build/app-router-detector.js +0 -229
- package/dist/cmd/build/app-router-detector.js.map +0 -1
- package/dist/cmd/build/format-schema.d.ts +0 -6
- package/dist/cmd/build/format-schema.d.ts.map +0 -1
- package/dist/cmd/build/format-schema.js +0 -60
- package/dist/cmd/build/format-schema.js.map +0 -1
- package/dist/cmd/build/vite/agent-discovery.d.ts +0 -37
- package/dist/cmd/build/vite/agent-discovery.d.ts.map +0 -1
- package/dist/cmd/build/vite/agent-discovery.js +0 -263
- package/dist/cmd/build/vite/agent-discovery.js.map +0 -1
- package/dist/cmd/build/vite/beacon-plugin.d.ts +0 -19
- package/dist/cmd/build/vite/beacon-plugin.d.ts.map +0 -1
- package/dist/cmd/build/vite/beacon-plugin.js +0 -137
- package/dist/cmd/build/vite/beacon-plugin.js.map +0 -1
- package/dist/cmd/build/vite/browser-env-plugin.d.ts +0 -9
- package/dist/cmd/build/vite/browser-env-plugin.d.ts.map +0 -1
- package/dist/cmd/build/vite/browser-env-plugin.js +0 -28
- package/dist/cmd/build/vite/browser-env-plugin.js.map +0 -1
- package/dist/cmd/build/vite/bun-dev-server.d.ts +0 -67
- package/dist/cmd/build/vite/bun-dev-server.d.ts.map +0 -1
- package/dist/cmd/build/vite/bun-dev-server.js +0 -340
- package/dist/cmd/build/vite/bun-dev-server.js.map +0 -1
- package/dist/cmd/build/vite/bundle-files.d.ts +0 -12
- package/dist/cmd/build/vite/bundle-files.d.ts.map +0 -1
- package/dist/cmd/build/vite/bundle-files.js +0 -107
- package/dist/cmd/build/vite/bundle-files.js.map +0 -1
- package/dist/cmd/build/vite/config-loader.d.ts +0 -29
- package/dist/cmd/build/vite/config-loader.d.ts.map +0 -1
- package/dist/cmd/build/vite/config-loader.js +0 -57
- package/dist/cmd/build/vite/config-loader.js.map +0 -1
- package/dist/cmd/build/vite/db-rewrite.d.ts +0 -50
- package/dist/cmd/build/vite/db-rewrite.d.ts.map +0 -1
- package/dist/cmd/build/vite/db-rewrite.js +0 -169
- package/dist/cmd/build/vite/db-rewrite.js.map +0 -1
- package/dist/cmd/build/vite/docs-generator.d.ts +0 -13
- package/dist/cmd/build/vite/docs-generator.d.ts.map +0 -1
- package/dist/cmd/build/vite/docs-generator.js +0 -97
- package/dist/cmd/build/vite/docs-generator.js.map +0 -1
- package/dist/cmd/build/vite/env-types-generator.d.ts +0 -26
- package/dist/cmd/build/vite/env-types-generator.d.ts.map +0 -1
- package/dist/cmd/build/vite/env-types-generator.js +0 -110
- package/dist/cmd/build/vite/env-types-generator.js.map +0 -1
- package/dist/cmd/build/vite/index.d.ts +0 -3
- package/dist/cmd/build/vite/index.d.ts.map +0 -1
- package/dist/cmd/build/vite/index.js +0 -4
- package/dist/cmd/build/vite/index.js.map +0 -1
- package/dist/cmd/build/vite/lifecycle-generator.d.ts +0 -19
- package/dist/cmd/build/vite/lifecycle-generator.d.ts.map +0 -1
- package/dist/cmd/build/vite/lifecycle-generator.js +0 -328
- package/dist/cmd/build/vite/lifecycle-generator.js.map +0 -1
- package/dist/cmd/build/vite/metadata-generator.d.ts +0 -36
- package/dist/cmd/build/vite/metadata-generator.d.ts.map +0 -1
- package/dist/cmd/build/vite/metadata-generator.js +0 -575
- package/dist/cmd/build/vite/metadata-generator.js.map +0 -1
- package/dist/cmd/build/vite/prompt-generator.d.ts +0 -23
- package/dist/cmd/build/vite/prompt-generator.d.ts.map +0 -1
- package/dist/cmd/build/vite/prompt-generator.js +0 -123
- package/dist/cmd/build/vite/prompt-generator.js.map +0 -1
- package/dist/cmd/build/vite/public-asset-path-plugin.d.ts +0 -45
- package/dist/cmd/build/vite/public-asset-path-plugin.d.ts.map +0 -1
- package/dist/cmd/build/vite/public-asset-path-plugin.js +0 -166
- package/dist/cmd/build/vite/public-asset-path-plugin.js.map +0 -1
- package/dist/cmd/build/vite/route-discovery.d.ts +0 -64
- package/dist/cmd/build/vite/route-discovery.d.ts.map +0 -1
- package/dist/cmd/build/vite/route-discovery.js +0 -187
- package/dist/cmd/build/vite/route-discovery.js.map +0 -1
- package/dist/cmd/build/vite/server-bundler.d.ts +0 -20
- package/dist/cmd/build/vite/server-bundler.d.ts.map +0 -1
- package/dist/cmd/build/vite/server-bundler.js +0 -388
- package/dist/cmd/build/vite/server-bundler.js.map +0 -1
- package/dist/cmd/build/vite/static-renderer.d.ts +0 -26
- package/dist/cmd/build/vite/static-renderer.d.ts.map +0 -1
- package/dist/cmd/build/vite/static-renderer.js +0 -188
- package/dist/cmd/build/vite/static-renderer.js.map +0 -1
- package/dist/cmd/build/vite/tailwind-source-plugin.d.ts +0 -15
- package/dist/cmd/build/vite/tailwind-source-plugin.d.ts.map +0 -1
- package/dist/cmd/build/vite/tailwind-source-plugin.js +0 -61
- package/dist/cmd/build/vite/tailwind-source-plugin.js.map +0 -1
- package/dist/cmd/build/vite/vite-asset-server-config.d.ts +0 -24
- package/dist/cmd/build/vite/vite-asset-server-config.d.ts.map +0 -1
- package/dist/cmd/build/vite/vite-asset-server-config.js +0 -285
- package/dist/cmd/build/vite/vite-asset-server-config.js.map +0 -1
- package/dist/cmd/build/vite/vite-asset-server.d.ts +0 -30
- package/dist/cmd/build/vite/vite-asset-server.d.ts.map +0 -1
- package/dist/cmd/build/vite/vite-asset-server.js +0 -109
- package/dist/cmd/build/vite/vite-asset-server.js.map +0 -1
- package/dist/cmd/build/vite/vite-builder.d.ts +0 -59
- package/dist/cmd/build/vite/vite-builder.d.ts.map +0 -1
- package/dist/cmd/build/vite/vite-builder.js +0 -401
- package/dist/cmd/build/vite/vite-builder.js.map +0 -1
- package/dist/cmd/build/vite/workbench-generator.d.ts +0 -10
- package/dist/cmd/build/vite/workbench-generator.d.ts.map +0 -1
- package/dist/cmd/build/vite/workbench-generator.js +0 -135
- package/dist/cmd/build/vite/workbench-generator.js.map +0 -1
- package/dist/cmd/build/vite/ws-proxy.d.ts +0 -53
- package/dist/cmd/build/vite/ws-proxy.d.ts.map +0 -1
- package/dist/cmd/build/vite/ws-proxy.js +0 -95
- package/dist/cmd/build/vite/ws-proxy.js.map +0 -1
- package/dist/cmd/build/vite-bundler.d.ts +0 -29
- package/dist/cmd/build/vite-bundler.d.ts.map +0 -1
- package/dist/cmd/build/vite-bundler.js +0 -93
- package/dist/cmd/build/vite-bundler.js.map +0 -1
- package/dist/cmd/dev/agents.d.ts +0 -2
- package/dist/cmd/dev/agents.d.ts.map +0 -1
- package/dist/cmd/dev/agents.js +0 -123
- package/dist/cmd/dev/agents.js.map +0 -1
- package/dist/cmd/dev/api.d.ts +0 -20
- package/dist/cmd/dev/api.d.ts.map +0 -1
- package/dist/cmd/dev/api.js +0 -42
- package/dist/cmd/dev/api.js.map +0 -1
- package/dist/cmd/dev/dev-lock.d.ts +0 -62
- package/dist/cmd/dev/dev-lock.d.ts.map +0 -1
- package/dist/cmd/dev/dev-lock.js +0 -250
- package/dist/cmd/dev/dev-lock.js.map +0 -1
- package/dist/cmd/dev/download.d.ts +0 -11
- package/dist/cmd/dev/download.d.ts.map +0 -1
- package/dist/cmd/dev/download.js +0 -94
- package/dist/cmd/dev/download.js.map +0 -1
- package/dist/cmd/dev/file-watcher.d.ts +0 -24
- package/dist/cmd/dev/file-watcher.d.ts.map +0 -1
- package/dist/cmd/dev/file-watcher.js +0 -349
- package/dist/cmd/dev/file-watcher.js.map +0 -1
- package/dist/cmd/dev/process-manager.d.ts +0 -104
- package/dist/cmd/dev/process-manager.d.ts.map +0 -1
- package/dist/cmd/dev/process-manager.js +0 -204
- package/dist/cmd/dev/process-manager.js.map +0 -1
- package/dist/cmd/dev/sync.d.ts +0 -12
- package/dist/cmd/dev/sync.d.ts.map +0 -1
- package/dist/cmd/dev/sync.js +0 -227
- package/dist/cmd/dev/sync.js.map +0 -1
- package/dist/cmd/dev/templates.d.ts +0 -3
- package/dist/cmd/dev/templates.d.ts.map +0 -1
- package/dist/cmd/dev/templates.js +0 -58
- package/dist/cmd/dev/templates.js.map +0 -1
- package/dist/cmd/project/download.d.ts +0 -35
- package/dist/cmd/project/download.d.ts.map +0 -1
- package/dist/cmd/project/download.js +0 -403
- package/dist/cmd/project/download.js.map +0 -1
- package/dist/cmd/project/templates.d.ts +0 -9
- package/dist/cmd/project/templates.d.ts.map +0 -1
- package/dist/cmd/project/templates.js +0 -34
- package/dist/cmd/project/templates.js.map +0 -1
- package/src/agents-docs.ts +0 -86
- package/src/cmd/ai/prompt/agent.md +0 -305
- package/src/cmd/ai/prompt/agent.ts +0 -31
- package/src/cmd/build/app-router-detector.ts +0 -320
- package/src/cmd/build/format-schema.ts +0 -66
- package/src/cmd/build/vite/agent-discovery.ts +0 -380
- package/src/cmd/build/vite/beacon-plugin.ts +0 -164
- package/src/cmd/build/vite/browser-env-plugin.ts +0 -34
- package/src/cmd/build/vite/bun-dev-server.ts +0 -458
- package/src/cmd/build/vite/bundle-files.ts +0 -135
- package/src/cmd/build/vite/config-loader.ts +0 -76
- package/src/cmd/build/vite/db-rewrite.ts +0 -189
- package/src/cmd/build/vite/docs-generator.ts +0 -103
- package/src/cmd/build/vite/env-types-generator.ts +0 -145
- package/src/cmd/build/vite/index.ts +0 -3
- package/src/cmd/build/vite/lifecycle-generator.ts +0 -381
- package/src/cmd/build/vite/metadata-generator.ts +0 -713
- package/src/cmd/build/vite/prompt-generator.ts +0 -169
- package/src/cmd/build/vite/public-asset-path-plugin.ts +0 -209
- package/src/cmd/build/vite/route-discovery.ts +0 -271
- package/src/cmd/build/vite/server-bundler.ts +0 -481
- package/src/cmd/build/vite/static-renderer.ts +0 -239
- package/src/cmd/build/vite/tailwind-source-plugin.ts +0 -73
- package/src/cmd/build/vite/vite-asset-server-config.ts +0 -349
- package/src/cmd/build/vite/vite-asset-server.ts +0 -154
- package/src/cmd/build/vite/vite-builder.ts +0 -503
- package/src/cmd/build/vite/workbench-generator.ts +0 -152
- package/src/cmd/build/vite/ws-proxy.ts +0 -126
- package/src/cmd/build/vite-bundler.ts +0 -137
- package/src/cmd/dev/agents.ts +0 -140
- package/src/cmd/dev/api.ts +0 -65
- package/src/cmd/dev/dev-lock.ts +0 -332
- package/src/cmd/dev/download.ts +0 -117
- package/src/cmd/dev/file-watcher.ts +0 -423
- package/src/cmd/dev/process-manager.ts +0 -261
- package/src/cmd/dev/sync.ts +0 -411
- package/src/cmd/dev/templates.ts +0 -66
- package/src/cmd/project/download.ts +0 -505
- package/src/cmd/project/templates.ts +0 -56
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project creation flow — framework-first scaffolding.
|
|
3
|
+
*
|
|
4
|
+
* Instead of custom Agentuity templates, the user picks a framework
|
|
5
|
+
* and we run its official create CLI, then augment with Agentuity integration.
|
|
6
|
+
*/
|
|
7
|
+
|
|
1
8
|
import { existsSync, readdirSync, rmSync, statSync } from 'node:fs';
|
|
2
9
|
import { homedir } from 'node:os';
|
|
3
10
|
import { basename, resolve } from 'node:path';
|
|
@@ -38,16 +45,14 @@ import {
|
|
|
38
45
|
printIntegrationExamples,
|
|
39
46
|
runAuthMigrations,
|
|
40
47
|
} from './auth/shared';
|
|
41
|
-
import {
|
|
42
|
-
import {
|
|
48
|
+
import { scaffoldFramework, setupProject, initGitRepo } from './scaffold';
|
|
49
|
+
import { frameworkCatalog, type FrameworkScaffold } from './frameworks';
|
|
43
50
|
|
|
44
51
|
interface CreateFlowOptions {
|
|
45
52
|
projectName?: string;
|
|
46
53
|
dir?: string;
|
|
47
54
|
domains?: string[];
|
|
48
|
-
|
|
49
|
-
templateDir?: string;
|
|
50
|
-
templateBranch?: string;
|
|
55
|
+
framework?: string;
|
|
51
56
|
noInstall: boolean;
|
|
52
57
|
noBuild: boolean;
|
|
53
58
|
skipPrompts: boolean;
|
|
@@ -67,7 +72,7 @@ export interface CreateFlowResult {
|
|
|
67
72
|
orgId?: string;
|
|
68
73
|
name: string;
|
|
69
74
|
path: string;
|
|
70
|
-
|
|
75
|
+
framework: string;
|
|
71
76
|
installed: boolean;
|
|
72
77
|
built: boolean;
|
|
73
78
|
domains?: string[];
|
|
@@ -79,9 +84,7 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
|
|
|
79
84
|
const {
|
|
80
85
|
projectName: initialProjectName,
|
|
81
86
|
dir: targetDir,
|
|
82
|
-
|
|
83
|
-
templateDir,
|
|
84
|
-
templateBranch,
|
|
87
|
+
framework: initialFramework,
|
|
85
88
|
skipPrompts,
|
|
86
89
|
logger,
|
|
87
90
|
auth,
|
|
@@ -98,26 +101,6 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
|
|
|
98
101
|
const isHeadless = !process.stdin.isTTY || !process.stdout.isTTY;
|
|
99
102
|
const isInteractive = !skipPrompts && !isHeadless;
|
|
100
103
|
|
|
101
|
-
// Fetch available templates
|
|
102
|
-
if (templateDir) {
|
|
103
|
-
tui.info(`📋 Loading templates from local directory: ${templateDir}...\n`);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
const templates = await tui.spinner({
|
|
107
|
-
message: 'Fetching templates',
|
|
108
|
-
clearOnSuccess: true,
|
|
109
|
-
callback: async () => {
|
|
110
|
-
return fetchTemplates(logger, templateDir, templateBranch);
|
|
111
|
-
},
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
if (templates.length === 0) {
|
|
115
|
-
logger.fatal('No templates available', ErrorCode.RESOURCE_NOT_FOUND);
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
// Get project name
|
|
119
|
-
let projectName = initialProjectName;
|
|
120
|
-
|
|
121
104
|
// Organization is now automatically selected by the CLI framework via optional: { org: true }
|
|
122
105
|
const orgId = selectedOrgId;
|
|
123
106
|
let catalystClient: ServerAPIClient | undefined;
|
|
@@ -135,6 +118,9 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
|
|
|
135
118
|
prompt.intro('Create Agentuity Project');
|
|
136
119
|
}
|
|
137
120
|
|
|
121
|
+
// Step 1: Get project name
|
|
122
|
+
let projectName = initialProjectName;
|
|
123
|
+
|
|
138
124
|
if (!projectName && isInteractive) {
|
|
139
125
|
projectName = await prompt.text({
|
|
140
126
|
message: 'What is the name of your project?',
|
|
@@ -157,13 +143,12 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
|
|
|
157
143
|
},
|
|
158
144
|
});
|
|
159
145
|
}
|
|
160
|
-
projectName = projectName || 'My First
|
|
146
|
+
projectName = projectName || 'My First App';
|
|
161
147
|
|
|
162
148
|
// Generate disk-friendly directory name
|
|
163
149
|
const dirName = projectName === '.' ? '.' : sanitizeDirectoryName(projectName);
|
|
164
150
|
|
|
165
151
|
// Determine destination directory
|
|
166
|
-
// Expand ~ to home directory
|
|
167
152
|
let expandedTargetDir = targetDir;
|
|
168
153
|
if (expandedTargetDir?.startsWith('~')) {
|
|
169
154
|
expandedTargetDir = expandedTargetDir.replace(/^~/, homedir());
|
|
@@ -175,7 +160,6 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
|
|
|
175
160
|
const destEmpty = destIsDir ? readdirSync(dest).length === 0 : !destExists;
|
|
176
161
|
|
|
177
162
|
if (destExists && !destEmpty && dirName !== '.') {
|
|
178
|
-
// In interactive mode, ask if they want to overwrite
|
|
179
163
|
if (isInteractive) {
|
|
180
164
|
tui.warning(`Directory ${dest} already exists and is not empty.`, true);
|
|
181
165
|
console.log(tui.tuiColors.secondary('│'));
|
|
@@ -189,7 +173,6 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
|
|
|
189
173
|
process.exit(0);
|
|
190
174
|
}
|
|
191
175
|
|
|
192
|
-
// Extra safety: refuse to delete root or home directories
|
|
193
176
|
const home = homedir();
|
|
194
177
|
if (dest === '/' || dest === home) {
|
|
195
178
|
logger.fatal(`Refusing to delete protected path: ${dest}`, ErrorCode.VALIDATION_FAILED);
|
|
@@ -206,83 +189,90 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
|
|
|
206
189
|
}
|
|
207
190
|
}
|
|
208
191
|
|
|
209
|
-
// Step
|
|
210
|
-
let
|
|
211
|
-
if (
|
|
212
|
-
const found =
|
|
192
|
+
// Step 2: Select framework
|
|
193
|
+
let selectedFramework: FrameworkScaffold;
|
|
194
|
+
if (initialFramework) {
|
|
195
|
+
const found = frameworkCatalog.find((f) => f.slug === initialFramework);
|
|
213
196
|
if (!found) {
|
|
214
|
-
const
|
|
215
|
-
.map((
|
|
197
|
+
const available = frameworkCatalog
|
|
198
|
+
.map((f) => ` - ${f.slug.padEnd(15)} ${f.description}`)
|
|
216
199
|
.join('\n');
|
|
217
200
|
logger.fatal(
|
|
218
|
-
`
|
|
201
|
+
`Framework "${initialFramework}" not found\n\nAvailable frameworks:\n${available}`,
|
|
219
202
|
ErrorCode.RESOURCE_NOT_FOUND
|
|
220
203
|
);
|
|
221
204
|
return undefined as never;
|
|
222
205
|
}
|
|
223
|
-
|
|
224
|
-
} else if (!isInteractive ||
|
|
225
|
-
const
|
|
226
|
-
if (!
|
|
227
|
-
logger.fatal('No
|
|
206
|
+
selectedFramework = found;
|
|
207
|
+
} else if (!isInteractive || frameworkCatalog.length === 1) {
|
|
208
|
+
const firstFramework = frameworkCatalog[0];
|
|
209
|
+
if (!firstFramework) {
|
|
210
|
+
logger.fatal('No frameworks available', ErrorCode.RESOURCE_NOT_FOUND);
|
|
228
211
|
return undefined as never;
|
|
229
212
|
}
|
|
230
|
-
|
|
213
|
+
selectedFramework = firstFramework;
|
|
231
214
|
} else {
|
|
232
215
|
let maxLength = 15;
|
|
233
|
-
|
|
234
|
-
if (maxLength <
|
|
235
|
-
maxLength =
|
|
216
|
+
frameworkCatalog.forEach((f) => {
|
|
217
|
+
if (maxLength < f.name.length) {
|
|
218
|
+
maxLength = f.name.length;
|
|
236
219
|
}
|
|
237
220
|
});
|
|
238
221
|
maxLength = Math.min(maxLength + 1, 40);
|
|
239
222
|
const [_winWidth] = process.stdout.getWindowSize();
|
|
240
|
-
const winWidth = _winWidth - maxLength - 8;
|
|
241
|
-
const
|
|
242
|
-
message: 'Select a
|
|
243
|
-
options:
|
|
244
|
-
value:
|
|
245
|
-
label:
|
|
223
|
+
const winWidth = _winWidth - maxLength - 8;
|
|
224
|
+
const frameworkId = await prompt.select({
|
|
225
|
+
message: 'Select a framework:',
|
|
226
|
+
options: frameworkCatalog.map((f) => ({
|
|
227
|
+
value: f.slug,
|
|
228
|
+
label: f.name.padEnd(maxLength),
|
|
246
229
|
hint:
|
|
247
|
-
|
|
248
|
-
?
|
|
249
|
-
:
|
|
230
|
+
f.description.length > winWidth
|
|
231
|
+
? f.description.substring(0, winWidth - 3) + '...'
|
|
232
|
+
: f.description,
|
|
250
233
|
})),
|
|
251
234
|
});
|
|
252
|
-
const found =
|
|
235
|
+
const found = frameworkCatalog.find((f) => f.slug === frameworkId);
|
|
253
236
|
if (!found) {
|
|
254
|
-
logger.fatal('
|
|
237
|
+
logger.fatal('Framework selection failed', ErrorCode.USER_CANCELLED);
|
|
255
238
|
return undefined as never;
|
|
256
239
|
}
|
|
257
|
-
|
|
240
|
+
selectedFramework = found;
|
|
258
241
|
}
|
|
259
242
|
|
|
260
|
-
//
|
|
261
|
-
|
|
243
|
+
// Step 3: Ask about AI example
|
|
244
|
+
let includeAiExample = true;
|
|
245
|
+
if (isInteractive && selectedFramework.aiExample) {
|
|
246
|
+
includeAiExample = await prompt.confirm({
|
|
247
|
+
message: 'Include an AI example? (OpenAI API route)',
|
|
248
|
+
initial: true,
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// Step 4: Scaffold the framework
|
|
253
|
+
await scaffoldFramework({
|
|
262
254
|
dest,
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
255
|
+
dirName,
|
|
256
|
+
framework: selectedFramework,
|
|
257
|
+
includeAiExample,
|
|
266
258
|
logger,
|
|
267
259
|
});
|
|
268
260
|
|
|
269
|
-
// Setup project (
|
|
261
|
+
// Step 5: Setup project (install deps)
|
|
270
262
|
const setupResult = await setupProject({
|
|
271
263
|
dest,
|
|
272
264
|
projectName: projectName === '.' ? basename(dest) : projectName,
|
|
273
|
-
dirName: dirName === '.' ? basename(dest) : dirName,
|
|
274
265
|
noInstall: options.noInstall,
|
|
275
|
-
noBuild: options.noBuild,
|
|
276
266
|
logger,
|
|
277
267
|
});
|
|
278
268
|
|
|
279
|
-
// If setup failed, skip resource prompts and registration
|
|
269
|
+
// If setup failed, skip resource prompts and registration
|
|
280
270
|
if (!setupResult.success) {
|
|
281
271
|
tui.warning('Project setup failed. Skipping resource configuration.');
|
|
282
272
|
return {
|
|
283
273
|
name: projectName,
|
|
284
274
|
path: dest,
|
|
285
|
-
|
|
275
|
+
framework: selectedFramework.slug,
|
|
286
276
|
installed: !options.noInstall,
|
|
287
277
|
built: false,
|
|
288
278
|
success: false,
|
|
@@ -290,9 +280,10 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
|
|
|
290
280
|
};
|
|
291
281
|
}
|
|
292
282
|
|
|
293
|
-
//
|
|
283
|
+
// ─── Resource provisioning (DB, storage, auth, DNS) ─────────────────────
|
|
284
|
+
// This section is unchanged from the original flow.
|
|
285
|
+
|
|
294
286
|
const canProvision = auth && apiClient && catalystClient && orgId && region;
|
|
295
|
-
// Only count as resource flags if actually requesting provisioning (not explicit skip)
|
|
296
287
|
const hasResourceFlags =
|
|
297
288
|
(databaseOption !== undefined && databaseOption.toLowerCase() !== 'skip') ||
|
|
298
289
|
(storageOption !== undefined && storageOption.toLowerCase() !== 'skip');
|
|
@@ -305,7 +296,6 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
|
|
|
305
296
|
let _domains = domains;
|
|
306
297
|
const resourceEnvVars: EnvVars = {};
|
|
307
298
|
|
|
308
|
-
// Validate that resource flags require authentication and registration
|
|
309
299
|
if (hasResourceFlags && !canProvision) {
|
|
310
300
|
logger.fatal(
|
|
311
301
|
'Cannot provision database/storage without being authenticated and registering the project.\n' +
|
|
@@ -314,7 +304,6 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
|
|
|
314
304
|
);
|
|
315
305
|
}
|
|
316
306
|
|
|
317
|
-
// Validate that --enable-auth requires authentication and registration
|
|
318
307
|
if (enableAuthOption && !canProvision) {
|
|
319
308
|
logger.fatal(
|
|
320
309
|
'Cannot enable Agentuity Auth without being authenticated and registering the project.\n' +
|
|
@@ -324,7 +313,6 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
|
|
|
324
313
|
}
|
|
325
314
|
|
|
326
315
|
if (canProvision) {
|
|
327
|
-
// Fetch resources for selected org and region using Catalyst API (needed for both interactive and CLI flags)
|
|
328
316
|
let resources: Awaited<ReturnType<typeof listResources>> | undefined;
|
|
329
317
|
|
|
330
318
|
const needResources =
|
|
@@ -340,26 +328,19 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
|
|
|
340
328
|
return listResources(catalystClient!, orgId!, region!);
|
|
341
329
|
},
|
|
342
330
|
});
|
|
343
|
-
// Log sanitized summary (avoid exposing DATABASE_URL, tokens, secrets)
|
|
344
331
|
logger.debug(
|
|
345
332
|
`Resources for org ${orgId} in region ${region}: ${resources.db.length} databases, ${resources.s3.length} storage buckets`
|
|
346
333
|
);
|
|
347
|
-
logger.debug(`Database names: ${resources.db.map((d) => d.name).join(', ') || '(none)'}`);
|
|
348
|
-
logger.debug(
|
|
349
|
-
`Storage buckets: ${resources.s3.map((b) => b.bucket_name).join(', ') || '(none)'}`
|
|
350
|
-
);
|
|
351
334
|
}
|
|
352
335
|
|
|
353
|
-
//
|
|
336
|
+
// Database action
|
|
354
337
|
let db_action: string;
|
|
355
338
|
if (databaseOption !== undefined) {
|
|
356
|
-
// CLI flag provided - normalize to expected values
|
|
357
339
|
if (databaseOption.toLowerCase() === 'new') {
|
|
358
340
|
db_action = 'Create New';
|
|
359
341
|
} else if (databaseOption.toLowerCase() === 'skip') {
|
|
360
342
|
db_action = 'Skip';
|
|
361
343
|
} else {
|
|
362
|
-
// Existing database name - validate it exists
|
|
363
344
|
const existingDb = resources?.db.find((d) => d.name === databaseOption);
|
|
364
345
|
if (!existingDb) {
|
|
365
346
|
logger.fatal(
|
|
@@ -382,20 +363,17 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
|
|
|
382
363
|
],
|
|
383
364
|
});
|
|
384
365
|
} else {
|
|
385
|
-
// Headless without flag - skip
|
|
386
366
|
db_action = 'Skip';
|
|
387
367
|
}
|
|
388
368
|
|
|
389
|
-
//
|
|
369
|
+
// Storage action
|
|
390
370
|
let s3_action: string;
|
|
391
371
|
if (storageOption !== undefined) {
|
|
392
|
-
// CLI flag provided - normalize to expected values
|
|
393
372
|
if (storageOption.toLowerCase() === 'new') {
|
|
394
373
|
s3_action = 'Create New';
|
|
395
374
|
} else if (storageOption.toLowerCase() === 'skip') {
|
|
396
375
|
s3_action = 'Skip';
|
|
397
376
|
} else {
|
|
398
|
-
// Existing bucket name - validate it exists
|
|
399
377
|
const existingBucket = resources?.s3.find((b) => b.bucket_name === storageOption);
|
|
400
378
|
if (!existingBucket) {
|
|
401
379
|
logger.fatal(
|
|
@@ -418,11 +396,10 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
|
|
|
418
396
|
],
|
|
419
397
|
});
|
|
420
398
|
} else {
|
|
421
|
-
// Headless without flag - skip
|
|
422
399
|
s3_action = 'Skip';
|
|
423
400
|
}
|
|
424
401
|
|
|
425
|
-
// Custom DNS
|
|
402
|
+
// Custom DNS
|
|
426
403
|
if (!domains?.length && isInteractive) {
|
|
427
404
|
const customDns = await prompt.text({
|
|
428
405
|
message: 'Setup custom DNS?',
|
|
@@ -439,13 +416,12 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
|
|
|
439
416
|
}
|
|
440
417
|
}
|
|
441
418
|
|
|
442
|
-
// Process storage
|
|
419
|
+
// Process storage
|
|
443
420
|
switch (s3_action) {
|
|
444
421
|
case 'Create New': {
|
|
445
422
|
let bucketName: string | undefined;
|
|
446
423
|
let bucketDescription: string | undefined;
|
|
447
424
|
|
|
448
|
-
// Only prompt for name/description in interactive mode
|
|
449
425
|
if (isInteractive) {
|
|
450
426
|
const bucketNameInput = await prompt.text({
|
|
451
427
|
message: 'Bucket name',
|
|
@@ -478,17 +454,14 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
|
|
|
478
454
|
]);
|
|
479
455
|
},
|
|
480
456
|
});
|
|
481
|
-
// Collect env vars from newly created resource
|
|
482
457
|
if (created[0]?.env) {
|
|
483
458
|
Object.assign(resourceEnvVars, created[0].env);
|
|
484
459
|
}
|
|
485
460
|
break;
|
|
486
461
|
}
|
|
487
|
-
case 'Skip':
|
|
462
|
+
case 'Skip':
|
|
488
463
|
break;
|
|
489
|
-
}
|
|
490
464
|
default: {
|
|
491
|
-
// User selected an existing bucket - get env vars from the resources list
|
|
492
465
|
const selectedBucket = resources?.s3.find((b) => b.bucket_name === s3_action);
|
|
493
466
|
if (selectedBucket?.env) {
|
|
494
467
|
Object.assign(resourceEnvVars, selectedBucket.env);
|
|
@@ -497,13 +470,12 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
|
|
|
497
470
|
}
|
|
498
471
|
}
|
|
499
472
|
|
|
500
|
-
// Process database
|
|
473
|
+
// Process database
|
|
501
474
|
switch (db_action) {
|
|
502
475
|
case 'Create New': {
|
|
503
476
|
let dbName: string | undefined;
|
|
504
477
|
let dbDescription: string | undefined;
|
|
505
478
|
|
|
506
|
-
// Only prompt for name/description in interactive mode
|
|
507
479
|
if (isInteractive) {
|
|
508
480
|
const dbNameInput = await prompt.text({
|
|
509
481
|
message: 'Database name',
|
|
@@ -536,17 +508,14 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
|
|
|
536
508
|
]);
|
|
537
509
|
},
|
|
538
510
|
});
|
|
539
|
-
// Collect env vars from newly created resource
|
|
540
511
|
if (created[0]?.env) {
|
|
541
512
|
Object.assign(resourceEnvVars, created[0].env);
|
|
542
513
|
}
|
|
543
514
|
break;
|
|
544
515
|
}
|
|
545
|
-
case 'Skip':
|
|
516
|
+
case 'Skip':
|
|
546
517
|
break;
|
|
547
|
-
}
|
|
548
518
|
default: {
|
|
549
|
-
// User selected an existing database - get env vars from the resources list
|
|
550
519
|
const selectedDb = resources?.db.find((d) => d.name === db_action);
|
|
551
520
|
if (selectedDb?.env) {
|
|
552
521
|
Object.assign(resourceEnvVars, selectedDb.env);
|
|
@@ -556,19 +525,15 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
|
|
|
556
525
|
}
|
|
557
526
|
}
|
|
558
527
|
|
|
559
|
-
// Auth setup
|
|
560
|
-
const templateHasAuth = selectedTemplate.id === 'agentuity-auth';
|
|
528
|
+
// ─── Auth setup ─────────────────────────────────────────────────────────
|
|
561
529
|
|
|
562
|
-
let authEnabled =
|
|
530
|
+
let authEnabled = false;
|
|
563
531
|
let authDatabaseName: string | undefined;
|
|
564
532
|
let authDatabaseUrl: string | undefined;
|
|
565
533
|
|
|
566
|
-
// Handle auth enablement: CLI flag > interactive prompt > disabled (headless)
|
|
567
534
|
if (enableAuthOption !== undefined) {
|
|
568
|
-
// CLI flag provided
|
|
569
535
|
authEnabled = enableAuthOption;
|
|
570
|
-
} else if (canProvision && isInteractive
|
|
571
|
-
// For non-auth templates in interactive mode, ask if they want to enable auth
|
|
536
|
+
} else if (canProvision && isInteractive) {
|
|
572
537
|
const enableAuth = await prompt.select({
|
|
573
538
|
message: 'Enable Agentuity Authentication?',
|
|
574
539
|
options: [
|
|
@@ -581,26 +546,20 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
|
|
|
581
546
|
authEnabled = true;
|
|
582
547
|
}
|
|
583
548
|
}
|
|
584
|
-
// In headless mode without --enable-auth flag, authEnabled stays false (unless template has auth)
|
|
585
549
|
|
|
586
|
-
// Set up database and secret for any auth-enabled project
|
|
587
550
|
if (authEnabled && canProvision) {
|
|
588
|
-
// If a database was already selected/created above, use it for auth
|
|
589
551
|
if (resourceEnvVars.DATABASE_URL) {
|
|
590
552
|
authDatabaseUrl = resourceEnvVars.DATABASE_URL;
|
|
591
|
-
// Extract database name from URL using proper URL parsing
|
|
592
553
|
try {
|
|
593
554
|
const dbUrl = new URL(authDatabaseUrl);
|
|
594
|
-
const dbName = dbUrl.pathname.replace(/^\/+/, '');
|
|
595
|
-
// Validate: non-empty and contains only safe characters
|
|
555
|
+
const dbName = dbUrl.pathname.replace(/^\/+/, '');
|
|
596
556
|
if (dbName && /^[A-Za-z0-9_-]+$/.test(dbName)) {
|
|
597
557
|
authDatabaseName = dbName;
|
|
598
558
|
}
|
|
599
559
|
} catch {
|
|
600
|
-
// Invalid URL format
|
|
560
|
+
// Invalid URL format
|
|
601
561
|
}
|
|
602
562
|
} else {
|
|
603
|
-
// No database selected yet, create one for auth
|
|
604
563
|
const created = await tui.spinner({
|
|
605
564
|
message: 'Provisioning database for auth',
|
|
606
565
|
clearOnSuccess: true,
|
|
@@ -615,33 +574,26 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
|
|
|
615
574
|
}
|
|
616
575
|
authDatabaseName = createdDb.name;
|
|
617
576
|
|
|
618
|
-
// Get env vars from created resource
|
|
619
577
|
if (createdDb.env) {
|
|
620
578
|
authDatabaseUrl = createdDb.env.DATABASE_URL;
|
|
621
|
-
// Also add to resourceEnvVars if not already set
|
|
622
579
|
if (!resourceEnvVars.DATABASE_URL) {
|
|
623
580
|
Object.assign(resourceEnvVars, createdDb.env);
|
|
624
581
|
}
|
|
625
582
|
}
|
|
626
583
|
}
|
|
627
584
|
|
|
628
|
-
|
|
629
|
-
if (!templateHasAuth) {
|
|
630
|
-
await ensureAuthDependencies({ projectDir: dest, logger });
|
|
585
|
+
await ensureAuthDependencies({ projectDir: dest, logger });
|
|
631
586
|
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
await Bun.write(resolve(srcDir, '.gitkeep'), '');
|
|
638
|
-
}
|
|
639
|
-
await Bun.write(authFilePath, generateAuthFileContent());
|
|
640
|
-
tui.success('Created src/auth.ts');
|
|
587
|
+
const authFilePath = resolve(dest, 'src', 'auth.ts');
|
|
588
|
+
if (!existsSync(authFilePath)) {
|
|
589
|
+
const srcDir = resolve(dest, 'src');
|
|
590
|
+
if (!existsSync(srcDir)) {
|
|
591
|
+
await Bun.write(resolve(srcDir, '.gitkeep'), '');
|
|
641
592
|
}
|
|
593
|
+
await Bun.write(authFilePath, generateAuthFileContent());
|
|
594
|
+
tui.success('Created src/auth.ts');
|
|
642
595
|
}
|
|
643
596
|
|
|
644
|
-
// Run migrations
|
|
645
597
|
if (authDatabaseName) {
|
|
646
598
|
const sql = await tui.spinner({
|
|
647
599
|
message: 'Preparing auth database schema...',
|
|
@@ -661,6 +613,8 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
|
|
|
661
613
|
}
|
|
662
614
|
}
|
|
663
615
|
|
|
616
|
+
// ─── Cloud registration ─────────────────────────────────────────────────
|
|
617
|
+
|
|
664
618
|
let projectId: string | undefined;
|
|
665
619
|
|
|
666
620
|
if (auth && apiClient && orgId) {
|
|
@@ -702,17 +656,16 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
|
|
|
702
656
|
},
|
|
703
657
|
});
|
|
704
658
|
|
|
705
|
-
// Add auth secret
|
|
659
|
+
// Add auth secret
|
|
706
660
|
if (authEnabled && !resourceEnvVars.AGENTUITY_AUTH_SECRET) {
|
|
707
661
|
const devSecret = `dev-${crypto.randomUUID()}`;
|
|
708
662
|
resourceEnvVars.AGENTUITY_AUTH_SECRET = devSecret;
|
|
709
663
|
}
|
|
710
664
|
|
|
711
|
-
// Write resource
|
|
665
|
+
// Write resource env vars
|
|
712
666
|
if (Object.keys(resourceEnvVars).length > 0) {
|
|
713
667
|
await addResourceEnvVars(dest, resourceEnvVars);
|
|
714
668
|
|
|
715
|
-
// Show user feedback for auth-related env vars
|
|
716
669
|
if (authEnabled) {
|
|
717
670
|
if (resourceEnvVars.DATABASE_URL) {
|
|
718
671
|
tui.success('DATABASE_URL added to .env');
|
|
@@ -726,7 +679,7 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
|
|
|
726
679
|
}
|
|
727
680
|
}
|
|
728
681
|
|
|
729
|
-
//
|
|
682
|
+
// Sync env vars to cloud
|
|
730
683
|
if (projectId) {
|
|
731
684
|
await tui.spinner({
|
|
732
685
|
message: 'Syncing environment variables',
|
|
@@ -749,7 +702,6 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
|
|
|
749
702
|
);
|
|
750
703
|
}
|
|
751
704
|
} catch (error) {
|
|
752
|
-
// Non-fatal: just log the error
|
|
753
705
|
logger.debug('Failed to sync environment variables:', error);
|
|
754
706
|
}
|
|
755
707
|
},
|
|
@@ -757,7 +709,8 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
|
|
|
757
709
|
}
|
|
758
710
|
}
|
|
759
711
|
|
|
760
|
-
//
|
|
712
|
+
// ─── Git initialization ─────────────────────────────────────────────────
|
|
713
|
+
|
|
761
714
|
let botAuthor: { name: string; email: string } | undefined;
|
|
762
715
|
if (apiClient) {
|
|
763
716
|
try {
|
|
@@ -767,14 +720,14 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
|
|
|
767
720
|
}
|
|
768
721
|
}
|
|
769
722
|
|
|
770
|
-
// Initialize git repository after all files are generated
|
|
771
723
|
await initGitRepo(dest, {
|
|
772
724
|
projectName,
|
|
773
|
-
source: `
|
|
725
|
+
source: `framework: ${selectedFramework.name}`,
|
|
774
726
|
author: botAuthor,
|
|
775
727
|
});
|
|
776
728
|
|
|
777
|
-
//
|
|
729
|
+
// ─── Completion ─────────────────────────────────────────────────────────
|
|
730
|
+
|
|
778
731
|
if (isInteractive) {
|
|
779
732
|
if (setupResult.success) {
|
|
780
733
|
tui.success('✨ Project created successfully!\n');
|
|
@@ -782,9 +735,7 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
|
|
|
782
735
|
tui.warning('Project created with errors (see above)\n');
|
|
783
736
|
}
|
|
784
737
|
|
|
785
|
-
// Show next steps in a box with primary color for commands
|
|
786
738
|
if (dirName !== '.') {
|
|
787
|
-
// Use relative path if dest is under cwd, otherwise show full path
|
|
788
739
|
const currentDir = cwd();
|
|
789
740
|
const dirDisplay = dest.startsWith(currentDir) ? basename(dest) : dest;
|
|
790
741
|
note(
|
|
@@ -819,8 +770,7 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
|
|
|
819
770
|
}
|
|
820
771
|
}
|
|
821
772
|
|
|
822
|
-
|
|
823
|
-
if (authEnabled && !templateHasAuth) {
|
|
773
|
+
if (authEnabled) {
|
|
824
774
|
printIntegrationExamples();
|
|
825
775
|
}
|
|
826
776
|
|
|
@@ -829,7 +779,7 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
|
|
|
829
779
|
orgId,
|
|
830
780
|
name: projectName,
|
|
831
781
|
path: dest,
|
|
832
|
-
|
|
782
|
+
framework: selectedFramework.slug,
|
|
833
783
|
installed: !options.noInstall,
|
|
834
784
|
built: !options.noBuild && setupResult.success,
|
|
835
785
|
domains: _domains,
|
|
@@ -840,19 +790,15 @@ export async function runCreateFlow(options: CreateFlowOptions): Promise<CreateF
|
|
|
840
790
|
|
|
841
791
|
/**
|
|
842
792
|
* Sanitize a project name to create a safe directory/package name
|
|
843
|
-
* - Converts to lowercase
|
|
844
|
-
* - Replaces spaces and underscores with hyphens
|
|
845
|
-
* - Removes unsafe characters
|
|
846
|
-
* - Ensures it starts with a letter or number
|
|
847
793
|
*/
|
|
848
794
|
function sanitizeDirectoryName(name: string): string {
|
|
849
795
|
return name
|
|
850
796
|
.toLowerCase()
|
|
851
797
|
.trim()
|
|
852
|
-
.replace(/\s+/g, '-')
|
|
853
|
-
.replace(/_+/g, '-')
|
|
854
|
-
.replace(/[^a-z0-9-]/g, '')
|
|
855
|
-
.replace(/-+/g, '-')
|
|
856
|
-
.replace(/^-+|-+$/g, '')
|
|
857
|
-
.replace(/^[^a-z0-9]+/, '');
|
|
798
|
+
.replace(/\s+/g, '-')
|
|
799
|
+
.replace(/_+/g, '-')
|
|
800
|
+
.replace(/[^a-z0-9-]/g, '')
|
|
801
|
+
.replace(/-+/g, '-')
|
|
802
|
+
.replace(/^-+|-+$/g, '')
|
|
803
|
+
.replace(/^[^a-z0-9]+/, '');
|
|
858
804
|
}
|