@allocator-one/harness-cli 1.12.0 → 1.12.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/README.md CHANGED
@@ -106,7 +106,9 @@ Read the same mixed timeline shown in an issue's Activity section with
106
106
  `harness activity IO-123`. It returns the newest 20 entries and points out
107
107
  when older entries exist; pass `--all` to follow the opaque cursors through
108
108
  the full history. `activity_list` exposes the same `id`, `limit`, and `all`
109
- inputs to MCP clients.
109
+ inputs to MCP clients. Assignment, reassignment, and unassignment entries show
110
+ the actor and previous/new assignees when supplied by the server. Unavailable
111
+ identities use safe labels rather than raw user ids.
110
112
 
111
113
  Typed issue relations are available without losing the concise blocking
112
114
  workflow. `harness dep add|rm` and the `relation_add`/`relation_rm` MCP tools
@@ -270,6 +270,8 @@ function activityEntry(entry) {
270
270
  return activityComment(entry);
271
271
  case "state_event":
272
272
  return activityStateEvent(entry);
273
+ case "assignee_event":
274
+ return activityAssigneeEvent(entry);
273
275
  default:
274
276
  throw new CommandError(`Unknown activity entry kind: ${clean(entry["kind"])}`);
275
277
  }
@@ -311,6 +313,31 @@ function activityStateEvent(entry) {
311
313
  return `[${clean(requiredString(entry["occurred_at"], "activity occurrence time"))}] ${description} \xB7 ${provenance}
312
314
  `;
313
315
  }
316
+ function activityAssigneeEvent(entry) {
317
+ const actor = activityActor(requiredRecord(entry["actor"], "activity actor"));
318
+ const provenance = activityProvenance(requiredRecord(entry["provenance"], "activity provenance"));
319
+ let description;
320
+ switch (entry["action"]) {
321
+ case "assigned":
322
+ description = `${actor} assigned the issue to ${assigneeName(entry["to_assignee"])}`;
323
+ break;
324
+ case "reassigned":
325
+ description = `${actor} reassigned the issue from ${assigneeName(entry["from_assignee"])} to ${assigneeName(entry["to_assignee"])}`;
326
+ break;
327
+ case "unassigned":
328
+ description = `${actor} unassigned the issue from ${assigneeName(entry["from_assignee"])}`;
329
+ break;
330
+ default:
331
+ throw new CommandError(`Unknown activity action: ${clean(entry["action"])}`);
332
+ }
333
+ return `[${clean(requiredString(entry["occurred_at"], "activity occurrence time"))}] ${description} - ${provenance}
334
+ `;
335
+ }
336
+ function assigneeName(value) {
337
+ const assignee = requiredRecord(value, "activity assignee");
338
+ if (assignee["kind"] === "unknown") return "Unknown assignee";
339
+ return activityActor(assignee);
340
+ }
314
341
  function activityActor(actor) {
315
342
  switch (actor["kind"]) {
316
343
  case "user":
package/dist/cli.js CHANGED
@@ -82,7 +82,7 @@ import {
82
82
  version,
83
83
  workflowStates,
84
84
  writeCredentials
85
- } from "./chunk-WY6F3IJB.js";
85
+ } from "./chunk-VOH6BBJD.js";
86
86
 
87
87
  // src/cli.ts
88
88
  import { createInterface as createInterface2 } from "readline";
@@ -1617,7 +1617,7 @@ program.command("show").description("full issue detail; downloads attached image
1617
1617
  });
1618
1618
  }
1619
1619
  );
1620
- program.command("activity").description("mixed issue activity: comments, creation, and state changes").argument("[id]").option(
1620
+ program.command("activity").description("mixed issue activity: comments, creation, state and assignee changes").argument("[id]").option(
1621
1621
  "--limit <n>",
1622
1622
  `entries per page (default 20, max ${ACTIVITY_MAX_LIMIT})`,
1623
1623
  activityLimit
@@ -2093,7 +2093,7 @@ program.command("upload").description("upload an image (25 MB) or H.264 MP4 vide
2093
2093
  });
2094
2094
  });
2095
2095
  program.command("mcp").description("run the MCP server over stdio (for agents)").action(async () => {
2096
- const { startMcpServer } = await import("./server-5YNUXJO2.js");
2096
+ const { startMcpServer } = await import("./server-FNNMISOZ.js");
2097
2097
  await startMcpServer();
2098
2098
  });
2099
2099
  var keys = program.command("keys").description("the org's provider API keys, handed to tooling without printing them").enablePositionalOptions();
@@ -61,7 +61,7 @@ import {
61
61
  upload,
62
62
  userList,
63
63
  workflowStates
64
- } from "./chunk-WY6F3IJB.js";
64
+ } from "./chunk-VOH6BBJD.js";
65
65
 
66
66
  // src/mcp/server.ts
67
67
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
@@ -165,7 +165,7 @@ var TOOLS = [
165
165
  },
166
166
  {
167
167
  name: "activity_list",
168
- description: "Mixed issue activity: comments, creation, and state changes. Returns the newest page unless all=true.",
168
+ description: "Mixed issue activity: comments, creation, state and assignee changes. Returns the newest page unless all=true.",
169
169
  readOnly: true,
170
170
  shape: {
171
171
  id: identifier,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@allocator-one/harness-cli",
3
- "version": "1.12.0",
3
+ "version": "1.12.1",
4
4
  "description": "CLI and MCP server for Harness, allocator.one's issue tracker",
5
5
  "type": "module",
6
6
  "license": "MIT",
package/spec/openapi.json CHANGED
@@ -1297,7 +1297,7 @@
1297
1297
  "get": {
1298
1298
  "callbacks": {},
1299
1299
  "deprecated": false,
1300
- "description": "Requires the `harness:read` scope. The newest mixed page of comments and issue-state events, returned oldest-first. `has_more` means older entries exist. Pass the opaque `next_cursor` back as `before`; cursors are bound to the issue and viewer and expire after 24 hours.",
1300
+ "description": "Requires the `harness:read` scope. The newest mixed page of comments, issue-state events, and assignee changes, returned oldest-first. `has_more` means older entries exist. Pass the opaque `next_cursor` back as `before`; cursors are bound to the issue and viewer and expire after 24 hours.",
1301
1301
  "parameters": [
1302
1302
  {
1303
1303
  "description": "Issue identifier, e.g. ALL-4901 or CLI-12 (issues minted before team-prefixed numbering carry IO-)",
@@ -1594,6 +1594,131 @@
1594
1594
  "to_state"
1595
1595
  ],
1596
1596
  "type": "object"
1597
+ },
1598
+ {
1599
+ "additionalProperties": false,
1600
+ "properties": {
1601
+ "action": {
1602
+ "enum": [
1603
+ "assigned",
1604
+ "reassigned",
1605
+ "unassigned"
1606
+ ],
1607
+ "type": "string"
1608
+ },
1609
+ "actor": {
1610
+ "properties": {
1611
+ "kind": {
1612
+ "enum": [
1613
+ "system",
1614
+ "user",
1615
+ "deleted_user",
1616
+ "unknown"
1617
+ ],
1618
+ "type": "string"
1619
+ },
1620
+ "name": {
1621
+ "nullable": true,
1622
+ "type": "string"
1623
+ }
1624
+ },
1625
+ "required": [
1626
+ "kind",
1627
+ "name"
1628
+ ],
1629
+ "type": "object"
1630
+ },
1631
+ "from_assignee": {
1632
+ "nullable": true,
1633
+ "properties": {
1634
+ "kind": {
1635
+ "enum": [
1636
+ "system",
1637
+ "user",
1638
+ "deleted_user",
1639
+ "unknown"
1640
+ ],
1641
+ "type": "string"
1642
+ },
1643
+ "name": {
1644
+ "nullable": true,
1645
+ "type": "string"
1646
+ }
1647
+ },
1648
+ "required": [
1649
+ "kind",
1650
+ "name"
1651
+ ],
1652
+ "type": "object"
1653
+ },
1654
+ "id": {
1655
+ "type": "string"
1656
+ },
1657
+ "kind": {
1658
+ "enum": [
1659
+ "assignee_event"
1660
+ ],
1661
+ "type": "string"
1662
+ },
1663
+ "occurred_at": {
1664
+ "format": "date-time",
1665
+ "type": "string"
1666
+ },
1667
+ "provenance": {
1668
+ "properties": {
1669
+ "kind": {
1670
+ "enum": [
1671
+ "live",
1672
+ "import",
1673
+ "backfill"
1674
+ ],
1675
+ "type": "string"
1676
+ },
1677
+ "witnessed": {
1678
+ "type": "boolean"
1679
+ }
1680
+ },
1681
+ "required": [
1682
+ "kind",
1683
+ "witnessed"
1684
+ ],
1685
+ "type": "object"
1686
+ },
1687
+ "to_assignee": {
1688
+ "nullable": true,
1689
+ "properties": {
1690
+ "kind": {
1691
+ "enum": [
1692
+ "system",
1693
+ "user",
1694
+ "deleted_user",
1695
+ "unknown"
1696
+ ],
1697
+ "type": "string"
1698
+ },
1699
+ "name": {
1700
+ "nullable": true,
1701
+ "type": "string"
1702
+ }
1703
+ },
1704
+ "required": [
1705
+ "kind",
1706
+ "name"
1707
+ ],
1708
+ "type": "object"
1709
+ }
1710
+ },
1711
+ "required": [
1712
+ "id",
1713
+ "kind",
1714
+ "occurred_at",
1715
+ "action",
1716
+ "actor",
1717
+ "provenance",
1718
+ "from_assignee",
1719
+ "to_assignee"
1720
+ ],
1721
+ "type": "object"
1597
1722
  }
1598
1723
  ]
1599
1724
  },