From 7e536051cc77df6a77e809751523042f968924b1 Mon Sep 17 00:00:00 2001 From: Dimitri Mitropoulos Date: Fri, 9 Oct 2026 15:58:38 -0400 Subject: [PATCH 1/2] refactor: remove x-forge-globals Forge no longer reads x-forge-globals or carries the globals operation metadata it populated. Command globalCliArgs is always empty. --- packages/fern-forge/README.md | 4 +--- packages/fern-forge/index.test.ts | 1 - packages/fern-forge/parser.ts | 1 - packages/fern-forge/schemas/operation.ts | 4 +--- packages/forge/init-from-openapi.ts | 4 +--- packages/forge/overlay-source.ts | 4 +--- packages/forge/overlay-types.ts | 1 - 7 files changed, 4 insertions(+), 15 deletions(-) diff --git a/packages/fern-forge/README.md b/packages/fern-forge/README.md index e96a63d24..49f8ba2b4 100644 --- a/packages/fern-forge/README.md +++ b/packages/fern-forge/README.md @@ -242,7 +242,6 @@ Primary operation metadata accepts these fields: | `x-fern-ignore` | Boolean, default `false` | `ignore` | Removes the operation from generated content when true | | `x-forge-hidden` | Boolean, default `false` | `hidden` | Stores approval state and lowers route-collision priority | | `x-forge-internal` | Boolean | `internal` | Stores internal visibility metadata | -| `x-forge-globals` | Argument array | `globals` | Stores shared command arguments | | `x-forge-epilogue` | String | `epilogue` | Stores command or method footer text | | `x-forge-args` | Method argument array | `args` | Stores method argument configuration | | `x-forge-params` | Parameter override map | `params` | Stores overrides by parameter name | @@ -269,8 +268,7 @@ legacy ## Argument metadata reference -`x-forge-globals` contains arguments. `x-forge-args` contains arguments or -argument groups. +`x-forge-args` contains arguments or argument groups. ### Arguments diff --git a/packages/fern-forge/index.test.ts b/packages/fern-forge/index.test.ts index 82fcdc5b1..086c2747d 100644 --- a/packages/fern-forge/index.test.ts +++ b/packages/fern-forge/index.test.ts @@ -44,7 +44,6 @@ test('validates and exposes every known operation-level Forge field', () => { 'x-fern-ignore': false, 'x-forge-hidden': true, 'x-forge-internal': true, - 'x-forge-globals': [{ name: 'account-id', type: 'string', required: true, description: 'Account ID' }], 'x-forge-epilogue': 'Additional guidance.', 'x-forge-args': [{ options: [{ name: 'force', type: 'boolean', required: { default: false } }] }], 'x-forge-params': { diff --git a/packages/fern-forge/parser.ts b/packages/fern-forge/parser.ts index fe04cdb08..14cbaed31 100644 --- a/packages/fern-forge/parser.ts +++ b/packages/fern-forge/parser.ts @@ -31,7 +31,6 @@ function toOperationData(value: ReturnType['_output']): ignore: value['x-fern-ignore'] ?? false, hidden: value['x-forge-hidden'] ?? false, ...(value['x-forge-internal'] !== undefined ? { internal: value['x-forge-internal'] } : {}), - ...(value['x-forge-globals'] !== undefined ? { globals: value['x-forge-globals'] } : {}), ...(value['x-forge-epilogue'] !== undefined ? { epilogue: value['x-forge-epilogue'] } : {}), ...(value['x-forge-args'] !== undefined ? { args: value['x-forge-args'] } : {}), ...(value['x-forge-params'] !== undefined ? { params: value['x-forge-params'] } : {}), diff --git a/packages/fern-forge/schemas/operation.ts b/packages/fern-forge/schemas/operation.ts index 77b669047..9bd6e24ff 100644 --- a/packages/fern-forge/schemas/operation.ts +++ b/packages/fern-forge/schemas/operation.ts @@ -1,5 +1,5 @@ import { z } from 'astro/zod'; -import { argumentSchema, methodArgumentSchema, paramOverrideSchema } from './arguments.ts'; +import { methodArgumentSchema, paramOverrideSchema } from './arguments.ts'; import { nonEmptyStringSchema } from './shared.ts'; /** Availability values accepted by the Forge OpenAPI contract. */ @@ -24,7 +24,6 @@ export const forgeOperationDataSchema = z ignore: z.boolean(), hidden: z.boolean(), internal: z.boolean().optional(), - globals: z.array(argumentSchema).optional(), epilogue: z.string().optional(), args: z.array(methodArgumentSchema).optional(), params: z.record(z.string(), paramOverrideSchema).optional(), @@ -63,7 +62,6 @@ export const operationProjectionFieldsSchema = z.object({ 'x-fern-ignore': z.boolean().optional(), 'x-forge-hidden': z.boolean().optional(), 'x-forge-internal': z.boolean().optional(), - 'x-forge-globals': z.array(argumentSchema).optional(), 'x-forge-epilogue': z.string().optional(), 'x-forge-args': z.array(methodArgumentSchema).optional(), 'x-forge-params': z.record(z.string(), paramOverrideSchema).optional(), diff --git a/packages/forge/init-from-openapi.ts b/packages/forge/init-from-openapi.ts index 9f242c25e..5e7af4074 100644 --- a/packages/forge/init-from-openapi.ts +++ b/packages/forge/init-from-openapi.ts @@ -21,7 +21,6 @@ type OperationMetadata = { status: MethodStatus; ignore: boolean; hidden: boolean; - globals?: Schema.arg[]; epilogue?: string; args?: Schema.methodArg[]; params?: Record; @@ -111,7 +110,6 @@ function parseMetadata(operationId: string, source: Record, ign hidden: source['x-forge-hidden'] === true, }; - if (Array.isArray(source['x-forge-globals'])) metadata.globals = source['x-forge-globals'] as Schema.arg[]; if (typeof source['x-forge-epilogue'] === 'string') metadata.epilogue = source['x-forge-epilogue']; if (Array.isArray(source['x-forge-args'])) metadata.args = source['x-forge-args'] as Schema.methodArg[]; const params = source['x-forge-params']; @@ -233,7 +231,7 @@ function toSchemaCommand( name: commandName, description, methods: [...topLevelMethods, ...toMethodGroups(groups, groupInfo)], - globalCliArgs: items.find((item) => item.globals)?.globals ?? [], + globalCliArgs: [], hideCommand: visible.every((item) => item.hidden), }; } diff --git a/packages/forge/overlay-source.ts b/packages/forge/overlay-source.ts index 2a503eea6..07a958aec 100644 --- a/packages/forge/overlay-source.ts +++ b/packages/forge/overlay-source.ts @@ -60,7 +60,6 @@ type OperationForgeMetadata = { 'x-forge-hidden': boolean; /** Explicitly keep this upstream-internal operation in first-party SDKs. */ 'x-forge-internal'?: boolean; - 'x-forge-globals'?: ExtensionMethods['x-forge-globals']; 'x-forge-epilogue'?: string; 'x-forge-args'?: ExtensionMethods['x-forge-args']; 'x-forge-params'?: ExtensionMethods['x-forge-params']; @@ -275,7 +274,7 @@ function toSchemaCommand( name: commandName, description: command.description, methods: [...topLevelMethods, ...groups], - globalCliArgs: methodMetadata.find((m) => m['x-forge-globals'])?.['x-forge-globals'] ?? [], + globalCliArgs: [], hideCommand: visibleMethods.every((m) => m['x-forge-hidden']), }; } @@ -389,7 +388,6 @@ function buildOperationForgeMetadata(commands: Record): Ma 'x-fern-ignore': method['x-fern-ignore'] ?? false, 'x-forge-hidden': method['x-forge-hidden'] ?? false, }; - if (method['x-forge-globals'] !== undefined) metadata['x-forge-globals'] = method['x-forge-globals']; if (method['x-forge-internal'] !== undefined) metadata['x-forge-internal'] = method['x-forge-internal']; if (method['x-forge-epilogue'] !== undefined) metadata['x-forge-epilogue'] = method['x-forge-epilogue']; if (method['x-forge-args'] !== undefined) metadata['x-forge-args'] = method['x-forge-args']; diff --git a/packages/forge/overlay-types.ts b/packages/forge/overlay-types.ts index 4d26def65..628798779 100644 --- a/packages/forge/overlay-types.ts +++ b/packages/forge/overlay-types.ts @@ -20,7 +20,6 @@ export type ForgeExtensions = { * is fixed, then remove this field from the overlay. */ 'x-forge-internal'?: boolean; - 'x-forge-globals'?: Schema.arg[]; 'x-forge-epilogue'?: string; 'x-forge-args'?: Schema.methodArg[]; 'x-forge-params'?: Record; From 3de5c1cacf3048a60f2586255caeccc9258f95a0 Mon Sep 17 00:00:00 2001 From: Dimitri Mitropoulos Date: Fri, 9 Oct 2026 21:49:03 -0400 Subject: [PATCH 2/2] refactor: remove Schema.command.globalCliArgs x-forge-globals was its only source. --- packages/forge/init-from-openapi.ts | 1 - packages/forge/overlay-source.ts | 1 - packages/forge/schema/schema.ts | 2 -- 3 files changed, 4 deletions(-) diff --git a/packages/forge/init-from-openapi.ts b/packages/forge/init-from-openapi.ts index 5e7af4074..c9a808fd5 100644 --- a/packages/forge/init-from-openapi.ts +++ b/packages/forge/init-from-openapi.ts @@ -231,7 +231,6 @@ function toSchemaCommand( name: commandName, description, methods: [...topLevelMethods, ...toMethodGroups(groups, groupInfo)], - globalCliArgs: [], hideCommand: visible.every((item) => item.hidden), }; } diff --git a/packages/forge/overlay-source.ts b/packages/forge/overlay-source.ts index 07a958aec..e7f687794 100644 --- a/packages/forge/overlay-source.ts +++ b/packages/forge/overlay-source.ts @@ -274,7 +274,6 @@ function toSchemaCommand( name: commandName, description: command.description, methods: [...topLevelMethods, ...groups], - globalCliArgs: [], hideCommand: visibleMethods.every((m) => m['x-forge-hidden']), }; } diff --git a/packages/forge/schema/schema.ts b/packages/forge/schema/schema.ts index f2756afba..d52eb02c0 100644 --- a/packages/forge/schema/schema.ts +++ b/packages/forge/schema/schema.ts @@ -227,8 +227,6 @@ export namespace Schema { description: string; /** Methods in this group */ methods: (method | methodGroup)[]; - /** Global CLI arguments for this command */ - globalCliArgs: arg[]; /** * Whether this command family is hidden by default. *