@in-the-loop-labs/pair-review 2.6.0 → 2.6.1

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@in-the-loop-labs/pair-review",
3
- "version": "2.6.0",
3
+ "version": "2.6.1",
4
4
  "description": "Your AI-powered code review partner - Close the feedback loop with AI coding agents",
5
5
  "main": "src/server.js",
6
6
  "bin": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pair-review",
3
- "version": "2.6.0",
3
+ "version": "2.6.1",
4
4
  "description": "pair-review app integration — Open PRs and local changes in the pair-review web UI, run server-side AI analysis, and address review feedback. Requires the pair-review MCP server.",
5
5
  "author": {
6
6
  "name": "in-the-loop-labs",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "code-critic",
3
- "version": "2.6.0",
3
+ "version": "2.6.1",
4
4
  "description": "AI-powered code review analysis — Run three-level AI analysis and implement-review-fix loops directly in your coding agent. Works standalone, no server required.",
5
5
  "author": {
6
6
  "name": "in-the-loop-labs",
package/public/index.html CHANGED
@@ -177,6 +177,14 @@
177
177
  color: var(--color-text-primary);
178
178
  }
179
179
 
180
+ .app-version {
181
+ color: var(--color-fg-muted, #656d76);
182
+ font-size: 12px;
183
+ font-weight: 400;
184
+ margin-left: 6px;
185
+ opacity: 0.7;
186
+ }
187
+
180
188
  .header-right {
181
189
  display: flex;
182
190
  align-items: center;
@@ -1089,6 +1097,7 @@
1089
1097
  <path transform="rotate(-50 12 12)" d="M18.178 8c5.096 0 5.096 8 0 8-5.095 0-7.133-8-12.356-8-5.096 0-5.096 8 0 8 5.223 0 7.26-8 12.356-8z"/>
1090
1098
  </svg>
1091
1099
  <span class="logo-text">pair<span class="logo-accent">review</span></span>
1100
+ <span id="app-version" class="app-version"></span>
1092
1101
  </a>
1093
1102
  </div>
1094
1103
  <div class="header-right">
@@ -1092,6 +1092,12 @@
1092
1092
  const config = await response.json();
1093
1093
  updateCommandExamples(config.is_running_via_npx);
1094
1094
 
1095
+ // Display version in header
1096
+ if (config.version) {
1097
+ const versionEl = document.getElementById('app-version');
1098
+ if (versionEl) versionEl.textContent = 'v' + config.version;
1099
+ }
1100
+
1095
1101
  // Expose chat provider config to components (ChatPanel reads these)
1096
1102
  window.__pairReview = window.__pairReview || {};
1097
1103
  window.__pairReview.chatProvider = config.chat_provider || 'pi';
package/public/setup.html CHANGED
@@ -137,6 +137,14 @@
137
137
  color: var(--color-text-primary);
138
138
  }
139
139
 
140
+ .app-version {
141
+ color: var(--color-fg-muted, #656d76);
142
+ font-size: 12px;
143
+ font-weight: 400;
144
+ margin-left: 6px;
145
+ opacity: 0.7;
146
+ }
147
+
140
148
  .setup-target {
141
149
  font-family: var(--font-mono);
142
150
  font-size: 15px;
@@ -463,6 +471,7 @@
463
471
  <path transform="rotate(-50 12 12)" d="M18.178 8c5.096 0 5.096 8 0 8-5.095 0-7.133-8-12.356-8-5.096 0-5.096 8 0 8 5.223 0 7.26-8 12.356-8z"/>
464
472
  </svg>
465
473
  <span class="logo-text">pair<span class="logo-accent">review</span></span>
474
+ <span id="app-version" class="app-version"></span>
466
475
  </a>
467
476
  <div class="setup-target" id="setup-target"></div>
468
477
  <div class="setup-subtitle">Setting up review</div>
@@ -839,6 +848,16 @@
839
848
  });
840
849
  }
841
850
 
851
+ /* ── Display Version ── */
852
+ fetch('/api/config').then(function(r) {
853
+ return r.ok ? r.json() : null;
854
+ }).then(function(config) {
855
+ if (config && config.version) {
856
+ var versionEl = document.getElementById('app-version');
857
+ if (versionEl) versionEl.textContent = 'v' + config.version;
858
+ }
859
+ }).catch(function() { /* non-critical */ });
860
+
842
861
  /* ── Kick Off ── */
843
862
  startSetup();
844
863
  })();
package/src/config.js CHANGED
@@ -185,22 +185,26 @@ async function loadConfig() {
185
185
 
186
186
  let mergedConfig = { ...DEFAULT_CONFIG };
187
187
  let isFirstRun = false;
188
+ let hasManagedConfig = false;
188
189
 
189
190
  for (const source of sources) {
190
191
  try {
191
192
  const data = await fs.readFile(source.path, 'utf8');
192
193
  const parsed = JSON.parse(data);
194
+ if (source.label === 'managed config' && Object.keys(parsed).length > 0) {
195
+ hasManagedConfig = true;
196
+ }
193
197
  mergedConfig = deepMerge(mergedConfig, parsed);
194
198
  } catch (error) {
195
199
  if (error.code === 'ENOENT') {
196
- if (source.required) {
200
+ if (source.required && !hasManagedConfig) {
197
201
  // Global config doesn't exist — create it with defaults
198
202
  const config = { ...DEFAULT_CONFIG };
199
203
  await saveConfig(config);
200
204
  logger.debug(`Created default config file: ${CONFIG_FILE}`);
201
205
  isFirstRun = true;
202
206
  }
203
- // Optional files: skip silently
207
+ // Optional files or managed-config-present: skip silently
204
208
  } else if (error instanceof SyntaxError) {
205
209
  if (source.required) {
206
210
  console.error(`Invalid configuration file at ~/.pair-review/config.json`);
@@ -21,6 +21,7 @@ const {
21
21
  } = require('../ai');
22
22
  const { normalizeRepository } = require('../utils/paths');
23
23
  const { isRunningViaNpx, saveConfig } = require('../config');
24
+ const { version } = require('../../package.json');
24
25
  const { getAllChatProviders, getAllCachedChatAvailability } = require('../chat/chat-providers');
25
26
  const { PRESETS } = require('../utils/comment-formatter');
26
27
  const logger = require('../utils/logger');
@@ -42,6 +43,7 @@ router.get('/api/config', (req, res) => {
42
43
 
43
44
  // Only return safe configuration values (not secrets like github_token)
44
45
  res.json({
46
+ version,
45
47
  theme: config.theme || 'light',
46
48
  comment_button_action: config.comment_button_action || 'submit',
47
49
  comment_format: config.comment_format || 'legacy',