luv-cli 0.0.10__tar.gz → 0.0.12__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.
- {luv_cli-0.0.10 → luv_cli-0.0.12}/.failproofai/policies-config.json +3 -1
- {luv_cli-0.0.10 → luv_cli-0.0.12}/PKG-INFO +1 -1
- {luv_cli-0.0.10 → luv_cli-0.0.12}/luv/__init__.py +3 -40
- {luv_cli-0.0.10 → luv_cli-0.0.12}/pyproject.toml +1 -1
- {luv_cli-0.0.10 → luv_cli-0.0.12}/.claude/settings.json +0 -0
- {luv_cli-0.0.10 → luv_cli-0.0.12}/.github/workflows/publish.yml +0 -0
- {luv_cli-0.0.10 → luv_cli-0.0.12}/.gitignore +0 -0
- {luv_cli-0.0.10 → luv_cli-0.0.12}/LICENSE +0 -0
- {luv_cli-0.0.10 → luv_cli-0.0.12}/README.md +0 -0
|
@@ -29,7 +29,9 @@
|
|
|
29
29
|
"require-commit-before-stop",
|
|
30
30
|
"require-push-before-stop",
|
|
31
31
|
"require-pr-before-stop",
|
|
32
|
-
"require-ci-green-before-stop"
|
|
32
|
+
"require-ci-green-before-stop",
|
|
33
|
+
"prefer-package-manager",
|
|
34
|
+
"require-no-conflicts-before-stop"
|
|
33
35
|
],
|
|
34
36
|
"policyParams": {
|
|
35
37
|
"block-force-push": {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: luv-cli
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.12
|
|
4
4
|
Summary: Launch Claude Code agents on GitHub repos with isolated workspaces and optional Docker dev environments
|
|
5
5
|
Project-URL: Homepage, https://github.com/exospherehost/luv
|
|
6
6
|
Project-URL: Repository, https://github.com/exospherehost/luv
|
|
@@ -145,34 +145,6 @@ def docker_env_flags(env_vars: dict[str, str]) -> list[str]:
|
|
|
145
145
|
return flags
|
|
146
146
|
|
|
147
147
|
|
|
148
|
-
def ensure_failproofai_installed() -> None:
|
|
149
|
-
"""Install failproofai globally via npm — skip if already on PATH."""
|
|
150
|
-
if shutil.which("failproofai") is not None:
|
|
151
|
-
return
|
|
152
|
-
if shutil.which("npm") is None:
|
|
153
|
-
die("'npm' not found in PATH; install Node.js to use failproofai")
|
|
154
|
-
print("luv: installing failproofai globally...")
|
|
155
|
-
r = subprocess.run(["npm", "install", "-g", "failproofai"])
|
|
156
|
-
if r.returncode != 0:
|
|
157
|
-
die("'npm install -g failproofai' failed")
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
def run_failproofai_project(clone_dir: Path) -> None:
|
|
161
|
-
"""Run failproofai project-scope initialization in the cloned repo.
|
|
162
|
-
|
|
163
|
-
On failure, remove the clone_dir so the next run re-clones and retries
|
|
164
|
-
cleanly instead of short-circuiting to a half-initialized folder.
|
|
165
|
-
"""
|
|
166
|
-
print(f"luv: running failproofai project setup in {clone_dir.name}...")
|
|
167
|
-
r = subprocess.run(
|
|
168
|
-
["npx", "-y", "failproofai", "p", "-i", "all", "--scope", "project"],
|
|
169
|
-
cwd=str(clone_dir),
|
|
170
|
-
)
|
|
171
|
-
if r.returncode != 0:
|
|
172
|
-
shutil.rmtree(clone_dir, ignore_errors=True)
|
|
173
|
-
die("'npx -y failproofai p -i all --scope project' failed")
|
|
174
|
-
|
|
175
|
-
|
|
176
148
|
def ensure_pr_rules() -> None:
|
|
177
149
|
claude_dir = Path.home() / ".claude"
|
|
178
150
|
claude_md = claude_dir / "CLAUDE.md"
|
|
@@ -550,8 +522,6 @@ def open_existing(org: str, repo: str, number: int, prompt: str | None, nav_mode
|
|
|
550
522
|
if r.returncode != 0:
|
|
551
523
|
die(f"git checkout {branch} failed (exit {r.returncode})")
|
|
552
524
|
|
|
553
|
-
run_failproofai_project(clone_dir)
|
|
554
|
-
|
|
555
525
|
print(f"luv: ready — {clone_dir.name}, branch {branch}")
|
|
556
526
|
ensure_pr_rules()
|
|
557
527
|
if nav_mode:
|
|
@@ -594,8 +564,6 @@ def open_pr(org: str, repo: str, number: int, prompt: str | None, nav_mode: bool
|
|
|
594
564
|
if r.returncode != 0:
|
|
595
565
|
die(f"git checkout {branch} failed (exit {r.returncode})")
|
|
596
566
|
|
|
597
|
-
run_failproofai_project(clone_dir)
|
|
598
|
-
|
|
599
567
|
print(f"luv: ready — {clone_dir.name}, branch {branch}")
|
|
600
568
|
ensure_pr_rules()
|
|
601
569
|
if nav_mode:
|
|
@@ -654,8 +622,6 @@ Docker:
|
|
|
654
622
|
cmd_init()
|
|
655
623
|
return
|
|
656
624
|
|
|
657
|
-
ensure_failproofai_installed()
|
|
658
|
-
|
|
659
625
|
# luv -l <PR URL>
|
|
660
626
|
if args[0] == "-l":
|
|
661
627
|
if len(args) < 2:
|
|
@@ -718,7 +684,7 @@ Docker:
|
|
|
718
684
|
|
|
719
685
|
# 2. Get latest issue/PR number (shared counter on GitHub)
|
|
720
686
|
r = run(["gh", "api",
|
|
721
|
-
f"repos/{org}/{repo}/issues?state=all&per_page=1&sort=created&direction=desc"])
|
|
687
|
+
f"repos/{org}/{repo}/issues?state=all&filter=all&per_page=1&sort=created&direction=desc"])
|
|
722
688
|
if r.returncode != 0:
|
|
723
689
|
die(f"failed to fetch issues.\n{r.stderr.strip()}")
|
|
724
690
|
items = json.loads(r.stdout)
|
|
@@ -745,16 +711,13 @@ Docker:
|
|
|
745
711
|
if r.returncode != 0:
|
|
746
712
|
die(f"git checkout -b failed (exit {r.returncode})")
|
|
747
713
|
|
|
748
|
-
# 6.
|
|
749
|
-
run_failproofai_project(clone_dir)
|
|
750
|
-
|
|
751
|
-
# 7. Ensure PR rules in ~/.claude/CLAUDE.md and bypass-permissions default
|
|
714
|
+
# 6. Ensure PR rules in ~/.claude/CLAUDE.md and bypass-permissions default
|
|
752
715
|
ensure_pr_rules()
|
|
753
716
|
ensure_default_permission_mode()
|
|
754
717
|
|
|
755
718
|
print(f"luv: ready — {clone_dir.name}, branch {branch}")
|
|
756
719
|
|
|
757
|
-
#
|
|
720
|
+
# 7. Launch claude, resume session, or open shell (replace this process)
|
|
758
721
|
if nav_mode:
|
|
759
722
|
navigate(clone_dir, extra_env=extra_env)
|
|
760
723
|
elif resume_mode:
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "luv-cli"
|
|
7
|
-
version = "0.0.
|
|
7
|
+
version = "0.0.12"
|
|
8
8
|
description = "Launch Claude Code agents on GitHub repos with isolated workspaces and optional Docker dev environments"
|
|
9
9
|
requires-python = ">=3.10"
|
|
10
10
|
license = "MIT"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|