openmerit 0.1.7-preview.5 → 0.1.8

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/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.8 — 2026-10-24
4
+
5
+ - Install an owned startup rule requiring Scout before explicit or implicit application-model choices, including pretrained/local/browser models, weight downloads and SDK defaults. Keep detailed access-policy and search instructions in the skill. These instructions are guidance, not hard enforcement.
6
+ - Upgrade unchanged skill-only installations without another device approval; include rule ownership, conflict detection, interrupted-update recovery, status, diagnostics and safe removal.
7
+ - Require a new Claude Code session after setup or upgrade; reconnecting `/mcp` alone does not reload startup instructions. Pause model selection when Scout is unavailable or lacks suitable candidates rather than falling back to a remembered model.
8
+
9
+ ## 0.1.7 — 2026-10-24
10
+
11
+ - Release coding-agent device sign-in, Claude Code MCP/Scout skill installation, status, diagnostics, removal and project endpoint policy on the stable `latest` channel. Setup requires browser approval; it never requests a pasted key.
12
+ - Use `openmerit@latest` in setup and installed skill commands. Scout's independently deployed button opens a prefilled Claude Desktop Code session; the user sends the prompt.
13
+ - Promote the agent-evaluation CLI, explicit scope/budget selection and corrected accounting from the preview channel. Provider billing, native permissions and unknown costs remain separate from local reservations.
14
+ - Include automatic light/dark terminal appearance and optional, default-off CLI/terminal analytics with bounded diagnostics. Do Not Track overrides opt-in; prompts, credentials, local names and raw errors are excluded.
15
+ - Preserve existing package exports and legal metadata. The hosted Scout service and website deploy independently; npm installation does not start hourly research or execute recommended models.
16
+
3
17
  ## 0.1.7-preview.5 — 2026-10-17
4
18
 
5
19
  - Update packaged Scout documentation for the independently deployed matching repair: shared evidence targeting, retrieval coverage and bounded semantic consistency checks.
package/README.md CHANGED
@@ -14,15 +14,19 @@ cd /path/to/your/application
14
14
  openmerit dash
15
15
  ```
16
16
 
17
- Stable `openmerit@0.1.6` includes the terminal. No Pi installation or provider API key is needed. It opens a browser connected to a read-only loopback service. Supported source/configuration declarations establish inventory; existing application logs or exports supply request history. Prompts, responses, and credentials are not retained. Unsupported or missing evidence remains unknown.
17
+ Stable `openmerit@0.1.7` includes the terminal. No Pi installation or provider API key is needed. It opens a browser connected to a read-only loopback service. Supported source/configuration declarations establish inventory; existing application logs or exports supply request history. Prompts, responses, and credentials are not retained. Unsupported or missing evidence remains unknown.
18
18
 
19
- The source interface and hosted dashboard follow the device's light/dark preference without a theme control. This appearance change is not included in npm 0.1.6.
19
+ The terminal and hosted dashboard follow the device's light/dark preference without a theme control. CLI and terminal product analytics are off unless explicitly enabled; see [the analytics contract](docs/inference-terminal.md#optional-cli-product-analytics).
20
20
 
21
21
  Explore the [hosted sample](https://dash.openmerit.ai/) or [before/after dashboard demo](https://dash.openmerit.ai/demo). Both use fictional data and make no inference calls. See [the terminal guide](docs/inference-terminal.md) for configuration, discovery, diagnostics, history limits, and agent access.
22
22
 
23
+ ## Connect Scout to Claude Code
24
+
25
+ Run `npx -y openmerit@latest install --client claude-code`, then approve the device in your browser. The command installs the MCP server and Scout skill and checks the connection. New Claude Code sessions can consult Scout before choosing application models. Requires the `claude` CLI on PATH; see [setup, project policy and removal](docs/scout.md#connect-a-coding-agent). Installing the npm package alone makes no agent configuration changes.
26
+
23
27
  ## Compare models with Pi
24
28
 
25
- The **npm preview** provides `openmerit eval` for evaluating Claude Code, Codex and OpenCode with your CLI. Choose model scope and a $10, custom or no-fixed-cap budget, freeze Scout's shortlist, and compare 3–10 fresh attempts after source changes. Budget and sandbox blocks stay separate from task scores; unknown costs stay unknown. Install with `npm install -g openmerit@preview`. See [agent evaluations](https://unpkg.com/openmerit@preview/docs/agent-evaluations.md) for setup, graders, budgets and availability. Scout's hosted API and MCP service update independently of the npm package. This is separate from the Pi workflow below.
29
+ Stable **npm 0.1.7** provides `openmerit eval` for evaluating Claude Code, Codex and OpenCode with your CLI. Choose model scope and a $10, custom or no-fixed-cap budget, freeze Scout's shortlist, and compare 3–10 fresh attempts after source changes. Budget and sandbox blocks stay separate from task scores; unknown costs stay unknown. Install with `npm install -g openmerit@latest`. See [agent evaluations](docs/agent-evaluations.md) for setup, graders, budgets and availability. Scout's hosted API and MCP service update independently of the npm package. This is separate from the Pi workflow below.
26
30
 
27
31
  With Pi 0.87 and a model provider configured:
28
32
 
@@ -1,5 +1,6 @@
1
1
  import { digest, saveJSON, statePath } from './config.mjs';
2
2
  import { join } from 'node:path';
3
+ import { scoutDiagnostic } from '../../terminal/src/telemetry.mjs';
3
4
 
4
5
  export const selectionHash = config => digest({ scope: config.scope, connections: config.connections, tasks: config.tasks.map(t => ({ id: t.id, description: t.description })), scoutURL: config.scoutURL });
5
6
  export async function makePlan(config, fetcher = fetch) {
@@ -8,8 +9,13 @@ export async function makePlan(config, fetcher = fetch) {
8
9
  if (config.scope === 'existing' && !modelIds.length) throw new Error('Declare project connections in .openmerit/eval.json first. No credentials are sent to Scout.');
9
10
  const tasks = [];
10
11
  for (const task of config.tasks) {
11
- const response = await fetcher(config.scoutURL ?? 'https://openmerit.ai/scout/api/recommend', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ prompt: task.description, ...(config.scope === 'existing' ? { modelIds } : {}) }), signal: AbortSignal.timeout(15_000), redirect: 'error' });
12
+ let trace, code = 'scout_network_error';
13
+ try {
14
+ const response = await fetcher(config.scoutURL ?? 'https://openmerit.ai/scout/api/recommend', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Scout-Client': 'cli', 'X-Scout-Analytics-Content': 'off', 'X-Scout-Analytics': process.env.OPENMERIT_TELEMETRY === '1' && process.env.DO_NOT_TRACK !== '1' ? 'on' : 'off' }, body: JSON.stringify({ prompt: task.description, ...(config.scope === 'existing' ? { modelIds } : {}) }), signal: AbortSignal.timeout(15_000), redirect: 'error' });
15
+ trace = response.headers?.get('X-Scout-Trace-Id');
16
+ code = 'scout_http_error';
12
17
  if (!response.ok) throw new Error(`Scout returned HTTP ${response.status}; no evaluation was started.`);
18
+ code = 'scout_response_error';
13
19
  const body = await response.json();
14
20
  if (!Array.isArray(body.recommendations) || body.recommendations.length > 5) throw new Error('Invalid Scout response.');
15
21
  if (config.scope === 'existing' && (!Array.isArray(body.selection?.modelIds) || digest([...body.selection.modelIds].sort()) !== digest([...modelIds].sort()))) throw new Error('Scout did not acknowledge filtering before ranking. Update the Scout endpoint; no unscoped fallback is allowed.');
@@ -20,6 +26,11 @@ export async function makePlan(config, fetcher = fetch) {
20
26
  return { scoutId: m.id, name: m.name, rank: m.rank, connections: config.connections.filter(c => c.scoutId === m.id).map(c => c.id) };
21
27
  });
22
28
  tasks.push({ id: task.id, candidates, ranking: body.ranking, warnings: body.warnings ?? [] });
29
+ } catch (error) {
30
+ try { scoutDiagnostic(error, trace, error?.name === 'TimeoutError' || error?.name === 'AbortError' ? 'scout_timeout' : code); }
31
+ catch { /* Diagnostics must not replace the original Scout failure. */ }
32
+ throw error;
33
+ }
23
34
  }
24
35
  return { version: 1, createdAt: new Date().toISOString(), scope: config.scope, selectionHash: selectionHash(config), tasks };
25
36
  }