@cursor/bdk 0.2.24 → 0.2.25
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/AGENTS.md +1 -0
- package/dist/bin/agent-serve.d.ts +1 -1
- package/dist/bin/agent-serve.js +48 -12
- package/dist/channels/bitbucket/bitbucket-webhook.d.ts +3 -2
- package/dist/channels/bitbucket/bitbucket-webhook.d.ts.map +1 -1
- package/dist/channels/bitbucket/bitbucket-webhook.js +14 -9
- package/dist/channels/github/github-channel.d.ts.map +1 -1
- package/dist/channels/github/github-channel.js +9 -18
- package/dist/channels/pagerduty/api.d.ts +74 -0
- package/dist/channels/pagerduty/api.d.ts.map +1 -0
- package/dist/channels/pagerduty/api.js +101 -0
- package/dist/channels/pagerduty/defaults.d.ts +42 -0
- package/dist/channels/pagerduty/defaults.d.ts.map +1 -0
- package/dist/channels/pagerduty/defaults.js +132 -0
- package/dist/channels/pagerduty/events.d.ts +24 -0
- package/dist/channels/pagerduty/events.d.ts.map +1 -0
- package/dist/channels/pagerduty/events.js +38 -0
- package/dist/channels/pagerduty/index.d.ts +31 -0
- package/dist/channels/pagerduty/index.d.ts.map +1 -0
- package/dist/channels/pagerduty/index.js +30 -0
- package/dist/channels/pagerduty/pagerduty-channel.d.ts +64 -0
- package/dist/channels/pagerduty/pagerduty-channel.d.ts.map +1 -0
- package/dist/channels/pagerduty/pagerduty-channel.js +195 -0
- package/dist/channels/pagerduty/pagerduty-webhook.d.ts +70 -0
- package/dist/channels/pagerduty/pagerduty-webhook.d.ts.map +1 -0
- package/dist/channels/pagerduty/pagerduty-webhook.js +280 -0
- package/dist/channels/pagerduty/payload.d.ts +33 -0
- package/dist/channels/pagerduty/payload.d.ts.map +1 -0
- package/dist/channels/pagerduty/payload.js +150 -0
- package/dist/channels/pagerduty/replay.d.ts +35 -0
- package/dist/channels/pagerduty/replay.d.ts.map +1 -0
- package/dist/channels/pagerduty/replay.js +115 -0
- package/dist/channels/pagerduty/secrets.d.ts +16 -0
- package/dist/channels/pagerduty/secrets.d.ts.map +1 -0
- package/dist/channels/pagerduty/secrets.js +23 -0
- package/dist/channels/pagerduty/self-user.d.ts +51 -0
- package/dist/channels/pagerduty/self-user.d.ts.map +1 -0
- package/dist/channels/pagerduty/self-user.js +157 -0
- package/dist/channels/pagerduty/state.d.ts +31 -0
- package/dist/channels/pagerduty/state.d.ts.map +1 -0
- package/dist/channels/pagerduty/state.js +30 -0
- package/dist/channels/pagerduty/types.d.ts +217 -0
- package/dist/channels/pagerduty/types.d.ts.map +1 -0
- package/dist/channels/pagerduty/types.js +1 -0
- package/dist/channels.d.ts +6 -0
- package/dist/channels.d.ts.map +1 -1
- package/dist/channels.js +11 -23
- package/dist/docs/404.html +2 -2
- package/dist/docs/assets/{app.DTIg0uKK.js → app.BjS1QEI4.js} +4 -4
- package/dist/docs/assets/chunks/@localSearchIndexroot.oGqZumnJ.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.BpJoSaxi.js → VPLocalSearchBox.BOuvjb5Y.js} +1 -1
- package/dist/docs/assets/chunks/{arc.ylgNvRNq.js → arc.3WR6Jf-y.js} +1 -1
- package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.BMrNJqYk.js → architectureDiagram-Q4EWVU46.Dtb6Dqh6.js} +1 -1
- package/dist/docs/assets/chunks/{baseUniq.BBWUEqf9.js → baseUniq.BUyrgrZE.js} +1 -1
- package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.DFMu-Vza.js → blockDiagram-DXYQGD6D.BVLV_voZ.js} +1 -1
- package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.8nkAAxWv.js → c4Diagram-AHTNJAMY.jXJ1q70M.js} +1 -1
- package/dist/docs/assets/chunks/channel.Dt4aweTm.js +1 -0
- package/dist/docs/assets/chunks/{chunk-4BX2VUAB.sO-z2Bag.js → chunk-4BX2VUAB.zz1SMBvK.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-4TB4RGXK.BMROzTMq.js → chunk-4TB4RGXK.CzYKuv3I.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-55IACEB6.X81urwg7.js → chunk-55IACEB6.C7_tcJZD.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-EDXVE4YY.eaZVFLZM.js → chunk-EDXVE4YY.DeTwQPVO.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-FMBD7UC4.CmZhzstR.js → chunk-FMBD7UC4.DhMTl7ut.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-OYMX7WX6.CTezt9Lc.js → chunk-OYMX7WX6.Me7f5hEp.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-QZHKN3VN.s-T8zukB.js → chunk-QZHKN3VN.D0E0Bb6g.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-YZCP3GAM.DN4Nhy-D.js → chunk-YZCP3GAM.CdOOBFYL.js} +1 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.DGUHZs6j.js +1 -0
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.DGUHZs6j.js +1 -0
- package/dist/docs/assets/chunks/clone.DWf3k0Z0.js +1 -0
- package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.Cqyp4BUH.js → cose-bilkent-S5V4N54A.BNbGESzN.js} +1 -1
- package/dist/docs/assets/chunks/{dagre-KV5264BT.BIECOiqR.js → dagre-KV5264BT.zU7Lu_xJ.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-5BDNPKRD.1tLyWoTg.js → diagram-5BDNPKRD.B9qOdE5h.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.BVY_6VMO.js → diagram-G4DWMVQ6.D8X-sf77.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-MMDJMWI5.BSZ7xiBB.js → diagram-MMDJMWI5.CW7MvMlE.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-TYMM5635.Bho6GmLh.js → diagram-TYMM5635.J489G0Nd.js} +1 -1
- package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.A0yVIANn.js → erDiagram-SMLLAGMA.BkW7tGfs.js} +1 -1
- package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.ZMgbllH6.js → flowDiagram-DWJPFMVM.jc9iWORD.js} +1 -1
- package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.BCCPBhXo.js → ganttDiagram-T4ZO3ILL.B-UQfd9E.js} +1 -1
- package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.BOkL0BbA.js → gitGraphDiagram-UUTBAWPF.DFzrTSlJ.js} +1 -1
- package/dist/docs/assets/chunks/{graph.DMyZPu86.js → graph.C5IB6_e_.js} +1 -1
- package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.CjG1IiEw.js → infoDiagram-42DDH7IO.DwF0-c8L.js} +1 -1
- package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.UCe-kq9g.js → ishikawaDiagram-UXIWVN3A.fBaTqzE7.js} +1 -1
- package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.3WyOK_eY.js → journeyDiagram-VCZTEJTY.CM8gDVJy.js} +1 -1
- package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.WoRG2qY1.js → kanban-definition-6JOO6SKY.YiD1p0LB.js} +1 -1
- package/dist/docs/assets/chunks/{layout.DV07xDd5.js → layout.6Um-DVJT.js} +1 -1
- package/dist/docs/assets/chunks/{linear.CTO8mN6o.js → linear.DcTeg4Hn.js} +1 -1
- package/dist/docs/assets/chunks/{min.SvTtcKuZ.js → min.CIxkY8Fe.js} +1 -1
- package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.DMGgQ-HB.js → mindmap-definition-QFDTVHPH.D4QM_voR.js} +1 -1
- package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.B7851apI.js → pieDiagram-DEJITSTG.nmB309G1.js} +1 -1
- package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.CEqyypIX.js → quadrantDiagram-34T5L4WZ.D1HtZR3C.js} +1 -1
- package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.C3Mwsw-H.js → requirementDiagram-MS252O5E.CZgQWob-.js} +1 -1
- package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.DyYK0XxY.js → sankeyDiagram-XADWPNL6.DtiBfU-P.js} +1 -1
- package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.SiQPH-XM.js → sequenceDiagram-FGHM5R23.Cld4gDSt.js} +1 -1
- package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.CTJMsP4p.js → stateDiagram-FHFEXIEX.DatP823_.js} +1 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.C0571l4D.js +1 -0
- package/dist/docs/assets/chunks/{theme.DJo4my9R.js → theme.D5jbBys7.js} +2 -2
- package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.CxSNRlQ6.js → timeline-definition-GMOUNBTQ.DwQLI2be.js} +1 -1
- package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.BdoJskyD.js → vennDiagram-DHZGUBPP.a5yMfnsa.js} +1 -1
- package/dist/docs/assets/chunks/wardley-RL74JXVD.B-FXivgT.js +162 -0
- package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.IjIbFn_F.js → wardleyDiagram-NUSXRM2D.Dz--Opy3.js} +1 -1
- package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.CPUxDZLH.js → xychartDiagram-5P7HB3ND.Dl8w8TeT.js} +1 -1
- package/dist/docs/assets/{guides_opentelemetry.md.Ck1o2frw.js → guides_opentelemetry.md.DBQtp7_V.js} +4 -4
- package/dist/docs/assets/{guides_opentelemetry.md.Ck1o2frw.lean.js → guides_opentelemetry.md.DBQtp7_V.lean.js} +1 -1
- package/dist/docs/assets/guides_pagerduty.md.BHXMcMtx.js +60 -0
- package/dist/docs/assets/guides_pagerduty.md.BHXMcMtx.lean.js +1 -0
- package/dist/docs/assets/{reference_channels.md.DYg0CLud.js → reference_channels.md.Bxaa020x.js} +1 -1
- package/dist/docs/assets/{reference_cli.md.DB7Llw3T.js → reference_cli.md.1o_TqKdt.js} +7 -2
- package/dist/docs/assets/{reference_cli.md.DB7Llw3T.lean.js → reference_cli.md.1o_TqKdt.lean.js} +1 -1
- package/dist/docs/assets/{reference_tools.md.08XR7lIl.js → reference_tools.md.-6pypsWt.js} +1 -1
- package/dist/docs/building-with-agents.html +35 -35
- package/dist/docs/deployment.html +35 -35
- package/dist/docs/evals.html +35 -35
- package/dist/docs/guides/agent-to-agent.html +35 -35
- package/dist/docs/guides/bitbucket.html +36 -36
- package/dist/docs/guides/cloud-agents.html +35 -35
- package/dist/docs/guides/convert-automation.html +35 -35
- package/dist/docs/guides/export-grokbot.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/migrate.html +35 -35
- package/dist/docs/guides/opentelemetry.html +39 -39
- package/dist/docs/guides/opentelemetry.md +10 -5
- package/dist/docs/guides/pagerduty.html +119 -0
- package/dist/docs/guides/pagerduty.md +336 -0
- 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 +381 -6
- package/dist/docs/llms.txt +1 -0
- 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 +37 -37
- package/dist/docs/reference/channels.md +2 -1
- package/dist/docs/reference/cli.html +42 -37
- package/dist/docs/reference/cli.md +27 -0
- package/dist/docs/reference/connections.html +35 -35
- package/dist/docs/reference/evals.html +35 -35
- package/dist/docs/reference/extensions.html +36 -36
- 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/memory.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 +35 -35
- package/dist/docs/reference/subagents.html +35 -35
- package/dist/docs/reference/tools.html +37 -37
- package/dist/docs/reference/tools.md +1 -0
- package/dist/docs/templates/agentic-owners.html +35 -35
- package/dist/docs/templates/grokbot-agents.html +35 -35
- package/dist/docs/templates/security-reviewer.html +35 -35
- package/dist/docs/templates/thermo-quality-review.html +35 -35
- package/dist/docs/templates/thermo-review.html +35 -35
- package/dist/docs/templates/triage.html +35 -35
- package/dist/docs/troubleshooting.html +35 -35
- package/dist/internal/approval-gate.d.ts +4 -2
- package/dist/internal/approval-gate.d.ts.map +1 -1
- package/dist/internal/approval-gate.js +2 -1
- package/dist/internal/builtin-tools/artifacts.d.ts.map +1 -1
- package/dist/internal/builtin-tools/artifacts.js +45 -12
- package/dist/internal/channel-architecture.d.ts +1 -1
- package/dist/internal/channel-architecture.d.ts.map +1 -1
- package/dist/internal/channel-architecture.js +4 -2
- package/dist/internal/cli-deploy.d.ts.map +1 -1
- package/dist/internal/cli-deploy.js +21 -12
- package/dist/internal/cli-pagerduty.d.ts +32 -0
- package/dist/internal/cli-pagerduty.d.ts.map +1 -0
- package/dist/internal/cli-pagerduty.js +242 -0
- package/dist/internal/continuation-channel.d.ts.map +1 -1
- package/dist/internal/continuation-channel.js +7 -0
- package/dist/internal/continuation-identity.d.ts +11 -3
- package/dist/internal/continuation-identity.d.ts.map +1 -1
- package/dist/internal/continuation-identity.js +83 -0
- package/dist/internal/deploy-manifest.d.ts +11 -4
- package/dist/internal/deploy-manifest.d.ts.map +1 -1
- package/dist/internal/deploy-manifest.js +17 -5
- package/dist/internal/discovery/agent-config.d.ts.map +1 -1
- package/dist/internal/discovery/agent-config.js +10 -10
- package/dist/internal/discovery/agent.d.ts.map +1 -1
- package/dist/internal/discovery/agent.js +10 -10
- package/dist/internal/discovery/channels.d.ts.map +1 -1
- package/dist/internal/discovery/channels.js +20 -16
- package/dist/internal/discovery/context.d.ts +16 -0
- package/dist/internal/discovery/context.d.ts.map +1 -1
- package/dist/internal/discovery/context.js +66 -0
- package/dist/internal/discovery/extension-overlay.d.ts.map +1 -1
- package/dist/internal/discovery/extension-overlay.js +2 -6
- package/dist/internal/discovery/info.d.ts.map +1 -1
- package/dist/internal/discovery/info.js +3 -0
- package/dist/internal/discovery/instructions.d.ts.map +1 -1
- package/dist/internal/discovery/instructions.js +3 -6
- package/dist/internal/discovery/modules.d.ts.map +1 -1
- package/dist/internal/discovery/modules.js +3 -6
- package/dist/internal/discovery/project.d.ts +6 -0
- package/dist/internal/discovery/project.d.ts.map +1 -1
- package/dist/internal/discovery/project.js +27 -5
- package/dist/internal/discovery/runtime.d.ts.map +1 -1
- package/dist/internal/discovery/runtime.js +8 -8
- package/dist/internal/discovery.d.ts +1 -1
- package/dist/internal/discovery.d.ts.map +1 -1
- package/dist/internal/discovery.js +1 -1
- package/dist/internal/expected-delivery-failure.d.ts.map +1 -1
- package/dist/internal/expected-delivery-failure.js +6 -0
- package/dist/internal/filesystem/sdk-schemas.d.ts.map +1 -1
- package/dist/internal/filesystem/sdk-schemas.js +4 -3
- package/dist/internal/hmac-secret-values.d.ts +48 -0
- package/dist/internal/hmac-secret-values.d.ts.map +1 -0
- package/dist/internal/hmac-secret-values.js +68 -0
- package/dist/internal/host-platforms.d.ts.map +1 -1
- package/dist/internal/host-platforms.js +8 -2
- package/dist/internal/json-schema.d.ts +7 -7
- package/dist/internal/json-schema.d.ts.map +1 -1
- package/dist/internal/json-schema.js +13 -16
- package/dist/internal/otel/collector.d.ts.map +1 -1
- package/dist/internal/otel/collector.js +3 -1
- package/dist/internal/otel/config.d.ts +6 -1
- package/dist/internal/otel/config.d.ts.map +1 -1
- package/dist/internal/otel/config.js +27 -1
- package/dist/internal/otel/runtime.d.ts.map +1 -1
- package/dist/internal/otel/runtime.js +26 -3
- package/dist/internal/package-inline-stdio.d.ts.map +1 -1
- package/dist/internal/package-inline-stdio.js +21 -6
- package/dist/internal/sdk-runner.d.ts +2 -3
- package/dist/internal/sdk-runner.d.ts.map +1 -1
- package/dist/internal/sdk-runner.js +8 -4
- package/dist/internal/secret-alternatives.d.ts +11 -0
- package/dist/internal/secret-alternatives.d.ts.map +1 -0
- package/dist/internal/secret-alternatives.js +13 -0
- package/dist/internal/server.js +2 -2
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +5 -4
- package/dist/internal/sqlite-experimental-warning.d.ts +2 -0
- package/dist/internal/sqlite-experimental-warning.d.ts.map +1 -0
- package/dist/internal/sqlite-experimental-warning.js +22 -0
- package/dist/internal/testing/conversation-identity-vectors.d.ts +6 -1
- package/dist/internal/testing/conversation-identity-vectors.d.ts.map +1 -1
- package/dist/internal/testing/conversation-identity-vectors.js +34 -0
- package/dist/internal/testing/hmac-secret-vectors.d.ts +38 -0
- package/dist/internal/testing/hmac-secret-vectors.d.ts.map +1 -0
- package/dist/internal/testing/hmac-secret-vectors.js +89 -0
- package/dist/internal/testing/pagerduty-continuation-fixtures.d.ts +42 -0
- package/dist/internal/testing/pagerduty-continuation-fixtures.d.ts.map +1 -0
- package/dist/internal/testing/pagerduty-continuation-fixtures.js +175 -0
- package/dist/internal/zod-schema.d.ts +14 -0
- package/dist/internal/zod-schema.d.ts.map +1 -0
- package/dist/internal/zod-schema.js +22 -0
- package/dist/playground/assets/cursor-icons-16-DmHBTm1-.woff2 +0 -0
- package/dist/playground/assets/index-BdMwybMt.css +1 -0
- package/dist/playground/assets/{index-DKKdkF29.js → index-CHk6O92d.js} +38 -38
- package/dist/playground/index.html +2 -2
- package/dist/tools.d.ts +13 -10
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +3 -2
- package/dist/types.d.ts +67 -16
- package/dist/types.d.ts.map +1 -1
- package/docs/guides/opentelemetry.md +10 -5
- package/docs/guides/pagerduty.md +341 -0
- package/docs/reference/channels.md +2 -1
- package/docs/reference/cli.md +27 -0
- package/docs/reference/tools.md +1 -0
- package/package.json +10 -3
- package/skills/migrate-v2/SKILL.md +1 -1
- package/skills/otel/SKILL.md +7 -3
- package/templates/agentic-owners/README.md +6 -1
- package/templates/agentic-owners/bot/lib/owners/decision.ts +31 -5
- package/templates/agentic-owners/bot/lib/owners/globalOverride.ts +60 -0
- package/templates/agentic-owners/bot/lib/owners/match.ts +85 -19
- package/templates/agentic-owners/bot/lib/owners/parse.ts +133 -2
- package/templates/agentic-owners/bot/lib/owners/types.ts +23 -0
- package/dist/docs/assets/chunks/@localSearchIndexroot.3ebvCWKy.js +0 -1
- package/dist/docs/assets/chunks/channel.BOebySCN.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.C55IaN-T.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.C55IaN-T.js +0 -1
- package/dist/docs/assets/chunks/clone.D06pA7ML.js +0 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.DddRVjeq.js +0 -1
- package/dist/docs/assets/chunks/wardley-RL74JXVD.CVCRSuQK.js +0 -162
- package/dist/playground/assets/cursor-icons-16-gwXtdAvu.woff2 +0 -0
- package/dist/playground/assets/index-DpKinTMs.css +0 -1
- /package/dist/docs/assets/{reference_channels.md.DYg0CLud.lean.js → reference_channels.md.Bxaa020x.lean.js} +0 -0
- /package/dist/docs/assets/{reference_tools.md.08XR7lIl.lean.js → reference_tools.md.-6pypsWt.lean.js} +0 -0
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
import { posix } from "node:path";
|
|
5
5
|
import { AGENTIC_OWNERS_DIR } from "./constants.js";
|
|
6
|
+
import { blocksGlobalOverride, mergeGlobalOverride } from "./globalOverride.js";
|
|
6
7
|
import { patternMatchesFile, patternSpecificity } from "./matching.js";
|
|
7
8
|
import type {
|
|
8
9
|
AgenticOwnersMatchedConfig,
|
|
@@ -16,6 +17,11 @@ type PathScopedRule = {
|
|
|
16
17
|
readonly paths: readonly string[];
|
|
17
18
|
/** Root-only repository-wide exemption, produced from `global_exclusions`. */
|
|
18
19
|
readonly globalExclusion?: boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Root `global_overrides` entry. Applied after precedence, not as a
|
|
22
|
+
* candidate for it.
|
|
23
|
+
*/
|
|
24
|
+
readonly globalOverride?: boolean;
|
|
19
25
|
};
|
|
20
26
|
|
|
21
27
|
/**
|
|
@@ -116,23 +122,84 @@ function compareRulePrecedence(
|
|
|
116
122
|
return left.sourcePath.localeCompare(right.sourcePath);
|
|
117
123
|
}
|
|
118
124
|
|
|
119
|
-
function
|
|
120
|
-
filepath,
|
|
121
|
-
rules,
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
}
|
|
126
|
-
let winner:
|
|
127
|
-
|
|
125
|
+
function selectRuleForFile(
|
|
126
|
+
filepath: string,
|
|
127
|
+
rules: readonly AgenticOwnersPathRule[],
|
|
128
|
+
): {
|
|
129
|
+
readonly winner: { readonly rule: AgenticOwnersPathRule; readonly order: number } | undefined;
|
|
130
|
+
readonly overrides: readonly { readonly rule: AgenticOwnersPathRule; readonly order: number }[];
|
|
131
|
+
} {
|
|
132
|
+
let winner: { readonly rule: AgenticOwnersPathRule; readonly order: number } | undefined;
|
|
133
|
+
const overrides: { readonly rule: AgenticOwnersPathRule; readonly order: number }[] = [];
|
|
134
|
+
for (const [order, rule] of rules.entries()) {
|
|
128
135
|
if (!ruleMatchesFile({ rule, filepath })) {
|
|
129
136
|
continue;
|
|
130
137
|
}
|
|
131
|
-
if (
|
|
132
|
-
|
|
138
|
+
if (rule.globalOverride === true) {
|
|
139
|
+
overrides.push({ rule, order });
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
if (winner === undefined || compareRulePrecedence(rule, winner.rule, filepath) > 0) {
|
|
143
|
+
winner = { rule, order };
|
|
133
144
|
}
|
|
134
145
|
}
|
|
135
|
-
return winner;
|
|
146
|
+
return { winner, overrides };
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function teamsSkippedByOverride(
|
|
150
|
+
winner: AgenticOwnersPathRule,
|
|
151
|
+
override: AgenticOwnersPathRule,
|
|
152
|
+
): boolean {
|
|
153
|
+
const skipped = override.skipTeams;
|
|
154
|
+
if (skipped === undefined || skipped.length === 0) {
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
const names = new Set(skipped.map((team) => team.trim().toLowerCase()));
|
|
158
|
+
return winner.teams.some((team) => names.has(team.trim().toLowerCase()));
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function overrideAppliesToFile(
|
|
162
|
+
override: AgenticOwnersPathRule,
|
|
163
|
+
winner: AgenticOwnersPathRule,
|
|
164
|
+
filepath: string,
|
|
165
|
+
): boolean {
|
|
166
|
+
if (teamsSkippedByOverride(winner, override)) {
|
|
167
|
+
return false;
|
|
168
|
+
}
|
|
169
|
+
const skipPaths = override.skipPaths;
|
|
170
|
+
if (skipPaths === undefined || skipPaths.length === 0) {
|
|
171
|
+
return true;
|
|
172
|
+
}
|
|
173
|
+
return !ruleMatchesFile({ rule: { ...override, paths: skipPaths }, filepath });
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function effectiveRuleSelector(
|
|
177
|
+
rules: readonly AgenticOwnersPathRule[],
|
|
178
|
+
): (filepath: string) => AgenticOwnersPathRule | undefined {
|
|
179
|
+
const cache = new Map<string, AgenticOwnersPathRule>();
|
|
180
|
+
return (filepath) => {
|
|
181
|
+
const { winner, overrides } = selectRuleForFile(filepath, rules);
|
|
182
|
+
if (winner === undefined || blocksGlobalOverride(winner.rule)) {
|
|
183
|
+
return winner?.rule;
|
|
184
|
+
}
|
|
185
|
+
const applicable = overrides.filter((entry) =>
|
|
186
|
+
overrideAppliesToFile(entry.rule, winner.rule, filepath),
|
|
187
|
+
);
|
|
188
|
+
if (applicable.length === 0) {
|
|
189
|
+
return winner.rule;
|
|
190
|
+
}
|
|
191
|
+
const key = `${winner.order}:${applicable.map((entry) => entry.order).join(",")}`;
|
|
192
|
+
const cached = cache.get(key);
|
|
193
|
+
if (cached !== undefined) {
|
|
194
|
+
return cached;
|
|
195
|
+
}
|
|
196
|
+
const effective = mergeGlobalOverride(
|
|
197
|
+
winner.rule,
|
|
198
|
+
applicable.map((entry) => entry.rule),
|
|
199
|
+
);
|
|
200
|
+
cache.set(key, effective);
|
|
201
|
+
return effective;
|
|
202
|
+
};
|
|
136
203
|
}
|
|
137
204
|
|
|
138
205
|
export function matchRepoConfigForChangedFiles({
|
|
@@ -147,8 +214,9 @@ export function matchRepoConfigForChangedFiles({
|
|
|
147
214
|
// file path would silently drop one (e.g. a hard-gate rule lost behind an
|
|
148
215
|
// advisory rule from the same policy).
|
|
149
216
|
const winners = new Set<AgenticOwnersPathRule>();
|
|
217
|
+
const ruleForFile = effectiveRuleSelector(config.rules);
|
|
150
218
|
for (const filepath of changedFiles) {
|
|
151
|
-
const winner =
|
|
219
|
+
const winner = ruleForFile(filepath);
|
|
152
220
|
if (winner !== undefined) {
|
|
153
221
|
winners.add(winner);
|
|
154
222
|
}
|
|
@@ -175,9 +243,8 @@ export function changedFilesWithoutWinningRule({
|
|
|
175
243
|
changedFiles: readonly string[];
|
|
176
244
|
rules: readonly AgenticOwnersPathRule[];
|
|
177
245
|
}): string[] {
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
);
|
|
246
|
+
const ruleForFile = effectiveRuleSelector(rules);
|
|
247
|
+
return changedFiles.filter((filepath) => ruleForFile(filepath) === undefined);
|
|
181
248
|
}
|
|
182
249
|
|
|
183
250
|
/**
|
|
@@ -198,9 +265,8 @@ export function everyChangedFileGloballyExcluded({
|
|
|
198
265
|
if (changedFiles.length === 0) {
|
|
199
266
|
return false;
|
|
200
267
|
}
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
);
|
|
268
|
+
const ruleForFile = effectiveRuleSelector(rules);
|
|
269
|
+
return changedFiles.every((filepath) => ruleForFile(filepath)?.globalExclusion === true);
|
|
204
270
|
}
|
|
205
271
|
|
|
206
272
|
function hasOwners(rule: AgenticOwnersPathRule): boolean {
|
|
@@ -143,6 +143,131 @@ function parseGlobalExclusions({
|
|
|
143
143
|
return paths;
|
|
144
144
|
}
|
|
145
145
|
|
|
146
|
+
const GLOBAL_OVERRIDE_KEYS = [
|
|
147
|
+
"paths",
|
|
148
|
+
"team",
|
|
149
|
+
"teams",
|
|
150
|
+
"user",
|
|
151
|
+
"users",
|
|
152
|
+
"self_review",
|
|
153
|
+
"skip_teams",
|
|
154
|
+
"skip_paths",
|
|
155
|
+
] as const;
|
|
156
|
+
|
|
157
|
+
function parseGlobalOverrides({
|
|
158
|
+
value,
|
|
159
|
+
sourcePath,
|
|
160
|
+
issues,
|
|
161
|
+
}: {
|
|
162
|
+
value: unknown;
|
|
163
|
+
sourcePath: string;
|
|
164
|
+
issues: string[];
|
|
165
|
+
}): AgenticOwnersPathRule[] {
|
|
166
|
+
if (value === undefined) {
|
|
167
|
+
return [];
|
|
168
|
+
}
|
|
169
|
+
if (sourcePath !== ROOT_POLICY_SOURCE_PATH) {
|
|
170
|
+
issues.push(`${sourcePath}: global_overrides is only allowed in ${ROOT_POLICY_SOURCE_PATH}`);
|
|
171
|
+
return [];
|
|
172
|
+
}
|
|
173
|
+
if (!Array.isArray(value)) {
|
|
174
|
+
issues.push(`${sourcePath}: global_overrides must be a list`);
|
|
175
|
+
return [];
|
|
176
|
+
}
|
|
177
|
+
const rules: AgenticOwnersPathRule[] = [];
|
|
178
|
+
for (const [index, entry] of value.entries()) {
|
|
179
|
+
const label = `${sourcePath}: global_overrides[${index}]`;
|
|
180
|
+
if (!isRecord(entry)) {
|
|
181
|
+
issues.push(`${label} must be a mapping`);
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
const unknownKeys = Object.keys(entry).filter(
|
|
185
|
+
(key) => !(GLOBAL_OVERRIDE_KEYS as readonly string[]).includes(key),
|
|
186
|
+
);
|
|
187
|
+
if (unknownKeys.length > 0) {
|
|
188
|
+
issues.push(
|
|
189
|
+
`${label}: unknown key(s) ${unknownKeys.join(", ")} (allowed: ${GLOBAL_OVERRIDE_KEYS.join(", ")})`,
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
const paths = parsePaths(entry.paths, `${label}.paths`, issues);
|
|
193
|
+
const selfReview = parseBooleanField(
|
|
194
|
+
entry.self_review,
|
|
195
|
+
`${label}.self_review`,
|
|
196
|
+
"self_review",
|
|
197
|
+
issues,
|
|
198
|
+
);
|
|
199
|
+
const teams = parseOwnerList({
|
|
200
|
+
singular: entry.team,
|
|
201
|
+
plural: entry.teams,
|
|
202
|
+
label,
|
|
203
|
+
field: "teams",
|
|
204
|
+
issues,
|
|
205
|
+
parseEntry: parseTeamSlug,
|
|
206
|
+
});
|
|
207
|
+
const users = parseOwnerList({
|
|
208
|
+
singular: entry.user,
|
|
209
|
+
plural: entry.users,
|
|
210
|
+
label,
|
|
211
|
+
field: "users",
|
|
212
|
+
issues,
|
|
213
|
+
parseEntry: parseUserHandle,
|
|
214
|
+
});
|
|
215
|
+
const skipTeams = parseOwnerList({
|
|
216
|
+
singular: undefined,
|
|
217
|
+
plural: entry.skip_teams,
|
|
218
|
+
label,
|
|
219
|
+
field: "skip_teams",
|
|
220
|
+
issues,
|
|
221
|
+
parseEntry: parseTeamSlug,
|
|
222
|
+
});
|
|
223
|
+
const skipPaths =
|
|
224
|
+
entry.skip_paths === undefined
|
|
225
|
+
? []
|
|
226
|
+
: parsePaths(entry.skip_paths, `${label}.skip_paths`, issues);
|
|
227
|
+
if (paths === undefined || selfReview === undefined || skipPaths === undefined) {
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
validatePathsStayWithinRepository({
|
|
231
|
+
paths,
|
|
232
|
+
sourcePath,
|
|
233
|
+
label: `${label}.paths`,
|
|
234
|
+
issues,
|
|
235
|
+
});
|
|
236
|
+
validatePathsStayWithinRepository({
|
|
237
|
+
paths: skipPaths,
|
|
238
|
+
sourcePath,
|
|
239
|
+
label: `${label}.skip_paths`,
|
|
240
|
+
issues,
|
|
241
|
+
});
|
|
242
|
+
if (teams.length === 0 && users.length === 0) {
|
|
243
|
+
issues.push(`${label}: team or user is required`);
|
|
244
|
+
}
|
|
245
|
+
if (!selfReview) {
|
|
246
|
+
issues.push(
|
|
247
|
+
`${label}: self_review: true is required (an override only lets its owners clear matching files by self-review)`,
|
|
248
|
+
);
|
|
249
|
+
}
|
|
250
|
+
rules.push({
|
|
251
|
+
sourcePath,
|
|
252
|
+
scopeDepth: 0,
|
|
253
|
+
globalOverride: true,
|
|
254
|
+
paths,
|
|
255
|
+
teams,
|
|
256
|
+
users,
|
|
257
|
+
team: teams[0],
|
|
258
|
+
user: users[0],
|
|
259
|
+
prompt: undefined,
|
|
260
|
+
alwaysApprove: false,
|
|
261
|
+
mode: "advisory",
|
|
262
|
+
humanReviewRequired: false,
|
|
263
|
+
selfReview,
|
|
264
|
+
...(skipTeams.length > 0 ? { skipTeams } : {}),
|
|
265
|
+
...(skipPaths.length > 0 ? { skipPaths } : {}),
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
return rules;
|
|
269
|
+
}
|
|
270
|
+
|
|
146
271
|
function parsePromptPath(value: unknown, label: string, issues: string[]): string | undefined {
|
|
147
272
|
if (value === undefined) {
|
|
148
273
|
return undefined;
|
|
@@ -228,12 +353,12 @@ function parseOwnerList({
|
|
|
228
353
|
singular: unknown;
|
|
229
354
|
plural: unknown;
|
|
230
355
|
label: string;
|
|
231
|
-
field: "teams" | "users";
|
|
356
|
+
field: "teams" | "users" | "skip_teams";
|
|
232
357
|
issues: string[];
|
|
233
358
|
parseEntry: (value: unknown, label: string, issues: string[]) => string | undefined;
|
|
234
359
|
}): string[] {
|
|
235
360
|
const owners: string[] = [];
|
|
236
|
-
const singularField = field === "
|
|
361
|
+
const singularField = field === "users" ? "user" : "team";
|
|
237
362
|
const parsedSingular = parseEntry(singular, `${label}.${singularField}`, issues);
|
|
238
363
|
if (parsedSingular !== undefined) {
|
|
239
364
|
owners.push(parsedSingular);
|
|
@@ -507,6 +632,11 @@ export function parseAgenticOwnersPolicyYaml({
|
|
|
507
632
|
sourcePath,
|
|
508
633
|
issues,
|
|
509
634
|
});
|
|
635
|
+
const globalOverrides = parseGlobalOverrides({
|
|
636
|
+
value: parsed.global_overrides,
|
|
637
|
+
sourcePath,
|
|
638
|
+
issues,
|
|
639
|
+
});
|
|
510
640
|
|
|
511
641
|
if (parsed.rules !== undefined) {
|
|
512
642
|
issues.push(`${sourcePath}: use policies instead of rules`);
|
|
@@ -548,6 +678,7 @@ export function parseAgenticOwnersPolicyYaml({
|
|
|
548
678
|
if (rules.length === 0) {
|
|
549
679
|
throw new AgenticOwnersConfigValidationError([`${sourcePath}: policies must not be empty`]);
|
|
550
680
|
}
|
|
681
|
+
rules.push(...globalOverrides);
|
|
551
682
|
if (globalExclusions.length > 0) {
|
|
552
683
|
rules.push(
|
|
553
684
|
globalExclusionsRule({
|
|
@@ -12,12 +12,27 @@ export type AgenticOwnersPathRule = {
|
|
|
12
12
|
* no owners, so they never enroll a review.
|
|
13
13
|
*/
|
|
14
14
|
readonly globalExclusion?: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* True for a root `global_overrides` entry. These rules are not precedence
|
|
17
|
+
* candidates. After a file's winning rule is chosen, a matching override
|
|
18
|
+
* adds its owners to an advisory winner, or becomes the owner when no
|
|
19
|
+
* committed rule owns the file. `self_review` on the override applies to
|
|
20
|
+
* the override's owners either way, and does not extend to the existing
|
|
21
|
+
* winner's owners. Exclusions, always-approve, hard, and notify winners
|
|
22
|
+
* stay unchanged, as do winners owned by a `skip_teams` team and paths
|
|
23
|
+
* listed in `skip_paths`.
|
|
24
|
+
*/
|
|
25
|
+
readonly globalOverride?: boolean;
|
|
15
26
|
/**
|
|
16
27
|
* Glob patterns relative to the directory containing `.agentic-owners`.
|
|
17
28
|
* Root-policy paths are relative to the repository root.
|
|
18
29
|
* Leading `../` segments may address sibling trees but cannot leave the repo.
|
|
19
30
|
*/
|
|
20
31
|
readonly paths: readonly string[];
|
|
32
|
+
/** Teams whose winning rule a `global_overrides` entry must not change. */
|
|
33
|
+
readonly skipTeams?: readonly string[];
|
|
34
|
+
/** Paths a `global_overrides` entry must not change. */
|
|
35
|
+
readonly skipPaths?: readonly string[];
|
|
21
36
|
/**
|
|
22
37
|
* Team slugs (or `org/team` handles) that own these paths. A policy may
|
|
23
38
|
* list more than one. `team` is the first entry, kept for convenience.
|
|
@@ -39,6 +54,14 @@ export type AgenticOwnersPathRule = {
|
|
|
39
54
|
readonly mode: AgenticOwnersPolicyMode;
|
|
40
55
|
readonly humanReviewRequired: boolean;
|
|
41
56
|
readonly selfReview: boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Owners who may use {@link selfReview}. Absent means every owner on the
|
|
59
|
+
* rule. A merged override lists the winner's owners when that rule sets
|
|
60
|
+
* `self_review`, and the override's owners when the override sets it.
|
|
61
|
+
*/
|
|
62
|
+
readonly selfReviewTeams?: readonly string[];
|
|
63
|
+
/** User owners who may use {@link selfReview}. See {@link selfReviewTeams}. */
|
|
64
|
+
readonly selfReviewUsers?: readonly string[];
|
|
42
65
|
};
|
|
43
66
|
|
|
44
67
|
export type AgenticOwnersRepoConfig = {
|