cc-transcript 10.5.0__tar.gz → 10.6.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.
Files changed (74) hide show
  1. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/PKG-INFO +1 -1
  2. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/filterspec.py +7 -4
  3. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/pyproject.toml +1 -1
  4. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/rust/src/protocol.rs +15 -7
  5. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/Cargo.lock +0 -0
  6. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/Cargo.toml +0 -0
  7. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/LICENSE +0 -0
  8. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/README.md +0 -0
  9. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/__init__.py +0 -0
  10. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/__main__.py +0 -0
  11. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/_parser_rs.pyi +0 -0
  12. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/activity.py +0 -0
  13. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/activity_probe.py +0 -0
  14. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/backend.py +0 -0
  15. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/builders.py +0 -0
  16. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/cli.py +0 -0
  17. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/command.py +0 -0
  18. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/context.py +0 -0
  19. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/corrections.py +0 -0
  20. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/corrections_cli.py +0 -0
  21. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/cost.py +0 -0
  22. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/decisions.py +0 -0
  23. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/discovery.py +0 -0
  24. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/disktruth.py +0 -0
  25. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/evidence.py +0 -0
  26. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/extract/__init__.py +0 -0
  27. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/extract/correct.py +0 -0
  28. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/facts.py +0 -0
  29. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/ids.py +0 -0
  30. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/judge/__init__.py +0 -0
  31. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/judge/llm.py +0 -0
  32. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/judge/similar.py +0 -0
  33. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/judge/verdicts.py +0 -0
  34. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/mining/__init__.py +0 -0
  35. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/mining/candidates.py +0 -0
  36. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/mining/confidence.py +0 -0
  37. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/mining/engine.py +0 -0
  38. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/mining/filterspec.py +0 -0
  39. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/mining/formats.py +0 -0
  40. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/mining/signals.py +0 -0
  41. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/mining/sourcekind.py +0 -0
  42. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/mining/spec.py +0 -0
  43. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/mining/store.py +0 -0
  44. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/models.py +0 -0
  45. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/notifications.py +0 -0
  46. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/parser.py +0 -0
  47. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/py.typed +0 -0
  48. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/query.py +0 -0
  49. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/render.py +0 -0
  50. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/rust.py +0 -0
  51. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/sentiment/__init__.py +0 -0
  52. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/sentiment/buckets.py +0 -0
  53. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/sentiment/engine.py +0 -0
  54. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/sentiment/lexicon.py +0 -0
  55. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/sentiment/scorespec.py +0 -0
  56. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/store.py +0 -0
  57. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/tools.py +0 -0
  58. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/rust/Cargo.toml +0 -0
  59. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/rust/build.rs +0 -0
  60. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/rust/data/afinn-en-165.tsv +0 -0
  61. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/rust/data/domain_overrides.tsv +0 -0
  62. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/rust/src/activity.rs +0 -0
  63. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/rust/src/command.rs +0 -0
  64. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/rust/src/event.rs +0 -0
  65. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/rust/src/filter.rs +0 -0
  66. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/rust/src/lexicon.rs +0 -0
  67. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/rust/src/lib.rs +0 -0
  68. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/rust/src/mining.rs +0 -0
  69. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/rust/src/model.rs +0 -0
  70. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/rust/src/parse.rs +0 -0
  71. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/rust/src/python.rs +0 -0
  72. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/rust/src/score.rs +0 -0
  73. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/rust/src/types.rs +0 -0
  74. {cc_transcript-10.5.0 → cc_transcript-10.6.0}/rust/src/value.rs +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cc-transcript
3
- Version: 10.5.0
3
+ Version: 10.6.0
4
4
  Classifier: Development Status :: 3 - Alpha
5
5
  Classifier: Environment :: Console
6
6
  Classifier: Intended Audience :: Developers
@@ -59,11 +59,14 @@ STRUCTURAL_GROUPS: tuple[tuple[str, str], ...] = (
59
59
  ("hash_banner", r"(?:###\s+[\w][\w \-]{0,30}\s+){3,}###"),
60
60
  )
61
61
 
62
- # Agent-injected banners (teammate messages, scheduled tasks, foreign agents).
62
+ # Agent-injected banners (teammate messages, scheduled tasks, foreign agents). Start-anchored
63
+ # so a mid-text mention is not a banner; the follower class replaces \b and Reminder's "i" is
64
+ # ASCII-pinned via (?-i:[Ii]) so Rust regex and Python re stay in parity across combining marks
65
+ # and dotted/dotless-I folding. Mirror any change in rust/src/protocol.rs AGENT_INJECTION_PATTERN.
63
66
  AGENT_INJECTION_GROUPS: tuple[tuple[str, str], ...] = (
64
- ("xml_tags_extra", r"<(?:teammate-message|scheduled-task)\b"),
65
- ("augment_agent", r"^# Augment Agent\b"),
66
- ("role_reminder", r"^\s*\[Role Reminder\b"),
67
+ ("xml_tags_extra", r"\A\s*<(?:teammate-message|scheduled-task)(?:[\s/>]|$)"),
68
+ ("augment_agent", r"\A\s*# Augment Agent(?:\s|$)"),
69
+ ("role_reminder", r"\A\s*\[Role Rem(?-i:[Ii])nder(?:[\s:\]]|$)"),
67
70
  )
68
71
 
69
72
  INTERRUPT_MARKER_GROUPS: tuple[tuple[str, str], ...] = (("interrupt", r"^\s*\[Request interrupted by user"),)
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "cc-transcript"
3
- version = "10.5.0"
3
+ version = "10.6.0"
4
4
  description = "Grep every Claude Code session you've ever run."
5
5
  readme = "README.md"
6
6
  license = "PolyForm-Noncommercial-1.0.0"
@@ -14,9 +14,11 @@ const INTERRUPT_MARKER_PATTERN: &str = r"^\s*\[Request interrupted by user";
14
14
 
15
15
  // Agent-injected relay banners (filterspec.py AGENT_INJECTION_GROUPS): teammate-message
16
16
  // digests, scheduled-task banners, and foreign-agent headers. The alternation mirrors
17
- // compile_groups(AGENT_INJECTION_GROUPS): `(?:p1)|(?:p2)|(?:p3)`.
18
- const AGENT_INJECTION_PATTERN: &str =
19
- r"(?:<(?:teammate-message|scheduled-task)\b)|(?:^# Augment Agent\b)|(?:^\s*\[Role Reminder\b)";
17
+ // compile_groups(AGENT_INJECTION_GROUPS): `(?:p1)|(?:p2)|(?:p3)`. Each alternative is
18
+ // start-anchored (\A\s*), the trailing \b is an explicit follower class agreeing with
19
+ // Python re across combining marks, and Reminder's "i" is ASCII-pinned via (?-i:[Ii]) so
20
+ // dotted/dotless-I case folding stays in parity.
21
+ const AGENT_INJECTION_PATTERN: &str = r"(?:\A\s*<(?:teammate-message|scheduled-task)(?:[\s/>]|$))|(?:\A\s*# Augment Agent(?:\s|$))|(?:\A\s*\[Role Rem(?-i:[Ii])nder(?:[\s:\]]|$))";
20
22
 
21
23
  /// The one interrupt-marker regex (filterspec.py INTERRUPT_MARKER_RE): the pattern
22
24
  /// compiled case-insensitively, anchored at the start of the haystack with leading
@@ -117,15 +119,21 @@ mod tests {
117
119
  assert!(is_agent_injection("<scheduled-task id='7'>run the suite</scheduled-task>"));
118
120
  assert!(is_agent_injection("[Role Reminder: You are a Coordinator."));
119
121
  assert!(is_agent_injection("# Augment Agent\nyou have these tools"));
120
- // search() is unanchored: a mid-text teammate tag still matches.
121
- assert!(is_agent_injection("as noted in the <teammate-message> above"));
122
+ // Leading whitespace before the marker is tolerated.
123
+ assert!(is_agent_injection(" <teammate-message from='mate'>ping</teammate-message>"));
122
124
  }
123
125
 
124
126
  #[test]
125
- fn agent_injection_rejects_prose_and_head_anchored_mid_text() {
127
+ fn agent_injection_rejects_prose_and_mid_text_mentions() {
126
128
  assert!(!is_agent_injection("remind me what the teammate coordinator does"));
127
- // the head-anchored role-reminder group does not match mid-text.
129
+ // Start-anchored: a relay tag mentioned mid-text is authored, not injected.
130
+ assert!(!is_agent_injection("as noted in the <teammate-message> above"));
131
+ assert!(!is_agent_injection("Why did the transcript contain <teammate-message from=a>?"));
128
132
  assert!(!is_agent_injection("we discussed the [Role Reminder] banner mid-sentence"));
133
+ // A combining mark (U+0301) after the tag name is not a portable word boundary; and
134
+ // dotless-I must not fold to ASCII "i" — Python re once matched both, Rust never did.
135
+ assert!(!is_agent_injection("<teammate-message\u{0301}>"));
136
+ assert!(!is_agent_injection("[Role Rem\u{0131}nder: dotless"));
129
137
  assert!(!is_agent_injection(""));
130
138
  }
131
139
  }
File without changes
File without changes