diff --git a/package.json b/package.json
index cb87ef1a..8824bd8c 100644
--- a/package.json
+++ b/package.json
@@ -3,7 +3,8 @@
"version": "1.0.0",
"description": "PR Readiness Checker - Track and monitor GitHub Pull Request status",
"scripts": {
- "dev": "wrangler dev",
+ "fingerprint": "node scripts/fingerprint.js",
+ "dev": "npm run fingerprint && wrangler dev",
"deploy": "wrangler deploy",
"db:create": "wrangler d1 create pr_tracker",
"db:migrate:local": "wrangler d1 migrations apply pr_tracker --local",
diff --git a/public/asset-manifest.json b/public/asset-manifest.json
new file mode 100644
index 00000000..ce531fb2
--- /dev/null
+++ b/public/asset-manifest.json
@@ -0,0 +1,5 @@
+{
+ "error-reporter.js": "error-reporter.1b9dc33f.js",
+ "how-it-works.js": "how-it-works.3ebd3397.js",
+ "theme.js": "theme.196e3e21.js"
+}
diff --git a/public/diagnostics.html b/public/diagnostics.html
index 1f294302..5a8fca38 100644
--- a/public/diagnostics.html
+++ b/public/diagnostics.html
@@ -23,7 +23,7 @@
}
})();
-
+
GitHub
-
@@ -168,8 +168,8 @@
0) {
+ var primary = errors[0];
+ reportError(
+ primary.name || 'ConsoleError',
+ (primary.name || 'ConsoleError') + ': ' + (primary.message || ''),
+ primary.stack || msg,
+ {
+ url: getPageUrl(),
+ source: 'console.error:unhandled',
+ report_channel: 'dedupe-candidate',
+ error_count: String(errors.length),
+ }
+ );
+ } else if (msg) {
+ reportError('ConsoleError', msg, msg, {
+ url: getPageUrl(),
+ source: 'console.error',
+ });
+ }
+ } catch (e) {}
+
+ return original.apply(console, arguments);
+ };
+ })();
+})();
diff --git a/public/how-it-works.3ebd3397.js b/public/how-it-works.3ebd3397.js
new file mode 100644
index 00000000..43ad62aa
--- /dev/null
+++ b/public/how-it-works.3ebd3397.js
@@ -0,0 +1,123 @@
+// Interactive Score Calculator for BLT-Leaf "How It Works" Page
+
+function calculateScore() {
+ // Get input values
+ const ciPassed = parseInt(document.getElementById('ciPassed').value);
+ const ciFailed = parseInt(document.getElementById('ciFailed').value);
+ const approvals = parseInt(document.getElementById('approvals').value);
+ const changesRequested = parseInt(document.getElementById('changesRequested').value);
+ const conversations = parseInt(document.getElementById('conversations').value);
+ const responseRate = parseInt(document.getElementById('responseRate').value);
+
+ // Update displayed values
+ document.getElementById('ciPassedValue').textContent = ciPassed;
+ document.getElementById('ciFailedValue').textContent = ciFailed;
+ document.getElementById('approvalsValue').textContent = approvals;
+ document.getElementById('changesRequestedValue').textContent = changesRequested;
+ document.getElementById('conversationsValue').textContent = conversations;
+ document.getElementById('responseRateValue').textContent = responseRate + '%';
+
+ // Calculate CI Score
+ const totalChecks = ciPassed + ciFailed;
+ let ciScore = 0;
+ let ciConfidence = 'Low';
+ let ciConfidenceBadge = 'badge-low';
+
+ if (totalChecks > 0) {
+ ciScore = (ciPassed / totalChecks) * 100;
+ ciConfidence = 'High';
+ ciConfidenceBadge = 'badge-high';
+ } else {
+ // No checks run - low confidence, assume failure
+ ciScore = 0;
+ ciConfidence = 'Low';
+ ciConfidenceBadge = 'badge-low';
+ }
+
+ // Calculate Review Score
+ let reviewScore = 0;
+ let reviewConfidence = 'Medium';
+ let reviewConfidenceBadge = 'badge-medium';
+
+ if (approvals > 0 && changesRequested === 0) {
+ reviewScore = 100;
+ reviewConfidence = 'High';
+ reviewConfidenceBadge = 'badge-high';
+ } else if (approvals > 0 && changesRequested > 0) {
+ reviewScore = 50;
+ reviewConfidence = 'Medium';
+ reviewConfidenceBadge = 'badge-medium';
+ } else if (approvals === 0 && changesRequested > 0) {
+ reviewScore = 0;
+ reviewConfidence = 'High';
+ reviewConfidenceBadge = 'badge-high';
+ } else {
+ // No approvals, no changes requested
+ reviewScore = 0;
+ reviewConfidence = 'Medium';
+ reviewConfidenceBadge = 'badge-medium';
+ }
+
+ // Response Score (direct mapping)
+ const responseScore = responseRate;
+ let responseConfidence = 'High';
+ let responseConfidenceBadge = 'badge-high';
+
+ if (responseRate < 50) {
+ responseConfidence = 'Low';
+ responseConfidenceBadge = 'badge-low';
+ } else if (responseRate < 80) {
+ responseConfidence = 'Medium';
+ responseConfidenceBadge = 'badge-medium';
+ }
+
+ // Calculate Overall Score
+ // Formula: (CI × 0.4) + (Review × 0.4) + (Response × 0.2) - (3 × conversations)
+ let overallScore = (ciScore * 0.4) + (reviewScore * 0.4) + (responseScore * 0.2);
+
+ // Deduct 3 points per unresolved conversation
+ overallScore = Math.max(0, overallScore - (conversations * 3));
+
+ // Determine overall status
+ let overallStatus = '';
+ let overallColor = '';
+
+ if (overallScore >= 80) {
+ overallStatus = '✅ Merge Ready';
+ overallColor = 'text-green-600 dark:text-green-400';
+ } else if (overallScore >= 60) {
+ overallStatus = '⚠️ Needs Attention';
+ overallColor = 'text-yellow-600 dark:text-yellow-400';
+ } else {
+ overallStatus = '❌ Not Ready';
+ overallColor = 'text-red-600 dark:text-red-400';
+ }
+
+ // Update UI
+ const overallScoreElement = document.getElementById('overallScore');
+ overallScoreElement.textContent = Math.round(overallScore) + '%';
+ overallScoreElement.className = overallColor + ' text-5xl font-bold mb-2';
+
+ document.getElementById('overallStatus').textContent = overallStatus;
+
+ document.getElementById('ciScoreDisplay').innerHTML =
+ `${Math.round(ciScore)}% ${ciConfidence}`;
+
+ document.getElementById('reviewScoreDisplay').innerHTML =
+ `${Math.round(reviewScore)}% ${reviewConfidence}`;
+
+ document.getElementById('responseScoreDisplay').innerHTML =
+ `${Math.round(responseScore)}% ${responseConfidence}`;
+}
+
+// Initialize calculator on page load
+document.addEventListener('DOMContentLoaded', function () {
+ // Attach event listeners to all range inputs
+ const rangeInputs = document.querySelectorAll('input[type="range"]');
+ rangeInputs.forEach(input => {
+ input.addEventListener('input', calculateScore);
+ });
+
+ // Initial calculation
+ calculateScore();
+});
diff --git a/public/how-it-works.html b/public/how-it-works.html
index 6f5261f6..e3f3690a 100644
--- a/public/how-it-works.html
+++ b/public/how-it-works.html
@@ -8,22 +8,7 @@
How It Works — BLT-Leaf
-
-
+
GitHub
-
@@ -1098,53 +1083,12 @@
-
-
+
-
+