claude-jacked 0.3.0__py3-none-any.whl → 0.3.2__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-jacked
3
- Version: 0.3.0
3
+ Version: 0.3.2
4
4
  Summary: Smart reviewers, commands, and session search for Claude Code
5
5
  Project-URL: Homepage, https://github.com/jackneil/claude-jacked
6
6
  Project-URL: Repository, https://github.com/jackneil/claude-jacked
@@ -82,10 +82,10 @@ Install claude-jacked for me. Use AskUserQuestion to ask me which features I wan
82
82
  - SECURITY: Everything above + auto-approve safe bash commands (fewer permission prompts)
83
83
  - ALL: Everything
84
84
  3. Install based on my choice:
85
- - BASE: pipx install claude-jacked && jacked install
86
- - SEARCH: pipx install "claude-jacked[search]" && jacked install
87
- - SECURITY: pipx install "claude-jacked[security]" && jacked install --security
88
- - ALL: pipx install "claude-jacked[all]" && jacked install --security
85
+ - BASE: pipx install claude-jacked && jacked install --force
86
+ - SEARCH: pipx install "claude-jacked[search]" && jacked install --force
87
+ - SECURITY: pipx install "claude-jacked[security]" && jacked install --force --security
88
+ - ALL: pipx install "claude-jacked[all]" && jacked install --force --security
89
89
  4. If I chose SEARCH or ALL, help me set up Qdrant Cloud credentials
90
90
  5. Verify with: jacked --help
91
91
  ```
@@ -95,26 +95,26 @@ Install claude-jacked for me. Use AskUserQuestion to ask me which features I wan
95
95
  **Core (reviewers, commands, behavioral rules):**
96
96
  ```bash
97
97
  pipx install claude-jacked
98
- jacked install
98
+ jacked install --force
99
99
  ```
100
100
 
101
101
  **Add session search (optional):**
102
102
  ```bash
103
103
  pipx install "claude-jacked[search]"
104
- jacked install
104
+ jacked install --force
105
105
  # Then set up Qdrant Cloud credentials (see below)
106
106
  ```
107
107
 
108
108
  **Add security gatekeeper (optional):**
109
109
  ```bash
110
110
  pipx install "claude-jacked[security]"
111
- jacked install --security
111
+ jacked install --force --security
112
112
  ```
113
113
 
114
114
  **Everything:**
115
115
  ```bash
116
116
  pipx install "claude-jacked[all]"
117
- jacked install --security
117
+ jacked install --force --security
118
118
  ```
119
119
 
120
120
  ---
@@ -277,7 +277,7 @@ The security gatekeeper is opt-in. To enable it:
277
277
 
278
278
  ```bash
279
279
  pip install "claude-jacked[security]"
280
- jacked install --security
280
+ jacked install --force --security
281
281
  ```
282
282
 
283
283
  To remove just the security hook:
@@ -311,7 +311,7 @@ export ANTHROPIC_API_KEY="sk-..."
311
311
  Get audio alerts so you don't have to watch the terminal:
312
312
 
313
313
  ```bash
314
- jacked install --sounds
314
+ jacked install --force --sounds
315
315
  ```
316
316
 
317
317
  - **Notification sound** — Plays when Claude needs your input
@@ -444,10 +444,10 @@ jacked delete <session_id> # Remove from index
444
444
  jacked cleardb # Delete all your data
445
445
 
446
446
  # Setup
447
- jacked install # Install agents, commands, rules
448
- jacked install --search # Also add session indexing hook
449
- jacked install --security # Also add security gatekeeper hook
450
- jacked install --sounds # Also add sound notifications
447
+ jacked install --force # Install agents, commands, rules
448
+ jacked install --force --search # Also add session indexing hook
449
+ jacked install --force --security # Also add security gatekeeper hook
450
+ jacked install --force --sounds # Also add sound notifications
451
451
  jacked uninstall # Remove from Claude Code
452
452
  jacked uninstall --sounds # Remove only sounds
453
453
  jacked uninstall --security # Remove only security hook
@@ -603,10 +603,10 @@ Options:
603
603
 
604
604
  PHASE 3 - INSTALL:
605
605
  Based on user choice:
606
- - BASE: pipx install claude-jacked && jacked install
607
- - SEARCH: pipx install "claude-jacked[search]" && jacked install
608
- - SECURITY: pipx install "claude-jacked[security]" && jacked install --security
609
- - ALL: pipx install "claude-jacked[all]" && jacked install --security
606
+ - BASE: pipx install claude-jacked && jacked install --force
607
+ - SEARCH: pipx install "claude-jacked[search]" && jacked install --force
608
+ - SECURITY: pipx install "claude-jacked[security]" && jacked install --force --security
609
+ - ALL: pipx install "claude-jacked[all]" && jacked install --force --security
610
610
 
611
611
  PHASE 4 - POST-INSTALL (if SEARCH or ALL):
612
612
  Help user set up Qdrant Cloud:
@@ -1,5 +1,5 @@
1
- jacked/__init__.py,sha256=XTk840YXqNFn8qtUqHjvCehDWYX8Zb-Dnyq1b-BjsEQ,1276
2
- jacked/cli.py,sha256=Rl0tQezh6e1ff0t8_KlfIg6I3x67MMQCvu6J8GEpyZY,51386
1
+ jacked/__init__.py,sha256=vu1Wk8xEL7jrFIMClyMDjn3PW3VJj2glDhbTjMgMuSg,1276
2
+ jacked/cli.py,sha256=SPGNaIhxL9VTcS9qqvWNwLrVgFrjCNq-a8S1q1kAPIw,51728
3
3
  jacked/client.py,sha256=7N4GdjcG8OXfmjUfprlUOJTkyrPyqF1OBstAsplNSa8,18151
4
4
  jacked/config.py,sha256=DeC1no5rFsvlb6JaU2PzLyyhI4DaJrxrsfqVugWuC4Q,8606
5
5
  jacked/index_write_tracker.py,sha256=E1zVqyZTQdHenp_vXL-gWPvLBo18Ar703_0MI9Cst8U,8679
@@ -26,8 +26,8 @@ jacked/data/commands/techdebt.md,sha256=jSdfMN1Kvz6vmsnWw9sCMFpKA8r87e9nDHrE-qsM
26
26
  jacked/data/hooks/security_gatekeeper.py,sha256=nhiT4X-8zBhjG-i1hKgQzoXNE3NOnekTYGDlns72iXk,14083
27
27
  jacked/data/rules/jacked_behaviors.md,sha256=x1qzdj3DLmkhv5TVAdNyIpAdjBGz7IUdXSrko94LOOw,1449
28
28
  jacked/data/skills/jacked/SKILL.md,sha256=IEMp-PfWlu5rmS1R5HHblUX1CGwzno2gtO4yQ2cMAg4,5488
29
- claude_jacked-0.3.0.dist-info/METADATA,sha256=6Jf7_HXb_Ehv2l2WRCCBLwnyNpigE6luFNAnpSQ51XA,22091
30
- claude_jacked-0.3.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
31
- claude_jacked-0.3.0.dist-info/entry_points.txt,sha256=52JDhetd7OsE9iJryGrQIL3PWhum_QCeLuTeQ9-CTqQ,43
32
- claude_jacked-0.3.0.dist-info/licenses/LICENSE,sha256=m8NmsH7P5G4VH3VyHWPQUTl2weuNTh1-eaH0RbUcn3k,1066
33
- claude_jacked-0.3.0.dist-info/RECORD,,
29
+ claude_jacked-0.3.2.dist-info/METADATA,sha256=711mQ_TQsJTUADNueUQL5N6bjIXFbqYyB9ib49Ljn8c,22204
30
+ claude_jacked-0.3.2.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
31
+ claude_jacked-0.3.2.dist-info/entry_points.txt,sha256=52JDhetd7OsE9iJryGrQIL3PWhum_QCeLuTeQ9-CTqQ,43
32
+ claude_jacked-0.3.2.dist-info/licenses/LICENSE,sha256=m8NmsH7P5G4VH3VyHWPQUTl2weuNTh1-eaH0RbUcn3k,1066
33
+ claude_jacked-0.3.2.dist-info/RECORD,,
jacked/__init__.py CHANGED
@@ -8,7 +8,7 @@ Install extras for additional features:
8
8
  pip install "claude-jacked[all]" — everything
9
9
  """
10
10
 
11
- __version__ = "0.3.0"
11
+ __version__ = "0.3.2"
12
12
 
13
13
 
14
14
  def _qdrant_available() -> bool:
jacked/cli.py CHANGED
@@ -59,8 +59,8 @@ def _require_search(command_name: str) -> bool:
59
59
  except ImportError:
60
60
  console.print(f"[red]Error:[/red] '{command_name}' requires the search extra.")
61
61
  console.print('\nInstall it with:')
62
- console.print(' [bold]pip install "claude-jacked[search]"[/bold]')
63
- console.print(' [bold]pipx install "claude-jacked[search]"[/bold]')
62
+ console.print(' [bold]pip install "claude-jacked\[search]"[/bold]')
63
+ console.print(' [bold]pipx install "claude-jacked\[search]"[/bold]')
64
64
  return False
65
65
 
66
66
 
@@ -94,7 +94,7 @@ def index(session: Optional[str], repo: Optional[str]):
94
94
  else:
95
95
  console.print("[red]Error:[/red] 'index' requires the search extra.")
96
96
  console.print('\nInstall it with:')
97
- console.print(' [bold]pip install "claude-jacked[search]"[/bold]')
97
+ console.print(' [bold]pip install "claude-jacked\[search]"[/bold]')
98
98
  sys.exit(1)
99
99
 
100
100
  from jacked.indexer import SessionIndexer
@@ -753,7 +753,7 @@ def _behavioral_rules_end_marker() -> str:
753
753
  return "# end-jacked-behaviors"
754
754
 
755
755
 
756
- def _install_behavioral_rules(claude_md_path: Path):
756
+ def _install_behavioral_rules(claude_md_path: Path, force: bool = False):
757
757
  """Install behavioral rules into CLAUDE.md with marker boundaries.
758
758
 
759
759
  - Show rules before writing, require confirmation
@@ -807,7 +807,7 @@ def _install_behavioral_rules(claude_md_path: Path):
807
807
  # Version upgrade needed
808
808
  console.print("\n[bold]Behavioral rules update available:[/bold]")
809
809
  console.print(f"[dim]{rules_text}[/dim]")
810
- if not click.confirm("Update behavioral rules in CLAUDE.md?"):
810
+ if not force and sys.stdin.isatty() and not click.confirm("Update behavioral rules in CLAUDE.md?"):
811
811
  console.print("[yellow][-][/yellow] Skipped behavioral rules update")
812
812
  return
813
813
 
@@ -838,7 +838,7 @@ def _install_behavioral_rules(claude_md_path: Path):
838
838
  # Fresh install - show and confirm
839
839
  console.print("\n[bold]Proposed behavioral rules for ~/.claude/CLAUDE.md:[/bold]")
840
840
  console.print(f"[dim]{rules_text}[/dim]")
841
- if not click.confirm("Add these behavioral rules to your global CLAUDE.md?"):
841
+ if not force and sys.stdin.isatty() and not click.confirm("Add these behavioral rules to your global CLAUDE.md?"):
842
842
  console.print("[yellow][-][/yellow] Skipped behavioral rules")
843
843
  return
844
844
 
@@ -1032,7 +1032,8 @@ def _remove_security_hook(settings_path: Path) -> bool:
1032
1032
  @click.option("--search", is_flag=True, help="Install session indexing hook (requires [search] extra)")
1033
1033
  @click.option("--security", is_flag=True, help="Install security gatekeeper hook (requires [security] extra)")
1034
1034
  @click.option("--no-rules", is_flag=True, help="Skip behavioral rules in CLAUDE.md")
1035
- def install(sounds: bool, search: bool, security: bool, no_rules: bool):
1035
+ @click.option("--force", "-f", is_flag=True, help="Overwrite existing agents/commands without prompting")
1036
+ def install(sounds: bool, search: bool, security: bool, no_rules: bool, force: bool):
1036
1037
  """Auto-install skill, agents, commands, and optional hooks.
1037
1038
 
1038
1039
  Base install: agents, commands, behavioral rules, /jacked skill.
@@ -1109,7 +1110,7 @@ def install(sounds: bool, search: bool, security: bool, no_rules: bool):
1109
1110
  else:
1110
1111
  console.print(f"[yellow][-][/yellow] Stop hook already configured")
1111
1112
  else:
1112
- console.print("[dim][-][/dim] Skipping session indexing hook (install [search] extra to enable)")
1113
+ console.print("[dim][-][/dim] Skipping session indexing hook (install \[search] extra to enable)")
1113
1114
 
1114
1115
  # Copy skill file with Python path templating
1115
1116
  # Claude Code expects skills in subdirectories with SKILL.md
@@ -1140,8 +1141,8 @@ def install(sounds: bool, search: bool, security: bool, no_rules: bool):
1140
1141
  if src_content == dst_content:
1141
1142
  skipped += 1
1142
1143
  continue # Same content, skip silently
1143
- # Different content - ask before overwriting
1144
- if not click.confirm(f"Agent '{agent_file.name}' exists with different content. Overwrite?"):
1144
+ # Different content - ask before overwriting (unless --force)
1145
+ if not force and sys.stdin.isatty() and not click.confirm(f"Agent '{agent_file.name}' exists with different content. Overwrite?"):
1145
1146
  console.print(f"[yellow][-][/yellow] Skipped {agent_file.name}")
1146
1147
  continue
1147
1148
  shutil.copy(agent_file, dst_file)
@@ -1168,8 +1169,8 @@ def install(sounds: bool, search: bool, security: bool, no_rules: bool):
1168
1169
  if src_content == dst_content:
1169
1170
  skipped += 1
1170
1171
  continue # Same content, skip silently
1171
- # Different content - ask before overwriting
1172
- if not click.confirm(f"Command '{cmd_file.name}' exists with different content. Overwrite?"):
1172
+ # Different content - ask before overwriting (unless --force)
1173
+ if not force and sys.stdin.isatty() and not click.confirm(f"Command '{cmd_file.name}' exists with different content. Overwrite?"):
1173
1174
  console.print(f"[yellow][-][/yellow] Skipped {cmd_file.name}")
1174
1175
  continue
1175
1176
  shutil.copy(cmd_file, dst_file)
@@ -1194,7 +1195,7 @@ def install(sounds: bool, search: bool, security: bool, no_rules: bool):
1194
1195
  # Install behavioral rules in CLAUDE.md (default on, --no-rules to skip)
1195
1196
  if not no_rules:
1196
1197
  claude_md_path = home / ".claude" / "CLAUDE.md"
1197
- _install_behavioral_rules(claude_md_path)
1198
+ _install_behavioral_rules(claude_md_path, force=force)
1198
1199
 
1199
1200
  console.print("\n[bold]Installation complete![/bold]")
1200
1201
  console.print("\n[yellow]IMPORTANT: Restart Claude Code for new commands to take effect![/yellow]")
@@ -1223,9 +1224,9 @@ def install(sounds: bool, search: bool, security: bool, no_rules: bool):
1223
1224
  console.print(" 4. Use '/jacked <description>' to search past sessions")
1224
1225
  else:
1225
1226
  console.print("\nOptional extras:")
1226
- console.print(' pip install "claude-jacked[search]" # Session search via Qdrant')
1227
- console.print(' pip install "claude-jacked[security]" # Auto-approve safe Bash commands')
1228
- console.print(' pip install "claude-jacked[all]" # Everything')
1227
+ console.print(' pip install "claude-jacked\[search]" # Session search via Qdrant')
1228
+ console.print(' pip install "claude-jacked\[security]" # Auto-approve safe Bash commands')
1229
+ console.print(' pip install "claude-jacked\[all]" # Everything')
1229
1230
 
1230
1231
 
1231
1232
  @main.command()