@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,9 @@
|
|
|
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
|
+
*/
|
|
1
7
|
import { existsSync, readdirSync, rmSync, statSync } from 'node:fs';
|
|
2
8
|
import { homedir } from 'node:os';
|
|
3
9
|
import { basename, resolve } from 'node:path';
|
|
@@ -12,28 +18,12 @@ import * as tui from '../../tui';
|
|
|
12
18
|
import { createPrompt, note } from '../../tui';
|
|
13
19
|
import { getGithubBotIdentity } from '../git/api';
|
|
14
20
|
import { ensureAuthDependencies, generateAuthFileContent, generateAuthSchemaSql, printIntegrationExamples, runAuthMigrations, } from './auth/shared';
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
21
|
+
import { scaffoldFramework, setupProject, initGitRepo } from './scaffold';
|
|
22
|
+
import { frameworkCatalog } from './frameworks';
|
|
17
23
|
export async function runCreateFlow(options) {
|
|
18
|
-
const { projectName: initialProjectName, dir: targetDir,
|
|
24
|
+
const { projectName: initialProjectName, dir: targetDir, framework: initialFramework, skipPrompts, logger, auth, config, orgId: selectedOrgId, region, apiClient, domains, database: databaseOption, storage: storageOption, enableAuth: enableAuthOption, } = options;
|
|
19
25
|
const isHeadless = !process.stdin.isTTY || !process.stdout.isTTY;
|
|
20
26
|
const isInteractive = !skipPrompts && !isHeadless;
|
|
21
|
-
// Fetch available templates
|
|
22
|
-
if (templateDir) {
|
|
23
|
-
tui.info(`📋 Loading templates from local directory: ${templateDir}...\n`);
|
|
24
|
-
}
|
|
25
|
-
const templates = await tui.spinner({
|
|
26
|
-
message: 'Fetching templates',
|
|
27
|
-
clearOnSuccess: true,
|
|
28
|
-
callback: async () => {
|
|
29
|
-
return fetchTemplates(logger, templateDir, templateBranch);
|
|
30
|
-
},
|
|
31
|
-
});
|
|
32
|
-
if (templates.length === 0) {
|
|
33
|
-
logger.fatal('No templates available', ErrorCode.RESOURCE_NOT_FOUND);
|
|
34
|
-
}
|
|
35
|
-
// Get project name
|
|
36
|
-
let projectName = initialProjectName;
|
|
37
27
|
// Organization is now automatically selected by the CLI framework via optional: { org: true }
|
|
38
28
|
const orgId = selectedOrgId;
|
|
39
29
|
let catalystClient;
|
|
@@ -47,6 +37,8 @@ export async function runCreateFlow(options) {
|
|
|
47
37
|
if (isInteractive) {
|
|
48
38
|
prompt.intro('Create Agentuity Project');
|
|
49
39
|
}
|
|
40
|
+
// Step 1: Get project name
|
|
41
|
+
let projectName = initialProjectName;
|
|
50
42
|
if (!projectName && isInteractive) {
|
|
51
43
|
projectName = await prompt.text({
|
|
52
44
|
message: 'What is the name of your project?',
|
|
@@ -69,11 +61,10 @@ export async function runCreateFlow(options) {
|
|
|
69
61
|
},
|
|
70
62
|
});
|
|
71
63
|
}
|
|
72
|
-
projectName = projectName || 'My First
|
|
64
|
+
projectName = projectName || 'My First App';
|
|
73
65
|
// Generate disk-friendly directory name
|
|
74
66
|
const dirName = projectName === '.' ? '.' : sanitizeDirectoryName(projectName);
|
|
75
67
|
// Determine destination directory
|
|
76
|
-
// Expand ~ to home directory
|
|
77
68
|
let expandedTargetDir = targetDir;
|
|
78
69
|
if (expandedTargetDir?.startsWith('~')) {
|
|
79
70
|
expandedTargetDir = expandedTargetDir.replace(/^~/, homedir());
|
|
@@ -84,7 +75,6 @@ export async function runCreateFlow(options) {
|
|
|
84
75
|
const destIsDir = destExists ? statSync(dest).isDirectory() : false;
|
|
85
76
|
const destEmpty = destIsDir ? readdirSync(dest).length === 0 : !destExists;
|
|
86
77
|
if (destExists && !destEmpty && dirName !== '.') {
|
|
87
|
-
// In interactive mode, ask if they want to overwrite
|
|
88
78
|
if (isInteractive) {
|
|
89
79
|
tui.warning(`Directory ${dest} already exists and is not empty.`, true);
|
|
90
80
|
console.log(tui.tuiColors.secondary('│'));
|
|
@@ -96,7 +86,6 @@ export async function runCreateFlow(options) {
|
|
|
96
86
|
tui.info('Operation cancelled');
|
|
97
87
|
process.exit(0);
|
|
98
88
|
}
|
|
99
|
-
// Extra safety: refuse to delete root or home directories
|
|
100
89
|
const home = homedir();
|
|
101
90
|
if (dest === '/' || dest === home) {
|
|
102
91
|
logger.fatal(`Refusing to delete protected path: ${dest}`, ErrorCode.VALIDATION_FAILED);
|
|
@@ -110,87 +99,93 @@ export async function runCreateFlow(options) {
|
|
|
110
99
|
logger.fatal(`Directory ${dest} already exists and is not empty.`, ErrorCode.RESOURCE_ALREADY_EXISTS);
|
|
111
100
|
}
|
|
112
101
|
}
|
|
113
|
-
// Step
|
|
114
|
-
let
|
|
115
|
-
if (
|
|
116
|
-
const found =
|
|
102
|
+
// Step 2: Select framework
|
|
103
|
+
let selectedFramework;
|
|
104
|
+
if (initialFramework) {
|
|
105
|
+
const found = frameworkCatalog.find((f) => f.slug === initialFramework);
|
|
117
106
|
if (!found) {
|
|
118
|
-
const
|
|
119
|
-
.map((
|
|
107
|
+
const available = frameworkCatalog
|
|
108
|
+
.map((f) => ` - ${f.slug.padEnd(15)} ${f.description}`)
|
|
120
109
|
.join('\n');
|
|
121
|
-
logger.fatal(`
|
|
110
|
+
logger.fatal(`Framework "${initialFramework}" not found\n\nAvailable frameworks:\n${available}`, ErrorCode.RESOURCE_NOT_FOUND);
|
|
122
111
|
return undefined;
|
|
123
112
|
}
|
|
124
|
-
|
|
113
|
+
selectedFramework = found;
|
|
125
114
|
}
|
|
126
|
-
else if (!isInteractive ||
|
|
127
|
-
const
|
|
128
|
-
if (!
|
|
129
|
-
logger.fatal('No
|
|
115
|
+
else if (!isInteractive || frameworkCatalog.length === 1) {
|
|
116
|
+
const firstFramework = frameworkCatalog[0];
|
|
117
|
+
if (!firstFramework) {
|
|
118
|
+
logger.fatal('No frameworks available', ErrorCode.RESOURCE_NOT_FOUND);
|
|
130
119
|
return undefined;
|
|
131
120
|
}
|
|
132
|
-
|
|
121
|
+
selectedFramework = firstFramework;
|
|
133
122
|
}
|
|
134
123
|
else {
|
|
135
124
|
let maxLength = 15;
|
|
136
|
-
|
|
137
|
-
if (maxLength <
|
|
138
|
-
maxLength =
|
|
125
|
+
frameworkCatalog.forEach((f) => {
|
|
126
|
+
if (maxLength < f.name.length) {
|
|
127
|
+
maxLength = f.name.length;
|
|
139
128
|
}
|
|
140
129
|
});
|
|
141
130
|
maxLength = Math.min(maxLength + 1, 40);
|
|
142
131
|
const [_winWidth] = process.stdout.getWindowSize();
|
|
143
|
-
const winWidth = _winWidth - maxLength - 8;
|
|
144
|
-
const
|
|
145
|
-
message: 'Select a
|
|
146
|
-
options:
|
|
147
|
-
value:
|
|
148
|
-
label:
|
|
149
|
-
hint:
|
|
150
|
-
?
|
|
151
|
-
:
|
|
132
|
+
const winWidth = _winWidth - maxLength - 8;
|
|
133
|
+
const frameworkId = await prompt.select({
|
|
134
|
+
message: 'Select a framework:',
|
|
135
|
+
options: frameworkCatalog.map((f) => ({
|
|
136
|
+
value: f.slug,
|
|
137
|
+
label: f.name.padEnd(maxLength),
|
|
138
|
+
hint: f.description.length > winWidth
|
|
139
|
+
? f.description.substring(0, winWidth - 3) + '...'
|
|
140
|
+
: f.description,
|
|
152
141
|
})),
|
|
153
142
|
});
|
|
154
|
-
const found =
|
|
143
|
+
const found = frameworkCatalog.find((f) => f.slug === frameworkId);
|
|
155
144
|
if (!found) {
|
|
156
|
-
logger.fatal('
|
|
145
|
+
logger.fatal('Framework selection failed', ErrorCode.USER_CANCELLED);
|
|
157
146
|
return undefined;
|
|
158
147
|
}
|
|
159
|
-
|
|
148
|
+
selectedFramework = found;
|
|
149
|
+
}
|
|
150
|
+
// Step 3: Ask about AI example
|
|
151
|
+
let includeAiExample = true;
|
|
152
|
+
if (isInteractive && selectedFramework.aiExample) {
|
|
153
|
+
includeAiExample = await prompt.confirm({
|
|
154
|
+
message: 'Include an AI example? (OpenAI API route)',
|
|
155
|
+
initial: true,
|
|
156
|
+
});
|
|
160
157
|
}
|
|
161
|
-
//
|
|
162
|
-
await
|
|
158
|
+
// Step 4: Scaffold the framework
|
|
159
|
+
await scaffoldFramework({
|
|
163
160
|
dest,
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
161
|
+
dirName,
|
|
162
|
+
framework: selectedFramework,
|
|
163
|
+
includeAiExample,
|
|
167
164
|
logger,
|
|
168
165
|
});
|
|
169
|
-
// Setup project (
|
|
166
|
+
// Step 5: Setup project (install deps)
|
|
170
167
|
const setupResult = await setupProject({
|
|
171
168
|
dest,
|
|
172
169
|
projectName: projectName === '.' ? basename(dest) : projectName,
|
|
173
|
-
dirName: dirName === '.' ? basename(dest) : dirName,
|
|
174
170
|
noInstall: options.noInstall,
|
|
175
|
-
noBuild: options.noBuild,
|
|
176
171
|
logger,
|
|
177
172
|
});
|
|
178
|
-
// If setup failed, skip resource prompts and registration
|
|
173
|
+
// If setup failed, skip resource prompts and registration
|
|
179
174
|
if (!setupResult.success) {
|
|
180
175
|
tui.warning('Project setup failed. Skipping resource configuration.');
|
|
181
176
|
return {
|
|
182
177
|
name: projectName,
|
|
183
178
|
path: dest,
|
|
184
|
-
|
|
179
|
+
framework: selectedFramework.slug,
|
|
185
180
|
installed: !options.noInstall,
|
|
186
181
|
built: false,
|
|
187
182
|
success: false,
|
|
188
183
|
error: 'Project setup completed with errors',
|
|
189
184
|
};
|
|
190
185
|
}
|
|
191
|
-
//
|
|
186
|
+
// ─── Resource provisioning (DB, storage, auth, DNS) ─────────────────────
|
|
187
|
+
// This section is unchanged from the original flow.
|
|
192
188
|
const canProvision = auth && apiClient && catalystClient && orgId && region;
|
|
193
|
-
// Only count as resource flags if actually requesting provisioning (not explicit skip)
|
|
194
189
|
const hasResourceFlags = (databaseOption !== undefined && databaseOption.toLowerCase() !== 'skip') ||
|
|
195
190
|
(storageOption !== undefined && storageOption.toLowerCase() !== 'skip');
|
|
196
191
|
if (isInteractive && canProvision) {
|
|
@@ -199,18 +194,15 @@ export async function runCreateFlow(options) {
|
|
|
199
194
|
}
|
|
200
195
|
let _domains = domains;
|
|
201
196
|
const resourceEnvVars = {};
|
|
202
|
-
// Validate that resource flags require authentication and registration
|
|
203
197
|
if (hasResourceFlags && !canProvision) {
|
|
204
198
|
logger.fatal('Cannot provision database/storage without being authenticated and registering the project.\n' +
|
|
205
199
|
'Remove --no-register or omit --database/--storage flags.', ErrorCode.VALIDATION_FAILED);
|
|
206
200
|
}
|
|
207
|
-
// Validate that --enable-auth requires authentication and registration
|
|
208
201
|
if (enableAuthOption && !canProvision) {
|
|
209
202
|
logger.fatal('Cannot enable Agentuity Auth without being authenticated and registering the project.\n' +
|
|
210
203
|
'Remove --no-register or omit --enable-auth flag.', ErrorCode.VALIDATION_FAILED);
|
|
211
204
|
}
|
|
212
205
|
if (canProvision) {
|
|
213
|
-
// Fetch resources for selected org and region using Catalyst API (needed for both interactive and CLI flags)
|
|
214
206
|
let resources;
|
|
215
207
|
const needResources = isInteractive ||
|
|
216
208
|
(databaseOption && databaseOption !== 'skip' && databaseOption !== 'new') ||
|
|
@@ -223,15 +215,11 @@ export async function runCreateFlow(options) {
|
|
|
223
215
|
return listResources(catalystClient, orgId, region);
|
|
224
216
|
},
|
|
225
217
|
});
|
|
226
|
-
// Log sanitized summary (avoid exposing DATABASE_URL, tokens, secrets)
|
|
227
218
|
logger.debug(`Resources for org ${orgId} in region ${region}: ${resources.db.length} databases, ${resources.s3.length} storage buckets`);
|
|
228
|
-
logger.debug(`Database names: ${resources.db.map((d) => d.name).join(', ') || '(none)'}`);
|
|
229
|
-
logger.debug(`Storage buckets: ${resources.s3.map((b) => b.bucket_name).join(', ') || '(none)'}`);
|
|
230
219
|
}
|
|
231
|
-
//
|
|
220
|
+
// Database action
|
|
232
221
|
let db_action;
|
|
233
222
|
if (databaseOption !== undefined) {
|
|
234
|
-
// CLI flag provided - normalize to expected values
|
|
235
223
|
if (databaseOption.toLowerCase() === 'new') {
|
|
236
224
|
db_action = 'Create New';
|
|
237
225
|
}
|
|
@@ -239,7 +227,6 @@ export async function runCreateFlow(options) {
|
|
|
239
227
|
db_action = 'Skip';
|
|
240
228
|
}
|
|
241
229
|
else {
|
|
242
|
-
// Existing database name - validate it exists
|
|
243
230
|
const existingDb = resources?.db.find((d) => d.name === databaseOption);
|
|
244
231
|
if (!existingDb) {
|
|
245
232
|
logger.fatal(`Database '${databaseOption}' not found. Use 'new' to create a new database or 'skip' to skip.`, ErrorCode.RESOURCE_NOT_FOUND);
|
|
@@ -261,13 +248,11 @@ export async function runCreateFlow(options) {
|
|
|
261
248
|
});
|
|
262
249
|
}
|
|
263
250
|
else {
|
|
264
|
-
// Headless without flag - skip
|
|
265
251
|
db_action = 'Skip';
|
|
266
252
|
}
|
|
267
|
-
//
|
|
253
|
+
// Storage action
|
|
268
254
|
let s3_action;
|
|
269
255
|
if (storageOption !== undefined) {
|
|
270
|
-
// CLI flag provided - normalize to expected values
|
|
271
256
|
if (storageOption.toLowerCase() === 'new') {
|
|
272
257
|
s3_action = 'Create New';
|
|
273
258
|
}
|
|
@@ -275,7 +260,6 @@ export async function runCreateFlow(options) {
|
|
|
275
260
|
s3_action = 'Skip';
|
|
276
261
|
}
|
|
277
262
|
else {
|
|
278
|
-
// Existing bucket name - validate it exists
|
|
279
263
|
const existingBucket = resources?.s3.find((b) => b.bucket_name === storageOption);
|
|
280
264
|
if (!existingBucket) {
|
|
281
265
|
logger.fatal(`Storage bucket '${storageOption}' not found. Use 'new' to create a new bucket or 'skip' to skip.`, ErrorCode.RESOURCE_NOT_FOUND);
|
|
@@ -297,10 +281,9 @@ export async function runCreateFlow(options) {
|
|
|
297
281
|
});
|
|
298
282
|
}
|
|
299
283
|
else {
|
|
300
|
-
// Headless without flag - skip
|
|
301
284
|
s3_action = 'Skip';
|
|
302
285
|
}
|
|
303
|
-
// Custom DNS
|
|
286
|
+
// Custom DNS
|
|
304
287
|
if (!domains?.length && isInteractive) {
|
|
305
288
|
const customDns = await prompt.text({
|
|
306
289
|
message: 'Setup custom DNS?',
|
|
@@ -313,12 +296,11 @@ export async function runCreateFlow(options) {
|
|
|
313
296
|
_domains = [customDns];
|
|
314
297
|
}
|
|
315
298
|
}
|
|
316
|
-
// Process storage
|
|
299
|
+
// Process storage
|
|
317
300
|
switch (s3_action) {
|
|
318
301
|
case 'Create New': {
|
|
319
302
|
let bucketName;
|
|
320
303
|
let bucketDescription;
|
|
321
|
-
// Only prompt for name/description in interactive mode
|
|
322
304
|
if (isInteractive) {
|
|
323
305
|
const bucketNameInput = await prompt.text({
|
|
324
306
|
message: 'Bucket name',
|
|
@@ -351,17 +333,14 @@ export async function runCreateFlow(options) {
|
|
|
351
333
|
]);
|
|
352
334
|
},
|
|
353
335
|
});
|
|
354
|
-
// Collect env vars from newly created resource
|
|
355
336
|
if (created[0]?.env) {
|
|
356
337
|
Object.assign(resourceEnvVars, created[0].env);
|
|
357
338
|
}
|
|
358
339
|
break;
|
|
359
340
|
}
|
|
360
|
-
case 'Skip':
|
|
341
|
+
case 'Skip':
|
|
361
342
|
break;
|
|
362
|
-
}
|
|
363
343
|
default: {
|
|
364
|
-
// User selected an existing bucket - get env vars from the resources list
|
|
365
344
|
const selectedBucket = resources?.s3.find((b) => b.bucket_name === s3_action);
|
|
366
345
|
if (selectedBucket?.env) {
|
|
367
346
|
Object.assign(resourceEnvVars, selectedBucket.env);
|
|
@@ -369,12 +348,11 @@ export async function runCreateFlow(options) {
|
|
|
369
348
|
break;
|
|
370
349
|
}
|
|
371
350
|
}
|
|
372
|
-
// Process database
|
|
351
|
+
// Process database
|
|
373
352
|
switch (db_action) {
|
|
374
353
|
case 'Create New': {
|
|
375
354
|
let dbName;
|
|
376
355
|
let dbDescription;
|
|
377
|
-
// Only prompt for name/description in interactive mode
|
|
378
356
|
if (isInteractive) {
|
|
379
357
|
const dbNameInput = await prompt.text({
|
|
380
358
|
message: 'Database name',
|
|
@@ -407,17 +385,14 @@ export async function runCreateFlow(options) {
|
|
|
407
385
|
]);
|
|
408
386
|
},
|
|
409
387
|
});
|
|
410
|
-
// Collect env vars from newly created resource
|
|
411
388
|
if (created[0]?.env) {
|
|
412
389
|
Object.assign(resourceEnvVars, created[0].env);
|
|
413
390
|
}
|
|
414
391
|
break;
|
|
415
392
|
}
|
|
416
|
-
case 'Skip':
|
|
393
|
+
case 'Skip':
|
|
417
394
|
break;
|
|
418
|
-
}
|
|
419
395
|
default: {
|
|
420
|
-
// User selected an existing database - get env vars from the resources list
|
|
421
396
|
const selectedDb = resources?.db.find((d) => d.name === db_action);
|
|
422
397
|
if (selectedDb?.env) {
|
|
423
398
|
Object.assign(resourceEnvVars, selectedDb.env);
|
|
@@ -426,18 +401,14 @@ export async function runCreateFlow(options) {
|
|
|
426
401
|
}
|
|
427
402
|
}
|
|
428
403
|
}
|
|
429
|
-
// Auth setup
|
|
430
|
-
|
|
431
|
-
let authEnabled = templateHasAuth; // Auth templates have auth enabled by default
|
|
404
|
+
// ─── Auth setup ─────────────────────────────────────────────────────────
|
|
405
|
+
let authEnabled = false;
|
|
432
406
|
let authDatabaseName;
|
|
433
407
|
let authDatabaseUrl;
|
|
434
|
-
// Handle auth enablement: CLI flag > interactive prompt > disabled (headless)
|
|
435
408
|
if (enableAuthOption !== undefined) {
|
|
436
|
-
// CLI flag provided
|
|
437
409
|
authEnabled = enableAuthOption;
|
|
438
410
|
}
|
|
439
|
-
else if (canProvision && isInteractive
|
|
440
|
-
// For non-auth templates in interactive mode, ask if they want to enable auth
|
|
411
|
+
else if (canProvision && isInteractive) {
|
|
441
412
|
const enableAuth = await prompt.select({
|
|
442
413
|
message: 'Enable Agentuity Authentication?',
|
|
443
414
|
options: [
|
|
@@ -449,27 +420,21 @@ export async function runCreateFlow(options) {
|
|
|
449
420
|
authEnabled = true;
|
|
450
421
|
}
|
|
451
422
|
}
|
|
452
|
-
// In headless mode without --enable-auth flag, authEnabled stays false (unless template has auth)
|
|
453
|
-
// Set up database and secret for any auth-enabled project
|
|
454
423
|
if (authEnabled && canProvision) {
|
|
455
|
-
// If a database was already selected/created above, use it for auth
|
|
456
424
|
if (resourceEnvVars.DATABASE_URL) {
|
|
457
425
|
authDatabaseUrl = resourceEnvVars.DATABASE_URL;
|
|
458
|
-
// Extract database name from URL using proper URL parsing
|
|
459
426
|
try {
|
|
460
427
|
const dbUrl = new URL(authDatabaseUrl);
|
|
461
|
-
const dbName = dbUrl.pathname.replace(/^\/+/, '');
|
|
462
|
-
// Validate: non-empty and contains only safe characters
|
|
428
|
+
const dbName = dbUrl.pathname.replace(/^\/+/, '');
|
|
463
429
|
if (dbName && /^[A-Za-z0-9_-]+$/.test(dbName)) {
|
|
464
430
|
authDatabaseName = dbName;
|
|
465
431
|
}
|
|
466
432
|
}
|
|
467
433
|
catch {
|
|
468
|
-
// Invalid URL format
|
|
434
|
+
// Invalid URL format
|
|
469
435
|
}
|
|
470
436
|
}
|
|
471
437
|
else {
|
|
472
|
-
// No database selected yet, create one for auth
|
|
473
438
|
const created = await tui.spinner({
|
|
474
439
|
message: 'Provisioning database for auth',
|
|
475
440
|
clearOnSuccess: true,
|
|
@@ -483,30 +448,23 @@ export async function runCreateFlow(options) {
|
|
|
483
448
|
return undefined;
|
|
484
449
|
}
|
|
485
450
|
authDatabaseName = createdDb.name;
|
|
486
|
-
// Get env vars from created resource
|
|
487
451
|
if (createdDb.env) {
|
|
488
452
|
authDatabaseUrl = createdDb.env.DATABASE_URL;
|
|
489
|
-
// Also add to resourceEnvVars if not already set
|
|
490
453
|
if (!resourceEnvVars.DATABASE_URL) {
|
|
491
454
|
Object.assign(resourceEnvVars, createdDb.env);
|
|
492
455
|
}
|
|
493
456
|
}
|
|
494
457
|
}
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
const srcDir = resolve(dest, 'src');
|
|
502
|
-
if (!existsSync(srcDir)) {
|
|
503
|
-
await Bun.write(resolve(srcDir, '.gitkeep'), '');
|
|
504
|
-
}
|
|
505
|
-
await Bun.write(authFilePath, generateAuthFileContent());
|
|
506
|
-
tui.success('Created src/auth.ts');
|
|
458
|
+
await ensureAuthDependencies({ projectDir: dest, logger });
|
|
459
|
+
const authFilePath = resolve(dest, 'src', 'auth.ts');
|
|
460
|
+
if (!existsSync(authFilePath)) {
|
|
461
|
+
const srcDir = resolve(dest, 'src');
|
|
462
|
+
if (!existsSync(srcDir)) {
|
|
463
|
+
await Bun.write(resolve(srcDir, '.gitkeep'), '');
|
|
507
464
|
}
|
|
465
|
+
await Bun.write(authFilePath, generateAuthFileContent());
|
|
466
|
+
tui.success('Created src/auth.ts');
|
|
508
467
|
}
|
|
509
|
-
// Run migrations
|
|
510
468
|
if (authDatabaseName) {
|
|
511
469
|
const sql = await tui.spinner({
|
|
512
470
|
message: 'Preparing auth database schema...',
|
|
@@ -524,6 +482,7 @@ export async function runCreateFlow(options) {
|
|
|
524
482
|
});
|
|
525
483
|
}
|
|
526
484
|
}
|
|
485
|
+
// ─── Cloud registration ─────────────────────────────────────────────────
|
|
527
486
|
let projectId;
|
|
528
487
|
if (auth && apiClient && orgId) {
|
|
529
488
|
const cloudRegion = region ?? process.env.AGENTUITY_REGION ?? 'usc';
|
|
@@ -558,15 +517,14 @@ export async function runCreateFlow(options) {
|
|
|
558
517
|
});
|
|
559
518
|
},
|
|
560
519
|
});
|
|
561
|
-
// Add auth secret
|
|
520
|
+
// Add auth secret
|
|
562
521
|
if (authEnabled && !resourceEnvVars.AGENTUITY_AUTH_SECRET) {
|
|
563
522
|
const devSecret = `dev-${crypto.randomUUID()}`;
|
|
564
523
|
resourceEnvVars.AGENTUITY_AUTH_SECRET = devSecret;
|
|
565
524
|
}
|
|
566
|
-
// Write resource
|
|
525
|
+
// Write resource env vars
|
|
567
526
|
if (Object.keys(resourceEnvVars).length > 0) {
|
|
568
527
|
await addResourceEnvVars(dest, resourceEnvVars);
|
|
569
|
-
// Show user feedback for auth-related env vars
|
|
570
528
|
if (authEnabled) {
|
|
571
529
|
if (resourceEnvVars.DATABASE_URL) {
|
|
572
530
|
tui.success('DATABASE_URL added to .env');
|
|
@@ -577,7 +535,7 @@ export async function runCreateFlow(options) {
|
|
|
577
535
|
}
|
|
578
536
|
}
|
|
579
537
|
}
|
|
580
|
-
//
|
|
538
|
+
// Sync env vars to cloud
|
|
581
539
|
if (projectId) {
|
|
582
540
|
await tui.spinner({
|
|
583
541
|
message: 'Syncing environment variables',
|
|
@@ -598,14 +556,13 @@ export async function runCreateFlow(options) {
|
|
|
598
556
|
}
|
|
599
557
|
}
|
|
600
558
|
catch (error) {
|
|
601
|
-
// Non-fatal: just log the error
|
|
602
559
|
logger.debug('Failed to sync environment variables:', error);
|
|
603
560
|
}
|
|
604
561
|
},
|
|
605
562
|
});
|
|
606
563
|
}
|
|
607
564
|
}
|
|
608
|
-
//
|
|
565
|
+
// ─── Git initialization ─────────────────────────────────────────────────
|
|
609
566
|
let botAuthor;
|
|
610
567
|
if (apiClient) {
|
|
611
568
|
try {
|
|
@@ -615,13 +572,12 @@ export async function runCreateFlow(options) {
|
|
|
615
572
|
// Non-fatal: fall back to generic Agentuity author
|
|
616
573
|
}
|
|
617
574
|
}
|
|
618
|
-
// Initialize git repository after all files are generated
|
|
619
575
|
await initGitRepo(dest, {
|
|
620
576
|
projectName,
|
|
621
|
-
source: `
|
|
577
|
+
source: `framework: ${selectedFramework.name}`,
|
|
622
578
|
author: botAuthor,
|
|
623
579
|
});
|
|
624
|
-
//
|
|
580
|
+
// ─── Completion ─────────────────────────────────────────────────────────
|
|
625
581
|
if (isInteractive) {
|
|
626
582
|
if (setupResult.success) {
|
|
627
583
|
tui.success('✨ Project created successfully!\n');
|
|
@@ -629,9 +585,7 @@ export async function runCreateFlow(options) {
|
|
|
629
585
|
else {
|
|
630
586
|
tui.warning('Project created with errors (see above)\n');
|
|
631
587
|
}
|
|
632
|
-
// Show next steps in a box with primary color for commands
|
|
633
588
|
if (dirName !== '.') {
|
|
634
|
-
// Use relative path if dest is under cwd, otherwise show full path
|
|
635
589
|
const currentDir = cwd();
|
|
636
590
|
const dirDisplay = dest.startsWith(currentDir) ? basename(dest) : dest;
|
|
637
591
|
note(`${tui.tuiColors.primary(`cd ${dirDisplay}`)}\n${tui.tuiColors.primary('bun run dev')}`, 'Next steps');
|
|
@@ -659,8 +613,7 @@ export async function runCreateFlow(options) {
|
|
|
659
613
|
await promptForDNS(projectId, _domains, cloudRegion, config);
|
|
660
614
|
}
|
|
661
615
|
}
|
|
662
|
-
|
|
663
|
-
if (authEnabled && !templateHasAuth) {
|
|
616
|
+
if (authEnabled) {
|
|
664
617
|
printIntegrationExamples();
|
|
665
618
|
}
|
|
666
619
|
return {
|
|
@@ -668,7 +621,7 @@ export async function runCreateFlow(options) {
|
|
|
668
621
|
orgId,
|
|
669
622
|
name: projectName,
|
|
670
623
|
path: dest,
|
|
671
|
-
|
|
624
|
+
framework: selectedFramework.slug,
|
|
672
625
|
installed: !options.noInstall,
|
|
673
626
|
built: !options.noBuild && setupResult.success,
|
|
674
627
|
domains: _domains,
|
|
@@ -678,20 +631,16 @@ export async function runCreateFlow(options) {
|
|
|
678
631
|
}
|
|
679
632
|
/**
|
|
680
633
|
* Sanitize a project name to create a safe directory/package name
|
|
681
|
-
* - Converts to lowercase
|
|
682
|
-
* - Replaces spaces and underscores with hyphens
|
|
683
|
-
* - Removes unsafe characters
|
|
684
|
-
* - Ensures it starts with a letter or number
|
|
685
634
|
*/
|
|
686
635
|
function sanitizeDirectoryName(name) {
|
|
687
636
|
return name
|
|
688
637
|
.toLowerCase()
|
|
689
638
|
.trim()
|
|
690
|
-
.replace(/\s+/g, '-')
|
|
691
|
-
.replace(/_+/g, '-')
|
|
692
|
-
.replace(/[^a-z0-9-]/g, '')
|
|
693
|
-
.replace(/-+/g, '-')
|
|
694
|
-
.replace(/^-+|-+$/g, '')
|
|
695
|
-
.replace(/^[^a-z0-9]+/, '');
|
|
639
|
+
.replace(/\s+/g, '-')
|
|
640
|
+
.replace(/_+/g, '-')
|
|
641
|
+
.replace(/[^a-z0-9-]/g, '')
|
|
642
|
+
.replace(/-+/g, '-')
|
|
643
|
+
.replace(/^-+|-+$/g, '')
|
|
644
|
+
.replace(/^[^a-z0-9]+/, '');
|
|
696
645
|
}
|
|
697
646
|
//# sourceMappingURL=template-flow.js.map
|