SKMTC GraphQL pipeline
Everything in the skmtc-generator skill applies unchanged — same
axioms, same producers, same register/insert machinery, same
ContentSettings. GraphQL differs in exactly four places: the entry
factory, the operation object, enrichment resolution, and how
mutation arguments become a schema. This skill is those differences.
1. The entry factory
Scaffold C variant: GraphQL entry (toGqlOperationEntry)
import { toGqlOperationEntry, synthesizeArgsObject } from '@skmtc/core'
export const MyGqlEntry = toGqlOperationEntry<EnrichmentSchema>({
id: denoJson.name,
// ⬇ Mutations only, gated on a synthesizable args object.
isSupported({ operation }) {
return operation.rootKind === 'mutation' &&
synthesizeArgsObject(operation) !== undefined
},
transform({ context, operation, variant }) {
if (operation.rootKind !== 'mutation') return
context.insertOperation({ projection: MyGen, operation, variant })
},
toEnrichmentSchema
})
GQL-specific notes:
- Enrichments arrive parsed on
settings.enrichments, exactly as for OAS operations and models — read them there; never index the raw umbrella by hand. The subject keys are[id][rootKind][fieldName][variant]. - Mutation args come via
synthesizeArgsObject(operation)— GQL has norequestBody; this turns the field's arguments into an object schema forinsertNormalizedModel.
Background: concepts/the-graphql-pipeline.md.
2. The four GraphQL differences
- Entries come from
toGqlOperationEntry;transformreceivesoperation: GqlOperation(fields:rootKind—'query' | 'mutation'— andfieldName;operation.identifieris<rootKind>_<fieldName>). The companion projection-base factory is the lang package'sto<Lang>GqlOperationProjectionBase. - Enrichments arrive parsed on
settings.enrichments, same as OAS — the base'sstatic toEnrichmentsparses the umbrella withsubjectSegments: [operation.rootKind, operation.fieldName, variant](toGqlOperationProjectionBase.ts). Only the subject keys differ: two nested segments (rootKind,fieldName) where OAS has path+method.operation.identifier(<rootKind>_<fieldName>) is a file-naming/cache key, never an enrichment key. - Mutation args come via
synthesizeArgsObject(operation)— GQL has norequestBody; this turns the field's arguments into an object schema suitable forinsertNormalizedModel. - Routing keys: enrichment routing is
enrichments.<id>.<rootKind>.<fieldName>.<variant>; theGeneratorKeyisid|rootKind|fieldName|variant. Compose withthis.insertOperation(Peer, op, { variant? })exactly as for OAS.
3. Boundary with other skills
- skmtc-generator — everything engine-side; load it first.
- skmtc-lang-typescript / skmtc-lang-kotlin — the target-language layer, exactly as for OAS generators.
- Deep dive:
concepts/the-graphql-pipeline.md; the operation-reference protocol's GraphQL example is inconcepts/cross-generator-coordination.md.