create-rstack 1.7.13 → 1.7.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +167 -36
  2. package/package.json +2 -1
package/dist/index.js CHANGED
@@ -2,8 +2,9 @@ import 'module';
2
2
  /*#__PURE__*/ import.meta.url;
3
3
  import * as __rspack_external_child_process from "child_process";
4
4
  import * as __rspack_external_fs from "fs";
5
+ import * as __rspack_external_node_fs_5ea92f0c from "node:fs";
6
+ import * as __rspack_external_node_fs_promises_153e37e0 from "node:fs/promises";
5
7
  import * as __rspack_external_path from "path";
6
- import node_fs from "node:fs";
7
8
  import node_path, { dirname } from "node:path";
8
9
  import { fileURLToPath } from "node:url";
9
10
  import { stripVTControlCharacters } from "node:util";
@@ -13,6 +14,115 @@ import { Writable } from "node:stream";
13
14
  import node_os from "node:os";
14
15
  import node_tty from "node:tty";
15
16
  var __webpack_modules__ = {
17
+ "./node_modules/.pnpm/@vercel+detect-agent@1.0.0/node_modules/@vercel/detect-agent/dist/index.js": function(module, __unused_webpack_exports, __webpack_require__) {
18
+ var __defProp = Object.defineProperty;
19
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
20
+ var __getOwnPropNames = Object.getOwnPropertyNames;
21
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
22
+ var __export = (target, all)=>{
23
+ for(var name in all)__defProp(target, name, {
24
+ get: all[name],
25
+ enumerable: true
26
+ });
27
+ };
28
+ var __copyProps = (to, from, except, desc)=>{
29
+ if (from && "object" == typeof from || "function" == typeof from) {
30
+ for (let key of __getOwnPropNames(from))if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
31
+ get: ()=>from[key],
32
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
33
+ });
34
+ }
35
+ return to;
36
+ };
37
+ var __toCommonJS = (mod)=>__copyProps(__defProp({}, "__esModule", {
38
+ value: true
39
+ }), mod);
40
+ var src_exports = {};
41
+ __export(src_exports, {
42
+ KNOWN_AGENTS: ()=>KNOWN_AGENTS,
43
+ determineAgent: ()=>determineAgent
44
+ });
45
+ module.exports = __toCommonJS(src_exports);
46
+ var import_promises = __webpack_require__("node:fs/promises");
47
+ var import_node_fs = __webpack_require__("node:fs");
48
+ const DEVIN_LOCAL_PATH = "/opt/.devin";
49
+ const CURSOR = "cursor";
50
+ const CURSOR_CLI = "cursor-cli";
51
+ const CLAUDE = "claude";
52
+ const DEVIN = "devin";
53
+ const REPLIT = "replit";
54
+ const GEMINI = "gemini";
55
+ const CODEX = "codex";
56
+ const KNOWN_AGENTS = {
57
+ CURSOR,
58
+ CURSOR_CLI,
59
+ CLAUDE,
60
+ DEVIN,
61
+ REPLIT,
62
+ GEMINI,
63
+ CODEX
64
+ };
65
+ async function determineAgent() {
66
+ if (process.env.AI_AGENT) {
67
+ const name = process.env.AI_AGENT.trim();
68
+ if (name) return {
69
+ isAgent: true,
70
+ agent: {
71
+ name
72
+ }
73
+ };
74
+ }
75
+ if (process.env.CURSOR_TRACE_ID) return {
76
+ isAgent: true,
77
+ agent: {
78
+ name: CURSOR
79
+ }
80
+ };
81
+ if (process.env.CURSOR_AGENT) return {
82
+ isAgent: true,
83
+ agent: {
84
+ name: CURSOR_CLI
85
+ }
86
+ };
87
+ if (process.env.GEMINI_CLI) return {
88
+ isAgent: true,
89
+ agent: {
90
+ name: GEMINI
91
+ }
92
+ };
93
+ if (process.env.CODEX_SANDBOX) return {
94
+ isAgent: true,
95
+ agent: {
96
+ name: CODEX
97
+ }
98
+ };
99
+ if (process.env.CLAUDECODE || process.env.CLAUDE_CODE) return {
100
+ isAgent: true,
101
+ agent: {
102
+ name: CLAUDE
103
+ }
104
+ };
105
+ if (process.env.REPL_ID) return {
106
+ isAgent: true,
107
+ agent: {
108
+ name: REPLIT
109
+ }
110
+ };
111
+ try {
112
+ await (0, import_promises.access)(DEVIN_LOCAL_PATH, import_node_fs.constants.F_OK);
113
+ return {
114
+ isAgent: true,
115
+ agent: {
116
+ name: DEVIN
117
+ }
118
+ };
119
+ } catch (error) {}
120
+ return {
121
+ isAgent: false,
122
+ agent: void 0
123
+ };
124
+ }
125
+ },
16
126
  "./node_modules/.pnpm/cross-spawn@7.0.6/node_modules/cross-spawn/index.js": function(module, __unused_webpack_exports, __webpack_require__) {
17
127
  const cp = __webpack_require__("child_process");
18
128
  const parse = __webpack_require__("./node_modules/.pnpm/cross-spawn@7.0.6/node_modules/cross-spawn/lib/parse.js");
@@ -794,6 +904,12 @@ var __webpack_modules__ = {
794
904
  fs: function(module) {
795
905
  module.exports = __rspack_external_fs;
796
906
  },
907
+ "node:fs": function(module) {
908
+ module.exports = __rspack_external_node_fs_5ea92f0c;
909
+ },
910
+ "node:fs/promises": function(module) {
911
+ module.exports = __rspack_external_node_fs_promises_153e37e0;
912
+ },
797
913
  path: function(module) {
798
914
  module.exports = __rspack_external_path;
799
915
  }
@@ -828,6 +944,7 @@ function __webpack_require__(moduleId) {
828
944
  (()=>{
829
945
  __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
830
946
  })();
947
+ var external_node_fs_ = __webpack_require__("node:fs");
831
948
  var src = __webpack_require__("./node_modules/.pnpm/sisteransi@1.0.5/node_modules/sisteransi/src/index.js");
832
949
  var picocolors = __webpack_require__("./node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.js");
833
950
  var picocolors_default = /*#__PURE__*/ __webpack_require__.n(picocolors);
@@ -1686,6 +1803,7 @@ ${picocolors.gray(dist_d)} ${t}
1686
1803
  `);
1687
1804
  };
1688
1805
  picocolors.gray(dist_o);
1806
+ var dist = __webpack_require__("./node_modules/.pnpm/@vercel+detect-agent@1.0.0/node_modules/@vercel/detect-agent/dist/index.js");
1689
1807
  var cross_spawn = __webpack_require__("./node_modules/.pnpm/cross-spawn@7.0.6/node_modules/cross-spawn/index.js");
1690
1808
  var cross_spawn_default = /*#__PURE__*/ __webpack_require__.n(cross_spawn);
1691
1809
  var cjs = __webpack_require__("./node_modules/.pnpm/deepmerge@4.3.1/node_modules/deepmerge/dist/cjs.js");
@@ -1978,15 +2096,27 @@ function pkgFromUserAgent(userAgent) {
1978
2096
  };
1979
2097
  }
1980
2098
  function isEmptyDir(path) {
1981
- const files = node_fs.readdirSync(path);
2099
+ const files = external_node_fs_["default"].readdirSync(path);
1982
2100
  return 0 === files.length || 1 === files.length && '.git' === files[0];
1983
2101
  }
2102
+ function parseToolsOption(tools) {
2103
+ if (void 0 === tools) return null;
2104
+ const toolsArr = Array.isArray(tools) ? tools : [
2105
+ tools
2106
+ ];
2107
+ return toolsArr.flatMap((tool)=>tool.split(',')).map((tool)=>tool.trim()).filter(Boolean);
2108
+ }
1984
2109
  const BUILTIN_TOOLS = [
2110
+ 'biome',
1985
2111
  'eslint',
1986
- 'prettier',
1987
- 'biome'
2112
+ 'prettier'
1988
2113
  ];
1989
- function logHelpMessage(name, templates) {
2114
+ function logHelpMessage(name, templates, extraTools) {
2115
+ const extraToolNames = extraTools?.map((tool)=>tool.value) ?? [];
2116
+ const toolsList = [
2117
+ ...BUILTIN_TOOLS,
2118
+ ...extraToolNames
2119
+ ].join(', ');
1990
2120
  src_logger.log(`
1991
2121
  Usage: create-${name} [dir] [options]
1992
2122
 
@@ -1995,7 +2125,7 @@ function logHelpMessage(name, templates) {
1995
2125
  -h, --help display help for command
1996
2126
  -d, --dir <dir> create project in specified directory
1997
2127
  -t, --template <tpl> specify the template to use
1998
- --tools <tool> select additional tools (biome, eslint, prettier)
2128
+ --tools <tool> select additional tools (${toolsList})
1999
2129
  --override override files in target directory
2000
2130
  --packageName <name> specify the package name
2001
2131
 
@@ -2005,15 +2135,12 @@ function logHelpMessage(name, templates) {
2005
2135
  `);
2006
2136
  }
2007
2137
  async function getTools({ tools, dir, template }, extraTools) {
2008
- if (tools) {
2009
- let toolsArr = Array.isArray(tools) ? tools : [
2010
- tools
2011
- ];
2012
- toolsArr = toolsArr.filter((tool)=>BUILTIN_TOOLS.includes(tool) || extraTools?.some((extraTool)=>extraTool.value === tool));
2138
+ const parsedTools = parseToolsOption(tools);
2139
+ if (null !== parsedTools) {
2140
+ const toolsArr = parsedTools.filter((tool)=>BUILTIN_TOOLS.includes(tool) || extraTools?.some((extraTool)=>extraTool.value === tool));
2013
2141
  return toolsArr;
2014
2142
  }
2015
2143
  if (dir && template) return [];
2016
- if ('' === tools) return [];
2017
2144
  const options = [
2018
2145
  {
2019
2146
  value: 'biome',
@@ -2042,7 +2169,7 @@ async function getTools({ tools, dir, template }, extraTools) {
2042
2169
  function upperFirst(str) {
2043
2170
  return str.charAt(0).toUpperCase() + str.slice(1);
2044
2171
  }
2045
- const readJSON = async (path)=>JSON.parse(await node_fs.promises.readFile(path, 'utf-8'));
2172
+ const readJSON = async (path)=>JSON.parse(await external_node_fs_["default"].promises.readFile(path, 'utf-8'));
2046
2173
  const readPackageJson = async (filePath)=>readJSON(node_path.join(filePath, 'package.json'));
2047
2174
  const parseArgv = (processArgv)=>{
2048
2175
  const argv = minimist_default()(processArgv.slice(2), {
@@ -2064,10 +2191,14 @@ function runCommand(command, cwd) {
2064
2191
  });
2065
2192
  }
2066
2193
  async function create({ name, root, templates, skipFiles, getTemplateName, mapESLintTemplate, version, noteInformation, extraTools, argv: processArgv = process.argv }) {
2067
- console.log('');
2068
- src_logger.greet(`◆ Create ${upperFirst(name)} Project`);
2194
+ src_logger.greet(`\n◆ Create ${upperFirst(name)} Project`);
2195
+ const { isAgent } = await (0, dist.determineAgent)();
2196
+ if (isAgent) {
2197
+ console.log('');
2198
+ src_logger.info('To create a project non-interactively, run: npx -y create-rsbuild <DIR> --template <TEMPLATE>');
2199
+ }
2069
2200
  const argv = parseArgv(processArgv);
2070
- if (argv.help) return void logHelpMessage(name, templates);
2201
+ if (argv.help) return void logHelpMessage(name, templates, extraTools);
2071
2202
  const cwd = process.cwd();
2072
2203
  const pkgInfo = pkgFromUserAgent(process.env.npm_config_user_agent);
2073
2204
  const packageManager = pkgInfo ? pkgInfo.name : 'npm';
@@ -2087,7 +2218,7 @@ async function create({ name, root, templates, skipFiles, getTemplateName, mapES
2087
2218
  const { targetDir } = formatted;
2088
2219
  const packageName = argv.packageName || formatted.packageName;
2089
2220
  const distFolder = node_path.isAbsolute(targetDir) ? targetDir : node_path.join(cwd, targetDir);
2090
- if (!argv.override && node_fs.existsSync(distFolder) && !isEmptyDir(distFolder)) {
2221
+ if (!argv.override && external_node_fs_["default"].existsSync(distFolder) && !isEmptyDir(distFolder)) {
2091
2222
  const option = checkCancel(await ve({
2092
2223
  message: `"${targetDir}" is not empty, please choose:`,
2093
2224
  options: [
@@ -2107,7 +2238,7 @@ async function create({ name, root, templates, skipFiles, getTemplateName, mapES
2107
2238
  const tools = await getTools(argv, extraTools);
2108
2239
  const srcFolder = node_path.join(root, `template-${templateName}`);
2109
2240
  const commonFolder = node_path.join(root, 'template-common');
2110
- if (!node_fs.existsSync(srcFolder)) throw new Error(`Invalid input: template "${templateName}" not found.`);
2241
+ if (!external_node_fs_["default"].existsSync(srcFolder)) throw new Error(`Invalid input: template "${templateName}" not found.`);
2111
2242
  copyFolder({
2112
2243
  from: commonFolder,
2113
2244
  to: distFolder,
@@ -2165,13 +2296,13 @@ async function create({ name, root, templates, skipFiles, getTemplateName, mapES
2165
2296
  isMergePackageJson: true
2166
2297
  });
2167
2298
  agentsMdSearchDirs.push(toolFolder);
2168
- if ('biome' === tool) await node_fs.promises.rename(node_path.join(distFolder, 'biome.json.template'), node_path.join(distFolder, 'biome.json'));
2299
+ if ('biome' === tool) await external_node_fs_["default"].promises.rename(node_path.join(distFolder, 'biome.json.template'), node_path.join(distFolder, 'biome.json'));
2169
2300
  }
2170
2301
  const agentsFiles = collectAgentsFiles(agentsMdSearchDirs);
2171
2302
  if (agentsFiles.length > 0) {
2172
2303
  const mergedAgents = mergeAgentsFiles(agentsFiles);
2173
2304
  const agentsPath = node_path.join(distFolder, 'AGENTS.md');
2174
- node_fs.writeFileSync(agentsPath, `${replacePlaceholder(mergedAgents, templateParameters)}\n`);
2305
+ external_node_fs_["default"].writeFileSync(agentsPath, `${replacePlaceholder(mergedAgents, templateParameters)}\n`);
2175
2306
  }
2176
2307
  const nextSteps = noteInformation ? noteInformation : [
2177
2308
  `1. ${picocolors_default().cyan(`cd ${targetDir}`)}`,
@@ -2189,9 +2320,9 @@ function sortObjectKeys(obj) {
2189
2320
  return sortedObj;
2190
2321
  }
2191
2322
  function mergePackageJson(targetPackage, extraPackage) {
2192
- if (!node_fs.existsSync(targetPackage)) return;
2193
- const targetJson = JSON.parse(node_fs.readFileSync(targetPackage, 'utf-8'));
2194
- const extraJson = JSON.parse(node_fs.readFileSync(extraPackage, 'utf-8'));
2323
+ if (!external_node_fs_["default"].existsSync(targetPackage)) return;
2324
+ const targetJson = JSON.parse(external_node_fs_["default"].readFileSync(targetPackage, 'utf-8'));
2325
+ const extraJson = JSON.parse(external_node_fs_["default"].readFileSync(extraPackage, 'utf-8'));
2195
2326
  const mergedJson = cjs_default()(targetJson, extraJson);
2196
2327
  mergedJson.name = targetJson.name || extraJson.name;
2197
2328
  for (const key of [
@@ -2199,7 +2330,7 @@ function mergePackageJson(targetPackage, extraPackage) {
2199
2330
  'dependencies',
2200
2331
  'devDependencies'
2201
2332
  ])if (key in mergedJson) mergedJson[key] = sortObjectKeys(mergedJson[key]);
2202
- node_fs.writeFileSync(targetPackage, `${JSON.stringify(mergedJson, null, 2)}\n`);
2333
+ external_node_fs_["default"].writeFileSync(targetPackage, `${JSON.stringify(mergedJson, null, 2)}\n`);
2203
2334
  }
2204
2335
  const isMarkdown = (file)=>file.endsWith('.md') || file.endsWith('.mdx');
2205
2336
  const replacePlaceholder = (content, templateParameters)=>{
@@ -2216,14 +2347,14 @@ function copyFolder({ from, to, version, packageName, templateParameters, isMerg
2216
2347
  'dist',
2217
2348
  ...skipFiles
2218
2349
  ];
2219
- node_fs.mkdirSync(to, {
2350
+ external_node_fs_["default"].mkdirSync(to, {
2220
2351
  recursive: true
2221
2352
  });
2222
- for (const file of node_fs.readdirSync(from)){
2353
+ for (const file of external_node_fs_["default"].readdirSync(from)){
2223
2354
  if (allSkipFiles.includes(file)) continue;
2224
2355
  const srcFile = node_path.resolve(from, file);
2225
2356
  const distFile = renameFiles[file] ? node_path.resolve(to, renameFiles[file]) : node_path.resolve(to, file);
2226
- const stat = node_fs.statSync(srcFile);
2357
+ const stat = external_node_fs_["default"].statSync(srcFile);
2227
2358
  if (stat.isDirectory()) copyFolder({
2228
2359
  from: srcFile,
2229
2360
  to: distFile,
@@ -2233,14 +2364,14 @@ function copyFolder({ from, to, version, packageName, templateParameters, isMerg
2233
2364
  });
2234
2365
  else if ('package.json' === file) {
2235
2366
  const targetPackage = node_path.resolve(to, 'package.json');
2236
- if (isMergePackageJson && node_fs.existsSync(targetPackage)) mergePackageJson(targetPackage, srcFile);
2237
- else node_fs.copyFileSync(srcFile, distFile);
2367
+ if (isMergePackageJson && external_node_fs_["default"].existsSync(targetPackage)) mergePackageJson(targetPackage, srcFile);
2368
+ else external_node_fs_["default"].copyFileSync(srcFile, distFile);
2238
2369
  updatePackageJson(distFile, version, packageName);
2239
2370
  } else {
2240
- node_fs.copyFileSync(srcFile, distFile);
2371
+ external_node_fs_["default"].copyFileSync(srcFile, distFile);
2241
2372
  if (templateParameters && isMarkdown(distFile)) {
2242
- const content = node_fs.readFileSync(distFile, 'utf-8');
2243
- node_fs.writeFileSync(distFile, replacePlaceholder(content, templateParameters));
2373
+ const content = external_node_fs_["default"].readFileSync(distFile, 'utf-8');
2374
+ external_node_fs_["default"].writeFileSync(distFile, replacePlaceholder(content, templateParameters));
2244
2375
  }
2245
2376
  }
2246
2377
  }
@@ -2253,7 +2384,7 @@ const isStableVersion = (version)=>[
2253
2384
  'nightly'
2254
2385
  ].every((tag)=>!version.includes(tag));
2255
2386
  const updatePackageJson = (pkgJsonPath, version, name)=>{
2256
- let content = node_fs.readFileSync(pkgJsonPath, 'utf-8');
2387
+ let content = external_node_fs_["default"].readFileSync(pkgJsonPath, 'utf-8');
2257
2388
  if ('string' == typeof version) {
2258
2389
  const targetVersion = isStableVersion(version) ? `^${version}` : version;
2259
2390
  content = content.replace(/workspace:\*/g, targetVersion);
@@ -2267,11 +2398,11 @@ const updatePackageJson = (pkgJsonPath, version, name)=>{
2267
2398
  const projectName = node_path.basename(node_path.dirname(pkgJsonPath));
2268
2399
  if (projectName.length) pkg.name = projectName;
2269
2400
  } else if (name) pkg.name = name;
2270
- node_fs.writeFileSync(pkgJsonPath, `${JSON.stringify(pkg, null, 2)}\n`);
2401
+ external_node_fs_["default"].writeFileSync(pkgJsonPath, `${JSON.stringify(pkg, null, 2)}\n`);
2271
2402
  };
2272
2403
  function readAgentsFile(filePath) {
2273
- if (!node_fs.existsSync(filePath)) return null;
2274
- return node_fs.readFileSync(filePath, 'utf-8');
2404
+ if (!external_node_fs_["default"].existsSync(filePath)) return null;
2405
+ return external_node_fs_["default"].readFileSync(filePath, 'utf-8');
2275
2406
  }
2276
2407
  function parseAgentsContent(content) {
2277
2408
  const sections = {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-rstack",
3
- "version": "1.7.13",
3
+ "version": "1.7.15",
4
4
  "description": "Create a new Rstack project",
5
5
  "repository": {
6
6
  "type": "git",
@@ -49,6 +49,7 @@
49
49
  "@types/fs-extra": "^11.0.4",
50
50
  "@types/minimist": "^1.2.5",
51
51
  "@types/node": "24.10.1",
52
+ "@vercel/detect-agent": "^1.0.0",
52
53
  "cross-spawn": "^7.0.6",
53
54
  "deepmerge": "^4.3.1",
54
55
  "fs-extra": "^11.3.2",