update gemini skills

This commit is contained in:
cexll
2025-11-22 14:56:31 +08:00
parent 3fab18a6bb
commit b5183c7711
2 changed files with 61 additions and 98 deletions

View File

@@ -7,18 +7,18 @@
Gemini CLI wrapper with cross-platform support.
Usage:
uv run gemini.py -m <model> -p "<prompt>" [workdir]
python3 gemini.py -m <model> -p "<prompt>"
./gemini.py -m gemini-3-pro-preview -p "your prompt"
uv run gemini.py "<prompt>" [workdir]
python3 gemini.py "<prompt>"
./gemini.py "your prompt"
"""
import subprocess
import sys
import os
import argparse
DEFAULT_MODEL = os.environ.get('GEMINI_MODEL', 'gemini-3-pro-preview')
DEFAULT_WORKDIR = '.'
DEFAULT_TIMEOUT = 7200 # 2 hours in seconds
TIMEOUT_MS = 7_200_000 # 固定 2 小时,毫秒
DEFAULT_TIMEOUT = TIMEOUT_MS // 1000
FORCE_KILL_DELAY = 5
@@ -32,76 +32,56 @@ def log_warn(message: str):
sys.stderr.write(f"WARN: {message}\n")
def resolve_timeout() -> int:
"""解析超时配置(秒)"""
raw = os.environ.get('GEMINI_TIMEOUT', '')
if not raw:
return DEFAULT_TIMEOUT
try:
parsed = int(raw)
if parsed <= 0:
log_warn(f"Invalid GEMINI_TIMEOUT '{raw}', falling back to {DEFAULT_TIMEOUT}s")
return DEFAULT_TIMEOUT
# 环境变量是毫秒,转换为秒
return parsed // 1000 if parsed > 10000 else parsed
except ValueError:
log_warn(f"Invalid GEMINI_TIMEOUT '{raw}', falling back to {DEFAULT_TIMEOUT}s")
return DEFAULT_TIMEOUT
def log_info(message: str):
"""输出信息到 stderr"""
sys.stderr.write(f"INFO: {message}\n")
def parse_args():
"""解析命令行参数"""
parser = argparse.ArgumentParser(
description='Gemini CLI wrapper for Claude Code integration',
formatter_class=argparse.RawDescriptionHelpFormatter
)
parser.add_argument(
'-m', '--model',
default=DEFAULT_MODEL,
help=f'Gemini model to use (default: {DEFAULT_MODEL})'
)
parser.add_argument(
'-p', '--prompt',
required=True,
help='Prompt to send to Gemini'
)
parser.add_argument(
'workdir',
nargs='?',
default=DEFAULT_WORKDIR,
help='Working directory (default: current directory)'
)
"""解析位置参数"""
if len(sys.argv) < 2:
log_error('Prompt required')
sys.exit(1)
return parser.parse_args()
return {
'prompt': sys.argv[1],
'workdir': sys.argv[2] if len(sys.argv) > 2 else DEFAULT_WORKDIR
}
def build_gemini_args(args) -> list:
"""构建 gemini CLI 参数"""
return [
'gemini',
'-m', args.model,
'-p', args.prompt
'-m', DEFAULT_MODEL,
'-p', args['prompt']
]
def main():
log_info('Script started')
args = parse_args()
log_info(f"Prompt length: {len(args['prompt'])}")
log_info(f"Working dir: {args['workdir']}")
gemini_args = build_gemini_args(args)
timeout_sec = resolve_timeout()
timeout_sec = DEFAULT_TIMEOUT
log_info(f"Timeout: {timeout_sec}s")
# 如果指定了工作目录,切换到该目录
if args.workdir != DEFAULT_WORKDIR:
if args['workdir'] != DEFAULT_WORKDIR:
try:
os.chdir(args.workdir)
os.chdir(args['workdir'])
except FileNotFoundError:
log_error(f"Working directory not found: {args.workdir}")
log_error(f"Working directory not found: {args['workdir']}")
sys.exit(1)
except PermissionError:
log_error(f"Permission denied: {args.workdir}")
log_error(f"Permission denied: {args['workdir']}")
sys.exit(1)
log_info('Changed working directory')
try:
log_info(f"Starting gemini with model {DEFAULT_MODEL}")
process = None
# 启动 gemini 子进程,直接透传 stdout 和 stderr
process = subprocess.Popen(
gemini_args,
@@ -112,11 +92,9 @@ def main():
)
# 实时输出 stdout
stdout_lines = []
for line in process.stdout:
sys.stdout.write(line)
sys.stdout.flush()
stdout_lines.append(line)
# 等待进程结束
returncode = process.wait(timeout=timeout_sec)
@@ -135,11 +113,12 @@ def main():
except subprocess.TimeoutExpired:
log_error(f'Gemini execution timeout ({timeout_sec}s)')
process.kill()
try:
process.wait(timeout=FORCE_KILL_DELAY)
except subprocess.TimeoutExpired:
pass
if process is not None:
process.kill()
try:
process.wait(timeout=FORCE_KILL_DELAY)
except subprocess.TimeoutExpired:
pass
sys.exit(124)
except FileNotFoundError:
@@ -148,11 +127,12 @@ def main():
sys.exit(127)
except KeyboardInterrupt:
process.terminate()
try:
process.wait(timeout=FORCE_KILL_DELAY)
except subprocess.TimeoutExpired:
process.kill()
if process is not None:
process.terminate()
try:
process.wait(timeout=FORCE_KILL_DELAY)
except subprocess.TimeoutExpired:
process.kill()
sys.exit(130)