@idealyst/cli 1.2.0 → 1.2.3
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/commands/add.js +233 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/index.js +13 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/info.js +193 -0
- package/dist/commands/info.js.map +1 -0
- package/dist/commands/init.js +155 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/constants.js +125 -0
- package/dist/constants.js.map +1 -0
- package/dist/generators/core/index.js +23 -0
- package/dist/generators/core/index.js.map +1 -0
- package/dist/generators/core/mobile.js +251 -0
- package/dist/generators/core/mobile.js.map +1 -0
- package/dist/generators/core/shared.js +474 -0
- package/dist/generators/core/shared.js.map +1 -0
- package/dist/generators/core/web.js +330 -0
- package/dist/generators/core/web.js.map +1 -0
- package/dist/generators/extensions/api.js +223 -0
- package/dist/generators/extensions/api.js.map +1 -0
- package/dist/generators/extensions/devcontainer.js +575 -0
- package/dist/generators/extensions/devcontainer.js.map +1 -0
- package/dist/generators/extensions/graphql.js +202 -0
- package/dist/generators/extensions/graphql.js.map +1 -0
- package/dist/generators/extensions/index.js +17 -0
- package/dist/generators/extensions/index.js.map +1 -0
- package/dist/generators/extensions/prisma.js +249 -0
- package/dist/generators/extensions/prisma.js.map +1 -0
- package/dist/generators/extensions/trpc.js +258 -0
- package/dist/generators/extensions/trpc.js.map +1 -0
- package/dist/generators/index.js +122 -4
- package/dist/generators/index.js.map +1 -1
- package/dist/generators/reactNative.js +253 -0
- package/dist/generators/reactNative.js.map +1 -0
- package/dist/generators/workspace.js +303 -0
- package/dist/generators/workspace.js.map +1 -0
- package/dist/identifiers/android.js +75 -0
- package/dist/identifiers/android.js.map +1 -0
- package/dist/identifiers/index.js +35 -0
- package/dist/identifiers/index.js.map +1 -0
- package/dist/identifiers/ios.js +65 -0
- package/dist/identifiers/ios.js.map +1 -0
- package/dist/index.js +41 -319
- package/dist/index.js.map +1 -1
- package/dist/templates/copier.js +135 -0
- package/dist/templates/copier.js.map +1 -0
- package/dist/templates/index.js +23 -0
- package/dist/templates/index.js.map +1 -0
- package/dist/templates/merger.js +113 -0
- package/dist/templates/merger.js.map +1 -0
- package/dist/templates/processor.js +142 -0
- package/dist/templates/processor.js.map +1 -0
- package/dist/types/commands/add.d.ts +14 -0
- package/dist/types/commands/index.d.ts +6 -0
- package/dist/types/commands/info.d.ts +10 -0
- package/dist/types/commands/init.d.ts +19 -0
- package/dist/types/constants.d.ts +82 -0
- package/dist/types/generators/core/index.d.ts +6 -0
- package/dist/types/generators/core/mobile.d.ts +14 -0
- package/dist/types/generators/core/shared.d.ts +8 -0
- package/dist/types/generators/core/web.d.ts +8 -0
- package/dist/types/generators/extensions/api.d.ts +8 -0
- package/dist/types/generators/extensions/devcontainer.d.ts +15 -0
- package/dist/types/generators/extensions/graphql.d.ts +8 -0
- package/dist/types/generators/extensions/index.d.ts +8 -0
- package/dist/types/generators/extensions/prisma.d.ts +8 -0
- package/dist/types/generators/extensions/trpc.d.ts +9 -0
- package/dist/types/generators/index.d.ts +11 -3
- package/dist/types/generators/reactNative.d.ts +19 -0
- package/dist/types/generators/workspace.d.ts +8 -0
- package/dist/types/identifiers/android.d.ts +26 -0
- package/dist/types/identifiers/index.d.ts +26 -0
- package/dist/types/identifiers/ios.d.ts +21 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/templates/copier.d.ts +24 -0
- package/dist/types/templates/index.d.ts +6 -0
- package/dist/types/templates/merger.d.ts +43 -0
- package/dist/types/templates/processor.d.ts +39 -0
- package/dist/types/types.d.ts +184 -5
- package/dist/types/utils/filesystem.d.ts +56 -0
- package/dist/types/utils/index.d.ts +7 -0
- package/dist/types/utils/logger.d.ts +64 -0
- package/dist/types/utils/shell.d.ts +35 -0
- package/dist/types/utils/validation.d.ts +32 -0
- package/dist/types/wizard/index.d.ts +20 -0
- package/dist/types/wizard/steps/apiExtension.d.ts +5 -0
- package/dist/types/wizard/steps/appDisplayName.d.ts +5 -0
- package/dist/types/wizard/steps/devcontainerExtension.d.ts +5 -0
- package/dist/types/wizard/steps/graphqlExtension.d.ts +5 -0
- package/dist/types/wizard/steps/index.d.ts +12 -0
- package/dist/types/wizard/steps/orgDomain.d.ts +5 -0
- package/dist/types/wizard/steps/prismaExtension.d.ts +5 -0
- package/dist/types/wizard/steps/projectName.d.ts +5 -0
- package/dist/types/wizard/steps/summary.d.ts +5 -0
- package/dist/types/wizard/steps/trpcExtension.d.ts +5 -0
- package/dist/types/wizard/validators.d.ts +17 -0
- package/dist/types.js +74 -0
- package/dist/types.js.map +1 -1
- package/dist/utils/filesystem.js +173 -0
- package/dist/utils/filesystem.js.map +1 -0
- package/dist/utils/index.js +24 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.js +106 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/shell.js +113 -0
- package/dist/utils/shell.js.map +1 -0
- package/dist/utils/validation.js +196 -0
- package/dist/utils/validation.js.map +1 -0
- package/dist/wizard/index.js +177 -0
- package/dist/wizard/index.js.map +1 -0
- package/dist/wizard/steps/apiExtension.js +33 -0
- package/dist/wizard/steps/apiExtension.js.map +1 -0
- package/dist/wizard/steps/appDisplayName.js +53 -0
- package/dist/wizard/steps/appDisplayName.js.map +1 -0
- package/dist/wizard/steps/devcontainerExtension.js +131 -0
- package/dist/wizard/steps/devcontainerExtension.js.map +1 -0
- package/dist/wizard/steps/graphqlExtension.js +37 -0
- package/dist/wizard/steps/graphqlExtension.js.map +1 -0
- package/dist/wizard/steps/index.js +25 -0
- package/dist/wizard/steps/index.js.map +1 -0
- package/dist/wizard/steps/orgDomain.js +40 -0
- package/dist/wizard/steps/orgDomain.js.map +1 -0
- package/dist/wizard/steps/prismaExtension.js +33 -0
- package/dist/wizard/steps/prismaExtension.js.map +1 -0
- package/dist/wizard/steps/projectName.js +40 -0
- package/dist/wizard/steps/projectName.js.map +1 -0
- package/dist/wizard/steps/summary.js +119 -0
- package/dist/wizard/steps/summary.js.map +1 -0
- package/dist/wizard/steps/trpcExtension.js +37 -0
- package/dist/wizard/steps/trpcExtension.js.map +1 -0
- package/dist/wizard/validators.js +35 -0
- package/dist/wizard/validators.js.map +1 -0
- package/package.json +6 -19
- package/README.md +0 -110
- package/dist/generators/init.js +0 -268
- package/dist/generators/init.js.map +0 -1
- package/dist/generators/utils.js +0 -682
- package/dist/generators/utils.js.map +0 -1
- package/dist/scripts/configure-react-native-monorepo.js +0 -144
- package/dist/scripts/configure-react-native-monorepo.js.map +0 -1
- package/dist/template/.devcontainer/Dockerfile +0 -26
- package/dist/template/.devcontainer/devcontainer.json +0 -113
- package/dist/template/.devcontainer/docker-compose.yml +0 -59
- package/dist/template/.devcontainer/figma-mcp.sh +0 -32
- package/dist/template/.devcontainer/gitignore.template +0 -2
- package/dist/template/.devcontainer/setup.sh +0 -45
- package/dist/template/DOCKER.md +0 -0
- package/dist/template/Dockerfile +0 -111
- package/dist/template/README.md +0 -233
- package/dist/template/docker/nginx/prod.conf +0 -238
- package/dist/template/docker/nginx.conf +0 -131
- package/dist/template/docker/postgres/init.sql +0 -41
- package/dist/template/docker/prometheus/prometheus.yml +0 -52
- package/dist/template/docker-compose.prod.yml +0 -146
- package/dist/template/docker-compose.yml +0 -143
- package/dist/template/dockerignore.template +0 -151
- package/dist/template/env.example.template +0 -36
- package/dist/template/gitignore.template +0 -56
- package/dist/template/jest.config.js +0 -20
- package/dist/template/mcp.json.template +0 -8
- package/dist/template/package.json +0 -45
- package/dist/template/packages/api/README.md +0 -510
- package/dist/template/packages/api/__tests__/api.test.ts +0 -26
- package/dist/template/packages/api/env.example.template +0 -6
- package/dist/template/packages/api/gitignore.template +0 -35
- package/dist/template/packages/api/jest.config.js +0 -23
- package/dist/template/packages/api/jest.setup.js +0 -9
- package/dist/template/packages/api/package.json +0 -66
- package/dist/template/packages/api/src/context.ts +0 -52
- package/dist/template/packages/api/src/controllers/TestController.ts +0 -0
- package/dist/template/packages/api/src/graphql/builder.ts +0 -75
- package/dist/template/packages/api/src/graphql/generated.ts +0 -64
- package/dist/template/packages/api/src/graphql/index.ts +0 -75
- package/dist/template/packages/api/src/graphql/types/index.ts +0 -44
- package/dist/template/packages/api/src/graphql/types/test.ts +0 -245
- package/dist/template/packages/api/src/index.ts +0 -26
- package/dist/template/packages/api/src/lib/database.ts +0 -23
- package/dist/template/packages/api/src/router/index.ts +0 -163
- package/dist/template/packages/api/src/routers/test.ts +0 -161
- package/dist/template/packages/api/src/server.ts +0 -68
- package/dist/template/packages/api/src/trpc.ts +0 -28
- package/dist/template/packages/api/tsconfig.json +0 -44
- package/dist/template/packages/database/README.md +0 -162
- package/dist/template/packages/database/gitignore.template +0 -41
- package/dist/template/packages/database/package.json +0 -49
- package/dist/template/packages/database/prisma/seed.ts +0 -64
- package/dist/template/packages/database/schema.prisma +0 -107
- package/dist/template/packages/database/src/index.ts +0 -15
- package/dist/template/packages/database/src/validators.ts +0 -10
- package/dist/template/packages/database/tsconfig.json +0 -18
- package/dist/template/packages/mobile/README.md +0 -86
- package/dist/template/packages/mobile/__tests__/App.test.tsx +0 -156
- package/dist/template/packages/mobile/__tests__/components.test.tsx +0 -300
- package/dist/template/packages/mobile/app.json +0 -5
- package/dist/template/packages/mobile/babel.config.js +0 -10
- package/dist/template/packages/mobile/gitignore.template +0 -73
- package/dist/template/packages/mobile/index.js +0 -6
- package/dist/template/packages/mobile/jest.config.js +0 -21
- package/dist/template/packages/mobile/jest.setup.js +0 -12
- package/dist/template/packages/mobile/metro.config.js +0 -36
- package/dist/template/packages/mobile/package.json +0 -60
- package/dist/template/packages/mobile/src/App.tsx +0 -8
- package/dist/template/packages/mobile/src/utils/trpc.ts +0 -7
- package/dist/template/packages/mobile/tsconfig.json +0 -28
- package/dist/template/packages/shared/README.md +0 -135
- package/dist/template/packages/shared/__tests__/shared.test.ts +0 -51
- package/dist/template/packages/shared/gitignore.template +0 -35
- package/dist/template/packages/shared/jest.config.js +0 -22
- package/dist/template/packages/shared/package.json +0 -68
- package/dist/template/packages/shared/src/components/App.tsx +0 -57
- package/dist/template/packages/shared/src/components/HelloWorld.tsx +0 -531
- package/dist/template/packages/shared/src/components/index.ts +0 -1
- package/dist/template/packages/shared/src/graphql/client.ts +0 -34
- package/dist/template/packages/shared/src/index.ts +0 -22
- package/dist/template/packages/shared/src/navigation/AppRouter.tsx +0 -565
- package/dist/template/packages/shared/src/trpc/client.ts +0 -44
- package/dist/template/packages/shared/tsconfig.json +0 -22
- package/dist/template/packages/web/README.md +0 -131
- package/dist/template/packages/web/__tests__/App.test.tsx +0 -342
- package/dist/template/packages/web/__tests__/components.test.tsx +0 -564
- package/dist/template/packages/web/gitignore.template +0 -35
- package/dist/template/packages/web/index.html +0 -13
- package/dist/template/packages/web/jest.config.js +0 -27
- package/dist/template/packages/web/jest.setup.js +0 -24
- package/dist/template/packages/web/package.json +0 -69
- package/dist/template/packages/web/src/App.tsx +0 -14
- package/dist/template/packages/web/src/components/TestDemo.tsx +0 -164
- package/dist/template/packages/web/src/main.tsx +0 -25
- package/dist/template/packages/web/src/utils/trpc.ts +0 -7
- package/dist/template/packages/web/tsconfig.json +0 -26
- package/dist/template/packages/web/vite.config.ts +0 -98
- package/dist/template/setup.sh +0 -30
- package/dist/template/tsconfig.json +0 -22
- package/dist/template/yarnrc.yml.template +0 -4
- package/dist/types/generators/init.d.ts +0 -5
- package/dist/types/generators/utils.d.ts +0 -45
- package/dist/types/scripts/configure-react-native-monorepo.d.ts +0 -23
- package/template/.devcontainer/Dockerfile +0 -26
- package/template/.devcontainer/devcontainer.json +0 -113
- package/template/.devcontainer/docker-compose.yml +0 -59
- package/template/.devcontainer/figma-mcp.sh +0 -32
- package/template/.devcontainer/setup.sh +0 -45
- package/template/.dockerignore +0 -151
- package/template/.env.example +0 -36
- package/template/.env.production +0 -56
- package/template/DOCKER.md +0 -0
- package/template/Dockerfile +0 -111
- package/template/README.md +0 -233
- package/template/docker/nginx/prod.conf +0 -238
- package/template/docker/nginx.conf +0 -131
- package/template/docker/postgres/init.sql +0 -41
- package/template/docker/prometheus/prometheus.yml +0 -52
- package/template/docker-compose.prod.yml +0 -146
- package/template/docker-compose.yml +0 -143
- package/template/jest.config.js +0 -20
- package/template/package.json +0 -45
- package/template/packages/api/.env.example +0 -6
- package/template/packages/api/README.md +0 -510
- package/template/packages/api/__tests__/api.test.ts +0 -26
- package/template/packages/api/jest.config.js +0 -23
- package/template/packages/api/jest.setup.js +0 -9
- package/template/packages/api/package.json +0 -66
- package/template/packages/api/src/context.ts +0 -52
- package/template/packages/api/src/controllers/TestController.ts +0 -0
- package/template/packages/api/src/graphql/builder.ts +0 -75
- package/template/packages/api/src/graphql/generated.ts +0 -64
- package/template/packages/api/src/graphql/index.ts +0 -75
- package/template/packages/api/src/graphql/types/index.ts +0 -44
- package/template/packages/api/src/graphql/types/test.ts +0 -245
- package/template/packages/api/src/index.ts +0 -26
- package/template/packages/api/src/lib/database.ts +0 -23
- package/template/packages/api/src/router/index.ts +0 -163
- package/template/packages/api/src/routers/test.ts +0 -161
- package/template/packages/api/src/server.ts +0 -68
- package/template/packages/api/src/trpc.ts +0 -28
- package/template/packages/api/tsconfig.json +0 -44
- package/template/packages/database/README.md +0 -162
- package/template/packages/database/package.json +0 -49
- package/template/packages/database/prisma/seed.ts +0 -64
- package/template/packages/database/schema.prisma +0 -107
- package/template/packages/database/src/index.ts +0 -15
- package/template/packages/database/src/validators.ts +0 -10
- package/template/packages/database/tsconfig.json +0 -18
- package/template/packages/mobile/README.md +0 -86
- package/template/packages/mobile/__tests__/App.test.tsx +0 -156
- package/template/packages/mobile/__tests__/components.test.tsx +0 -300
- package/template/packages/mobile/app.json +0 -5
- package/template/packages/mobile/babel.config.js +0 -26
- package/template/packages/mobile/index.js +0 -8
- package/template/packages/mobile/jest.config.js +0 -21
- package/template/packages/mobile/jest.setup.js +0 -12
- package/template/packages/mobile/metro.config.js +0 -36
- package/template/packages/mobile/package.json +0 -60
- package/template/packages/mobile/src/App.tsx +0 -8
- package/template/packages/mobile/src/utils/trpc.ts +0 -7
- package/template/packages/mobile/tsconfig.json +0 -28
- package/template/packages/shared/README.md +0 -135
- package/template/packages/shared/__tests__/shared.test.ts +0 -51
- package/template/packages/shared/jest.config.js +0 -22
- package/template/packages/shared/package.json +0 -68
- package/template/packages/shared/src/components/App.tsx +0 -57
- package/template/packages/shared/src/components/HelloWorld.tsx +0 -531
- package/template/packages/shared/src/components/index.ts +0 -1
- package/template/packages/shared/src/graphql/client.ts +0 -34
- package/template/packages/shared/src/index.ts +0 -25
- package/template/packages/shared/src/navigation/AppRouter.tsx +0 -565
- package/template/packages/shared/src/trpc/client.ts +0 -44
- package/template/packages/shared/src/unistyles.ts +0 -50
- package/template/packages/shared/tsconfig.json +0 -22
- package/template/packages/web/README.md +0 -131
- package/template/packages/web/__tests__/App.test.tsx +0 -342
- package/template/packages/web/__tests__/components.test.tsx +0 -564
- package/template/packages/web/index.html +0 -13
- package/template/packages/web/jest.config.js +0 -27
- package/template/packages/web/jest.setup.js +0 -24
- package/template/packages/web/package.json +0 -69
- package/template/packages/web/src/App.tsx +0 -14
- package/template/packages/web/src/components/TestDemo.tsx +0 -164
- package/template/packages/web/src/main.tsx +0 -27
- package/template/packages/web/src/utils/trpc.ts +0 -7
- package/template/packages/web/tsconfig.json +0 -26
- package/template/packages/web/vite.config.ts +0 -114
- package/template/setup.sh +0 -30
- package/template/tsconfig.json +0 -22
|
@@ -0,0 +1,575 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Devcontainer extension generator
|
|
4
|
+
*
|
|
5
|
+
* Creates a development container setup with optional services:
|
|
6
|
+
* - Base: Node.js, Yarn, Expo CLI (always included)
|
|
7
|
+
* - Optional: PostgreSQL database
|
|
8
|
+
* - Optional: Redis cache
|
|
9
|
+
* - Optional: Headless Chrome for browser automation
|
|
10
|
+
* - Optional: Claude Code with MCP servers
|
|
11
|
+
*/
|
|
12
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
13
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
14
|
+
};
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.applyDevcontainerExtension = applyDevcontainerExtension;
|
|
17
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
18
|
+
const path_1 = __importDefault(require("path"));
|
|
19
|
+
const logger_1 = require("../../utils/logger");
|
|
20
|
+
/**
|
|
21
|
+
* Normalize devcontainer config from boolean or object
|
|
22
|
+
*/
|
|
23
|
+
function normalizeDevcontainerConfig(config) {
|
|
24
|
+
if (typeof config === 'boolean') {
|
|
25
|
+
// If just --with-devcontainer flag was used, enable all services with default MCP servers
|
|
26
|
+
return {
|
|
27
|
+
enabled: config,
|
|
28
|
+
postgres: config,
|
|
29
|
+
redis: config,
|
|
30
|
+
chrome: config,
|
|
31
|
+
claudeCode: config,
|
|
32
|
+
mcpServers: config ? ['idealyst', 'serena'] : [],
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
// Ensure mcpServers array exists
|
|
36
|
+
return {
|
|
37
|
+
...config,
|
|
38
|
+
mcpServers: config.mcpServers ?? [],
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Generate MCP server setup commands for the selected servers
|
|
43
|
+
*/
|
|
44
|
+
function generateMcpSetupCommands(servers, config) {
|
|
45
|
+
const commands = [];
|
|
46
|
+
for (const server of servers) {
|
|
47
|
+
switch (server) {
|
|
48
|
+
case 'idealyst':
|
|
49
|
+
commands.push(`
|
|
50
|
+
# Idealyst MCP (component documentation)
|
|
51
|
+
claude mcp add idealyst -s user -- npx -y @idealyst/mcp-server@latest 2>/dev/null || true`);
|
|
52
|
+
break;
|
|
53
|
+
case 'serena':
|
|
54
|
+
commands.push(`
|
|
55
|
+
# Serena MCP (code navigation and semantic search)
|
|
56
|
+
claude mcp add serena -s user -- npx -y @anthropic-ai/mcp-serena@latest 2>/dev/null || true`);
|
|
57
|
+
break;
|
|
58
|
+
case 'playwright':
|
|
59
|
+
if (config.chrome) {
|
|
60
|
+
commands.push(`
|
|
61
|
+
# Playwright MCP (connects to browserless chrome)
|
|
62
|
+
claude mcp add playwright -s user -- npx -y @anthropic-ai/mcp-playwright@latest --browser-ws-endpoint ws://chrome:3000 2>/dev/null || true`);
|
|
63
|
+
}
|
|
64
|
+
break;
|
|
65
|
+
case 'postgres':
|
|
66
|
+
if (config.postgres) {
|
|
67
|
+
commands.push(`
|
|
68
|
+
# PostgreSQL MCP (database queries)
|
|
69
|
+
claude mcp add postgres -s user -- npx -y @anthropic-ai/mcp-postgres@latest \$DATABASE_URL 2>/dev/null || true`);
|
|
70
|
+
}
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return commands.join('\n');
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Apply devcontainer extension to a project
|
|
78
|
+
*/
|
|
79
|
+
async function applyDevcontainerExtension(projectPath, data, devcontainerConfig) {
|
|
80
|
+
// Normalize config - default to all services if not specified
|
|
81
|
+
const config = normalizeDevcontainerConfig(devcontainerConfig ?? true);
|
|
82
|
+
if (!config.enabled) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
logger_1.logger.info('Creating devcontainer configuration...');
|
|
86
|
+
const devcontainerDir = path_1.default.join(projectPath, '.devcontainer');
|
|
87
|
+
await fs_extra_1.default.ensureDir(devcontainerDir);
|
|
88
|
+
// Create all devcontainer files
|
|
89
|
+
const tasks = [
|
|
90
|
+
createDockerfile(devcontainerDir, config),
|
|
91
|
+
createDockerCompose(devcontainerDir, data, config),
|
|
92
|
+
createDevcontainerJson(devcontainerDir, data, config),
|
|
93
|
+
createSetupScript(devcontainerDir, data, config),
|
|
94
|
+
];
|
|
95
|
+
// Only create Claude setup script if Claude Code is enabled
|
|
96
|
+
if (config.claudeCode) {
|
|
97
|
+
tasks.push(createClaudeSetupScript(devcontainerDir));
|
|
98
|
+
}
|
|
99
|
+
await Promise.all(tasks);
|
|
100
|
+
logger_1.logger.success('Devcontainer configuration created');
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Create the Dockerfile
|
|
104
|
+
*/
|
|
105
|
+
async function createDockerfile(devcontainerDir, config) {
|
|
106
|
+
const aptPackages = ['git', 'curl'];
|
|
107
|
+
// Add postgresql-client only if postgres is enabled
|
|
108
|
+
if (config.postgres) {
|
|
109
|
+
aptPackages.push('postgresql-client');
|
|
110
|
+
}
|
|
111
|
+
// Add redis-tools (provides redis-cli) only if redis is enabled
|
|
112
|
+
if (config.redis) {
|
|
113
|
+
aptPackages.push('redis-tools');
|
|
114
|
+
}
|
|
115
|
+
const globalPackages = ['@expo/cli'];
|
|
116
|
+
// Add claude-code if enabled
|
|
117
|
+
if (config.claudeCode) {
|
|
118
|
+
globalPackages.push('@anthropic-ai/claude-code');
|
|
119
|
+
}
|
|
120
|
+
const claudeCodeSetup = config.claudeCode
|
|
121
|
+
? `
|
|
122
|
+
# Create Claude Code data directory (volume mount point)
|
|
123
|
+
RUN mkdir -p /home/node/.claude-code
|
|
124
|
+
`
|
|
125
|
+
: '';
|
|
126
|
+
const content = `FROM node:20-bullseye
|
|
127
|
+
|
|
128
|
+
# Install additional tools
|
|
129
|
+
RUN apt-get update && apt-get install -y \\
|
|
130
|
+
${aptPackages.join(' \\\n ')} \\
|
|
131
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
132
|
+
|
|
133
|
+
# Enable corepack for yarn
|
|
134
|
+
RUN corepack enable
|
|
135
|
+
|
|
136
|
+
# Disable corepack download prompts (auto-accept)
|
|
137
|
+
ENV COREPACK_ENABLE_DOWNLOAD_PROMPT=0
|
|
138
|
+
|
|
139
|
+
# Install global tools
|
|
140
|
+
RUN npm install -g ${globalPackages.join(' ')}
|
|
141
|
+
|
|
142
|
+
# Set up git
|
|
143
|
+
RUN git config --global init.defaultBranch main
|
|
144
|
+
|
|
145
|
+
# Create workspace directory with correct ownership
|
|
146
|
+
RUN mkdir -p /workspace && chown -R node:node /workspace
|
|
147
|
+
|
|
148
|
+
WORKDIR /workspace
|
|
149
|
+
|
|
150
|
+
# Switch to node user
|
|
151
|
+
USER node
|
|
152
|
+
${claudeCodeSetup}`;
|
|
153
|
+
await fs_extra_1.default.writeFile(path_1.default.join(devcontainerDir, 'Dockerfile'), content);
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Create docker-compose.yml
|
|
157
|
+
*/
|
|
158
|
+
async function createDockerCompose(devcontainerDir, data, config) {
|
|
159
|
+
const dbName = data.projectName.replace(/-/g, '_') + '_db';
|
|
160
|
+
const services = [];
|
|
161
|
+
const volumes = [];
|
|
162
|
+
const appDependsOn = [];
|
|
163
|
+
const appEnv = [
|
|
164
|
+
'NODE_ENV: development',
|
|
165
|
+
];
|
|
166
|
+
const appVolumes = [
|
|
167
|
+
'../:/workspace:cached',
|
|
168
|
+
];
|
|
169
|
+
// PostgreSQL service
|
|
170
|
+
if (config.postgres) {
|
|
171
|
+
services.push(` # PostgreSQL Database
|
|
172
|
+
postgres:
|
|
173
|
+
image: postgres:15-alpine
|
|
174
|
+
environment:
|
|
175
|
+
POSTGRES_DB: ${dbName}
|
|
176
|
+
POSTGRES_USER: postgres
|
|
177
|
+
POSTGRES_PASSWORD: postgres
|
|
178
|
+
ports:
|
|
179
|
+
- "5432:5432"
|
|
180
|
+
volumes:
|
|
181
|
+
- postgres_data:/var/lib/postgresql/data
|
|
182
|
+
healthcheck:
|
|
183
|
+
test: ["CMD-SHELL", "pg_isready -U postgres"]
|
|
184
|
+
interval: 5s
|
|
185
|
+
timeout: 5s
|
|
186
|
+
retries: 5
|
|
187
|
+
`);
|
|
188
|
+
volumes.push('postgres_data');
|
|
189
|
+
appDependsOn.push(` postgres:
|
|
190
|
+
condition: service_healthy`);
|
|
191
|
+
appEnv.push(`DATABASE_URL: postgresql://postgres:postgres@postgres:5432/${dbName}`);
|
|
192
|
+
}
|
|
193
|
+
// Redis service
|
|
194
|
+
if (config.redis) {
|
|
195
|
+
services.push(` # Redis Cache
|
|
196
|
+
redis:
|
|
197
|
+
image: redis:7-alpine
|
|
198
|
+
ports:
|
|
199
|
+
- "6379:6379"
|
|
200
|
+
volumes:
|
|
201
|
+
- redis_data:/data
|
|
202
|
+
healthcheck:
|
|
203
|
+
test: ["CMD", "redis-cli", "ping"]
|
|
204
|
+
interval: 5s
|
|
205
|
+
timeout: 5s
|
|
206
|
+
retries: 5
|
|
207
|
+
`);
|
|
208
|
+
volumes.push('redis_data');
|
|
209
|
+
appDependsOn.push(` redis:
|
|
210
|
+
condition: service_healthy`);
|
|
211
|
+
appEnv.push('REDIS_URL: redis://redis:6379');
|
|
212
|
+
}
|
|
213
|
+
// Claude Code config
|
|
214
|
+
if (config.claudeCode) {
|
|
215
|
+
appEnv.push('CLAUDE_CONFIG_DIR: /home/node/.claude-code');
|
|
216
|
+
appVolumes.push('claude_data:/home/node/.claude-code');
|
|
217
|
+
volumes.push('claude_data');
|
|
218
|
+
}
|
|
219
|
+
// Chrome service
|
|
220
|
+
if (config.chrome) {
|
|
221
|
+
services.push(` # Headless Chrome Browser (for Playwright)
|
|
222
|
+
chrome:
|
|
223
|
+
image: browserless/chrome:latest
|
|
224
|
+
environment:
|
|
225
|
+
- CONNECTION_TIMEOUT=600000
|
|
226
|
+
- MAX_CONCURRENT_SESSIONS=10
|
|
227
|
+
- ENABLE_DEBUGGER=true
|
|
228
|
+
- PREBOOT_CHROME=true
|
|
229
|
+
ports:
|
|
230
|
+
- "3100:3000"
|
|
231
|
+
shm_size: "2gb"
|
|
232
|
+
dns:
|
|
233
|
+
- 8.8.8.8
|
|
234
|
+
- 8.8.4.4
|
|
235
|
+
extra_hosts:
|
|
236
|
+
- "localhost:host-gateway"
|
|
237
|
+
- "host.docker.internal:host-gateway"
|
|
238
|
+
healthcheck:
|
|
239
|
+
test: ["CMD", "curl", "-f", "http://localhost:3000/json/version"]
|
|
240
|
+
interval: 10s
|
|
241
|
+
timeout: 5s
|
|
242
|
+
retries: 3
|
|
243
|
+
`);
|
|
244
|
+
appEnv.push('BROWSER_WS_ENDPOINT: ws://chrome:3000');
|
|
245
|
+
}
|
|
246
|
+
// Build the depends_on section
|
|
247
|
+
const dependsOnSection = appDependsOn.length > 0
|
|
248
|
+
? ` depends_on:
|
|
249
|
+
${appDependsOn.join('\n')}`
|
|
250
|
+
: '';
|
|
251
|
+
// Build app service
|
|
252
|
+
const appService = ` # Development Service (for devcontainer)
|
|
253
|
+
app:
|
|
254
|
+
build:
|
|
255
|
+
context: .
|
|
256
|
+
dockerfile: Dockerfile
|
|
257
|
+
environment:
|
|
258
|
+
${appEnv.join('\n ')}
|
|
259
|
+
ports:
|
|
260
|
+
- "3000:3000" # API server
|
|
261
|
+
- "5173:5173" # Vite dev server
|
|
262
|
+
- "8081:8081" # Metro bundler
|
|
263
|
+
- "19006:19006" # Expo dev tools
|
|
264
|
+
volumes:
|
|
265
|
+
- ${appVolumes.join('\n - ')}
|
|
266
|
+
${dependsOnSection}
|
|
267
|
+
command: sleep infinity
|
|
268
|
+
`;
|
|
269
|
+
const volumesSection = volumes.length > 0
|
|
270
|
+
? `volumes:
|
|
271
|
+
${volumes.map(v => ` ${v}:`).join('\n')}
|
|
272
|
+
`
|
|
273
|
+
: '';
|
|
274
|
+
const content = `services:
|
|
275
|
+
${services.join('\n')}
|
|
276
|
+
${appService}
|
|
277
|
+
${volumesSection}`;
|
|
278
|
+
await fs_extra_1.default.writeFile(path_1.default.join(devcontainerDir, 'docker-compose.yml'), content);
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Create devcontainer.json
|
|
282
|
+
*/
|
|
283
|
+
async function createDevcontainerJson(devcontainerDir, data, config) {
|
|
284
|
+
// Build forward ports list
|
|
285
|
+
const forwardPorts = [
|
|
286
|
+
3000, // API server
|
|
287
|
+
5173, // Vite dev server
|
|
288
|
+
8081, // Metro Bundler
|
|
289
|
+
19006, // Expo dev tools
|
|
290
|
+
];
|
|
291
|
+
const portsAttributes = {
|
|
292
|
+
'3000': {
|
|
293
|
+
label: 'API Server',
|
|
294
|
+
onAutoForward: 'notify',
|
|
295
|
+
},
|
|
296
|
+
'5173': {
|
|
297
|
+
label: 'Vite Dev Server',
|
|
298
|
+
onAutoForward: 'openBrowser',
|
|
299
|
+
},
|
|
300
|
+
'8081': {
|
|
301
|
+
label: 'Metro Bundler',
|
|
302
|
+
onAutoForward: 'notify',
|
|
303
|
+
},
|
|
304
|
+
'19006': {
|
|
305
|
+
label: 'Expo Dev Tools',
|
|
306
|
+
onAutoForward: 'openBrowser',
|
|
307
|
+
},
|
|
308
|
+
};
|
|
309
|
+
if (config.postgres) {
|
|
310
|
+
forwardPorts.push(5432);
|
|
311
|
+
portsAttributes['5432'] = {
|
|
312
|
+
label: 'PostgreSQL Database',
|
|
313
|
+
onAutoForward: 'silent',
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
if (config.redis) {
|
|
317
|
+
forwardPorts.push(6379);
|
|
318
|
+
portsAttributes['6379'] = {
|
|
319
|
+
label: 'Redis Cache',
|
|
320
|
+
onAutoForward: 'silent',
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
if (config.chrome) {
|
|
324
|
+
forwardPorts.push(3100);
|
|
325
|
+
portsAttributes['3100'] = {
|
|
326
|
+
label: 'Browserless Chrome',
|
|
327
|
+
onAutoForward: 'silent',
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
const devcontainerJson = {
|
|
331
|
+
name: `${data.appDisplayName} Development`,
|
|
332
|
+
dockerComposeFile: 'docker-compose.yml',
|
|
333
|
+
service: 'app',
|
|
334
|
+
workspaceFolder: '/workspace',
|
|
335
|
+
forwardPorts,
|
|
336
|
+
portsAttributes,
|
|
337
|
+
customizations: {
|
|
338
|
+
vscode: {
|
|
339
|
+
extensions: [
|
|
340
|
+
// React Native/React development
|
|
341
|
+
'msjsdiag.vscode-react-native',
|
|
342
|
+
// TypeScript/JavaScript
|
|
343
|
+
'ms-vscode.vscode-typescript-next',
|
|
344
|
+
'dbaeumer.vscode-eslint',
|
|
345
|
+
'esbenp.prettier-vscode',
|
|
346
|
+
// General development
|
|
347
|
+
'ms-vscode.vscode-json',
|
|
348
|
+
'redhat.vscode-yaml',
|
|
349
|
+
'ms-azuretools.vscode-docker',
|
|
350
|
+
'christian-kohler.path-intellisense',
|
|
351
|
+
'formulahendry.auto-rename-tag',
|
|
352
|
+
// Testing
|
|
353
|
+
'orta.vscode-jest',
|
|
354
|
+
// Git
|
|
355
|
+
'mhutchie.git-graph',
|
|
356
|
+
'eamodio.gitlens',
|
|
357
|
+
'github.vscode-pull-request-github',
|
|
358
|
+
// AI
|
|
359
|
+
'github.copilot',
|
|
360
|
+
'github.copilot-chat',
|
|
361
|
+
],
|
|
362
|
+
settings: {
|
|
363
|
+
'terminal.integrated.defaultProfile.linux': 'bash',
|
|
364
|
+
'typescript.preferences.includePackageJsonAutoImports': 'auto',
|
|
365
|
+
'editor.formatOnSave': true,
|
|
366
|
+
'editor.defaultFormatter': 'esbenp.prettier-vscode',
|
|
367
|
+
'editor.codeActionsOnSave': {
|
|
368
|
+
'source.fixAll.eslint': 'explicit',
|
|
369
|
+
'source.organizeImports': 'explicit',
|
|
370
|
+
},
|
|
371
|
+
'files.watcherExclude': {
|
|
372
|
+
'**/node_modules/**': true,
|
|
373
|
+
'**/.git/**': true,
|
|
374
|
+
'**/dist/**': true,
|
|
375
|
+
'**/coverage/**': true,
|
|
376
|
+
},
|
|
377
|
+
'search.exclude': {
|
|
378
|
+
'**/node_modules': true,
|
|
379
|
+
'**/dist': true,
|
|
380
|
+
'**/coverage': true,
|
|
381
|
+
'**/.yarn': true,
|
|
382
|
+
},
|
|
383
|
+
'jest.jestCommandLine': 'yarn test',
|
|
384
|
+
'jest.autoRun': 'off',
|
|
385
|
+
},
|
|
386
|
+
},
|
|
387
|
+
},
|
|
388
|
+
remoteUser: 'node',
|
|
389
|
+
postCreateCommand: 'bash .devcontainer/setup.sh',
|
|
390
|
+
};
|
|
391
|
+
// Add post-start command only if Claude Code is enabled
|
|
392
|
+
if (config.claudeCode) {
|
|
393
|
+
devcontainerJson.postStartCommand = 'bash .devcontainer/setup-claude.sh';
|
|
394
|
+
}
|
|
395
|
+
await fs_extra_1.default.writeJson(path_1.default.join(devcontainerDir, 'devcontainer.json'), devcontainerJson, { spaces: 2 });
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Create setup.sh script
|
|
399
|
+
*/
|
|
400
|
+
async function createSetupScript(devcontainerDir, data, config) {
|
|
401
|
+
const dbName = data.projectName.replace(/-/g, '_') + '_db';
|
|
402
|
+
const envVars = [
|
|
403
|
+
'# API Configuration',
|
|
404
|
+
'API_PORT=3000',
|
|
405
|
+
'JWT_SECRET=change-this-in-production',
|
|
406
|
+
'',
|
|
407
|
+
'# Web Configuration',
|
|
408
|
+
'WEB_PORT=5173',
|
|
409
|
+
'',
|
|
410
|
+
'# Development Configuration',
|
|
411
|
+
'NODE_ENV=development',
|
|
412
|
+
'LOG_LEVEL=debug',
|
|
413
|
+
];
|
|
414
|
+
if (config.postgres) {
|
|
415
|
+
envVars.unshift('# Database Configuration', `DATABASE_URL=postgresql://postgres:postgres@postgres:5432/${dbName}`, `POSTGRES_DB=${dbName}`, 'POSTGRES_USER=postgres', 'POSTGRES_PASSWORD=postgres', '');
|
|
416
|
+
}
|
|
417
|
+
if (config.redis) {
|
|
418
|
+
envVars.push('', '# Redis Configuration', 'REDIS_URL=redis://redis:6379');
|
|
419
|
+
}
|
|
420
|
+
if (config.chrome) {
|
|
421
|
+
envVars.push('', '# Browserless Chrome (for Playwright)', 'BROWSER_WS_ENDPOINT=ws://chrome:3000');
|
|
422
|
+
}
|
|
423
|
+
// Build wait sections
|
|
424
|
+
const waitSections = [];
|
|
425
|
+
if (config.postgres) {
|
|
426
|
+
waitSections.push(`
|
|
427
|
+
# Wait for database to be ready (timeout: 30s)
|
|
428
|
+
echo "⏳ Waiting for database to be ready..."
|
|
429
|
+
TIMEOUT=30
|
|
430
|
+
ELAPSED=0
|
|
431
|
+
until pg_isready -h postgres -p 5432 -U postgres > /dev/null 2>&1; do
|
|
432
|
+
if [ $ELAPSED -ge $TIMEOUT ]; then
|
|
433
|
+
echo "⚠️ Database not available after \${TIMEOUT}s - continuing anyway"
|
|
434
|
+
break
|
|
435
|
+
fi
|
|
436
|
+
echo "Database is unavailable - sleeping"
|
|
437
|
+
sleep 1
|
|
438
|
+
ELAPSED=$((ELAPSED + 1))
|
|
439
|
+
done
|
|
440
|
+
[ $ELAPSED -lt $TIMEOUT ] && echo "✅ Database is ready!"`);
|
|
441
|
+
}
|
|
442
|
+
if (config.redis) {
|
|
443
|
+
waitSections.push(`
|
|
444
|
+
# Wait for Redis to be ready (timeout: 30s)
|
|
445
|
+
echo "⏳ Waiting for Redis to be ready..."
|
|
446
|
+
TIMEOUT=30
|
|
447
|
+
ELAPSED=0
|
|
448
|
+
until redis-cli -h redis ping > /dev/null 2>&1; do
|
|
449
|
+
if [ $ELAPSED -ge $TIMEOUT ]; then
|
|
450
|
+
echo "⚠️ Redis not available after \${TIMEOUT}s - continuing anyway"
|
|
451
|
+
break
|
|
452
|
+
fi
|
|
453
|
+
echo "Redis is unavailable - sleeping"
|
|
454
|
+
sleep 1
|
|
455
|
+
ELAPSED=$((ELAPSED + 1))
|
|
456
|
+
done
|
|
457
|
+
[ $ELAPSED -lt $TIMEOUT ] && echo "✅ Redis is ready!"`);
|
|
458
|
+
}
|
|
459
|
+
if (config.chrome) {
|
|
460
|
+
waitSections.push(`
|
|
461
|
+
# Wait for Chrome to be ready (timeout: 30s)
|
|
462
|
+
echo "⏳ Waiting for Chrome browser to be ready..."
|
|
463
|
+
TIMEOUT=30
|
|
464
|
+
ELAPSED=0
|
|
465
|
+
until curl -s http://chrome:3000/json/version > /dev/null; do
|
|
466
|
+
if [ $ELAPSED -ge $TIMEOUT ]; then
|
|
467
|
+
echo "⚠️ Chrome not available after \${TIMEOUT}s - continuing anyway"
|
|
468
|
+
break
|
|
469
|
+
fi
|
|
470
|
+
echo "Chrome is unavailable - sleeping"
|
|
471
|
+
sleep 1
|
|
472
|
+
ELAPSED=$((ELAPSED + 1))
|
|
473
|
+
done
|
|
474
|
+
[ $ELAPSED -lt $TIMEOUT ] && echo "✅ Chrome browser is ready!"`);
|
|
475
|
+
}
|
|
476
|
+
// Claude Code setup - generate commands for selected MCP servers
|
|
477
|
+
const claudeSetup = config.claudeCode && config.mcpServers.length > 0
|
|
478
|
+
? `
|
|
479
|
+
# Setup Claude Code MCP servers
|
|
480
|
+
echo "🤖 Configuring Claude Code MCP servers..."
|
|
481
|
+
${generateMcpSetupCommands(config.mcpServers, config)}
|
|
482
|
+
`
|
|
483
|
+
: '';
|
|
484
|
+
// Prisma setup
|
|
485
|
+
const prismaSetup = data.hasPrisma
|
|
486
|
+
? `
|
|
487
|
+
# Generate Prisma client
|
|
488
|
+
echo "🗄️ Generating Prisma client..."
|
|
489
|
+
yarn db:generate
|
|
490
|
+
|
|
491
|
+
# Run database migrations (if any exist)
|
|
492
|
+
if [ -d "packages/database/prisma/migrations" ]; then
|
|
493
|
+
echo "🗄️ Running database migrations..."
|
|
494
|
+
yarn db:migrate
|
|
495
|
+
fi
|
|
496
|
+
`
|
|
497
|
+
: '';
|
|
498
|
+
// Available commands
|
|
499
|
+
const commands = [
|
|
500
|
+
'echo " yarn dev - Start all development servers"',
|
|
501
|
+
'echo " yarn web:dev - Start web dev server only"',
|
|
502
|
+
'echo " yarn mobile:start - Start mobile dev server only"',
|
|
503
|
+
];
|
|
504
|
+
if (data.hasApi) {
|
|
505
|
+
commands.push('echo " yarn api:dev - Start API server only"');
|
|
506
|
+
}
|
|
507
|
+
if (data.hasPrisma) {
|
|
508
|
+
commands.push('echo " yarn db:studio - Open Prisma Studio"');
|
|
509
|
+
}
|
|
510
|
+
const content = `#!/bin/bash
|
|
511
|
+
|
|
512
|
+
echo "🚀 Setting up ${data.appDisplayName} development environment..."
|
|
513
|
+
|
|
514
|
+
# Create environment file if it doesn't exist
|
|
515
|
+
if [ ! -f ".env" ]; then
|
|
516
|
+
echo "📝 Creating .env file..."
|
|
517
|
+
cat > .env << EOF
|
|
518
|
+
${envVars.join('\n')}
|
|
519
|
+
EOF
|
|
520
|
+
fi
|
|
521
|
+
${waitSections.join('\n')}
|
|
522
|
+
|
|
523
|
+
# Install dependencies
|
|
524
|
+
echo "📦 Installing dependencies..."
|
|
525
|
+
yarn install
|
|
526
|
+
${claudeSetup}${prismaSetup}
|
|
527
|
+
echo ""
|
|
528
|
+
echo "✅ Development environment is ready!"
|
|
529
|
+
echo ""
|
|
530
|
+
echo "🎉 You can now start developing your ${data.appDisplayName} application!"
|
|
531
|
+
echo ""
|
|
532
|
+
echo "Available commands:"
|
|
533
|
+
${commands.join('\n')}
|
|
534
|
+
echo ""
|
|
535
|
+
`;
|
|
536
|
+
const scriptPath = path_1.default.join(devcontainerDir, 'setup.sh');
|
|
537
|
+
await fs_extra_1.default.writeFile(scriptPath, content);
|
|
538
|
+
await fs_extra_1.default.chmod(scriptPath, 0o755);
|
|
539
|
+
}
|
|
540
|
+
/**
|
|
541
|
+
* Create setup-claude.sh script
|
|
542
|
+
*/
|
|
543
|
+
async function createClaudeSetupScript(devcontainerDir) {
|
|
544
|
+
const content = `#!/bin/bash
|
|
545
|
+
|
|
546
|
+
# Setup Claude Code data directory in the dev container
|
|
547
|
+
# This creates a persistent volume-backed directory for all Claude Code data
|
|
548
|
+
|
|
549
|
+
echo "Setting up Claude Code data directory..."
|
|
550
|
+
|
|
551
|
+
# Create the Claude Code directory structure if it doesn't exist
|
|
552
|
+
mkdir -p /home/node/.claude-code/.claude
|
|
553
|
+
mkdir -p /home/node/.claude-code/.claude/session-env
|
|
554
|
+
mkdir -p /home/node/.claude-code/.claude/projects
|
|
555
|
+
|
|
556
|
+
# Create symlinks from default locations to the persisted volume
|
|
557
|
+
# Remove any existing files/dirs first
|
|
558
|
+
rm -rf /home/node/.claude 2>/dev/null || true
|
|
559
|
+
rm -f /home/node/.claude.json 2>/dev/null || true
|
|
560
|
+
|
|
561
|
+
# Create symlinks to the volume-backed directory
|
|
562
|
+
ln -sf /home/node/.claude-code/.claude /home/node/.claude
|
|
563
|
+
ln -sf /home/node/.claude-code/.claude.json /home/node/.claude.json 2>/dev/null || true
|
|
564
|
+
|
|
565
|
+
# Set proper permissions
|
|
566
|
+
chmod -R 700 /home/node/.claude-code 2>/dev/null || true
|
|
567
|
+
|
|
568
|
+
echo "Claude Code data directory configured at /home/node/.claude-code"
|
|
569
|
+
echo "All Claude Code data will persist across container rebuilds"
|
|
570
|
+
`;
|
|
571
|
+
const scriptPath = path_1.default.join(devcontainerDir, 'setup-claude.sh');
|
|
572
|
+
await fs_extra_1.default.writeFile(scriptPath, content);
|
|
573
|
+
await fs_extra_1.default.chmod(scriptPath, 0o755);
|
|
574
|
+
}
|
|
575
|
+
//# sourceMappingURL=devcontainer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devcontainer.js","sourceRoot":"","sources":["../../../src/generators/extensions/devcontainer.ts"],"names":[],"mappings":"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"}
|