alissa-tools-github-devloop 0.4.0__tar.gz → 0.5.0__tar.gz
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.
- {alissa_tools_github_devloop-0.4.0/src/main/alissa_tools_github_devloop.egg-info → alissa_tools_github_devloop-0.5.0}/PKG-INFO +1 -1
- {alissa_tools_github_devloop-0.4.0 → alissa_tools_github_devloop-0.5.0}/setup.py +1 -0
- {alissa_tools_github_devloop-0.4.0 → alissa_tools_github_devloop-0.5.0}/src/main/alissa/tools/github/devloop/__main__.py +13 -2
- {alissa_tools_github_devloop-0.4.0 → alissa_tools_github_devloop-0.5.0}/src/main/alissa/tools/github/devloop/config.py +20 -1
- {alissa_tools_github_devloop-0.4.0 → alissa_tools_github_devloop-0.5.0}/src/main/alissa/tools/github/devloop/loop.py +386 -51
- {alissa_tools_github_devloop-0.4.0 → alissa_tools_github_devloop-0.5.0}/src/main/alissa/tools/github/devloop/state.py +249 -0
- alissa_tools_github_devloop-0.5.0/src/main/alissa/tools/github/devloop/version +1 -0
- alissa_tools_github_devloop-0.5.0/src/main/alissa/tools/github/devloop/webui/__init__.py +28 -0
- alissa_tools_github_devloop-0.5.0/src/main/alissa/tools/github/devloop/webui/__main__.py +131 -0
- alissa_tools_github_devloop-0.5.0/src/main/alissa/tools/github/devloop/webui/auth.py +195 -0
- alissa_tools_github_devloop-0.5.0/src/main/alissa/tools/github/devloop/webui/page.py +567 -0
- alissa_tools_github_devloop-0.5.0/src/main/alissa/tools/github/devloop/webui/server.py +324 -0
- alissa_tools_github_devloop-0.5.0/src/main/alissa/tools/github/devloop/webui/sources.py +477 -0
- alissa_tools_github_devloop-0.5.0/src/main/alissa/tools/github/devloop/webui/sysinfo.py +163 -0
- {alissa_tools_github_devloop-0.4.0 → alissa_tools_github_devloop-0.5.0/src/main/alissa_tools_github_devloop.egg-info}/PKG-INFO +1 -1
- {alissa_tools_github_devloop-0.4.0 → alissa_tools_github_devloop-0.5.0}/src/main/alissa_tools_github_devloop.egg-info/SOURCES.txt +7 -0
- {alissa_tools_github_devloop-0.4.0 → alissa_tools_github_devloop-0.5.0}/src/main/alissa_tools_github_devloop.egg-info/entry_points.txt +1 -0
- alissa_tools_github_devloop-0.4.0/src/main/alissa/tools/github/devloop/version +0 -1
- {alissa_tools_github_devloop-0.4.0 → alissa_tools_github_devloop-0.5.0}/MANIFEST.in +0 -0
- {alissa_tools_github_devloop-0.4.0 → alissa_tools_github_devloop-0.5.0}/README.md +0 -0
- {alissa_tools_github_devloop-0.4.0 → alissa_tools_github_devloop-0.5.0}/requirements.txt +0 -0
- {alissa_tools_github_devloop-0.4.0 → alissa_tools_github_devloop-0.5.0}/setup.cfg +0 -0
- {alissa_tools_github_devloop-0.4.0 → alissa_tools_github_devloop-0.5.0}/src/main/alissa/tools/github/devloop/__init__.py +0 -0
- {alissa_tools_github_devloop-0.4.0 → alissa_tools_github_devloop-0.5.0}/src/main/alissa/tools/github/devloop/alissa.py +0 -0
- {alissa_tools_github_devloop-0.4.0 → alissa_tools_github_devloop-0.5.0}/src/main/alissa/tools/github/devloop/ghclient.py +0 -0
- {alissa_tools_github_devloop-0.4.0 → alissa_tools_github_devloop-0.5.0}/src/main/alissa/tools/github/devloop/proc.py +0 -0
- {alissa_tools_github_devloop-0.4.0 → alissa_tools_github_devloop-0.5.0}/src/main/alissa/tools/github/devloop/version.py +0 -0
- {alissa_tools_github_devloop-0.4.0 → alissa_tools_github_devloop-0.5.0}/src/main/alissa_tools_github_devloop.egg-info/dependency_links.txt +0 -0
- {alissa_tools_github_devloop-0.4.0 → alissa_tools_github_devloop-0.5.0}/src/main/alissa_tools_github_devloop.egg-info/top_level.txt +0 -0
|
@@ -92,6 +92,14 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
92
92
|
over.add_argument("--state-path", type=Path, metavar="PATH")
|
|
93
93
|
over.add_argument("--attempt-cap", type=int, metavar="N", help="dev attempts per issue")
|
|
94
94
|
over.add_argument("--stale-minutes", type=int, metavar="MINUTES")
|
|
95
|
+
over.add_argument(
|
|
96
|
+
"--max-sessions",
|
|
97
|
+
type=int,
|
|
98
|
+
metavar="N",
|
|
99
|
+
help="max concurrent worker sessions (develop-*/fix-*/maintain-*) "
|
|
100
|
+
"before actionable items defer to the next poll; 0 = unlimited "
|
|
101
|
+
"(the default)",
|
|
102
|
+
)
|
|
95
103
|
over.add_argument(
|
|
96
104
|
"--on-missing-origin-task",
|
|
97
105
|
choices=[ON_MISSING_WARN, ON_MISSING_SPAWN, ON_MISSING_SKIP],
|
|
@@ -170,6 +178,7 @@ def overrides_from(args: argparse.Namespace) -> dict:
|
|
|
170
178
|
"state_path": args.state_path,
|
|
171
179
|
"attempt_cap": args.attempt_cap,
|
|
172
180
|
"stale_minutes": args.stale_minutes,
|
|
181
|
+
"max_sessions": args.max_sessions,
|
|
173
182
|
"on_missing_origin_task": args.on_missing_origin_task,
|
|
174
183
|
"on_missing_hub": args.on_missing_hub,
|
|
175
184
|
"fix_rounds_enabled": args.fix_rounds_enabled,
|
|
@@ -206,9 +215,11 @@ def log_effective_config(config: Config, login: str) -> None:
|
|
|
206
215
|
log.info("reviewers: %s", ", ".join(config.reviewers) or "none")
|
|
207
216
|
log.info(
|
|
208
217
|
"poll every %ss; dry_run=%s; attempt_cap=%s; stale after %s min; "
|
|
209
|
-
"fix_rounds=%s; maintain=%s (label %r)",
|
|
218
|
+
"max_sessions=%s; fix_rounds=%s; maintain=%s (label %r)",
|
|
210
219
|
config.poll_interval, config.dry_run, config.attempt_cap,
|
|
211
|
-
config.stale_minutes,
|
|
220
|
+
config.stale_minutes,
|
|
221
|
+
config.max_sessions or "unlimited",
|
|
222
|
+
config.fix_rounds_enabled,
|
|
212
223
|
config.maintain_enabled, config.maintain_label,
|
|
213
224
|
)
|
|
214
225
|
log.debug("hub_template: %s", config.hub_template)
|
|
@@ -56,6 +56,7 @@ CONFIG_KEYS = (
|
|
|
56
56
|
"state_path",
|
|
57
57
|
"attempt_cap",
|
|
58
58
|
"stale_minutes",
|
|
59
|
+
"max_sessions",
|
|
59
60
|
"on_missing_origin_task",
|
|
60
61
|
"on_missing_hub",
|
|
61
62
|
"fix_rounds_enabled",
|
|
@@ -131,7 +132,16 @@ class Config:
|
|
|
131
132
|
state_path: Path | None = None
|
|
132
133
|
|
|
133
134
|
attempt_cap: int = 10
|
|
134
|
-
stale_minutes: int =
|
|
135
|
+
stale_minutes: int = 20
|
|
136
|
+
|
|
137
|
+
# Backpressure: the maximum number of concurrent worker sessions
|
|
138
|
+
# (`develop-*`/`fix-*`/`maintain-*`) the daemon will keep in flight at
|
|
139
|
+
# once. 0 means UNLIMITED -- today's behavior, preserved as the default so
|
|
140
|
+
# nothing changes until an operator opts in. At the cap, actionable items
|
|
141
|
+
# defer cleanly (no self-assign, no ledger row) and retry next poll; see
|
|
142
|
+
# DevWatcher.poll_once. Counted from the reaper's own `alissa tmux ls`
|
|
143
|
+
# listing, so enabling it costs no extra GitHub or CLI calls.
|
|
144
|
+
max_sessions: int = 0
|
|
135
145
|
|
|
136
146
|
on_missing_origin_task: str = ON_MISSING_WARN
|
|
137
147
|
on_missing_hub: str = HUB_SKIP
|
|
@@ -269,6 +279,14 @@ class Config:
|
|
|
269
279
|
if stale < 1:
|
|
270
280
|
raise ValueError(f"stale_minutes must be >= 1, got {stale}")
|
|
271
281
|
|
|
282
|
+
# 0 is the sentinel for "unlimited" (the default), so the floor is 0,
|
|
283
|
+
# not 1 -- a negative cap is the only invalid value.
|
|
284
|
+
max_sessions = int(raw.get("max_sessions", cls.max_sessions))
|
|
285
|
+
if max_sessions < 0:
|
|
286
|
+
raise ValueError(
|
|
287
|
+
f"max_sessions must be >= 0 (0 = unlimited), got {max_sessions}"
|
|
288
|
+
)
|
|
289
|
+
|
|
272
290
|
interval = int(raw.get("poll_interval", cls.poll_interval))
|
|
273
291
|
if interval < MIN_POLL_INTERVAL:
|
|
274
292
|
raise ValueError(
|
|
@@ -288,6 +306,7 @@ class Config:
|
|
|
288
306
|
state_path=Path(state_path).expanduser() if state_path else None,
|
|
289
307
|
attempt_cap=cap,
|
|
290
308
|
stale_minutes=stale,
|
|
309
|
+
max_sessions=max_sessions,
|
|
291
310
|
on_missing_origin_task=mode,
|
|
292
311
|
on_missing_hub=hub_mode,
|
|
293
312
|
fix_rounds_enabled=bool(
|