ai-engineering-init 1.1.0
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/.claude/agents/code-reviewer.md +139 -0
- package/.claude/agents/project-manager.md +159 -0
- package/.claude/audio/completed.wav +0 -0
- package/.claude/commands/add-todo.md +255 -0
- package/.claude/commands/check.md +210 -0
- package/.claude/commands/crud.md +454 -0
- package/.claude/commands/dev.md +503 -0
- package/.claude/commands/init-docs.md +681 -0
- package/.claude/commands/next.md +251 -0
- package/.claude/commands/progress.md +242 -0
- package/.claude/commands/start.md +199 -0
- package/.claude/commands/sync.md +307 -0
- package/.claude/commands/update-status.md +428 -0
- package/.claude/docs/Mixin/344/275/277/347/224/250/346/214/207/345/215/227.md +299 -0
- package/.claude/docs/README.md +167 -0
- package/.claude/docs//345/211/215/347/253/257/345/274/200/345/217/221/346/214/207/345/215/227.md +599 -0
- package/.claude/docs//345/220/216/347/253/257/345/274/200/345/217/221/346/214/207/345/215/227.md +726 -0
- package/.claude/docs//345/267/245/344/275/234/346/265/201/345/274/200/345/217/221/346/214/207/345/215/227.md +714 -0
- package/.claude/docs//345/267/245/345/205/267/347/261/273/344/275/277/347/224/250/346/214/207/345/215/227.md +463 -0
- package/.claude/docs//346/225/260/346/215/256/345/272/223/350/256/276/350/256/241/350/247/204/350/214/203.md +390 -0
- package/.claude/docs//346/226/260/345/212/237/350/203/275/345/274/200/345/217/221/346/265/201/347/250/213/350/247/204/350/214/203.md +688 -0
- package/.claude/docs//346/226/260/351/241/271/347/233/256/345/274/200/345/217/221/346/265/201/347/250/213.md +365 -0
- package/.claude/docs//346/241/206/346/236/266/350/257/264/346/230/216.md +393 -0
- package/.claude/docs//350/267/257/347/224/261/351/205/215/347/275/256/346/214/207/345/215/227.md +246 -0
- package/.claude/framework-config.json +73 -0
- package/.claude/hooks/pre-tool-use.js +117 -0
- package/.claude/hooks/skill-forced-eval.js +167 -0
- package/.claude/hooks/stop.js +58 -0
- package/.claude/settings.json +41 -0
- package/.claude/skills/add-skill/SKILL.md +352 -0
- package/.claude/skills/api-development/SKILL.md +560 -0
- package/.claude/skills/architecture-design/SKILL.md +756 -0
- package/.claude/skills/backend-annotations/SKILL.md +674 -0
- package/.claude/skills/banana-image/CHANGELOG.md +37 -0
- package/.claude/skills/banana-image/README.md +146 -0
- package/.claude/skills/banana-image/SKILL.md +164 -0
- package/.claude/skills/banana-image/assets/logo.png +0 -0
- package/.claude/skills/banana-image/references/advanced-usage.md +189 -0
- package/.claude/skills/banana-image/scripts/apply_template.py +125 -0
- package/.claude/skills/banana-image/scripts/banana_image_exec.ts +412 -0
- package/.claude/skills/banana-image/scripts/batch_prep.py +82 -0
- package/.claude/skills/banana-image/scripts/package-lock.json +1437 -0
- package/.claude/skills/banana-image/scripts/package.json +18 -0
- package/.claude/skills/banana-image/scripts/requirements.txt +10 -0
- package/.claude/skills/banana-image/templates/poster.json +22 -0
- package/.claude/skills/banana-image/templates/product.json +17 -0
- package/.claude/skills/banana-image/templates/social.json +22 -0
- package/.claude/skills/banana-image/templates/thumbnail.json +17 -0
- package/.claude/skills/brainstorm/SKILL.md +648 -0
- package/.claude/skills/bug-detective/SKILL.md +1206 -0
- package/.claude/skills/code-patterns/SKILL.md +590 -0
- package/.claude/skills/collaborating-with-codex/SKILL.md +174 -0
- package/.claude/skills/collaborating-with-codex/scripts/codex_bridge.py +275 -0
- package/.claude/skills/collaborating-with-gemini/SKILL.md +194 -0
- package/.claude/skills/collaborating-with-gemini/scripts/gemini_bridge.py +275 -0
- package/.claude/skills/crud-development/SKILL.md +649 -0
- package/.claude/skills/data-permission/SKILL.md +599 -0
- package/.claude/skills/database-ops/SKILL.md +407 -0
- package/.claude/skills/error-handler/SKILL.md +371 -0
- package/.claude/skills/file-oss-management/SKILL.md +863 -0
- package/.claude/skills/git-workflow/SKILL.md +375 -0
- package/.claude/skills/json-serialization/SKILL.md +357 -0
- package/.claude/skills/leniu-api-development/SKILL.md +803 -0
- package/.claude/skills/leniu-architecture-design/SKILL.md +598 -0
- package/.claude/skills/leniu-backend-annotations/SKILL.md +664 -0
- package/.claude/skills/leniu-code-patterns/SKILL.md +365 -0
- package/.claude/skills/leniu-crud-development/SKILL.md +1110 -0
- package/.claude/skills/leniu-data-permission/SKILL.md +256 -0
- package/.claude/skills/leniu-database-ops/SKILL.md +426 -0
- package/.claude/skills/leniu-error-handler/SKILL.md +462 -0
- package/.claude/skills/leniu-java-amount-handling/SKILL.md +461 -0
- package/.claude/skills/leniu-java-code-style/SKILL.md +510 -0
- package/.claude/skills/leniu-java-concurrent/SKILL.md +400 -0
- package/.claude/skills/leniu-java-entity/SKILL.md +751 -0
- package/.claude/skills/leniu-java-export/SKILL.md +560 -0
- package/.claude/skills/leniu-java-logging/SKILL.md +832 -0
- package/.claude/skills/leniu-java-mq/SKILL.md +338 -0
- package/.claude/skills/leniu-java-mybatis/SKILL.md +640 -0
- package/.claude/skills/leniu-java-report-query-param/SKILL.md +291 -0
- package/.claude/skills/leniu-java-task/SKILL.md +367 -0
- package/.claude/skills/leniu-java-total-line/SKILL.md +195 -0
- package/.claude/skills/leniu-marketing-price-rule-customizer/SKILL.md +301 -0
- package/.claude/skills/leniu-marketing-recharge-rule-customizer/SKILL.md +285 -0
- package/.claude/skills/leniu-mealtime/SKILL.md +215 -0
- package/.claude/skills/leniu-redis-cache/SKILL.md +316 -0
- package/.claude/skills/leniu-security-guard/SKILL.md +520 -0
- package/.claude/skills/leniu-utils-toolkit/SKILL.md +380 -0
- package/.claude/skills/openspec-apply-change/SKILL.md +156 -0
- package/.claude/skills/openspec-archive-change/SKILL.md +114 -0
- package/.claude/skills/openspec-bulk-archive-change/SKILL.md +246 -0
- package/.claude/skills/openspec-continue-change/SKILL.md +118 -0
- package/.claude/skills/openspec-explore/SKILL.md +290 -0
- package/.claude/skills/openspec-ff-change/SKILL.md +101 -0
- package/.claude/skills/openspec-new-change/SKILL.md +74 -0
- package/.claude/skills/openspec-onboard/SKILL.md +529 -0
- package/.claude/skills/openspec-sync-specs/SKILL.md +138 -0
- package/.claude/skills/openspec-verify-change/SKILL.md +168 -0
- package/.claude/skills/performance-doctor/SKILL.md +627 -0
- package/.claude/skills/project-navigator/SKILL.md +305 -0
- package/.claude/skills/redis-cache/SKILL.md +839 -0
- package/.claude/skills/scheduled-jobs/SKILL.md +633 -0
- package/.claude/skills/security-guard/SKILL.md +748 -0
- package/.claude/skills/sms-mail/SKILL.md +766 -0
- package/.claude/skills/social-login/SKILL.md +668 -0
- package/.claude/skills/store-pc/SKILL.md +366 -0
- package/.claude/skills/task-tracker/SKILL.md +307 -0
- package/.claude/skills/tech-decision/SKILL.md +393 -0
- package/.claude/skills/tenant-management/SKILL.md +603 -0
- package/.claude/skills/test-development/SKILL.md +755 -0
- package/.claude/skills/ui-pc/SKILL.md +438 -0
- package/.claude/skills/utils-toolkit/SKILL.md +615 -0
- package/.claude/skills/websocket-sse/SKILL.md +716 -0
- package/.claude/skills/workflow-engine/SKILL.md +676 -0
- package/.claude/templates//345/276/205/345/212/236/346/270/205/345/215/225/346/250/241/346/235/277.md +56 -0
- package/.claude/templates//351/234/200/346/261/202/346/226/207/346/241/243/346/250/241/346/235/277.md +85 -0
- package/.claude/templates//351/241/271/347/233/256/347/212/266/346/200/201/346/250/241/346/235/277.md +43 -0
- package/.codex/skills/add-skill/SKILL.md +352 -0
- package/.codex/skills/add-todo/SKILL.md +269 -0
- package/.codex/skills/api-development/SKILL.md +693 -0
- package/.codex/skills/architecture-design/SKILL.md +628 -0
- package/.codex/skills/backend-annotations/SKILL.md +664 -0
- package/.codex/skills/banana-image/CHANGELOG.md +37 -0
- package/.codex/skills/banana-image/README.md +146 -0
- package/.codex/skills/banana-image/SKILL.md +164 -0
- package/.codex/skills/banana-image/assets/logo.png +0 -0
- package/.codex/skills/banana-image/references/advanced-usage.md +189 -0
- package/.codex/skills/banana-image/scripts/apply_template.py +125 -0
- package/.codex/skills/banana-image/scripts/banana_image_exec.ts +412 -0
- package/.codex/skills/banana-image/scripts/batch_prep.py +82 -0
- package/.codex/skills/banana-image/scripts/package-lock.json +1437 -0
- package/.codex/skills/banana-image/scripts/package.json +18 -0
- package/.codex/skills/banana-image/scripts/requirements.txt +10 -0
- package/.codex/skills/banana-image/templates/poster.json +22 -0
- package/.codex/skills/banana-image/templates/product.json +17 -0
- package/.codex/skills/banana-image/templates/social.json +22 -0
- package/.codex/skills/banana-image/templates/thumbnail.json +17 -0
- package/.codex/skills/brainstorm/SKILL.md +648 -0
- package/.codex/skills/bug-detective/SKILL.md +1206 -0
- package/.codex/skills/check/SKILL.md +367 -0
- package/.codex/skills/code-patterns/SKILL.md +442 -0
- package/.codex/skills/collaborating-with-codex/SKILL.md +174 -0
- package/.codex/skills/collaborating-with-codex/scripts/codex_bridge.py +275 -0
- package/.codex/skills/collaborating-with-gemini/SKILL.md +194 -0
- package/.codex/skills/collaborating-with-gemini/scripts/gemini_bridge.py +275 -0
- package/.codex/skills/crud/SKILL.md +265 -0
- package/.codex/skills/crud-development/SKILL.md +637 -0
- package/.codex/skills/data-permission/SKILL.md +591 -0
- package/.codex/skills/database-ops/SKILL.md +553 -0
- package/.codex/skills/dev/SKILL.md +187 -0
- package/.codex/skills/error-handler/SKILL.md +361 -0
- package/.codex/skills/file-oss-management/SKILL.md +863 -0
- package/.codex/skills/git-workflow/SKILL.md +375 -0
- package/.codex/skills/init-docs/SKILL.md +194 -0
- package/.codex/skills/json-serialization/SKILL.md +357 -0
- package/.codex/skills/leniu-api-development/SKILL.md +803 -0
- package/.codex/skills/leniu-architecture-design/SKILL.md +594 -0
- package/.codex/skills/leniu-backend-annotations/SKILL.md +662 -0
- package/.codex/skills/leniu-code-patterns/SKILL.md +365 -0
- package/.codex/skills/leniu-crud-development/SKILL.md +1110 -0
- package/.codex/skills/leniu-data-permission/SKILL.md +256 -0
- package/.codex/skills/leniu-database-ops/SKILL.md +426 -0
- package/.codex/skills/leniu-error-handler/SKILL.md +462 -0
- package/.codex/skills/leniu-java-amount-handling/SKILL.md +461 -0
- package/.codex/skills/leniu-java-code-style/SKILL.md +510 -0
- package/.codex/skills/leniu-java-concurrent/SKILL.md +400 -0
- package/.codex/skills/leniu-java-entity/SKILL.md +751 -0
- package/.codex/skills/leniu-java-export/SKILL.md +560 -0
- package/.codex/skills/leniu-java-logging/SKILL.md +832 -0
- package/.codex/skills/leniu-java-mq/SKILL.md +338 -0
- package/.codex/skills/leniu-java-mybatis/SKILL.md +640 -0
- package/.codex/skills/leniu-java-report-query-param/SKILL.md +291 -0
- package/.codex/skills/leniu-java-task/SKILL.md +367 -0
- package/.codex/skills/leniu-java-total-line/SKILL.md +195 -0
- package/.codex/skills/leniu-marketing-price-rule-customizer/SKILL.md +301 -0
- package/.codex/skills/leniu-marketing-recharge-rule-customizer/SKILL.md +285 -0
- package/.codex/skills/leniu-mealtime/SKILL.md +215 -0
- package/.codex/skills/leniu-redis-cache/SKILL.md +316 -0
- package/.codex/skills/leniu-security-guard/SKILL.md +520 -0
- package/.codex/skills/leniu-utils-toolkit/SKILL.md +378 -0
- package/.codex/skills/next/SKILL.md +137 -0
- package/.codex/skills/openspec-apply-change/SKILL.md +156 -0
- package/.codex/skills/openspec-archive-change/SKILL.md +114 -0
- package/.codex/skills/openspec-bulk-archive-change/SKILL.md +246 -0
- package/.codex/skills/openspec-continue-change/SKILL.md +118 -0
- package/.codex/skills/openspec-explore/SKILL.md +290 -0
- package/.codex/skills/openspec-ff-change/SKILL.md +101 -0
- package/.codex/skills/openspec-new-change/SKILL.md +74 -0
- package/.codex/skills/openspec-onboard/SKILL.md +529 -0
- package/.codex/skills/openspec-sync-specs/SKILL.md +138 -0
- package/.codex/skills/openspec-verify-change/SKILL.md +168 -0
- package/.codex/skills/performance-doctor/SKILL.md +627 -0
- package/.codex/skills/progress/SKILL.md +193 -0
- package/.codex/skills/project-navigator/SKILL.md +286 -0
- package/.codex/skills/redis-cache/SKILL.md +829 -0
- package/.codex/skills/scheduled-jobs/SKILL.md +633 -0
- package/.codex/skills/security-guard/SKILL.md +739 -0
- package/.codex/skills/sms-mail/SKILL.md +766 -0
- package/.codex/skills/social-login/SKILL.md +668 -0
- package/.codex/skills/start/SKILL.md +154 -0
- package/.codex/skills/store-pc/SKILL.md +491 -0
- package/.codex/skills/sync/SKILL.md +149 -0
- package/.codex/skills/task-tracker/SKILL.md +307 -0
- package/.codex/skills/tech-decision/SKILL.md +393 -0
- package/.codex/skills/tenant-management/SKILL.md +603 -0
- package/.codex/skills/test-development/SKILL.md +755 -0
- package/.codex/skills/ui-pc/SKILL.md +475 -0
- package/.codex/skills/update-status/SKILL.md +159 -0
- package/.codex/skills/utils-toolkit/SKILL.md +593 -0
- package/.codex/skills/websocket-sse/SKILL.md +716 -0
- package/.codex/skills/workflow-engine/SKILL.md +676 -0
- package/.cursor/agents/code-reviewer.md +139 -0
- package/.cursor/agents/project-manager.md +159 -0
- package/.cursor/commands/opsx-apply.md +152 -0
- package/.cursor/commands/opsx-archive.md +157 -0
- package/.cursor/commands/opsx-bulk-archive.md +242 -0
- package/.cursor/commands/opsx-continue.md +114 -0
- package/.cursor/commands/opsx-explore.md +174 -0
- package/.cursor/commands/opsx-ff.md +94 -0
- package/.cursor/commands/opsx-new.md +69 -0
- package/.cursor/commands/opsx-onboard.md +525 -0
- package/.cursor/commands/opsx-sync.md +134 -0
- package/.cursor/commands/opsx-verify.md +164 -0
- package/.cursor/mcp.json +22 -0
- package/.cursor/skills/add-skill/SKILL.md +352 -0
- package/.cursor/skills/api-development/SKILL.md +560 -0
- package/.cursor/skills/architecture-design/SKILL.md +756 -0
- package/.cursor/skills/backend-annotations/SKILL.md +674 -0
- package/.cursor/skills/banana-image/CHANGELOG.md +37 -0
- package/.cursor/skills/banana-image/README.md +146 -0
- package/.cursor/skills/banana-image/SKILL.md +164 -0
- package/.cursor/skills/banana-image/assets/logo.png +0 -0
- package/.cursor/skills/banana-image/references/advanced-usage.md +189 -0
- package/.cursor/skills/banana-image/scripts/apply_template.py +125 -0
- package/.cursor/skills/banana-image/scripts/banana_image_exec.ts +412 -0
- package/.cursor/skills/banana-image/scripts/batch_prep.py +82 -0
- package/.cursor/skills/banana-image/scripts/package-lock.json +1437 -0
- package/.cursor/skills/banana-image/scripts/package.json +18 -0
- package/.cursor/skills/banana-image/scripts/requirements.txt +10 -0
- package/.cursor/skills/banana-image/templates/poster.json +22 -0
- package/.cursor/skills/banana-image/templates/product.json +17 -0
- package/.cursor/skills/banana-image/templates/social.json +22 -0
- package/.cursor/skills/banana-image/templates/thumbnail.json +17 -0
- package/.cursor/skills/brainstorm/SKILL.md +648 -0
- package/.cursor/skills/bug-detective/SKILL.md +1206 -0
- package/.cursor/skills/code-patterns/SKILL.md +590 -0
- package/.cursor/skills/collaborating-with-codex/SKILL.md +174 -0
- package/.cursor/skills/collaborating-with-codex/scripts/codex_bridge.py +275 -0
- package/.cursor/skills/collaborating-with-gemini/SKILL.md +194 -0
- package/.cursor/skills/collaborating-with-gemini/scripts/gemini_bridge.py +275 -0
- package/.cursor/skills/crud-development/SKILL.md +649 -0
- package/.cursor/skills/data-permission/SKILL.md +599 -0
- package/.cursor/skills/database-ops/SKILL.md +407 -0
- package/.cursor/skills/error-handler/SKILL.md +371 -0
- package/.cursor/skills/file-oss-management/SKILL.md +863 -0
- package/.cursor/skills/git-workflow/SKILL.md +375 -0
- package/.cursor/skills/json-serialization/SKILL.md +357 -0
- package/.cursor/skills/leniu-api-development/SKILL.md +803 -0
- package/.cursor/skills/leniu-architecture-design/SKILL.md +598 -0
- package/.cursor/skills/leniu-backend-annotations/SKILL.md +664 -0
- package/.cursor/skills/leniu-code-patterns/SKILL.md +365 -0
- package/.cursor/skills/leniu-crud-development/SKILL.md +1110 -0
- package/.cursor/skills/leniu-data-permission/SKILL.md +256 -0
- package/.cursor/skills/leniu-database-ops/SKILL.md +426 -0
- package/.cursor/skills/leniu-error-handler/SKILL.md +462 -0
- package/.cursor/skills/leniu-java-amount-handling/SKILL.md +461 -0
- package/.cursor/skills/leniu-java-code-style/SKILL.md +510 -0
- package/.cursor/skills/leniu-java-concurrent/SKILL.md +400 -0
- package/.cursor/skills/leniu-java-entity/SKILL.md +751 -0
- package/.cursor/skills/leniu-java-export/SKILL.md +560 -0
- package/.cursor/skills/leniu-java-logging/SKILL.md +832 -0
- package/.cursor/skills/leniu-java-mq/SKILL.md +338 -0
- package/.cursor/skills/leniu-java-mybatis/SKILL.md +640 -0
- package/.cursor/skills/leniu-java-report-query-param/SKILL.md +291 -0
- package/.cursor/skills/leniu-java-task/SKILL.md +367 -0
- package/.cursor/skills/leniu-java-total-line/SKILL.md +195 -0
- package/.cursor/skills/leniu-marketing-price-rule-customizer/SKILL.md +301 -0
- package/.cursor/skills/leniu-marketing-recharge-rule-customizer/SKILL.md +285 -0
- package/.cursor/skills/leniu-mealtime/SKILL.md +215 -0
- package/.cursor/skills/leniu-redis-cache/SKILL.md +316 -0
- package/.cursor/skills/leniu-security-guard/SKILL.md +520 -0
- package/.cursor/skills/leniu-utils-toolkit/SKILL.md +380 -0
- package/.cursor/skills/openspec-apply-change/SKILL.md +156 -0
- package/.cursor/skills/openspec-archive-change/SKILL.md +114 -0
- package/.cursor/skills/openspec-bulk-archive-change/SKILL.md +246 -0
- package/.cursor/skills/openspec-continue-change/SKILL.md +118 -0
- package/.cursor/skills/openspec-explore/SKILL.md +290 -0
- package/.cursor/skills/openspec-ff-change/SKILL.md +101 -0
- package/.cursor/skills/openspec-new-change/SKILL.md +74 -0
- package/.cursor/skills/openspec-onboard/SKILL.md +529 -0
- package/.cursor/skills/openspec-sync-specs/SKILL.md +138 -0
- package/.cursor/skills/openspec-verify-change/SKILL.md +168 -0
- package/.cursor/skills/performance-doctor/SKILL.md +627 -0
- package/.cursor/skills/project-navigator/SKILL.md +305 -0
- package/.cursor/skills/redis-cache/SKILL.md +839 -0
- package/.cursor/skills/scheduled-jobs/SKILL.md +633 -0
- package/.cursor/skills/security-guard/SKILL.md +748 -0
- package/.cursor/skills/sms-mail/SKILL.md +766 -0
- package/.cursor/skills/social-login/SKILL.md +668 -0
- package/.cursor/skills/store-pc/SKILL.md +366 -0
- package/.cursor/skills/task-tracker/SKILL.md +307 -0
- package/.cursor/skills/tech-decision/SKILL.md +393 -0
- package/.cursor/skills/tenant-management/SKILL.md +603 -0
- package/.cursor/skills/test-development/SKILL.md +755 -0
- package/.cursor/skills/ui-pc/SKILL.md +438 -0
- package/.cursor/skills/utils-toolkit/SKILL.md +615 -0
- package/.cursor/skills/websocket-sse/SKILL.md +716 -0
- package/.cursor/skills/workflow-engine/SKILL.md +676 -0
- package/AGENTS.md +669 -0
- package/CLAUDE.md +205 -0
- package/README.md +205 -0
- package/bin/index.js +179 -0
- package/init.sh +178 -0
- package/package.json +27 -0
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Gemini Bridge Script for Claude Agent Skills.
|
|
3
|
+
Wraps the Gemini CLI to provide a JSON-based interface for Claude.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import json
|
|
7
|
+
import os
|
|
8
|
+
import sys
|
|
9
|
+
import queue
|
|
10
|
+
import subprocess
|
|
11
|
+
import threading
|
|
12
|
+
import time
|
|
13
|
+
import shutil
|
|
14
|
+
import argparse
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
from typing import Generator, List, Optional
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def _get_windows_npm_paths() -> List[Path]:
|
|
20
|
+
"""Return candidate directories for npm global installs on Windows."""
|
|
21
|
+
if os.name != "nt":
|
|
22
|
+
return []
|
|
23
|
+
paths: List[Path] = []
|
|
24
|
+
env = os.environ
|
|
25
|
+
if prefix := env.get("NPM_CONFIG_PREFIX") or env.get("npm_config_prefix"):
|
|
26
|
+
paths.append(Path(prefix))
|
|
27
|
+
if appdata := env.get("APPDATA"):
|
|
28
|
+
paths.append(Path(appdata) / "npm")
|
|
29
|
+
if localappdata := env.get("LOCALAPPDATA"):
|
|
30
|
+
paths.append(Path(localappdata) / "npm")
|
|
31
|
+
if programfiles := env.get("ProgramFiles"):
|
|
32
|
+
paths.append(Path(programfiles) / "nodejs")
|
|
33
|
+
return paths
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _augment_path_env(env: dict) -> None:
|
|
37
|
+
"""Prepend npm global directories to PATH if missing."""
|
|
38
|
+
if os.name != "nt":
|
|
39
|
+
return
|
|
40
|
+
path_key = next((k for k in env if k.upper() == "PATH"), "PATH")
|
|
41
|
+
path_entries = [p for p in env.get(path_key, "").split(os.pathsep) if p]
|
|
42
|
+
lower_set = {p.lower() for p in path_entries}
|
|
43
|
+
for candidate in _get_windows_npm_paths():
|
|
44
|
+
if candidate.is_dir() and str(candidate).lower() not in lower_set:
|
|
45
|
+
path_entries.insert(0, str(candidate))
|
|
46
|
+
lower_set.add(str(candidate).lower())
|
|
47
|
+
env[path_key] = os.pathsep.join(path_entries)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def _resolve_executable(name: str, env: dict) -> str:
|
|
51
|
+
"""Resolve executable path, checking npm directories for .cmd/.bat on Windows."""
|
|
52
|
+
if os.path.isabs(name) or os.sep in name or (os.altsep and os.altsep in name):
|
|
53
|
+
return name
|
|
54
|
+
path_key = next((k for k in env if k.upper() == "PATH"), "PATH")
|
|
55
|
+
if resolved := shutil.which(name, path=env.get(path_key)):
|
|
56
|
+
return resolved
|
|
57
|
+
if os.name == "nt":
|
|
58
|
+
for base in _get_windows_npm_paths():
|
|
59
|
+
for ext in (".cmd", ".bat", ".exe"):
|
|
60
|
+
candidate = base / f"{name}{ext}"
|
|
61
|
+
if candidate.is_file():
|
|
62
|
+
return str(candidate)
|
|
63
|
+
return name
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def run_shell_command(cmd: List[str], cwd: Optional[str] = None) -> Generator[str, None, None]:
|
|
67
|
+
"""Execute a command and stream its output line-by-line."""
|
|
68
|
+
env = os.environ.copy()
|
|
69
|
+
_augment_path_env(env)
|
|
70
|
+
|
|
71
|
+
popen_cmd = cmd.copy()
|
|
72
|
+
exe_path = _resolve_executable(cmd[0], env)
|
|
73
|
+
popen_cmd[0] = exe_path
|
|
74
|
+
|
|
75
|
+
# Windows .cmd/.bat files need cmd.exe wrapper (avoid shell=True for security)
|
|
76
|
+
if os.name == "nt" and Path(exe_path).suffix.lower() in {".cmd", ".bat"}:
|
|
77
|
+
# Escape shell metacharacters for cmd.exe
|
|
78
|
+
def _cmd_quote(arg: str) -> str:
|
|
79
|
+
if not arg:
|
|
80
|
+
return '""'
|
|
81
|
+
# For Windows batch files, % and ^ must be escaped before quoting
|
|
82
|
+
arg = arg.replace('%', '%%')
|
|
83
|
+
arg = arg.replace('^', '^^')
|
|
84
|
+
if any(c in arg for c in '&|<>()^" \t'):
|
|
85
|
+
# To safely escape " inside "...", close quote, escape ", reopen
|
|
86
|
+
escaped = arg.replace('"', '"^""')
|
|
87
|
+
return f'"{escaped}"'
|
|
88
|
+
return arg
|
|
89
|
+
cmdline = " ".join(_cmd_quote(a) for a in popen_cmd)
|
|
90
|
+
comspec = env.get("COMSPEC", "cmd.exe")
|
|
91
|
+
# Use a single string to avoid subprocess list escaping on Windows
|
|
92
|
+
popen_cmd = f'"{comspec}" /d /s /c "{cmdline}"'
|
|
93
|
+
|
|
94
|
+
process = subprocess.Popen(
|
|
95
|
+
popen_cmd,
|
|
96
|
+
shell=False,
|
|
97
|
+
stdin=subprocess.DEVNULL,
|
|
98
|
+
stdout=subprocess.PIPE,
|
|
99
|
+
stderr=subprocess.STDOUT,
|
|
100
|
+
universal_newlines=True,
|
|
101
|
+
encoding='utf-8',
|
|
102
|
+
errors='replace',
|
|
103
|
+
cwd=cwd,
|
|
104
|
+
env=env,
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
output_queue: "queue.Queue[Optional[str]]" = queue.Queue()
|
|
108
|
+
GRACEFUL_SHUTDOWN_DELAY = 0.3
|
|
109
|
+
|
|
110
|
+
def is_turn_completed(line: str) -> bool:
|
|
111
|
+
try:
|
|
112
|
+
data = json.loads(line)
|
|
113
|
+
return data.get("type") == "turn.completed"
|
|
114
|
+
except (json.JSONDecodeError, AttributeError, TypeError):
|
|
115
|
+
return False
|
|
116
|
+
|
|
117
|
+
def read_output() -> None:
|
|
118
|
+
if process.stdout:
|
|
119
|
+
for line in iter(process.stdout.readline, ""):
|
|
120
|
+
stripped = line.strip()
|
|
121
|
+
output_queue.put(stripped)
|
|
122
|
+
if is_turn_completed(stripped):
|
|
123
|
+
time.sleep(GRACEFUL_SHUTDOWN_DELAY)
|
|
124
|
+
process.terminate()
|
|
125
|
+
break
|
|
126
|
+
process.stdout.close()
|
|
127
|
+
output_queue.put(None)
|
|
128
|
+
|
|
129
|
+
thread = threading.Thread(target=read_output)
|
|
130
|
+
thread.start()
|
|
131
|
+
|
|
132
|
+
while True:
|
|
133
|
+
try:
|
|
134
|
+
line = output_queue.get(timeout=0.5)
|
|
135
|
+
if line is None:
|
|
136
|
+
break
|
|
137
|
+
yield line
|
|
138
|
+
except queue.Empty:
|
|
139
|
+
if process.poll() is not None and not thread.is_alive():
|
|
140
|
+
break
|
|
141
|
+
|
|
142
|
+
try:
|
|
143
|
+
process.wait(timeout=5)
|
|
144
|
+
except subprocess.TimeoutExpired:
|
|
145
|
+
process.kill()
|
|
146
|
+
process.wait()
|
|
147
|
+
thread.join(timeout=5)
|
|
148
|
+
|
|
149
|
+
while not output_queue.empty():
|
|
150
|
+
try:
|
|
151
|
+
line = output_queue.get_nowait()
|
|
152
|
+
if line is not None:
|
|
153
|
+
yield line
|
|
154
|
+
except queue.Empty:
|
|
155
|
+
break
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
def windows_escape(prompt):
|
|
159
|
+
"""Windows style string escaping for newlines and special chars in prompt text."""
|
|
160
|
+
result = prompt.replace('\n', '\\n')
|
|
161
|
+
result = result.replace('\r', '\\r')
|
|
162
|
+
result = result.replace('\t', '\\t')
|
|
163
|
+
return result
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
def configure_windows_stdio() -> None:
|
|
167
|
+
"""Configure stdout/stderr to use UTF-8 encoding on Windows."""
|
|
168
|
+
if os.name != "nt":
|
|
169
|
+
return
|
|
170
|
+
for stream in (sys.stdout, sys.stderr):
|
|
171
|
+
reconfigure = getattr(stream, "reconfigure", None)
|
|
172
|
+
if callable(reconfigure):
|
|
173
|
+
try:
|
|
174
|
+
reconfigure(encoding="utf-8")
|
|
175
|
+
except (ValueError, OSError):
|
|
176
|
+
pass
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
def main():
|
|
180
|
+
configure_windows_stdio()
|
|
181
|
+
parser = argparse.ArgumentParser(description="Gemini Bridge")
|
|
182
|
+
parser.add_argument("--PROMPT", required=True, help="Instruction for the task to send to gemini.")
|
|
183
|
+
parser.add_argument("--cd", required=True, type=Path, help="Set the workspace root for gemini before executing the task.")
|
|
184
|
+
parser.add_argument("--sandbox", action="store_true", default=False, help="Run in sandbox mode. Defaults to `False`.")
|
|
185
|
+
parser.add_argument("--SESSION_ID", default="", help="Resume the specified session of the gemini. Defaults to empty string, start a new session.")
|
|
186
|
+
parser.add_argument("--return-all-messages", action="store_true", help="Return all messages (e.g. reasoning, tool calls, etc.) from the gemini session. Set to `False` by default, only the agent's final reply message is returned.")
|
|
187
|
+
parser.add_argument("--model", default="", help="The model to use for the gemini session. This parameter is strictly prohibited unless explicitly specified by the user.")
|
|
188
|
+
|
|
189
|
+
args = parser.parse_args()
|
|
190
|
+
|
|
191
|
+
cd: Path = args.cd
|
|
192
|
+
if not cd.exists():
|
|
193
|
+
result = {
|
|
194
|
+
"success": False,
|
|
195
|
+
"error": f"The workspace root directory `{cd.absolute()}` does not exist. Please check the path and try again."
|
|
196
|
+
}
|
|
197
|
+
print(json.dumps(result, indent=2, ensure_ascii=False))
|
|
198
|
+
return
|
|
199
|
+
|
|
200
|
+
PROMPT = args.PROMPT
|
|
201
|
+
if os.name == "nt":
|
|
202
|
+
PROMPT = windows_escape(PROMPT)
|
|
203
|
+
|
|
204
|
+
cmd = ["gemini", "-o", "stream-json", PROMPT]
|
|
205
|
+
|
|
206
|
+
if args.sandbox:
|
|
207
|
+
cmd.extend(["--sandbox"])
|
|
208
|
+
|
|
209
|
+
if args.model:
|
|
210
|
+
cmd.extend(["--model", args.model])
|
|
211
|
+
|
|
212
|
+
if args.SESSION_ID:
|
|
213
|
+
cmd.extend(["--resume", args.SESSION_ID])
|
|
214
|
+
|
|
215
|
+
all_messages = []
|
|
216
|
+
agent_messages = ""
|
|
217
|
+
success = True
|
|
218
|
+
err_message = ""
|
|
219
|
+
thread_id = None
|
|
220
|
+
|
|
221
|
+
for line in run_shell_command(cmd, cwd=str(cd.absolute())):
|
|
222
|
+
try:
|
|
223
|
+
line_dict = json.loads(line.strip())
|
|
224
|
+
all_messages.append(line_dict)
|
|
225
|
+
item_type = line_dict.get("type", "")
|
|
226
|
+
item_role = line_dict.get("role", "")
|
|
227
|
+
if item_type == "message" and item_role == "assistant":
|
|
228
|
+
if (
|
|
229
|
+
"The --prompt (-p) flag has been deprecated and will be removed in a future version. Please use a positional argument for your prompt. See gemini --help for more information.\n"
|
|
230
|
+
in line_dict.get("content", "")
|
|
231
|
+
):
|
|
232
|
+
continue
|
|
233
|
+
agent_messages = agent_messages + line_dict.get("content", "")
|
|
234
|
+
if line_dict.get("session_id") is not None:
|
|
235
|
+
thread_id = line_dict.get("session_id")
|
|
236
|
+
|
|
237
|
+
except json.JSONDecodeError:
|
|
238
|
+
err_message += "\n\n[json decode error] " + line
|
|
239
|
+
continue
|
|
240
|
+
|
|
241
|
+
except Exception as error:
|
|
242
|
+
err_message += "\n\n[unexpected error] " + f"Unexpected error: {error}. Line: {line!r}"
|
|
243
|
+
break
|
|
244
|
+
|
|
245
|
+
result = {}
|
|
246
|
+
|
|
247
|
+
if thread_id is None:
|
|
248
|
+
success = False
|
|
249
|
+
err_message = "Failed to get `SESSION_ID` from the gemini session. \n\n" + err_message
|
|
250
|
+
else:
|
|
251
|
+
result["SESSION_ID"] = thread_id
|
|
252
|
+
|
|
253
|
+
if success and len(agent_messages) == 0:
|
|
254
|
+
success = False
|
|
255
|
+
err_message = (
|
|
256
|
+
"Failed to retrieve `agent_messages` data from the Gemini session. This might be due to Gemini performing a tool call. You can continue using the `SESSION_ID` to proceed with the conversation. \n\n "
|
|
257
|
+
+ err_message
|
|
258
|
+
)
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
if success:
|
|
262
|
+
result["agent_messages"] = agent_messages
|
|
263
|
+
else:
|
|
264
|
+
result["error"] = err_message
|
|
265
|
+
|
|
266
|
+
result["success"] = success
|
|
267
|
+
|
|
268
|
+
if args.return_all_messages:
|
|
269
|
+
result["all_messages"] = all_messages
|
|
270
|
+
|
|
271
|
+
print(json.dumps(result, indent=2, ensure_ascii=False))
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
if __name__ == "__main__":
|
|
275
|
+
main()
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: crud
|
|
3
|
+
description: |
|
|
4
|
+
当需要基于已存在的数据库表快速生成 CRUD 代码时自动使用此 Skill。
|
|
5
|
+
|
|
6
|
+
触发场景:
|
|
7
|
+
- 数据库表已存在,需要生成后端代码
|
|
8
|
+
- 需要标准的增删改查功能
|
|
9
|
+
- 快速原型开发
|
|
10
|
+
- 需要生成树形结构的 CRUD
|
|
11
|
+
|
|
12
|
+
触发词:生成CRUD、crud、代码生成、快速生成、生成代码、CRUD生成、表生成代码
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# /crud - 快速生成 CRUD 代码
|
|
16
|
+
|
|
17
|
+
作为 CRUD 代码生成助手,基于已存在的数据库表快速生成标准后端 CRUD 代码。
|
|
18
|
+
|
|
19
|
+
## 🎯 适用场景
|
|
20
|
+
|
|
21
|
+
### ✅ 适合使用 `/crud` 的情况
|
|
22
|
+
|
|
23
|
+
- ✅ **数据库表已存在** - 表结构已设计完毕
|
|
24
|
+
- ✅ **只需标准 CRUD** - 增删改查、导入导出等标准功能
|
|
25
|
+
- ✅ **无复杂业务逻辑** - 没有特殊的业务规则
|
|
26
|
+
- ✅ **快速原型开发** - 需要快速搭建基础功能
|
|
27
|
+
- ✅ **树形结构数据** - 部门、分类等层级数据(tree 模板)
|
|
28
|
+
|
|
29
|
+
### ❌ 不适合使用 `/crud` 的情况
|
|
30
|
+
|
|
31
|
+
- ❌ **表结构尚未设计** → 请使用 `/dev` 命令
|
|
32
|
+
- ❌ **需要复杂业务逻辑** → 请使用 `/dev` 命令后手动增强
|
|
33
|
+
|
|
34
|
+
### 📋 支持的模板类型
|
|
35
|
+
|
|
36
|
+
| 模板类型 | 适用场景 | 特点 |
|
|
37
|
+
|---------|---------|------|
|
|
38
|
+
| **crud** | 普通表 | 标准增删改查、分页列表 |
|
|
39
|
+
| **tree** | 树形表 | 父子层级、展开折叠、无分页 |
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 📋 执行流程
|
|
44
|
+
|
|
45
|
+
### 第一步:连接数据库并查看表结构
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
请提供表名:
|
|
49
|
+
(如:sys_notice, demo_xxx)
|
|
50
|
+
|
|
51
|
+
💡 数据库连接信息将从 application-dev.yml 自动读取
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
读取 `ruoyi-admin/src/main/resources/application-dev.yml` 获取数据库配置。
|
|
55
|
+
|
|
56
|
+
### 第二步:分析表结构
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
SHOW CREATE TABLE [表名];
|
|
60
|
+
DESC [表名];
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**字段类型映射规则**:
|
|
64
|
+
|
|
65
|
+
| 数据库类型 | Java类型 | 说明 |
|
|
66
|
+
|-----------|---------|------|
|
|
67
|
+
| BIGINT(20), BIGINT | Long | 长整数 |
|
|
68
|
+
| INT(11), INT | Integer | 整数 |
|
|
69
|
+
| VARCHAR(n), CHAR(n) | String | 字符串 |
|
|
70
|
+
| TEXT, LONGTEXT | String | 长文本 |
|
|
71
|
+
| DATETIME, TIMESTAMP | Date | 日期时间 |
|
|
72
|
+
| DECIMAL(m,n) | BigDecimal | 高精度数值 |
|
|
73
|
+
| TINYINT(1), CHAR(1) | String | 状态字段(0/1)|
|
|
74
|
+
|
|
75
|
+
### 第三步:选择模板类型
|
|
76
|
+
|
|
77
|
+
**自动检测规则**:
|
|
78
|
+
- 表中包含 `parent_id` 字段且 `parent_id` 为 BIGINT → `tree` 模板
|
|
79
|
+
- 其他情况 → `crud` 模板
|
|
80
|
+
|
|
81
|
+
### 第四步:生成菜单 SQL
|
|
82
|
+
|
|
83
|
+
根据表名前缀确定模块名:
|
|
84
|
+
|
|
85
|
+
| 表名前缀 | 模块名 | 权限标识符格式 |
|
|
86
|
+
|---------|--------|--------------|
|
|
87
|
+
| `sys_` | `system` | `system:[功能名]:[操作]` |
|
|
88
|
+
| `demo_` | `demo` | `demo:[功能名]:[操作]` |
|
|
89
|
+
|
|
90
|
+
生成完整的菜单 SQL(6个权限:查看、查询、新增、修改、删除、导出)。
|
|
91
|
+
|
|
92
|
+
### 第五步:生成后端代码
|
|
93
|
+
|
|
94
|
+
**学习现有代码(强制执行)**:
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
Read ruoyi-system/src/main/java/org/dromara/system/controller/SysNoticeController.java
|
|
98
|
+
Read ruoyi-system/src/main/java/org/dromara/system/service/impl/SysNoticeServiceImpl.java
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
**生成代码顺序(三层架构)**:
|
|
102
|
+
|
|
103
|
+
1. **Entity** - 继承 TenantEntity,字段从表结构映射
|
|
104
|
+
2. **BO** - 使用 @AutoMapper 注解
|
|
105
|
+
3. **VO** - 含 Excel 导出注解
|
|
106
|
+
4. **Mapper** - 继承 BaseMapperPlus
|
|
107
|
+
5. **Service 接口** - 标准 CRUD 方法声明
|
|
108
|
+
6. **ServiceImpl** - 业务逻辑实现,包含 buildQueryWrapper
|
|
109
|
+
7. **Controller** - 标准接口 + 导入导出
|
|
110
|
+
|
|
111
|
+
**查询条件生成规则**:
|
|
112
|
+
|
|
113
|
+
| 字段名后缀 | 查询方式 | Java类型 | 说明 |
|
|
114
|
+
|-----------|---------|---------|------|
|
|
115
|
+
| `xxx_name`、`xxx_title` | LIKE | String | 名称/标题字段 |
|
|
116
|
+
| `xxx_content`、`remark` | LIKE | String | 长文本/备注字段 |
|
|
117
|
+
| `id`、`code` | EQ | Long/String | ID/编码字段 |
|
|
118
|
+
| `status` | EQ | String | 标准状态字段 |
|
|
119
|
+
| `xxx_type` | EQ | String | 分类/类型字段 |
|
|
120
|
+
| `xxx_time`、`xxx_date` | BETWEEN | Date | 日期/时间范围查询 |
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## 代码模板
|
|
125
|
+
|
|
126
|
+
### Entity 模板
|
|
127
|
+
|
|
128
|
+
```java
|
|
129
|
+
package org.dromara.[模块].domain;
|
|
130
|
+
|
|
131
|
+
import com.baomidou.mybatisplus.annotation.TableId;
|
|
132
|
+
import com.baomidou.mybatisplus.annotation.TableName;
|
|
133
|
+
import org.dromara.common.tenant.core.TenantEntity;
|
|
134
|
+
import lombok.Data;
|
|
135
|
+
import lombok.EqualsAndHashCode;
|
|
136
|
+
|
|
137
|
+
@Data
|
|
138
|
+
@EqualsAndHashCode(callSuper = true)
|
|
139
|
+
@TableName("[表名]")
|
|
140
|
+
public class [实体名] extends TenantEntity {
|
|
141
|
+
|
|
142
|
+
@TableId(value = "id")
|
|
143
|
+
private Long id;
|
|
144
|
+
|
|
145
|
+
// 业务字段...
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### BO 模板
|
|
150
|
+
|
|
151
|
+
```java
|
|
152
|
+
package org.dromara.[模块].domain.bo;
|
|
153
|
+
|
|
154
|
+
import org.dromara.[模块].domain.[实体名];
|
|
155
|
+
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
|
156
|
+
import io.github.linpeilie.annotations.AutoMapper;
|
|
157
|
+
import lombok.Data;
|
|
158
|
+
import lombok.EqualsAndHashCode;
|
|
159
|
+
|
|
160
|
+
@Data
|
|
161
|
+
@EqualsAndHashCode(callSuper = true)
|
|
162
|
+
@AutoMapper(target = [实体名].class, reverseConvertGenerate = false)
|
|
163
|
+
public class [实体名]Bo extends BaseEntity {
|
|
164
|
+
|
|
165
|
+
private Long id;
|
|
166
|
+
|
|
167
|
+
// 业务字段...
|
|
168
|
+
}
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### ServiceImpl 模板
|
|
172
|
+
|
|
173
|
+
```java
|
|
174
|
+
package org.dromara.[模块].service.impl;
|
|
175
|
+
|
|
176
|
+
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
177
|
+
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
178
|
+
import lombok.RequiredArgsConstructor;
|
|
179
|
+
import org.dromara.[模块].domain.[实体名];
|
|
180
|
+
import org.dromara.[模块].domain.bo.[实体名]Bo;
|
|
181
|
+
import org.dromara.[模块].domain.vo.[实体名]Vo;
|
|
182
|
+
import org.dromara.[模块].mapper.[实体名]Mapper;
|
|
183
|
+
import org.dromara.[模块].service.I[实体名]Service;
|
|
184
|
+
import org.dromara.common.core.utils.MapstructUtils;
|
|
185
|
+
import org.dromara.common.core.utils.StringUtils;
|
|
186
|
+
import org.dromara.common.mybatis.core.page.PageQuery;
|
|
187
|
+
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
|
188
|
+
import org.springframework.stereotype.Service;
|
|
189
|
+
|
|
190
|
+
@RequiredArgsConstructor
|
|
191
|
+
@Service
|
|
192
|
+
public class [实体名]ServiceImpl implements I[实体名]Service {
|
|
193
|
+
|
|
194
|
+
private final [实体名]Mapper baseMapper;
|
|
195
|
+
|
|
196
|
+
private LambdaQueryWrapper<[实体名]> buildQueryWrapper([实体名]Bo bo) {
|
|
197
|
+
LambdaQueryWrapper<[实体名]> lqw = Wrappers.lambdaQuery();
|
|
198
|
+
// 根据字段类型添加查询条件
|
|
199
|
+
return lqw;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
@Override
|
|
203
|
+
public Boolean insertByBo([实体名]Bo bo) {
|
|
204
|
+
[实体名] add = MapstructUtils.convert(bo, [实体名].class);
|
|
205
|
+
boolean flag = baseMapper.insert(add) > 0;
|
|
206
|
+
if (flag) {
|
|
207
|
+
bo.setId(add.getId());
|
|
208
|
+
}
|
|
209
|
+
return flag;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
@Override
|
|
213
|
+
public Boolean updateByBo([实体名]Bo bo) {
|
|
214
|
+
[实体名] update = MapstructUtils.convert(bo, [实体名].class);
|
|
215
|
+
return baseMapper.updateById(update) > 0;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## 输出清单
|
|
223
|
+
|
|
224
|
+
```markdown
|
|
225
|
+
✅ CRUD 代码生成完成!
|
|
226
|
+
|
|
227
|
+
## 已生成文件清单
|
|
228
|
+
|
|
229
|
+
### 菜单 SQL
|
|
230
|
+
- ✅ 菜单 SQL(需手动执行)
|
|
231
|
+
|
|
232
|
+
### 后端代码 (7个文件)
|
|
233
|
+
- ✅ domain/Xxx.java (Entity)
|
|
234
|
+
- ✅ domain/bo/XxxBo.java (BO)
|
|
235
|
+
- ✅ domain/vo/XxxVo.java (VO)
|
|
236
|
+
- ✅ mapper/XxxMapper.java (Mapper)
|
|
237
|
+
- ✅ service/IXxxService.java (Service接口)
|
|
238
|
+
- ✅ service/impl/XxxServiceImpl.java (Service实现)
|
|
239
|
+
- ✅ controller/XxxController.java (Controller)
|
|
240
|
+
|
|
241
|
+
## 下一步操作
|
|
242
|
+
|
|
243
|
+
1. 执行菜单 SQL
|
|
244
|
+
2. 重启后端服务
|
|
245
|
+
3. 测试接口(Swagger: http://localhost:8080/doc.html)
|
|
246
|
+
4. 配置菜单权限
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
---
|
|
250
|
+
|
|
251
|
+
## 与 `/dev` 命令的区别
|
|
252
|
+
|
|
253
|
+
| 对比项 | `/crud` | `/dev` |
|
|
254
|
+
|--------|---------|--------|
|
|
255
|
+
| **适用场景** | 表已存在 | 从零开始 |
|
|
256
|
+
| **表结构设计** | ❌ 跳过 | ✅ 引导设计 |
|
|
257
|
+
| **菜单 SQL** | ✅ 生成 | ✅ 生成 |
|
|
258
|
+
| **代码生成** | ✅ 自动 | ✅ 自动 |
|
|
259
|
+
| **树表支持** | ✅ 支持 | ✅ 支持 |
|
|
260
|
+
| **执行速度** | ⚡ 快速 | 🐢 较慢 |
|
|
261
|
+
|
|
262
|
+
**建议**:
|
|
263
|
+
- 快速原型:使用 `/crud`
|
|
264
|
+
- 正式开发:使用 `/dev`
|
|
265
|
+
- 表已存在:使用 `/crud`
|