From greenfield
Parses machine-readable API contracts (OpenAPI/Swagger, GraphQL, Protobuf/gRPC, JSON Schema) to extract endpoints, parameters, and behavioral claims. Activates when contract files are detected in a repository.
How this skill is triggered — by the user, by Claude, or both
Slash command
/greenfield:contract-detectionThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Extract behavioral intelligence from machine-readable API contracts. These are formal, published definitions of system interfaces -- the strongest possible specification source. A contract file is an explicit promise about what the system accepts and returns.
Extract behavioral intelligence from machine-readable API contracts. These are formal, published definitions of system interfaces -- the strongest possible specification source. A contract file is an explicit promise about what the system accepts and returns.
Contract detection activates when:
This mode runs independently of all other intelligence sources. All output is PUBLIC -- machine-readable contracts are published definitions intended for external consumption. Output goes to workspace/public/contracts/.
Machine-readable contracts are unique among intelligence sources because they are:
A single OpenAPI specification can contain more behavioral intelligence than the entire official documentation site, because every endpoint, parameter, response schema, and error code is defined with machine precision.
# Find OpenAPI/Swagger files
find . -maxdepth 5 -type f \( \
-name "openapi.*" -o -name "swagger.*" -o \
-name "api-spec.*" -o -name "api-docs.*" \
\) \( -name "*.json" -o -name "*.yaml" -o -name "*.yml" \) 2>/dev/null
# Check for OpenAPI version markers in YAML/JSON files
grep -rl '"openapi":\|openapi:' --include="*.json" --include="*.yaml" --include="*.yml" . 2>/dev/null | head -20
grep -rl '"swagger":\|swagger:' --include="*.json" --include="*.yaml" --include="*.yml" . 2>/dev/null | head -20
# Check for hosted spec endpoints (common locations)
# /api-docs, /swagger.json, /openapi.json, /v2/api-docs, /v3/api-docs
For each OpenAPI/Swagger specification, extract:
| Field | What It Tells You |
|---|---|
paths | Every endpoint the API exposes |
| HTTP method | The operation type (GET=read, POST=create, PUT=replace, PATCH=update, DELETE=remove) |
operationId | The canonical name for the operation |
summary / description | Behavioral description of what the endpoint does |
tags | Logical grouping of endpoints |
| Field | What It Tells You |
|---|---|
parameters (path, query, header, cookie) | Required inputs and their types |
required | Whether the parameter is mandatory |
schema with enum | Allowed values (behavioral constraint) |
schema with minimum / maximum | Value range (behavioral constraint) |
schema with pattern | Validation regex (behavioral constraint) |
schema with default | Default value when omitted |
| Field | What It Tells You |
|---|---|
requestBody | What the endpoint accepts (content type, schema) |
responses | Every possible response code and its schema |
responses.4xx | Client error conditions and their structure |
responses.5xx | Server error conditions |
components/schemas | Shared data models with field types, constraints, and relationships |
| Field | What It Tells You |
|---|---|
securityDefinitions / components/securitySchemes | Auth methods (API key, OAuth2, Bearer, Basic) |
security (global or per-operation) | Which endpoints require which auth |
Write to workspace/public/contracts/openapi-summary.md:
## API: {title} v{version}
### Endpoints
| Method | Path | Operation | Auth Required | Description |
|--------|------|-----------|---------------|-------------|
| GET | /users | listUsers | Bearer | List all users with pagination |
| POST | /users | createUser | Bearer | Create a new user |
### Data Models
#### User
| Field | Type | Required | Constraints | Description |
|-------|------|----------|-------------|-------------|
| id | string (uuid) | yes | read-only | Unique identifier |
| email | string | yes | format: email | User's email address |
### Error Responses
| Code | Meaning | Schema |
|------|---------|--------|
| 400 | Validation error | { message: string, errors: [{field, code}] } |
| 401 | Unauthorized | { message: string } |
| 404 | Not found | { message: string } |
# Find GraphQL schema files
find . -maxdepth 5 -type f \( \
-name "schema.graphql" -o -name "*.graphqls" -o -name "schema.gql" -o \
-name "*.graphql" \
\) 2>/dev/null
# Find GraphQL codegen config (indicates GraphQL usage)
find . -maxdepth 3 -type f \( \
-name "codegen.*" -o -name ".graphqlrc*" -o -name "apollo.config.*" \
\) 2>/dev/null
# Check for GraphQL in dependencies
grep -l "graphql\|apollo\|@graphql" package.json requirements.txt Gemfile go.mod 2>/dev/null
# Check for introspection endpoint (if running instance available)
# POST /graphql with { "query": "{ __schema { types { name } } }" }
For each GraphQL schema, extract:
| Element | What It Tells You |
|---|---|
| Query type fields | Every read operation the API exposes |
| Arguments | Required and optional parameters with types |
| Return types | Shape of the response data |
Directives (@deprecated, @auth) | Behavioral modifiers |
| Element | What It Tells You |
|---|---|
| Mutation type fields | Every write operation the API exposes |
| Input types | Shape of the data the operation accepts |
| Return types | What the operation returns after modification |
| Error handling patterns | Union types for success/error returns |
| Element | What It Tells You |
|---|---|
| Subscription type fields | Events the client can subscribe to |
| Arguments | Subscription filters |
| Payload types | Shape of the real-time data |
| Element | What It Tells You |
|---|---|
| Object types | Data entities and their fields |
| Enum types | Allowed values for categorical fields |
| Interface types | Shared behavioral contracts across types |
| Union types | Polymorphic response shapes |
| Input types | Structured input shapes for mutations |
| Custom scalars | Domain-specific value types (DateTime, JSON, URL) |
Write to workspace/public/contracts/graphql-summary.md:
## GraphQL Schema
### Queries
| Query | Arguments | Returns | Description |
|-------|-----------|---------|-------------|
| users | filter: UserFilter, page: Int | [User!]! | List users with filtering |
| user | id: ID! | User | Get user by ID |
### Mutations
| Mutation | Input | Returns | Description |
|----------|-------|---------|-------------|
| createUser | input: CreateUserInput! | User! | Create a new user |
| deleteUser | id: ID! | Boolean! | Delete user by ID |
### Subscriptions
| Subscription | Arguments | Payload | Description |
|-------------|-----------|---------|-------------|
| userCreated | — | User! | Fires when a new user is created |
### Types
#### User
| Field | Type | Nullable | Description |
|-------|------|----------|-------------|
| id | ID | no | Unique identifier |
| email | String | no | Email address |
| role | UserRole | no | Enum: ADMIN, USER, VIEWER |
# Find .proto files
find . -maxdepth 5 -type f -name "*.proto" 2>/dev/null
# Check for gRPC in dependencies
grep -l "grpc\|protobuf" package.json requirements.txt Gemfile go.mod Cargo.toml 2>/dev/null
# Find generated gRPC code
find . -maxdepth 5 -type f \( -name "*_grpc.pb.go" -o -name "*_pb2_grpc.py" -o -name "*_grpc.rb" \) 2>/dev/null
For each .proto file, extract:
| Element | What It Tells You |
|---|---|
service definitions | Logical groupings of RPC methods |
rpc methods | Every callable operation |
| Request/response types | Input and output shapes |
| Streaming modifiers | stream on request, response, or both |
| Element | What It Tells You |
|---|---|
message definitions | Data structures used in requests and responses |
| Field types and numbers | Schema with wire-format compatibility rules |
repeated fields | Array/list fields |
oneof fields | Union types (exactly one field set) |
optional / required | Field presence requirements |
map fields | Key-value pair fields |
| Element | What It Tells You |
|---|---|
enum definitions | Allowed categorical values |
option allow_alias | Whether multiple names map to the same value |
| Element | What It Tells You |
|---|---|
option java_package | Target language packaging |
option go_package | Go module path |
| Custom options | Domain-specific metadata |
Write to workspace/public/contracts/protobuf-summary.md:
## Protobuf/gRPC Services
### Service: UserService
| RPC | Request | Response | Streaming | Description |
|-----|---------|----------|-----------|-------------|
| GetUser | GetUserRequest | User | none | Get user by ID |
| ListUsers | ListUsersRequest | ListUsersResponse | none | List users with pagination |
| WatchUsers | WatchUsersRequest | User | server-stream | Stream user updates |
### Messages
#### User
| Field | Number | Type | Label | Description |
|-------|--------|------|-------|-------------|
| id | 1 | string | — | Unique identifier |
| email | 2 | string | — | Email address |
| role | 3 | UserRole | — | User role |
### Enums
#### UserRole
| Name | Number |
|------|--------|
| USER_ROLE_UNSPECIFIED | 0 |
| USER_ROLE_ADMIN | 1 |
| USER_ROLE_USER | 2 |
# Find JSON Schema files
find . -maxdepth 5 -type f -name "*.schema.json" 2>/dev/null
find . -maxdepth 5 -type f -name "*.json" -exec grep -l '"$schema"' {} \; 2>/dev/null | head -20
# Check for JSON Schema in config files
grep -rl '"$schema":\|"\$ref"' --include="*.json" . 2>/dev/null | head -20
# Find JSON Schema in OpenAPI components (already covered above, but note cross-reference)
For each JSON Schema, extract:
| Element | What It Tells You |
|---|---|
type | The data type (object, array, string, number, boolean, null) |
properties | Named fields with their own schemas |
required | Fields that must be present |
additionalProperties | Whether unknown fields are allowed |
| Element | What It Tells You |
|---|---|
minLength / maxLength | String length constraints |
minimum / maximum | Numeric range constraints |
pattern | Regex validation for strings |
format | Semantic format (email, uri, date-time, uuid) |
enum | Allowed values |
const | Fixed required value |
minItems / maxItems | Array length constraints |
uniqueItems | Whether array elements must be unique |
| Element | What It Tells You |
|---|---|
$ref | References to shared schema definitions |
allOf | Schema intersection (all must match) |
anyOf | Schema union (at least one must match) |
oneOf | Schema exclusive union (exactly one must match) |
not | Schema negation |
if / then / else | Conditional validation |
| Element | What It Tells You |
|---|---|
default | Default value when field is omitted |
examples | Example values (behavioral documentation) |
description | Human-readable behavioral description |
Write to workspace/public/contracts/json-schema-summary.md:
## JSON Schema: {title}
### Type: CreateUserRequest
| Property | Type | Required | Constraints | Default | Description |
|----------|------|----------|-------------|---------|-------------|
| email | string | yes | format: email | — | User email address |
| name | string | yes | minLength: 1, maxLength: 100 | — | Display name |
| role | string | no | enum: [admin, user, viewer] | "user" | User role |
| tags | array of string | no | maxItems: 10, uniqueItems: true | [] | User tags |
### Validation Rules
- `email` must match email format (RFC 5322)
- `name` must be 1-100 characters
- `role` defaults to "user" when omitted
- `tags` must contain unique strings, maximum 10
When multiple contract types are present (e.g., both OpenAPI and GraphQL, or OpenAPI with JSON Schema references), correlate them:
Document correlations and discrepancies in workspace/public/contracts/cross-contract-notes.md.
All claims from contract detection use source=machine-readable-contract:
- The /users endpoint accepts a `role` query parameter with values: admin, user, viewer
<!-- cite: source=machine-readable-contract, ref=openapi.yaml:/paths/~1users/get/parameters/0, confidence=confirmed, agent=contract-detector -->
Every behavioral claim gets an inline citation immediately after the claim. The ref field should be <file-path>:<json-path-or-line>.
workspace/public/contracts/
openapi-summary.md # OpenAPI/Swagger extraction
graphql-summary.md # GraphQL schema extraction
protobuf-summary.md # Protobuf/gRPC extraction
json-schema-summary.md # JSON Schema extraction
cross-contract-notes.md # Correlations and discrepancies across contract types
raw/ # Copies of discovered contract files for reference
openapi.yaml
schema.graphql
service.proto
config.schema.json
Note: Output goes to workspace/public/contracts/ -- not workspace/raw/. Machine-readable contracts are published definitions intended for external consumption. They contain no proprietary implementation details.
workspace/public/, not workspace/raw/.workspace/public/contracts/raw/ for downstream reference.<!-- cite: --> comment immediately after the claim. Never defer citation to a later step.2plugins reuse this skill
First indexed Jul 8, 2026
npx claudepluginhub earchibald/prime-radiant-marketplace --plugin greenfieldGenerates OpenAPI 3.1 contracts with JSON schemas, RFC 9457 error responses, versioning, and examples from API entities, PRDs, or database schemas.
Validates OpenAPI, JSON Schema, and GraphQL API specs with linting, structural analysis, completeness checks, breaking change detection, and consistency enforcement. Generates reports.
Generates OpenAPI 3.0/3.1 specs and Pact consumer contracts from API code, designs, or schemas for documentation, testing, and code gen.