yg-team-cli 2.3.5 → 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 +99 -93
- package/dist/cli.js.map +1 -1
- package/dist/index.js +99 -93
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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
|
-
|
|
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("\
|
|
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: "\
|
|
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\
|
|
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
|
},
|
|
@@ -2245,85 +2261,75 @@ var init_init = __esm({
|
|
|
2245
2261
|
});
|
|
2246
2262
|
}
|
|
2247
2263
|
},
|
|
2248
|
-
...options.docker ? [
|
|
2249
|
-
{
|
|
2250
|
-
title: "\u751F\u6210 Docker \u914D\u7F6E",
|
|
2251
|
-
task: async () => {
|
|
2252
|
-
await generateDockerFiles();
|
|
2253
|
-
}
|
|
2254
|
-
}
|
|
2255
|
-
] : [],
|
|
2256
|
-
...options.git ? [
|
|
2257
|
-
{
|
|
2258
|
-
title: "\u521D\u59CB\u5316 Git",
|
|
2259
|
-
task: async () => {
|
|
2260
|
-
await initGit(projectPath, projectName);
|
|
2261
|
-
}
|
|
2262
|
-
}
|
|
2263
|
-
] : [],
|
|
2264
|
-
{
|
|
2265
|
-
title: "\u6CE8\u518C\u8FDC\u7A0B MCP \u670D\u52A1",
|
|
2266
|
-
task: async () => {
|
|
2267
|
-
const hasRemoteModule = selectedModules.some(
|
|
2268
|
-
(id) => ModuleManager.getModuleById(id)?.type === "remote"
|
|
2269
|
-
);
|
|
2270
|
-
if (hasRemoteModule) {
|
|
2271
|
-
const mcpCmd = 'claude_m2 mcp add --transport sse --header "Authorization: Bearer mcp_00557dabb71297b4f9ac5fe748395f2c" -- api-metadata https://api-metadata.yungu.org/sse';
|
|
2272
|
-
const { execaCommand } = await import("execa");
|
|
2273
|
-
try {
|
|
2274
|
-
await execaCommand(mcpCmd);
|
|
2275
|
-
logger.info("\u8FDC\u7A0B MCP \u670D\u52A1 api-metadata \u5DF2\u6CE8\u518C");
|
|
2276
|
-
} catch (err) {
|
|
2277
|
-
logger.warn("\u8FDC\u7A0B MCP \u670D\u52A1\u6CE8\u518C\u5931\u8D25\uFF0C\u53EF\u80FD\u5DF2\u5B58\u5728\u6216\u6743\u9650\u4E0D\u8DB3");
|
|
2278
|
-
}
|
|
2279
|
-
}
|
|
2280
|
-
}
|
|
2281
|
-
},
|
|
2282
2264
|
{
|
|
2283
|
-
title: "\u6CE8\u5165\u901A\u7528\u6A21\u5757",
|
|
2265
|
+
title: "\u6CE8\u5165\u9009\u5B9A\u7684\u901A\u7528\u6A21\u5757",
|
|
2284
2266
|
task: async () => {
|
|
2285
2267
|
if (selectedModules.length === 0) return;
|
|
2286
2268
|
const templatesDir = path7.resolve(FileUtils.getDirName(import.meta.url), "../templates");
|
|
2287
2269
|
for (const moduleId of selectedModules) {
|
|
2288
2270
|
await ModuleManager.injectModule(projectPath, moduleId, templatesDir);
|
|
2289
|
-
logger.info(`\u6CE8\u5165\u6A21\u5757: ${moduleId}`);
|
|
2290
2271
|
}
|
|
2291
2272
|
}
|
|
2292
2273
|
},
|
|
2293
|
-
|
|
2294
|
-
|
|
2295
|
-
|
|
2296
|
-
|
|
2297
|
-
|
|
2298
|
-
const { execaCommand } = await import("execa");
|
|
2299
|
-
for (const module of remoteModules) {
|
|
2300
|
-
if (!module) continue;
|
|
2301
|
-
logger.info(`\u6B63\u5728\u4E3A\u60A8\u751F\u6210 ${module.name} \u7684\u8FDC\u7A0B\u8C03\u7528\u4EE3\u7801...`);
|
|
2302
|
-
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
|
|
2303
|
-
\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
|
|
2304
|
-
\u8BF7\u786E\u4FDD\u4EE3\u7801\u7B26\u5408 \`CONVENTIONS.md\` \u4E2D\u7684\u89C4\u8303\u3002
|
|
2305
|
-
\u751F\u6210\u5B8C\u6210\u540E\uFF0C\u8BF7\u7B80\u8981\u5217\u51FA\u751F\u6210\u7684\u6587\u4EF6\u3002`;
|
|
2306
|
-
try {
|
|
2307
|
-
await execaCommand(`claude_m2 -p "${prompt}" --add-dir ${projectPath}`, {
|
|
2308
|
-
stdio: "inherit",
|
|
2309
|
-
timeout: 3e5
|
|
2310
|
-
// 5分钟超时
|
|
2311
|
-
});
|
|
2312
|
-
} catch (err) {
|
|
2313
|
-
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`);
|
|
2314
|
-
}
|
|
2274
|
+
...options.docker ? [
|
|
2275
|
+
{
|
|
2276
|
+
title: "\u751F\u6210 Docker \u90E8\u7F72\u914D\u7F6E",
|
|
2277
|
+
task: async () => {
|
|
2278
|
+
await generateDockerFiles(projectPath, projectName);
|
|
2315
2279
|
}
|
|
2316
2280
|
}
|
|
2317
|
-
|
|
2281
|
+
] : []
|
|
2318
2282
|
],
|
|
2319
|
-
{
|
|
2320
|
-
concurrent: false,
|
|
2321
|
-
exitOnError: true
|
|
2322
|
-
}
|
|
2283
|
+
{ concurrent: false, exitOnError: true }
|
|
2323
2284
|
);
|
|
2324
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
|
+
}
|
|
2325
2331
|
logger.newLine();
|
|
2326
|
-
logger.success(`\u9879\u76EE ${projectName} \u521D\u59CB\u5316\
|
|
2332
|
+
logger.success(`\u9879\u76EE ${projectName} \u521D\u59CB\u5316\u6210\u529F\uFF01`);
|
|
2327
2333
|
logger.newLine();
|
|
2328
2334
|
logger.info("\u4E0B\u4E00\u6B65:");
|
|
2329
2335
|
logger.step(`cd ${projectName}`);
|