yg-team-cli 2.3.6 → 2.3.7

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/cli.js CHANGED
@@ -2102,8 +2102,48 @@ async function cloneFrontendTemplate(projectPath, versionOptions = {}) {
2102
2102
  await FileUtils.ensureDir(path7.join(frontendPath, "src/components"));
2103
2103
  }
2104
2104
  }
2105
- async function generateDockerFiles() {
2106
- logger.info("Docker \u914D\u7F6E\u751F\u6210\u5F85\u5B9E\u73B0");
2105
+ async function generateDockerFiles(projectPath, projectName) {
2106
+ const backendPath = path7.join(projectPath, "backend");
2107
+ if (!await FileUtils.exists(backendPath)) {
2108
+ logger.warn("\u672A\u627E\u5230 backend \u76EE\u5F55\uFF0C\u8DF3\u8FC7 Docker \u914D\u7F6E\u751F\u6210");
2109
+ return;
2110
+ }
2111
+ const dockerfile = `FROM openjdk:17-jdk-slim
2112
+ WORKDIR /app
2113
+ COPY build/libs/*.jar app.jar
2114
+ EXPOSE 8080
2115
+ ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar"]
2116
+ `;
2117
+ const deploySh = `#!/bin/bash
2118
+ # yg-team-cli \u81EA\u52A8\u751F\u6210\u7684\u90E8\u7F72\u811A\u672C
2119
+ # \u504F\u597D\uFF1AAliyun \u955C\u50CF\u4ED3\u5E93, Gradle \u6784\u5EFA, \u5237\u65B0\u4F9D\u8D56, \u8DF3\u8FC7\u6D4B\u8BD5
2120
+
2121
+ PROJECT_NAME="${projectName}"
2122
+ TIMESTAMP=$(date +%Y%m%d%H%M%S)
2123
+ REGISTRY="registry.cn-hangzhou.aliyuncs.com/yungu-app"
2124
+ IMAGE_TAG="\${PROJECT_NAME}:\${TIMESTAMP}"
2125
+
2126
+ echo "\u{1F418} \u5F00\u59CB Gradle \u6784\u5EFA (\u8DF3\u8FC7\u6D4B\u8BD5, \u5237\u65B0\u4F9D\u8D56)..."
2127
+ ./gradlew clean build -x test --refresh-dependencies
2128
+
2129
+ if [ $? -ne 0 ]; then
2130
+ echo "\u274C \u6784\u5EFA\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u4EE3\u7801"
2131
+ exit 1
2132
+ fi
2133
+
2134
+ echo "\u{1F433} \u6784\u5EFA Docker \u955C\u50CF..."
2135
+ docker build -t \${REGISTRY}/\${IMAGE_TAG} .
2136
+ docker tag \${REGISTRY}/\${IMAGE_TAG} \${REGISTRY}/\${PROJECT_NAME}:latest
2137
+
2138
+ echo "\u{1F680} \u63A8\u9001\u955C\u50CF\u5230\u963F\u91CC\u4E91..."
2139
+ docker push \${REGISTRY}/\${IMAGE_TAG}
2140
+ docker push \${REGISTRY}/\${PROJECT_NAME}:latest
2141
+
2142
+ echo "\u2705 \u90E8\u7F72\u5B8C\u6210! \u955C\u50CF\u5730\u5740: \${REGISTRY}/\${IMAGE_TAG}"
2143
+ `;
2144
+ await fs4.writeFile(path7.join(backendPath, "Dockerfile"), dockerfile);
2145
+ await fs4.writeFile(path7.join(backendPath, "deploy.sh"), deploySh);
2146
+ await fs4.chmod(path7.join(backendPath, "deploy.sh"), 493);
2107
2147
  }
2108
2148
  async function initGit(projectPath, projectName) {
2109
2149
  try {
@@ -2153,7 +2193,7 @@ var init_init = __esm({
2153
2193
  logger.error("\u9879\u76EE\u540D\u79F0\u53EA\u80FD\u5305\u542B\u5C0F\u5199\u5B57\u6BCD\u3001\u6570\u5B57\u548C\u8FDE\u5B57\u7B26");
2154
2194
  process.exit(1);
2155
2195
  }
2156
- logger.header("\u521D\u59CB\u5316\u9879\u76EE");
2196
+ logger.header("AI-Native \u56E2\u961F\u7814\u53D1\u811A\u624B\u67B6 - \u9879\u76EE\u521D\u59CB\u5316");
2157
2197
  logger.newLine();
2158
2198
  const hasClaude = await claudeAI.checkInstalled();
2159
2199
  if (!hasClaude) {
@@ -2182,44 +2222,20 @@ var init_init = __esm({
2182
2222
  const tasks = new Listr(
2183
2223
  [
2184
2224
  {
2185
- title: "\u68C0\u67E5\u73AF\u5883",
2186
- task: async () => {
2187
- const version = await claudeAI.getVersion();
2188
- logger.info(`Claude \u7248\u672C: ${version}`);
2189
- }
2190
- },
2191
- {
2192
- title: "\u521B\u5EFA\u9879\u76EE\u76EE\u5F55",
2225
+ title: "\u521B\u5EFA\u9879\u76EE\u76EE\u5F55\u7ED3\u6784",
2193
2226
  task: async () => {
2194
2227
  await FileUtils.ensureDir(projectPath);
2195
- await FileUtils.ensureDir(path7.join(projectPath, "frontend"));
2196
- await FileUtils.ensureDir(path7.join(projectPath, "backend"));
2197
2228
  await FileUtils.ensureDir(path7.join(projectPath, "docs/specs"));
2198
2229
  await FileUtils.ensureDir(path7.join(projectPath, "docs/api"));
2199
2230
  await FileUtils.ensureDir(path7.join(projectPath, "docs/sessions"));
2200
2231
  }
2201
2232
  },
2202
2233
  {
2203
- title: "\u751F\u6210\u6280\u672F\u6808\u6587\u6863",
2234
+ title: "\u751F\u6210\u6280\u672F\u6587\u6863 (Tech Stack, Conventions, Memory)",
2204
2235
  task: async () => {
2205
2236
  await generateTechStack(projectPath);
2206
- }
2207
- },
2208
- {
2209
- title: "\u751F\u6210\u5F00\u53D1\u89C4\u8303\u6587\u6863",
2210
- task: async () => {
2211
2237
  await generateConventions(projectPath);
2212
- }
2213
- },
2214
- {
2215
- title: "\u751F\u6210 AI Memory",
2216
- task: async () => {
2217
2238
  await generateAIMemory(projectPath, projectName);
2218
- }
2219
- },
2220
- {
2221
- title: "\u751F\u6210 Spec \u6A21\u677F",
2222
- task: async () => {
2223
2239
  await generateSpecTemplate(projectPath);
2224
2240
  }
2225
2241
  },
@@ -2246,92 +2262,74 @@ var init_init = __esm({
2246
2262
  }
2247
2263
  },
2248
2264
  {
2249
- title: "\u6CE8\u518C\u8FDC\u7A0B MCP \u670D\u52A1",
2250
- task: async () => {
2251
- const hasRemoteModule = selectedModules.some(
2252
- (id) => ModuleManager.getModuleById(id)?.type === "remote"
2253
- );
2254
- if (hasRemoteModule) {
2255
- const { execa: e } = await import("execa");
2256
- try {
2257
- await e("claude", [
2258
- "mcp",
2259
- "add",
2260
- "--transport",
2261
- "sse",
2262
- "--header",
2263
- "Authorization: Bearer mcp_00557dabb71297b4f9ac5fe748395f2c",
2264
- "--",
2265
- "api-metadata",
2266
- "https://api-metadata.yungu.org/sse"
2267
- ]);
2268
- logger.info("\u8FDC\u7A0B MCP \u670D\u52A1 api-metadata \u5DF2\u6CE8\u518C");
2269
- } catch (err) {
2270
- logger.warn("\u8FDC\u7A0B MCP \u670D\u52A1\u6CE8\u518C\u5931\u8D25\uFF0C\u53EF\u80FD\u5DF2\u5B58\u5728\u6216\u6743\u9650\u4E0D\u8DB3");
2271
- }
2272
- }
2273
- }
2274
- },
2275
- {
2276
- title: "\u6CE8\u5165\u901A\u7528\u6A21\u5757",
2265
+ title: "\u6CE8\u5165\u9009\u5B9A\u7684\u901A\u7528\u6A21\u5757",
2277
2266
  task: async () => {
2278
2267
  if (selectedModules.length === 0) return;
2279
2268
  const templatesDir = path7.resolve(FileUtils.getDirName(import.meta.url), "../templates");
2280
2269
  for (const moduleId of selectedModules) {
2281
2270
  await ModuleManager.injectModule(projectPath, moduleId, templatesDir);
2282
- logger.info(`\u6CE8\u5165\u6A21\u5757: ${moduleId}`);
2283
- }
2284
- }
2285
- },
2286
- {
2287
- title: "\u6267\u884C\u8FDC\u7A0B\u6A21\u5757\u4EE3\u7801\u751F\u6210",
2288
- task: async () => {
2289
- const remoteModules = selectedModules.map((id) => ModuleManager.getModuleById(id)).filter((m) => m?.type === "remote");
2290
- if (remoteModules.length === 0) return;
2291
- const { execa: e } = await import("execa");
2292
- for (const module of remoteModules) {
2293
- if (!module) continue;
2294
- logger.info(`\u6B63\u5728\u4E3A\u60A8\u751F\u6210 ${module.name} \u7684\u8FDC\u7A0B\u8C03\u7528\u4EE3\u7801...`);
2295
- const prompt = `\u4F7F\u7528 api-metadata MCP \u5DE5\u5177\u83B7\u53D6\u6240\u6709\u4E0E "${module.id.replace("-remote", "")}" \u76F8\u5173\u7684 API \u5143\u6570\u636E\u3002
2296
- \u7136\u540E\u5728\u9879\u76EE\u8DEF\u5F84 \`${projectPath}\` \u7684\u540E\u7AEF\u76EE\u5F55\u4E2D\uFF0C\u76F4\u63A5\u751F\u6210\u5BF9\u5E94\u7684 Java \u8C03\u7528\u4EE3\u7801\uFF08\u5982 Feign Client \u6216 RestTemplate \u5C01\u88C5\uFF09\u3002
2297
- \u8BF7\u786E\u4FDD\u4EE3\u7801\u7B26\u5408 \`CONVENTIONS.md\` \u4E2D\u7684\u89C4\u8303\u3002
2298
- \u751F\u6210\u5B8C\u6210\u540E\uFF0C\u8BF7\u7B80\u8981\u5217\u51FA\u751F\u6210\u7684\u6587\u4EF6\u3002`;
2299
- try {
2300
- await e("claude", ["-p", prompt, "--add-dir", projectPath], {
2301
- stdio: "inherit",
2302
- timeout: 3e5
2303
- });
2304
- } catch (err) {
2305
- logger.error(`${module.name} \u4EE3\u7801\u751F\u6210\u5931\u8D25\uFF0C\u60A8\u53EF\u4EE5\u7A0D\u540E\u5728\u5F00\u53D1\u6A21\u5F0F\u4E0B\u624B\u52A8\u8FD0\u884C\u3002`);
2306
- }
2307
2271
  }
2308
2272
  }
2309
2273
  },
2310
2274
  ...options.docker ? [
2311
2275
  {
2312
- title: "\u751F\u6210 Docker \u914D\u7F6E",
2313
- task: async () => {
2314
- await generateDockerFiles();
2315
- }
2316
- }
2317
- ] : [],
2318
- ...options.git ? [
2319
- {
2320
- title: "\u521D\u59CB\u5316 Git",
2276
+ title: "\u751F\u6210 Docker \u90E8\u7F72\u914D\u7F6E",
2321
2277
  task: async () => {
2322
- await initGit(projectPath, projectName);
2278
+ await generateDockerFiles(projectPath, projectName);
2323
2279
  }
2324
2280
  }
2325
2281
  ] : []
2326
2282
  ],
2327
- {
2328
- concurrent: false,
2329
- exitOnError: true
2330
- }
2283
+ { concurrent: false, exitOnError: true }
2331
2284
  );
2332
2285
  await tasks.run();
2286
+ const remoteModules = selectedModules.map((id) => ModuleManager.getModuleById(id)).filter((m) => m?.type === "remote");
2287
+ if (remoteModules.length > 0) {
2288
+ logger.newLine();
2289
+ logger.header("\u5904\u7406\u8FDC\u7A0B\u6A21\u5757");
2290
+ const { execa: e } = await import("execa");
2291
+ try {
2292
+ logger.info("\u6B63\u5728\u6CE8\u518C\u8FDC\u7A0B MCP \u670D\u52A1 api-metadata...");
2293
+ await e("claude", [
2294
+ "mcp",
2295
+ "add",
2296
+ "--transport",
2297
+ "sse",
2298
+ "--header",
2299
+ "Authorization: Bearer mcp_00557dabb71297b4f9ac5fe748395f2c",
2300
+ "--",
2301
+ "api-metadata",
2302
+ "https://api-metadata.yungu.org/sse"
2303
+ ]);
2304
+ logger.success("\u8FDC\u7A0B MCP \u670D\u52A1\u6CE8\u518C\u6210\u529F");
2305
+ } catch (err) {
2306
+ logger.warn("\u8FDC\u7A0B MCP \u670D\u52A1\u6CE8\u518C\u63D0\u793A: \u53EF\u80FD\u5DF2\u5B58\u5728\u6216\u624B\u52A8\u6CE8\u518C");
2307
+ }
2308
+ for (const module of remoteModules) {
2309
+ if (!module) continue;
2310
+ logger.newLine();
2311
+ logger.info(`\u6B63\u5728\u4E3A\u60A8\u751F\u6210 [${module.name}] \u7684\u8FDC\u7A0B\u8C03\u7528\u4EE3\u7801...`);
2312
+ const prompt = `\u4F7F\u7528 api-metadata MCP \u5DE5\u5177\u83B7\u53D6\u6240\u6709\u4E0E "${module.id.replace("-remote", "")}" \u76F8\u5173\u7684 API \u5143\u6570\u636E\u3002
2313
+ \u7136\u540E\u5728\u9879\u76EE\u8DEF\u5F84 \`${projectPath}\` \u7684\u540E\u7AEF\u76EE\u5F55\u4E2D\uFF0C\u76F4\u63A5\u751F\u6210\u5BF9\u5E94\u7684 Java \u8C03\u7528\u4EE3\u7801\uFF08\u5982 Feign Client \u6216 RestTemplate \u5C01\u88C5\uFF09\u3002
2314
+ \u8BF7\u786E\u4FDD\u4EE3\u7801\u7B26\u5408 \`CONVENTIONS.md\` \u4E2D\u7684\u89C4\u8303\u3002
2315
+ \u751F\u6210\u5B8C\u6210\u540E\uFF0C\u68C0\u67E5\u5E76\u4FEE\u590D\u4EFB\u4F55\u7F16\u8BD1\u9519\u8BEF\uFF0C\u6700\u540E\u7B80\u8981\u5217\u51FA\u751F\u6210\u7684\u6587\u4EF6\u3002`;
2316
+ try {
2317
+ await e("claude", ["-p", prompt, "--add-dir", projectPath], {
2318
+ stdio: "inherit",
2319
+ timeout: 6e5
2320
+ });
2321
+ logger.success(`[${module.name}] \u4EE3\u7801\u751F\u6210\u5B8C\u6210`);
2322
+ } catch (err) {
2323
+ logger.error(`[${module.name}] \u4EE3\u7801\u751F\u6210\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u624B\u52A8\u91CD\u8BD5`);
2324
+ }
2325
+ }
2326
+ }
2327
+ if (!options.noGit) {
2328
+ logger.newLine();
2329
+ await initGit(projectPath, projectName);
2330
+ }
2333
2331
  logger.newLine();
2334
- logger.success(`\u9879\u76EE ${projectName} \u521D\u59CB\u5316\u5B8C\u6210\uFF01`);
2332
+ logger.success(`\u9879\u76EE ${projectName} \u521D\u59CB\u5316\u6210\u529F\uFF01`);
2335
2333
  logger.newLine();
2336
2334
  logger.info("\u4E0B\u4E00\u6B65:");
2337
2335
  logger.step(`cd ${projectName}`);