rulereceipt 0.1.77 → 0.1.78

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.
package/README.md CHANGED
@@ -17,7 +17,7 @@ npx rulereceipt
17
17
  Runs entirely on your machine. Plain `rulereceipt check` makes zero network
18
18
  calls — [Trust, privacy and licensing](#trust-privacy-and-licensing) has the full
19
19
  detail, including the three off-by-default opt-ins. Works with Claude Code today
20
- (OpenAI Codex CLI in testing); reads rules from CLAUDE.md, AGENTS.md, Cursor
20
+ (OpenAI Codex CLI supported); reads rules from CLAUDE.md, AGENTS.md, Cursor
21
21
  (`.cursor/rules`), GitHub Copilot, Windsurf, Gemini (`GEMINI.md`), Google's
22
22
  `.agents/rules`, and Claude Code memory. [Accuracy](https://rulereceipt.dev/accuracy)
23
23
  · [Known gaps](KNOWN-GAPS.md) · Source-available, not OSI — see [LICENSE](LICENSE).
@@ -77,7 +77,7 @@ Published and live on npm, actively developed.
77
77
  current project directory and your global rules file.
78
78
  2. Reads your most recent agent session transcript — Claude Code today
79
79
  (including hosted/enterprise variants under a different directory), and
80
- OpenAI Codex CLI (in testing); newest session across tools wins.
80
+ OpenAI Codex CLI (supported); newest session across tools wins.
81
81
  3. Routes each rule to the narrowest check that can actually answer it:
82
82
  - **Structured checks** read what the session really did — an actual
83
83
  git command's branch argument, actual file edits, actual file
@@ -158,7 +158,14 @@ export function runGitBranchPolicyChecks(classifications, events) {
158
158
  allTargets.push({ branch: hit.branch, command, kind: hit.kind });
159
159
  }
160
160
  }
161
- const anyGitCommand = events.some((e) => e.kind === "tool_use" && /\bgit\s/.test(JSON.stringify(e.input ?? "")));
161
+ // "Did a git command actually run?" — tested on the real command segments, not
162
+ // JSON.stringify(input). Two bugs that caused: (1) a newline before `git`
163
+ // becomes the two chars `\n` once stringified, so `\bgit` lost its word
164
+ // boundary and a `git push` on the line after a heredoc was missed entirely
165
+ // (check AND guard reported "didn't apply"); (2) a mere mention in a quote or
166
+ // heredoc body counted as a git command. leadingCommand over heredoc-stripped
167
+ // segments answers the real question: a git invocation in an executable segment.
168
+ const anyGitCommand = commands.some((c) => segments(c).some((seg) => leadingCommand(seg) === "git"));
162
169
  return classifications.map(({ rule, branchName, polarity, polarityInferred }) => {
163
170
  // No git command ran, so a git rule never had a situation to govern.
164
171
  // Calling that "followed" is how an empty session produced 2,770 green
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rulereceipt",
3
- "version": "0.1.77",
3
+ "version": "0.1.78",
4
4
  "description": "Checks whether your AI coding agent followed your rules, with evidence. Works with Claude Code (Codex in testing); reads CLAUDE.md, AGENTS.md, Cursor, Copilot and Windsurf rules.",
5
5
  "repository": {
6
6
  "type": "git",