pipebrain-mcp 0.44.1 → 0.46.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.
- package/dist/main.js +31 -8
- package/package.json +1 -1
package/dist/main.js
CHANGED
|
@@ -15402,7 +15402,28 @@ var projectMilestoneSchema = external_exports.object({
|
|
|
15402
15402
|
token: external_exports.string().min(1),
|
|
15403
15403
|
label: external_exports.string().min(1),
|
|
15404
15404
|
position: external_exports.number().int().nonnegative(),
|
|
15405
|
-
active: external_exports.boolean()
|
|
15405
|
+
active: external_exports.boolean(),
|
|
15406
|
+
/**
|
|
15407
|
+
* Retired from the everyday pickers (PIPE-303) — NOT deleted. The row is still
|
|
15408
|
+
* listed here, still holds its token, label and position, and a completion review
|
|
15409
|
+
* still opens against it; only the pickers that offer a milestone to choose stop
|
|
15410
|
+
* offering it. Carried on the wire because this embedded array IS the read surface
|
|
15411
|
+
* for milestones (there is no GET for them), so a picker that could not see the flag
|
|
15412
|
+
* could not honour it.
|
|
15413
|
+
*
|
|
15414
|
+
* OPTIONAL, while the `milestones.archived` COLUMN and the wire rows `libs/db`
|
|
15415
|
+
* builds are both NOT NULL. This is the additive-field tolerance the block comment
|
|
15416
|
+
* at the top of this file states outright, applied where it earns something: the
|
|
15417
|
+
* server always sends the flag, so `undefined` can only mean a response that
|
|
15418
|
+
* predates the column, and "no flag" and "not archived" are the same answer for
|
|
15419
|
+
* every consumer. Requiring it here would instead make a milestone row literal
|
|
15420
|
+
* illegal unless it restates the default — which is a cost paid by every fixture
|
|
15421
|
+
* and caller that has no opinion about archiving, to buy a guarantee the producer
|
|
15422
|
+
* already provides. What actually guards the flag reaching the wire is the projects
|
|
15423
|
+
* integration suite, which reads `archived` off this array and would fail on
|
|
15424
|
+
* `undefined` — a type could not catch a dropped SELECT column anyway.
|
|
15425
|
+
*/
|
|
15426
|
+
archived: external_exports.boolean().optional()
|
|
15406
15427
|
});
|
|
15407
15428
|
var projectDeliverableTargetSchema = external_exports.object({
|
|
15408
15429
|
id: uuidSchema,
|
|
@@ -15442,6 +15463,7 @@ var milestoneSchema = external_exports.object({
|
|
|
15442
15463
|
label: external_exports.string().min(1),
|
|
15443
15464
|
position: external_exports.number().int().nonnegative(),
|
|
15444
15465
|
active: external_exports.boolean(),
|
|
15466
|
+
archived: external_exports.boolean(),
|
|
15445
15467
|
createdAt: external_exports.iso.datetime({ offset: true }),
|
|
15446
15468
|
updatedAt: external_exports.iso.datetime({ offset: true }),
|
|
15447
15469
|
deletedAt: external_exports.iso.datetime({ offset: true }).nullable()
|
|
@@ -17677,7 +17699,7 @@ function createMcpServer(baseClient, apiBaseUrl, orgInstructions2 = /* @__PURE__
|
|
|
17677
17699
|
run(() => client2().unscoped().listOrgs(), GUIDANCE_POINTER)
|
|
17678
17700
|
));
|
|
17679
17701
|
registerStrict("list_projects", {
|
|
17680
|
-
description: "List all projects with their key, environments, milestones (token, label, active), deliverable targets (slug, label, active), and open-issue counts \u2014 the project switcher and workflow entry point (\xA77).",
|
|
17702
|
+
description: "List all projects with their key, environments, milestones (token, label, active, archived \u2014 an archived milestone is a finished release retired from the pickers used to schedule work, still valid on every issue that already names it), deliverable targets (slug, label, active), and open-issue counts \u2014 the project switcher and workflow entry point (\xA77).",
|
|
17681
17703
|
// Optional pagination (§9) — bounds mirror list_issues/list_requirements; the
|
|
17682
17704
|
// server defaults limit to 200 (max 500) and passes limit/offset as query params.
|
|
17683
17705
|
inputSchema: {
|
|
@@ -17781,13 +17803,14 @@ function createMcpServer(baseClient, apiBaseUrl, orgInstructions2 = /* @__PURE__
|
|
|
17781
17803
|
}
|
|
17782
17804
|
}, ({ project, ...input }) => run(() => client2().createMilestone(project, input)));
|
|
17783
17805
|
registerStrict("update_milestone", {
|
|
17784
|
-
description: "Rename or
|
|
17806
|
+
description: "Rename, reorder, archive or restore a milestone, addressed by its token (e.g. `M1`) or uuid. Supply at least one of `token`, `label`, `position`, or `archived` \u2014 an empty edit is rejected. Renaming the `token` does NOT rewrite issues pointing at the old one (`issues.milestone` is a loose ref), so prefer changing `label`. `archived: true` retires a finished release from the everyday pickers WITHOUT deleting it \u2014 the row keeps its token, label and position, issues carrying the token are untouched, and a completion review still opens against it; `archived: false` restores it. The project\u2019s ACTIVE milestone cannot be archived (refused `milestone_active` \u2014 make another milestone active first), and an archived one cannot be activated (refused `milestone_archived` \u2014 restore it first). Use set_active_milestone to change `active` (\xA77).",
|
|
17785
17807
|
inputSchema: {
|
|
17786
17808
|
project: projectKeySchema,
|
|
17787
17809
|
milestone: external_exports.string().min(1),
|
|
17788
17810
|
token: external_exports.string().min(1).optional(),
|
|
17789
17811
|
label: external_exports.string().min(1).optional(),
|
|
17790
|
-
position: external_exports.number().int().nonnegative().optional()
|
|
17812
|
+
position: external_exports.number().int().nonnegative().optional(),
|
|
17813
|
+
archived: external_exports.boolean().optional()
|
|
17791
17814
|
}
|
|
17792
17815
|
}, ({ project, milestone, ...fields }) => run(async () => client2().updateMilestone(project, await resolveMilestoneId(client2(), project, milestone), fields)));
|
|
17793
17816
|
registerStrict("set_active_milestone", {
|
|
@@ -17886,7 +17909,7 @@ function createMcpServer(baseClient, apiBaseUrl, orgInstructions2 = /* @__PURE__
|
|
|
17886
17909
|
})
|
|
17887
17910
|
), GUIDANCE_POINTER));
|
|
17888
17911
|
registerStrict("create_issue", {
|
|
17889
|
-
description: "Create an issue (epic/task/bug/feedback). Omitted status defaults to triage (still subject to \xA76 guards); omitted environment resolves explicit \u2192 parent\u2019s environment \u2192 project default (prod). Optional parent (a parent already `done` or `killed` is rejected `parent_terminal`, unless the child is itself terminal; a new issue is a leaf, so no cycle is possible here), priority, milestone, requirement_links (pins each at its approved revision; a target with no approved revision is rejected), deliverable_links (content deliverables like DWB-C3/bsky \u2014 pins each at its current revision; the promotion path), and ordered {text, verification, howTo} criteria (\xA77). A `status` other than `triage` or `killed` REQUIRES `milestone` (PIPE-R10 rule 9): work past triage belongs to a release, and the create is refused (`milestone_required`) without one. A `manual` criterion must carry `howTo` \u2014 one or two sentences saying where to look, what to do, and what counts as passing; writing or changing one without it is refused (`how_to_required`), and so is supplying it on an `auto` criterion, which a machine checks. Work of any kind carries criteria \u2014 an epic, a task, a bug alike \u2014 with feedback the one exception, refused with `criteria_not_supported` because it is a report rather than agreed work; `promote_feedback` retypes it into work before anything is built. When a bug is filed against a defined acceptance criterion, pass that criterion\u2019s uuid as `criterionId` and the bug records which criterion it was filed against \u2014 what has already been reported arrives as `filedBugs` on every criteria read. Filing a second bug against one criterion is supported: one row can fail for two different reasons at once. Bugs only: any other type naming a criterion is refused (`criterion_requires_bug`). Writing guidance for this tool lives in the product doctrine, which `get_work_context` returns \u2014 see \u201CSearch before you create\u201D and \u201CThe bar for filing a bug\u201D.",
|
|
17912
|
+
description: "Create an issue (epic/task/bug/feedback). Omitted status defaults to triage (still subject to \xA76 guards); omitted environment resolves explicit \u2192 parent\u2019s environment \u2192 project default (prod). Optional parent (a parent already `done` or `killed` is rejected `parent_terminal`, unless the child is itself terminal; a new issue is a leaf, so no cycle is possible here), priority, milestone, requirement_links (pins each at its approved revision; a target with no approved revision is rejected), deliverable_links (content deliverables like DWB-C3/bsky \u2014 pins each at its current revision; the promotion path), and ordered {text, verification, howTo} criteria (\xA77). A `status` other than `triage` or `killed` REQUIRES `milestone` (PIPE-R10 rule 9): work past triage belongs to a release, and the create is refused (`milestone_required`) without one. An open child moves the parent to `in_progress` (rule 10). A `manual` criterion must carry `howTo` \u2014 one or two sentences saying where to look, what to do, and what counts as passing; writing or changing one without it is refused (`how_to_required`), and so is supplying it on an `auto` criterion, which a machine checks. Work of any kind carries criteria \u2014 an epic, a task, a bug alike \u2014 with feedback the one exception, refused with `criteria_not_supported` because it is a report rather than agreed work; `promote_feedback` retypes it into work before anything is built. When a bug is filed against a defined acceptance criterion, pass that criterion\u2019s uuid as `criterionId` and the bug records which criterion it was filed against \u2014 what has already been reported arrives as `filedBugs` on every criteria read. Filing a second bug against one criterion is supported: one row can fail for two different reasons at once. Bugs only: any other type naming a criterion is refused (`criterion_requires_bug`). Writing guidance for this tool lives in the product doctrine, which `get_work_context` returns \u2014 see \u201CSearch before you create\u201D and \u201CThe bar for filing a bug\u201D.",
|
|
17890
17913
|
inputSchema: createIssueInputSchema.shape
|
|
17891
17914
|
}, (args) => run(() => client2().createIssue(args)));
|
|
17892
17915
|
registerStrict("promote_feedback", {
|
|
@@ -17897,7 +17920,7 @@ function createMcpServer(baseClient, apiBaseUrl, orgInstructions2 = /* @__PURE__
|
|
|
17897
17920
|
}
|
|
17898
17921
|
}, ({ issue: issue2, ...fields }) => run(() => client2().promoteFeedback(issue2, fields)));
|
|
17899
17922
|
registerStrict("open_review", {
|
|
17900
|
-
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 before anyone sets it `done`. It creates one ORDINARY `task` at `ready` carrying the review checklist as its body. 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. 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. The scopes overlap ONE way: the epic form\u2019s review also stands for that same project and milestone, so a later milestone-form open is refused; a milestone-form review blocks no epic-form open. A review opens only on a non-terminal epic \u2014 `review_target_not_epic` otherwise, `review_target_terminal` on a `done`/`killed` epic (a re-opened epic reviews again). NO NEW GATE was added to `done`: 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. Writing guidance for the checklist and for each finding lives in the product doctrine, which `get_work_context` returns.",
|
|
17923
|
+
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 before anyone sets it `done`. It creates one ORDINARY `task` at `ready` carrying the review checklist as its body. 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. 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. The scopes overlap ONE way: the epic form\u2019s review also stands for that same project and milestone, so a later milestone-form open is refused; a milestone-form review blocks no epic-form open. A review opens only on a non-terminal epic \u2014 `review_target_not_epic` otherwise, `review_target_terminal` on a `done`/`killed` epic (a re-opened epic reviews again). NO NEW GATE was added to `done`: 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. THIS CALL MOVES NOTHING. Attaching an open child otherwise starts its parent (PIPE-R10 rule 10); this one is exempt, because the review is the gate \u2014 starting the work again would drop it out of `list_waiting`. Writing guidance for the checklist and for each finding lives in the product doctrine, which `get_work_context` returns.",
|
|
17901
17924
|
// The WHOLE domain schema rather than its `.shape`, for `get_work_context`'s
|
|
17902
17925
|
// reason: the exactly-one-of rule is a refinement on the OBJECT, and a raw
|
|
17903
17926
|
// shape drops it — the refusal naming the two forms would never reach the
|
|
@@ -17905,7 +17928,7 @@ function createMcpServer(baseClient, apiBaseUrl, orgInstructions2 = /* @__PURE__
|
|
|
17905
17928
|
inputSchema: openReviewInputSchema
|
|
17906
17929
|
}, (args) => run(() => client2().openReview(args)));
|
|
17907
17930
|
registerStrict("update_issue", {
|
|
17908
|
-
description: "Update any subset of an issue\u2019s title, body, type, priority, milestone, environment, parent (self/cycle rejected, and moving an OPEN issue onto a parent already `done` or `killed` is rejected with `parent_terminal` \u2014 clearing the parent with null is always allowed), 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. Writing guidance for this tool lives in the product doctrine, which `get_work_context` returns \u2014 see \u201CLink by key; never paste another record\u2019s text\u201D and \u201CA decision you need is filed as a question, never written into a body\u201D.",
|
|
17931
|
+
description: "Update any subset of an issue\u2019s title, body, type, priority, milestone, environment, parent (self/cycle rejected, and moving an OPEN issue onto a parent already `done` or `killed` is rejected with `parent_terminal` \u2014 clearing the parent with null is always allowed), 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. Setting `parent` ATTACHES the issue, and attaching an OPEN issue starts its new parent: a parent of any type moves to `in_progress`, recorded in that parent\u2019s status history against you and the credential you called with (PIPE-R10 rule 10). Nothing moves it back. Three attachments start nothing: an issue that is already `done` or `killed`; re-sending the parent an issue already has; and a parent that cannot legally hold `in_progress` \u2014 one that is blocked, or carries no milestone \u2014 which KEEPS the status it has and still takes the child, so a finding stays fileable against exactly that work. Writing guidance for this tool lives in the product doctrine, which `get_work_context` returns \u2014 see \u201CLink by key; never paste another record\u2019s text\u201D and \u201CA decision you need is filed as a question, never written into a body\u201D.",
|
|
17909
17932
|
inputSchema: updateIssueInputSchema.shape
|
|
17910
17933
|
}, ({ issue: issue2, ...fields }) => run(() => client2().updateIssue(issue2, fields)));
|
|
17911
17934
|
registerStrict("set_issue_header", {
|
|
@@ -18294,7 +18317,7 @@ function loadMcpConfig() {
|
|
|
18294
18317
|
}
|
|
18295
18318
|
|
|
18296
18319
|
// src/version.ts
|
|
18297
|
-
var VERSION = "0.
|
|
18320
|
+
var VERSION = "0.46.0";
|
|
18298
18321
|
|
|
18299
18322
|
// src/main.ts
|
|
18300
18323
|
async function scopedClient(base, org) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pipebrain-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.46.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",
|