@pome-sh/cli 0.23.39 → 0.23.40

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "package": "pome-sh",
3
- "version": "0.23.39",
4
- "git_sha": "7f1b85aeb0da4acd4547c537aa24c4347ad70b40",
5
- "build_time": "2026-08-13T01:54:45.694Z"
3
+ "version": "0.23.40",
4
+ "git_sha": "3768d4bce739655695ed55d6167ac3076ce188bd",
5
+ "build_time": "2026-08-13T02:18:00.852Z"
6
6
  }
@@ -183,7 +183,7 @@ async function checkTwinReachable(_configDir) {
183
183
  });
184
184
  let harness;
185
185
  try {
186
- const { bootTwin } = await import('./twinHarness-XO47SYBH.js');
186
+ const { bootTwin } = await import('./twinHarness-NMFJCPJE.js');
187
187
  harness = await bootTwin({
188
188
  twin: "github",
189
189
  seedState: void 0,
@@ -1,6 +1,6 @@
1
1
  // ../packages/twin-github/package.json
2
2
  var package_default = {
3
- version: "0.10.10"};
3
+ version: "0.10.11"};
4
4
 
5
5
  // ../packages/twin-slack/package.json
6
6
  var package_default2 = {
@@ -39,7 +39,7 @@ var TWIN_REGISTRY = {
39
39
  defaultSeedState,
40
40
  GitHubDomain,
41
41
  openGitHubCloneDatabase
42
- } = await import('./src-ATIALTX2.js');
42
+ } = await import('./src-XBWNIRBG.js');
43
43
  const db = openGitHubCloneDatabase();
44
44
  const domain = new GitHubDomain(db);
45
45
  domain.seed(seedState === void 0 ? defaultSeedState() : seedState);
@@ -173,7 +173,7 @@ var TWIN_REGISTRY = {
173
173
  }
174
174
  };
175
175
  async function createGitHubSmokeApp() {
176
- const { createGitHubCloneApp } = await import('./src-ATIALTX2.js');
176
+ const { createGitHubCloneApp } = await import('./src-XBWNIRBG.js');
177
177
  return createGitHubCloneApp();
178
178
  }
179
179
  function defaultPortFor(twin, env = process.env) {
@@ -1,5 +1,5 @@
1
1
  import { readManifest, normalizeManifestTwins } from './chunk-ABM3CMQB.js';
2
- import { createHostedClient, perTwinReturnedByCloud, parseTaskFile, runAgentCommand, writeRunArtifactsCore, toTwinHttpEvent, redactJsonl, uploadRunBlobs, scoreFromFinalizeResponse, scoreStatus, evaluationCounts } from './chunk-SAYISSCP.js';
2
+ import { createHostedClient, perTwinReturnedByCloud, parseTaskFile, runAgentCommand, writeRunArtifactsCore, toTwinHttpEvent, redactJsonl, uploadRunBlobs, scoreFromFinalizeResponse, scoreStatus, evaluationCounts } from './chunk-UHX5HOBR.js';
3
3
  import { MOUNTED_TWINS, HostedAuthError, HostedDiscardRefusedError, HostedQuotaError, HostedOrchError, HostedTrialError, agentResponseSchema } from './chunk-X66JOOO7.js';
4
4
  import { redactSecrets, redactEvent } from './chunk-SG6ZTIMT.js';
5
5
  import { randomUUID, createHash } from 'node:crypto';
@@ -1,4 +1,4 @@
1
- import { TWIN_NAMES, isTwinName, TWIN_REGISTRY } from './chunk-3OVV6JUQ.js';
1
+ import { TWIN_NAMES, isTwinName, TWIN_REGISTRY } from './chunk-2A5HJP46.js';
2
2
  import { createFileBackedRecorderStore, createRecorderStore } from './chunk-OW7VVW6X.js';
3
3
 
4
4
  // src/recorder/recorder.ts
@@ -1,7 +1,7 @@
1
1
  import { getAvailablePort } from './chunk-XDU6TD4O.js';
2
2
  import { buildEgressAllowlist, readBlockedEgress } from './chunk-CBFKZZBR.js';
3
- import { parseTaskFile, seedStateForTwin, runAgentCommand, writeRunArtifactsCore } from './chunk-SAYISSCP.js';
4
- import { createRecorder, bootTwin } from './chunk-YL4FHI3J.js';
3
+ import { parseTaskFile, seedStateForTwin, runAgentCommand, writeRunArtifactsCore } from './chunk-UHX5HOBR.js';
4
+ import { createRecorder, bootTwin } from './chunk-EJFMWBZE.js';
5
5
  import { eventSchema } from './chunk-VBATFCWR.js';
6
6
  import { redactSecrets, redactEvent } from './chunk-SG6ZTIMT.js';
7
7
  import { serve } from '@hono/node-server';
@@ -2,7 +2,7 @@ import { criterionSchema, finalizeResponseSchema, HostedDiscardRefusedError, Hos
2
2
  import { seedSchema, parseSeed, defaultSeedState as defaultSeedState$2 } from './chunk-KIUIKAVU.js';
3
3
  import { gmailSeedSchema, defaultSeedState } from './chunk-NJ246QPJ.js';
4
4
  import { linearSeedSchema, defaultSeedState as defaultSeedState$1 } from './chunk-ZKID2HS3.js';
5
- import { isTwinName, TWIN_REGISTRY } from './chunk-3OVV6JUQ.js';
5
+ import { isTwinName, TWIN_REGISTRY } from './chunk-2A5HJP46.js';
6
6
  import { toTwinHttpEventRow } from './chunk-OW7VVW6X.js';
7
7
  import { redactEvent, redactSecrets } from './chunk-SG6ZTIMT.js';
8
8
  import { mkdir, appendFile, writeFile, readFile } from 'node:fs/promises';
@@ -1,16 +1,16 @@
1
1
  import { newGroupId, reassuranceBox, twinReadyLine, trialsHeaderLine, trialLine, summaryLines, evaluatingLine, criterionPhrase } from './chunk-RGZBC7NF.js';
2
2
  import { DemoCapacityError, capacityLabel, parseCapacityMarker, capacityKindFrom } from './chunk-ZX4WNSZ5.js';
3
- import { runTask, demoTaskPath, DEMO_TASK_NAME, DEMO_REPO } from './chunk-5UBTKN7K.js';
3
+ import { runTask, demoTaskPath, DEMO_TASK_NAME, DEMO_REPO } from './chunk-F4V3FN3A.js';
4
4
  import { getAvailablePort } from './chunk-XDU6TD4O.js';
5
5
  import './chunk-CBFKZZBR.js';
6
- import { createHostedClient, parseTaskFile, uploadRunBlobs, scoreFromFinalizeResponse, scoreStatus, outcomeOf } from './chunk-SAYISSCP.js';
6
+ import { createHostedClient, parseTaskFile, uploadRunBlobs, scoreFromFinalizeResponse, scoreStatus, outcomeOf } from './chunk-UHX5HOBR.js';
7
7
  import './chunk-NW7HGA2K.js';
8
8
  import { HostedQuotaError, HostedOrchError } from './chunk-X66JOOO7.js';
9
9
  import './chunk-KIUIKAVU.js';
10
10
  import './chunk-NJ246QPJ.js';
11
11
  import './chunk-ZKID2HS3.js';
12
- import { bootTwin } from './chunk-YL4FHI3J.js';
13
- import './chunk-3OVV6JUQ.js';
12
+ import { bootTwin } from './chunk-EJFMWBZE.js';
13
+ import './chunk-2A5HJP46.js';
14
14
  import './chunk-OW7VVW6X.js';
15
15
  import './chunk-VBATFCWR.js';
16
16
  import './chunk-SG6ZTIMT.js';
@@ -1,13 +1,13 @@
1
1
  import { newGroupId, criterionPhrase } from './chunk-RGZBC7NF.js';
2
- import { runTaskHosted, resolveRunAgentIdentity } from './chunk-G4B64MFJ.js';
2
+ import { runTaskHosted, resolveRunAgentIdentity } from './chunk-ATIYRECS.js';
3
3
  import './chunk-ABM3CMQB.js';
4
- import { createHostedClient, parseTaskFile, outcomeOf } from './chunk-SAYISSCP.js';
4
+ import { createHostedClient, parseTaskFile, outcomeOf } from './chunk-UHX5HOBR.js';
5
5
  import './chunk-NW7HGA2K.js';
6
6
  import { HostedQuotaError, HostedTrialError } from './chunk-X66JOOO7.js';
7
7
  import './chunk-KIUIKAVU.js';
8
8
  import './chunk-NJ246QPJ.js';
9
9
  import './chunk-ZKID2HS3.js';
10
- import './chunk-3OVV6JUQ.js';
10
+ import './chunk-2A5HJP46.js';
11
11
  import './chunk-OW7VVW6X.js';
12
12
  import './chunk-VBATFCWR.js';
13
13
  import './chunk-SG6ZTIMT.js';
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
- import { DEFAULT_CONTROL_PLANE_URL, DEFAULT_DASHBOARD_URL, clearLocalCredentials, friendlyHostedError, runSessionCreate, runSessionList, runSessionStop, resolveCredentials, runTaskHosted, discoverRunSet, VERDICT_ARTIFACT_VERSION, persistCredentialsAfterLogin, DEFAULT_DOCS_SITE_ORIGIN, resolveSeams, resolveCachedAgentId, readLinkCache, postAgentResolver, writeLinkCache, ensurePomeGitignored } from '../../chunk-G4B64MFJ.js';
2
+ import { DEFAULT_CONTROL_PLANE_URL, DEFAULT_DASHBOARD_URL, clearLocalCredentials, friendlyHostedError, runSessionCreate, runSessionList, runSessionStop, resolveCredentials, runTaskHosted, discoverRunSet, VERDICT_ARTIFACT_VERSION, persistCredentialsAfterLogin, DEFAULT_DOCS_SITE_ORIGIN, resolveSeams, resolveCachedAgentId, readLinkCache, postAgentResolver, writeLinkCache, ensurePomeGitignored } from '../../chunk-ATIYRECS.js';
3
3
  import { readManifest, writeManifest, MANIFEST_JSON, readRequiredManifest, normalizeManifestTwins } from '../../chunk-ABM3CMQB.js';
4
- import { assetPath, runTask, resolvePackageRoot, DEMO_TASK_NAME, demoTaskPath } from '../../chunk-5UBTKN7K.js';
4
+ import { assetPath, runTask, resolvePackageRoot, DEMO_TASK_NAME, demoTaskPath } from '../../chunk-F4V3FN3A.js';
5
5
  import '../../chunk-XDU6TD4O.js';
6
6
  import '../../chunk-CBFKZZBR.js';
7
- import { parseTaskFile, scoreStatus, runScoreLine, readLatestRun, readMetaSummary, outcomeOf, readConfigTwins, scoreCountsSummary, markerFor, criterionMarkerLabel, twinSkipSuffix, readCodeCriteria, createHostedClient, toTwinHttpEvent, redactJsonl, scoreFromFinalizeResponse, parseGitHubSeedState, uploadRunBlobs, isPreSatisfied } from '../../chunk-SAYISSCP.js';
7
+ import { parseTaskFile, scoreStatus, runScoreLine, readLatestRun, readMetaSummary, outcomeOf, readConfigTwins, scoreCountsSummary, markerFor, criterionMarkerLabel, twinSkipSuffix, readCodeCriteria, createHostedClient, toTwinHttpEvent, redactJsonl, scoreFromFinalizeResponse, parseGitHubSeedState, uploadRunBlobs, isPreSatisfied } from '../../chunk-UHX5HOBR.js';
8
8
  import '../../chunk-NW7HGA2K.js';
9
9
  import { MOUNTED_TWINS, deriveAgentSlug, exitCodeFor, HostedUsageError, HostedOrchError, HostedAuthError, HostedQuotaError } from '../../chunk-X66JOOO7.js';
10
10
  import { TAPE_ASSERTABLE_TOOLS } from '../../chunk-FKZZWWYC.js';
@@ -15,8 +15,8 @@ import '../../chunk-NJ246QPJ.js';
15
15
  import { LINEAR_CHECKS } from '../../chunk-XBT6ZLBG.js';
16
16
  import '../../chunk-ZKID2HS3.js';
17
17
  import { oneOf, defineCheck, repoRef, VACUITY_SENTINEL_NUMBER, childStatePath, VACUITY_SENTINEL, statePath, templateSlots, renderCheck, checksDigest, checkPattern, checkNearMissPattern } from '../../chunk-JWJYNAWI.js';
18
- import '../../chunk-YL4FHI3J.js';
19
- import { TWIN_NAME_LIST, isTwinName, createGitHubSmokeApp } from '../../chunk-3OVV6JUQ.js';
18
+ import '../../chunk-EJFMWBZE.js';
19
+ import { TWIN_NAME_LIST, isTwinName, createGitHubSmokeApp } from '../../chunk-2A5HJP46.js';
20
20
  import '../../chunk-OW7VVW6X.js';
21
21
  import { isLegacyEventRow, eventSchema } from '../../chunk-VBATFCWR.js';
22
22
  import { redactEvent, redactSecrets } from '../../chunk-SG6ZTIMT.js';
@@ -850,7 +850,7 @@ async function throwForStatus(res) {
850
850
 
851
851
  // src/task/seed-verifier.ts
852
852
  async function verifySeedWithTwin(seed) {
853
- const { GitHubDomain, openGitHubCloneDatabase } = await import('../../src-ATIALTX2.js');
853
+ const { GitHubDomain, openGitHubCloneDatabase } = await import('../../src-XBWNIRBG.js');
854
854
  const db = openGitHubCloneDatabase(":memory:");
855
855
  try {
856
856
  new GitHubDomain(db).seed(seed);
@@ -4580,7 +4580,7 @@ var DEFAULT_AGENT_COMMAND = `node ${DEFAULT_AGENT_FILE}`;
4580
4580
  var MANIFEST_SCHEMA_URL = "https://pome.sh/schemas/v1/pome.json";
4581
4581
  var MAX_UNREADABLE_PATHS_SHOWN = 5;
4582
4582
  function readPackageVersion() {
4583
- if ("0.23.39".length > 0) return "0.23.39";
4583
+ if ("0.23.40".length > 0) return "0.23.40";
4584
4584
  try {
4585
4585
  const here = dirname(fileURLToPath(import.meta.url));
4586
4586
  const candidates = [
@@ -5035,7 +5035,7 @@ function createProgram() {
5035
5035
  return;
5036
5036
  }
5037
5037
  {
5038
- const { runDoctorChecks } = await import('../../checks-PZSMAVLY.js');
5038
+ const { runDoctorChecks } = await import('../../checks-A5EFOMZS.js');
5039
5039
  const { renderDoctorReport } = await import('../../render-ZQQ4UMNO.js');
5040
5040
  const doctorReport = await runDoctorChecks({ mode: useLocal ? "full" : "hosted" });
5041
5041
  if (!doctorReport.ok) {
@@ -5073,7 +5073,7 @@ function createProgram() {
5073
5073
  taskForRuns.config.runs
5074
5074
  );
5075
5075
  if (k > 1) {
5076
- const { runTrialGroup } = await import('../../runTrialGroup-MD2WFAYT.js');
5076
+ const { runTrialGroup } = await import('../../runTrialGroup-OOTTXL3B.js');
5077
5077
  const fileForRerun = relative(process.cwd(), file);
5078
5078
  const rerunCommand = defaultTask ? options.trials !== void 0 ? `pome run -n ${k}` : "pome run" : `pome run ${fileForRerun && !fileForRerun.startsWith("..") ? fileForRerun : file} -n ${k}`;
5079
5079
  const groupResult = await runTrialGroup({
@@ -5167,7 +5167,7 @@ function createProgram() {
5167
5167
  process.exitCode = 5;
5168
5168
  return;
5169
5169
  }
5170
- const { runDemo } = await import('../../runDemo-2QCREGAM.js');
5170
+ const { runDemo } = await import('../../runDemo-4YTN6E2H.js');
5171
5171
  const result = await runDemo({
5172
5172
  apiBase: opts.apiUrl.replace(/\/$/, ""),
5173
5173
  dashboardBase: process.env.POME_DASHBOARD_URL ?? DEFAULT_DASHBOARD_URL,
@@ -5185,7 +5185,7 @@ function createProgram() {
5185
5185
  program.command("doctor").description(
5186
5186
  "Check the agent\u2194twin wiring: pome.json (or pome.yaml) present + valid, the local twin boots + serves, requests routed to the twin (not a hardcoded production host), egress floor active. On failure prints one named cause (file:line where knowable) + one concrete fix and exits non-zero."
5187
5187
  ).action(async () => {
5188
- const { runDoctorChecks } = await import('../../checks-PZSMAVLY.js');
5188
+ const { runDoctorChecks } = await import('../../checks-A5EFOMZS.js');
5189
5189
  const { renderDoctorReport } = await import('../../render-ZQQ4UMNO.js');
5190
5190
  const report = await runDoctorChecks();
5191
5191
  for (const line of renderDoctorReport(report, { passNote: true })) console.error(line);
@@ -5361,7 +5361,7 @@ function createProgram() {
5361
5361
  ).description(
5362
5362
  "Start a standalone twin as a long-lived foreground server (Ctrl-C to stop)"
5363
5363
  ).action(async (name, options) => {
5364
- const { runTwinStartCommand } = await import('../../twinStart-J42TT766.js');
5364
+ const { runTwinStartCommand } = await import('../../twinStart-IIF4JZJS.js');
5365
5365
  await runTwinStartCommand(name, options);
5366
5366
  });
5367
5367
  twin.command("reset").argument("[name]", "Twin name (default: github)", "github").description("Reset standalone twin state").action(async (name) => {
@@ -704,14 +704,33 @@ var TwinError = class extends Error {
704
704
  this.documentationUrl = documentationUrl;
705
705
  }
706
706
  };
707
+ var GENERIC_DOCUMENTATION_URL = "https://docs.github.com/rest";
707
708
  function githubError(message, status, errors, documentationUrl) {
708
709
  return {
709
710
  message,
710
- documentation_url: documentationUrl ?? "https://docs.github.com/rest",
711
+ documentation_url: documentationUrl ?? GENERIC_DOCUMENTATION_URL,
711
712
  status: String(status),
712
713
  ...errors ? { errors } : {}
713
714
  };
714
715
  }
716
+ function withOperationDocs(envelope, documentationUrl) {
717
+ if (envelope.status === 501)
718
+ return envelope;
719
+ const body = envelope.body;
720
+ if (!body || typeof body !== "object")
721
+ return envelope;
722
+ const current = body.documentation_url;
723
+ if (current !== GENERIC_DOCUMENTATION_URL)
724
+ return envelope;
725
+ return { status: envelope.status, body: { ...body, documentation_url: documentationUrl } };
726
+ }
727
+ function withDocumentationUrl(error, documentationUrl) {
728
+ if (!(error instanceof TwinError))
729
+ return error;
730
+ if (error.documentationUrl !== void 0 || error.status === 501)
731
+ return error;
732
+ return new TwinError(error.message, error.status, error.errors, documentationUrl);
733
+ }
715
734
  function notFound(message = "Not Found") {
716
735
  throw new TwinError(message, 404);
717
736
  }
@@ -734,6 +753,673 @@ function validationFailed(field, code, value) {
734
753
  ]);
735
754
  }
736
755
 
756
+ // ../packages/twin-github/dist/fixtures/operation-docs.raw.json
757
+ var operation_docs_raw_default = {
758
+ operations: {
759
+ "checks/create": {
760
+ method: "POST",
761
+ path: "/repos/{owner}/{repo}/check-runs",
762
+ category: "checks",
763
+ subcategory: "runs",
764
+ url: "https://docs.github.com/rest/checks/runs#create-a-check-run"
765
+ },
766
+ "checks/list-for-ref": {
767
+ method: "GET",
768
+ path: "/repos/{owner}/{repo}/commits/{ref}/check-runs",
769
+ category: "checks",
770
+ subcategory: "runs",
771
+ url: "https://docs.github.com/rest/checks/runs#list-check-runs-for-a-git-reference"
772
+ },
773
+ "git/create-ref": {
774
+ method: "POST",
775
+ path: "/repos/{owner}/{repo}/git/refs",
776
+ category: "git",
777
+ subcategory: "refs",
778
+ url: "https://docs.github.com/rest/git/refs#create-a-reference"
779
+ },
780
+ "git/delete-ref": {
781
+ method: "DELETE",
782
+ path: "/repos/{owner}/{repo}/git/refs/{ref}",
783
+ category: "git",
784
+ subcategory: "refs",
785
+ url: "https://docs.github.com/rest/git/refs#delete-a-reference"
786
+ },
787
+ "issues/add-assignees": {
788
+ method: "POST",
789
+ path: "/repos/{owner}/{repo}/issues/{issue_number}/assignees",
790
+ category: "issues",
791
+ subcategory: "assignees",
792
+ url: "https://docs.github.com/rest/issues/assignees#add-assignees-to-an-issue"
793
+ },
794
+ "issues/add-labels": {
795
+ method: "POST",
796
+ path: "/repos/{owner}/{repo}/issues/{issue_number}/labels",
797
+ category: "issues",
798
+ subcategory: "labels",
799
+ url: "https://docs.github.com/rest/issues/labels#add-labels-to-an-issue"
800
+ },
801
+ "issues/create": {
802
+ method: "POST",
803
+ path: "/repos/{owner}/{repo}/issues",
804
+ category: "issues",
805
+ subcategory: "issues",
806
+ url: "https://docs.github.com/rest/issues/issues#create-an-issue"
807
+ },
808
+ "issues/create-comment": {
809
+ method: "POST",
810
+ path: "/repos/{owner}/{repo}/issues/{issue_number}/comments",
811
+ category: "issues",
812
+ subcategory: "comments",
813
+ url: "https://docs.github.com/rest/issues/comments#create-an-issue-comment"
814
+ },
815
+ "issues/create-label": {
816
+ method: "POST",
817
+ path: "/repos/{owner}/{repo}/labels",
818
+ category: "issues",
819
+ subcategory: "labels",
820
+ url: "https://docs.github.com/rest/issues/labels#create-a-label"
821
+ },
822
+ "issues/create-milestone": {
823
+ method: "POST",
824
+ path: "/repos/{owner}/{repo}/milestones",
825
+ category: "issues",
826
+ subcategory: "milestones",
827
+ url: "https://docs.github.com/rest/issues/milestones#create-a-milestone"
828
+ },
829
+ "issues/delete-comment": {
830
+ method: "DELETE",
831
+ path: "/repos/{owner}/{repo}/issues/comments/{comment_id}",
832
+ category: "issues",
833
+ subcategory: "comments",
834
+ url: "https://docs.github.com/rest/issues/comments#delete-an-issue-comment"
835
+ },
836
+ "issues/delete-milestone": {
837
+ method: "DELETE",
838
+ path: "/repos/{owner}/{repo}/milestones/{milestone_number}",
839
+ category: "issues",
840
+ subcategory: "milestones",
841
+ url: "https://docs.github.com/rest/issues/milestones#delete-a-milestone"
842
+ },
843
+ "issues/get": {
844
+ method: "GET",
845
+ path: "/repos/{owner}/{repo}/issues/{issue_number}",
846
+ category: "issues",
847
+ subcategory: "issues",
848
+ url: "https://docs.github.com/rest/issues/issues#get-an-issue"
849
+ },
850
+ "issues/list-comments": {
851
+ method: "GET",
852
+ path: "/repos/{owner}/{repo}/issues/{issue_number}/comments",
853
+ category: "issues",
854
+ subcategory: "comments",
855
+ url: "https://docs.github.com/rest/issues/comments#list-issue-comments"
856
+ },
857
+ "issues/list-for-repo": {
858
+ method: "GET",
859
+ path: "/repos/{owner}/{repo}/issues",
860
+ category: "issues",
861
+ subcategory: "issues",
862
+ url: "https://docs.github.com/rest/issues/issues#list-repository-issues"
863
+ },
864
+ "issues/list-labels-for-repo": {
865
+ method: "GET",
866
+ path: "/repos/{owner}/{repo}/labels",
867
+ category: "issues",
868
+ subcategory: "labels",
869
+ url: "https://docs.github.com/rest/issues/labels#list-labels-for-a-repository"
870
+ },
871
+ "issues/list-labels-on-issue": {
872
+ method: "GET",
873
+ path: "/repos/{owner}/{repo}/issues/{issue_number}/labels",
874
+ category: "issues",
875
+ subcategory: "labels",
876
+ url: "https://docs.github.com/rest/issues/labels#list-labels-for-an-issue"
877
+ },
878
+ "issues/list-milestones": {
879
+ method: "GET",
880
+ path: "/repos/{owner}/{repo}/milestones",
881
+ category: "issues",
882
+ subcategory: "milestones",
883
+ url: "https://docs.github.com/rest/issues/milestones#list-milestones"
884
+ },
885
+ "issues/remove-label": {
886
+ method: "DELETE",
887
+ path: "/repos/{owner}/{repo}/issues/{issue_number}/labels/{name}",
888
+ category: "issues",
889
+ subcategory: "labels",
890
+ url: "https://docs.github.com/rest/issues/labels#remove-a-label-from-an-issue"
891
+ },
892
+ "issues/update": {
893
+ method: "PATCH",
894
+ path: "/repos/{owner}/{repo}/issues/{issue_number}",
895
+ category: "issues",
896
+ subcategory: "issues",
897
+ url: "https://docs.github.com/rest/issues/issues#update-an-issue"
898
+ },
899
+ "issues/update-comment": {
900
+ method: "PATCH",
901
+ path: "/repos/{owner}/{repo}/issues/comments/{comment_id}",
902
+ category: "issues",
903
+ subcategory: "comments",
904
+ url: "https://docs.github.com/rest/issues/comments#update-an-issue-comment"
905
+ },
906
+ "issues/update-milestone": {
907
+ method: "PATCH",
908
+ path: "/repos/{owner}/{repo}/milestones/{milestone_number}",
909
+ category: "issues",
910
+ subcategory: "milestones",
911
+ url: "https://docs.github.com/rest/issues/milestones#update-a-milestone"
912
+ },
913
+ "pulls/create": {
914
+ method: "POST",
915
+ path: "/repos/{owner}/{repo}/pulls",
916
+ category: "pulls",
917
+ subcategory: "pulls",
918
+ url: "https://docs.github.com/rest/pulls/pulls#create-a-pull-request"
919
+ },
920
+ "pulls/create-reply-for-review-comment": {
921
+ method: "POST",
922
+ path: "/repos/{owner}/{repo}/pulls/{pull_number}/comments/{comment_id}/replies",
923
+ category: "pulls",
924
+ subcategory: "comments",
925
+ url: "https://docs.github.com/rest/pulls/comments#create-a-reply-for-a-review-comment"
926
+ },
927
+ "pulls/create-review": {
928
+ method: "POST",
929
+ path: "/repos/{owner}/{repo}/pulls/{pull_number}/reviews",
930
+ category: "pulls",
931
+ subcategory: "reviews",
932
+ url: "https://docs.github.com/rest/pulls/reviews#create-a-review-for-a-pull-request"
933
+ },
934
+ "pulls/create-review-comment": {
935
+ method: "POST",
936
+ path: "/repos/{owner}/{repo}/pulls/{pull_number}/comments",
937
+ category: "pulls",
938
+ subcategory: "comments",
939
+ url: "https://docs.github.com/rest/pulls/comments#create-a-review-comment-for-a-pull-request"
940
+ },
941
+ "pulls/get": {
942
+ method: "GET",
943
+ path: "/repos/{owner}/{repo}/pulls/{pull_number}",
944
+ category: "pulls",
945
+ subcategory: "pulls",
946
+ url: "https://docs.github.com/rest/pulls/pulls#get-a-pull-request"
947
+ },
948
+ "pulls/list": {
949
+ method: "GET",
950
+ path: "/repos/{owner}/{repo}/pulls",
951
+ category: "pulls",
952
+ subcategory: "pulls",
953
+ url: "https://docs.github.com/rest/pulls/pulls#list-pull-requests"
954
+ },
955
+ "pulls/list-commits": {
956
+ method: "GET",
957
+ path: "/repos/{owner}/{repo}/pulls/{pull_number}/commits",
958
+ category: "pulls",
959
+ subcategory: "pulls",
960
+ url: "https://docs.github.com/rest/pulls/pulls#list-commits-on-a-pull-request"
961
+ },
962
+ "pulls/list-files": {
963
+ method: "GET",
964
+ path: "/repos/{owner}/{repo}/pulls/{pull_number}/files",
965
+ category: "pulls",
966
+ subcategory: "pulls",
967
+ url: "https://docs.github.com/rest/pulls/pulls#list-pull-requests-files"
968
+ },
969
+ "pulls/list-review-comments": {
970
+ method: "GET",
971
+ path: "/repos/{owner}/{repo}/pulls/{pull_number}/comments",
972
+ category: "pulls",
973
+ subcategory: "comments",
974
+ url: "https://docs.github.com/rest/pulls/comments#list-review-comments-on-a-pull-request"
975
+ },
976
+ "pulls/list-reviews": {
977
+ method: "GET",
978
+ path: "/repos/{owner}/{repo}/pulls/{pull_number}/reviews",
979
+ category: "pulls",
980
+ subcategory: "reviews",
981
+ url: "https://docs.github.com/rest/pulls/reviews#list-reviews-for-a-pull-request"
982
+ },
983
+ "pulls/merge": {
984
+ method: "PUT",
985
+ path: "/repos/{owner}/{repo}/pulls/{pull_number}/merge",
986
+ category: "pulls",
987
+ subcategory: "pulls",
988
+ url: "https://docs.github.com/rest/pulls/pulls#merge-a-pull-request"
989
+ },
990
+ "pulls/update": {
991
+ method: "PATCH",
992
+ path: "/repos/{owner}/{repo}/pulls/{pull_number}",
993
+ category: "pulls",
994
+ subcategory: "pulls",
995
+ url: "https://docs.github.com/rest/pulls/pulls#update-a-pull-request"
996
+ },
997
+ "pulls/update-branch": {
998
+ method: "PUT",
999
+ path: "/repos/{owner}/{repo}/pulls/{pull_number}/update-branch",
1000
+ category: "pulls",
1001
+ subcategory: "pulls",
1002
+ url: "https://docs.github.com/rest/pulls/pulls#update-a-pull-request-branch"
1003
+ },
1004
+ "repos/add-collaborator": {
1005
+ method: "PUT",
1006
+ path: "/repos/{owner}/{repo}/collaborators/{username}",
1007
+ category: "collaborators",
1008
+ subcategory: "collaborators",
1009
+ url: "https://docs.github.com/rest/collaborators/collaborators#add-a-repository-collaborator"
1010
+ },
1011
+ "repos/check-collaborator": {
1012
+ method: "GET",
1013
+ path: "/repos/{owner}/{repo}/collaborators/{username}",
1014
+ category: "collaborators",
1015
+ subcategory: "collaborators",
1016
+ url: "https://docs.github.com/rest/collaborators/collaborators#check-if-a-user-is-a-repository-collaborator"
1017
+ },
1018
+ "repos/compare-commits": {
1019
+ method: "GET",
1020
+ path: "/repos/{owner}/{repo}/compare/{basehead}",
1021
+ category: "commits",
1022
+ subcategory: "commits",
1023
+ url: "https://docs.github.com/rest/commits/commits#compare-two-commits"
1024
+ },
1025
+ "repos/create-commit-status": {
1026
+ method: "POST",
1027
+ path: "/repos/{owner}/{repo}/statuses/{sha}",
1028
+ category: "commits",
1029
+ subcategory: "statuses",
1030
+ url: "https://docs.github.com/rest/commits/statuses#create-a-commit-status"
1031
+ },
1032
+ "repos/create-for-authenticated-user": {
1033
+ method: "POST",
1034
+ path: "/user/repos",
1035
+ category: "repos",
1036
+ subcategory: "repos",
1037
+ url: "https://docs.github.com/rest/repos/repos#create-a-repository-for-the-authenticated-user"
1038
+ },
1039
+ "repos/create-fork": {
1040
+ method: "POST",
1041
+ path: "/repos/{owner}/{repo}/forks",
1042
+ category: "repos",
1043
+ subcategory: "forks",
1044
+ url: "https://docs.github.com/rest/repos/forks#create-a-fork"
1045
+ },
1046
+ "repos/create-in-org": {
1047
+ method: "POST",
1048
+ path: "/orgs/{org}/repos",
1049
+ category: "repos",
1050
+ subcategory: "repos",
1051
+ url: "https://docs.github.com/rest/repos/repos#create-an-organization-repository"
1052
+ },
1053
+ "repos/create-or-update-file-contents": {
1054
+ method: "PUT",
1055
+ path: "/repos/{owner}/{repo}/contents/{path}",
1056
+ category: "repos",
1057
+ subcategory: "contents",
1058
+ url: "https://docs.github.com/rest/repos/contents#create-or-update-file-contents"
1059
+ },
1060
+ "repos/create-release": {
1061
+ method: "POST",
1062
+ path: "/repos/{owner}/{repo}/releases",
1063
+ category: "releases",
1064
+ subcategory: "releases",
1065
+ url: "https://docs.github.com/rest/releases/releases#create-a-release"
1066
+ },
1067
+ "repos/delete-file": {
1068
+ method: "DELETE",
1069
+ path: "/repos/{owner}/{repo}/contents/{path}",
1070
+ category: "repos",
1071
+ subcategory: "contents",
1072
+ url: "https://docs.github.com/rest/repos/contents#delete-a-file"
1073
+ },
1074
+ "repos/get": {
1075
+ method: "GET",
1076
+ path: "/repos/{owner}/{repo}",
1077
+ category: "repos",
1078
+ subcategory: "repos",
1079
+ url: "https://docs.github.com/rest/repos/repos#get-a-repository"
1080
+ },
1081
+ "repos/get-branch": {
1082
+ method: "GET",
1083
+ path: "/repos/{owner}/{repo}/branches/{branch}",
1084
+ category: "branches",
1085
+ subcategory: "branches",
1086
+ url: "https://docs.github.com/rest/branches/branches#get-a-branch"
1087
+ },
1088
+ "repos/get-combined-status-for-ref": {
1089
+ method: "GET",
1090
+ path: "/repos/{owner}/{repo}/commits/{ref}/status",
1091
+ category: "commits",
1092
+ subcategory: "statuses",
1093
+ url: "https://docs.github.com/rest/commits/statuses#get-the-combined-status-for-a-specific-reference"
1094
+ },
1095
+ "repos/get-commit": {
1096
+ method: "GET",
1097
+ path: "/repos/{owner}/{repo}/commits/{ref}",
1098
+ category: "commits",
1099
+ subcategory: "commits",
1100
+ url: "https://docs.github.com/rest/commits/commits#get-a-commit"
1101
+ },
1102
+ "repos/get-content": {
1103
+ method: "GET",
1104
+ path: "/repos/{owner}/{repo}/contents/{path}",
1105
+ category: "repos",
1106
+ subcategory: "contents",
1107
+ url: "https://docs.github.com/rest/repos/contents#get-repository-content"
1108
+ },
1109
+ "repos/get-latest-release": {
1110
+ method: "GET",
1111
+ path: "/repos/{owner}/{repo}/releases/latest",
1112
+ category: "releases",
1113
+ subcategory: "releases",
1114
+ url: "https://docs.github.com/rest/releases/releases#get-the-latest-release"
1115
+ },
1116
+ "repos/get-release-by-tag": {
1117
+ method: "GET",
1118
+ path: "/repos/{owner}/{repo}/releases/tags/{tag}",
1119
+ category: "releases",
1120
+ subcategory: "releases",
1121
+ url: "https://docs.github.com/rest/releases/releases#get-a-release-by-tag-name"
1122
+ },
1123
+ "repos/list-branches": {
1124
+ method: "GET",
1125
+ path: "/repos/{owner}/{repo}/branches",
1126
+ category: "branches",
1127
+ subcategory: "branches",
1128
+ url: "https://docs.github.com/rest/branches/branches#list-branches"
1129
+ },
1130
+ "repos/list-collaborators": {
1131
+ method: "GET",
1132
+ path: "/repos/{owner}/{repo}/collaborators",
1133
+ category: "collaborators",
1134
+ subcategory: "collaborators",
1135
+ url: "https://docs.github.com/rest/collaborators/collaborators#list-repository-collaborators"
1136
+ },
1137
+ "repos/list-commits": {
1138
+ method: "GET",
1139
+ path: "/repos/{owner}/{repo}/commits",
1140
+ category: "commits",
1141
+ subcategory: "commits",
1142
+ url: "https://docs.github.com/rest/commits/commits#list-commits"
1143
+ },
1144
+ "repos/list-releases": {
1145
+ method: "GET",
1146
+ path: "/repos/{owner}/{repo}/releases",
1147
+ category: "releases",
1148
+ subcategory: "releases",
1149
+ url: "https://docs.github.com/rest/releases/releases#list-releases"
1150
+ },
1151
+ "repos/list-tags": {
1152
+ method: "GET",
1153
+ path: "/repos/{owner}/{repo}/tags",
1154
+ category: "repos",
1155
+ subcategory: "repos",
1156
+ url: "https://docs.github.com/rest/repos/repos#list-repository-tags"
1157
+ },
1158
+ "search/code": {
1159
+ method: "GET",
1160
+ path: "/search/code",
1161
+ category: "search",
1162
+ subcategory: "search",
1163
+ url: "https://docs.github.com/rest/search/search#search-code"
1164
+ },
1165
+ "search/commits": {
1166
+ method: "GET",
1167
+ path: "/search/commits",
1168
+ category: "search",
1169
+ subcategory: "search",
1170
+ url: "https://docs.github.com/rest/search/search#search-commits"
1171
+ },
1172
+ "search/issues-and-pull-requests": {
1173
+ method: "GET",
1174
+ path: "/search/issues",
1175
+ category: "search",
1176
+ subcategory: "search",
1177
+ url: "https://docs.github.com/rest/search/search#search-issues-and-pull-requests"
1178
+ },
1179
+ "search/repos": {
1180
+ method: "GET",
1181
+ path: "/search/repositories",
1182
+ category: "search",
1183
+ subcategory: "search",
1184
+ url: "https://docs.github.com/rest/search/search#search-repositories"
1185
+ },
1186
+ "search/users": {
1187
+ method: "GET",
1188
+ path: "/search/users",
1189
+ category: "search",
1190
+ subcategory: "search",
1191
+ url: "https://docs.github.com/rest/search/search#search-users"
1192
+ },
1193
+ "users/get-authenticated": {
1194
+ method: "GET",
1195
+ path: "/user",
1196
+ category: "users",
1197
+ subcategory: "users",
1198
+ url: "https://docs.github.com/rest/users/users#get-the-authenticated-user"
1199
+ }
1200
+ },
1201
+ rest: {
1202
+ "DELETE /repos/:owner/:repo/contents/*": "repos/delete-file",
1203
+ "DELETE /repos/:owner/:repo/git/refs/heads/*": "git/delete-ref",
1204
+ "DELETE /repos/:owner/:repo/issues/:number/labels/:name": "issues/remove-label",
1205
+ "DELETE /repos/:owner/:repo/issues/comments/:comment_id": "issues/delete-comment",
1206
+ "DELETE /repos/:owner/:repo/milestones/:number": "issues/delete-milestone",
1207
+ "GET /repos/:owner/:repo": "repos/get",
1208
+ "GET /repos/:owner/:repo/branches": "repos/list-branches",
1209
+ "GET /repos/:owner/:repo/branches/*": "repos/get-branch",
1210
+ "GET /repos/:owner/:repo/collaborators": "repos/list-collaborators",
1211
+ "GET /repos/:owner/:repo/collaborators/:username": "repos/check-collaborator",
1212
+ "GET /repos/:owner/:repo/commits": "repos/list-commits",
1213
+ "GET /repos/:owner/:repo/commits/:ref": "repos/get-commit",
1214
+ "GET /repos/:owner/:repo/commits/:ref/check-runs": "checks/list-for-ref",
1215
+ "GET /repos/:owner/:repo/commits/:ref/status": "repos/get-combined-status-for-ref",
1216
+ "GET /repos/:owner/:repo/compare/:basehead{.+}": "repos/compare-commits",
1217
+ "GET /repos/:owner/:repo/contents": "repos/get-content",
1218
+ "GET /repos/:owner/:repo/contents/*": "repos/get-content",
1219
+ "GET /repos/:owner/:repo/issues": "issues/list-for-repo",
1220
+ "GET /repos/:owner/:repo/issues/:number": "issues/get",
1221
+ "GET /repos/:owner/:repo/issues/:number/comments": "issues/list-comments",
1222
+ "GET /repos/:owner/:repo/issues/:number/labels": "issues/list-labels-on-issue",
1223
+ "GET /repos/:owner/:repo/labels": "issues/list-labels-for-repo",
1224
+ "GET /repos/:owner/:repo/milestones": "issues/list-milestones",
1225
+ "GET /repos/:owner/:repo/pulls": "pulls/list",
1226
+ "GET /repos/:owner/:repo/pulls/:number": "pulls/get",
1227
+ "GET /repos/:owner/:repo/pulls/:number/comments": "pulls/list-review-comments",
1228
+ "GET /repos/:owner/:repo/pulls/:number/commits": "pulls/list-commits",
1229
+ "GET /repos/:owner/:repo/pulls/:number/diff": null,
1230
+ "GET /repos/:owner/:repo/pulls/:number/files": "pulls/list-files",
1231
+ "GET /repos/:owner/:repo/pulls/:number/reviews": "pulls/list-reviews",
1232
+ "GET /repos/:owner/:repo/pulls/:number/status": null,
1233
+ "GET /repos/:owner/:repo/releases": "repos/list-releases",
1234
+ "GET /repos/:owner/:repo/releases/latest": "repos/get-latest-release",
1235
+ "GET /repos/:owner/:repo/releases/tags/*": "repos/get-release-by-tag",
1236
+ "GET /repos/:owner/:repo/tags": "repos/list-tags",
1237
+ "GET /search/code": "search/code",
1238
+ "GET /search/commits": "search/commits",
1239
+ "GET /search/issues": "search/issues-and-pull-requests",
1240
+ "GET /search/repositories": "search/repos",
1241
+ "GET /search/users": "search/users",
1242
+ "GET /user": "users/get-authenticated",
1243
+ "PATCH /repos/:owner/:repo/issues/:number": "issues/update",
1244
+ "PATCH /repos/:owner/:repo/issues/comments/:comment_id": "issues/update-comment",
1245
+ "PATCH /repos/:owner/:repo/milestones/:number": "issues/update-milestone",
1246
+ "PATCH /repos/:owner/:repo/pulls/:number": "pulls/update",
1247
+ "POST /orgs/:owner/repos": "repos/create-in-org",
1248
+ "POST /repos/:owner/:repo/check-runs": "checks/create",
1249
+ "POST /repos/:owner/:repo/forks": "repos/create-fork",
1250
+ "POST /repos/:owner/:repo/git/refs": "git/create-ref",
1251
+ "POST /repos/:owner/:repo/issues": "issues/create",
1252
+ "POST /repos/:owner/:repo/issues/:number/assignees": "issues/add-assignees",
1253
+ "POST /repos/:owner/:repo/issues/:number/comments": "issues/create-comment",
1254
+ "POST /repos/:owner/:repo/issues/:number/labels": "issues/add-labels",
1255
+ "POST /repos/:owner/:repo/labels": "issues/create-label",
1256
+ "POST /repos/:owner/:repo/milestones": "issues/create-milestone",
1257
+ "POST /repos/:owner/:repo/pulls": "pulls/create",
1258
+ "POST /repos/:owner/:repo/pulls/:number/comments": "pulls/create-review-comment",
1259
+ "POST /repos/:owner/:repo/pulls/:number/comments/:comment_id/replies": "pulls/create-reply-for-review-comment",
1260
+ "POST /repos/:owner/:repo/pulls/:number/reviews": "pulls/create-review",
1261
+ "POST /repos/:owner/:repo/releases": "repos/create-release",
1262
+ "POST /repos/:owner/:repo/statuses/:sha": "repos/create-commit-status",
1263
+ "POST /user/repos": "repos/create-for-authenticated-user",
1264
+ "PUT /repos/:owner/:repo/collaborators/:username": "repos/add-collaborator",
1265
+ "PUT /repos/:owner/:repo/contents/*": "repos/create-or-update-file-contents",
1266
+ "PUT /repos/:owner/:repo/pulls/:number/merge": "pulls/merge",
1267
+ "PUT /repos/:owner/:repo/pulls/:number/update-branch": "pulls/update-branch"
1268
+ },
1269
+ mcp: {
1270
+ add_issue_comment: {
1271
+ operationId: "issues/create-comment"
1272
+ },
1273
+ add_reply_to_pull_request_comment: {
1274
+ operationId: "pulls/create-reply-for-review-comment"
1275
+ },
1276
+ create_branch: null,
1277
+ create_issue: {
1278
+ operationId: "issues/create"
1279
+ },
1280
+ create_or_update_file: {
1281
+ operationId: "repos/create-or-update-file-contents"
1282
+ },
1283
+ create_pull_request: {
1284
+ operationId: "pulls/create"
1285
+ },
1286
+ create_pull_request_review: {
1287
+ operationId: "pulls/create-review"
1288
+ },
1289
+ create_repository: {
1290
+ byArgument: {
1291
+ argument: "owner",
1292
+ present: "repos/create-in-org",
1293
+ absent: "repos/create-for-authenticated-user"
1294
+ }
1295
+ },
1296
+ delete_file: {
1297
+ operationId: "repos/delete-file"
1298
+ },
1299
+ fork_repository: {
1300
+ operationId: "repos/create-fork"
1301
+ },
1302
+ get_commit: {
1303
+ operationId: "repos/get-commit"
1304
+ },
1305
+ get_file_contents: {
1306
+ operationId: "repos/get-content"
1307
+ },
1308
+ get_latest_release: {
1309
+ operationId: "repos/get-latest-release"
1310
+ },
1311
+ get_me: {
1312
+ operationId: "users/get-authenticated"
1313
+ },
1314
+ get_release_by_tag: {
1315
+ operationId: "repos/get-release-by-tag"
1316
+ },
1317
+ get_tag: null,
1318
+ issue_read: {
1319
+ byMethod: {
1320
+ get: "issues/get",
1321
+ get_comments: "issues/list-comments",
1322
+ get_labels: "issues/list-labels-on-issue"
1323
+ }
1324
+ },
1325
+ issue_write: {
1326
+ byMethod: {
1327
+ create: "issues/create",
1328
+ update: "issues/update"
1329
+ }
1330
+ },
1331
+ list_branches: {
1332
+ operationId: "repos/list-branches"
1333
+ },
1334
+ list_commits: {
1335
+ operationId: "repos/list-commits"
1336
+ },
1337
+ list_issues: {
1338
+ operationId: "issues/list-for-repo"
1339
+ },
1340
+ list_pull_requests: {
1341
+ operationId: "pulls/list"
1342
+ },
1343
+ list_releases: {
1344
+ operationId: "repos/list-releases"
1345
+ },
1346
+ list_repository_collaborators: {
1347
+ operationId: "repos/list-collaborators"
1348
+ },
1349
+ list_tags: {
1350
+ operationId: "repos/list-tags"
1351
+ },
1352
+ merge_pull_request: {
1353
+ operationId: "pulls/merge"
1354
+ },
1355
+ pull_request_read: {
1356
+ byMethod: {
1357
+ get: "pulls/get",
1358
+ get_diff: "pulls/get",
1359
+ get_status: "repos/get-combined-status-for-ref",
1360
+ get_files: "pulls/list-files",
1361
+ get_commits: "pulls/list-commits",
1362
+ get_reviews: "pulls/list-reviews",
1363
+ get_comments: "issues/list-comments",
1364
+ get_review_comments: "pulls/list-review-comments",
1365
+ get_check_runs: "checks/list-for-ref"
1366
+ }
1367
+ },
1368
+ pull_request_review_write: {
1369
+ byMethod: {
1370
+ create: "pulls/create-review"
1371
+ }
1372
+ },
1373
+ push_files: null,
1374
+ search_code: {
1375
+ operationId: "search/code"
1376
+ },
1377
+ search_commits: {
1378
+ operationId: "search/commits"
1379
+ },
1380
+ search_issues: {
1381
+ operationId: "search/issues-and-pull-requests"
1382
+ },
1383
+ search_repositories: {
1384
+ operationId: "search/repos"
1385
+ },
1386
+ search_users: {
1387
+ operationId: "search/users"
1388
+ },
1389
+ update_pull_request: {
1390
+ operationId: "pulls/update"
1391
+ },
1392
+ update_pull_request_branch: {
1393
+ operationId: "pulls/update-branch"
1394
+ }
1395
+ }
1396
+ };
1397
+
1398
+ // ../packages/twin-github/dist/src/operation-docs.js
1399
+ var docs = operation_docs_raw_default;
1400
+ function urlFor(operationId) {
1401
+ if (!operationId)
1402
+ return void 0;
1403
+ return docs.operations[operationId]?.url;
1404
+ }
1405
+ function restOperationDocumentationUrl(surface) {
1406
+ return urlFor(docs.rest[surface]);
1407
+ }
1408
+ function toolOperationDocumentationUrl(tool, args) {
1409
+ const entry2 = docs.mcp[tool];
1410
+ if (!entry2)
1411
+ return void 0;
1412
+ if ("operationId" in entry2)
1413
+ return urlFor(entry2.operationId);
1414
+ const record = args && typeof args === "object" ? args : {};
1415
+ if ("byMethod" in entry2) {
1416
+ const method = record.method;
1417
+ return typeof method === "string" ? urlFor(entry2.byMethod[method]) : void 0;
1418
+ }
1419
+ const sent = record[entry2.byArgument.argument] !== void 0;
1420
+ return urlFor(sent ? entry2.byArgument.present : entry2.byArgument.absent);
1421
+ }
1422
+
737
1423
  // ../packages/twin-github/dist/src/tools.js
738
1424
  var githubToolFixture = loadMcpToolFixture({ raw: mcp_tools_list_raw_default, meta: mcp_tools_list_meta_default });
739
1425
  var pageShape = {
@@ -1023,6 +1709,16 @@ function executeTool(domain, name, input, onDelta, options = {}) {
1023
1709
  validationFailed("tool", "invalid", name);
1024
1710
  }
1025
1711
  const parsed = definition.schema.parse(input);
1712
+ const documentationUrl = toolOperationDocumentationUrl(name, parsed);
1713
+ if (documentationUrl === void 0)
1714
+ return dispatchTool(domain, name, parsed, onDelta, options);
1715
+ try {
1716
+ return dispatchTool(domain, name, parsed, onDelta, options);
1717
+ } catch (error) {
1718
+ throw withDocumentationUrl(error, documentationUrl);
1719
+ }
1720
+ }
1721
+ function dispatchTool(domain, name, parsed, onDelta, options = {}) {
1026
1722
  switch (name) {
1027
1723
  case "search_repositories":
1028
1724
  return domain.searchRepositories(parsed);
@@ -4510,6 +5206,53 @@ var GitHubDomain = class {
4510
5206
  this.db.prepare("INSERT INTO audit_log (ts, action, repo_full_name, payload_json) VALUES (?, ?, ?, ?)").run(nowIso(), action, repoFullName, JSON.stringify(payload));
4511
5207
  }
4512
5208
  };
5209
+ function zodIssues(err) {
5210
+ if (err instanceof ZodError)
5211
+ return err.issues;
5212
+ if (err instanceof Error && err.name === "ZodError" && Array.isArray(err.issues)) {
5213
+ return err.issues;
5214
+ }
5215
+ return void 0;
5216
+ }
5217
+ function githubErrorEnvelope(err) {
5218
+ if (err instanceof UnknownToolError) {
5219
+ return {
5220
+ status: 422,
5221
+ body: githubError("Validation Failed", 422, [
5222
+ { resource: "Request", field: "tool", code: "invalid", value: err.tool }
5223
+ ])
5224
+ };
5225
+ }
5226
+ if (err instanceof TwinError) {
5227
+ return {
5228
+ status: err.status,
5229
+ body: githubError(err.message, err.status, err.errors, err.documentationUrl)
5230
+ };
5231
+ }
5232
+ const issues = zodIssues(err);
5233
+ if (issues) {
5234
+ return {
5235
+ status: 422,
5236
+ body: githubError("Validation Failed", 422, issues.map((issue) => ({
5237
+ resource: "Request",
5238
+ field: issue.path.join("."),
5239
+ code: issue.code
5240
+ })))
5241
+ };
5242
+ }
5243
+ if (err instanceof SyntaxError) {
5244
+ return { status: 400, body: githubError("Problems parsing JSON", 400) };
5245
+ }
5246
+ return {
5247
+ status: 500,
5248
+ body: githubError(err instanceof Error ? err.message : "Internal Server Error", 500)
5249
+ };
5250
+ }
5251
+ function operationErrorEnvelope(documentationUrl) {
5252
+ if (documentationUrl === void 0)
5253
+ return githubErrorEnvelope;
5254
+ return (err) => withOperationDocs(githubErrorEnvelope(err), documentationUrl);
5255
+ }
4513
5256
 
4514
5257
  // ../packages/twin-github/dist/src/rest-content.js
4515
5258
  var BASE64 = /^[A-Za-z0-9+/]*={0,2}$/;
@@ -4535,7 +5278,8 @@ function captureDelta(fn) {
4535
5278
  }
4536
5279
  function registerGitHubRoutes(session, { domain, recorder }) {
4537
5280
  const route = (declaration, handler, tool) => {
4538
- mountDeclaredRoute(session, declaration, recorder.handle({ mutation: false, ...tool ? { tool } : {} }, async (c) => {
5281
+ const errorEnvelope = operationErrorEnvelope(restOperationDocumentationUrl(declaration.surface));
5282
+ mountDeclaredRoute(session, declaration, recorder.handle({ mutation: false, errorEnvelope, ...tool ? { tool } : {} }, async (c) => {
4539
5283
  const input = await parseDeclared(declaration, c);
4540
5284
  const result = await handler(input, c);
4541
5285
  return {
@@ -4803,48 +5547,6 @@ var seedParser = {
4803
5547
  function actorFromSession(session) {
4804
5548
  return typeof session?.login === "string" ? session.login : void 0;
4805
5549
  }
4806
- function zodIssues(err) {
4807
- if (err instanceof ZodError)
4808
- return err.issues;
4809
- if (err instanceof Error && err.name === "ZodError" && Array.isArray(err.issues)) {
4810
- return err.issues;
4811
- }
4812
- return void 0;
4813
- }
4814
- function githubErrorEnvelope(err) {
4815
- if (err instanceof UnknownToolError) {
4816
- return {
4817
- status: 422,
4818
- body: githubError("Validation Failed", 422, [
4819
- { resource: "Request", field: "tool", code: "invalid", value: err.tool }
4820
- ])
4821
- };
4822
- }
4823
- if (err instanceof TwinError) {
4824
- return {
4825
- status: err.status,
4826
- body: githubError(err.message, err.status, err.errors, err.documentationUrl)
4827
- };
4828
- }
4829
- const issues = zodIssues(err);
4830
- if (issues) {
4831
- return {
4832
- status: 422,
4833
- body: githubError("Validation Failed", 422, issues.map((issue) => ({
4834
- resource: "Request",
4835
- field: issue.path.join("."),
4836
- code: issue.code
4837
- })))
4838
- };
4839
- }
4840
- if (err instanceof SyntaxError) {
4841
- return { status: 400, body: githubError("Problems parsing JSON", 400) };
4842
- }
4843
- return {
4844
- status: 500,
4845
- body: githubError(err instanceof Error ? err.message : "Internal Server Error", 500)
4846
- };
4847
- }
4848
5550
  var githubToolImplementations = Object.fromEntries(toolArgumentSchemas.map((def) => [
4849
5551
  def.name,
4850
5552
  {
@@ -0,0 +1,5 @@
1
+ export { UnsupportedTwinError, bootTwin } from './chunk-EJFMWBZE.js';
2
+ export { STRIPE_LOCAL_ACCOUNT_ID } from './chunk-2A5HJP46.js';
3
+ import './chunk-OW7VVW6X.js';
4
+ import './chunk-VBATFCWR.js';
5
+ import './chunk-SG6ZTIMT.js';
@@ -1,5 +1,5 @@
1
- import { bootTwin } from './chunk-YL4FHI3J.js';
2
- import { isTwinName, TWIN_NAMES, defaultPortFor, TWIN_REGISTRY } from './chunk-3OVV6JUQ.js';
1
+ import { bootTwin } from './chunk-EJFMWBZE.js';
2
+ import { isTwinName, TWIN_NAMES, defaultPortFor, TWIN_REGISTRY } from './chunk-2A5HJP46.js';
3
3
  import './chunk-OW7VVW6X.js';
4
4
  import './chunk-VBATFCWR.js';
5
5
  import './chunk-SG6ZTIMT.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pome-sh/cli",
3
- "version": "0.23.39",
3
+ "version": "0.23.40",
4
4
  "description": "Digital-twin testing for AI agents \u2014 run tasks against resettable local or hosted twins and record tool-call traces for evaluation on pome.sh.",
5
5
  "keywords": [
6
6
  "ai",
@@ -1,5 +0,0 @@
1
- export { UnsupportedTwinError, bootTwin } from './chunk-YL4FHI3J.js';
2
- export { STRIPE_LOCAL_ACCOUNT_ID } from './chunk-3OVV6JUQ.js';
3
- import './chunk-OW7VVW6X.js';
4
- import './chunk-VBATFCWR.js';
5
- import './chunk-SG6ZTIMT.js';