@cursor/bdk 0.2.5 → 0.2.6
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/bin/agent-serve.js +17 -11
- package/dist/channels/github/github-channel.d.ts +4 -4
- package/dist/channels/github/github-channel.js +5 -5
- package/dist/channels/slack/eval-directive.js +1 -1
- package/dist/docs/404.html +2 -2
- package/dist/docs/assets/{app.94Iu5dyD.js → app.CJLKDVza.js} +4 -4
- package/dist/docs/assets/chunks/@localSearchIndexroot.Bq-pxRXm.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.DTKFDlBr.js → VPLocalSearchBox.BW9mrQmq.js} +1 -1
- package/dist/docs/assets/chunks/{arc.DuzwHEeg.js → arc.D8ZOvM1m.js} +1 -1
- package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.C6lyhLs0.js → architectureDiagram-Q4EWVU46.CXEKhLW-.js} +1 -1
- package/dist/docs/assets/chunks/{baseUniq.DUNEWlY8.js → baseUniq.BJkVKblr.js} +1 -1
- package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.CXOQGI0O.js → blockDiagram-DXYQGD6D.DQDbHxor.js} +1 -1
- package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.BYdPE-Oe.js → c4Diagram-AHTNJAMY.ByMD6LYM.js} +1 -1
- package/dist/docs/assets/chunks/channel.DCU8W1RP.js +1 -0
- package/dist/docs/assets/chunks/{chunk-4BX2VUAB.YIV9HeX0.js → chunk-4BX2VUAB.Dtq1aVI9.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-4TB4RGXK.BG80DEOc.js → chunk-4TB4RGXK.BL_XrkoQ.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-55IACEB6.BDKJSZQc.js → chunk-55IACEB6.BDPXu94_.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-EDXVE4YY.CtYnQqts.js → chunk-EDXVE4YY.DhGOQj4k.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-FMBD7UC4.CityOth-.js → chunk-FMBD7UC4.DSF5nr8v.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-OYMX7WX6.CMD22CQX.js → chunk-OYMX7WX6.Day7wayw.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-QZHKN3VN.WWpc3ND0.js → chunk-QZHKN3VN.CpBEC0zA.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-YZCP3GAM.BMg-yhj3.js → chunk-YZCP3GAM.X_7rY1rx.js} +1 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.DwpXsM06.js +1 -0
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.DwpXsM06.js +1 -0
- package/dist/docs/assets/chunks/clone.DH6Mx2zB.js +1 -0
- package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.Buu_LC5q.js → cose-bilkent-S5V4N54A.BVRmi2ko.js} +1 -1
- package/dist/docs/assets/chunks/{dagre-KV5264BT.DW7onj6E.js → dagre-KV5264BT.Dei9oslB.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-5BDNPKRD.B3NxIbEV.js → diagram-5BDNPKRD._M-efGt7.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.BJvN6Vkv.js → diagram-G4DWMVQ6.D1Vmhfsj.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-MMDJMWI5.wfRWrexs.js → diagram-MMDJMWI5.cE1bmvAC.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-TYMM5635.7QtjSYio.js → diagram-TYMM5635.DkXAfznP.js} +1 -1
- package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.jxPgDH1t.js → erDiagram-SMLLAGMA.DH_pSwPg.js} +1 -1
- package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.BhDWA-TO.js → flowDiagram-DWJPFMVM.kAWVN9j1.js} +1 -1
- package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.Ijq8iYKv.js → ganttDiagram-T4ZO3ILL.8r0w49-p.js} +1 -1
- package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.DXpfW4YG.js → gitGraphDiagram-UUTBAWPF.BDa7Bi1i.js} +1 -1
- package/dist/docs/assets/chunks/{graph.CoPlssRl.js → graph.BMPXHz_B.js} +1 -1
- package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.eJuv_EOz.js → infoDiagram-42DDH7IO.BmlcqewS.js} +1 -1
- package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A._OEzenCR.js → ishikawaDiagram-UXIWVN3A.CVSEQSul.js} +1 -1
- package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.CwlTjirB.js → journeyDiagram-VCZTEJTY.BpeWJ5n-.js} +1 -1
- package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.DSp_C8cZ.js → kanban-definition-6JOO6SKY.DHbDXuxB.js} +1 -1
- package/dist/docs/assets/chunks/{layout.Bms9s7uB.js → layout.CzrCDgkP.js} +1 -1
- package/dist/docs/assets/chunks/{linear.BjnmB4je.js → linear.HwBsflwN.js} +1 -1
- package/dist/docs/assets/chunks/{min.CKkYlMsn.js → min.DqGHolT3.js} +1 -1
- package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.T2d0vJ7X.js → mindmap-definition-QFDTVHPH.ZYGlOawh.js} +1 -1
- package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.DU0RoCvx.js → pieDiagram-DEJITSTG.C2KRXlNR.js} +1 -1
- package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.9QZjM-x0.js → quadrantDiagram-34T5L4WZ.CHj3Qefp.js} +1 -1
- package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.CZpylJMd.js → requirementDiagram-MS252O5E.B1L4Tf7k.js} +1 -1
- package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.CnFdfW95.js → sankeyDiagram-XADWPNL6.dNR2yi1B.js} +1 -1
- package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.-jC0PP1t.js → sequenceDiagram-FGHM5R23.BrvQ3C6m.js} +1 -1
- package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.DG7yBRUU.js → stateDiagram-FHFEXIEX.BtehEykA.js} +1 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.kzD0-U89.js +1 -0
- package/dist/docs/assets/chunks/{theme.B3O9koXV.js → theme.BDHBZUkP.js} +2 -2
- package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.Bf9u4Ebb.js → timeline-definition-GMOUNBTQ.Bn7nhqEN.js} +1 -1
- package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.BjhbbYE6.js → vennDiagram-DHZGUBPP.DKhc38sz.js} +1 -1
- package/dist/docs/assets/chunks/wardley-RL74JXVD.DOXQ0w8J.js +162 -0
- package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.8fRb4Nb5.js → wardleyDiagram-NUSXRM2D.Bbq5B2Ic.js} +1 -1
- package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.DoOP3zZM.js → xychartDiagram-5P7HB3ND.B77HE1K8.js} +1 -1
- package/dist/docs/assets/{evals.md.LRCSn6Ik.js → evals.md.C851kViu.js} +1 -1
- package/dist/docs/assets/{reference_skills.md.C0guGcH0.js → reference_skills.md.ClkMoQsV.js} +3 -3
- package/dist/docs/assets/{templates_agentic-owners.md.vtjfwxbf.js → templates_agentic-owners.md.CvmABtia.js} +1 -1
- package/dist/docs/assets/{templates_agentic-owners.md.vtjfwxbf.lean.js → templates_agentic-owners.md.CvmABtia.lean.js} +1 -1
- package/dist/docs/assets/{templates_security-reviewer.md.CX9l9bcg.js → templates_security-reviewer.md.Gh6EF9Us.js} +3 -2
- package/dist/docs/assets/{templates_security-reviewer.md.CX9l9bcg.lean.js → templates_security-reviewer.md.Gh6EF9Us.lean.js} +1 -1
- package/dist/docs/assets/{templates_thermo-quality-review.md.95qmTmr1.js → templates_thermo-quality-review.md.B77UyTrX.js} +1 -1
- package/dist/docs/assets/{templates_thermo-review.md.DQh6Q0C-.js → templates_thermo-review.md.DRJ7mC5U.js} +1 -1
- package/dist/docs/assets/{templates_triage.md.BFlQhWXf.js → templates_triage.md.CNN6b0JZ.js} +3 -3
- package/dist/docs/assets/{templates_triage.md.BFlQhWXf.lean.js → templates_triage.md.CNN6b0JZ.lean.js} +1 -1
- package/dist/docs/building-with-agents.html +35 -35
- package/dist/docs/deployment.html +35 -35
- package/dist/docs/evals.html +37 -37
- package/dist/docs/evals.md +2 -2
- package/dist/docs/guides/agent-to-agent.html +35 -35
- package/dist/docs/guides/bitbucket.html +35 -35
- package/dist/docs/guides/cloud-agents.html +35 -35
- package/dist/docs/guides/convert-automation.html +35 -35
- package/dist/docs/guides/github.html +35 -35
- package/dist/docs/guides/gitlab.html +35 -35
- package/dist/docs/guides/grokbot-agents.html +35 -35
- package/dist/docs/guides/hooks.html +35 -35
- package/dist/docs/guides/improve.html +35 -35
- package/dist/docs/guides/jev.html +35 -35
- package/dist/docs/guides/mcp-oauth.html +35 -35
- package/dist/docs/guides/opentelemetry.html +35 -35
- package/dist/docs/guides/slack.html +35 -35
- package/dist/docs/guides/webhooks.html +35 -35
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +35 -35
- package/dist/docs/index.html +35 -35
- package/dist/docs/llms-full.txt +21 -15
- package/dist/docs/quickstart.html +35 -35
- package/dist/docs/reference/agent-config.html +35 -35
- package/dist/docs/reference/artifacts.html +35 -35
- package/dist/docs/reference/channels.html +35 -35
- package/dist/docs/reference/cli.html +35 -35
- package/dist/docs/reference/connections.html +35 -35
- package/dist/docs/reference/evals.html +35 -35
- package/dist/docs/reference/extensions.html +35 -35
- package/dist/docs/reference/hooks.html +35 -35
- package/dist/docs/reference/http-api.html +35 -35
- package/dist/docs/reference/instructions.html +35 -35
- package/dist/docs/reference/playground.html +35 -35
- package/dist/docs/reference/project-layout.html +35 -35
- package/dist/docs/reference/prompt.html +35 -35
- package/dist/docs/reference/schedules.html +35 -35
- package/dist/docs/reference/sessions.html +35 -35
- package/dist/docs/reference/skills.html +38 -38
- package/dist/docs/reference/subagents.html +35 -35
- package/dist/docs/reference/tools.html +35 -35
- package/dist/docs/templates/agentic-owners.html +37 -37
- package/dist/docs/templates/agentic-owners.md +2 -0
- package/dist/docs/templates/grokbot-agents.html +35 -35
- package/dist/docs/templates/security-reviewer.html +38 -37
- package/dist/docs/templates/security-reviewer.md +7 -8
- package/dist/docs/templates/thermo-quality-review.html +37 -37
- package/dist/docs/templates/thermo-quality-review.md +2 -2
- package/dist/docs/templates/thermo-review.html +37 -37
- package/dist/docs/templates/thermo-review.md +2 -2
- package/dist/docs/templates/triage.html +38 -38
- package/dist/docs/templates/triage.md +6 -1
- package/dist/docs/troubleshooting.html +35 -35
- package/dist/evals.d.ts +2 -2
- package/dist/internal/cli-ax.d.ts.map +1 -1
- package/dist/internal/cli-ax.js +14 -7
- package/dist/internal/eval-runner.js +7 -4
- package/dist/internal/init-interview.d.ts +0 -1
- package/dist/internal/init-interview.d.ts.map +1 -1
- package/dist/internal/init-interview.js +15 -24
- package/dist/internal/legacy-command-guard.d.ts +4 -1
- package/dist/internal/legacy-command-guard.d.ts.map +1 -1
- package/dist/internal/legacy-command-guard.js +11 -2
- package/dist/internal/platform-timers.d.ts +8 -1
- package/dist/internal/platform-timers.d.ts.map +1 -1
- package/dist/internal/platform-timers.js +10 -2
- package/dist/internal/reminder-control-plane-protocol.d.ts +8 -1
- package/dist/internal/reminder-control-plane-protocol.d.ts.map +1 -1
- package/dist/internal/reminder-runner.d.ts +5 -0
- package/dist/internal/reminder-runner.d.ts.map +1 -1
- package/dist/internal/reminder-runner.js +27 -1
- package/dist/internal/resolve-prod-target.d.ts +3 -0
- package/dist/internal/resolve-prod-target.d.ts.map +1 -1
- package/dist/internal/resolve-prod-target.js +2 -1
- package/dist/internal/run-client.d.ts +10 -1
- package/dist/internal/run-client.d.ts.map +1 -1
- package/dist/internal/run-client.js +152 -51
- package/dist/internal/server.d.ts +6 -0
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +20 -8
- package/dist/internal/session-links.d.ts.map +1 -1
- package/dist/internal/session-links.js +8 -7
- package/dist/internal/sessions-client.d.ts +1 -0
- package/dist/internal/sessions-client.d.ts.map +1 -1
- package/dist/internal/sessions-client.js +2 -0
- package/docs/evals.md +2 -2
- package/docs/templates/agentic-owners.md +2 -0
- package/docs/templates/security-reviewer.md +7 -8
- package/docs/templates/thermo-quality-review.md +2 -2
- package/docs/templates/thermo-review.md +2 -2
- package/docs/templates/triage.md +6 -1
- package/package.json +1 -1
- package/templates/agents-md/evals/agents.eval.ts +1 -0
- package/templates/code-wiki/bot/instructions.md +4 -4
- package/templates/security-reviewer/README.md +5 -3
- package/templates/security-reviewer/bot/tools/post_findings.ts +8 -8
- package/templates/thermo-quality-review/bot/tools/post_findings.ts +8 -8
- package/templates/thermo-review/bot/tools/post_findings.ts +8 -8
- package/dist/docs/assets/chunks/@localSearchIndexroot.BITLoOQa.js +0 -1
- package/dist/docs/assets/chunks/channel.B46uXH41.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.0cmCFsSf.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.0cmCFsSf.js +0 -1
- package/dist/docs/assets/chunks/clone.1vTOFZT1.js +0 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.CbsZcOOu.js +0 -1
- package/dist/docs/assets/chunks/wardley-RL74JXVD.DEA21akR.js +0 -162
- /package/dist/docs/assets/{evals.md.LRCSn6Ik.lean.js → evals.md.C851kViu.lean.js} +0 -0
- /package/dist/docs/assets/{reference_skills.md.C0guGcH0.lean.js → reference_skills.md.ClkMoQsV.lean.js} +0 -0
- /package/dist/docs/assets/{templates_thermo-quality-review.md.95qmTmr1.lean.js → templates_thermo-quality-review.md.B77UyTrX.lean.js} +0 -0
- /package/dist/docs/assets/{templates_thermo-review.md.DQh6Q0C-.lean.js → templates_thermo-review.md.DRJ7mC5U.lean.js} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{_ as y,s as Nt,g as zt,t as At,q as Xt,a as Ct,b as Et,l as et,L as Tt,e as Yt,A as Bt,c as H,i as Rt}from"../app.
|
|
1
|
+
import{_ as y,s as Nt,g as zt,t as At,q as Xt,a as Ct,b as Et,l as et,L as Tt,e as Yt,A as Bt,c as H,i as Rt}from"../app.CJLKDVza.js";import{p as Ft}from"./chunk-4BX2VUAB.Dtq1aVI9.js";import{p as Ot}from"./wardley-RL74JXVD.DOXQ0w8J.js";import"./framework.BNw1pucY.js";import"./theme.BDHBZUkP.js";import"./min.DqGHolT3.js";import"./baseUniq.BJkVKblr.js";var q=y((a,r)=>{const e=a<=1?a*100:a;if(e<0||e>100)throw new Error(`${r} must be between 0-1 (decimal) or 0-100 (percentage). Received: ${a}`);return e},"toPercent"),Y=y((a,r,e)=>({x:q(r,`${e} evolution`),y:q(a,`${e} visibility`)}),"toCoordinates"),tt=y(a=>{if(a){if(a==="+<>")return"bidirectional";if(a==="+<")return"backward";if(a==="+>")return"forward"}},"getFlowFromPort"),It=y(a=>{if(!(a!=null&&a.startsWith("+")))return{};const r=/^\+'([^']*)'/.exec(a),e=r==null?void 0:r[1];return a.includes("<>")?{flow:"bidirectional",label:e}:a.includes("<")?{flow:"backward",label:e}:a.includes(">")?{flow:"forward",label:e}:{label:e}},"extractFlowFromArrow"),Wt=y((a,r)=>{if(Ft(a,r),a.size&&r.setSize(a.size.width,a.size.height),a.evolution){const e=a.evolution.stages.map(o=>o.secondName?`${o.name.trim()} / ${o.secondName.trim()}`:o.name.trim()),h=a.evolution.stages.filter(o=>o.boundary!==void 0).map(o=>o.boundary);r.updateAxes({stages:e,stageBoundaries:h})}if(a.anchors.forEach(e=>{const h=Y(e.visibility,e.evolution,`Anchor "${e.name}"`);r.addNode(e.name,e.name,h.x,h.y,"anchor")}),a.components.forEach(e=>{var v;const h=Y(e.visibility,e.evolution,`Component "${e.name}"`),o=e.label?(e.label.negX?-1:1)*e.label.offsetX:void 0,d=e.label?(e.label.negY?-1:1)*e.label.offsetY:void 0,m=(v=e.decorator)==null?void 0:v.strategy;r.addNode(e.name,e.name,h.x,h.y,"component",o,d,e.inertia,m)}),a.notes.forEach(e=>{const h=Y(e.visibility,e.evolution,`Note "${e.text}"`);r.addNote(e.text,h.x,h.y)}),a.pipelines.forEach(e=>{const h=r.getNode(e.parent);if(!h||typeof h.y!="number")throw new Error(`Pipeline "${e.parent}" must reference an existing component with coordinates.`);const o=h.y;r.startPipeline(e.parent),e.components.forEach(d=>{const m=`${e.parent}_${d.name}`,v=d.label?(d.label.negX?-1:1)*d.label.offsetX:void 0,g=d.label?(d.label.negY?-1:1)*d.label.offsetY:void 0,X=q(d.evolution,`Pipeline component "${d.name}" evolution`);r.addNode(m,d.name,X,o,"pipeline-component",v,g),r.addPipelineComponent(e.parent,m)})}),a.links.forEach(e=>{const h=!!e.arrow&&(e.arrow.includes("-.->")||e.arrow.includes(".-."));let o=tt(e.fromPort)??tt(e.toPort);const{flow:d,label:m}=It(e.arrow);!o&&d&&(o=d);const v=e.linkLabel,g=m??v;r.addLink(e.from,e.to,h,g,o)}),a.evolves.forEach(e=>{const h=r.getNode(e.component);if((h==null?void 0:h.y)!==void 0){const o=q(e.target,`Evolve target for "${e.component}"`);r.addTrend(e.component,o,h.y)}}),a.annotations.length>0){const e=a.annotations[0],h=Y(e.x,e.y,"Annotations box");r.setAnnotationsBox(h.x,h.y)}a.annotation.forEach(e=>{const h=Y(e.x,e.y,`Annotation ${e.number}`);r.addAnnotation(e.number,[{x:h.x,y:h.y}],e.text)}),a.accelerators.forEach(e=>{const h=Y(e.x,e.y,`Accelerator "${e.name}"`);r.addAccelerator(e.name,h.x,h.y)}),a.deaccelerators.forEach(e=>{const h=Y(e.x,e.y,`Deaccelerator "${e.name}"`);r.addDeaccelerator(e.name,h.x,h.y)})},"populateDb"),at={parser:{yy:void 0},parse:y(async a=>{var h;const r=await Ot("wardley",a);et.debug(r);const e=(h=at.parser)==null?void 0:h.yy;if(!e||typeof e.addNode!="function")throw new Error("parser.parser?.yy was not a WardleyDB. This is due to a bug within Mermaid, please report this issue at https://github.com/mermaid-js/mermaid/issues.");Wt(r,e)},"parse")},R,Dt=(R=class{constructor(){this.nodes=new Map,this.links=[],this.trends=new Map,this.pipelines=new Map,this.annotations=[],this.notes=[],this.accelerators=[],this.deaccelerators=[],this.axes={}}addNode(r){const e=this.nodes.get(r.id)??{id:r.id,label:r.label},h={...e,...r,className:r.className??e.className,labelOffsetX:r.labelOffsetX??e.labelOffsetX,labelOffsetY:r.labelOffsetY??e.labelOffsetY};this.nodes.set(r.id,h)}addLink(r){this.links.push(r)}addTrend(r){this.trends.set(r.nodeId,r)}startPipeline(r){this.pipelines.set(r,{nodeId:r,componentIds:[]});const e=this.nodes.get(r);e&&(e.isPipelineParent=!0)}addPipelineComponent(r,e){const h=this.pipelines.get(r);h&&h.componentIds.push(e);const o=this.nodes.get(e);o&&(o.inPipeline=!0)}addAnnotation(r){this.annotations.push(r)}addNote(r){this.notes.push(r)}addAccelerator(r){this.accelerators.push(r)}addDeaccelerator(r){this.deaccelerators.push(r)}setAnnotationsBox(r,e){this.annotationsBox={x:r,y:e}}setAxes(r){this.axes={...this.axes,...r}}setSize(r,e){this.size={width:r,height:e}}getNode(r){return this.nodes.get(r)}build(){const r=[];for(const e of this.nodes.values()){if(typeof e.x!="number"||typeof e.y!="number")throw new Error(`Node "${e.label}" is missing coordinates`);r.push(e)}return{nodes:r,links:[...this.links],trends:[...this.trends.values()],pipelines:[...this.pipelines.values()],annotations:[...this.annotations],notes:[...this.notes],accelerators:[...this.accelerators],deaccelerators:[...this.deaccelerators],annotationsBox:this.annotationsBox,axes:{...this.axes},size:this.size}}clear(){this.nodes.clear(),this.links=[],this.trends.clear(),this.pipelines.clear(),this.annotations=[],this.notes=[],this.accelerators=[],this.deaccelerators=[],this.annotationsBox=void 0,this.axes={},this.size=void 0}},y(R,"WardleyBuilder"),R),P=new Dt;function L(a){const r=H();return Rt(a.trim(),r)}y(L,"textSanitizer");function rt(){return H()["wardley-beta"]}y(rt,"getConfig");function ot(a,r,e,h,o,d,m,v,g){P.addNode({id:a,label:L(r),x:e,y:h,className:o,labelOffsetX:d,labelOffsetY:m,inertia:v,sourceStrategy:g})}y(ot,"addNode");function st(a,r,e=!1,h,o){P.addLink({source:a,target:r,dashed:e,label:h,flow:o})}y(st,"addLink");function nt(a,r,e){P.addTrend({nodeId:a,targetX:r,targetY:e})}y(nt,"addTrend");function it(a,r,e){P.addAnnotation({number:a,coordinates:r,text:e?L(e):void 0})}y(it,"addAnnotation");function dt(a,r,e){P.addNote({text:L(a),x:r,y:e})}y(dt,"addNote");function lt(a,r,e){P.addAccelerator({name:L(a),x:r,y:e})}y(lt,"addAccelerator");function ct(a,r,e){P.addDeaccelerator({name:L(a),x:r,y:e})}y(ct,"addDeaccelerator");function pt(a,r){P.setAnnotationsBox(a,r)}y(pt,"setAnnotationsBox");function ht(a,r){P.setSize(a,r)}y(ht,"setSize");function xt(a){P.startPipeline(a)}y(xt,"startPipeline");function ft(a,r){P.addPipelineComponent(a,r)}y(ft,"addPipelineComponent");function gt(a){const r={};a.xLabel&&(r.xLabel=L(a.xLabel)),a.yLabel&&(r.yLabel=L(a.yLabel)),a.stages&&(r.stages=a.stages.map(e=>L(e))),a.stageBoundaries&&(r.stageBoundaries=a.stageBoundaries),P.setAxes(r)}y(gt,"updateAxes");function ut(a){return P.getNode(a)}y(ut,"getNode");function yt(){return P.build()}y(yt,"getWardleyData");function mt(){P.clear(),Bt()}y(mt,"clear");var Gt={getConfig:rt,addNode:ot,addLink:st,addTrend:nt,addAnnotation:it,addNote:dt,addAccelerator:lt,addDeaccelerator:ct,setAnnotationsBox:pt,setSize:ht,startPipeline:xt,addPipelineComponent:ft,updateAxes:gt,getNode:ut,getWardleyData:yt,clear:mt,setAccTitle:Et,getAccTitle:Ct,setDiagramTitle:Xt,getDiagramTitle:At,getAccDescription:zt,setAccDescription:Nt},qt=["Genesis","Custom Built","Product","Commodity"],Ht=y(()=>{var r,e,h,o,d,m,v,g,X,M,b,N;const{themeVariables:a}=H();return{backgroundColor:((r=a.wardley)==null?void 0:r.backgroundColor)??a.background??"#fff",axisColor:((e=a.wardley)==null?void 0:e.axisColor)??"#000",axisTextColor:((h=a.wardley)==null?void 0:h.axisTextColor)??a.primaryTextColor??"#222",gridColor:((o=a.wardley)==null?void 0:o.gridColor)??"rgba(100, 100, 100, 0.2)",componentFill:((d=a.wardley)==null?void 0:d.componentFill)??"#fff",componentStroke:((m=a.wardley)==null?void 0:m.componentStroke)??"#000",componentLabelColor:((v=a.wardley)==null?void 0:v.componentLabelColor)??a.primaryTextColor??"#222",linkStroke:((g=a.wardley)==null?void 0:g.linkStroke)??"#000",evolutionStroke:((X=a.wardley)==null?void 0:X.evolutionStroke)??"#dc3545",annotationStroke:((M=a.wardley)==null?void 0:M.annotationStroke)??"#000",annotationTextColor:((b=a.wardley)==null?void 0:b.annotationTextColor)??a.primaryTextColor??"#222",annotationFill:((N=a.wardley)==null?void 0:N.annotationFill)??a.background??"#fff"}},"getTheme"),jt=y(()=>{const a=H()["wardley-beta"];return{width:(a==null?void 0:a.width)??900,height:(a==null?void 0:a.height)??600,padding:(a==null?void 0:a.padding)??48,nodeRadius:(a==null?void 0:a.nodeRadius)??6,nodeLabelOffset:(a==null?void 0:a.nodeLabelOffset)??8,axisFontSize:(a==null?void 0:a.axisFontSize)??12,labelFontSize:(a==null?void 0:a.labelFontSize)??10,showGrid:(a==null?void 0:a.showGrid)??!1,useMaxWidth:(a==null?void 0:a.useMaxWidth)??!0}},"getConfigValues"),_t=y((a,r,e,h)=>{var K,Q;et.debug(`Rendering Wardley map
|
|
2
2
|
`+a);const o=jt(),d=Ht(),m=o.nodeRadius*1.6,v=h.db,g=v.getWardleyData(),X=v.getDiagramTitle(),M=((K=g.size)==null?void 0:K.width)??o.width,b=((Q=g.size)==null?void 0:Q.height)??o.height,N=Tt(r);N.selectAll("*").remove(),Yt(N,b,M,o.useMaxWidth),N.attr("viewBox",`0 0 ${M} ${b}`);const S=N.append("g").attr("class","wardley-map"),j=N.append("defs");j.append("marker").attr("id",`arrow-${r}`).attr("viewBox","0 0 10 10").attr("refX",9).attr("refY",5).attr("markerWidth",6).attr("markerHeight",6).attr("orient","auto-start-reverse").append("path").attr("d","M 0 0 L 10 5 L 0 10 z").attr("fill",d.evolutionStroke).attr("stroke","none"),j.append("marker").attr("id",`link-arrow-end-${r}`).attr("viewBox","0 0 10 10").attr("refX",9).attr("refY",5).attr("markerWidth",5).attr("markerHeight",5).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z").attr("fill",d.linkStroke).attr("stroke","none"),j.append("marker").attr("id",`link-arrow-start-${r}`).attr("viewBox","0 0 10 10").attr("refX",1).attr("refY",5).attr("markerWidth",5).attr("markerHeight",5).attr("orient","auto").append("path").attr("d","M 10 0 L 0 5 L 10 10 z").attr("fill",d.linkStroke).attr("stroke","none"),S.append("rect").attr("class","wardley-background").attr("width",M).attr("height",b).attr("fill",d.backgroundColor);const F=M-o.padding*2,O=b-o.padding*2;X&&S.append("text").attr("class","wardley-title").attr("x",M/2).attr("y",o.padding/2).attr("fill",d.axisTextColor).attr("font-size",o.axisFontSize*1.05).attr("font-weight","bold").attr("text-anchor","middle").attr("dominant-baseline","middle").text(X);const C=y(t=>o.padding+t/100*F,"projectX"),E=y(t=>b-o.padding-t/100*O,"projectY"),W=S.append("g").attr("class","wardley-axes");W.append("line").attr("x1",o.padding).attr("x2",M-o.padding).attr("y1",b-o.padding).attr("y2",b-o.padding).attr("stroke",d.axisColor).attr("stroke-width",1),W.append("line").attr("x1",o.padding).attr("x2",o.padding).attr("y1",o.padding).attr("y2",b-o.padding).attr("stroke",d.axisColor).attr("stroke-width",1);const wt=g.axes.xLabel??"Evolution",bt=g.axes.yLabel??"Visibility";W.append("text").attr("class","wardley-axis-label wardley-axis-label-x").attr("x",o.padding+F/2).attr("y",b-o.padding/4).attr("fill",d.axisTextColor).attr("font-size",o.axisFontSize).attr("font-weight","bold").attr("text-anchor","middle").text(wt),W.append("text").attr("class","wardley-axis-label wardley-axis-label-y").attr("x",o.padding/3).attr("y",o.padding+O/2).attr("fill",d.axisTextColor).attr("font-size",o.axisFontSize).attr("font-weight","bold").attr("text-anchor","middle").attr("transform",`rotate(-90 ${o.padding/3} ${o.padding+O/2})`).text(bt);const I=g.axes.stages&&g.axes.stages.length>0?g.axes.stages:qt;if(I.length>0){const t=S.append("g").attr("class","wardley-stages"),n=g.axes.stageBoundaries,s=[];if(n&&n.length===I.length){let i=0;n.forEach(p=>{s.push({start:i,end:p}),i=p})}else{const i=1/I.length;I.forEach((p,l)=>{s.push({start:l*i,end:(l+1)*i})})}I.forEach((i,p)=>{const l=s[p],x=o.padding+l.start*F,f=o.padding+l.end*F,u=(x+f)/2;p>0&&t.append("line").attr("x1",x).attr("x2",x).attr("y1",o.padding).attr("y2",b-o.padding).attr("stroke","#000").attr("stroke-width",1).attr("stroke-dasharray","5 5").attr("opacity",.8),t.append("text").attr("class","wardley-stage-label").attr("x",u).attr("y",b-o.padding/1.5).attr("fill",d.axisTextColor).attr("font-size",o.axisFontSize-2).attr("text-anchor","middle").text(i)})}if(o.showGrid){const t=S.append("g").attr("class","wardley-grid");for(let n=1;n<4;n++){const s=n/4,i=o.padding+F*s;t.append("line").attr("x1",i).attr("x2",i).attr("y1",o.padding).attr("y2",b-o.padding).attr("stroke",d.gridColor).attr("stroke-dasharray","2 6"),t.append("line").attr("x1",o.padding).attr("x2",M-o.padding).attr("y1",b-o.padding-O*s).attr("y2",b-o.padding-O*s).attr("stroke",d.gridColor).attr("stroke-dasharray","2 6")}}const c=new Map;if(g.nodes.forEach(t=>{c.set(t.id,{x:C(t.x),y:E(t.y),node:t})}),g.pipelines.length>0){const t=S.append("g").attr("class","wardley-pipelines"),n=S.append("g").attr("class","wardley-pipeline-links");g.pipelines.forEach(s=>{if(s.componentIds.length===0)return;const i=s.componentIds.map(f=>({id:f,pos:c.get(f),node:g.nodes.find(u=>u.id===f)})).filter(f=>f.pos&&f.node).sort((f,u)=>f.node.x-u.node.x);for(let f=0;f<i.length-1;f++){const u=i[f],w=i[f+1];n.append("line").attr("class","wardley-pipeline-evolution-link").attr("x1",u.pos.x).attr("y1",u.pos.y).attr("x2",w.pos.x).attr("y2",w.pos.y).attr("stroke",d.linkStroke).attr("stroke-width",1).attr("stroke-dasharray","4 4")}let p=1/0,l=-1/0,x=0;if(s.componentIds.forEach(f=>{const u=c.get(f);u&&(p=Math.min(p,u.x),l=Math.max(l,u.x),x=u.y)}),p!==1/0&&l!==-1/0){const u=o.nodeRadius*4,w=x-u/2,$=c.get(s.nodeId);if($){const A=(p+l)/2;$.x=A,$.y=w-m/6}t.append("rect").attr("class","wardley-pipeline-box").attr("x",p-15).attr("y",w).attr("width",l-p+15*2).attr("height",u).attr("fill","none").attr("stroke",d.axisColor).attr("stroke-width",1.5).attr("rx",4).attr("ry",4)}})}const Z=S.append("g").attr("class","wardley-links"),U=new Map;g.pipelines.forEach(t=>{U.set(t.nodeId,new Set(t.componentIds))});const J=g.links.filter(t=>{if(!c.has(t.source)||!c.has(t.target))return!1;const n=U.get(t.target);return!(n!=null&&n.has(t.source))});Z.selectAll("line").data(J).enter().append("line").attr("class",t=>`wardley-link${t.dashed?" wardley-link--dashed":""}`).attr("x1",t=>{const n=c.get(t.source),s=c.get(t.target),p=g.nodes.find(u=>u.id===t.source).isPipelineParent?m/Math.sqrt(2):o.nodeRadius,l=s.x-n.x,x=s.y-n.y,f=Math.sqrt(l*l+x*x);return n.x+l/f*p}).attr("y1",t=>{const n=c.get(t.source),s=c.get(t.target),p=g.nodes.find(u=>u.id===t.source).isPipelineParent?m/Math.sqrt(2):o.nodeRadius,l=s.x-n.x,x=s.y-n.y,f=Math.sqrt(l*l+x*x);return n.y+x/f*p}).attr("x2",t=>{const n=c.get(t.source),s=c.get(t.target),p=g.nodes.find(u=>u.id===t.target).isPipelineParent?m/Math.sqrt(2):o.nodeRadius,l=n.x-s.x,x=n.y-s.y,f=Math.sqrt(l*l+x*x);return s.x+l/f*p}).attr("y2",t=>{const n=c.get(t.source),s=c.get(t.target),p=g.nodes.find(u=>u.id===t.target).isPipelineParent?m/Math.sqrt(2):o.nodeRadius,l=n.x-s.x,x=n.y-s.y,f=Math.sqrt(l*l+x*x);return s.y+x/f*p}).attr("stroke",d.linkStroke).attr("stroke-width",1).attr("stroke-dasharray",t=>t.dashed?"6 6":null).attr("marker-end",t=>t.flow==="forward"||t.flow==="bidirectional"?`url(#link-arrow-end-${r})`:null).attr("marker-start",t=>t.flow==="backward"||t.flow==="bidirectional"?`url(#link-arrow-start-${r})`:null),Z.selectAll("text").data(J.filter(t=>t.label)).enter().append("text").attr("class","wardley-link-label").attr("x",t=>{const n=c.get(t.source),s=c.get(t.target),i=(n.x+s.x)/2,p=s.y-n.y,l=s.x-n.x,x=Math.sqrt(l*l+p*p),f=8,u=p/x;return i+u*f}).attr("y",t=>{const n=c.get(t.source),s=c.get(t.target),i=(n.y+s.y)/2,p=s.x-n.x,l=s.y-n.y,x=Math.sqrt(p*p+l*l),f=8,u=-p/x;return i+u*f}).attr("fill",d.axisTextColor).attr("font-size",o.labelFontSize).attr("text-anchor","middle").attr("dominant-baseline","middle").attr("transform",t=>{const n=c.get(t.source),s=c.get(t.target),i=(n.x+s.x)/2,p=(n.y+s.y)/2,l=s.x-n.x,x=s.y-n.y,f=Math.sqrt(l*l+x*x),u=8,w=x/f,$=-l/f,A=i+w*u,D=p+$*u;let B=Math.atan2(x,l)*180/Math.PI;return(B>90||B<-90)&&(B+=180),`rotate(${B} ${A} ${D})`}).text(t=>t.label);const kt=S.append("g").attr("class","wardley-trends"),Pt=g.trends.map(t=>{const n=c.get(t.nodeId);if(!n)return null;const s=C(t.targetX),i=E(t.targetY),p=s-n.x,l=i-n.y,x=Math.sqrt(p*p+l*l),f=o.nodeRadius+2,u=x>f?s-p/x*f:s,w=x>f?i-l/x*f:i;return{origin:n,targetX:s,targetY:i,adjustedX2:u,adjustedY2:w}}).filter(t=>t!==null);kt.selectAll("line").data(Pt).enter().append("line").attr("class","wardley-trend").attr("x1",t=>t.origin.x).attr("y1",t=>t.origin.y).attr("x2",t=>t.adjustedX2).attr("y2",t=>t.adjustedY2).attr("stroke",d.evolutionStroke).attr("stroke-width",1).attr("stroke-dasharray","4 4").attr("marker-end",`url(#arrow-${r})`);const z=S.append("g").attr("class","wardley-nodes").selectAll("g").data(g.nodes).enter().append("g").attr("class",t=>["wardley-node",t.className?`wardley-node--${t.className}`:""].filter(Boolean).join(" "));z.filter(t=>t.sourceStrategy==="outsource").append("circle").attr("class","wardley-outsource-overlay").attr("cx",t=>c.get(t.id).x).attr("cy",t=>c.get(t.id).y).attr("r",o.nodeRadius*2).attr("fill","#666").attr("stroke",d.componentStroke).attr("stroke-width",1),z.filter(t=>t.sourceStrategy==="buy").append("circle").attr("class","wardley-buy-overlay").attr("cx",t=>c.get(t.id).x).attr("cy",t=>c.get(t.id).y).attr("r",o.nodeRadius*2).attr("fill","#ccc").attr("stroke",d.componentStroke).attr("stroke-width",1),z.filter(t=>t.sourceStrategy==="build").append("circle").attr("class","wardley-build-overlay").attr("cx",t=>c.get(t.id).x).attr("cy",t=>c.get(t.id).y).attr("r",o.nodeRadius*2).attr("fill","#eee").attr("stroke","#000").attr("stroke-width",1);const T=z.filter(t=>t.sourceStrategy==="market");T.append("circle").attr("class","wardley-market-overlay").attr("cx",t=>c.get(t.id).x).attr("cy",t=>c.get(t.id).y).attr("r",o.nodeRadius*2).attr("fill","white").attr("stroke",d.componentStroke).attr("stroke-width",1),z.filter(t=>!t.isPipelineParent&&t.sourceStrategy!=="market"&&t.className!=="anchor").append("circle").attr("cx",t=>c.get(t.id).x).attr("cy",t=>c.get(t.id).y).attr("r",o.nodeRadius).attr("fill",d.componentFill).attr("stroke",d.componentStroke).attr("stroke-width",1);const _=o.nodeRadius*.7,k=o.nodeRadius*1.2;if(T.append("line").attr("class","wardley-market-line").attr("x1",t=>c.get(t.id).x).attr("y1",t=>c.get(t.id).y-k).attr("x2",t=>c.get(t.id).x-k*Math.cos(Math.PI/6)).attr("y2",t=>c.get(t.id).y+k*Math.sin(Math.PI/6)).attr("stroke",d.componentStroke).attr("stroke-width",1),T.append("line").attr("class","wardley-market-line").attr("x1",t=>c.get(t.id).x-k*Math.cos(Math.PI/6)).attr("y1",t=>c.get(t.id).y+k*Math.sin(Math.PI/6)).attr("x2",t=>c.get(t.id).x+k*Math.cos(Math.PI/6)).attr("y2",t=>c.get(t.id).y+k*Math.sin(Math.PI/6)).attr("stroke",d.componentStroke).attr("stroke-width",1),T.append("line").attr("class","wardley-market-line").attr("x1",t=>c.get(t.id).x+k*Math.cos(Math.PI/6)).attr("y1",t=>c.get(t.id).y+k*Math.sin(Math.PI/6)).attr("x2",t=>c.get(t.id).x).attr("y2",t=>c.get(t.id).y-k).attr("stroke",d.componentStroke).attr("stroke-width",1),T.append("circle").attr("class","wardley-market-dot").attr("cx",t=>c.get(t.id).x).attr("cy",t=>c.get(t.id).y-k).attr("r",_).attr("fill","white").attr("stroke",d.componentStroke).attr("stroke-width",2),T.append("circle").attr("class","wardley-market-dot").attr("cx",t=>c.get(t.id).x-k*Math.cos(Math.PI/6)).attr("cy",t=>c.get(t.id).y+k*Math.sin(Math.PI/6)).attr("r",_).attr("fill","white").attr("stroke",d.componentStroke).attr("stroke-width",2),T.append("circle").attr("class","wardley-market-dot").attr("cx",t=>c.get(t.id).x+k*Math.cos(Math.PI/6)).attr("cy",t=>c.get(t.id).y+k*Math.sin(Math.PI/6)).attr("r",_).attr("fill","white").attr("stroke",d.componentStroke).attr("stroke-width",2),z.filter(t=>t.isPipelineParent===!0).append("rect").attr("x",t=>c.get(t.id).x-m/2).attr("y",t=>c.get(t.id).y-m/2).attr("width",m).attr("height",m).attr("fill",d.componentFill).attr("stroke",d.componentStroke).attr("stroke-width",1),z.filter(t=>t.inertia===!0).append("line").attr("class","wardley-inertia").attr("x1",t=>{const n=c.get(t.id);let s=t.isPipelineParent?m/2+15:o.nodeRadius+15;return t.sourceStrategy&&(s+=o.nodeRadius+10),n.x+s}).attr("y1",t=>{const n=c.get(t.id),s=t.isPipelineParent?m:o.nodeRadius*2;return n.y-s/2}).attr("x2",t=>{const n=c.get(t.id);let s=t.isPipelineParent?m/2+15:o.nodeRadius+15;return t.sourceStrategy&&(s+=o.nodeRadius+10),n.x+s}).attr("y2",t=>{const n=c.get(t.id),s=t.isPipelineParent?m:o.nodeRadius*2;return n.y+s/2}).attr("stroke",d.componentStroke).attr("stroke-width",6),z.append("text").attr("x",t=>{const n=c.get(t.id);if(t.className==="anchor")return t.labelOffsetX!==void 0?n.x+t.labelOffsetX:n.x;let s=o.nodeLabelOffset;t.sourceStrategy&&t.labelOffsetX===void 0&&(s+=10);const i=t.labelOffsetX??s;return n.x+i}).attr("y",t=>{const n=c.get(t.id);if(t.className==="anchor")return t.labelOffsetY!==void 0?n.y+t.labelOffsetY:n.y-3;let s=-o.nodeLabelOffset;t.sourceStrategy&&t.labelOffsetY===void 0&&(s-=10);const i=t.labelOffsetY??s;return n.y+i}).attr("class","wardley-node-label").attr("fill",t=>t.className==="evolved"?d.evolutionStroke:t.className==="anchor"?"#000":d.componentLabelColor).attr("font-size",o.labelFontSize).attr("font-weight",t=>t.className==="anchor"?"bold":"normal").attr("text-anchor",t=>t.className==="anchor"?"middle":"start").attr("dominant-baseline",t=>t.className==="anchor"?"middle":"auto").text(t=>t.label),g.annotations.length>0){const t=S.append("g").attr("class","wardley-annotations");if(g.annotations.forEach(n=>{const s=n.coordinates.map(i=>({x:C(i.x),y:E(i.y)}));if(s.length>1)for(let i=0;i<s.length-1;i++)t.append("line").attr("class","wardley-annotation-line").attr("x1",s[i].x).attr("y1",s[i].y).attr("x2",s[i+1].x).attr("y2",s[i+1].y).attr("stroke",d.axisColor).attr("stroke-width",1.5).attr("stroke-dasharray","4 4");s.forEach(i=>{const p=t.append("g").attr("class","wardley-annotation");p.append("circle").attr("cx",i.x).attr("cy",i.y).attr("r",10).attr("fill","white").attr("stroke",d.axisColor).attr("stroke-width",1.5),p.append("text").attr("x",i.x).attr("y",i.y).attr("text-anchor","middle").attr("dominant-baseline","central").attr("font-size",10).attr("fill",d.axisTextColor).attr("font-weight","bold").text(n.number)})}),g.annotationsBox){let n=C(g.annotationsBox.x),s=E(g.annotationsBox.y);const i=10,p=16,l=11,x=t.append("g").attr("class","wardley-annotations-box"),f=[...g.annotations].filter(w=>w.text).sort((w,$)=>w.number-$.number),u=[];if(f.forEach((w,$)=>{const A=x.append("text").attr("x",n+i).attr("y",s+i+($+1)*p).attr("font-size",l).attr("fill",d.axisTextColor).attr("text-anchor","start").attr("dominant-baseline","middle").text(`${w.number}. ${w.text}`);u.push(A)}),u.length>0){let w=0,$=0;u.forEach(V=>{const G=V.node(),Mt=G.getComputedTextLength();w=Math.max(w,Mt);const Lt=G.getBBox();$=Math.max($,Lt.height)});const A=w+i*2+105,D=f.length*p+i*2+$/2,B=o.padding,vt=M-o.padding-A,St=o.padding,$t=b-o.padding-D;n=Math.max(B,Math.min(n,vt)),s=Math.max(St,Math.min(s,$t)),u.forEach((V,G)=>{V.attr("x",n+i).attr("y",s+i+(G+1)*p)}),x.insert("rect","text").attr("x",n).attr("y",s).attr("width",A).attr("height",D).attr("fill","white").attr("stroke",d.axisColor).attr("stroke-width",1.5).attr("rx",4).attr("ry",4)}}}if(g.notes.length>0){const t=S.append("g").attr("class","wardley-notes");g.notes.forEach(n=>{const s=C(n.x),i=E(n.y);t.append("text").attr("x",s).attr("y",i).attr("text-anchor","start").attr("font-size",11).attr("fill",d.axisTextColor).attr("font-weight","bold").text(n.text)})}if(g.accelerators.length>0){const t=S.append("g").attr("class","wardley-accelerators");g.accelerators.forEach(n=>{const s=C(n.x),i=E(n.y),p=60,l=30,x=20,f=`
|
|
3
3
|
M ${s} ${i-l/2}
|
|
4
4
|
L ${s+p-x} ${i-l/2}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{_ as a,s as gi,g as xi,t as Xt,q as di,a as fi,b as pi,l as Yt,L as mi,e as yi,A as bi,F as _t,H as Nt,I as Ai,a1 as wi,i as Ci,aC as Si,a9 as Wt}from"../app.
|
|
1
|
+
import{_ as a,s as gi,g as xi,t as Xt,q as di,a as fi,b as pi,l as Yt,L as mi,e as yi,A as bi,F as _t,H as Nt,I as Ai,a1 as wi,i as Ci,aC as Si,a9 as Wt}from"../app.CJLKDVza.js";import{i as _i}from"./init.Gi6I4Gst.js";import{o as ki}from"./ordinal.DBvzRdQf.js";import{l as zt}from"./linear.HwBsflwN.js";import"./framework.BNw1pucY.js";import"./theme.BDHBZUkP.js";import"./defaultLocale.C4B-KCzX.js";function Ri(e,t,i){e=+e,t=+t,i=(n=arguments.length)<2?(t=e,e=0,1):n<3?1:+i;for(var s=-1,n=Math.max(0,Math.ceil((t-e)/i))|0,o=new Array(n);++s<n;)o[s]=e+s*i;return o}function bt(){var e=ki().unknown(void 0),t=e.domain,i=e.range,s=0,n=1,o,u,p=!1,f=0,T=0,P=.5;delete e.unknown;function _(){var y=t().length,E=n<s,v=E?n:s,L=E?s:n;o=(L-v)/Math.max(1,y-f+T*2),p&&(o=Math.floor(o)),v+=(L-v-o*(y-f))*P,u=o*(1-f),p&&(v=Math.round(v),u=Math.round(u));var I=Ri(y).map(function(m){return v+o*m});return i(E?I.reverse():I)}return e.domain=function(y){return arguments.length?(t(y),_()):t()},e.range=function(y){return arguments.length?([s,n]=y,s=+s,n=+n,_()):[s,n]},e.rangeRound=function(y){return[s,n]=y,s=+s,n=+n,p=!0,_()},e.bandwidth=function(){return u},e.step=function(){return o},e.round=function(y){return arguments.length?(p=!!y,_()):p},e.padding=function(y){return arguments.length?(f=Math.min(1,T=+y),_()):f},e.paddingInner=function(y){return arguments.length?(f=Math.min(1,y),_()):f},e.paddingOuter=function(y){return arguments.length?(T=+y,_()):T},e.align=function(y){return arguments.length?(P=Math.max(0,Math.min(1,y)),_()):P},e.copy=function(){return bt(t(),[s,n]).round(p).paddingInner(f).paddingOuter(T).align(P)},_i.apply(_(),arguments)}var At=function(){var e=a(function(F,h,c,g){for(c=c||{},g=F.length;g--;c[F[g]]=h);return c},"o"),t=[1,10,12,14,16,18,19,21,23],i=[2,6],s=[1,3],n=[1,5],o=[1,6],u=[1,7],p=[1,5,10,12,14,16,18,19,21,23,34,35,36],f=[1,25],T=[1,26],P=[1,28],_=[1,29],y=[1,30],E=[1,31],v=[1,32],L=[1,33],I=[1,34],m=[1,35],R=[1,36],l=[1,37],W=[1,43],O=[1,42],X=[1,47],Y=[1,50],S=[1,10,12,14,16,18,19,21,23,34,35,36],U=[1,10,12,14,16,18,19,21,23,24,26,27,28,34,35,36],b=[1,10,12,14,16,18,19,21,23,24,26,27,28,34,35,36,41,42,43,44,45,46,47,48,49,50],w=[1,64],V={trace:a(function(){},"trace"),yy:{},symbols_:{error:2,start:3,eol:4,XYCHART:5,chartConfig:6,document:7,CHART_ORIENTATION:8,statement:9,title:10,text:11,X_AXIS:12,parseXAxis:13,Y_AXIS:14,parseYAxis:15,LINE:16,plotData:17,BAR:18,acc_title:19,acc_title_value:20,acc_descr:21,acc_descr_value:22,acc_descr_multiline_value:23,SQUARE_BRACES_START:24,commaSeparatedNumbers:25,SQUARE_BRACES_END:26,NUMBER_WITH_DECIMAL:27,COMMA:28,xAxisData:29,bandData:30,ARROW_DELIMITER:31,commaSeparatedTexts:32,yAxisData:33,NEWLINE:34,SEMI:35,EOF:36,alphaNum:37,STR:38,MD_STR:39,alphaNumToken:40,AMP:41,NUM:42,ALPHA:43,PLUS:44,EQUALS:45,MULT:46,DOT:47,BRKT:48,MINUS:49,UNDERSCORE:50,$accept:0,$end:1},terminals_:{2:"error",5:"XYCHART",8:"CHART_ORIENTATION",10:"title",12:"X_AXIS",14:"Y_AXIS",16:"LINE",18:"BAR",19:"acc_title",20:"acc_title_value",21:"acc_descr",22:"acc_descr_value",23:"acc_descr_multiline_value",24:"SQUARE_BRACES_START",26:"SQUARE_BRACES_END",27:"NUMBER_WITH_DECIMAL",28:"COMMA",31:"ARROW_DELIMITER",34:"NEWLINE",35:"SEMI",36:"EOF",38:"STR",39:"MD_STR",41:"AMP",42:"NUM",43:"ALPHA",44:"PLUS",45:"EQUALS",46:"MULT",47:"DOT",48:"BRKT",49:"MINUS",50:"UNDERSCORE"},productions_:[0,[3,2],[3,3],[3,2],[3,1],[6,1],[7,0],[7,2],[9,2],[9,2],[9,2],[9,2],[9,2],[9,3],[9,2],[9,3],[9,2],[9,2],[9,1],[17,3],[25,3],[25,1],[13,1],[13,2],[13,1],[29,1],[29,3],[30,3],[32,3],[32,1],[15,1],[15,2],[15,1],[33,3],[4,1],[4,1],[4,1],[11,1],[11,1],[11,1],[37,1],[37,2],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1]],performAction:a(function(h,c,g,x,C,r,rt){var d=r.length-1;switch(C){case 5:x.setOrientation(r[d]);break;case 9:x.setDiagramTitle(r[d].text.trim());break;case 12:x.setLineData({text:"",type:"text"},r[d]);break;case 13:x.setLineData(r[d-1],r[d]);break;case 14:x.setBarData({text:"",type:"text"},r[d]);break;case 15:x.setBarData(r[d-1],r[d]);break;case 16:this.$=r[d].trim(),x.setAccTitle(this.$);break;case 17:case 18:this.$=r[d].trim(),x.setAccDescription(this.$);break;case 19:this.$=r[d-1];break;case 20:this.$=[Number(r[d-2]),...r[d]];break;case 21:this.$=[Number(r[d])];break;case 22:x.setXAxisTitle(r[d]);break;case 23:x.setXAxisTitle(r[d-1]);break;case 24:x.setXAxisTitle({type:"text",text:""});break;case 25:x.setXAxisBand(r[d]);break;case 26:x.setXAxisRangeData(Number(r[d-2]),Number(r[d]));break;case 27:this.$=r[d-1];break;case 28:this.$=[r[d-2],...r[d]];break;case 29:this.$=[r[d]];break;case 30:x.setYAxisTitle(r[d]);break;case 31:x.setYAxisTitle(r[d-1]);break;case 32:x.setYAxisTitle({type:"text",text:""});break;case 33:x.setYAxisRangeData(Number(r[d-2]),Number(r[d]));break;case 37:this.$={text:r[d],type:"text"};break;case 38:this.$={text:r[d],type:"text"};break;case 39:this.$={text:r[d],type:"markdown"};break;case 40:this.$=r[d];break;case 41:this.$=r[d-1]+""+r[d];break}},"anonymous"),table:[e(t,i,{3:1,4:2,7:4,5:s,34:n,35:o,36:u}),{1:[3]},e(t,i,{4:2,7:4,3:8,5:s,34:n,35:o,36:u}),e(t,i,{4:2,7:4,6:9,3:10,5:s,8:[1,11],34:n,35:o,36:u}),{1:[2,4],9:12,10:[1,13],12:[1,14],14:[1,15],16:[1,16],18:[1,17],19:[1,18],21:[1,19],23:[1,20]},e(p,[2,34]),e(p,[2,35]),e(p,[2,36]),{1:[2,1]},e(t,i,{4:2,7:4,3:21,5:s,34:n,35:o,36:u}),{1:[2,3]},e(p,[2,5]),e(t,[2,7],{4:22,34:n,35:o,36:u}),{11:23,37:24,38:f,39:T,40:27,41:P,42:_,43:y,44:E,45:v,46:L,47:I,48:m,49:R,50:l},{11:39,13:38,24:W,27:O,29:40,30:41,37:24,38:f,39:T,40:27,41:P,42:_,43:y,44:E,45:v,46:L,47:I,48:m,49:R,50:l},{11:45,15:44,27:X,33:46,37:24,38:f,39:T,40:27,41:P,42:_,43:y,44:E,45:v,46:L,47:I,48:m,49:R,50:l},{11:49,17:48,24:Y,37:24,38:f,39:T,40:27,41:P,42:_,43:y,44:E,45:v,46:L,47:I,48:m,49:R,50:l},{11:52,17:51,24:Y,37:24,38:f,39:T,40:27,41:P,42:_,43:y,44:E,45:v,46:L,47:I,48:m,49:R,50:l},{20:[1,53]},{22:[1,54]},e(S,[2,18]),{1:[2,2]},e(S,[2,8]),e(S,[2,9]),e(U,[2,37],{40:55,41:P,42:_,43:y,44:E,45:v,46:L,47:I,48:m,49:R,50:l}),e(U,[2,38]),e(U,[2,39]),e(b,[2,40]),e(b,[2,42]),e(b,[2,43]),e(b,[2,44]),e(b,[2,45]),e(b,[2,46]),e(b,[2,47]),e(b,[2,48]),e(b,[2,49]),e(b,[2,50]),e(b,[2,51]),e(S,[2,10]),e(S,[2,22],{30:41,29:56,24:W,27:O}),e(S,[2,24]),e(S,[2,25]),{31:[1,57]},{11:59,32:58,37:24,38:f,39:T,40:27,41:P,42:_,43:y,44:E,45:v,46:L,47:I,48:m,49:R,50:l},e(S,[2,11]),e(S,[2,30],{33:60,27:X}),e(S,[2,32]),{31:[1,61]},e(S,[2,12]),{17:62,24:Y},{25:63,27:w},e(S,[2,14]),{17:65,24:Y},e(S,[2,16]),e(S,[2,17]),e(b,[2,41]),e(S,[2,23]),{27:[1,66]},{26:[1,67]},{26:[2,29],28:[1,68]},e(S,[2,31]),{27:[1,69]},e(S,[2,13]),{26:[1,70]},{26:[2,21],28:[1,71]},e(S,[2,15]),e(S,[2,26]),e(S,[2,27]),{11:59,32:72,37:24,38:f,39:T,40:27,41:P,42:_,43:y,44:E,45:v,46:L,47:I,48:m,49:R,50:l},e(S,[2,33]),e(S,[2,19]),{25:73,27:w},{26:[2,28]},{26:[2,20]}],defaultActions:{8:[2,1],10:[2,3],21:[2,2],72:[2,28],73:[2,20]},parseError:a(function(h,c){if(c.recoverable)this.trace(h);else{var g=new Error(h);throw g.hash=c,g}},"parseError"),parse:a(function(h){var c=this,g=[0],x=[],C=[null],r=[],rt=this.table,d="",ct=0,It=0,hi=2,Mt=1,li=r.slice.call(arguments,1),D=Object.create(this.lexer),$={yy:{}};for(var ft in this.yy)Object.prototype.hasOwnProperty.call(this.yy,ft)&&($.yy[ft]=this.yy[ft]);D.setInput(h,$.yy),$.yy.lexer=D,$.yy.parser=this,typeof D.yylloc>"u"&&(D.yylloc={});var pt=D.yylloc;r.push(pt);var ci=D.options&&D.options.ranges;typeof $.yy.parseError=="function"?this.parseError=$.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function ui(B){g.length=g.length-2*B,C.length=C.length-B,r.length=r.length-B}a(ui,"popStack");function Vt(){var B;return B=x.pop()||D.lex()||Mt,typeof B!="number"&&(B instanceof Array&&(x=B,B=x.pop()),B=c.symbols_[B]||B),B}a(Vt,"lex");for(var M,q,z,mt,G={},ut,N,Bt,gt;;){if(q=g[g.length-1],this.defaultActions[q]?z=this.defaultActions[q]:((M===null||typeof M>"u")&&(M=Vt()),z=rt[q]&&rt[q][M]),typeof z>"u"||!z.length||!z[0]){var yt="";gt=[];for(ut in rt[q])this.terminals_[ut]&&ut>hi&>.push("'"+this.terminals_[ut]+"'");D.showPosition?yt="Parse error on line "+(ct+1)+`:
|
|
2
2
|
`+D.showPosition()+`
|
|
3
3
|
Expecting `+gt.join(", ")+", got '"+(this.terminals_[M]||M)+"'":yt="Parse error on line "+(ct+1)+": Unexpected "+(M==Mt?"end of input":"'"+(this.terminals_[M]||M)+"'"),this.parseError(yt,{text:D.match,token:this.terminals_[M]||M,line:D.yylineno,loc:pt,expected:gt})}if(z[0]instanceof Array&&z.length>1)throw new Error("Parse Error: multiple actions possible at state: "+q+", token: "+M);switch(z[0]){case 1:g.push(M),C.push(D.yytext),r.push(D.yylloc),g.push(z[1]),M=null,It=D.yyleng,d=D.yytext,ct=D.yylineno,pt=D.yylloc;break;case 2:if(N=this.productions_[z[1]][1],G.$=C[C.length-N],G._$={first_line:r[r.length-(N||1)].first_line,last_line:r[r.length-1].last_line,first_column:r[r.length-(N||1)].first_column,last_column:r[r.length-1].last_column},ci&&(G._$.range=[r[r.length-(N||1)].range[0],r[r.length-1].range[1]]),mt=this.performAction.apply(G,[d,It,ct,$.yy,z[1],C,r].concat(li)),typeof mt<"u")return mt;N&&(g=g.slice(0,-1*N*2),C=C.slice(0,-1*N),r=r.slice(0,-1*N)),g.push(this.productions_[z[1]][0]),C.push(G.$),r.push(G._$),Bt=rt[g[g.length-2]][g[g.length-1]],g.push(Bt);break;case 3:return!0}}return!0},"parse")},k=function(){var F={EOF:1,parseError:a(function(c,g){if(this.yy.parser)this.yy.parser.parseError(c,g);else throw new Error(c)},"parseError"),setInput:a(function(h,c){return this.yy=c||this.yy||{},this._input=h,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:a(function(){var h=this._input[0];this.yytext+=h,this.yyleng++,this.offset++,this.match+=h,this.matched+=h;var c=h.match(/(?:\r\n?|\n).*/g);return c?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),h},"input"),unput:a(function(h){var c=h.length,g=h.split(/(?:\r\n?|\n)/g);this._input=h+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-c),this.offset-=c;var x=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),g.length-1&&(this.yylineno-=g.length-1);var C=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:g?(g.length===x.length?this.yylloc.first_column:0)+x[x.length-g.length].length-g[0].length:this.yylloc.first_column-c},this.options.ranges&&(this.yylloc.range=[C[0],C[0]+this.yyleng-c]),this.yyleng=this.yytext.length,this},"unput"),more:a(function(){return this._more=!0,this},"more"),reject:a(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).
|
|
4
4
|
`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:a(function(h){this.unput(this.match.slice(h))},"less"),pastInput:a(function(){var h=this.matched.substr(0,this.matched.length-this.match.length);return(h.length>20?"...":"")+h.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:a(function(){var h=this.match;return h.length<20&&(h+=this._input.substr(0,20-h.length)),(h.substr(0,20)+(h.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:a(function(){var h=this.pastInput(),c=new Array(h.length+1).join("-");return h+this.upcomingInput()+`
|
|
@@ -59,7 +59,7 @@ import{_ as i,c as a,o as e,a3 as n}from"./chunks/framework.BNw1pucY.js";const c
|
|
|
59
59
|
<span class="line"><span>bdk eval --dir . --json --no-stream \\</span></span>
|
|
60
60
|
<span class="line"><span> --junit reports/evals.xml \\</span></span>
|
|
61
61
|
<span class="line"><span> --artifacts reports/evals \\</span></span>
|
|
62
|
-
<span class="line"><span> > reports/evals.json</span></span></code></pre></div><p>Run <code>--tag smoke</code> on pull requests and the full suite on a schedule when cost or latency makes every-push coverage impractical. Use soft scores for a new probabilistic benchmark until its threshold is trustworthy.</p><p>The <a href="./reference/cli.html#eval">CLI reference</a> covers selectors,
|
|
62
|
+
<span class="line"><span> > reports/evals.json</span></span></code></pre></div><p>Run <code>--tag smoke</code> on pull requests and the full suite on a schedule when cost or latency makes every-push coverage impractical. Use soft scores for a new probabilistic benchmark until its threshold is trustworthy.</p><p>The <a href="./reference/cli.html#eval">CLI reference</a> covers selectors, server-side batches, exit codes, and JSON output.</p><h2 id="keep-side-effects-out-of-eval-sessions" tabindex="-1">Keep side effects out of eval sessions <a class="header-anchor" href="#keep-side-effects-out-of-eval-sessions" aria-label="Permalink to "Keep side effects out of eval sessions""></a></h2><p>Eval sessions carry <code>purpose: "eval"</code>. Check it at the deterministic write boundary and return the decision without performing the external action:</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">async </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">execute</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">({ findings }, ctx) {</span></span>
|
|
63
63
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (ctx.session.purpose </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">===</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "eval"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
|
64
64
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
|
|
65
65
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> posted: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
|
package/dist/docs/assets/{reference_skills.md.C0guGcH0.js → reference_skills.md.ClkMoQsV.js}
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import{_ as i,c as e,o as t,a3 as a}from"./chunks/framework.BNw1pucY.js";const c=JSON.parse('{"title":"Skills","description":"On-demand procedures the model loads only when relevant, in three authoring forms.","frontmatter":{"title":"Skills","description":"On-demand procedures the model loads only when relevant, in three authoring forms."},"headers":[],"relativePath":"reference/skills.md","filePath":"reference/skills.md"}'),l={name:"reference/skills.md"};function n(h,s,r,o,d,p){return t(),e("div",null,[...s[0]||(s[0]=[a(`<h1 id="skills" tabindex="-1">Skills <a class="header-anchor" href="#skills" aria-label="Permalink to "Skills""></a></h1><p>A skill is an on-demand procedure following the <code>SKILL.md</code> convention: the harness advertises each skill by its description, and the model loads the full content only when the task calls for it. Skills are how you give an agent a multi-step workflow without carrying it in the always-on <a href="./instructions.html">instructions</a>.</p><h2 id="authoring-forms" tabindex="-1">Authoring forms <a class="header-anchor" href="#authoring-forms" aria-label="Permalink to "Authoring forms""></a></h2><p>Skills support three authoring forms.</p><table tabindex="0"><thead><tr><th>Form</th><th>Reach for it when</th></tr></thead><tbody><tr><td><code>bot/skills/<name>.md</code></td><td>Static Markdown. Optional <code>description</code> frontmatter; the first body line is the fallback.</td></tr><tr><td><code>bot/skills/<name>/SKILL.md</code> plus siblings</td><td>A packaged directory with reference files (<code>references/…</code>). Requires <code>description</code> frontmatter.</td></tr><tr><td><code>bot/skills/<name>.ts</code></td><td>Generated content, with <code>defineSkill</code> from <code>@cursor/bdk/skills</code>.</td></tr></tbody></table><p>Use flat Markdown for static content:</p><div class="language-md vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">md</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#
|
|
2
|
-
<span class="line"><span style="--shiki-light:#
|
|
3
|
-
<span class="line"><span style="--shiki-light:#
|
|
1
|
+
import{_ as i,c as e,o as t,a3 as a}from"./chunks/framework.BNw1pucY.js";const c=JSON.parse('{"title":"Skills","description":"On-demand procedures the model loads only when relevant, in three authoring forms.","frontmatter":{"title":"Skills","description":"On-demand procedures the model loads only when relevant, in three authoring forms."},"headers":[],"relativePath":"reference/skills.md","filePath":"reference/skills.md"}'),l={name:"reference/skills.md"};function n(h,s,r,o,d,p){return t(),e("div",null,[...s[0]||(s[0]=[a(`<h1 id="skills" tabindex="-1">Skills <a class="header-anchor" href="#skills" aria-label="Permalink to "Skills""></a></h1><p>A skill is an on-demand procedure following the <code>SKILL.md</code> convention: the harness advertises each skill by its description, and the model loads the full content only when the task calls for it. Skills are how you give an agent a multi-step workflow without carrying it in the always-on <a href="./instructions.html">instructions</a>.</p><h2 id="authoring-forms" tabindex="-1">Authoring forms <a class="header-anchor" href="#authoring-forms" aria-label="Permalink to "Authoring forms""></a></h2><p>Skills support three authoring forms.</p><table tabindex="0"><thead><tr><th>Form</th><th>Reach for it when</th></tr></thead><tbody><tr><td><code>bot/skills/<name>.md</code></td><td>Static Markdown. Optional <code>description</code> frontmatter; the first body line is the fallback.</td></tr><tr><td><code>bot/skills/<name>/SKILL.md</code> plus siblings</td><td>A packaged directory with reference files (<code>references/…</code>). Requires <code>description</code> frontmatter.</td></tr><tr><td><code>bot/skills/<name>.ts</code></td><td>Generated content, with <code>defineSkill</code> from <code>@cursor/bdk/skills</code>.</td></tr></tbody></table><p>Use flat Markdown for static content:</p><div class="language-md vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">md</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-light-font-weight:bold;--shiki-dark:#79B8FF;--shiki-dark-font-weight:bold;">---</span></span>
|
|
2
|
+
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">description: Use when a pull request needs a structured approval checklist.</span></span>
|
|
3
|
+
<span class="line"><span style="--shiki-light:#005CC5;--shiki-light-font-weight:bold;--shiki-dark:#79B8FF;--shiki-dark-font-weight:bold;">---</span></span>
|
|
4
4
|
<span class="line"></span>
|
|
5
5
|
<span class="line"><span style="--shiki-light:#005CC5;--shiki-light-font-weight:bold;--shiki-dark:#79B8FF;--shiki-dark-font-weight:bold;"># PR review checklist</span></span>
|
|
6
6
|
<span class="line"></span>
|
|
@@ -11,4 +11,4 @@ import{_ as s,c as i,o as a,a3 as t}from"./chunks/framework.BNw1pucY.js";const k
|
|
|
11
11
|
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> prompt</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">api-review.md</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # optional extra rubric, same directory</span></span>
|
|
12
12
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> - </span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">paths</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"src/billing/**"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]</span></span>
|
|
13
13
|
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> user</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">alice</span></span>
|
|
14
|
-
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> human_review_required</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # the agent never approves; a person must</span></span></code></pre></div><p><code>self_review: true</code> lets a listed owner's own PRs clear their rule. <code>global_exclusions</code> in the root policy opts paths out entirely.</p><h2 id="what-one-review-does" tabindex="-1">What one review does <a class="header-anchor" href="#what-one-review-does" aria-label="Permalink to "What one review does""></a></h2><p>One model turn per PR head assesses the host-fetched diff against the base rubric plus any matched rule prompts, then records a verdict with <code>record_review</code>. The host recomputes the policy from trusted state and applies the deterministic decision:</p><ul><li><strong>Approve</strong> when the tier is low and no matched rule demands a human, bound to the head SHA.</li><li><strong>Request reviewers</strong> otherwise: the policy owners (max 2, never the author), plus one status comment the agent keeps updated in place.</li></ul><p>The model never writes to GitHub. A broken policy file fails closed with a comment listing the validation issues.</p><h2 id="rubric" tabindex="-1">Rubric <a class="header-anchor" href="#rubric" aria-label="Permalink to "Rubric""></a></h2><p>Edit <code>bot/lib/owners/prompts/base-review.md</code> for the risk tiers and their boundaries. Per-area guidance belongs in policy <code>prompt:</code> files next to the policy that names them. The next review reads both.</p><h2 id="evals" tabindex="-1">Evals <a class="header-anchor" href="#evals" aria-label="Permalink to "Evals""></a></h2><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk eval</span></span></code></pre></div><p>Three smoke reviews (docs-only, auth deletion, prompt injection). Eval sessions skip GitHub writes.</p>`,
|
|
14
|
+
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> human_review_required</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # the agent never approves; a person must</span></span></code></pre></div><p><code>self_review: true</code> lets a listed owner's own PRs clear their rule. <code>global_exclusions</code> in the root policy opts paths out entirely.</p><h2 id="what-one-review-does" tabindex="-1">What one review does <a class="header-anchor" href="#what-one-review-does" aria-label="Permalink to "What one review does""></a></h2><p>One model turn per PR head assesses the host-fetched diff against the base rubric plus any matched rule prompts, then records a verdict with <code>record_review</code>. The host recomputes the policy from trusted state and applies the deterministic decision:</p><ul><li><strong>Approve</strong> when the tier is low and no matched rule demands a human, bound to the head SHA.</li><li><strong>Request reviewers</strong> otherwise: the policy owners (max 2, never the author), plus one status comment the agent keeps updated in place.</li></ul><p>The model never writes to GitHub. A broken policy file fails closed with a comment listing the validation issues.</p><h2 id="rubric" tabindex="-1">Rubric <a class="header-anchor" href="#rubric" aria-label="Permalink to "Rubric""></a></h2><p>Edit <code>bot/lib/owners/prompts/base-review.md</code> for the risk tiers and their boundaries. Per-area guidance belongs in policy <code>prompt:</code> files next to the policy that names them. The next review reads both.</p><h2 id="evals" tabindex="-1">Evals <a class="header-anchor" href="#evals" aria-label="Permalink to "Evals""></a></h2><p>Use the three smoke reviews as a local exercise:</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk eval</span></span></code></pre></div><p>Three smoke reviews (docs-only, auth deletion, prompt injection). Eval sessions skip GitHub writes.</p>`,25)])])}const u=s(n,[["render",l]]);export{k as __pageData,u as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as s,c as i,o as a,a3 as t}from"./chunks/framework.BNw1pucY.js";const k=JSON.parse('{"title":"Review pull requests with owners policies","description":"Scaffold the agent, commit .agentic-owners policies, and let it risk-tier PRs, request the owners, and approve what the policy allows.","frontmatter":{"title":"Review pull requests with owners policies","description":"Scaffold the agent, commit .agentic-owners policies, and let it risk-tier PRs, request the owners, and approve what the policy allows."},"headers":[],"relativePath":"templates/agentic-owners.md","filePath":"templates/agentic-owners.md"}'),n={name:"templates/agentic-owners.md"};function l(o,e,p,r,h,d){return a(),i("div",null,[...e[0]||(e[0]=[t("",
|
|
1
|
+
import{_ as s,c as i,o as a,a3 as t}from"./chunks/framework.BNw1pucY.js";const k=JSON.parse('{"title":"Review pull requests with owners policies","description":"Scaffold the agent, commit .agentic-owners policies, and let it risk-tier PRs, request the owners, and approve what the policy allows.","frontmatter":{"title":"Review pull requests with owners policies","description":"Scaffold the agent, commit .agentic-owners policies, and let it risk-tier PRs, request the owners, and approve what the policy allows."},"headers":[],"relativePath":"templates/agentic-owners.md","filePath":"templates/agentic-owners.md"}'),n={name:"templates/agentic-owners.md"};function l(o,e,p,r,h,d){return a(),i("div",null,[...e[0]||(e[0]=[t("",25)])])}const u=s(n,[["render",l]]);export{k as __pageData,u as default};
|
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
import{_ as t,c as a,o as s,a3 as o}from"./chunks/framework.BNw1pucY.js";const u=JSON.parse('{"title":"Review pull requests for exploitable bugs","description":"Scaffold the agent, pick repos, replay a PR, and deploy.","frontmatter":{"title":"Review pull requests for exploitable bugs","description":"Scaffold the agent, pick repos, replay a PR, and deploy."},"headers":[],"relativePath":"templates/security-reviewer.md","filePath":"templates/security-reviewer.md"}'),i={name:"templates/security-reviewer.md"};function r(n,e,l,d,
|
|
2
|
-
<span class="line"><span>
|
|
1
|
+
import{_ as t,c as a,o as s,a3 as o}from"./chunks/framework.BNw1pucY.js";const u=JSON.parse('{"title":"Review pull requests for exploitable bugs","description":"Scaffold the agent, pick repos, replay a PR, and deploy.","frontmatter":{"title":"Review pull requests for exploitable bugs","description":"Scaffold the agent, pick repos, replay a PR, and deploy."},"headers":[],"relativePath":"templates/security-reviewer.md","filePath":"templates/security-reviewer.md"}'),i={name:"templates/security-reviewer.md"};function r(n,e,l,p,d,c){return s(),a("div",null,[...e[0]||(e[0]=[o(`<h1 id="review-pull-requests-for-exploitable-bugs" tabindex="-1">Review pull requests for exploitable bugs <a class="header-anchor" href="#review-pull-requests-for-exploitable-bugs" aria-label="Permalink to "Review pull requests for exploitable bugs""></a></h1><p>This agent reads a pull request diff and posts one review comment. It reports exploitable bugs: injection, authz bypass, secret leaks, SSRF, RCE. Style nits stay out.</p><p>This template is one model turn: read the diff, then post one comment.</p><h2 id="scaffold" tabindex="-1">Scaffold <a class="header-anchor" href="#scaffold" aria-label="Permalink to "Scaffold""></a></h2><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk init ./security-reviewer --template security-reviewer \\</span></span>
|
|
2
|
+
<span class="line"><span> --var repos=acme/api</span></span></code></pre></div><p><code>--var repos</code> must name a repository already connected in Cursor for your account. Separate multiple repositories with commas; they must share one owner. <code>init</code> writes the list to <code>bot/lib/repos.ts</code>.</p><h2 id="connect-github-through-cursor" tabindex="-1">Connect GitHub through Cursor <a class="header-anchor" href="#connect-github-through-cursor" aria-label="Permalink to "Connect GitHub through Cursor""></a></h2><p>Connect GitHub in Cursor for those repositories (Settings or <a href="https://cursor.com/dashboard" target="_blank" rel="noreferrer">cursor.com/dashboard</a>). Sign the host in:</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>cd security-reviewer</span></span>
|
|
3
|
+
<span class="line"><span>bdk login</span></span></code></pre></div><p><code>cursorAccount</code> pulls SCM events from Cursor and mints a short-lived, repo-scoped credential. <code>ctx.host.github</code> and child <code>gh</code> commands share it. See the <a href="./../guides/github.html">GitHub guide</a>.</p><h2 id="first-review" tabindex="-1">First review <a class="header-anchor" href="#first-review" aria-label="Permalink to "First review""></a></h2><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk dev</span></span></code></pre></div><p><code>dev</code> starts the Cursor event relay for the watched repos. To drive a known PR without waiting on a live push:</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk github replay https://github.com/acme/api/pull/12 --dir .</span></span></code></pre></div><p><code>replay</code> needs pull access. Draft PRs and repos outside <code>bot/lib/repos.ts</code> are ignored. The channel writes <code>pr/diff.patch</code> after the wake is acknowledged, then starts a model turn. The model calls <code>post_findings</code> once.</p><p>Chat replies stay in the playground. <code>post_findings</code> writes the GitHub comment.</p><h2 id="what-to-edit" tabindex="-1">What to edit <a class="header-anchor" href="#what-to-edit" aria-label="Permalink to "What to edit""></a></h2><ul><li><code>bot/lib/repos.ts</code>: watched repos</li><li><code>bot/instructions.md</code>: what counts as a finding and the comment shape</li><li><code>evals/review.eval.ts</code>: smoke cases</li></ul><h2 id="evals" tabindex="-1">Evals <a class="header-anchor" href="#evals" aria-label="Permalink to "Evals""></a></h2><p>Use the two smoke cases, one XSS fixture and one docs-only change, as a local exercise:</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk eval</span></span></code></pre></div><p>Eval sessions skip the GitHub write.</p><h2 id="deploy" tabindex="-1">Deploy <a class="header-anchor" href="#deploy" aria-label="Permalink to "Deploy""></a></h2><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk deploy</span></span></code></pre></div><p>Run it from the agent's git checkout. The command infers repository, ref, path, and slug. The deployment uses the team's Cursor GitHub connection for the same watched repos.</p>`,25)])])}const b=t(i,[["render",r]]);export{u as __pageData,b as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as t,c as a,o as s,a3 as o}from"./chunks/framework.BNw1pucY.js";const u=JSON.parse('{"title":"Review pull requests for exploitable bugs","description":"Scaffold the agent, pick repos, replay a PR, and deploy.","frontmatter":{"title":"Review pull requests for exploitable bugs","description":"Scaffold the agent, pick repos, replay a PR, and deploy."},"headers":[],"relativePath":"templates/security-reviewer.md","filePath":"templates/security-reviewer.md"}'),i={name:"templates/security-reviewer.md"};function r(n,e,l,d,
|
|
1
|
+
import{_ as t,c as a,o as s,a3 as o}from"./chunks/framework.BNw1pucY.js";const u=JSON.parse('{"title":"Review pull requests for exploitable bugs","description":"Scaffold the agent, pick repos, replay a PR, and deploy.","frontmatter":{"title":"Review pull requests for exploitable bugs","description":"Scaffold the agent, pick repos, replay a PR, and deploy."},"headers":[],"relativePath":"templates/security-reviewer.md","filePath":"templates/security-reviewer.md"}'),i={name:"templates/security-reviewer.md"};function r(n,e,l,p,d,c){return s(),a("div",null,[...e[0]||(e[0]=[o("",25)])])}const b=t(i,[["render",r]]);export{u as __pageData,b as default};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import{_ as a,c as t,o as s,a3 as o}from"./chunks/framework.BNw1pucY.js";const u=JSON.parse('{"title":"Review pull requests for structural code quality","description":"Scaffold the agent, deploy it, and open a PR.","frontmatter":{"title":"Review pull requests for structural code quality","description":"Scaffold the agent, deploy it, and open a PR."},"headers":[],"relativePath":"templates/thermo-quality-review.md","filePath":"templates/thermo-quality-review.md"}'),i={name:"templates/thermo-quality-review.md"};function l(n,e,r,p,d,c){return s(),t("div",null,[...e[0]||(e[0]=[o(`<h1 id="review-pull-requests-for-structural-code-quality" tabindex="-1">Review pull requests for structural code quality <a class="header-anchor" href="#review-pull-requests-for-structural-code-quality" aria-label="Permalink to "Review pull requests for structural code quality""></a></h1><p>This agent reads a pull request diff and posts one review comment. It reports missing abstractions, deeply nested control flow, feature logic leaking into shared paths, and files pushed past 1,000 lines. Style nits and behavior disputes stay out.</p><p>This template is one model turn: read the diff, then post one comment.</p><h2 id="scaffold" tabindex="-1">Scaffold <a class="header-anchor" href="#scaffold" aria-label="Permalink to "Scaffold""></a></h2><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk init ./thermo-quality-review --template thermo-quality-review</span></span>
|
|
2
2
|
<span class="line"><span>cd thermo-quality-review</span></span></code></pre></div><h2 id="deploy" tabindex="-1">Deploy <a class="header-anchor" href="#deploy" aria-label="Permalink to "Deploy""></a></h2><p>Sign in once, then deploy from a pushed checkout:</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk login</span></span>
|
|
3
|
-
<span class="line"><span>bdk deploy --cursor-events-repo acme/api</span></span></code></pre></div><p>Repeat <code>--cursor-events-repo</code> for each repo. Every repo must share one owner. The deployment watches those repos through your team's Cursor GitHub connection and reviews each opened PR. No webhook or local server.</p><p>Change repos later without redeploying:</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk event-repos thermo-quality-review --repo acme/api --repo acme/web</span></span></code></pre></div><h2 id="try-it-locally" tabindex="-1">Try it locally <a class="header-anchor" href="#try-it-locally" aria-label="Permalink to "Try it locally""></a></h2><p>Skip the deploy while you iterate. Start the relay for one repo:</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk dev --cursor-events --repo acme/api</span></span></code></pre></div><p>Open a PR, or replay a known one without pushing:</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk github replay https://github.com/acme/api/pull/12 --dir .</span></span></code></pre></div><p><code>replay</code> needs pull access. Draft PRs are ignored. The channel writes <code>pr/diff.patch</code>, then starts a model turn. The model calls <code>post_findings</code> once. Chat replies stay in the playground. <code>post_findings</code> writes the GitHub comment.</p><p>Connect GitHub in Cursor first (Settings or <a href="https://cursor.com/dashboard" target="_blank" rel="noreferrer">cursor.com/dashboard</a>) so the relay and API calls use your account. See the <a href="./../guides/github.html">GitHub guide</a>.</p><h2 id="evals" tabindex="-1">Evals <a class="header-anchor" href="#evals" aria-label="Permalink to "Evals""></a></h2><p>
|
|
3
|
+
<span class="line"><span>bdk deploy --cursor-events-repo acme/api</span></span></code></pre></div><p>Repeat <code>--cursor-events-repo</code> for each repo. Every repo must share one owner. The deployment watches those repos through your team's Cursor GitHub connection and reviews each opened PR. No webhook or local server.</p><p>Change repos later without redeploying:</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk event-repos thermo-quality-review --repo acme/api --repo acme/web</span></span></code></pre></div><h2 id="try-it-locally" tabindex="-1">Try it locally <a class="header-anchor" href="#try-it-locally" aria-label="Permalink to "Try it locally""></a></h2><p>Skip the deploy while you iterate. Start the relay for one repo:</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk dev --cursor-events --repo acme/api</span></span></code></pre></div><p>Open a PR, or replay a known one without pushing:</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk github replay https://github.com/acme/api/pull/12 --dir .</span></span></code></pre></div><p><code>replay</code> needs pull access. Draft PRs are ignored. The channel writes <code>pr/diff.patch</code>, then starts a model turn. The model calls <code>post_findings</code> once. Chat replies stay in the playground. <code>post_findings</code> writes the GitHub comment.</p><p>Connect GitHub in Cursor first (Settings or <a href="https://cursor.com/dashboard" target="_blank" rel="noreferrer">cursor.com/dashboard</a>) so the relay and API calls use your account. See the <a href="./../guides/github.html">GitHub guide</a>.</p><h2 id="evals" tabindex="-1">Evals <a class="header-anchor" href="#evals" aria-label="Permalink to "Evals""></a></h2><p>Use the two smoke cases, one spaghetti-branch fixture and one clean fix, as a local exercise. They need no GitHub access.</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk eval</span></span></code></pre></div><p>Eval sessions skip the GitHub write.</p><h2 id="what-to-edit" tabindex="-1">What to edit <a class="header-anchor" href="#what-to-edit" aria-label="Permalink to "What to edit""></a></h2><ul><li><code>bot/instructions.md</code>: what counts as a finding and the comment shape</li><li><code>evals/review.eval.ts</code>: smoke cases</li></ul>`,24)])])}const m=a(i,[["render",l]]);export{u as __pageData,m as default};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import{_ as a,c as t,o as s,a3 as o}from"./chunks/framework.BNw1pucY.js";const u=JSON.parse('{"title":"Review pull requests for bugs and breakage","description":"Scaffold the agent, deploy it, and open a PR.","frontmatter":{"title":"Review pull requests for bugs and breakage","description":"Scaffold the agent, deploy it, and open a PR."},"headers":[],"relativePath":"templates/thermo-review.md","filePath":"templates/thermo-review.md"}'),i={name:"templates/thermo-review.md"};function n(r,e,l,p,d,c){return s(),t("div",null,[...e[0]||(e[0]=[o(`<h1 id="review-pull-requests-for-bugs-and-breakage" tabindex="-1">Review pull requests for bugs and breakage <a class="header-anchor" href="#review-pull-requests-for-bugs-and-breakage" aria-label="Permalink to "Review pull requests for bugs and breakage""></a></h1><p>This agent reads a pull request diff and posts one review comment. It reports bugs, breaking side effects, developer workflow failures, and unintended feature exposure in added or modified code. Style nits stay out.</p><p>This template is one model turn: read the diff, then post one comment.</p><h2 id="scaffold" tabindex="-1">Scaffold <a class="header-anchor" href="#scaffold" aria-label="Permalink to "Scaffold""></a></h2><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk init ./thermo-review --template thermo-review</span></span>
|
|
2
2
|
<span class="line"><span>cd thermo-review</span></span></code></pre></div><h2 id="deploy" tabindex="-1">Deploy <a class="header-anchor" href="#deploy" aria-label="Permalink to "Deploy""></a></h2><p>Sign in once, then deploy from a pushed checkout:</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk login</span></span>
|
|
3
|
-
<span class="line"><span>bdk deploy --cursor-events-repo acme/api</span></span></code></pre></div><p>Repeat <code>--cursor-events-repo</code> for each repo. Every repo must share one owner. The deployment watches those repos through your team's Cursor GitHub connection and reviews each opened PR. No webhook or local server.</p><p>Change repos later without redeploying:</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk event-repos thermo-review --repo acme/api --repo acme/web</span></span></code></pre></div><h2 id="try-it-locally" tabindex="-1">Try it locally <a class="header-anchor" href="#try-it-locally" aria-label="Permalink to "Try it locally""></a></h2><p>Skip the deploy while you iterate. Start the relay for one repo:</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk dev --cursor-events --repo acme/api</span></span></code></pre></div><p>Open a PR, or replay a known one without pushing:</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk github replay https://github.com/acme/api/pull/12 --dir .</span></span></code></pre></div><p><code>replay</code> needs pull access. Draft PRs are ignored. The channel writes <code>pr/diff.patch</code>, then starts a model turn. The model calls <code>post_findings</code> once. Chat replies stay in the playground. <code>post_findings</code> writes the GitHub comment.</p><p>Connect GitHub in Cursor first (Settings or <a href="https://cursor.com/dashboard" target="_blank" rel="noreferrer">cursor.com/dashboard</a>) so the relay and API calls use your account. See the <a href="./../guides/github.html">GitHub guide</a>.</p><h2 id="evals" tabindex="-1">Evals <a class="header-anchor" href="#evals" aria-label="Permalink to "Evals""></a></h2><p>
|
|
3
|
+
<span class="line"><span>bdk deploy --cursor-events-repo acme/api</span></span></code></pre></div><p>Repeat <code>--cursor-events-repo</code> for each repo. Every repo must share one owner. The deployment watches those repos through your team's Cursor GitHub connection and reviews each opened PR. No webhook or local server.</p><p>Change repos later without redeploying:</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk event-repos thermo-review --repo acme/api --repo acme/web</span></span></code></pre></div><h2 id="try-it-locally" tabindex="-1">Try it locally <a class="header-anchor" href="#try-it-locally" aria-label="Permalink to "Try it locally""></a></h2><p>Skip the deploy while you iterate. Start the relay for one repo:</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk dev --cursor-events --repo acme/api</span></span></code></pre></div><p>Open a PR, or replay a known one without pushing:</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk github replay https://github.com/acme/api/pull/12 --dir .</span></span></code></pre></div><p><code>replay</code> needs pull access. Draft PRs are ignored. The channel writes <code>pr/diff.patch</code>, then starts a model turn. The model calls <code>post_findings</code> once. Chat replies stay in the playground. <code>post_findings</code> writes the GitHub comment.</p><p>Connect GitHub in Cursor first (Settings or <a href="https://cursor.com/dashboard" target="_blank" rel="noreferrer">cursor.com/dashboard</a>) so the relay and API calls use your account. See the <a href="./../guides/github.html">GitHub guide</a>.</p><h2 id="evals" tabindex="-1">Evals <a class="header-anchor" href="#evals" aria-label="Permalink to "Evals""></a></h2><p>Use the two smoke cases, one auth-bypass fixture and one docs-only change, as a local exercise. They need no GitHub access.</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk eval</span></span></code></pre></div><p>Eval sessions skip the GitHub write.</p><h2 id="what-to-edit" tabindex="-1">What to edit <a class="header-anchor" href="#what-to-edit" aria-label="Permalink to "What to edit""></a></h2><ul><li><code>bot/instructions.md</code>: what counts as a finding and the comment shape</li><li><code>evals/review.eval.ts</code>: smoke cases</li></ul>`,24)])])}const b=a(i,[["render",n]]);export{u as __pageData,b as default};
|
package/dist/docs/assets/{templates_triage.md.BFlQhWXf.js → templates_triage.md.CNN6b0JZ.js}
RENAMED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import{_ as a,c as t,o as s,a3 as i}from"./chunks/framework.BNw1pucY.js";const u=JSON.parse('{"title":"Triage Linear or Jira issues in place","description":"Scaffold the agent, point it at an existing ticket, tune the rubric, run evals, and deploy.","frontmatter":{"title":"Triage Linear or Jira issues in place","description":"Scaffold the agent, point it at an existing ticket, tune the rubric, run evals, and deploy."},"headers":[],"relativePath":"templates/triage.md","filePath":"templates/triage.md"}'),n={name:"templates/triage.md"};function o(r,e,l,p,d
|
|
1
|
+
import{_ as a,c as t,o as s,a3 as i}from"./chunks/framework.BNw1pucY.js";const u=JSON.parse('{"title":"Triage Linear or Jira issues in place","description":"Scaffold the agent, point it at an existing ticket, tune the rubric, run evals, and deploy.","frontmatter":{"title":"Triage Linear or Jira issues in place","description":"Scaffold the agent, point it at an existing ticket, tune the rubric, run evals, and deploy."},"headers":[],"relativePath":"templates/triage.md","filePath":"templates/triage.md"}'),n={name:"templates/triage.md"};function o(r,e,l,p,c,d){return s(),t("div",null,[...e[0]||(e[0]=[i(`<h1 id="triage-linear-or-jira-issues-in-place" tabindex="-1">Triage Linear or Jira issues in place <a class="header-anchor" href="#triage-linear-or-jira-issues-in-place" aria-label="Permalink to "Triage Linear or Jira issues in place""></a></h1><p>This agent comments on tickets you already filed. It classifies the issue, writes a <code>Triage:</code> comment, sets bug priority, and links a duplicate when titles match.</p><p>File the ticket however you already do. This template starts after the ticket exists.</p><h2 id="scaffold" tabindex="-1">Scaffold <a class="header-anchor" href="#scaffold" aria-label="Permalink to "Scaffold""></a></h2><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk init ./triage-agent --template triage-linear</span></span>
|
|
2
2
|
<span class="line"><span>bdk init ./triage-agent --template triage-jira</span></span></code></pre></div><p><code>bdk init --template triage</code> selects <code>triage-linear</code>.</p><p>Pick the tracker you use. The agent is the same. The overlay is the connection.</p><p><code>init</code> writes the project, installs dependencies, and puts <code>bdk</code> on PATH.</p><h2 id="log-in" tabindex="-1">Log in <a class="header-anchor" href="#log-in" aria-label="Permalink to "Log in""></a></h2><p>Model turns and Cursor MCP use your Cursor account.</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>cd triage-agent</span></span>
|
|
3
|
-
<span class="line"><span>bdk login</span></span></code></pre></div><p>The command opens a browser if you have no stored credential.</p><h2 id="connect-the-tracker" tabindex="-1">Connect the tracker <a class="header-anchor" href="#connect-the-tracker" aria-label="Permalink to "Connect the tracker""></a></h2><p>In the Cursor dashboard, open MCP and connect Linear or Jira.</p><p>The connection stays on the host. The model calls <code>record_triage</code>. Linear and Jira tools stay off the model's tool list.</p><h2 id="first-verdict" tabindex="-1">First verdict <a class="header-anchor" href="#first-verdict" aria-label="Permalink to "First verdict""></a></h2><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk dev</span></span></code></pre></div><p>Open the playground. Run <code>/queue/issue</code> and paste an existing issue.</p><p>You can also POST:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">curl</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -X</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> POST</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> http://127.0.0.1:3000/triage-agent/v1/channels/queue/issue</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> \\</span></span>
|
|
3
|
+
<span class="line"><span>bdk login</span></span></code></pre></div><p>The command opens a browser if you have no stored credential.</p><h2 id="connect-the-tracker" tabindex="-1">Connect the tracker <a class="header-anchor" href="#connect-the-tracker" aria-label="Permalink to "Connect the tracker""></a></h2><p>In the Cursor dashboard, open MCP and connect Linear or Jira.</p><p>The connection stays on the host. The model calls <code>record_triage</code>. Linear and Jira tools stay off the model's tool list.</p><p>Linear or Jira MCP must be connected for comments, priority changes, and duplicate links; queueing an issue can still classify it through <code>record_triage</code> without that connection.</p><h2 id="first-verdict" tabindex="-1">First verdict <a class="header-anchor" href="#first-verdict" aria-label="Permalink to "First verdict""></a></h2><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk dev</span></span></code></pre></div><p>Open the playground. Run <code>/queue/issue</code> and paste an existing issue.</p><p>You can also POST:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">curl</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -X</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> POST</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> http://127.0.0.1:3000/triage-agent/v1/channels/queue/issue</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> \\</span></span>
|
|
4
4
|
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -H</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 'content-type: application/json'</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> \\</span></span>
|
|
5
5
|
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -d</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> '{</span></span>
|
|
6
6
|
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "identifier": "ENG-142",</span></span>
|
|
7
7
|
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "title": "CSV export returns 500",</span></span>
|
|
8
8
|
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "description": "Export has returned 500 since this morning."</span></span>
|
|
9
|
-
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> }'</span></span></code></pre></div><p>For create webhooks, set <code>LINEAR_WEBHOOK_SECRET</code> or <code>JIRA_WEBHOOK_SECRET</code>. Point the provider at the deployed alias under <code>/v1/channels/webhook</code>. Signed events start or resume triage for that issue.</p><p><code>record_triage</code> comments on the issue that started the session, not whatever identifier the model copies out of the ticket body.</p><h2 id="rubric" tabindex="-1">Rubric <a class="header-anchor" href="#rubric" aria-label="Permalink to "Rubric""></a></h2><p>Edit <code>bot/skills/triage-rubric.md</code> for kinds, tie-breakers, and what <code>urgent</code> means on your team. The next turn reads the file.</p><p><code>bot/instructions.md</code> is the procedure around the rubric: missing details, when to call <code>record_triage</code>, how to reply.</p><h2 id="evals" tabindex="-1">Evals <a class="header-anchor" href="#evals" aria-label="Permalink to "Evals""></a></h2><p>
|
|
9
|
+
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> }'</span></span></code></pre></div><p>For create webhooks, set <code>LINEAR_WEBHOOK_SECRET</code> or <code>JIRA_WEBHOOK_SECRET</code>. Point the provider at the deployed alias under <code>/v1/channels/webhook</code>. Signed events start or resume triage for that issue.</p><p><code>record_triage</code> comments on the issue that started the session, not whatever identifier the model copies out of the ticket body.</p><h2 id="rubric" tabindex="-1">Rubric <a class="header-anchor" href="#rubric" aria-label="Permalink to "Rubric""></a></h2><p>Edit <code>bot/skills/triage-rubric.md</code> for kinds, tie-breakers, and what <code>urgent</code> means on your team. The next turn reads the file.</p><p><code>bot/instructions.md</code> is the procedure around the rubric: missing details, when to call <code>record_triage</code>, how to reply.</p><h2 id="evals" tabindex="-1">Evals <a class="header-anchor" href="#evals" aria-label="Permalink to "Evals""></a></h2><p>Use the three smoke cases, one per kind, as a local exercise after you change the rubric.</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk eval</span></span></code></pre></div><p>Eval sessions skip tracker writes.</p><h2 id="deploy" tabindex="-1">Deploy <a class="header-anchor" href="#deploy" aria-label="Permalink to "Deploy""></a></h2><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk deploy</span></span></code></pre></div><p>Run it from the agent's git checkout. It infers repository, ref, path, and slug, builds on Cursor-managed hosting, and prints the URL. <code>bdk deployments</code> shows status.</p>`,33)])])}const g=a(n,[["render",o]]);export{u as __pageData,g as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as a,c as t,o as s,a3 as i}from"./chunks/framework.BNw1pucY.js";const u=JSON.parse('{"title":"Triage Linear or Jira issues in place","description":"Scaffold the agent, point it at an existing ticket, tune the rubric, run evals, and deploy.","frontmatter":{"title":"Triage Linear or Jira issues in place","description":"Scaffold the agent, point it at an existing ticket, tune the rubric, run evals, and deploy."},"headers":[],"relativePath":"templates/triage.md","filePath":"templates/triage.md"}'),n={name:"templates/triage.md"};function o(r,e,l,p,d
|
|
1
|
+
import{_ as a,c as t,o as s,a3 as i}from"./chunks/framework.BNw1pucY.js";const u=JSON.parse('{"title":"Triage Linear or Jira issues in place","description":"Scaffold the agent, point it at an existing ticket, tune the rubric, run evals, and deploy.","frontmatter":{"title":"Triage Linear or Jira issues in place","description":"Scaffold the agent, point it at an existing ticket, tune the rubric, run evals, and deploy."},"headers":[],"relativePath":"templates/triage.md","filePath":"templates/triage.md"}'),n={name:"templates/triage.md"};function o(r,e,l,p,c,d){return s(),t("div",null,[...e[0]||(e[0]=[i("",33)])])}const g=a(n,[["render",o]]);export{u as __pageData,g as default};
|