pipebrain-mcp 0.26.0 → 0.28.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 +36 -4
  2. package/package.json +1 -1
package/dist/main.js CHANGED
@@ -15666,6 +15666,17 @@ var getWorkContextInputSchema = external_exports.strictObject({
15666
15666
  }).refine((v) => v.issue === void 0 !== (v.project === void 0), {
15667
15667
  message: "pass exactly one of `issue` or `project` \u2014 an issue names its own project, and passing neither names nothing to read"
15668
15668
  });
15669
+ var openReviewInputSchema = external_exports.strictObject({
15670
+ epic: issueRefSchema.optional(),
15671
+ project: projectRefSchema.optional(),
15672
+ milestone: external_exports.string().min(1, { message: "milestone must not be empty \u2014 name the token the review reads" }).optional()
15673
+ }).refine((v) => {
15674
+ const epicForm = v.epic !== void 0 && v.project === void 0 && v.milestone === void 0;
15675
+ const milestoneForm = v.epic === void 0 && v.project !== void 0 && v.milestone !== void 0;
15676
+ return epicForm !== milestoneForm;
15677
+ }, {
15678
+ message: "pass exactly one of `epic` or `project` + `milestone` \u2014 an epic names its own project and milestone, and passing neither names nothing to review"
15679
+ });
15669
15680
  var claimInputSchema = external_exports.strictObject({
15670
15681
  issue: issueRefSchema
15671
15682
  });
@@ -16019,7 +16030,12 @@ var deleteOrgInstructionInputSchema = external_exports.strictObject({
16019
16030
  });
16020
16031
 
16021
16032
  // ../../libs/domain/dist/instructions.js
16022
- var ISSUE_WRITE_TOOLS = ["create_issue", "update_issue", "promote_feedback"];
16033
+ var ISSUE_WRITE_TOOLS = [
16034
+ "create_issue",
16035
+ "update_issue",
16036
+ "promote_feedback",
16037
+ "open_review"
16038
+ ];
16023
16039
  var INSTRUCTION_SCOPE_TARGETS = {
16024
16040
  general: { kind: "server" },
16025
16041
  requirements: { kind: "tools", tools: ["create_requirement", "update_requirement"] },
@@ -16220,6 +16236,14 @@ var ApiClient = class _ApiClient {
16220
16236
  createIssue(input) {
16221
16237
  return this.request("POST", "/api/v1/issues", { body: input });
16222
16238
  }
16239
+ /**
16240
+ * Opens a completion review (PIPE-217) — `{epic}` or `{project, milestone}`,
16241
+ * exactly one. Returns the created task: a review is an ordinary issue, so this
16242
+ * is the same detail payload the create path returns.
16243
+ */
16244
+ openReview(input) {
16245
+ return this.request("POST", "/api/v1/reviews", { body: input });
16246
+ }
16223
16247
  /** Promotes a feedback issue into a new epic or task (PIPE-143). */
16224
16248
  promoteFeedback(ref, input) {
16225
16249
  return this.request("POST", `/api/v1/issues/${enc(ref)}/promote`, { body: input });
@@ -16576,7 +16600,7 @@ var ApiClient = class _ApiClient {
16576
16600
  // --- the waiting queue -----------------------------------------------------
16577
16601
  /**
16578
16602
  * Every gate awaiting a person across ALL projects of the caller's organisation
16579
- * (PIPE-87): revisions awaiting approval, questions awaiting an answer, and epics
16603
+ * (PIPE-87): revisions awaiting approval, questions awaiting an answer, and work
16580
16604
  * in `verify` with a criterion not yet passed, longest wait first.
16581
16605
  *
16582
16606
  * Takes NO project and NO org: a queue you point at a project is the per-project
@@ -16990,7 +17014,7 @@ Every loose end has one destination, and none of them is prose. Anything you not
16990
17014
  }
16991
17015
  }, (args) => run(() => client2.createProject(args)));
16992
17016
  registerTool("list_waiting", {
16993
- description: "Every gate awaiting a PERSON across ALL projects in the token\u2019s org, longest wait first: a requirement revision awaiting approval, a question awaiting an answer, and an epic in `verify` holding at least one criterion not yet passed. Each entry names its project, the ref the action is taken on (`KEY-R{n}` for a revision, the ISSUE\u2019s `KEY-{n}` for a question or an epic), and `waitingSince` \u2014 the instant the wait began, not a duration. Nothing else is a gate: work in `triage` never appears, and neither does an epic in verify whose criteria have ALL passed. READ-ONLY, and there is no tool on this surface that clears any of the three \u2014 approving a revision, answering a question and marking a manual criterion are all decisions a person takes in the web app. Use it to see what your work is blocked on before asking, rather than to act on it."
17017
+ description: "Every gate awaiting a PERSON across ALL projects in the token\u2019s org, longest wait first: a requirement revision awaiting approval, a question awaiting an answer, and work in `verify` holding at least one criterion not yet passed. Each entry names its project, the ref the action is taken on (`KEY-R{n}` for a revision, the ISSUE\u2019s `KEY-{n}` for a question or for work at verify), and `waitingSince` \u2014 the instant the wait began, not a duration. Nothing else is a gate: work in `triage` never appears, and neither does work in verify whose criteria have ALL passed. READ-ONLY, and there is no tool on this surface that clears any of the three \u2014 approving a revision, answering a question and marking a manual criterion are all decisions a person takes in the web app. Use it to see what your work is blocked on before asking, rather than to act on it."
16994
17018
  // NO arguments — not even an org. Org scope arrives from the token, exactly as
16995
17019
  // it does for `list_projects`, and an org parameter would open a cross-org read
16996
17020
  // path that has no precedent anywhere on this surface. The viewer narrowing the
@@ -17111,6 +17135,14 @@ Every loose end has one destination, and none of them is prose. Anything you not
17111
17135
  ...promoteFeedbackInputSchema.shape
17112
17136
  }
17113
17137
  }, ({ issue: issue2, ...fields }) => run(() => client2.promoteFeedback(issue2, fields)));
17138
+ registerTool("open_review", {
17139
+ description: "Open the COMPLETION REVIEW \u2014 the reading of an epic\u2019s WHOLE accumulated change as one body of work, by a third fresh session that neither built it nor evaluated it. It runs at one moment: once the epic\u2019s contract is green and nothing is left to check, and before anyone sets it `done`. It creates one ORDINARY `task` at `ready` carrying the review checklist as its body \u2014 no new record type. The epic form (`epic`) titles it `Completion review \u2014 <KEY-n> <epic title>`, files it as a CHILD of the epic and inherits the epic\u2019s milestone; the milestone form (`project` + `milestone`) titles it `Completion review \u2014 milestone <token>`, carries that token and has no parent \u2014 nothing here models a milestone as complete. Pass EXACTLY ONE of `epic` or `project` + `milestone`: both, or neither, is refused. One review at a time per scope \u2014 a second is refused (`review_already_open`) NAMING the standing one, so read, finish or kill that task instead \u2014 and a review opens only on an epic (`review_target_not_epic`). NO NEW GATE was added to `done`, and the whole mechanism depends on that: file each finding as ordinary work \u2014 a CHILD OF THE EPIC, a sibling of this review \u2014 and the children clause already on `done` holds the epic open until every finding is done or killed. A finding filed UNDER the review gates nothing, because that gate reads one level deep. Killing the review, or any finding, is the recorded waiver: deliberately ungated, and written to the status history with who did it and through which token. An epic that never opened a review still closes exactly as it did before.",
17140
+ // The WHOLE domain schema rather than its `.shape`, for `get_work_context`'s
17141
+ // reason: the exactly-one-of rule is a refinement on the OBJECT, and a raw
17142
+ // shape drops it — the refusal naming the two forms would never reach the
17143
+ // caller, and both arguments (or neither) would be accepted here.
17144
+ inputSchema: openReviewInputSchema
17145
+ }, (args) => run(() => client2.openReview(args)));
17114
17146
  registerTool("update_issue", {
17115
17147
  description: 'Update any subset of an issue\u2019s title, body, type, priority, milestone, environment, parent (self/cycle rejected), requirement_links (add/remove; adding a link to an unapproved requirement is rejected), deliverable_links (add/remove content-deliverable links, add pins at the current revision), or decision_links (add/remove decision records this work sits under \u2014 `KEY-D{n}`, from `list_decisions`). Changing type to `feedback` is rejected while the issue has criteria (\xA77), since feedback carries none; epic, task and bug interchange freely and the criteria ride along, keeping their AC-{n} numbers and their states. Clearing `milestone` (passing null) is rejected while the issue sits past `triage` \u2014 work already scheduled keeps a milestone (PIPE-R10 rule 9); swap it for a different one, or move the issue back to `triage` first. Cite the decision record a piece of work implements rather than restating what was decided in its body: the record is where the reasoning stays correct, and a body repeating it goes stale the moment the decision is superseded. Link another record by key plus title on first mention; never paste its text into a body \u2014 the source changes, the copy does not, and a stale copy gets built. A decision you need from the operator is filed as a question via `ask_questions`, never written as an "Open questions" heading inside a body \u2014 a heading prompts nobody and records no answer, so a later session cannot tell whether the decision was made. Cross-cutting requirements bind every epic automatically and arrive with `get_issue` \u2014 never restate them in a body and never add them to `requirement_links`; an explicit link pins the linked document\u2019s approved revision.',
17116
17148
  inputSchema: updateIssueInputSchema.shape
@@ -17427,7 +17459,7 @@ function loadMcpConfig() {
17427
17459
  }
17428
17460
 
17429
17461
  // src/version.ts
17430
- var VERSION = "0.26.0";
17462
+ var VERSION = "0.28.0";
17431
17463
 
17432
17464
  // src/main.ts
17433
17465
  var config2 = loadMcpConfig();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pipebrain-mcp",
3
- "version": "0.26.0",
3
+ "version": "0.28.0",
4
4
  "description": "Pipebrain MCP server for Claude Code and Claude Desktop — issues, requirements, content, assets, and metadata-only secrets over the Pipebrain API.",
5
5
  "type": "module",
6
6
  "license": "MIT",