@in-the-loop-labs/pair-review 2.6.3 → 3.0.0
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/.pi/extensions/task/index.ts +1 -1
- package/.pi/skills/review-roulette/SKILL.md +1 -1
- package/LICENSE +201 -674
- package/README.md +2 -2
- package/bin/pair-review.js +1 -1
- package/package.json +2 -2
- package/plugin/.claude-plugin/plugin.json +2 -2
- package/plugin-code-critic/.claude-plugin/plugin.json +2 -2
- package/plugin-code-critic/skills/analyze/scripts/git-diff-lines +1 -1
- package/public/css/ai-summary-modal.css +1 -1
- package/public/css/pr.css +194 -0
- package/public/index.html +168 -3
- package/public/js/components/AIPanel.js +17 -3
- package/public/js/components/AISummaryModal.js +1 -1
- package/public/js/components/AdvancedConfigTab.js +1 -1
- package/public/js/components/AnalysisConfigModal.js +1 -1
- package/public/js/components/ChatPanel.js +42 -7
- package/public/js/components/ConfirmDialog.js +22 -3
- package/public/js/components/CouncilProgressModal.js +14 -1
- package/public/js/components/DiffOptionsDropdown.js +411 -24
- package/public/js/components/EmojiPicker.js +1 -1
- package/public/js/components/KeyboardShortcuts.js +1 -1
- package/public/js/components/PanelGroup.js +1 -1
- package/public/js/components/PreviewModal.js +1 -1
- package/public/js/components/ReviewModal.js +1 -1
- package/public/js/components/SplitButton.js +1 -1
- package/public/js/components/StatusIndicator.js +1 -1
- package/public/js/components/SuggestionNavigator.js +13 -6
- package/public/js/components/TabTitle.js +96 -0
- package/public/js/components/TextInputDialog.js +1 -1
- package/public/js/components/TimeoutSelect.js +1 -1
- package/public/js/components/Toast.js +7 -1
- package/public/js/components/VoiceCentricConfigTab.js +1 -1
- package/public/js/index.js +649 -44
- package/public/js/local.js +570 -77
- package/public/js/modules/analysis-history.js +4 -3
- package/public/js/modules/comment-manager.js +6 -1
- package/public/js/modules/comment-minimizer.js +304 -0
- package/public/js/modules/diff-context.js +1 -1
- package/public/js/modules/diff-renderer.js +1 -1
- package/public/js/modules/file-comment-manager.js +1 -1
- package/public/js/modules/file-list-merger.js +1 -1
- package/public/js/modules/gap-coordinates.js +1 -1
- package/public/js/modules/hunk-parser.js +1 -1
- package/public/js/modules/line-tracker.js +1 -1
- package/public/js/modules/panel-resizer.js +1 -1
- package/public/js/modules/storage-cleanup.js +1 -1
- package/public/js/modules/suggestion-manager.js +1 -1
- package/public/js/pr.js +83 -7
- package/public/js/repo-settings.js +1 -1
- package/public/js/utils/category-emoji.js +1 -1
- package/public/js/utils/file-order.js +1 -1
- package/public/js/utils/markdown.js +1 -1
- package/public/js/utils/suggestion-ui.js +1 -1
- package/public/js/utils/tier-icons.js +1 -1
- package/public/js/utils/time.js +1 -1
- package/public/js/ws-client.js +1 -1
- package/public/local.html +14 -0
- package/public/pr.html +3 -0
- package/public/setup.html +1 -1
- package/src/ai/analyzer.js +18 -12
- package/src/ai/claude-cli.js +1 -1
- package/src/ai/claude-provider.js +1 -1
- package/src/ai/codex-provider.js +1 -1
- package/src/ai/copilot-provider.js +1 -1
- package/src/ai/cursor-agent-provider.js +1 -1
- package/src/ai/gemini-provider.js +1 -1
- package/src/ai/index.js +1 -1
- package/src/ai/opencode-provider.js +1 -1
- package/src/ai/pi-provider.js +1 -1
- package/src/ai/prompts/baseline/consolidation/balanced.js +1 -1
- package/src/ai/prompts/baseline/consolidation/fast.js +1 -1
- package/src/ai/prompts/baseline/consolidation/thorough.js +1 -1
- package/src/ai/prompts/baseline/level1/balanced.js +1 -1
- package/src/ai/prompts/baseline/level1/fast.js +1 -1
- package/src/ai/prompts/baseline/level1/thorough.js +1 -1
- package/src/ai/prompts/baseline/level2/balanced.js +1 -1
- package/src/ai/prompts/baseline/level2/fast.js +1 -1
- package/src/ai/prompts/baseline/level2/thorough.js +1 -1
- package/src/ai/prompts/baseline/level3/balanced.js +1 -1
- package/src/ai/prompts/baseline/level3/fast.js +1 -1
- package/src/ai/prompts/baseline/level3/thorough.js +1 -1
- package/src/ai/prompts/baseline/orchestration/balanced.js +1 -1
- package/src/ai/prompts/baseline/orchestration/fast.js +1 -1
- package/src/ai/prompts/baseline/orchestration/thorough.js +1 -1
- package/src/ai/prompts/config.js +1 -1
- package/src/ai/prompts/index.js +1 -1
- package/src/ai/prompts/line-number-guidance.js +1 -1
- package/src/ai/prompts/render-for-skill.js +1 -1
- package/src/ai/prompts/shared/diff-instructions.js +1 -1
- package/src/ai/prompts/shared/output-schema.js +1 -1
- package/src/ai/prompts/shared/valid-files.js +1 -1
- package/src/ai/prompts/sparse-checkout-guidance.js +1 -1
- package/src/ai/provider-availability.js +1 -1
- package/src/ai/provider.js +1 -1
- package/src/ai/stream-parser.js +1 -1
- package/src/chat/acp-bridge.js +1 -1
- package/src/chat/api-reference.js +1 -1
- package/src/chat/chat-providers.js +1 -1
- package/src/chat/claude-code-bridge.js +1 -1
- package/src/chat/codex-bridge.js +1 -1
- package/src/chat/pi-bridge.js +1 -1
- package/src/chat/prompt-builder.js +1 -1
- package/src/chat/session-manager.js +1 -1
- package/src/config.js +3 -1
- package/src/database.js +591 -40
- package/src/events/review-events.js +1 -1
- package/src/git/base-branch.js +173 -0
- package/src/git/gitattributes.js +1 -1
- package/src/git/sha-abbrev.js +35 -0
- package/src/git/worktree.js +1 -1
- package/src/github/client.js +33 -2
- package/src/github/parser.js +1 -1
- package/src/hooks/hook-runner.js +100 -0
- package/src/hooks/payloads.js +212 -0
- package/src/local-review.js +469 -130
- package/src/local-scope.js +58 -0
- package/src/main.js +56 -5
- package/src/mcp-stdio.js +1 -1
- package/src/protocol-handler.js +1 -1
- package/src/routes/analyses.js +74 -11
- package/src/routes/chat.js +34 -1
- package/src/routes/config.js +2 -1
- package/src/routes/context-files.js +1 -1
- package/src/routes/councils.js +1 -1
- package/src/routes/github-collections.js +1 -1
- package/src/routes/local.js +735 -69
- package/src/routes/mcp.js +21 -11
- package/src/routes/pr.js +91 -13
- package/src/routes/reviews.js +1 -1
- package/src/routes/setup.js +2 -1
- package/src/routes/shared.js +1 -1
- package/src/routes/worktrees.js +213 -149
- package/src/server.js +31 -1
- package/src/setup/local-setup.js +47 -6
- package/src/setup/pr-setup.js +29 -6
- package/src/utils/auto-context.js +1 -1
- package/src/utils/category-emoji.js +1 -1
- package/src/utils/comment-formatter.js +1 -1
- package/src/utils/diff-annotator.js +1 -1
- package/src/utils/diff-file-list.js +1 -1
- package/src/utils/instructions.js +1 -1
- package/src/utils/json-extractor.js +1 -1
- package/src/utils/line-validation.js +1 -1
- package/src/utils/logger.js +1 -1
- package/src/utils/paths.js +1 -1
- package/src/utils/safe-parse-json.js +1 -1
- package/src/utils/stats-calculator.js +1 -1
- package/src/ws/index.js +1 -1
- package/src/ws/server.js +1 -1
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
// Copyright 2026 Tim Perkins (tjwp) | SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
/**
|
|
3
|
+
* TabTitle — manages the browser tab title with flash-on-completion support.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* window.tabTitle = new TabTitle();
|
|
7
|
+
* window.tabTitle.setBase('PR #123'); // → "pair-review - PR #123"
|
|
8
|
+
* window.tabTitle.flashComplete(); // flashes "✓ Review Complete" until tab gains focus
|
|
9
|
+
* window.tabTitle.flashFailed(); // flashes "✗ Review Failed" until tab gains focus
|
|
10
|
+
*/
|
|
11
|
+
class TabTitle {
|
|
12
|
+
constructor() {
|
|
13
|
+
this._base = '';
|
|
14
|
+
this._flashInterval = null;
|
|
15
|
+
this._flashTimeout = null;
|
|
16
|
+
this._onVisibility = this._onVisibilityChange.bind(this);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Set the base identifier shown in the tab title.
|
|
21
|
+
* @param {string} identifier - e.g. "PR #123" or "feature/dark-mode"
|
|
22
|
+
*/
|
|
23
|
+
setBase(identifier) {
|
|
24
|
+
this._base = identifier;
|
|
25
|
+
this._apply();
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** Flash "✓ Review Complete" until the tab gains focus. */
|
|
29
|
+
flashComplete() {
|
|
30
|
+
this._flash('✓ Review Complete');
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** Flash "✗ Review Failed" until the tab gains focus. */
|
|
34
|
+
flashFailed() {
|
|
35
|
+
this._flash('✗ Review Failed');
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
// Internal
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
|
|
42
|
+
_format(suffix) {
|
|
43
|
+
return suffix ? `pair-review - ${suffix}` : 'pair-review';
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
_apply() {
|
|
47
|
+
document.title = this._format(this._base);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
_flash(message) {
|
|
51
|
+
this._stopFlash();
|
|
52
|
+
|
|
53
|
+
// If the tab is already visible, just show the message briefly then revert.
|
|
54
|
+
if (!document.hidden) {
|
|
55
|
+
document.title = this._format(message);
|
|
56
|
+
this._flashTimeout = setTimeout(() => this._apply(), 3000);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Tab is hidden — alternate between message and base title.
|
|
61
|
+
let showMessage = true;
|
|
62
|
+
document.title = this._format(message);
|
|
63
|
+
|
|
64
|
+
this._flashInterval = setInterval(() => {
|
|
65
|
+
showMessage = !showMessage;
|
|
66
|
+
document.title = showMessage
|
|
67
|
+
? this._format(message)
|
|
68
|
+
: this._format(this._base);
|
|
69
|
+
}, 1000);
|
|
70
|
+
|
|
71
|
+
document.addEventListener('visibilitychange', this._onVisibility);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
_onVisibilityChange() {
|
|
75
|
+
if (!document.hidden) {
|
|
76
|
+
this._stopFlash();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
_stopFlash() {
|
|
81
|
+
if (this._flashTimeout) {
|
|
82
|
+
clearTimeout(this._flashTimeout);
|
|
83
|
+
this._flashTimeout = null;
|
|
84
|
+
}
|
|
85
|
+
if (this._flashInterval) {
|
|
86
|
+
clearInterval(this._flashInterval);
|
|
87
|
+
this._flashInterval = null;
|
|
88
|
+
}
|
|
89
|
+
document.removeEventListener('visibilitychange', this._onVisibility);
|
|
90
|
+
this._apply();
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (typeof module !== 'undefined') {
|
|
95
|
+
module.exports = { TabTitle };
|
|
96
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// SPDX-License-Identifier:
|
|
1
|
+
// Copyright 2026 Tim Perkins (tjwp) | SPDX-License-Identifier: Apache-2.0
|
|
2
2
|
/**
|
|
3
3
|
* Toast Notification Component
|
|
4
4
|
* Shows temporary success/error/warning/info messages at the top of the page
|
|
@@ -8,6 +8,12 @@ class Toast {
|
|
|
8
8
|
this.toastContainer = null;
|
|
9
9
|
this.activeToasts = [];
|
|
10
10
|
this.createContainer();
|
|
11
|
+
|
|
12
|
+
// Convenience aliases — matches the conventional toast API (toast.error(), toast.success(), etc.)
|
|
13
|
+
this.error = this.showError.bind(this);
|
|
14
|
+
this.success = this.showSuccess.bind(this);
|
|
15
|
+
this.warning = this.showWarning.bind(this);
|
|
16
|
+
this.info = this.showInfo.bind(this);
|
|
11
17
|
}
|
|
12
18
|
|
|
13
19
|
/**
|