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 +95 -97
- package/dist/cli.js.map +1 -1
- package/dist/index.js +95 -97
- 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
|
},
|
|
@@ -2246,92 +2262,74 @@ var init_init = __esm({
|
|
|
2246
2262
|
}
|
|
2247
2263
|
},
|
|
2248
2264
|
{
|
|
2249
|
-
title: "\u6CE8\
|
|
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
|
|
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\
|
|
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}`);
|