@caddis/cli 0.4.58 → 0.4.59

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,5 +1,5 @@
1
1
  {
2
2
  "name": "caddis",
3
- "version": "1.3.144",
3
+ "version": "1.3.145",
4
4
  "description": "caddis — agent-agnostic dev harness as an Antigravity (agy) plugin: TDD skills + commands, single-sourced with the Claude Code plugin."
5
5
  }
@@ -148,12 +148,19 @@ OUTPUT_MASKS: list[tuple[re.Pattern, str]] = [
148
148
  (re.compile(r"\bgh[pousr]_[A-Za-z0-9]{36,}\b"), "***"), # secret_filter github-token
149
149
  (re.compile(r"\bxox[abprs]-[A-Za-z0-9-]{10,}\b"), "***"), # secret_filter slack-token
150
150
  (re.compile(r"\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b"), "***"), # secret_filter jwt
151
- # secret_filter assignment, widened: a quoted value may hold spaces (a passphrase of several words).
152
- (re.compile(r"(?i)([A-Za-z0-9_]*(?:password|passwd|secret|api[_-]?key|token)[A-Za-z0-9_]*\s*[:=]\s*)"
151
+ # secret_filter assignment, widened: a quoted value may hold spaces (a passphrase of several words). A match
152
+ # starts only at the start of a word: a match inside a word always has one from the word start too, and without
153
+ # the lookbehind each character of a long word started a new scan (quadratic: 50 KB of one word took 64 s).
154
+ (re.compile(r"(?i)(?<![A-Za-z0-9_])"
155
+ r"([A-Za-z0-9_]*(?:password|passwd|secret|api[_-]?key|token)[A-Za-z0-9_]*\s*[:=]\s*)"
153
156
  r"(['\"])[^'\"\n]{8,}\2"), r"\1\2***\2"),
154
157
  (re.compile(r"(?im)^(\s*(?:export\s+)?[A-Za-z0-9_]*(?:PASSWORD|PASSWD|SECRET|API_KEY|APIKEY|TOKEN|PRIVATE_KEY)"
155
158
  r"[A-Za-z0-9_]*\s*=\s*)[^\s'\"#]{8,}"), r"\1***"), # secret_filter env-assignment
156
- (re.compile(r"\b([A-Za-z][A-Za-z0-9+.-]*://)[^/\s:@]+:[^/\s@]+@"), r"\1***@"), # URL credentials
159
+ # URL credentials. The scheme starts at a letter after a word boundary. Every such letter in one run of scheme
160
+ # characters reaches the same `://`, so only the first one is tried: group 1 skips, possessively, the run's
161
+ # digits, `+.-` and letters that follow a word character. Without that, `a.a.a.a...` was quadratic.
162
+ (re.compile(r"(?<![A-Za-z0-9+.-])((?:[0-9+.-]|(?<=\w)[A-Za-z])*+)([A-Za-z][A-Za-z0-9+.-]*://)"
163
+ r"[^/\s:@]+:[^/\s@]+@"), r"\1\2***@"),
157
164
  # Absolute paths, which can name a user or a host. A path may hold spaces, so each one runs to the end of the
158
165
  # line or a quote; a Windows drive or UNC path also stops at `<`, `>` or `|` (never part of a Windows path).
159
166
  (re.compile(r"(?<![A-Za-z0-9])[A-Za-z]:[\\/][^\r\n'\"<>|]*"), "<path>"), # a Windows drive path
@@ -101,11 +101,15 @@ SECRET_RULES: list[tuple[str, re.Pattern]] = [
101
101
  ("npm-token", re.compile(r"\bnpm_[A-Za-z0-9]{36}\b")),
102
102
  ("slack-webhook", re.compile(r"https://hooks\.slack\.com/services/[A-Za-z0-9_/]+")),
103
103
  # user:password@host in a URL. `value` is the password; placeholders are exempted in code.
104
+ # Both rules below start a match only at the start of a run of the characters their first part takes (the
105
+ # lookbehind). A match that starts inside the run finds the same value from the run start too, and without the
106
+ # lookbehind each character of a long word started a new scan: quadratic, minutes on one long line.
104
107
  ("url-credentials", re.compile(
105
- r"[a-z][a-z0-9+.-]*://[^/\s:@]*:(?P<value>[^/\s@]{3,})@", re.I)),
108
+ r"(?<![a-z0-9+.-])[0-9+.-]*[a-z][a-z0-9+.-]*://[^/\s:@]*:(?P<value>[^/\s@]{3,})@", re.I)),
106
109
  # `name = "v"`, `name: "v"`, and a quoted key: `"name": "v"`, `'name': 'v'`.
107
110
  ("assignment", re.compile(
108
- r"(?i)[A-Za-z0-9_]*(password|passwd|secret|api[_-]?key|token)[A-Za-z0-9_]*['\"]?\s*[:=]\s*['\"](?P<value>[^'\"\s]{8,})['\"]"
111
+ r"(?i)(?<![A-Za-z0-9_])[A-Za-z0-9_]*(password|passwd|secret|api[_-]?key|token)[A-Za-z0-9_]*['\"]?\s*[:=]\s*"
112
+ r"['\"](?P<value>[^'\"\s]{8,})['\"]"
109
113
  )),
110
114
  ("env-assignment", re.compile(
111
115
  r"^\s*(?:export\s+)?[A-Za-z0-9_]*(?:PASSWORD|PASSWD|SECRET|API_KEY|APIKEY|TOKEN|PRIVATE_KEY)"
@@ -1,7 +1,7 @@
1
1
  {
2
- "poolVersion": "1.3.144",
2
+ "poolVersion": "1.3.145",
3
3
  "bundles": {
4
- "antigravity-plugin": "1.3.144",
4
+ "antigravity-plugin": "1.3.145",
5
5
  "antigravity-plugin-extras": "1.3.45",
6
6
  "codex": "unknown"
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@caddis/cli",
3
- "version": "0.4.58",
3
+ "version": "0.4.59",
4
4
  "description": "Install, update and diagnose the caddis dev harness across every coding agent you use (Claude Code, agy/Antigravity, and more).",
5
5
  "keywords": [
6
6
  "caddis",