vibego 0.2.52__py3-none-any.whl → 1.0.0__py3-none-any.whl
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.
Potentially problematic release.
This version of vibego might be problematic. Click here for more details.
- bot.py +1557 -1431
- logging_setup.py +25 -18
- master.py +799 -508
- project_repository.py +42 -40
- scripts/__init__.py +1 -2
- scripts/bump_version.sh +57 -55
- scripts/log_writer.py +19 -16
- scripts/master_healthcheck.py +44 -44
- scripts/models/claudecode.sh +4 -4
- scripts/models/codex.sh +1 -1
- scripts/models/common.sh +24 -6
- scripts/models/gemini.sh +2 -2
- scripts/publish.sh +50 -50
- scripts/run_bot.sh +38 -17
- scripts/start.sh +136 -116
- scripts/start_tmux_codex.sh +8 -8
- scripts/stop_all.sh +21 -21
- scripts/stop_bot.sh +31 -10
- scripts/test_deps_check.sh +32 -28
- tasks/__init__.py +1 -1
- tasks/commands.py +4 -4
- tasks/constants.py +1 -1
- tasks/fsm.py +9 -9
- tasks/models.py +7 -7
- tasks/service.py +56 -56
- vibego-1.0.0.dist-info/METADATA +236 -0
- {vibego-0.2.52.dist-info → vibego-1.0.0.dist-info}/RECORD +36 -35
- vibego-1.0.0.dist-info/licenses/LICENSE +201 -0
- vibego_cli/__init__.py +5 -4
- vibego_cli/__main__.py +1 -2
- vibego_cli/config.py +9 -9
- vibego_cli/deps.py +8 -9
- vibego_cli/main.py +63 -63
- vibego-0.2.52.dist-info/METADATA +0 -197
- {vibego-0.2.52.dist-info → vibego-1.0.0.dist-info}/WHEEL +0 -0
- {vibego-0.2.52.dist-info → vibego-1.0.0.dist-info}/entry_points.txt +0 -0
- {vibego-0.2.52.dist-info → vibego-1.0.0.dist-info}/top_level.txt +0 -0
logging_setup.py
CHANGED
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
"""
|
|
2
|
-
|
|
3
|
-
提供 master / worker 共用的 logging 配置,确保写入同一文件。
|
|
4
|
-
"""
|
|
1
|
+
"""Unified logging configuration helpers shared between master and worker."""
|
|
5
2
|
|
|
6
3
|
from __future__ import annotations
|
|
7
4
|
|
|
@@ -19,10 +16,10 @@ _CONFIGURED = False
|
|
|
19
16
|
|
|
20
17
|
|
|
21
18
|
class ContextLoggerAdapter(logging.LoggerAdapter):
|
|
22
|
-
"""
|
|
19
|
+
"""LoggerAdapter that allows per-call extra overrides."""
|
|
23
20
|
|
|
24
21
|
def process(self, msg: str, kwargs: Dict[str, Any]) -> tuple[str, Dict[str, Any]]:
|
|
25
|
-
"""
|
|
22
|
+
"""Merge default extras with user-provided extras to preserve context."""
|
|
26
23
|
|
|
27
24
|
provided: Optional[Dict[str, Any]] = kwargs.pop("extra", None)
|
|
28
25
|
merged: Dict[str, Any] = dict(self.extra)
|
|
@@ -32,18 +29,28 @@ class ContextLoggerAdapter(logging.LoggerAdapter):
|
|
|
32
29
|
return msg, kwargs
|
|
33
30
|
|
|
34
31
|
|
|
32
|
+
def _default_config_root() -> Path:
|
|
33
|
+
"""Resolve the configuration root based on environment variables and XDG conventions."""
|
|
34
|
+
|
|
35
|
+
override = os.environ.get("MASTER_CONFIG_ROOT") or os.environ.get("VIBEGO_CONFIG_DIR")
|
|
36
|
+
if override:
|
|
37
|
+
return Path(override).expanduser()
|
|
38
|
+
xdg_base = os.environ.get("XDG_CONFIG_HOME")
|
|
39
|
+
base = Path(xdg_base).expanduser() if xdg_base else Path.home() / ".config"
|
|
40
|
+
return base / "vibego"
|
|
41
|
+
|
|
42
|
+
|
|
35
43
|
def _resolve_log_file() -> Path:
|
|
36
|
-
"""
|
|
37
|
-
root = Path(__file__).resolve().parent
|
|
44
|
+
"""Determine the log file path using environment variables when available."""
|
|
38
45
|
candidate = os.environ.get("LOG_FILE")
|
|
39
|
-
|
|
40
|
-
target =
|
|
46
|
+
default_path = _default_config_root() / "logs/vibe.log"
|
|
47
|
+
target = Path(candidate).expanduser() if candidate else default_path
|
|
41
48
|
target.parent.mkdir(parents=True, exist_ok=True)
|
|
42
49
|
return target
|
|
43
50
|
|
|
44
51
|
|
|
45
52
|
def _determine_level(level_name: str) -> int:
|
|
46
|
-
"""
|
|
53
|
+
"""Resolve a log level string, falling back to INFO if unknown."""
|
|
47
54
|
|
|
48
55
|
level = getattr(logging, level_name.upper(), None)
|
|
49
56
|
if isinstance(level, int):
|
|
@@ -52,7 +59,7 @@ def _determine_level(level_name: str) -> int:
|
|
|
52
59
|
|
|
53
60
|
|
|
54
61
|
def _resolve_timezone() -> ZoneInfo:
|
|
55
|
-
"""
|
|
62
|
+
"""Parse the log timezone from environment variables, defaulting to Asia/Shanghai."""
|
|
56
63
|
|
|
57
64
|
tz_name = os.environ.get("LOG_TIMEZONE", "Asia/Shanghai").strip()
|
|
58
65
|
try:
|
|
@@ -62,15 +69,15 @@ def _resolve_timezone() -> ZoneInfo:
|
|
|
62
69
|
|
|
63
70
|
|
|
64
71
|
class _TimezoneFormatter(logging.Formatter):
|
|
65
|
-
"""
|
|
72
|
+
"""Format log timestamps using a specific timezone."""
|
|
66
73
|
|
|
67
74
|
def __init__(self, *args: Any, timezone: ZoneInfo, **kwargs: Any) -> None:
|
|
68
|
-
"""
|
|
75
|
+
"""Store the target timezone and initialise the base formatter."""
|
|
69
76
|
super().__init__(*args, **kwargs)
|
|
70
77
|
self._timezone = timezone
|
|
71
78
|
|
|
72
79
|
def formatTime(self, record: logging.LogRecord, datefmt: Optional[str] = None) -> str:
|
|
73
|
-
"""
|
|
80
|
+
"""Format the timestamp according to the configured timezone."""
|
|
74
81
|
dt = datetime.fromtimestamp(record.created, tz=self._timezone)
|
|
75
82
|
if datefmt:
|
|
76
83
|
return dt.strftime(datefmt)
|
|
@@ -78,7 +85,7 @@ class _TimezoneFormatter(logging.Formatter):
|
|
|
78
85
|
|
|
79
86
|
|
|
80
87
|
def configure_base_logger(*, level_env: str | None = None, stderr_env: str | None = None) -> logging.Logger:
|
|
81
|
-
"""
|
|
88
|
+
"""Initialise the base logger (idempotent)."""
|
|
82
89
|
global _CONFIGURED
|
|
83
90
|
logger = logging.getLogger("vibe")
|
|
84
91
|
if _CONFIGURED:
|
|
@@ -122,7 +129,7 @@ def create_logger(
|
|
|
122
129
|
level_env: str | None = None,
|
|
123
130
|
stderr_env: str | None = None,
|
|
124
131
|
) -> ContextLoggerAdapter:
|
|
125
|
-
"""
|
|
132
|
+
"""Create a LoggerAdapter with context enrichments."""
|
|
126
133
|
|
|
127
134
|
base = configure_base_logger(level_env=level_env, stderr_env=stderr_env)
|
|
128
135
|
extra = {
|
|
@@ -135,7 +142,7 @@ def create_logger(
|
|
|
135
142
|
|
|
136
143
|
|
|
137
144
|
def enrich(logger: ContextLoggerAdapter, **kwargs: Any) -> ContextLoggerAdapter:
|
|
138
|
-
"""
|
|
145
|
+
"""Return a new LoggerAdapter with extended context."""
|
|
139
146
|
|
|
140
147
|
merged: Dict[str, Any] = {**getattr(logger, "extra", {}), **kwargs}
|
|
141
148
|
return ContextLoggerAdapter(logger.logger, merged)
|