pipebrain-mcp 0.46.0 → 0.47.0

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.
Files changed (2) hide show
  1. package/dist/main.js +29 -5
  2. package/package.json +1 -1
package/dist/main.js CHANGED
@@ -376,7 +376,7 @@ var AGENT_CONFIG_ENTRIES = [
376
376
  { target: "pipebrain/hooks/pre-commit-publication-fitness.js", sha256: "68a4f5f15dea22057b7217ad54d5cf8c34a8c4aaa5ce139ace79911acece8504" },
377
377
  { target: "pipebrain/hooks/pre-commit-secret-scan.js", sha256: "1bc634774184e66748b3152016e806ef974449e976920fd710732170fdb4ad6b" },
378
378
  { target: "pipebrain/hooks/stop-orphaned-servers.js", sha256: "c3b847832c60605278e54ca1067c216bee073ab0a4bb046439b5f184b728792a" },
379
- { target: "pipebrain/team.md", sha256: "945d53a03e09e4ea4f15abf7c6c98ee2bcc2739ce6203e2056590b6ebece0df9" },
379
+ { target: "pipebrain/team.md", sha256: "6692dd20f27820cbd22f7272035e1b1e09ef8e1f83ef403874ae6c67d49085c0" },
380
380
  { target: "rules/react-tailwind.md", sha256: "80bb51b2d8fd5782b7c742526544e7841ee38aa575faf7a8c7b4217ba5731989" },
381
381
  { target: "rules/shell.md", sha256: "499aac60b6419acb0bb362c0267b9399139dcceafb0eaf67702e40f3118b5c04" },
382
382
  { target: "rules/typescript.md", sha256: "c55eab0c243e38cdf903ab50b1e9d6d621516b893e602e1abff9a999a14e72d4" },
@@ -15511,6 +15511,16 @@ var issueSchema = external_exports.object({
15511
15511
  headerDerivedAt: external_exports.iso.datetime({ offset: true }).nullable().optional(),
15512
15512
  parentId: uuidSchema.nullable(),
15513
15513
  claimedBy: uuidSchema.nullable(),
15514
+ // Kept for a person (PIPE-439): the work is spoken for, so an agent is not offered it
15515
+ // and a bearer token's claim on it is refused. A field of its own, orthogonal to
15516
+ // `status`, `priority` and `claimedBy` — a claim says someone has STARTED, this says
15517
+ // the work is taken before anyone starts.
15518
+ //
15519
+ // REQUIRED, not optional-nullable like the header fields above: the column is
15520
+ // `not null default false`, so every issue has an answer and every mapper sends one.
15521
+ // An absent field and an unmarked issue would be indistinguishable to a caller, which
15522
+ // is precisely the failure the wire mappers in libs/db/src/issues.ts warn about.
15523
+ reservedForPerson: external_exports.boolean(),
15514
15524
  source: sourceSchema,
15515
15525
  metadata: metadataSchema,
15516
15526
  customFields: customFieldsSchema,
@@ -16820,6 +16830,20 @@ var ApiClient = class _ApiClient {
16820
16830
  clearBlocked(ref) {
16821
16831
  return this.request("DELETE", `/api/v1/issues/${enc(ref)}/blocked`);
16822
16832
  }
16833
+ /**
16834
+ * Keeps the work for a person (PIPE-439): an agent is no longer offered it and a
16835
+ * bearer token's claim on it is refused. Web session only server-side — a token
16836
+ * calling either of these gets 403 `web_session_required`.
16837
+ *
16838
+ * No body: the verb carries the value, so there is one way to set and one to clear.
16839
+ */
16840
+ setReserved(ref) {
16841
+ return this.request("PUT", `/api/v1/issues/${enc(ref)}/reserved`);
16842
+ }
16843
+ /** Releases work back to the agents (PIPE-439). Idempotent — no mark, no error. */
16844
+ clearReserved(ref) {
16845
+ return this.request("DELETE", `/api/v1/issues/${enc(ref)}/reserved`);
16846
+ }
16823
16847
  /**
16824
16848
  * Records "`blocker` blocks `ref`" (PIPE-160) — one edge, visible from both
16825
16849
  * ends. Idempotent: a duplicate records no second edge.
@@ -17747,7 +17771,7 @@ function createMcpServer(baseClient, apiBaseUrl, orgInstructions2 = /* @__PURE__
17747
17771
  // one description loaded into EVERY session by `anthropic/alwaysLoad`. The clauses
17748
17772
  // that went were the ones arguing for the rule rather than stating it; what a caller
17749
17773
  // needs to predict a refusal all stayed.
17750
- description: `Everything a session needs before it starts work, in ONE read \u2014 assembled by the API and returned verbatim, with the BINDING GUIDANCE appended after it: the product doctrine and this organization\u2019s own writing rules, in full. This is the one call that returns them; every other read only names it. CALL IT FIRST, before you write anything. Addressed by \`issue\` OR by \`project\`, never both and never neither: an issue names its own project, so the pair is refused rather than resolved for you (\xA77). Given an ISSUE: that issue\u2019s full detail \u2014 the same payload \`get_issue\` returns \u2014 PLUS the BODY TEXT of every requirement it links, at the revision the link is pinned at. That text is the round trip this removes: \`get_issue\` names which documents bind the work and at which revision, never what they SAY. Comments come CAPPED at the newest \`commentLimit\` (default ${WORK_CONTEXT_COMMENT_LIMIT}), with \`commentCount\` \u2014 the issue\u2019s TRUE total \u2014 beside them; read the issue directly for the rest. Given a PROJECT: \`available\`, the work a session could START right now. It EXCLUDES finished and abandoned work (\`done\`, \`killed\`), work another person has claimed, and anything blocked \u2014 the status guard would refuse to start that. Your OWN claims stay, and so does unscheduled work carrying no milestone. \`available\` comes CAPPED at \`availableLimit\` rows, with \`availableCount\` \u2014 the project\u2019s TRUE total of startable work \u2014 beside it. The item form carries no \`available\`; the project form carries no item. BOTH forms also carry the project half: the release currently being worked (the active milestone) and the project\u2019s cross-cutting requirements WITH their text \u2014 they bind every epic automatically \u2014 and this organization\u2019s approved conventions in full, standing guidance that binds work in EVERY project here, not just this one. READ-ONLY \u2014 this claims nothing, moves nothing and writes nothing.`,
17774
+ description: `Everything a session needs before it starts work, in ONE read \u2014 assembled by the API and returned verbatim, with the BINDING GUIDANCE appended after it: the product doctrine and this organization\u2019s own writing rules, in full. This is the one call that returns them; every other read only names it. CALL IT FIRST, before you write anything. Addressed by \`issue\` OR by \`project\`, never both and never neither: an issue names its own project, so the pair is refused rather than resolved for you (\xA77). Given an ISSUE: that issue\u2019s full detail \u2014 the same payload \`get_issue\` returns \u2014 PLUS the BODY TEXT of every requirement it links, at the revision the link is pinned at. That text is the round trip this removes: \`get_issue\` names which documents bind the work and at which revision, never what they SAY. Comments come CAPPED at the newest \`commentLimit\` (default ${WORK_CONTEXT_COMMENT_LIMIT}), with \`commentCount\` \u2014 the issue\u2019s TRUE total \u2014 beside them; read the issue directly for the rest. Given a PROJECT: \`available\`, the work a session could START right now. It EXCLUDES finished and abandoned work (\`done\`, \`killed\`), work another person has claimed, anything blocked \u2014 the status guard would refuse to start that \u2014 and work an operator has reserved for a person, which no token may claim however it is reached. Your OWN claims stay, and so does unscheduled work carrying no milestone. \`available\` comes CAPPED at \`availableLimit\` rows, with \`availableCount\` \u2014 the project\u2019s TRUE total of startable work \u2014 beside it. The item form carries no \`available\`; the project form carries no item. BOTH forms also carry the project half: the release currently being worked (the active milestone) and the project\u2019s cross-cutting requirements WITH their text \u2014 they bind every epic automatically \u2014 and this organization\u2019s approved conventions in full, standing guidance that binds work in EVERY project here, not just this one. READ-ONLY \u2014 this claims nothing, moves nothing and writes nothing.`,
17751
17775
  // The WHOLE domain schema rather than its `.shape`: the exactly-one-of rule is a
17752
17776
  // refinement on the OBJECT, and a raw shape drops it — the SDK validates against
17753
17777
  // what it is handed, so the shape alone would quietly accept both arguments and
@@ -17865,7 +17889,7 @@ function createMcpServer(baseClient, apiBaseUrl, orgInstructions2 = /* @__PURE__
17865
17889
  registerStrict(
17866
17890
  "list_issues",
17867
17891
  {
17868
- description: `List issue summaries (display id, title, type, status, terminal, blocked, priority, milestone, claimer, criteria progress, updated_at, and the header \u2014 \`summary\`, \`why\`, \`affectedSurfaces\`, \`headerStale\`, \`headerDerivedAt\` \u2014 so a list says what each issue is about without opening it) filtered by project, environment, status[], type[], claimedBy (me/unclaimed/uuid), priority[], milestone, text (title+body), parent, blocked, and needsHeader (\xA77). DEFAULT: with no status filter this returns BUILDABLE work only \u2014 ${OPEN_STATUSES.join(", ")}. Terminal work (done, killed) is excluded unless you ask for it by name: pass status explicitly, e.g. status: ["done","killed"] for finished and abandoned work, or list every value to see everything. An explicit status filter is used verbatim and the default is not merged into it. The default is the API's own, applied server-side, so an omitted status means the same thing on every surface. Every row also carries \`terminal\` (PIPE-R15 r4 rule 5). blocked: false returns only work with nothing blocking it, and every issue it returns can be moved to ready without refusal; blocked: true returns only blocked work. needsHeader: true returns exactly the issues whose header is missing or no longer describes the body it was derived from \u2014 the set \`set_issue_header\` still has to be called on \u2014 and needsHeader: false returns only those whose header still holds. Each row\u2019s \`headerStale\` is the same expression this filter selects on, so a row cannot disagree with the filter that returned it. The status default above is not lifted for it: name done and killed explicitly when the sweep is meant to reach finished work as well.`,
17892
+ description: `List issue summaries (display id, title, type, status, terminal, blocked, \`reservedForPerson\`, priority, milestone, claimer, criteria progress, updated_at, and the header \u2014 \`summary\`, \`why\`, \`affectedSurfaces\`, \`headerStale\`, \`headerDerivedAt\` \u2014 so a list says what each issue is about without opening it) filtered by project, environment, status[], type[], claimedBy (me/unclaimed/uuid), priority[], milestone, text (title+body), parent, blocked, and needsHeader (\xA77). DEFAULT: with no status filter this returns BUILDABLE work only \u2014 ${OPEN_STATUSES.join(", ")}. Terminal work (done, killed) is excluded unless you ask for it by name: pass status explicitly, e.g. status: ["done","killed"] for finished and abandoned work, or list every value to see everything. An explicit status filter is used verbatim and the default is not merged into it. The default is the API's own, applied server-side, so an omitted status means the same thing on every surface. Every row also carries \`terminal\` (PIPE-R15 r4 rule 5). blocked: false returns only work with nothing blocking it, and every issue it returns can be moved to ready without refusal; blocked: true returns only blocked work. needsHeader: true returns exactly the issues whose header is missing or no longer describes the body it was derived from \u2014 the set \`set_issue_header\` still has to be called on \u2014 and needsHeader: false returns only those whose header still holds. Each row\u2019s \`headerStale\` is the same expression this filter selects on, so a row cannot disagree with the filter that returned it. The status default above is not lifted for it: name done and killed explicitly when the sweep is meant to reach finished work as well.`,
17869
17893
  inputSchema: listIssuesFilterSchema.shape
17870
17894
  },
17871
17895
  // The default lives in the API now, not here (PIPE-D35, Listing issues
@@ -17940,7 +17964,7 @@ function createMcpServer(baseClient, apiBaseUrl, orgInstructions2 = /* @__PURE__
17940
17964
  inputSchema: setStatusInputSchema.shape
17941
17965
  }, (args) => run(() => client2().setStatus(args.issue, args.status)));
17942
17966
  registerStrict("claim_issue", {
17943
- description: "Atomically claim an issue (\xA76 rule 1): succeeds only if unclaimed; under a race exactly one wins and the loser\u2019s error names the current claimer. Claim is orthogonal to status (\xA77).",
17967
+ description: "Atomically claim an issue (\xA76 rule 1): succeeds only if unclaimed; under a race exactly one wins and the loser\u2019s error names the current claimer. Claim is orthogonal to status (\xA77). REFUSED with `reserved_for_person` when an operator has reserved the work for a person: reading and commenting stay open to you, and only the claim is refused. Clearing that mark is a browser-session act, so there is no call here that lifts it \u2014 say in a comment why the work looks agent-eligible and leave the choice to the operator.",
17944
17968
  inputSchema: { issue: issueRefSchema }
17945
17969
  }, (args) => run(() => client2().claimIssue(args.issue)));
17946
17970
  registerStrict("release_issue", {
@@ -18317,7 +18341,7 @@ function loadMcpConfig() {
18317
18341
  }
18318
18342
 
18319
18343
  // src/version.ts
18320
- var VERSION = "0.46.0";
18344
+ var VERSION = "0.47.0";
18321
18345
 
18322
18346
  // src/main.ts
18323
18347
  async function scopedClient(base, org) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pipebrain-mcp",
3
- "version": "0.46.0",
3
+ "version": "0.47.0",
4
4
  "description": "Pipebrain MCP server for Claude Code and Claude Desktop — issues, requirements, decision records, conventions, prompts, content, assets, metadata-only secrets, and more of the platform's modules over the Pipebrain API.",
5
5
  "type": "module",
6
6
  "license": "MIT",