pipebrain-mcp 0.51.0 → 0.53.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 +88 -15
- package/package.json +1 -1
package/dist/main.js
CHANGED
|
@@ -383,7 +383,7 @@ var AGENT_CONFIG_ENTRIES = [
|
|
|
383
383
|
{ target: "skills/capture-correction/SKILL.md", sha256: "907ee8fc8e7ea15c8296acd23a816e1f9c6454edcf37a93f18af79b1c542fb75" },
|
|
384
384
|
{ target: "skills/pipebrain-header-pass/SKILL.md", sha256: "10545e3c1c5215b031e1c76281e65cd2ecf7420b3f07a4221824591a8263c5fc" },
|
|
385
385
|
{ target: "skills/pipebrain-secrets/SKILL.md", sha256: "52c2136a3cca5612981d50b926195eae3e804911e1e9723dd5eba76e66b52d6f" },
|
|
386
|
-
{ target: "skills/pipebrain-work-session/SKILL.md", sha256: "
|
|
386
|
+
{ target: "skills/pipebrain-work-session/SKILL.md", sha256: "d65dd271e1fef00bc583eac1cab5007d7c156a43b40ee1698aef1d88e9ae78f9" },
|
|
387
387
|
{ target: "skills/pipebrain-writing/SKILL.md", sha256: "8e5ed4636afcca0cacc220d8fa5310364d2d6854a9fc68ffa03e4c428989f8b8" },
|
|
388
388
|
{ target: "skills/pipebrain/SKILL.md", sha256: "9fdad1b78bb506e9cd91ba55f4baee0adc5f4d2c5d9d418d0e8c922554e8df74" },
|
|
389
389
|
{ target: "skills/requirements-altitude/SKILL.md", sha256: "60d1916da22a52138c046fcf4e5cd4cc420b7a5679a6652eb76573b7a69a1cf4" }
|
|
@@ -505,7 +505,7 @@ function apiBindingLabel(apiBaseUrl) {
|
|
|
505
505
|
}
|
|
506
506
|
|
|
507
507
|
// ../../libs/agent-shared/dist/doctrine.js
|
|
508
|
-
var DOCTRINE = "# Pipebrain doctrine\n\nHow an agent works inside Pipebrain. These rules ship with the product and are the same in every organization. Each one protects something the product guarantees.\n\n## How to write here\n\nThe person reading what you write is the operator, deciding something. They have about two minutes. Put the point first. Use short sentences and ordinary words. Headings and bullets are fine. Explain why once, not under every bullet.\n\nA criterion is one sentence: a concrete situation, and what must be true afterward. If you need a general rule, write two or three criteria instead.\n\nEvidence on a criterion opens with the verdict, then how you drove it, then what it does not cover. Keep it to one screen; name the test or command, not every file you read.\n\nA closing comment says what landed, what did not and why, what you filed by key, and whether the tests are green.\n\nAnything else you notice goes to a question, when the operator has to choose; to a new issue at triage, when it is real work; or, most often, nowhere. Never add a notes, caveats, or next-steps section. An item filed and repeated in prose gets triaged twice.\n\nYour organization may add its own writing rules below this document. Most have none.\n\n## Search before you create\n\nLook for an existing record before you add one. A duplicate splits one record's history across two keys, and nothing merges them later. Update or link the record you find.\n\n## Link by key, never paste\n\nRefer to a requirement, decision, or issue by its key. Never paste its text into a body. When the source changes the copy stays stale, and the stale copy is what gets built.\n\n## Most choices are yours\n\nInside an approved requirement you choose the design, the libraries, and the order of work. Ask only when a choice changes what a user sees, costs money, or contradicts a requirement; file that one as a question. Asking about everything makes real questions wait behind choices that were yours. A technical choice worth keeping goes in a decision record.\n\n## File decisions as questions\n\nAn open decision goes in a question on the issue, filed with `ask_questions` and carrying the options you propose. It does not belong in a body, under a heading or in a field. Prose asks nobody and records no answer, so a later session cannot tell whether it was ever decided. If your own work settles a question, answer it with `answer_question` \u2014 the answer is worth keeping, and withdrawing throws it away. Withdraw only a question that should never have been asked.\n\n## Cross-cutting requirements arrive on their own\n\nThey bind every epic and come back with a work-item read, at their latest approved revision. Never restate them in a body and never add them as explicit requirement links. A copy drifts, and an explicit link pins one revision where the read delivers the newest.\n\n## Conventions need a person's approval\n\nApproved conventions come back with the same work-item read and bind every project in the organization. Never restate one in a body and never add one as an explicit link; a copy goes stale.\n\nA convention you create or amend over the agent surface is a proposal. It is not in force until a person approves it in a browser. Until then, do not work from your own unapproved wording.\n\nA statement that stops being true when this project ends is a cross-cutting requirement. One still true on the next project is a convention. File one when an evaluator rejects work or a criterion fails, and rarely otherwise: each reaches every read, after a person reviews it.\n\n## Choosing auto or manual\n\nFirst find out what this project can drive end to end, and with which command. A criterion is `auto` when an evaluator can drive the input and read the result on the running system, including an interface where a browser harness exists. Only the evaluator's own run qualifies it; a test the implementer wrote does not. An auto criterion nobody can drive never gets evidence.\n\nMark a criterion `manual` only when the verdict needs a person's judgment. A manual row a machine could have checked holds the issue open until a person gets to it. If you cannot say how to drive a criterion, it is worded too vaguely; reword it against something observable. A manual criterion carries instructions for a stranger to the code.\n\nA manual criterion with no recorded artifact is the human gate working as designed, and not a finding.\n\nThis choice also decides who can finish the work. What gates finishing is the work rather than the caller \u2014 the status tool names what the gate reads, and the server never asks who is calling. A manual row is the one a credential cannot pass, so work carrying one waits for a person; work whose criteria are all machine-checked does not, and the session that has just passed them can set it done.\n\n## The bar for filing a bug\n\nFile a bug only when the behavior breaks an approved requirement or a defined acceptance criterion, and name which one first. Everything else, including unclear code and edge cases nobody specified, is feedback or nothing. A queue that mixes defects with taste has to be read in full before any of it can be trusted.\n\n## A decision record is written once\n\nA decision record says what was decided and why, at the time. A proposed record is still being written: correct it with `update_decision`, and accept it once it says what you decided. An accepted record is settled, so never edit one; write a superseding record instead. The chain of records shows how the thinking changed, and an edit destroys it. Read existing records before reopening a settled question.\n\n## A secret value never travels in a tool call\n\nNo tool returns a secret value, by design, and none should receive one. A value in a tool call is in the transcript before the server can encrypt it; the only remedy is rotation. Set values with the command-line tool, from a file or standard input, and inject at run time.\n\n## Setting an instruction replaces the whole body\n\nThere is no partial update. An instruction write stores exactly the body you supply and discards everything that was there. Read the live value, compose the complete replacement, write it, then read it again to confirm what landed.\n\nThis guidance and the tool descriptions are a snapshot from the session's start; an edit reaches the next session, never this one. `list_org_instructions` returns the saved rows as they are now; that is the confirming read.\n";
|
|
508
|
+
var DOCTRINE = "# Pipebrain doctrine\n\nHow an agent works inside Pipebrain. These rules ship with the product and are the same in every organization. Each one protects something the product guarantees.\n\n## How to write here\n\nThe person reading what you write is the operator, deciding something. They have about two minutes. Put the point first. Use short sentences and ordinary words. Headings and bullets are fine. Explain why once, not under every bullet.\n\nA criterion is one sentence: a concrete situation, and what must be true afterward. If you need a general rule, write two or three criteria instead.\n\nEvidence on a criterion opens with the verdict, then how you drove it, then what it does not cover. Keep it to one screen; name the test or command, not every file you read.\n\nA closing comment says what landed, what did not and why, what you filed by key, and whether the tests are green.\n\nAnything else you notice goes to a question, when the operator has to choose; to a new issue at triage, when it is real work; or, most often, nowhere. Never add a notes, caveats, or next-steps section. An item filed and repeated in prose gets triaged twice.\n\nYour organization may add its own writing rules below this document. Most have none.\n\n## Search before you create\n\nLook for an existing record before you add one. A duplicate splits one record's history across two keys, and nothing merges them later. Update or link the record you find.\n\n## Link by key, never paste\n\nRefer to a requirement, decision, or issue by its key. Never paste its text into a body. When the source changes the copy stays stale, and the stale copy is what gets built.\n\n## Most choices are yours\n\nInside an approved requirement you choose the design, the libraries, and the order of work. Ask only when a choice changes what a user sees, costs money, or contradicts a requirement; file that one as a question. Asking about everything makes real questions wait behind choices that were yours. A technical choice worth keeping goes in a decision record.\n\n## A branch and a worktree are derived from the issue\n\nReading an issue's work context returns its branch, its base and its worktree already resolved, each saying where it came from, and how the work leaves the branch. A value the issue, its ancestors and its project all leave unset is derived: the branch and the worktree label are the issue's display id in lower case, which is the project key, a hyphen and the number, and the base is main, which a project changes in its settings. Two sessions reading one issue compute the same names, so a session resuming abandoned work finds what the session before it used. Reading a project returns the work you could pick up and no placement, because no issue has been chosen yet.\n\nClaim the work naming the branch and the worktree you were given. Naming them is what reserves them: a claim is refused when another live claim in the project already holds either. A field you leave out keeps whatever the issue already records, so a claim that names nothing on an issue that records nothing reserves nothing, and a second session is free to take the same tree.\n\nA worktree is a label, not a path. Whoever runs the session maps that label to a directory, because a path recorded here would be true only on the machine that wrote it. Create a working tree when nothing on this machine answers to the label, and reuse the one already there when something does; a branch checked out in one tree cannot be checked out in another. Only the machine can answer that. What the placement tells you is a different thing worth knowing, and it says it for the branch and the worktree separately: whether another issue in this project is already placed on that same value, so you can see whether you are joining work or starting it.\n\nA claim you find under your own session identifier is work to resume rather than work to start. Read what the issue records, look at what the tree holds, and carry on from there. Claiming it again is refused, and starting it again abandons whatever the earlier session left.\n\nA working tree holding uncommitted changes is never removed. Report it and leave it alone. Nothing can tell deliberate work from residue, and removing it cannot be undone.\n\nWork in the working tree you reserved, never in a checkout another session may be using; a tree of its own is what lets a session run beside others. The placement you are given, resolved through the issue, its ancestors and the project's settings, is the default for every session, and only the repository's own agent instructions override it: where they dictate one branch and no working trees, or where the branch you are given is the base itself, work in the checkout on that branch, and claim naming the branch and tree you will actually use, so the record says where the work really is.\n\nHow the work leaves the branch is the project's choice too, set in its settings and returned with the placement as one of three values, and it is acted on once the work is green and committed, not before. `pull_request`: push the branch and open a pull request against the base, and leave the merge to a person; where the branch is the base itself there is nothing to open it from, so the session acts as `none` and says so. `push`: merge the branch into the base and push the base, so the work lands with no review step; a merge that cannot complete cleanly is a blocker, never a partial push. `none`: the work stays committed on its branch, and the session pushes, merges and opens nothing; the operator takes it from there. When the session ends and the work has left the branch or is waiting on it, release the claim: the placement stays on the issue, and the tree stays where it is. A session that ends blocked keeps its claim, because the tree may hold uncommitted work and the claim is what tells the next session on that machine to resume it rather than start beside it.\n\n## File decisions as questions\n\nAn open decision goes in a question on the issue, filed with `ask_questions` and carrying the options you propose. It does not belong in a body, under a heading or in a field. Prose asks nobody and records no answer, so a later session cannot tell whether it was ever decided. If your own work settles a question, answer it with `answer_question` \u2014 the answer is worth keeping, and withdrawing throws it away. Withdraw only a question that should never have been asked.\n\n## Cross-cutting requirements arrive on their own\n\nThey bind every epic and come back with a work-item read, at their latest approved revision. Never restate them in a body and never add them as explicit requirement links. A copy drifts, and an explicit link pins one revision where the read delivers the newest.\n\n## Conventions need a person's approval\n\nApproved conventions come back with the same work-item read and bind every project in the organization. Never restate one in a body and never add one as an explicit link; a copy goes stale.\n\nA convention you create or amend over the agent surface is a proposal. It is not in force until a person approves it in a browser. Until then, do not work from your own unapproved wording.\n\nA statement that stops being true when this project ends is a cross-cutting requirement. One still true on the next project is a convention. File one when an evaluator rejects work or a criterion fails, and rarely otherwise: each reaches every read, after a person reviews it.\n\n## Choosing auto or manual\n\nFirst find out what this project can drive end to end, and with which command. A criterion is `auto` when an evaluator can drive the input and read the result on the running system, including an interface where a browser harness exists. Only the evaluator's own run qualifies it; a test the implementer wrote does not. An auto criterion nobody can drive never gets evidence.\n\nMark a criterion `manual` only when the verdict needs a person's judgment. A manual row a machine could have checked holds the issue open until a person gets to it. If you cannot say how to drive a criterion, it is worded too vaguely; reword it against something observable. A manual criterion carries instructions for a stranger to the code.\n\nA manual criterion with no recorded artifact is the human gate working as designed, and not a finding.\n\nThis choice also decides who can finish the work. What gates finishing is the work rather than the caller \u2014 the status tool names what the gate reads, and the server never asks who is calling. A manual row is the one a credential cannot pass, so work carrying one waits for a person; work whose criteria are all machine-checked does not, and the session that has just passed them can set it done.\n\n## The bar for filing a bug\n\nFile a bug only when the behavior breaks an approved requirement or a defined acceptance criterion, and name which one first. Everything else, including unclear code and edge cases nobody specified, is feedback or nothing. A queue that mixes defects with taste has to be read in full before any of it can be trusted.\n\n## A decision record is written once\n\nA decision record says what was decided and why, at the time. A proposed record is still being written: correct it with `update_decision`, and accept it once it says what you decided. An accepted record is settled, so never edit one; write a superseding record instead. The chain of records shows how the thinking changed, and an edit destroys it. Read existing records before reopening a settled question.\n\n## A secret value never travels in a tool call\n\nNo tool returns a secret value, by design, and none should receive one. A value in a tool call is in the transcript before the server can encrypt it; the only remedy is rotation. Set values with the command-line tool, from a file or standard input, and inject at run time.\n\n## Setting an instruction replaces the whole body\n\nThere is no partial update. An instruction write stores exactly the body you supply and discards everything that was there. Read the live value, compose the complete replacement, write it, then read it again to confirm what landed.\n\nThis guidance and the tool descriptions are a snapshot from the session's start; an edit reaches the next session, never this one. `list_org_instructions` returns the saved rows as they are now; that is the confirming read.\n";
|
|
509
509
|
|
|
510
510
|
// ../../libs/agent-shared/dist/org-reference.js
|
|
511
511
|
var CANONICAL_UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
@@ -15058,6 +15058,7 @@ var issueStatusSchema = external_exports.enum([
|
|
|
15058
15058
|
"done",
|
|
15059
15059
|
"killed"
|
|
15060
15060
|
]);
|
|
15061
|
+
var integrationModeSchema = external_exports.enum(["pull_request", "push", "none"]);
|
|
15061
15062
|
var OPEN_STATUSES = [
|
|
15062
15063
|
"triage",
|
|
15063
15064
|
"backlog",
|
|
@@ -15184,6 +15185,7 @@ var deliverableTargetLabelSchema = external_exports.string().min(1, { message: "
|
|
|
15184
15185
|
var projectNameSchema = external_exports.string().min(1, { message: "project name must not be empty" });
|
|
15185
15186
|
var tokenLabelSchema = external_exports.string().min(1, { message: "token label must not be empty" });
|
|
15186
15187
|
var contentMetadataSchema = external_exports.record(external_exports.string(), external_exports.unknown());
|
|
15188
|
+
var sessionIdSchema = external_exports.string().min(1, { message: "session must not be empty \u2014 omit it to read without a session" });
|
|
15187
15189
|
|
|
15188
15190
|
// ../../libs/domain/dist/display-id.js
|
|
15189
15191
|
var DisplayIdError = class extends Error {
|
|
@@ -15442,7 +15444,28 @@ var projectSchema = external_exports.object({
|
|
|
15442
15444
|
environments: external_exports.array(projectEnvironmentSchema),
|
|
15443
15445
|
milestones: external_exports.array(projectMilestoneSchema),
|
|
15444
15446
|
deliverableTargets: external_exports.array(projectDeliverableTargetSchema),
|
|
15445
|
-
openIssueCount: external_exports.number().int().nonnegative()
|
|
15447
|
+
openIssueCount: external_exports.number().int().nonnegative(),
|
|
15448
|
+
/**
|
|
15449
|
+
* What an issue's placement falls back to when neither it nor any ancestor carries a
|
|
15450
|
+
* value (PIPE-444). A person edits these in project settings; agents never write them,
|
|
15451
|
+
* which is what keeps one writer per field (PIPE-D46).
|
|
15452
|
+
*
|
|
15453
|
+
* `.nullable()` and REQUIRED, like `defaultEnvironmentId` above rather than optional
|
|
15454
|
+
* like the issue header fields: the columns exist on every project and the wire mapper
|
|
15455
|
+
* sends all three on every row, so an absent key would mean a server predating them
|
|
15456
|
+
* while `null` means this project sets no default. Optional would make those two
|
|
15457
|
+
* indistinguishable.
|
|
15458
|
+
*/
|
|
15459
|
+
defaultBranch: external_exports.string().nullable(),
|
|
15460
|
+
defaultWorktree: external_exports.string().nullable(),
|
|
15461
|
+
defaultBase: external_exports.string().nullable(),
|
|
15462
|
+
/**
|
|
15463
|
+
* How work leaves its branch (PIPE-445). NOT nullable, unlike the three above: those
|
|
15464
|
+
* are nullable because null there means "ask the next level up" and the walk is the
|
|
15465
|
+
* feature. There is no walk here — the value is read from the project and nowhere
|
|
15466
|
+
* else — so a null could only mean "no answer", and work context has to return one.
|
|
15467
|
+
*/
|
|
15468
|
+
defaultIntegrationMode: integrationModeSchema
|
|
15446
15469
|
});
|
|
15447
15470
|
var environmentSchema = external_exports.object({
|
|
15448
15471
|
id: uuidSchema,
|
|
@@ -16041,7 +16064,20 @@ var updateIssueInputSchema = external_exports.strictObject({
|
|
|
16041
16064
|
parent: issueRefSchema.nullable().optional(),
|
|
16042
16065
|
requirementLinks: requirementLinkChangesSchema.optional(),
|
|
16043
16066
|
deliverableLinks: deliverableLinkChangesSchema.optional(),
|
|
16044
|
-
decisionLinks: decisionLinkChangesSchema.optional()
|
|
16067
|
+
decisionLinks: decisionLinkChangesSchema.optional(),
|
|
16068
|
+
/**
|
|
16069
|
+
* Where the work happens (PIPE-444) — this is the placement write. An agent records
|
|
16070
|
+
* here what a claim did not name, or corrects what it did.
|
|
16071
|
+
*
|
|
16072
|
+
* `.nullable().optional()`, like `milestone` and `parent` above: omitting a field
|
|
16073
|
+
* leaves it, and passing `null` CLEARS the issue's own value so it falls back to the
|
|
16074
|
+
* nearest ancestor carrying one and then to the project default. The two are different
|
|
16075
|
+
* asks and a schema that could not tell them apart would make an issue's own value
|
|
16076
|
+
* impossible to remove.
|
|
16077
|
+
*/
|
|
16078
|
+
branch: external_exports.string().min(1, { message: "branch must not be empty \u2014 pass null to clear it" }).nullable().optional().describe("The branch this issue\u2019s work happens on. Pass null to clear it, so the issue inherits from the nearest ancestor carrying one and then from the project default."),
|
|
16079
|
+
worktree: external_exports.string().min(1, { message: "worktree must not be empty \u2014 pass null to clear it" }).nullable().optional().describe("A label for the working tree this issue\u2019s work happens in \u2014 never a path, which is true only on the machine that wrote it. Pass null to clear it."),
|
|
16080
|
+
base: external_exports.string().min(1, { message: "base must not be empty \u2014 pass null to clear it" }).nullable().optional().describe("What this issue\u2019s work integrates into. Pass null to clear it, so the issue inherits from its chain and then from the project default.")
|
|
16045
16081
|
});
|
|
16046
16082
|
var ISSUE_SUMMARY_MAX = 350;
|
|
16047
16083
|
function inPlainWords(schema, field) {
|
|
@@ -16079,7 +16115,18 @@ var getIssueInputSchema = external_exports.strictObject({
|
|
|
16079
16115
|
});
|
|
16080
16116
|
var getWorkContextInputSchema = external_exports.strictObject({
|
|
16081
16117
|
issue: issueRefSchema.optional(),
|
|
16082
|
-
project: projectRefSchema.optional()
|
|
16118
|
+
project: projectRefSchema.optional(),
|
|
16119
|
+
/**
|
|
16120
|
+
* The reader's own agent session (PIPE-443). It narrows the project form's
|
|
16121
|
+
* `available` list to work no OTHER session of the same person is holding.
|
|
16122
|
+
*
|
|
16123
|
+
* Accepted on BOTH forms rather than refused alongside `issue`, even though the item
|
|
16124
|
+
* form returns no list for it to narrow. A session that knows its own identifier
|
|
16125
|
+
* passes it on every call it makes; refusing it here would make that one call the
|
|
16126
|
+
* exception and buy nothing, since naming a session cannot change what an item read
|
|
16127
|
+
* returns.
|
|
16128
|
+
*/
|
|
16129
|
+
session: sessionIdSchema.optional()
|
|
16083
16130
|
}).refine((v) => v.issue === void 0 !== (v.project === void 0), {
|
|
16084
16131
|
message: "pass exactly one of `issue` or `project` \u2014 an issue names its own project, and passing neither names nothing to read"
|
|
16085
16132
|
});
|
|
@@ -16095,7 +16142,12 @@ var openReviewInputSchema = external_exports.strictObject({
|
|
|
16095
16142
|
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"
|
|
16096
16143
|
});
|
|
16097
16144
|
var claimInputSchema = external_exports.strictObject({
|
|
16098
|
-
issue: issueRefSchema
|
|
16145
|
+
issue: issueRefSchema,
|
|
16146
|
+
session: sessionIdSchema.optional(),
|
|
16147
|
+
branch: external_exports.string().min(1, { message: "branch must not be empty \u2014 omit it to keep the branch already recorded" }).optional(),
|
|
16148
|
+
worktree: external_exports.string().min(1, {
|
|
16149
|
+
message: "worktree must not be empty \u2014 omit it to keep the worktree already recorded"
|
|
16150
|
+
}).optional()
|
|
16099
16151
|
});
|
|
16100
16152
|
var setBlockedInputSchema = external_exports.strictObject({
|
|
16101
16153
|
issue: issueRefSchema,
|
|
@@ -16273,6 +16325,17 @@ var listIssuesFilterSchema = external_exports.strictObject({
|
|
|
16273
16325
|
// the same reason `blocked` is one — a filter the server quietly dropped returns
|
|
16274
16326
|
// everything and reads exactly like one that matched everything.
|
|
16275
16327
|
needsHeader: external_exports.boolean().optional(),
|
|
16328
|
+
/**
|
|
16329
|
+
* The reader's own agent session (PIPE-443). Naming one drops every issue held under a
|
|
16330
|
+
* DIFFERENT session identifier, so an operator running several agents against one
|
|
16331
|
+
* repository stops having each of them offered the work the others hold. Omitting it
|
|
16332
|
+
* is today's behaviour exactly: a person in a browser has no session, and their own
|
|
16333
|
+
* claims stay in the list.
|
|
16334
|
+
*
|
|
16335
|
+
* An issue whose claim named no session is never dropped by this, whichever session
|
|
16336
|
+
* asks — the filter narrows to sessions that said who they were.
|
|
16337
|
+
*/
|
|
16338
|
+
session: sessionIdSchema.optional(),
|
|
16276
16339
|
// Pagination — server default 200, max 500 (§9); default applied server-side.
|
|
16277
16340
|
limit: external_exports.number().int().min(1, { message: "limit must be at least 1" }).max(500, { message: "limit must be at most 500" }).optional(),
|
|
16278
16341
|
offset: external_exports.number().int().nonnegative().optional()
|
|
@@ -16777,8 +16840,16 @@ var ApiClient = class _ApiClient {
|
|
|
16777
16840
|
updateIssue(ref, fields) {
|
|
16778
16841
|
return this.request("PATCH", `/api/v1/issues/${enc(ref)}`, { body: fields });
|
|
16779
16842
|
}
|
|
16780
|
-
|
|
16781
|
-
|
|
16843
|
+
/**
|
|
16844
|
+
* Claims an issue, optionally reserving where the work happens (PIPE-442). A field
|
|
16845
|
+
* `placement` omits keeps whatever the issue already recorded; the call never clears
|
|
16846
|
+
* one. Refused 409 `placement_conflict` when another live claim in the project holds
|
|
16847
|
+
* the branch or the worktree.
|
|
16848
|
+
*/
|
|
16849
|
+
claimIssue(ref, placement) {
|
|
16850
|
+
return this.request("POST", `/api/v1/issues/${enc(ref)}/claim`, {
|
|
16851
|
+
body: placement ?? {}
|
|
16852
|
+
});
|
|
16782
16853
|
}
|
|
16783
16854
|
releaseIssue(ref) {
|
|
16784
16855
|
return this.request("POST", `/api/v1/issues/${enc(ref)}/release`);
|
|
@@ -17245,7 +17316,9 @@ var ApiClient = class _ApiClient {
|
|
|
17245
17316
|
* answer.
|
|
17246
17317
|
*/
|
|
17247
17318
|
getWorkContext(input) {
|
|
17248
|
-
return input.issue !== void 0 ? this.request("GET", `/api/v1/issues/${enc(input.issue)}/work-context`) : this.request("GET", `/api/v1/projects/${enc(input.project)}/work-context
|
|
17319
|
+
return input.issue !== void 0 ? this.request("GET", `/api/v1/issues/${enc(input.issue)}/work-context`) : this.request("GET", `/api/v1/projects/${enc(input.project)}/work-context`, {
|
|
17320
|
+
query: input.session === void 0 ? {} : { session: input.session }
|
|
17321
|
+
});
|
|
17249
17322
|
}
|
|
17250
17323
|
// --- secrets ---------------------------------------------------------------
|
|
17251
17324
|
// Metadata only: no method here returns a secret VALUE (the reveal plane is a
|
|
@@ -17742,7 +17815,7 @@ function createMcpServer(baseClient, apiBaseUrl, orgInstructions2 = /* @__PURE__
|
|
|
17742
17815
|
// one description loaded into EVERY session by `anthropic/alwaysLoad`. The clauses
|
|
17743
17816
|
// that went were the ones arguing for the rule rather than stating it; what a caller
|
|
17744
17817
|
// needs to predict a refusal all stayed.
|
|
17745
|
-
description: "Everything a session needs before starting work. Call it first: it alone returns the doctrine and
|
|
17818
|
+
description: "Everything a session needs before starting work. Call it first: it alone returns the doctrine and your organization\u2019s writing rules in full. Pass `issue` or `project`, never both. An issue returns its detail plus each linked requirement\u2019s text, comments capped at `commentLimit` (default " + WORK_CONTEXT_COMMENT_LIMIT + "), with `commentCount` the true total. A project returns `available` \u2014 startable work, excluding done, killed, blocked, person-reserved, others\u2019 claims and, with `session`, your other sessions\u2019 \u2014 capped at `availableLimit` beside the true `availableCount`. Read-only.",
|
|
17746
17819
|
inputSchema: getWorkContextInputSchema,
|
|
17747
17820
|
// THE TWO ANNOTATIONS PIPE-D30 REQUIRES, and the reason each key is spelled out
|
|
17748
17821
|
// rather than built: an unknown `_meta` key is IGNORED — no error, no warning — so a
|
|
@@ -17855,7 +17928,7 @@ function createMcpServer(baseClient, apiBaseUrl, orgInstructions2 = /* @__PURE__
|
|
|
17855
17928
|
registerStrict(
|
|
17856
17929
|
"list_issues",
|
|
17857
17930
|
{
|
|
17858
|
-
description: "List issue summaries \u2014 status, priority, milestone, claimer, criteria progress and the header \u2014 filtered by project, status, type, claimer, priority, milestone, text, parent, blocked and
|
|
17931
|
+
description: "List issue summaries \u2014 status, priority, milestone, claimer, criteria progress and the header \u2014 filtered by project, status, type, claimer, priority, milestone, text, parent, blocked, needsHeader and session. With no status filter the default is buildable work: " + OPEN_STATUSES.join(", ") + '. Terminal work is excluded until you name it: pass status ["done","killed"]. An explicit filter is used verbatim, never merged. needsHeader true returns issues whose header is missing or stale; session drops work another session holds.',
|
|
17859
17932
|
inputSchema: listIssuesFilterSchema.shape
|
|
17860
17933
|
},
|
|
17861
17934
|
// The default lives in the API now, not here (PIPE-D35, Listing issues
|
|
@@ -17926,9 +17999,9 @@ function createMcpServer(baseClient, apiBaseUrl, orgInstructions2 = /* @__PURE__
|
|
|
17926
17999
|
inputSchema: setStatusInputSchema.shape
|
|
17927
18000
|
}, (args) => run(() => client2().setStatus(args.issue, args.status)));
|
|
17928
18001
|
registerStrict("claim_issue", {
|
|
17929
|
-
description: "Claim an issue for this session. It succeeds only if unclaimed; under a race one caller wins and the loser is told who holds it.
|
|
17930
|
-
inputSchema:
|
|
17931
|
-
}, (
|
|
18002
|
+
description: "Claim an issue for this session and reserve where the work happens. It succeeds only if unclaimed; under a race one caller wins and the loser is told who holds it. `branch` and `worktree` are refused `placement_conflict` when another live claim in the project holds either, naming that issue. A field you omit keeps what the issue already recorded. Claiming is separate from status, and is refused `reserved_for_person` when an operator has kept the work for a person.",
|
|
18003
|
+
inputSchema: claimInputSchema.shape
|
|
18004
|
+
}, ({ issue: issue2, ...placement }) => run(() => client2().claimIssue(issue2, placement)));
|
|
17932
18005
|
registerStrict("release_issue", {
|
|
17933
18006
|
description: "Release your claim on an issue, leaving it unclaimed and its status unchanged.",
|
|
17934
18007
|
inputSchema: { issue: issueRefSchema }
|
|
@@ -18313,7 +18386,7 @@ function loadMcpConfig() {
|
|
|
18313
18386
|
}
|
|
18314
18387
|
|
|
18315
18388
|
// src/version.ts
|
|
18316
|
-
var VERSION = "0.
|
|
18389
|
+
var VERSION = "0.53.0";
|
|
18317
18390
|
|
|
18318
18391
|
// src/main.ts
|
|
18319
18392
|
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.53.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",
|