@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
package/public/js/utils/time.js
CHANGED
package/public/js/ws-client.js
CHANGED
package/public/local.html
CHANGED
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
window.__pairReview = window.__pairReview || {};
|
|
20
20
|
window.__pairReview.chatProvider = config.chat_provider || 'pi';
|
|
21
21
|
window.__pairReview.chatProviders = chatProviders;
|
|
22
|
+
window.__pairReview.chatSpinner = config.chat_spinner || 'dots';
|
|
22
23
|
document.documentElement.setAttribute('data-chat', state);
|
|
23
24
|
const shortcutsState = config.chat_enable_shortcuts === false ? 'disabled' : 'enabled';
|
|
24
25
|
document.documentElement.setAttribute('data-chat-shortcuts', shortcutsState);
|
|
@@ -266,8 +267,18 @@
|
|
|
266
267
|
</svg>
|
|
267
268
|
<span id="local-branch-text">--</span>
|
|
268
269
|
</span>
|
|
270
|
+
<span class="local-branch-vs" id="local-branch-vs" style="display: none; font-size: 11px; color: var(--color-text-tertiary); margin: 0 4px;">vs</span>
|
|
271
|
+
<span class="local-branch-badge" id="local-base-branch" style="display: none;">
|
|
272
|
+
<svg viewBox="0 0 16 16" fill="currentColor" width="12" height="12">
|
|
273
|
+
<path d="M11.75 2.5a.75.75 0 100 1.5.75.75 0 000-1.5zm-2.25.75a2.25 2.25 0 113 2.122V6A2.5 2.5 0 0110 8.5H6a1 1 0 00-1 1v1.128a2.251 2.251 0 11-1.5 0V5.372a2.25 2.25 0 111.5 0v1.836A2.492 2.492 0 016 7h4a1 1 0 001-1v-.628A2.25 2.25 0 019.5 3.25zM4.25 12a.75.75 0 100 1.5.75.75 0 000-1.5zM3.5 3.25a.75.75 0 111.5 0 .75.75 0 01-1.5 0z"/>
|
|
274
|
+
</svg>
|
|
275
|
+
<span id="local-base-branch-text">--</span>
|
|
276
|
+
</span>
|
|
269
277
|
</div>
|
|
270
278
|
</div>
|
|
279
|
+
<span id="stale-badge" class="stale-badge" style="display: none" title="Working directory has changed">
|
|
280
|
+
<span class="stale-badge-text">STALE</span>
|
|
281
|
+
</span>
|
|
271
282
|
</div>
|
|
272
283
|
<div class="header-center">
|
|
273
284
|
<!-- Editable review name/title -->
|
|
@@ -527,6 +538,7 @@
|
|
|
527
538
|
<script src="/js/ws-client.js"></script>
|
|
528
539
|
|
|
529
540
|
<!-- Components -->
|
|
541
|
+
<script src="/js/components/TabTitle.js"></script>
|
|
530
542
|
<script src="/js/components/Toast.js"></script>
|
|
531
543
|
<script src="/js/components/ConfirmDialog.js"></script>
|
|
532
544
|
<script src="/js/components/TextInputDialog.js"></script>
|
|
@@ -544,6 +556,7 @@
|
|
|
544
556
|
<script src="/js/components/AIPanel.js"></script>
|
|
545
557
|
<script src="/js/components/EmojiPicker.js"></script>
|
|
546
558
|
<script src="/js/components/KeyboardShortcuts.js"></script>
|
|
559
|
+
<script src="/js/local-scope.js"></script>
|
|
547
560
|
<script src="/js/components/DiffOptionsDropdown.js"></script>
|
|
548
561
|
|
|
549
562
|
<!-- PR Modules (must load before pr.js) -->
|
|
@@ -554,6 +567,7 @@
|
|
|
554
567
|
<script src="/js/modules/diff-renderer.js"></script>
|
|
555
568
|
<script src="/js/modules/comment-manager.js"></script>
|
|
556
569
|
<script src="/js/modules/suggestion-manager.js"></script>
|
|
570
|
+
<script src="/js/modules/comment-minimizer.js"></script>
|
|
557
571
|
<script src="/js/modules/file-comment-manager.js"></script>
|
|
558
572
|
<script src="/js/modules/panel-resizer.js"></script>
|
|
559
573
|
<script src="/js/modules/analysis-history.js"></script>
|
package/public/pr.html
CHANGED
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
window.__pairReview.chatProviders = chatProviders;
|
|
28
28
|
window.__pairReview.share = config.share || null;
|
|
29
29
|
window.__pairReview.enableGraphite = config.enable_graphite === true;
|
|
30
|
+
window.__pairReview.chatSpinner = config.chat_spinner || 'dots';
|
|
30
31
|
document.documentElement.setAttribute('data-chat', state);
|
|
31
32
|
const shortcutsState = config.chat_enable_shortcuts === false ? 'disabled' : 'enabled';
|
|
32
33
|
document.documentElement.setAttribute('data-chat-shortcuts', shortcutsState);
|
|
@@ -374,6 +375,7 @@
|
|
|
374
375
|
<script src="/js/ws-client.js"></script>
|
|
375
376
|
|
|
376
377
|
<!-- Components -->
|
|
378
|
+
<script src="/js/components/TabTitle.js"></script>
|
|
377
379
|
<script src="/js/components/Toast.js"></script>
|
|
378
380
|
<script src="/js/components/ConfirmDialog.js"></script>
|
|
379
381
|
<script src="/js/components/TextInputDialog.js"></script>
|
|
@@ -401,6 +403,7 @@
|
|
|
401
403
|
<script src="/js/modules/diff-renderer.js"></script>
|
|
402
404
|
<script src="/js/modules/comment-manager.js"></script>
|
|
403
405
|
<script src="/js/modules/suggestion-manager.js"></script>
|
|
406
|
+
<script src="/js/modules/comment-minimizer.js"></script>
|
|
404
407
|
<script src="/js/modules/file-comment-manager.js"></script>
|
|
405
408
|
<script src="/js/modules/panel-resizer.js"></script>
|
|
406
409
|
<script src="/js/modules/analysis-history.js"></script>
|
package/public/setup.html
CHANGED
package/src/ai/analyzer.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// SPDX-License-Identifier:
|
|
1
|
+
// Copyright 2026 Tim Perkins (tjwp) | SPDX-License-Identifier: Apache-2.0
|
|
2
2
|
const { createProvider } = require('./index');
|
|
3
3
|
const { v4: uuidv4 } = require('uuid');
|
|
4
4
|
const path = require('path');
|
|
@@ -670,20 +670,18 @@ Do NOT create suggestions for any files not in this list. If you cannot find iss
|
|
|
670
670
|
}
|
|
671
671
|
|
|
672
672
|
/**
|
|
673
|
-
* Get list of changed files for local mode analysis
|
|
674
|
-
*
|
|
675
|
-
*
|
|
676
|
-
* Design note: Staged files are intentionally excluded. Local mode focuses on
|
|
677
|
-
* reviewing uncommitted working directory changes before they are staged.
|
|
678
|
-
* Staged changes are considered "ready to commit" and outside the scope of
|
|
679
|
-
* local review at this point.
|
|
673
|
+
* Get list of changed files for local mode analysis.
|
|
674
|
+
* By default includes unstaged changes and untracked files.
|
|
675
|
+
* When `options.includeStaged` is true, also includes staged (git add'd) files.
|
|
680
676
|
*
|
|
681
677
|
* @param {string} localPath - Path to the local git repository
|
|
678
|
+
* @param {Object} [options]
|
|
679
|
+
* @param {boolean} [options.includeStaged] - Also include staged files
|
|
682
680
|
* @returns {Promise<Array<string>>} List of changed file paths
|
|
683
681
|
*/
|
|
684
|
-
async getLocalChangedFiles(localPath) {
|
|
682
|
+
async getLocalChangedFiles(localPath, options = {}) {
|
|
685
683
|
try {
|
|
686
|
-
// Get modified tracked files (unstaged
|
|
684
|
+
// Get modified tracked files (unstaged)
|
|
687
685
|
const { stdout: unstaged } = await execPromise(
|
|
688
686
|
'git diff --no-ext-diff --name-only',
|
|
689
687
|
{ cwd: localPath }
|
|
@@ -695,12 +693,20 @@ Do NOT create suggestions for any files not in this list. If you cannot find iss
|
|
|
695
693
|
{ cwd: localPath }
|
|
696
694
|
);
|
|
697
695
|
|
|
698
|
-
// Combine and dedupe (no staged files - see design note above)
|
|
699
|
-
// Filter empty strings immediately after split to handle empty git output
|
|
700
696
|
const unstagedFiles = unstaged.trim().split('\n').filter(f => f.length > 0);
|
|
701
697
|
const untrackedFiles = untracked.trim().split('\n').filter(f => f.length > 0);
|
|
702
698
|
const allFiles = [...unstagedFiles, ...untrackedFiles];
|
|
703
699
|
|
|
700
|
+
// Include staged files when scope includes staged
|
|
701
|
+
if (options.includeStaged) {
|
|
702
|
+
const { stdout: staged } = await execPromise(
|
|
703
|
+
'git diff --no-ext-diff --cached --name-only',
|
|
704
|
+
{ cwd: localPath }
|
|
705
|
+
);
|
|
706
|
+
const stagedFiles = staged.trim().split('\n').filter(f => f.length > 0);
|
|
707
|
+
allFiles.push(...stagedFiles);
|
|
708
|
+
}
|
|
709
|
+
|
|
704
710
|
return [...new Set(allFiles)];
|
|
705
711
|
} catch (error) {
|
|
706
712
|
logger.warn(`Could not get local changed files for ${localPath}: ${error.message}`);
|
package/src/ai/claude-cli.js
CHANGED
package/src/ai/codex-provider.js
CHANGED
package/src/ai/index.js
CHANGED
package/src/ai/pi-provider.js
CHANGED
package/src/ai/prompts/config.js
CHANGED
package/src/ai/prompts/index.js
CHANGED
package/src/ai/provider.js
CHANGED
package/src/ai/stream-parser.js
CHANGED
package/src/chat/acp-bridge.js
CHANGED
package/src/chat/codex-bridge.js
CHANGED
package/src/chat/pi-bridge.js
CHANGED
package/src/config.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// SPDX-License-Identifier:
|
|
1
|
+
// Copyright 2026 Tim Perkins (tjwp) | SPDX-License-Identifier: Apache-2.0
|
|
2
2
|
const fs = require('fs').promises;
|
|
3
3
|
const path = require('path');
|
|
4
4
|
const os = require('os');
|
|
@@ -23,6 +23,7 @@ const DEFAULT_CONFIG = {
|
|
|
23
23
|
default_provider: "claude", // AI provider: 'claude', 'gemini', 'codex', 'copilot', 'opencode', 'cursor-agent', 'pi'
|
|
24
24
|
default_model: "opus", // Model within the provider (e.g., 'opus' for Claude, 'gemini-2.5-pro' for Gemini)
|
|
25
25
|
worktree_retention_days: 7,
|
|
26
|
+
review_retention_days: 21,
|
|
26
27
|
dev_mode: false, // When true, disables static file caching for development
|
|
27
28
|
debug_stream: false, // When true, logs AI provider streaming events (equivalent to --debug-stream CLI flag)
|
|
28
29
|
db_name: "", // Custom database filename (default: database.db). Useful for per-worktree isolation.
|
|
@@ -35,6 +36,7 @@ const DEFAULT_CONFIG = {
|
|
|
35
36
|
chat_providers: {}, // Custom chat provider configurations (overrides built-in defaults)
|
|
36
37
|
monorepos: {}, // Monorepo configurations: { "owner/repo": { path: "~/path/to/clone" } }
|
|
37
38
|
assisted_by_url: "https://github.com/in-the-loop-labs/pair-review", // URL for "Review assisted by" footer link
|
|
39
|
+
hooks: {}, // Hook commands per event: { "review.started": { "my_hook": { "command": "..." } } }
|
|
38
40
|
enable_graphite: false // When true, shows Graphite links alongside GitHub links
|
|
39
41
|
};
|
|
40
42
|
|