pipebrain-mcp 0.18.0 → 0.19.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 +16 -5
  2. package/package.json +1 -1
package/dist/main.js CHANGED
@@ -15261,6 +15261,11 @@ var criterionSchema = external_exports.object({
15261
15261
  position: external_exports.number().int().nonnegative(),
15262
15262
  text: markdownSchema,
15263
15263
  verification: verificationSchema,
15264
+ // How to check this criterion by hand (PIPE-166) — written by whoever specified
15265
+ // it, carried only on `manual` rows, and null on a row written before the field
15266
+ // existed. Distinct from `stateEvidence` below: written at a different moment,
15267
+ // by a different author, in the opposite direction (what to do, not what was seen).
15268
+ howTo: markdownSchema.nullable(),
15264
15269
  state: criterionStateSchema,
15265
15270
  stateEvidence: markdownSchema.nullable(),
15266
15271
  // Attribution for the last state change — null while pending & untouched (§4).
@@ -15569,7 +15574,13 @@ var orgInstructionSchema = external_exports.object({
15569
15574
  // ../../libs/domain/dist/inputs.js
15570
15575
  var criterionInputSchema = external_exports.strictObject({
15571
15576
  text: markdownSchema.min(1, { message: "criterion text must not be empty" }),
15572
- verification: verificationSchema.optional()
15577
+ verification: verificationSchema.optional(),
15578
+ howTo: markdownSchema.refine((s) => s.trim().length > 0, {
15579
+ message: "criterion howTo must not be empty \u2014 say how to check this criterion by hand"
15580
+ }).optional()
15581
+ }).refine((v) => !(v.verification === "auto" && v.howTo !== void 0), {
15582
+ message: "`howTo` applies to manual criteria only \u2014 an auto criterion is checked by a machine, so instructions on one have no reader",
15583
+ path: ["howTo"]
15573
15584
  });
15574
15585
  var createIssueInputSchema = external_exports.strictObject({
15575
15586
  project: projectRefSchema,
@@ -17035,11 +17046,11 @@ function createMcpServer(client2, apiBaseUrl, orgInstructions2 = /* @__PURE__ */
17035
17046
  inputSchema: { issue: issueRefSchema }
17036
17047
  }, (args) => run(() => client2.getIssue(args.issue)));
17037
17048
  registerTool("create_issue", {
17038
- 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 (self/cycle rejected), 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} 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. Search before you create: `list_issues` takes a `text` filter \u2014 run it on the distinctive nouns first. Sessions do not see each other, so a duplicate is invisible until someone finds both; on a near match, comment or amend the existing record rather than filing again. 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. A criterion may be `auto` (machine-checkable) only when an evaluator can drive the input and read the result against the running system unaided \u2014 an existing test covering it does not make it auto; default to `manual` when unsure. Criteria live on epics only: a task cannot carry a criteria list and instead states in its own body what would count as done. 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.',
17049
+ 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 (self/cycle rejected), 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. Search before you create: `list_issues` takes a `text` filter \u2014 run it on the distinctive nouns first. Sessions do not see each other, so a duplicate is invisible until someone finds both; on a near match, comment or amend the existing record rather than filing again. 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. A criterion may be `auto` (machine-checkable) only when an evaluator can drive the input and read the result against the running system unaided \u2014 an existing test covering it does not make it auto; default to `manual` when unsure. A `manual` criterion must also carry `howTo` \u2014 one or two sentences, not an essay, saying where to look, what to do, and what counts as passing for whoever checks it by hand. Writing or changing one without it is refused (`how_to_required`); so is supplying it on an `auto` criterion, which a machine checks. Criteria live on epics only: a task cannot carry a criteria list and instead states in its own body what would count as done. 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.',
17039
17050
  inputSchema: createIssueInputSchema.shape
17040
17051
  }, (args) => run(() => client2.createIssue(args)));
17041
17052
  registerTool("promote_feedback", {
17042
- description: 'Promote a FEEDBACK issue into a NEW epic or task (PIPE-143): creates the issue in the feedback\u2019s project (`title` + `type` required; omitted environment inherits the FEEDBACK\u2019s environment, not the project default; optional status/body/priority/milestone/requirement_links/criteria as in create_issue), records the feedback as its permanent source (`promotedFrom`/`promotedTo` on both details), closes the feedback as done, and comments the new key on it. The feedback\u2019s own title/body are never touched \u2014 write the new issue\u2019s body as real work, do not paste the feedback in. Rejected (409) for non-feedback, terminal, or already-promoted sources. Returns the created issue. A `status` other than `triage` or `killed` REQUIRES `milestone` (PIPE-R10 rule 9), exactly as in create_issue; the SOURCE feedback needs none to be closed by the promotion. Search before you promote: `list_issues` takes a `text` filter \u2014 run it on the feedback\u2019s distinctive nouns first; an issue covering it may already exist, and sessions do not see each other. On a near match, comment on or amend the existing issue rather than promoting a duplicate. 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. A criterion may be `auto` (machine-checkable) only when an evaluator can drive the input and read the result against the running system unaided \u2014 an existing test covering it does not make it auto; default to `manual` when unsure. Criteria live on epics only: a task cannot carry a criteria list and instead states in its own body what would count as done. 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.',
17053
+ description: 'Promote a FEEDBACK issue into a NEW epic or task (PIPE-143): creates the issue in the feedback\u2019s project (`title` + `type` required; omitted environment inherits the FEEDBACK\u2019s environment, not the project default; optional status/body/priority/milestone/requirement_links/criteria as in create_issue), records the feedback as its permanent source (`promotedFrom`/`promotedTo` on both details), closes the feedback as done, and comments the new key on it. The feedback\u2019s own title/body are never touched \u2014 write the new issue\u2019s body as real work, do not paste the feedback in. Rejected (409) for non-feedback, terminal, or already-promoted sources. Returns the created issue. A `status` other than `triage` or `killed` REQUIRES `milestone` (PIPE-R10 rule 9), exactly as in create_issue; the SOURCE feedback needs none to be closed by the promotion. Search before you promote: `list_issues` takes a `text` filter \u2014 run it on the feedback\u2019s distinctive nouns first; an issue covering it may already exist, and sessions do not see each other. On a near match, comment on or amend the existing issue rather than promoting a duplicate. 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. A criterion may be `auto` (machine-checkable) only when an evaluator can drive the input and read the result against the running system unaided \u2014 an existing test covering it does not make it auto; default to `manual` when unsure. A `manual` criterion must also carry `howTo` \u2014 one or two sentences, not an essay, saying where to look, what to do, and what counts as passing for whoever checks it by hand. Writing or changing one without it is refused (`how_to_required`); so is supplying it on an `auto` criterion, which a machine checks. Criteria live on epics only: a task cannot carry a criteria list and instead states in its own body what would count as done. 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.',
17043
17054
  inputSchema: {
17044
17055
  issue: external_exports.string().min(1),
17045
17056
  ...promoteFeedbackInputSchema.shape
@@ -17082,7 +17093,7 @@ function createMcpServer(client2, apiBaseUrl, orgInstructions2 = /* @__PURE__ */
17082
17093
  inputSchema: linkBlockerInputSchema.shape
17083
17094
  }, (args) => run(() => client2.removeBlocker(args.issue, args.blocker)));
17084
17095
  registerTool("set_criteria", {
17085
- description: "Epic only: define or replace the ordered acceptance criteria list ({text, verification}). Matched rows keep their stable AC-{n} number; new items get fresh never-reused numbers; removed items are soft-deleted. A matched row keeps its state only when BOTH its text and verification mode are unchanged \u2014 a mode flip resets it to pending (\xA77). A criterion may be `auto` (machine-checkable) only when an evaluator can drive the input and read the result against the running system unaided \u2014 an existing test covering it does not make it auto; default to `manual` when unsure. Criteria live on epics only: a task cannot carry a criteria list and instead states in its own body what would count as done.",
17096
+ description: "Epic only: define or replace the ordered acceptance criteria list ({text, verification, howTo}). Matched rows keep their stable AC-{n} number; new items get fresh never-reused numbers; removed items are soft-deleted. A matched row keeps its state only when BOTH its text and verification mode are unchanged \u2014 a mode flip resets it to pending (\xA77). A criterion may be `auto` (machine-checkable) only when an evaluator can drive the input and read the result against the running system unaided \u2014 an existing test covering it does not make it auto; default to `manual` when unsure. A `manual` criterion must also carry `howTo` \u2014 one or two sentences, not an essay, saying where to look, what to do, and what counts as passing for whoever checks it by hand. Writing or changing one without it is refused (`how_to_required`); so is supplying it on an `auto` criterion, which a machine checks. Criteria live on epics only: a task cannot carry a criteria list and instead states in its own body what would count as done.",
17086
17097
  inputSchema: setCriteriaInputSchema.shape
17087
17098
  }, (args) => run(() => client2.setCriteria(args.issue, args.criteria)));
17088
17099
  registerTool("set_criterion_state", {
@@ -17361,7 +17372,7 @@ function loadMcpConfig() {
17361
17372
  }
17362
17373
 
17363
17374
  // src/version.ts
17364
- var VERSION = "0.18.0";
17375
+ var VERSION = "0.19.0";
17365
17376
 
17366
17377
  // src/main.ts
17367
17378
  var config2 = loadMcpConfig();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pipebrain-mcp",
3
- "version": "0.18.0",
3
+ "version": "0.19.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",