Skip to content

Commit c519152

Browse files
jet52claude
andcommitted
Rename project to JetBriefCheck
Rebrand from "Brief Compliance Checker" / "brief-compliance" to JetBriefCheck across all code, config, tests, CI, and documentation. Update report footer to show "Generated by JetBriefCheck v1.6.0 (2026-02-25) · Rules current as of 2026-02-17". Fix pre-existing test failures expecting v1.5.0. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 4518e0a commit c519152

12 files changed

Lines changed: 52 additions & 48 deletions

File tree

.github/workflows/build-zip.yml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ jobs:
2020
steps:
2121
- uses: actions/checkout@v4
2222

23-
- name: Build brief-compliance.zip
23+
- name: Build jetbriefcheck.zip
2424
run: |
2525
tmp=$(mktemp -d)
26-
dest="$tmp/brief-compliance"
26+
dest="$tmp/jetbriefcheck"
2727
mkdir -p "$dest"
2828
2929
# Copy the files that belong in the ZIP
@@ -39,18 +39,18 @@ jobs:
3939
find "$dest" -name '*.pyc' -delete 2>/dev/null || true
4040
4141
# Build the ZIP
42-
(cd "$tmp" && zip -r "$GITHUB_WORKSPACE/brief-compliance.zip" brief-compliance/)
42+
(cd "$tmp" && zip -r "$GITHUB_WORKSPACE/jetbriefcheck.zip" jetbriefcheck/)
4343
4444
- name: Check for changes
4545
id: diff
4646
run: |
47-
git diff --quiet brief-compliance.zip && echo "changed=false" >> "$GITHUB_OUTPUT" || echo "changed=true" >> "$GITHUB_OUTPUT"
47+
git diff --quiet jetbriefcheck.zip && echo "changed=false" >> "$GITHUB_OUTPUT" || echo "changed=true" >> "$GITHUB_OUTPUT"
4848
4949
- name: Commit updated ZIP
5050
if: steps.diff.outputs.changed == 'true'
5151
run: |
5252
git config user.name "github-actions[bot]"
5353
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
54-
git add brief-compliance.zip
55-
git commit -m "Rebuild brief-compliance.zip [automated]"
54+
git add jetbriefcheck.zip
55+
git commit -m "Rebuild jetbriefcheck.zip [automated]"
5656
git push

README.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
1-
# Appellate Brief Compliance Checker
1+
# JetBriefCheck
22

33
Checks appellate brief PDFs for compliance with the North Dakota Rules of Appellate Procedure and produces an HTML compliance report with a recommended action: **Accept**, **Correction Letter**, or **Reject**.
44

55
---
66

77
## Installing the Skill in Claude (Browser)
88

9-
This section walks you through adding the Brief Compliance Checker to your Claude account so you can use it directly in a browser chat session. No programming knowledge is required.
9+
This section walks you through adding the JetBriefCheck to your Claude account so you can use it directly in a browser chat session. No programming knowledge is required.
1010

1111
### What You Need Before You Start
1212

1313
- A Claude account at [claude.ai](https://claude.ai) with a Pro, Team, or Enterprise plan (the skill requires the ability to upload files and use projects).
14-
- The **`brief-compliance.zip`** file from this repository ([v1.5.0](https://github.com/jet52/ndsc-brief-compliance/releases/tag/v1.5.0) or later). Click on `brief-compliance.zip` in the repository file list and then click the download button.
14+
- The **`jetbriefcheck.zip`** file from this repository ([v1.5.0](https://github.com/jet52/jetbriefcheck/releases/tag/v1.5.0) or later). Click on `jetbriefcheck.zip` in the repository file list and then click the download button.
1515

1616
### Step-by-Step Installation
1717

@@ -20,7 +20,7 @@ This section walks you through adding the Brief Compliance Checker to your Claud
2020
1. Go to [claude.ai](https://claude.ai) and sign in.
2121
2. In the left sidebar, click **Projects**.
2222
3. Click **Create Project** (or the **+** button).
23-
4. Give your project a name, such as "Brief Compliance Checker".
23+
4. Give your project a name, such as "JetBriefCheck".
2424
5. Click **Create**.
2525

2626
#### 2. Upload the Skill Files to Project Knowledge
@@ -29,7 +29,7 @@ This section walks you through adding the Brief Compliance Checker to your Claud
2929
3030
1. Inside your new project, look for the **Project Knowledge** section (sometimes labeled "Project files" or accessible via a paperclip/attachment icon in the project settings).
3131
2. Click **Upload** or **Add files**.
32-
3. Select the **`brief-compliance.zip`** file you downloaded earlier.
32+
3. Select the **`jetbriefcheck.zip`** file you downloaded earlier.
3333
4. Wait for the upload to finish. Claude will unpack and index the contents automatically.
3434

3535
The ZIP file contains everything the skill needs: the analysis scripts, the bundled North Dakota appellate rules, check definitions, and the skill instructions. As of v1.5.0, `SKILL.md` is fully self-contained — all rule text and check definitions are bundled inline, so the skill works even without PyMuPDF (falling back to semantic-only checks).
@@ -57,7 +57,7 @@ If Claude does not seem to recognize the skill, double-check that:
5757

5858
The skill lives inside the project you created — it is not available in other projects or in regular (non-project) chats. Claude does not currently offer a way to install a skill globally across your entire account.
5959

60-
In practice this isn't a limitation: just **open all your brief-checking chats inside this one project**. You can create as many chats as you like within a project, and every one of them will have access to the skill files and instructions automatically. Think of the project as a dedicated "Brief Compliance Checker" app that's always ready when you need it.
60+
In practice this isn't a limitation: just **open all your brief-checking chats inside this one project**. You can create as many chats as you like within a project, and every one of them will have access to the skill files and instructions automatically. Think of the project as a dedicated "JetBriefCheck" app that's always ready when you need it.
6161

6262
---
6363

@@ -67,7 +67,7 @@ Once installed, using the skill is straightforward. You upload a PDF of an appel
6767

6868
### Checking a Brief
6969

70-
1. **Open a chat** inside your Brief Compliance Checker project.
70+
1. **Open a chat** inside your JetBriefCheck project.
7171
2. **Drag and drop** your brief PDF into the chat window (or click the attachment/paperclip icon and select the file).
7272
3. **Tell Claude what to do.** You can simply say:
7373

@@ -171,7 +171,7 @@ python deploy_skill.py
171171
# Run the web interface
172172
python app.py
173173

174-
# Or use the Claude Code skill: /brief-compliance <path-to-pdf>
174+
# Or use the Claude Code skill: /jetbriefcheck <path-to-pdf>
175175
```
176176

177177
## Architecture
@@ -185,7 +185,7 @@ python app.py
185185

186186
## Skill Deployment (Claude Code CLI)
187187

188-
The Claude Code skill (`/brief-compliance`) reads its files from `~/.claude/skills/brief-compliance/`. This repo is the single source of truth — `deploy_skill.py` copies the needed files into the skill directory.
188+
The Claude Code skill (`/jetbriefcheck`) reads its files from `~/.claude/skills/jetbriefcheck/`. This repo is the single source of truth — `deploy_skill.py` copies the needed files into the skill directory.
189189

190190
```bash
191191
python deploy_skill.py

SKILL.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
name: brief-compliance
2+
name: jetbriefcheck
33
version: 1.6.0
44
description: >-
55
Triggers when a user uploads a legal brief PDF for compliance review against the

build_zip.sh

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
#!/usr/bin/env bash
2-
# Rebuild brief-compliance.zip from the current source files.
2+
# Rebuild jetbriefcheck.zip from the current source files.
33
# Usage: ./build_zip.sh
44

55
set -euo pipefail
66

77
REPO_ROOT="$(cd "$(dirname "$0")" && pwd)"
88
TMP=$(mktemp -d)
9-
DEST="$TMP/brief-compliance"
9+
DEST="$TMP/jetbriefcheck"
1010

1111
mkdir -p "$DEST"
1212

@@ -22,7 +22,7 @@ find "$DEST" -type d -name __pycache__ -exec rm -rf {} + 2>/dev/null || true
2222
find "$DEST" -name '*.pyc' -delete 2>/dev/null || true
2323

2424
# Build ZIP
25-
(cd "$TMP" && zip -r "$REPO_ROOT/brief-compliance.zip" brief-compliance/)
25+
(cd "$TMP" && zip -r "$REPO_ROOT/jetbriefcheck.zip" jetbriefcheck/)
2626

2727
rm -rf "$TMP"
28-
echo "Built: $REPO_ROOT/brief-compliance.zip"
28+
echo "Built: $REPO_ROOT/jetbriefcheck.zip"

config.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
load_dotenv()
88

9-
UPLOAD_FOLDER = os.environ.get("UPLOAD_FOLDER", "/tmp/brief-compliance-uploads")
9+
UPLOAD_FOLDER = os.environ.get("UPLOAD_FOLDER", "/tmp/jetbriefcheck-uploads")
1010
MAX_CONTENT_LENGTH = int(os.environ.get("MAX_UPLOAD_MB", "50")) * 1024 * 1024
1111
ANTHROPIC_API_KEY = os.environ.get("ANTHROPIC_API_KEY", "")
1212
CLAUDE_MODEL = os.environ.get("CLAUDE_MODEL", "claude-sonnet-4-5-20250929")

core/report_builder.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ def build_html_report(report: ComplianceReport, version_stamp: str = "") -> str:
108108
</section>''' if report.inapplicable_checks else ''}
109109
110110
<footer>
111-
<p>Generated by the ND Supreme Court Brief Compliance Checker{f' &middot; {_esc(version_stamp)}' if version_stamp else ''}</p>
111+
<p>Generated by JetBriefCheck{f' {_esc(version_stamp)}' if version_stamp else ''}</p>
112112
<p class="engine-note">Mechanical checks: {'PyMuPDF' if report.pymupdf_used else 'Fallback (PyMuPDF unavailable — mechanical checks skipped)'}</p>
113113
</footer>
114114
</div>

core/version_check.py

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ def fetch_remote_version(timeout: float = 2.0) -> Optional[dict]:
107107

108108
try:
109109
from urllib.request import urlopen, Request
110-
req = Request(url, headers={"User-Agent": "brief-compliance-skill"})
110+
req = Request(url, headers={"User-Agent": "jetbriefcheck"})
111111
with urlopen(req, timeout=timeout) as resp:
112112
return json.loads(resp.read().decode("utf-8"))
113113
except Exception:
@@ -128,7 +128,7 @@ def check_remote_version(local_version: dict, timeout: float = 2.0) -> list[str]
128128
messages.append(
129129
f"A newer version of the brief compliance skill is available: "
130130
f"v{remote_ver} (you have v{local_ver}). "
131-
f"Visit https://github.com/jet52/ndsc-brief-compliance for updates."
131+
f"Visit https://github.com/jet52/jetbriefcheck for updates."
132132
)
133133

134134
# Check if remote has newer rule hashes (rules updated upstream)
@@ -175,21 +175,25 @@ def get_version_warnings(check_remote: bool = True, timeout: float = 2.0) -> lis
175175

176176

177177
def get_version_stamp() -> str:
178-
"""Return a short version + rule date string for report footers.
178+
"""Return a short version + build date + rule date string for report footers.
179179
180-
Example: "v1.1.0 | Rules verified 2026-02-17"
180+
Example: "v1.6.0 (2026-02-25) · Rules current as of 2026-02-17"
181181
"""
182182
local = load_local_version()
183183
if not local:
184184
return ""
185185

186-
parts = []
187-
version = local.get("version")
188-
if version:
189-
parts.append(f"v{version}")
186+
version = local.get("version", "")
187+
build_date = local.get("build_date", "")
188+
verified = local.get("rules_verified", "")
190189

191-
verified = local.get("rules_verified")
190+
if not version:
191+
return ""
192+
193+
stamp = f"v{version}"
194+
if build_date:
195+
stamp += f" ({build_date})"
192196
if verified:
193-
parts.append(f"Rules verified {verified}")
197+
stamp += f" · Rules current as of {verified}"
194198

195-
return " | ".join(parts)
199+
return stamp

deploy_skill.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
#!/usr/bin/env python3
2-
"""Deploy the brief-compliance skill to Claude Code's skills directory.
2+
"""Deploy the jetbriefcheck skill to Claude Code's skills directory.
33
44
Copies skill files (SKILL.md, scripts/, references/, core/, .venv/, requirements.txt)
5-
from this repo into ~/.claude/skills/brief-compliance/.
5+
from this repo into ~/.claude/skills/jetbriefcheck/.
66
77
Works on macOS, Linux, and Windows — no symlinks required.
88
@@ -16,7 +16,7 @@
1616
import sys
1717
from pathlib import Path
1818

19-
SKILL_NAME = "brief-compliance"
19+
SKILL_NAME = "jetbriefcheck"
2020
COPY_ITEMS = ["SKILL.md", "scripts", "references", "core", "requirements.txt", "version.json", ".venv"]
2121

2222

File renamed without changes.

tests/test_version_check.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ def test_loads_successfully(self, local_version):
7171
assert "rule_hashes" in local_version
7272

7373
def test_returns_expected_version(self, local_version):
74-
assert local_version["version"] == "1.5.0"
74+
assert local_version["version"] == "1.6.0"
7575

7676
def test_returns_empty_dict_for_missing_file(self, tmp_path, monkeypatch):
7777
monkeypatch.setattr("core.version_check.VERSION_FILE", tmp_path / "nope.json")
@@ -260,7 +260,7 @@ def test_check_remote_warns_on_newer_version(self, local_version):
260260
messages = check_remote_version(local_version)
261261
assert len(messages) >= 1
262262
assert "2.0.0" in messages[0]
263-
assert "v1.5.0" in messages[0]
263+
assert "v1.6.0" in messages[0]
264264

265265
def test_check_remote_warns_on_newer_rules(self, local_version):
266266
remote = dict(local_version)
@@ -316,9 +316,9 @@ def test_aggregates_all_warning_types(self):
316316
class TestGetVersionStamp:
317317
def test_returns_expected_format(self):
318318
stamp = get_version_stamp()
319-
assert "v1.5.0" in stamp
320-
assert "Rules verified 2026-02-17" in stamp
321-
assert "|" in stamp
319+
assert stamp.startswith("v")
320+
assert "Rules current as of" in stamp
321+
assert "·" in stamp
322322

323323
def test_returns_empty_for_missing_version_file(self, monkeypatch):
324324
monkeypatch.setattr("core.version_check.VERSION_FILE", Path("/nonexistent/version.json"))
@@ -341,10 +341,10 @@ def test_footer_contains_version_stamp(self):
341341
results=[],
342342
report_id="test123",
343343
)
344-
html = build_html_report(report, version_stamp="v1.1.0 | Rules verified 2026-02-17")
344+
html = build_html_report(report, version_stamp="v1.1.0 (2026-02-25) · Rules current as of 2026-02-17")
345345
assert "v1.1.0" in html
346-
assert "Rules verified 2026-02-17" in html
347-
assert "&middot;" in html
346+
assert "Rules current as of 2026-02-17" in html
347+
assert "JetBriefCheck" in html
348348

349349
def test_footer_omits_stamp_when_empty(self):
350350
from core.models import ComplianceReport, BriefType, Recommendation
@@ -358,4 +358,4 @@ def test_footer_omits_stamp_when_empty(self):
358358
)
359359
html = build_html_report(report, version_stamp="")
360360
assert "&middot;" not in html
361-
assert "Brief Compliance Checker</p>" in html
361+
assert "JetBriefCheck</p>" in html

0 commit comments

Comments
 (0)