tweek 0.4.0__py3-none-any.whl → 0.4.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.
- tweek/__init__.py +1 -1
- tweek/cli_core.py +23 -6
- tweek/cli_install.py +361 -91
- tweek/cli_uninstall.py +119 -36
- tweek/config/families.yaml +13 -0
- tweek/config/models.py +31 -3
- tweek/config/patterns.yaml +126 -2
- tweek/diagnostics.py +124 -1
- tweek/hooks/break_glass.py +70 -47
- tweek/hooks/overrides.py +19 -1
- tweek/hooks/post_tool_use.py +6 -2
- tweek/hooks/pre_tool_use.py +19 -2
- tweek/hooks/wrapper_post_tool_use.py +121 -0
- tweek/hooks/wrapper_pre_tool_use.py +121 -0
- tweek/integrations/openclaw.py +70 -60
- tweek/integrations/openclaw_detection.py +140 -0
- tweek/integrations/openclaw_server.py +359 -86
- tweek/logging/security_log.py +22 -0
- tweek/memory/safety.py +7 -3
- tweek/memory/store.py +31 -10
- tweek/plugins/base.py +9 -1
- tweek/plugins/detectors/openclaw.py +31 -92
- tweek/plugins/screening/heuristic_scorer.py +12 -1
- tweek/plugins/screening/local_model_reviewer.py +9 -0
- tweek/security/language.py +2 -1
- tweek/security/llm_reviewer.py +53 -24
- tweek/security/local_model.py +21 -0
- tweek/security/model_registry.py +2 -2
- tweek/security/rate_limiter.py +99 -1
- tweek/skills/guard.py +30 -7
- {tweek-0.4.0.dist-info → tweek-0.4.2.dist-info}/METADATA +1 -1
- {tweek-0.4.0.dist-info → tweek-0.4.2.dist-info}/RECORD +37 -34
- {tweek-0.4.0.dist-info → tweek-0.4.2.dist-info}/WHEEL +0 -0
- {tweek-0.4.0.dist-info → tweek-0.4.2.dist-info}/entry_points.txt +0 -0
- {tweek-0.4.0.dist-info → tweek-0.4.2.dist-info}/licenses/LICENSE +0 -0
- {tweek-0.4.0.dist-info → tweek-0.4.2.dist-info}/licenses/NOTICE +0 -0
- {tweek-0.4.0.dist-info → tweek-0.4.2.dist-info}/top_level.txt +0 -0
tweek/security/rate_limiter.py
CHANGED
|
@@ -297,6 +297,101 @@ class CircuitBreaker:
|
|
|
297
297
|
return metrics
|
|
298
298
|
|
|
299
299
|
|
|
300
|
+
class PersistentCircuitBreaker(CircuitBreaker):
|
|
301
|
+
"""Circuit breaker with JSON file persistence across process invocations.
|
|
302
|
+
|
|
303
|
+
Uses fcntl.flock for safe concurrent access. Falls back to fresh
|
|
304
|
+
in-memory state if the persistence file is corrupted or inaccessible.
|
|
305
|
+
"""
|
|
306
|
+
|
|
307
|
+
def __init__(
|
|
308
|
+
self,
|
|
309
|
+
config: Optional[CircuitBreakerConfig] = None,
|
|
310
|
+
state_path: Optional[Path] = None,
|
|
311
|
+
):
|
|
312
|
+
super().__init__(config)
|
|
313
|
+
self._state_path = state_path or (Path.home() / ".tweek" / ".circuit_breaker.json")
|
|
314
|
+
|
|
315
|
+
def _load_states(self) -> None:
|
|
316
|
+
"""Load persisted states from JSON file under flock."""
|
|
317
|
+
import fcntl
|
|
318
|
+
try:
|
|
319
|
+
self._state_path.parent.mkdir(parents=True, exist_ok=True)
|
|
320
|
+
if not self._state_path.exists():
|
|
321
|
+
return
|
|
322
|
+
with open(self._state_path, "r") as f:
|
|
323
|
+
fcntl.flock(f, fcntl.LOCK_SH)
|
|
324
|
+
try:
|
|
325
|
+
raw = json.load(f)
|
|
326
|
+
finally:
|
|
327
|
+
fcntl.flock(f, fcntl.LOCK_UN)
|
|
328
|
+
for key, data in raw.items():
|
|
329
|
+
self._states[key] = CircuitBreakerState(
|
|
330
|
+
state=CircuitState(data.get("state", "closed")),
|
|
331
|
+
failure_count=data.get("failure_count", 0),
|
|
332
|
+
success_count=data.get("success_count", 0),
|
|
333
|
+
last_failure_time=(
|
|
334
|
+
datetime.fromisoformat(data["last_failure_time"])
|
|
335
|
+
if data.get("last_failure_time") else None
|
|
336
|
+
),
|
|
337
|
+
last_state_change=(
|
|
338
|
+
datetime.fromisoformat(data["last_state_change"])
|
|
339
|
+
if data.get("last_state_change") else None
|
|
340
|
+
),
|
|
341
|
+
half_open_requests=data.get("half_open_requests", 0),
|
|
342
|
+
)
|
|
343
|
+
except (json.JSONDecodeError, OSError, KeyError, ValueError):
|
|
344
|
+
pass # Corrupt file — start fresh
|
|
345
|
+
|
|
346
|
+
def _save_states(self) -> None:
|
|
347
|
+
"""Persist current states to JSON file under flock."""
|
|
348
|
+
import fcntl
|
|
349
|
+
try:
|
|
350
|
+
self._state_path.parent.mkdir(parents=True, exist_ok=True)
|
|
351
|
+
serializable = {}
|
|
352
|
+
for key, state in self._states.items():
|
|
353
|
+
serializable[key] = {
|
|
354
|
+
"state": state.state.value,
|
|
355
|
+
"failure_count": state.failure_count,
|
|
356
|
+
"success_count": state.success_count,
|
|
357
|
+
"last_failure_time": (
|
|
358
|
+
state.last_failure_time.isoformat()
|
|
359
|
+
if state.last_failure_time else None
|
|
360
|
+
),
|
|
361
|
+
"last_state_change": (
|
|
362
|
+
state.last_state_change.isoformat()
|
|
363
|
+
if state.last_state_change else None
|
|
364
|
+
),
|
|
365
|
+
"half_open_requests": state.half_open_requests,
|
|
366
|
+
}
|
|
367
|
+
with open(self._state_path, "w") as f:
|
|
368
|
+
fcntl.flock(f, fcntl.LOCK_EX)
|
|
369
|
+
try:
|
|
370
|
+
json.dump(serializable, f)
|
|
371
|
+
finally:
|
|
372
|
+
fcntl.flock(f, fcntl.LOCK_UN)
|
|
373
|
+
except OSError:
|
|
374
|
+
pass # Best-effort persistence
|
|
375
|
+
|
|
376
|
+
def record_success(self, key: str = "default") -> CircuitState:
|
|
377
|
+
self._load_states()
|
|
378
|
+
result = super().record_success(key)
|
|
379
|
+
self._save_states()
|
|
380
|
+
return result
|
|
381
|
+
|
|
382
|
+
def record_failure(self, key: str = "default") -> CircuitState:
|
|
383
|
+
self._load_states()
|
|
384
|
+
result = super().record_failure(key)
|
|
385
|
+
self._save_states()
|
|
386
|
+
return result
|
|
387
|
+
|
|
388
|
+
def can_execute(self, key: str = "default") -> Tuple[bool, CircuitState, Optional[int]]:
|
|
389
|
+
self._load_states()
|
|
390
|
+
result = super().can_execute(key)
|
|
391
|
+
self._save_states()
|
|
392
|
+
return result
|
|
393
|
+
|
|
394
|
+
|
|
300
395
|
class RateLimiter:
|
|
301
396
|
"""
|
|
302
397
|
Rate limiter for detecting resource theft and abuse patterns.
|
|
@@ -459,11 +554,14 @@ class RateLimiter:
|
|
|
459
554
|
RateLimitResult with allowed status and any violations
|
|
460
555
|
"""
|
|
461
556
|
if not session_id:
|
|
462
|
-
# No session ID - generate unique one per
|
|
557
|
+
# No session ID - generate unique one per invocation.
|
|
558
|
+
# os.urandom(16) adds 128 bits of entropy so each call is unique
|
|
559
|
+
# even with identical PID/CWD.
|
|
463
560
|
import os as _os
|
|
464
561
|
import uuid as _uuid
|
|
465
562
|
session_id = hashlib.sha256(
|
|
466
563
|
f"tweek-{_os.getpid()}-{_os.getcwd()}-{_uuid.getnode()}".encode()
|
|
564
|
+
+ _os.urandom(16)
|
|
467
565
|
).hexdigest()[:16]
|
|
468
566
|
|
|
469
567
|
# Check circuit breaker first
|
tweek/skills/guard.py
CHANGED
|
@@ -36,19 +36,19 @@ PROTECTED_SKILL_PATHS = [
|
|
|
36
36
|
|
|
37
37
|
# Regex patterns for detecting skill-related shell commands
|
|
38
38
|
_SKILL_DIR_PATTERNS = [
|
|
39
|
-
# Moving/copying out of jail
|
|
39
|
+
# Moving/copying out of jail (expanded tool list)
|
|
40
40
|
re.compile(
|
|
41
|
-
r"(cp|mv|rsync|ln)\s+.*\.tweek/skills/(jail|chamber)",
|
|
41
|
+
r"(cp|mv|rsync|ln|install|dd|tee)\s+.*\.tweek/skills/(jail|chamber)",
|
|
42
42
|
re.IGNORECASE,
|
|
43
43
|
),
|
|
44
|
-
# Moving/copying into Claude's skill directories
|
|
44
|
+
# Moving/copying into Claude's skill directories (expanded tool list)
|
|
45
45
|
re.compile(
|
|
46
|
-
r"(cp|mv|rsync|ln)\s+.*\.claude/skills/",
|
|
46
|
+
r"(cp|mv|rsync|ln|install|dd|tee)\s+.*\.claude/skills/",
|
|
47
47
|
re.IGNORECASE,
|
|
48
48
|
),
|
|
49
|
-
# Moving/copying into OpenClaw's skill directories
|
|
49
|
+
# Moving/copying into OpenClaw's skill directories (expanded tool list)
|
|
50
50
|
re.compile(
|
|
51
|
-
r"(cp|mv|rsync|ln)\s+.*\.openclaw/workspace/skills/",
|
|
51
|
+
r"(cp|mv|rsync|ln|install|dd|tee)\s+.*\.openclaw/workspace/skills/",
|
|
52
52
|
re.IGNORECASE,
|
|
53
53
|
),
|
|
54
54
|
# Symlink attacks targeting skill directories
|
|
@@ -64,7 +64,7 @@ _SKILL_DIR_PATTERNS = [
|
|
|
64
64
|
r"ln\s+(-sf?\s+)?.*\.openclaw/workspace/skills",
|
|
65
65
|
re.IGNORECASE,
|
|
66
66
|
),
|
|
67
|
-
# Direct creation of SKILL.md via shell
|
|
67
|
+
# Direct creation of SKILL.md via shell (redirect)
|
|
68
68
|
re.compile(
|
|
69
69
|
r"(echo|cat|tee|printf)\s+.*>\s*.*\.claude/skills/.*SKILL\.md",
|
|
70
70
|
re.IGNORECASE,
|
|
@@ -73,6 +73,29 @@ _SKILL_DIR_PATTERNS = [
|
|
|
73
73
|
r"(echo|cat|tee|printf)\s+.*>\s*.*\.openclaw/workspace/skills/.*SKILL\.md",
|
|
74
74
|
re.IGNORECASE,
|
|
75
75
|
),
|
|
76
|
+
# Pipe-to-tee targeting skill directories
|
|
77
|
+
re.compile(
|
|
78
|
+
r"\|\s*tee\s+.*\.(claude|tweek|openclaw).*skills",
|
|
79
|
+
re.IGNORECASE,
|
|
80
|
+
),
|
|
81
|
+
# Interpreter one-liner writes targeting skill directories
|
|
82
|
+
re.compile(
|
|
83
|
+
r"python3?\s+-c\s+.*open\s*\(.*\.(claude|tweek|openclaw).*skills",
|
|
84
|
+
re.IGNORECASE,
|
|
85
|
+
),
|
|
86
|
+
re.compile(
|
|
87
|
+
r"perl\s+-e\s+.*open\s*\(.*\.(claude|tweek|openclaw).*skills",
|
|
88
|
+
re.IGNORECASE,
|
|
89
|
+
),
|
|
90
|
+
re.compile(
|
|
91
|
+
r"ruby\s+-e\s+.*File\.(write|open).*\.(claude|tweek|openclaw).*skills",
|
|
92
|
+
re.IGNORECASE,
|
|
93
|
+
),
|
|
94
|
+
# Shell variable substitution targeting skill directories
|
|
95
|
+
re.compile(
|
|
96
|
+
r"\$(\(|HOME|{).*\.(claude|tweek|openclaw).*skills/(jail|chamber)",
|
|
97
|
+
re.IGNORECASE,
|
|
98
|
+
),
|
|
76
99
|
]
|
|
77
100
|
|
|
78
101
|
# Patterns for detecting skill downloads
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
tweek/__init__.py,sha256=
|
|
1
|
+
tweek/__init__.py,sha256=t1KCgD0YKKLEBTFoWw7b7BKP6w2BJ7Oq1vtoXokj2R8,359
|
|
2
2
|
tweek/_keygen.py,sha256=UapwIKNSwaRWdqHoJoF3hmKuiux6aIiFGe8WVskTbI8,1286
|
|
3
3
|
tweek/audit.py,sha256=AzjIpy6Jc-WzTrda9lb3nZbyaR_SDWUxo04pObJP2MQ,8868
|
|
4
4
|
tweek/cli.py,sha256=OOZrpcrwDGbmaHxIyvBw7MoVSlEdrFNAgIwWHI56p5M,2976
|
|
5
5
|
tweek/cli_config.py,sha256=rSQTkw0JAqm6w02Ah2_hiJ-wIxhnrjTgvFuw2A39qfs,24525
|
|
6
6
|
tweek/cli_configure.py,sha256=fHm2sWxjUWFu7ulup7T-zrQ3LYiYg_1Vf-m3E5hoKd8,14603
|
|
7
|
-
tweek/cli_core.py,sha256=
|
|
7
|
+
tweek/cli_core.py,sha256=sq-zIX_rrDB3KsaLcehsYHKUsAQrqHwsAvHgxN7iHiQ,27643
|
|
8
8
|
tweek/cli_dry_run.py,sha256=8DBx3qKAZHY8VA6MsbsGBs6EyDGFxKsrtmuNaHJ22C8,14335
|
|
9
9
|
tweek/cli_helpers.py,sha256=_8aVj8e67MrP61ao7_AaEQSi9AfJQxW3eNvnjbSWT7g,16347
|
|
10
|
-
tweek/cli_install.py,sha256=
|
|
10
|
+
tweek/cli_install.py,sha256=k0apx-yJIsepaPncvKVc2OZWAbKg_ElEvKJ5L2Hb0f4,85019
|
|
11
11
|
tweek/cli_logs.py,sha256=uoJBKb85EYcIQnXxNfh15w235u9UWP1he-RlwnITWuA,10776
|
|
12
12
|
tweek/cli_mcp.py,sha256=mIKTUqTKLlVYc9054LdjfL-maiVAabPFkb_sLtoS0Gk,4787
|
|
13
13
|
tweek/cli_memory.py,sha256=Sw2TOt7RGsXBoH_q13bQjUK3WyvOy49bXefZ7atoaCY,11895
|
|
@@ -17,16 +17,16 @@ tweek/cli_protect.py,sha256=q6VhmR2vnozdybUXJEnaofx0FVZSoQq39gWVh5xmjnc,22398
|
|
|
17
17
|
tweek/cli_proxy.py,sha256=J63CuL0bg2UVHbdavDgIcqiC1C8JS0kNG8pqHEAx9mw,14289
|
|
18
18
|
tweek/cli_security.py,sha256=FpPOY0YsSY5kOc9aNy8QBi9h4fpmQ7wiX3cKtRYmLzg,8482
|
|
19
19
|
tweek/cli_skills.py,sha256=N2D184i5gajKjrLdQuWxhdiXWGiE4NGCvPahMDZvliI,9045
|
|
20
|
-
tweek/cli_uninstall.py,sha256=
|
|
20
|
+
tweek/cli_uninstall.py,sha256=H6y7QgEMw_sCCerNCJHws4XI727H4UPtiwtjx5ASL88,24619
|
|
21
21
|
tweek/cli_vault.py,sha256=j2HUurcOCOUgObfnSiMrcJQ8k3BUs1aD-YqCNZzp98I,11457
|
|
22
|
-
tweek/diagnostics.py,sha256=
|
|
22
|
+
tweek/diagnostics.py,sha256=_7CYp6kLrS4iaA_101MAWhcO-yoFtQulCmXR5vt22EQ,31996
|
|
23
23
|
tweek/licensing.py,sha256=_t_X3wgd6F0VEoLrOags-AE2k3IZXw3WhWXFuQU4UYA,11703
|
|
24
24
|
tweek/config/__init__.py,sha256=ENwimeLZd2gSJXpkASMY45hbMUDn2RwM-Zl_RMvpCbQ,772
|
|
25
25
|
tweek/config/allowed_dirs.yaml,sha256=eHmX3QEJ-LBVdwH5tQBFeTFnlRewLvRG2jLJwBh3lOY,841
|
|
26
|
-
tweek/config/families.yaml,sha256=
|
|
26
|
+
tweek/config/families.yaml,sha256=4MhJ2ikd1lK6EAbdRtjE083MX2-CD6mInvwiI7nJcIE,18796
|
|
27
27
|
tweek/config/manager.py,sha256=cs77QiAShd91RTMGxKgWUmz7qluRfQq0PogCpfxUAPA,41256
|
|
28
|
-
tweek/config/models.py,sha256=
|
|
29
|
-
tweek/config/patterns.yaml,sha256=
|
|
28
|
+
tweek/config/models.py,sha256=wrQGSZGVCJ5-ue5JdxGM0raMGYoo61btKhb_IEgWNb8,11157
|
|
29
|
+
tweek/config/patterns.yaml,sha256=N77_xaPFeXOTCCpSIGaXlGh3h_E-YA2F6xyII5ks9mU,90742
|
|
30
30
|
tweek/config/templates.py,sha256=aIGD3bDfx-J6vVBKQTNZr3IIh-O9yjcddRB8l1BxZPs,4440
|
|
31
31
|
tweek/config/tiers.yaml,sha256=gVQ80iOqirHzlJI9YEzpi6alqqmNtNNZh1nA4DQYPPs,10298
|
|
32
32
|
tweek/config/templates/config.yaml.template,sha256=i3QGrIuNjF9kqJNoMJmr62mja_8Rh9gMsc-YM6YzNSE,9120
|
|
@@ -34,18 +34,21 @@ tweek/config/templates/env.template,sha256=MCnGhE6WHU5Bk9HO6dkPfBtkur2QyK69cxzHU
|
|
|
34
34
|
tweek/config/templates/overrides.yaml.template,sha256=T9CjpPayth_1bDH-iL0mSdTTMi27GmC8cNxnBaxRNWk,4170
|
|
35
35
|
tweek/config/templates/tweek.yaml.template,sha256=jdSE7e3JeS9vOWEGWK2VCr66HLxSSFpOkNNUcZQQrkg,777
|
|
36
36
|
tweek/hooks/__init__.py,sha256=GcgDjPdhZayxmyZ4-GfBa-ISARNtt9087RsuprRq2-s,54
|
|
37
|
-
tweek/hooks/break_glass.py,sha256=
|
|
37
|
+
tweek/hooks/break_glass.py,sha256=xa7lDQXFRC08a2H5AZxh35NAGCLGCfwyXX0sdY00DVI,5506
|
|
38
38
|
tweek/hooks/feedback.py,sha256=uuA4opHYyBHC5sElBz-fr2Je3cg2DAv-aRHvETZcag0,6555
|
|
39
|
-
tweek/hooks/overrides.py,sha256=
|
|
40
|
-
tweek/hooks/post_tool_use.py,sha256=
|
|
41
|
-
tweek/hooks/pre_tool_use.py,sha256=
|
|
39
|
+
tweek/hooks/overrides.py,sha256=z2E_XVu247LmecX82bVH2S5mjCcoxaLx_zuuBgDMMUc,19526
|
|
40
|
+
tweek/hooks/post_tool_use.py,sha256=aBte4ltm2EiNo0w7K9ZMN6oWv09S9EyVqbRgUkRrRco,19328
|
|
41
|
+
tweek/hooks/pre_tool_use.py,sha256=ZGGzDj2s2YVQmn6wy0S6Gk9VRloHYaxFZXx42RJcaaU,77483
|
|
42
|
+
tweek/hooks/wrapper_post_tool_use.py,sha256=ZVIS9yXVouurqoIr8nBHPKepuMSFsHKwCh6Xv-QD6B8,3750
|
|
43
|
+
tweek/hooks/wrapper_pre_tool_use.py,sha256=7f3sTtSF2eQCM94JQ_zm8NHlcgplpKb7lxE4Z9t8qbo,3731
|
|
42
44
|
tweek/integrations/__init__.py,sha256=sl7wFwbygmnruugX4bO2EUjoXxBlCpzTKbj-1zHuUPg,78
|
|
43
|
-
tweek/integrations/openclaw.py,sha256=
|
|
44
|
-
tweek/integrations/
|
|
45
|
+
tweek/integrations/openclaw.py,sha256=4zeRHlq-W_b-jd5Hj3lHJdDkneS55aFE8A6NfpZG954,17333
|
|
46
|
+
tweek/integrations/openclaw_detection.py,sha256=QszOrZ6B8regPiWJIScbqlS7hr0tEIP2V_XS88nw3v8,4132
|
|
47
|
+
tweek/integrations/openclaw_server.py,sha256=88kUdzO58a3FKaeBRp9AfK_UBYgfFFRezZYTabkhI6Y,20997
|
|
45
48
|
tweek/logging/__init__.py,sha256=-HUdhMuDlGUwG3v2KE7xH7cClOSQ5kZIDcVO4cybVLI,228
|
|
46
49
|
tweek/logging/bundle.py,sha256=eDP0Is-hna18goaHmvexXpoNAlFhmWoMG-STTLZ19_w,11911
|
|
47
50
|
tweek/logging/json_logger.py,sha256=zXOsFAufj3MF0TboM5zSS7V8uNBDJea7YkJHR-uQgBA,4698
|
|
48
|
-
tweek/logging/security_log.py,sha256=
|
|
51
|
+
tweek/logging/security_log.py,sha256=x1xdDWhBvUi6NAGefxwLvmr6OxqFEO-_d1iBIlL7Qaw,29163
|
|
49
52
|
tweek/mcp/__init__.py,sha256=UbBOrb15XrVIcyKoNLXos2N63Xw2_EeyKnaALkjfnME,610
|
|
50
53
|
tweek/mcp/approval.py,sha256=WIFQi4ryXEFtgQyzQIshwgP5h_Th7Cxepx9NIhf2o_4,17885
|
|
51
54
|
tweek/mcp/approval_cli.py,sha256=8WtmJF7KTLmdEF5wHqENaUJUzKEQej4CjRtFey4RcGg,11281
|
|
@@ -58,12 +61,12 @@ tweek/mcp/clients/gemini.py,sha256=IFGClXc2ytrheah0Ja7vrMLVDEhORcUdQWnEo29BOVE,5
|
|
|
58
61
|
tweek/memory/__init__.py,sha256=rUe3cc-Nh-8k7kEMHzF8ao2QRt-tnI9kZQAtU8GQT5M,843
|
|
59
62
|
tweek/memory/provenance.py,sha256=zuVHRI9Krj4-YCEj-OJ_4P7xnmAHDelIyrN34446fhw,15628
|
|
60
63
|
tweek/memory/queries.py,sha256=MsUTMOai_iyVSfAmiRFcb_-E9KF2kah1WdeXOa27u-A,6712
|
|
61
|
-
tweek/memory/safety.py,sha256=
|
|
64
|
+
tweek/memory/safety.py,sha256=j9f8-sKqenSspPm9RBSLAQ1C7lnt66Stv0N8LAbello,5584
|
|
62
65
|
tweek/memory/schemas.py,sha256=WD2BIXgEYdG1rjn8MNNS1UWxc2x9bZ_7k736BkJERZg,2125
|
|
63
|
-
tweek/memory/store.py,sha256=
|
|
66
|
+
tweek/memory/store.py,sha256=MEIa-SErCWziAwT6FpnwOYPCDNOliLFp8v525jroYXc,37659
|
|
64
67
|
tweek/platform/__init__.py,sha256=jIwiwsMU297T02JOymjAdvk7QheEJxgDspueV38pJJE,3757
|
|
65
68
|
tweek/plugins/__init__.py,sha256=u2dsiOhUE2WbYArjoeyWbaaO99J0aZJU_Z_X83OzVWw,28437
|
|
66
|
-
tweek/plugins/base.py,sha256=
|
|
69
|
+
tweek/plugins/base.py,sha256=NBa769sv4Ov9DjiaHAmqIdsE2ZWfWswIvmDYNGtU3Pk,33837
|
|
67
70
|
tweek/plugins/git_discovery.py,sha256=BD73T4NMdO34ueYaldWoYPmxlbw9UOxAyAh-KFwtKH0,12259
|
|
68
71
|
tweek/plugins/git_installer.py,sha256=fkMDQ2hn-BEA2Z-_93FiylbSFF1FL1DM3Ud3R-YmYNk,15554
|
|
69
72
|
tweek/plugins/git_lockfile.py,sha256=pFxcqXGnJDefkTEykSmTA9uaiP9eTJuex0yw9xHq5yg,10821
|
|
@@ -81,7 +84,7 @@ tweek/plugins/detectors/__init__.py,sha256=v0So6W5CHPoDnQUjUW_3PPaM5pF9F4lXVcsTW
|
|
|
81
84
|
tweek/plugins/detectors/continue_dev.py,sha256=A69j4l-I5t8WG0TNMYp3ZHxLZ1qesTLIGgFdIuSCx9Y,6848
|
|
82
85
|
tweek/plugins/detectors/copilot.py,sha256=1-y0pZtgPS79hDZdZhVNtOcLcAJ5SOg0_WMUgwVZcBg,8716
|
|
83
86
|
tweek/plugins/detectors/cursor.py,sha256=6OCBQNShHAw9k2Gu93HybYYknu3WlRpxNPluor8KUJA,5805
|
|
84
|
-
tweek/plugins/detectors/openclaw.py,sha256=
|
|
87
|
+
tweek/plugins/detectors/openclaw.py,sha256=T5OBUq0fbeC1ECCsTo_3vTfT31oXdkS23RRX95X1bTE,4695
|
|
85
88
|
tweek/plugins/detectors/windsurf.py,sha256=rVzHcjlshExZSc_xrw9mpIg2hSK6aXQjWnh63owmpHg,6917
|
|
86
89
|
tweek/plugins/providers/__init__.py,sha256=CTQ8ayQsgSphN6Ao-a06KcyEdxC9RV3937VD3vmcBcw,805
|
|
87
90
|
tweek/plugins/providers/anthropic.py,sha256=c2NSG22XtgR7IG_JfSR-Tq1haMSuO3tgCbGMY6CKLCU,5732
|
|
@@ -90,9 +93,9 @@ tweek/plugins/providers/bedrock.py,sha256=ADIdO7Kpz-kNq78Mq1pQpt8rfX9OIAR3NaMGiA
|
|
|
90
93
|
tweek/plugins/providers/google.py,sha256=2wIt-lKXGb_vRcEz-_2zLHTyRdT_VFd3RYpEs_Vuxj0,6033
|
|
91
94
|
tweek/plugins/providers/openai.py,sha256=LK3_4UIgj1XBORA2MTEI88DID67_9nXY1i8rbe3Yem0,7522
|
|
92
95
|
tweek/plugins/screening/__init__.py,sha256=KijMffjrD35tbz0RBW4fb8elt36tdrNvlKBVmyeH-OA,1214
|
|
93
|
-
tweek/plugins/screening/heuristic_scorer.py,sha256=
|
|
96
|
+
tweek/plugins/screening/heuristic_scorer.py,sha256=cwFyERka_zIPxvhyv5ewoIlPpUVQFgX9zAS4HV_2cpc,17689
|
|
94
97
|
tweek/plugins/screening/llm_reviewer.py,sha256=DJv4bd5iu0aXtfUyuQ5yb6UTKnyPaY0NW43JraiE90o,5135
|
|
95
|
-
tweek/plugins/screening/local_model_reviewer.py,sha256=
|
|
98
|
+
tweek/plugins/screening/local_model_reviewer.py,sha256=m_TsI3yRjzdMO-4UCk42TLYzm83jpzW5dL2OcddsLc4,5561
|
|
96
99
|
tweek/plugins/screening/pattern_matcher.py,sha256=Zto8ZAJenZoN605LfHvoyNLzqYtJqJg02rH7GaAvPoo,8673
|
|
97
100
|
tweek/plugins/screening/rate_limiter.py,sha256=-Ekh2B5V8fqXErQjhbaR-91Dwr-p6Jrbsw3oJI5FjdY,5671
|
|
98
101
|
tweek/plugins/screening/session_analyzer.py,sha256=Zy_0R3TUG6j5_3Vp6Nor4m8daVEhrB8ybH8GGh9llt8,5061
|
|
@@ -112,12 +115,12 @@ tweek/screening/__init__.py,sha256=-QKzhN8TNqEOrooPunbQl_f6133LOXAszmiKyv8V07I,3
|
|
|
112
115
|
tweek/screening/context.py,sha256=iZeD6-Fm7dNs5wlIu15MlMbIPzeTX_Pe0DUkK5xHpQ0,3030
|
|
113
116
|
tweek/security/__init__.py,sha256=2qkoxVHzWeHdVWYHRYZG479Qpfodl6jNCQu_Wc3i1vM,901
|
|
114
117
|
tweek/security/integrity.py,sha256=QMW5Zu5PaZHC5DLwumnIq7CUOw-iqs_7AMlijLonXj4,2689
|
|
115
|
-
tweek/security/language.py,sha256=
|
|
116
|
-
tweek/security/llm_reviewer.py,sha256=
|
|
117
|
-
tweek/security/local_model.py,sha256=
|
|
118
|
+
tweek/security/language.py,sha256=HG0gvowEA5hZJ6FAOt-zNEnHA_MDeHb94VxyXqf59mw,9191
|
|
119
|
+
tweek/security/llm_reviewer.py,sha256=Y3qoYMnWBK80vQSttUpiHvUFejjN37DQsDHBkOdNQYU,54478
|
|
120
|
+
tweek/security/local_model.py,sha256=k5G096kj1KGlJqxnMiRlwYd2VapHZINohk-DcFBbo_M,11492
|
|
118
121
|
tweek/security/local_reviewer.py,sha256=0BzFx8U42KucBL14rpUbXZ8zxsu9ALHGhVosVcj0uh0,6890
|
|
119
|
-
tweek/security/model_registry.py,sha256=
|
|
120
|
-
tweek/security/rate_limiter.py,sha256=
|
|
122
|
+
tweek/security/model_registry.py,sha256=nn4P6dbr-GznhYZF4r5v_7KToZE8BRLyNqVqcp3S5t4,13795
|
|
123
|
+
tweek/security/rate_limiter.py,sha256=xMj9y0Vd_JlJbysKsa3VRmBrlGcKgzaALXmhPTa_oAM,28152
|
|
121
124
|
tweek/security/secret_scanner.py,sha256=G-bbMwsAJD197BEOnZJdn_qphS4RNPK_wpLfkpiLuFU,18774
|
|
122
125
|
tweek/security/session_analyzer.py,sha256=-Ylp583VZ_YJRkN5JZrYpaK1sVbiM6KP7ZwLBzWpiCI,24260
|
|
123
126
|
tweek/skill_template/SKILL.md,sha256=gBk_Ken77scVYeCs8imm1ASnNLDpBl-C0ufgWrrkQIA,10274
|
|
@@ -130,17 +133,17 @@ tweek/skills/__init__.py,sha256=DyTvK8n5Lb-idkJhXCVytpiZjNfWveCtNkSL6o8dxHM,1209
|
|
|
130
133
|
tweek/skills/config.py,sha256=I95wK9CBj_UiHwFuxfE8yRl7cmFiqdY0hXfF3BHP0X8,4782
|
|
131
134
|
tweek/skills/context.py,sha256=15wn3wh_m4n954tsWtf4p8kBdtFmwN18TxPzOaGfGlc,6672
|
|
132
135
|
tweek/skills/fingerprints.py,sha256=YjPsTxqotzGlyMIgfgewSoNDTLU8_-p9fY_a44LJTjU,6027
|
|
133
|
-
tweek/skills/guard.py,sha256=
|
|
136
|
+
tweek/skills/guard.py,sha256=uZ47YLG3vEVzV_WcFBVJOfkMidGdYCvucDNMhsnre-I,9175
|
|
134
137
|
tweek/skills/isolation.py,sha256=AmGwzD8xh70HL4f5aIrvYGm_ug1hHwu8tZXSAnsKiJk,16547
|
|
135
138
|
tweek/skills/scanner.py,sha256=YlH-yg3_JuwmBvmnpqA4PVfWyNBHaPSjBo6d9Ncuh8k,27574
|
|
136
139
|
tweek/vault/__init__.py,sha256=L408fjdRYL8-VqLEsyyHSO9PkBDhd_2mPIbrCu53YhM,980
|
|
137
140
|
tweek/vault/cross_platform.py,sha256=D4UvX_7OpSo8iRx5sc2OUUWQIk8JHhgeFBYk1MbyIj4,8251
|
|
138
141
|
tweek/vault/keychain.py,sha256=XL18-SUj7HwuqxLXZDViuCH81--KMu68jN9Szn1aeyw,10624
|
|
139
|
-
tweek-0.4.
|
|
140
|
-
tweek-0.4.
|
|
142
|
+
tweek-0.4.2.dist-info/licenses/LICENSE,sha256=rjoDzr1vAf0bsqZglpIyekU5aewIkCk4jHZZDvVI2BE,15269
|
|
143
|
+
tweek-0.4.2.dist-info/licenses/NOTICE,sha256=taQokyDes5UTRNEC67G-13VmqvUyTOncrrT33pCcWL0,8729
|
|
141
144
|
tweek-openclaw-plugin/node_modules/flatted/python/flatted.py,sha256=UYburBDqkySaTfSpntPCUJRxiBGcplusJM7ECX8FEgA,3860
|
|
142
|
-
tweek-0.4.
|
|
143
|
-
tweek-0.4.
|
|
144
|
-
tweek-0.4.
|
|
145
|
-
tweek-0.4.
|
|
146
|
-
tweek-0.4.
|
|
145
|
+
tweek-0.4.2.dist-info/METADATA,sha256=zxSNhepswO-jyvEwLeo6NC9I-X-_qL2Do1DUK-FKB20,11992
|
|
146
|
+
tweek-0.4.2.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
147
|
+
tweek-0.4.2.dist-info/entry_points.txt,sha256=YXThD6UiF5XQXwqW33sphsvz-Bl4Zm6pm-xq-5wcCYE,1337
|
|
148
|
+
tweek-0.4.2.dist-info/top_level.txt,sha256=jtNcCxjoGXN8IBqEVL0F3LHDrZD_B0S-4XF9-Ur7Pbc,28
|
|
149
|
+
tweek-0.4.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|