engineering-memory 1.11.12 → 1.11.13

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": "engineering-memory",
3
- "version": "1.11.12",
3
+ "version": "1.11.13",
4
4
  "description": "Installs the Engineering Memory skill and its local MCP bridge. Sign in after installing; your organization and project are resolved from your account.",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",
@@ -1,3 +1,3 @@
1
1
  {
2
- "gitHead": "de721a5d678590e09a9f1085f8f3b976a1791b35"
2
+ "gitHead": "b6171df2dae6cc2a967101902fbedc155d8d301d"
3
3
  }
@@ -930,15 +930,13 @@ export function registerEngineeringMemoryTools(server, service) {
930
930
  }),
931
931
  }, async (input) => toolResult(await service.workItemCreate(input)));
932
932
  server.registerTool('work_item.update', {
933
- description: 'Edit or assign a work item at its current version. Assignees must already be active project members; this does not grant project access.',
933
+ description: "Edit or assign a work item at its current version. Assignees must already be active project members; this does not grant project access. Status is a slug from the project's own status catalogue; a backend that still keeps the six legacy values (backlog, ready, in_progress, in_review, done, cancelled) refuses anything else and names what it accepts.",
934
934
  inputSchema: z.object({
935
935
  ...workItemLocator,
936
936
  data: z.object({
937
937
  ...workItemFields,
938
938
  expectedVersion: z.number().int().min(1),
939
- status: z
940
- .enum(['backlog', 'ready', 'in_progress', 'in_review', 'done', 'cancelled'])
941
- .optional(),
939
+ status: z.string().trim().min(1).max(64).optional(),
942
940
  }),
943
941
  }),
944
942
  }, async (input) => toolResult(await service.workItemUpdate(input)));
@@ -1016,12 +1014,10 @@ export function registerEngineeringMemoryTools(server, service) {
1016
1014
  }),
1017
1015
  }, async (input) => toolResult(await service.projectUpdate(input)));
1018
1016
  server.registerTool('work_item.list', {
1019
- description: 'List selectable work items for a project before opening an engineering run in this chat.',
1017
+ description: "List selectable work items for a project before opening an engineering run in this chat. The status filter is a slug from the project's own status catalogue; a backend that still keeps the six legacy values (backlog, ready, in_progress, in_review, done, cancelled) refuses anything else and names what it accepts.",
1020
1018
  inputSchema: z.object({
1021
1019
  projectId: z.string().uuid(),
1022
- status: z
1023
- .enum(['backlog', 'ready', 'in_progress', 'in_review', 'done', 'cancelled'])
1024
- .optional(),
1020
+ status: z.string().trim().min(1).max(64).optional(),
1025
1021
  priority: z.enum(['lowest', 'low', 'medium', 'high', 'highest']).optional(),
1026
1022
  assigneeUserId: z.string().uuid().optional(),
1027
1023
  includeArchived: z.boolean().optional(),
@@ -3544,21 +3544,30 @@ export class BridgeService {
3544
3544
  }
3545
3545
  }
3546
3546
  async actionableWorkItems(projectId) {
3547
+ const path = `${endpoints.workItemList(projectId)}?limit=100`;
3547
3548
  try {
3548
- const response = await this.dependencies.client.request(`${endpoints.workItemList(projectId)}?limit=100`);
3549
- const items = objectValue(response.data)?.items;
3550
- if (!Array.isArray(items))
3549
+ const chosen = await this.workItemPage(`${path}&actionable=true`).catch((error) => {
3550
+ if (error instanceof ApiResponseError && error.httpStatus === 400)
3551
+ return null;
3552
+ throw error;
3553
+ });
3554
+ if (chosen && chosen.length > 0)
3555
+ return chosen;
3556
+ const every = await this.workItemPage(path);
3557
+ if (chosen && every.some((entry) => objectValue(objectValue(entry)?.projectStatus) !== null))
3551
3558
  return [];
3552
3559
  const actionable = new Set(['backlog', 'ready', 'in_progress', 'in_review']);
3553
- return items.filter((entry) => {
3554
- const item = objectValue(entry);
3555
- return item ? actionable.has(String(item.status)) : false;
3556
- });
3560
+ return every.filter((entry) => actionable.has(String(objectValue(entry)?.status)));
3557
3561
  }
3558
3562
  catch {
3559
3563
  return [];
3560
3564
  }
3561
3565
  }
3566
+ async workItemPage(path) {
3567
+ const response = await this.dependencies.client.request(path);
3568
+ const items = objectValue(response.data)?.items;
3569
+ return Array.isArray(items) ? items : [];
3570
+ }
3562
3571
  async clientUpdate(authenticated) {
3563
3572
  const installed = this.dependencies.clientVersion;
3564
3573
  if (!authenticated) {