Skip to content

feat(cli): add local usage metrics#2493

Open
HOYALIM wants to merge 4 commits intoNVIDIA:mainfrom
HOYALIM:issue-30-basic-metrics
Open

feat(cli): add local usage metrics#2493
HOYALIM wants to merge 4 commits intoNVIDIA:mainfrom
HOYALIM:issue-30-basic-metrics

Conversation

@HOYALIM
Copy link
Copy Markdown

@HOYALIM HOYALIM commented Apr 26, 2026

Summary

Adds lightweight local-only usage metrics for the NemoClaw CLI.
The CLI now records key lifecycle events to ~/.nemoclaw/metrics.jsonl and exposes aggregate and per-sandbox summaries through nemoclaw stats.

Related Issue

Closes #30.

Changes

  • Add src/lib/metrics.ts for best-effort JSONL event recording, parsing, resetting, and summary formatting.
  • Record onboard_start, onboard_complete, sandbox_connect, sandbox_destroy, and policy_apply events from the CLI.
  • Add nemoclaw stats, nemoclaw stats --reset, and nemoclaw <name> stats dispatch paths.
  • Register the new global and sandbox-scoped stats commands in src/lib/command-registry.ts.
  • Update CLI reference docs and regenerate the generated user reference skill.
  • Add focused metrics and CLI dispatch tests for aggregate stats, reset behavior, sandbox filtering, malformed JSONL handling, permission hardening, and failed onboard lifecycle recording.

Type of Change

  • Code change (feature, bug fix, or refactor)
  • Code change with doc updates
  • Doc only (prose changes, no code sample modifications)
  • Doc only (includes code sample changes)

Verification

  • npx prek run --all-files passes
  • npm test passes
  • Tests added or updated for new or changed behavior
  • No secrets, API keys, or credentials committed
  • Docs updated for user-facing behavior changes
  • make docs builds without warnings (doc changes only)
  • Doc pages follow the style guide (doc changes only)
  • New doc pages include SPDX header and frontmatter (new pages only)

Additional validation run locally:

  • npm run build:cli passes
  • npm test -- test/policies.test.ts src/lib/metrics.test.ts src/lib/command-registry.test.ts test/cli.test.ts passes
  • npm test -- test/credentials.test.ts passes
  • npm test -- test/runtime-shell.test.ts passes
  • npm run typecheck:cli passes
  • git diff --check passes

Notes:

  • make check passes formatting, license, generated docs/skills, shell, lint, schema, secret scan, and markdown hooks locally.
  • Full make check does not complete in this local Codex session because the full CLI test hook hits unrelated local timeout/IPC issues in tests outside this PR's diff. The focused metrics/CLI tests and the affected timeout tests pass when run directly.

AI Disclosure

  • AI-assisted - tool: OpenAI Codex

Signed-off-by: Ho Lim subhoya@gmail.com

Summary by CodeRabbit

  • New Features

    • Added per-sandbox nemoclaw <name> stats and global nemoclaw stats (with --reset) to view local CLI metrics; CLI now emits metrics for onboarding, sandbox connect/destroy, and policy apply.
  • Improvements

    • Metrics storage hardened to owner-only permissions; malformed lines are skipped and reported.
  • Documentation

    • Updated command reference and user docs for new metrics commands.
  • Tests

    • Added end-to-end tests for recording, summarizing, formatting, filtering, and resetting metrics.

@copy-pr-bot
Copy link
Copy Markdown

copy-pr-bot Bot commented Apr 26, 2026

This pull request requires additional validation before any workflows can run on NVIDIA's runners.

Pull request vetters can view their responsibilities here.

Contributors can view more details about this message here.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 26, 2026

📝 Walkthrough

Walkthrough

Adds a local JSONL metrics subsystem at ~/.nemoclaw/metrics.jsonl, instruments onboarding, sandbox connect/destroy and policy apply flows to emit events, and introduces two CLI commands: global nemoclaw stats [--reset] and sandbox-scoped nemoclaw <name> stats to read, filter, summarize, and reset local metrics.

Changes

Cohort / File(s) Summary
Documentation
\.agents/skills/nemoclaw-user-reference/references/commands.md, docs/reference/commands.md
Document two new CLI commands (nemoclaw stats [--reset], nemoclaw <name> stats), metrics file location, reset behavior, and initial tracked event types.
Command Registry & Tests
src/lib/command-registry.ts, src/lib/command-registry.test.ts
Added two stats entries to exported COMMANDS (sandbox and global), updated command counts/comments and test expectations to include the new "stats" token.
Metrics Library & Tests
src/lib/metrics.ts, src/lib/metrics.test.ts
New metrics module and tests: JSONL file path resolution (~/.nemoclaw/metrics.jsonl), recordMetricEvent, readMetricEvents (skips/counts malformed lines), resetMetricEvents, summarization and formatting, and file permission tightening to 0o600.
CLI Integration & Tests
src/nemoclaw.ts, test/cli.test.ts, test/policies.test.ts
Instrumented CLI to emit onboard_start/onboard_complete, sandbox_connect, sandbox_destroy, policy_apply; added stats command handler with --reset (global only) and sandbox filtering; tests updated/added for metrics creation, filtering, reset, and policy-apply behavior.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  participant User as "User (CLI)"
  participant CLI as "nemoclaw CLI"
  participant Metrics as "metrics module"
  participant FS as "Filesystem (~/.nemoclaw/metrics.jsonl)"

  User->>CLI: run command (e.g., onboard / <name> stats / stats --reset)
  alt lifecycle command (onboard/connect/destroy/policy_apply)
    CLI->>Metrics: recordMetricEvent(name, {status?, sandbox?, data?})
    Metrics->>FS: ensure dir, open file, append JSONL line, set permissions (0o600)
    FS-->>Metrics: write result (success/failure)
    Metrics-->>CLI: return boolean (best-effort)
  else stats command
    CLI->>Metrics: readMetricEvents(filePath)
    Metrics->>FS: read file lines
    FS-->>Metrics: file contents
    Metrics->>Metrics: parse lines, count malformed, summarize (optional sandbox filter)
    Metrics-->>CLI: formatMetricSummary(summary, filePath)
    CLI-->>User: print summary (or error on bad usage/reset failure)
  end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Poem

🐰
I nudged a line into a quiet log,
Tucked timestamps in a snug JSONd fog.
Sandboxes counted, policies named—so sweet,
Local traces kept on my tiny feet.
Hooray, I hopped and left a tidy beat!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 32.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title 'feat(cli): add local usage metrics' accurately and concisely describes the main change—introducing local usage metrics functionality to the CLI.
Linked Issues check ✅ Passed All coding requirements from issue #30 are met: JSONL event recording [#30], nemoclaw stats and nemoclaw stats --reset [#30], nemoclaw <name> stats [#30], instrumentation for onboard_start/complete, sandbox_connect, sandbox_destroy, policy_apply [#30], and adherence to local-only, best-effort, zero-dependency design principles [#30].
Out of Scope Changes check ✅ Passed All changes align with the objectives: metrics library implementation, CLI integration for event recording, new stats commands, command registry updates, documentation, and corresponding tests. No unrelated or out-of-scope modifications detected.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands and usage tips.

@HOYALIM HOYALIM marked this pull request as ready for review April 26, 2026 23:54
Copilot AI review requested due to automatic review settings April 26, 2026 23:54
@HOYALIM HOYALIM changed the title [codex] Add local usage metrics feat(cli): add local usage metrics Apr 26, 2026
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a local-only metrics system to the NemoClaw CLI to support lightweight usage observability (issue #30), including event recording to a JSONL file and new stats commands for viewing/resetting aggregates.

Changes:

  • Introduce src/lib/metrics.ts to record, read, summarize, and format local JSONL metric events in ~/.nemoclaw/metrics.jsonl.
  • Add nemoclaw stats, nemoclaw stats --reset, and nemoclaw <name> stats commands plus instrumentation for onboarding, connect, destroy, and policy apply.
  • Update command registry, docs, and tests to cover metrics behavior and CLI output.

Reviewed changes

Copilot reviewed 8 out of 8 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
test/cli.test.ts Adds CLI-level tests for stats, stats --reset, per-sandbox stats filtering, and onboarding lifecycle metric recording behavior.
src/nemoclaw.ts Wires in metrics module, adds stats commands, and instruments onboard/connect/destroy/policy events.
src/lib/metrics.ts New metrics implementation for JSONL append/read/summarize/format and reset.
src/lib/metrics.test.ts Adds unit tests for metrics recording, summarization, malformed line handling, and reset.
src/lib/command-registry.ts Registers global and sandbox stats commands and updates command count.
src/lib/command-registry.test.ts Updates command counts/tokens expectations to include stats.
docs/reference/commands.md Documents new stats commands and the local-only metrics file behavior.
.agents/skills/nemoclaw-user-reference/references/commands.md Updates generated user reference docs with the new stats commands.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread src/lib/metrics.test.ts Outdated
Comment thread src/lib/metrics.ts
Comment thread src/lib/metrics.ts
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/nemoclaw.ts`:
- Around line 1656-1661: The current metrics.recordMetricEvent call for the
"sandbox_connect" event uses result.status === 0 to determine success, but that
status reflects the interactive shell's last command exit and not the connection
handshake; change to record raw exit details (e.g., include result.status and
result.signal fields) and determine success from a dedicated pre-shell handshake
or connection check instead of result.status. Update the call site where
metrics.recordMetricEvent("sandbox_connect", ...) is invoked to set status from
the handshake/connection boolean (or "unknown" if no handshake), and include
result.status and result.signal under a separate field like rawExit or exitInfo
so the connect metric isn't skewed by in-shell command failures.
- Around line 1953-1958: policies.applyPreset() can return false on failure, but
the code always logs metrics.recordMetricEvent("policy_apply", ...) with status
"success"; update the logic around applyPreset() so you capture its boolean
return and only record a "success" metric when applyPreset(...) returns true,
otherwise record a failure (or skip) metric similar to how removePreset() is
handled; use the same local variables (sandboxName, answer) and ensure the
metric's status reflects the applyPreset result before calling
metrics.recordMetricEvent.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 923c4ac4-bc62-4528-b7f1-ee48222fa556

📥 Commits

Reviewing files that changed from the base of the PR and between 1f615e2 and e133796.

📒 Files selected for processing (8)
  • .agents/skills/nemoclaw-user-reference/references/commands.md
  • docs/reference/commands.md
  • src/lib/command-registry.test.ts
  • src/lib/command-registry.ts
  • src/lib/metrics.test.ts
  • src/lib/metrics.ts
  • src/nemoclaw.ts
  • test/cli.test.ts

Comment thread src/nemoclaw.ts
Comment thread src/nemoclaw.ts
@ericksoa ericksoa closed this Apr 27, 2026
@ericksoa ericksoa reopened this Apr 27, 2026
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/lib/metrics.ts`:
- Around line 49-53: The runtime guard is too permissive: update isMetricEvent
to ensure candidate.event is one of the known event names and candidate.status
(if present) matches the allowed statuses instead of accepting any string;
specifically introduce a VALID_EVENTS set (or enum) and a VALID_STATUSES set and
check that candidate.event is in VALID_EVENTS and (when candidate.status !==
undefined) candidate.status is in VALID_STATUSES, and also validate
candidate.time is a parsable ISO timestamp (e.g., Date.parse(candidate.time) is
not NaN) before returning true from isMetricEvent.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 714d7088-8a0e-4c8f-a98b-7578efa054eb

📥 Commits

Reviewing files that changed from the base of the PR and between e133796 and a956a2c.

📒 Files selected for processing (2)
  • src/lib/metrics.test.ts
  • src/lib/metrics.ts

Comment thread src/lib/metrics.ts
@HOYALIM HOYALIM force-pushed the issue-30-basic-metrics branch from a956a2c to 4f0cba6 Compare April 27, 2026 04:23
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

♻️ Duplicate comments (1)
src/lib/metrics.ts (1)

55-59: ⚠️ Potential issue | 🟡 Minor

Tighten isMetricEvent so the type predicate is sound.

On Line 58, any string passes for event, and status is not validated. That allows non-MetricEvent payloads through as valid events.

Proposed fix
+const METRIC_EVENT_NAMES = new Set<MetricEventName>([
+  "onboard_start",
+  "onboard_complete",
+  "sandbox_connect",
+  "sandbox_destroy",
+  "policy_apply",
+]);
+
+const METRIC_STATUSES = new Set<MetricStatus>(["success", "failed"]);
+
 function isMetricEvent(value: unknown): value is MetricEvent {
   if (typeof value !== "object" || value === null) return false;
   const candidate = value as Partial<MetricEvent>;
-  return typeof candidate.time === "string" && typeof candidate.event === "string";
+  if (typeof candidate.time !== "string") return false;
+  if (typeof candidate.event !== "string" || !METRIC_EVENT_NAMES.has(candidate.event as MetricEventName)) {
+    return false;
+  }
+  if (
+    candidate.status !== undefined &&
+    (typeof candidate.status !== "string" || !METRIC_STATUSES.has(candidate.status as MetricStatus))
+  ) {
+    return false;
+  }
+  return true;
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/lib/metrics.ts` around lines 55 - 59, The type guard isMetricEvent
currently only checks that time and event are strings, letting invalid payloads
through and not validating status; update isMetricEvent to more strictly
validate the shape: ensure candidate.time is an ISO-8601/parsable date string
(e.g. Date.parse(candidate.time) is not NaN), ensure candidate.event is a
non-empty string or — better — one of the canonical event names (compare against
a known array/enum of allowed event names used elsewhere), and ensure
candidate.status exists and is the expected type/value (e.g. typeof
candidate.status === "string" and matches allowed status values or is
non-empty). Use the MetricEvent symbol and any existing canonical event/status
constants to perform these checks so the predicate is sound.
🧹 Nitpick comments (2)
src/nemoclaw.ts (2)

2509-2514: Consider recording metrics on destroy failure for completeness.

The sandbox_destroy metric is only recorded on success. When destroy fails (line 2479), the process exits without recording. For comprehensive metrics, you could also record failure events.

🔧 Optional improvement at line 2479
   if (deleteResult.status !== 0 && !alreadyGone) {
     if (deleteOutput) {
       console.error(`  ${deleteOutput}`);
     }
     console.error(`  Failed to destroy sandbox '${sandboxName}'.`);
+    metrics.recordMetricEvent("sandbox_destroy", {
+      sandbox: sandboxName,
+      command: "destroy",
+      status: "failed",
+    });
     process.exit(deleteResult.status || 1);
   }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/nemoclaw.ts` around lines 2509 - 2514, The sandbox_destroy metric is only
emitted on success via metrics.recordMetricEvent("sandbox_destroy", { sandbox:
sandboxName, command: "destroy", status: "success", data: { alreadyGone } }); —
modify the error path that currently exits on destroy failure to also call
metrics.recordMetricEvent("sandbox_destroy", ...) with status: "failure"
(include sandboxName, command: "destroy", and data containing the
error/exception and alreadyGone if available) before exiting or rethrowing so
failures are recorded for completeness.

1246-1248: Consider checking readResult.success for better user feedback.

The code doesn't check readResult.success before summarizing. If the metrics file can't be read (permissions, corruption), users see "0 events" instead of an error message. This is acceptable for best-effort design, but you could differentiate between "no metrics yet" and "read failure" with a simple check.

🔧 Optional improvement
   const readResult = metrics.readMetricEvents(metricsFile);
+  if (!readResult.success && fs.existsSync(metricsFile)) {
+    console.error(`  Warning: Could not read metrics file: ${metricsFile}`);
+  }
   const summary = metrics.summarizeMetricEvents(readResult, sandboxName);
   console.log(metrics.formatMetricSummary(summary, metricsFile));
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/nemoclaw.ts` around lines 1246 - 1248, The current flow calls
metrics.summarizeMetricEvents and metrics.formatMetricSummary unconditionally on
readResult; instead check readResult.success after calling
metrics.readMetricEvents(metricsFile) and if false log or console.error a clear
message including readResult.error (or reason) and avoid calling
summarizeMetricEvents/formatMetricSummary; if success is true, pass
readResult.data (or whatever payload) into
metrics.summarizeMetricEvents(metricsFile, sandboxName) and then print the
formatted summary. Ensure you reference readResult, metrics.readMetricEvents,
metrics.summarizeMetricEvents, metrics.formatMetricSummary, metricsFile, and
sandboxName when making the change.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Duplicate comments:
In `@src/lib/metrics.ts`:
- Around line 55-59: The type guard isMetricEvent currently only checks that
time and event are strings, letting invalid payloads through and not validating
status; update isMetricEvent to more strictly validate the shape: ensure
candidate.time is an ISO-8601/parsable date string (e.g.
Date.parse(candidate.time) is not NaN), ensure candidate.event is a non-empty
string or — better — one of the canonical event names (compare against a known
array/enum of allowed event names used elsewhere), and ensure candidate.status
exists and is the expected type/value (e.g. typeof candidate.status === "string"
and matches allowed status values or is non-empty). Use the MetricEvent symbol
and any existing canonical event/status constants to perform these checks so the
predicate is sound.

---

Nitpick comments:
In `@src/nemoclaw.ts`:
- Around line 2509-2514: The sandbox_destroy metric is only emitted on success
via metrics.recordMetricEvent("sandbox_destroy", { sandbox: sandboxName,
command: "destroy", status: "success", data: { alreadyGone } }); — modify the
error path that currently exits on destroy failure to also call
metrics.recordMetricEvent("sandbox_destroy", ...) with status: "failure"
(include sandboxName, command: "destroy", and data containing the
error/exception and alreadyGone if available) before exiting or rethrowing so
failures are recorded for completeness.
- Around line 1246-1248: The current flow calls metrics.summarizeMetricEvents
and metrics.formatMetricSummary unconditionally on readResult; instead check
readResult.success after calling metrics.readMetricEvents(metricsFile) and if
false log or console.error a clear message including readResult.error (or
reason) and avoid calling summarizeMetricEvents/formatMetricSummary; if success
is true, pass readResult.data (or whatever payload) into
metrics.summarizeMetricEvents(metricsFile, sandboxName) and then print the
formatted summary. Ensure you reference readResult, metrics.readMetricEvents,
metrics.summarizeMetricEvents, metrics.formatMetricSummary, metricsFile, and
sandboxName when making the change.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 13d38137-0d17-4284-b5e2-73bdfbb09848

📥 Commits

Reviewing files that changed from the base of the PR and between a956a2c and 4f0cba6.

📒 Files selected for processing (9)
  • .agents/skills/nemoclaw-user-reference/references/commands.md
  • docs/reference/commands.md
  • src/lib/command-registry.test.ts
  • src/lib/command-registry.ts
  • src/lib/metrics.test.ts
  • src/lib/metrics.ts
  • src/nemoclaw.ts
  • test/cli.test.ts
  • test/policies.test.ts
✅ Files skipped from review due to trivial changes (1)
  • .agents/skills/nemoclaw-user-reference/references/commands.md
🚧 Files skipped from review as they are similar to previous changes (2)
  • src/lib/metrics.test.ts
  • docs/reference/commands.md

@HOYALIM HOYALIM force-pushed the issue-30-basic-metrics branch from 4f0cba6 to b4ed855 Compare April 27, 2026 04:30
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

♻️ Duplicate comments (1)
src/lib/metrics.ts (1)

65-80: ⚠️ Potential issue | 🟡 Minor

Validate timestamp format in isMetricEvent.

time currently accepts any string, so invalid date strings are treated as valid events and can skew First/Last summary output.

Proposed fix
 function isMetricEvent(value: unknown): value is MetricEvent {
   if (typeof value !== "object" || value === null) return false;
   const candidate = value as Partial<MetricEvent>;
-  if (typeof candidate.time !== "string" || typeof candidate.event !== "string") {
+  if (
+    typeof candidate.time !== "string" ||
+    Number.isNaN(Date.parse(candidate.time)) ||
+    typeof candidate.event !== "string"
+  ) {
     return false;
   }
   if (!METRIC_EVENT_NAMES.has(candidate.event)) {
     return false;
   }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/lib/metrics.ts` around lines 65 - 80, The type guard isMetricEvent
currently accepts any string for candidate.time; update isMetricEvent (and the
MetricEvent check) to validate that candidate.time is a valid timestamp (e.g.,
parse with Date or Date.parse and ensure resulting Date is valid / not NaN, or
validate against an ISO‑8601 regex) in addition to checking it's a string, while
keeping the existing checks for candidate.event against METRIC_EVENT_NAMES and
candidate.status against METRIC_STATUSES; this ensures only events with valid
timestamps are treated as MetricEvent.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Duplicate comments:
In `@src/lib/metrics.ts`:
- Around line 65-80: The type guard isMetricEvent currently accepts any string
for candidate.time; update isMetricEvent (and the MetricEvent check) to validate
that candidate.time is a valid timestamp (e.g., parse with Date or Date.parse
and ensure resulting Date is valid / not NaN, or validate against an ISO‑8601
regex) in addition to checking it's a string, while keeping the existing checks
for candidate.event against METRIC_EVENT_NAMES and candidate.status against
METRIC_STATUSES; this ensures only events with valid timestamps are treated as
MetricEvent.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: e9c9be37-f066-4104-b366-15667c0734b2

📥 Commits

Reviewing files that changed from the base of the PR and between 4f0cba6 and b4ed855.

📒 Files selected for processing (9)
  • .agents/skills/nemoclaw-user-reference/references/commands.md
  • docs/reference/commands.md
  • src/lib/command-registry.test.ts
  • src/lib/command-registry.ts
  • src/lib/metrics.test.ts
  • src/lib/metrics.ts
  • src/nemoclaw.ts
  • test/cli.test.ts
  • test/policies.test.ts
✅ Files skipped from review due to trivial changes (2)
  • test/policies.test.ts
  • .agents/skills/nemoclaw-user-reference/references/commands.md

@wscurran wscurran added NemoClaw CLI Use this label to identify issues with the NemoClaw command-line interface (CLI). observability Use this label to improve NemoClaw logging, metrics, and tracing. enhancement: feature Use this label to identify requests for new capabilities in NemoClaw. labels Apr 27, 2026
@wscurran
Copy link
Copy Markdown
Contributor

✨ Thanks for submitting this pull request that proposes a way to add lightweight local-only usage metrics for the NemoClaw CLI.


Related open issues:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement: feature Use this label to identify requests for new capabilities in NemoClaw. NemoClaw CLI Use this label to identify issues with the NemoClaw command-line interface (CLI). observability Use this label to improve NemoClaw logging, metrics, and tracing.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: add basic usage metrics and observability to CLI

4 participants