Skip to content

chore(release): bump version to 2.2.3#60

Merged
devondragon merged 2 commits intomainfrom
chore/bump-version-2.2.3
Feb 18, 2026
Merged

chore(release): bump version to 2.2.3#60
devondragon merged 2 commits intomainfrom
chore/bump-version-2.2.3

Conversation

@devondragon
Copy link
Copy Markdown
Owner

Summary

  • Bump version from 2.2.2 to 2.2.3 in package.json and package-lock.json

Changes since 2.2.2

Copilot AI review requested due to automatic review settings February 18, 2026 23:08
@claude
Copy link
Copy Markdown

claude Bot commented Feb 18, 2026

PR Review: chore(release): bump version to 2.2.3

This is a clean, minimal release PR. The version bump in both package.json and package-lock.json is consistent and appropriate. The summary accurately describes the changes from PR #58.


Version bump

Correct. A patch-level bump (2.2.2 → 2.2.3) is appropriate for the changes being released: bug fixes and internal refactoring with no breaking changes or new user-facing features.


Reviewing the released changes (PR #58)

Since the value of a release PR is in the changes it ships, here are observations on the underlying code:

What's good

  • resolveAssignee extraction (src/handlers/TaskHandler.ts:407–480): Pulling the duplicated assignee-resolution logic into a single private method is a well-targeted refactor — DRY, easier to maintain, and correctly shared between handleCreate and handleListAllUncompleted.
  • dotenv.config() fix (src/mcp-server.ts): Removing the invalid quiet option silences a TypeScript build error cleanly.
  • assigneeId threading through getAllUncompletedTasks (src/services/motionApi.ts:2261): The change is minimal and correctly passes server-side filtering down to each per-workspace getTasks() call, avoiding client-side filtering over a potentially large dataset.

Potential issues

1. Sequential cross-workspace user lookup (performance)

In resolveAssignee, when no workspaceId is provided and an assignee name is given, workspaces are iterated one-by-one:

for (const ws of workspaces) {
  const user = await this.motionService.resolveUserIdentifier({ userName: input }, ws.id);
  if (user) { ... }
}

For a user with many workspaces, this generates N serial API calls. Consider Promise.all with early-exit via Promise.race / Promise.any, or at minimum document that this path is latency-sensitive.

2. Misleading error message when workspaceId is provided

if (!user) {
  throw new Error(`Assignee "${input}" not found in any workspace`);
}

This branch is only reached when workspaceId is set (the cross-workspace for loop is in the !workspaceId branch), so the message "not found in any workspace" is inaccurate — it should say something like "not found in workspace `${workspaceId}`".

3. Test coverage gap

PR #51 added a unit test suite, but the new resolveAssignee method and the list_all_uncompleted + assignee-filter path don't appear to have corresponding tests. Given that this method is now shared across multiple operations and handles several edge cases ('me' shortcut, name lookup, cross-workspace fallback), unit tests here would give good coverage at low cost.

4. Minor: display fallback when passing a raw assigneeId

return { resolvedId: assigneeId, display: assignee };

When a caller passes only assigneeId (no assignee string), display will be undefined, and the formatter will fall back to showing the raw ID. This isn't a bug, but if you want consistent display names you'd need to resolve the ID to a user object — probably not worth the extra API call for now, just worth noting.


Summary

The release PR itself is correct and ready to merge. The underlying changes are solid — the main actionable items are the misleading error message (easy fix) and test coverage for resolveAssignee (worthwhile follow-up). The sequential cross-workspace lookup is worth a comment or a ticket for future optimization.

Copy link
Copy Markdown
Contributor

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

This PR bumps the package version from 2.2.2 to 2.2.3 to release bug fixes and refactoring changes that were merged in PR #58. The version bump includes fixes for assignee filtering in the list_all_uncompleted operation and removal of an invalid dotenv configuration option that was causing TypeScript build errors.

Changes:

  • Update version to 2.2.3 in package.json
  • Update version to 2.2.3 in package-lock.json (in 2 locations as required)

Reviewed changes

Copilot reviewed 2 out of 3 changed files in this pull request and generated 1 comment.

File Description
package.json Bumped version from 2.2.2 to 2.2.3
package-lock.json Updated version in lockfile metadata (2 locations) to match package.json

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

Comment thread package.json
{
"name": "motionmcp",
"version": "2.2.2",
"version": "2.2.3",
Copy link

Copilot AI Feb 18, 2026

Choose a reason for hiding this comment

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

The CHANGELOG.md file should be updated with a new entry for version 2.2.3. Based on the PR description and linked PR #58, this version includes:

  • Fix for assignee filtering in list_all_uncompleted operation
  • Removal of invalid dotenv quiet option
  • Refactoring to extract shared assignee resolution logic

Additionally, the CHANGELOG entry for 2.2.2 (line 10) incorrectly states that quiet: true was added to dotenv, when in fact PR #58 removes this invalid option because it was causing TypeScript build errors. This should be corrected.

Suggested change
"version": "2.2.3",
"version": "2.2.2",

Copilot uses AI. Check for mistakes.
@claude
Copy link
Copy Markdown

claude Bot commented Feb 18, 2026

PR Review: chore(release): bump version to 2.2.3

This is a clean release/version-bump PR. The diff itself is minimal (version strings in package.json/package-lock.json and a CHANGELOG.md entry), so this review also covers the underlying changes documented in the changelog — specifically the resolveAssignee() refactor and assignee filtering fix from #58, which are already on main.


Version Bump Files

  • package.json and package-lock.json are consistent (both updated to 2.2.3). ✅
  • dotenv.config() without options is correct for dotenv v17. ✅

CHANGELOG.md

Well-written entries with clear "what changed and why" descriptions. One small note: the 2.2.2 entry now omits the quiet: true mention entirely after removing the erroneous bullet — the result is a bit terse. Consider replacing the removed line with something like - No breaking changes; standard dotenv API usage retained so readers understand why 2.2.2 existed. Minor and optional.


resolveAssignee() — Code Review (TaskHandler.ts:434–477)

The refactor is good overall. A few things worth flagging:

Bug: Misleading error message on line 460

if (workspaceId) {
  const user = await this.motionService.resolveUserIdentifier({ userName: input }, workspaceId);
  if (!user) {
    throw new Error(`Assignee "${input}" not found in any workspace`);  // ← wrong
  }
  ...
}

When workspaceId is provided, only a single workspace is searched. The error message says "not found in any workspace", which is the cross-workspace branch's message. This is inaccurate and could confuse users. It should read something like Assignee "${input}" not found in workspace ${workspaceId}.

Minor: Undefined display when only assigneeId is supplied (line 447)

return { resolvedId: assigneeId, display: assignee };

If assigneeId is passed without assignee, display will be undefined. Callers handle this gracefully with display || resolvedId, so it's not breaking — but the display will fall back to the raw ID, which is less readable than a name. Not urgent, but worth noting for a future polish pass.

Performance: Sequential cross-workspace lookup (lines 466–472)

const workspaces = await this.motionService.getWorkspaces();
for (const ws of workspaces) {
  const user = await this.motionService.resolveUserIdentifier({ userName: input }, ws.id);
  if (user) return { resolvedId: user.id, display: displayFromUser(user) };
}

This is a sequential waterfall — each workspace waits for the previous. For users with many workspaces this adds latency. A Promise.all with early-exit (e.g., via a custom findFirst or Promise.any) could parallelize lookups. Not blocking for this release, but worth considering if workspace counts grow.


handleListAllUncompleted — Integration

The integration looks correct. resolveAssignee() is called without workspaceId (intentionally triggering cross-workspace lookup), and the result is threaded through to getAllUncompletedTasks(). The display || resolvedId fallback is consistent with handleList(). ✅


Summary

Area Status
Version bump consistency ✅ Clean
dotenv fix ✅ Correct
Changelog accuracy ✅ Good, one optional improvement
resolveAssignee() logic ✅ Correct, one misleading error message
Cross-workspace lookup ✅ Works, sequential (future optimization)
handleListAllUncompleted integration ✅ Correct

Recommendation: The misleading error message on line 460 is the only concrete correctness issue. Everything else is minor polish. This is good to merge, but consider opening a follow-up issue for the error message fix.

@devondragon devondragon merged commit ff84c02 into main Feb 18, 2026
1 check passed
@devondragon devondragon deleted the chore/bump-version-2.2.3 branch February 18, 2026 23:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

list_all_uncompleted silently ignores assignee filter

2 participants