@shortlink-org/portolan 0.3.0 → 0.4.0
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/README.md +151 -6
- package/catalog/model.go +147 -0
- package/catalog/roundtrip_test.go +7 -0
- package/cli/portolan.mjs +6 -1
- package/go.mod +7 -0
- package/go.sum +20 -6
- package/package.json +10 -9
- package/plugin/describe.go +38 -0
- package/plugins/README.md +296 -5
- package/plugins/extract-argocd/options.schema.json +44 -0
- package/plugins/extract-celery/main.py +1 -0
- package/plugins/extract-csharp-ddd/README.md +213 -0
- package/plugins/extract-csharp-ddd/options.schema.json +55 -0
- package/plugins/extract-django/README.md +13 -2
- package/plugins/extract-django/choices.py +47 -0
- package/plugins/extract-django/domain.py +2 -1
- package/plugins/extract-django/extract_test.py +13 -0
- package/plugins/extract-django/lifecycle.py +2 -28
- package/plugins/extract-django/main.py +1 -0
- package/plugins/extract-django/rules.py +154 -0
- package/plugins/extract-django/rules_test.py +158 -0
- package/plugins/extract-go-sqs/options.schema.json +21 -0
- package/plugins/extract-http-clients/describe.go +5 -4
- package/plugins/extract-java/build/org/portolan/extract/Main.class +0 -0
- package/plugins/extract-k8s/options.schema.json +32 -0
- package/plugins/extract-laravel/Cargo.lock +962 -0
- package/plugins/extract-laravel/Cargo.toml +20 -0
- package/plugins/extract-laravel/README.md +200 -0
- package/plugins/extract-laravel/options.schema.json +68 -0
- package/plugins/extract-laravel/rustfmt.toml +1 -0
- package/plugins/extract-php-ddd/Cargo.lock +972 -0
- package/plugins/extract-php-ddd/Cargo.toml +22 -0
- package/plugins/extract-php-ddd/README.md +141 -0
- package/plugins/extract-php-ddd/options.schema.json +50 -0
- package/plugins/extract-php-ddd/rustfmt.toml +1 -0
- package/plugins/extract-python-kafka/main.py +1 -0
- package/plugins/extract-terraform/options.schema.json +26 -0
- package/plugins/extract-ts/main.ts +1 -0
- package/plugins/phpscan/Cargo.lock +953 -0
- package/plugins/phpscan/Cargo.toml +19 -0
- package/plugins/phpscan/rustfmt.toml +1 -0
- package/plugins/portolan-go.wasm +0 -0
- package/plugins/pyplugin/catalog.py +24 -1
- package/plugins/verify-otel/options.schema.json +12 -0
- package/portolan.json +130 -3
- package/rules/builtin.json +218 -0
- package/schema/portolan.schema.json +880 -13
- package/scripts/README.md +3 -1
- package/scripts/delivery-presets.mjs +36 -3
- package/scripts/gen-likec4.mjs +149 -16
- package/scripts/gen-likec4.test.mjs +96 -0
- package/scripts/gen.mjs +30 -3
- package/scripts/gitops-example.test.mjs +108 -0
- package/scripts/host-plugins/fetch-argocd.mjs +338 -0
- package/scripts/host-plugins/fetch-argocd.options.json +49 -0
- package/scripts/host-plugins/fetch-argocd.test.mjs +274 -0
- package/scripts/host-plugins/fetch-bsr.mjs +1 -0
- package/scripts/host-plugins/fetch-csr.mjs +1 -0
- package/scripts/host-plugins/fetch-git.mjs +1 -0
- package/scripts/host-plugins/fetch-k8s.mjs +263 -0
- package/scripts/host-plugins/fetch-k8s.options.json +50 -0
- package/scripts/host-plugins/fetch-k8s.test.mjs +259 -0
- package/scripts/host-plugins/k8s-topology.mjs +183 -0
- package/scripts/json-format.mjs +192 -0
- package/scripts/json-format.test.mjs +97 -0
- package/scripts/local-api.mjs +216 -8
- package/scripts/local-api.test.mjs +88 -2
- package/scripts/local-discovery.mjs +12 -0
- package/scripts/manifest.mjs +10 -1
- package/scripts/plugin-host.mjs +23 -1
- package/scripts/plugins-fresh.mjs +97 -0
- package/scripts/plugins-fresh.test.mjs +64 -0
- package/scripts/run-builtin.mjs +26 -5
- package/scripts/schema.mjs +138 -19
- package/scripts/trace-trials.mjs +176 -0
- package/scripts/trace-trials.test.mjs +142 -0
- package/scripts/warning-policy.mjs +12 -6
- package/scripts/warning-policy.test.mjs +40 -3
- package/src/app/Breadcrumbs.test.ts +3 -0
- package/src/app/Breadcrumbs.tsx +3 -0
- package/src/app/CatalogApp.tsx +2 -0
- package/src/app/SidebarFooter.tsx +20 -4
- package/src/catalog-index.ts +25 -0
- package/src/catalog-model.ts +246 -1
- package/src/catalog-validation.ts +104 -2
- package/src/catalog.test.ts +40 -1
- package/src/components/ChannelRows.test.tsx +76 -1
- package/src/components/ChannelRows.tsx +223 -60
- package/src/components/DeploymentRows.tsx +131 -0
- package/src/components/DocsLinks.test.tsx +27 -0
- package/src/components/DocsLinks.tsx +56 -0
- package/src/components/FieldTree.tsx +5 -2
- package/src/components/HTTPDestinationEvidence.tsx +1 -1
- package/src/components/PluginIcon.tsx +77 -0
- package/src/components/ProblemRow.tsx +173 -153
- package/src/components/RuleMarks.tsx +22 -0
- package/src/components/ShapeRows.tsx +24 -20
- package/src/data.ts +21 -0
- package/src/enrich.test.ts +127 -3
- package/src/enrich.ts +104 -6
- package/src/er/ErCanvas.tsx +218 -12
- package/src/er/GroupNode.tsx +57 -0
- package/src/er/StoreHeader.tsx +1 -0
- package/src/er/layout.test.ts +85 -2
- package/src/er/layout.ts +140 -5
- package/src/er/spec.test.ts +17 -0
- package/src/er/spec.ts +23 -10
- package/src/flow/Recordings.test.tsx +52 -0
- package/src/flow/Recordings.tsx +236 -0
- package/src/flow/StepDetail.tsx +53 -0
- package/src/flow/TraceTrial.tsx +419 -0
- package/src/flow/examples.test.ts +33 -0
- package/src/flow/examples.ts +37 -0
- package/src/flow/outline.test.ts +28 -0
- package/src/flow/outline.ts +7 -2
- package/src/flow/trace-trial-resume.test.ts +42 -0
- package/src/flow/trace-trial-resume.ts +74 -0
- package/src/graph/elk.ts +78 -0
- package/src/index.css +24 -0
- package/src/landing/LandingPage.tsx +15 -11
- package/src/landing/ProductTour.tsx +6 -6
- package/src/lib/all-problems.ts +27 -17
- package/src/lib/centrality.test.ts +251 -0
- package/src/lib/centrality.ts +232 -0
- package/src/lib/confluence.test.ts +37 -0
- package/src/lib/confluence.ts +41 -0
- package/src/lib/context-color.ts +1 -1
- package/src/lib/deployment-drift.ts +22 -0
- package/src/lib/derive.ts +43 -69
- package/src/lib/environments.test.ts +83 -0
- package/src/lib/environments.ts +57 -0
- package/src/lib/integration-url.test.ts +30 -0
- package/src/lib/integration-url.ts +63 -0
- package/src/lib/kafka-ui.ts +3 -45
- package/src/lib/local-api.ts +96 -2
- package/src/lib/notion.ts +13 -0
- package/src/lib/plugin-index.json +2765 -0
- package/src/lib/plugins.test.ts +68 -0
- package/src/lib/plugins.ts +264 -0
- package/src/lib/problem-flows.test.ts +61 -0
- package/src/lib/problem-flows.ts +78 -0
- package/src/lib/problem-rules-cel.d.mts +43 -0
- package/src/lib/problem-rules-cel.mjs +407 -0
- package/src/lib/problem-rules.test.ts +287 -0
- package/src/lib/problem-rules.ts +271 -0
- package/src/lib/problem-subjects.ts +737 -0
- package/src/lib/rule-entries.ts +39 -0
- package/src/lib/{data-problems.test.ts → rules-data.test.ts} +18 -16
- package/src/lib/rules-deploy.test.ts +133 -0
- package/src/lib/{problems.test.ts → rules-edges.test.ts} +8 -3
- package/src/lib/{proto-problems.test.ts → rules-proto.test.ts} +9 -25
- package/src/lib/{wire-problems.test.ts → rules-wire.test.ts} +13 -11
- package/src/lib/rules.test.ts +51 -0
- package/src/lib/rules.ts +86 -0
- package/src/lib/shape.test.ts +32 -0
- package/src/lib/shape.ts +30 -6
- package/src/lib/tech.ts +16 -0
- package/src/lib/trace-project.test.ts +34 -0
- package/src/lib/trace-project.ts +50 -0
- package/src/lib/use-problems.ts +23 -0
- package/src/lib/warnings.test.ts +9 -0
- package/src/lib/warnings.ts +10 -10
- package/src/likec4/ids.test.ts +6 -2
- package/src/likec4/ids.ts +43 -0
- package/src/main.tsx +23 -0
- package/src/merge-deployments.test.ts +127 -0
- package/src/merge.test.ts +82 -0
- package/src/merge.ts +173 -9
- package/src/pages/AggregatePage.tsx +57 -7
- package/src/pages/ContextMap.tsx +45 -3
- package/src/pages/ContextPage.tsx +2 -0
- package/src/pages/EventPage.tsx +15 -5
- package/src/pages/FlowDetail.tsx +23 -2
- package/src/pages/GraphPage.tsx +40 -3
- package/src/pages/Overview.tsx +152 -12
- package/src/pages/PluginIndex.tsx +190 -0
- package/src/pages/Problems.tsx +396 -128
- package/src/pages/ServicePage.tsx +58 -2
- package/src/pages/Settings.tsx +28 -2
- package/src/pages/settings/AboutSettings.tsx +8 -1
- package/src/pages/settings/IntegrationsSettings.tsx +63 -17
- package/src/pages/settings/RecordingSettings.tsx +138 -0
- package/src/pages/settings/RulesSettings.tsx +825 -0
- package/src/routes.test.ts +9 -0
- package/src/routes.ts +22 -1
- package/src/lib/data-problems.ts +0 -314
- package/src/lib/proto-problems.ts +0 -237
- package/src/lib/wire-problems.ts +0 -342
|
@@ -0,0 +1,2765 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"name": "project",
|
|
4
|
+
"plugin": "extract-project",
|
|
5
|
+
"summary": "Reads repository metadata and describes a group and component without assuming DDD or a particular language.",
|
|
6
|
+
"category": "repository",
|
|
7
|
+
"phases": [
|
|
8
|
+
"extract"
|
|
9
|
+
],
|
|
10
|
+
"runtime": "wasm",
|
|
11
|
+
"source": "plugins/extract-project",
|
|
12
|
+
"options": {
|
|
13
|
+
"type": "object",
|
|
14
|
+
"additionalProperties": false,
|
|
15
|
+
"properties": {
|
|
16
|
+
"group": {
|
|
17
|
+
"type": "string",
|
|
18
|
+
"description": "Slug of the neutral top-level group. Defaults to the input directory name."
|
|
19
|
+
},
|
|
20
|
+
"groupName": {
|
|
21
|
+
"type": "string",
|
|
22
|
+
"description": "Human-readable group name. Defaults to the group slug, titled."
|
|
23
|
+
},
|
|
24
|
+
"groupSummary": {
|
|
25
|
+
"type": "string",
|
|
26
|
+
"description": "A short statement of what the group is responsible for."
|
|
27
|
+
},
|
|
28
|
+
"groupKind": {
|
|
29
|
+
"enum": [
|
|
30
|
+
"bounded-context",
|
|
31
|
+
"system",
|
|
32
|
+
"product",
|
|
33
|
+
"team",
|
|
34
|
+
"namespace"
|
|
35
|
+
],
|
|
36
|
+
"description": "Semantic role of the top-level group. Defaults to system for this neutral extractor."
|
|
37
|
+
},
|
|
38
|
+
"classification": {
|
|
39
|
+
"enum": [
|
|
40
|
+
"core",
|
|
41
|
+
"supporting",
|
|
42
|
+
"generic"
|
|
43
|
+
],
|
|
44
|
+
"description": "DDD classification of a bounded context when the group represents one."
|
|
45
|
+
},
|
|
46
|
+
"component": {
|
|
47
|
+
"type": "string",
|
|
48
|
+
"description": "Slug of the component. Defaults to the input directory name."
|
|
49
|
+
},
|
|
50
|
+
"componentName": {
|
|
51
|
+
"type": "string",
|
|
52
|
+
"description": "Human-readable component name. Defaults to the README title and then the slug, titled."
|
|
53
|
+
},
|
|
54
|
+
"componentKind": {
|
|
55
|
+
"enum": [
|
|
56
|
+
"service",
|
|
57
|
+
"application",
|
|
58
|
+
"webapp",
|
|
59
|
+
"worker",
|
|
60
|
+
"job",
|
|
61
|
+
"function",
|
|
62
|
+
"cli",
|
|
63
|
+
"library",
|
|
64
|
+
"data-pipeline"
|
|
65
|
+
],
|
|
66
|
+
"description": "Runtime or code role. When absent, the extractor uses conservative repository evidence."
|
|
67
|
+
},
|
|
68
|
+
"technologies": {
|
|
69
|
+
"type": "array",
|
|
70
|
+
"items": {
|
|
71
|
+
"type": "string"
|
|
72
|
+
},
|
|
73
|
+
"description": "Languages and frameworks, stated when the tree cannot say: a component whose manifests sit above its root, one of several in a repository, has nothing at its root to read. Left out, inferred from go.mod, package.json, Cargo.toml and the like at the root."
|
|
74
|
+
},
|
|
75
|
+
"repo": {
|
|
76
|
+
"type": "string",
|
|
77
|
+
"description": "Source repository identity. Defaults to a Go module, package.json repository, Cargo package, or Maven coordinates when present."
|
|
78
|
+
},
|
|
79
|
+
"components": {
|
|
80
|
+
"type": "array",
|
|
81
|
+
"minItems": 1,
|
|
82
|
+
"items": {
|
|
83
|
+
"type": "object",
|
|
84
|
+
"additionalProperties": false,
|
|
85
|
+
"required": [
|
|
86
|
+
"slug"
|
|
87
|
+
],
|
|
88
|
+
"properties": {
|
|
89
|
+
"slug": {
|
|
90
|
+
"type": "string",
|
|
91
|
+
"minLength": 1
|
|
92
|
+
},
|
|
93
|
+
"name": {
|
|
94
|
+
"type": "string",
|
|
95
|
+
"minLength": 1
|
|
96
|
+
},
|
|
97
|
+
"kind": {
|
|
98
|
+
"enum": [
|
|
99
|
+
"service",
|
|
100
|
+
"application",
|
|
101
|
+
"webapp",
|
|
102
|
+
"worker",
|
|
103
|
+
"job",
|
|
104
|
+
"function",
|
|
105
|
+
"cli",
|
|
106
|
+
"library",
|
|
107
|
+
"data-pipeline"
|
|
108
|
+
]
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
"description": "Independently deployable runtime components found inside one repository. When present, the singular component fields are ignored."
|
|
113
|
+
},
|
|
114
|
+
"out": {
|
|
115
|
+
"type": "string",
|
|
116
|
+
"description": "Name of the fragment file inside the step output directory.",
|
|
117
|
+
"default": "project.json"
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
"name": "commands",
|
|
124
|
+
"plugin": "extract-commands",
|
|
125
|
+
"summary": "Reads the make targets, npm scripts, just recipes and task-runner tasks a repository declares onto its service.",
|
|
126
|
+
"category": "repository",
|
|
127
|
+
"phases": [
|
|
128
|
+
"extract"
|
|
129
|
+
],
|
|
130
|
+
"runtime": "wasm",
|
|
131
|
+
"source": "plugins/extract-commands",
|
|
132
|
+
"options": {
|
|
133
|
+
"type": "object",
|
|
134
|
+
"additionalProperties": false,
|
|
135
|
+
"properties": {
|
|
136
|
+
"context": {
|
|
137
|
+
"type": "string",
|
|
138
|
+
"description": "Slug of the bounded context the service is in. Left out, the name of the input directory's parent, which is right for shop/cart and wrong for a repository of its own.",
|
|
139
|
+
"examples": [
|
|
140
|
+
"auth",
|
|
141
|
+
"shop"
|
|
142
|
+
]
|
|
143
|
+
},
|
|
144
|
+
"service": {
|
|
145
|
+
"type": "string",
|
|
146
|
+
"description": "Slug of the service the commands belong to. Left out, the name of the input directory.",
|
|
147
|
+
"examples": [
|
|
148
|
+
"cart",
|
|
149
|
+
"pricing"
|
|
150
|
+
]
|
|
151
|
+
},
|
|
152
|
+
"out": {
|
|
153
|
+
"type": "string",
|
|
154
|
+
"description": "Name of the fragment file, inside the step's output directory. Left out, commands.json."
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
"name": "go-domain",
|
|
161
|
+
"plugin": "extract-go",
|
|
162
|
+
"summary": "Reads Go source with go/parser: domain aggregates, events and use cases, plus registered HTTP execution flows in conventional services.",
|
|
163
|
+
"category": "code",
|
|
164
|
+
"phases": [
|
|
165
|
+
"extract"
|
|
166
|
+
],
|
|
167
|
+
"runtime": "wasm",
|
|
168
|
+
"source": "plugins/extract-go",
|
|
169
|
+
"options": {
|
|
170
|
+
"type": "object",
|
|
171
|
+
"additionalProperties": false,
|
|
172
|
+
"properties": {
|
|
173
|
+
"context": {
|
|
174
|
+
"type": "string",
|
|
175
|
+
"description": "Slug of the bounded context this service belongs to. A Go module knows its import path, not which context owns it. Defaults to the name of the input directory.",
|
|
176
|
+
"examples": [
|
|
177
|
+
"auth",
|
|
178
|
+
"shop"
|
|
179
|
+
]
|
|
180
|
+
},
|
|
181
|
+
"contextName": {
|
|
182
|
+
"type": "string",
|
|
183
|
+
"description": "What the context is called on the page. Defaults to the slug, titled.",
|
|
184
|
+
"examples": [
|
|
185
|
+
"Authentication"
|
|
186
|
+
]
|
|
187
|
+
},
|
|
188
|
+
"contextSummary": {
|
|
189
|
+
"type": "string",
|
|
190
|
+
"description": "A sentence or two on what the context is responsible for. Read on the context page and nowhere else."
|
|
191
|
+
},
|
|
192
|
+
"classification": {
|
|
193
|
+
"enum": [
|
|
194
|
+
"core",
|
|
195
|
+
"supporting",
|
|
196
|
+
"generic"
|
|
197
|
+
],
|
|
198
|
+
"description": "Whether the context is core to the business, supports it, or is generic and could be bought."
|
|
199
|
+
},
|
|
200
|
+
"service": {
|
|
201
|
+
"type": "string",
|
|
202
|
+
"description": "Slug of the service. Defaults to the name of the input directory.",
|
|
203
|
+
"examples": [
|
|
204
|
+
"auth"
|
|
205
|
+
]
|
|
206
|
+
},
|
|
207
|
+
"serviceName": {
|
|
208
|
+
"type": "string",
|
|
209
|
+
"description": "What the service is called on the page. Defaults to the title of its README, and failing that to the slug, titled."
|
|
210
|
+
},
|
|
211
|
+
"scope": {
|
|
212
|
+
"type": "string",
|
|
213
|
+
"description": "Deployable name in a shared Go module. Limits owned source to internal/<scope> while allowing calls to imported application packages to be followed.",
|
|
214
|
+
"examples": [
|
|
215
|
+
"api",
|
|
216
|
+
"billing"
|
|
217
|
+
]
|
|
218
|
+
},
|
|
219
|
+
"repo": {
|
|
220
|
+
"type": "string",
|
|
221
|
+
"description": "Where the source lives. Defaults to the module path in go.mod.",
|
|
222
|
+
"examples": [
|
|
223
|
+
"github.com/shortlink-org/portolan"
|
|
224
|
+
]
|
|
225
|
+
},
|
|
226
|
+
"store": {
|
|
227
|
+
"type": "string",
|
|
228
|
+
"description": "Slug of the database this service keeps its state in, the same one the sql extractor is given. It is here for the flows: a call on a repository lands somewhere, and only the manifest knows where.",
|
|
229
|
+
"examples": [
|
|
230
|
+
"pg"
|
|
231
|
+
]
|
|
232
|
+
},
|
|
233
|
+
"peers": {
|
|
234
|
+
"type": "object",
|
|
235
|
+
"additionalProperties": {
|
|
236
|
+
"type": "string"
|
|
237
|
+
},
|
|
238
|
+
"description": "Which service answers for what this one calls, as the callee's package to its service id: a proto package for a gRPC client, the api id (the document's title and major version, `auth.v1`) for a generated HTTP client. The generated client names the package and the operation; only the manifest knows whose it is. A package with no line here is called as unknown and its steps stay unresolved.",
|
|
239
|
+
"examples": [
|
|
240
|
+
{
|
|
241
|
+
"risk.v1": "shop.risk",
|
|
242
|
+
"auth.v1": "auth.auth"
|
|
243
|
+
}
|
|
244
|
+
]
|
|
245
|
+
},
|
|
246
|
+
"externals": {
|
|
247
|
+
"type": "object",
|
|
248
|
+
"additionalProperties": {
|
|
249
|
+
"type": "string"
|
|
250
|
+
},
|
|
251
|
+
"description": "Which system outside the estate answers to an api this service calls, as the api id to the external's bare id. Left out, a generated HTTP client whose package no peers line claims is read as calling the system its vendored document is titled after: a document titled \"Stripe API\" makes the external stripe.",
|
|
252
|
+
"examples": [
|
|
253
|
+
{
|
|
254
|
+
"stripe.v1": "stripe"
|
|
255
|
+
}
|
|
256
|
+
]
|
|
257
|
+
},
|
|
258
|
+
"events": {
|
|
259
|
+
"type": "object",
|
|
260
|
+
"additionalProperties": {
|
|
261
|
+
"type": "string"
|
|
262
|
+
},
|
|
263
|
+
"description": "Which aggregate another service's events belong to, as the import path a policy reads them from to the aggregate id, so a policy reacting to a foreign event resolves.",
|
|
264
|
+
"examples": [
|
|
265
|
+
{
|
|
266
|
+
"github.com/acme/shop/pricing/internal/infrastructure/cart": "shop.cart.basket"
|
|
267
|
+
}
|
|
268
|
+
]
|
|
269
|
+
},
|
|
270
|
+
"out": {
|
|
271
|
+
"type": "string",
|
|
272
|
+
"description": "Name of the fragment file, inside the step's output directory. One extractor writes one file, so that a fragment carries the provenance of the run that produced it.",
|
|
273
|
+
"default": "domain.json"
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
},
|
|
278
|
+
{
|
|
279
|
+
"name": "ts-domain",
|
|
280
|
+
"plugin": "extract-ts",
|
|
281
|
+
"summary": "Reads a TypeScript service by its layout - aggregates, events, use cases, endpoints, policies, clients - into a catalog fragment.",
|
|
282
|
+
"category": "code",
|
|
283
|
+
"phases": [
|
|
284
|
+
"extract"
|
|
285
|
+
],
|
|
286
|
+
"runtime": "process",
|
|
287
|
+
"toolchain": "node",
|
|
288
|
+
"source": "plugins/extract-ts",
|
|
289
|
+
"options": {
|
|
290
|
+
"type": "object",
|
|
291
|
+
"additionalProperties": false,
|
|
292
|
+
"properties": {
|
|
293
|
+
"context": {
|
|
294
|
+
"type": "string",
|
|
295
|
+
"description": "Slug of the bounded context this service belongs to. Defaults to the name of the input directory.",
|
|
296
|
+
"examples": [
|
|
297
|
+
"shop"
|
|
298
|
+
]
|
|
299
|
+
},
|
|
300
|
+
"contextName": {
|
|
301
|
+
"type": "string",
|
|
302
|
+
"description": "What the context is called on the page. Defaults to the slug, titled."
|
|
303
|
+
},
|
|
304
|
+
"contextSummary": {
|
|
305
|
+
"type": "string",
|
|
306
|
+
"description": "A sentence or two on what the context is responsible for."
|
|
307
|
+
},
|
|
308
|
+
"classification": {
|
|
309
|
+
"enum": [
|
|
310
|
+
"core",
|
|
311
|
+
"supporting",
|
|
312
|
+
"generic"
|
|
313
|
+
],
|
|
314
|
+
"description": "Whether the context is core to the business, supports it, or is generic and could be bought."
|
|
315
|
+
},
|
|
316
|
+
"service": {
|
|
317
|
+
"type": "string",
|
|
318
|
+
"description": "Slug of the service. Defaults to the name of the input directory.",
|
|
319
|
+
"examples": [
|
|
320
|
+
"cart"
|
|
321
|
+
]
|
|
322
|
+
},
|
|
323
|
+
"serviceName": {
|
|
324
|
+
"type": "string",
|
|
325
|
+
"description": "What the service is called on the page. Defaults to the title of its README, and failing that to the slug, titled."
|
|
326
|
+
},
|
|
327
|
+
"repo": {
|
|
328
|
+
"type": "string",
|
|
329
|
+
"description": "Where the source lives. Defaults to the repository field of package.json.",
|
|
330
|
+
"examples": [
|
|
331
|
+
"github.com/shortlink-org/portolan"
|
|
332
|
+
]
|
|
333
|
+
},
|
|
334
|
+
"store": {
|
|
335
|
+
"type": "string",
|
|
336
|
+
"description": "Slug of the database this service keeps its state in, the same one the sql extractor is given. It is here for the flows: a call on a repository lands somewhere, and only the manifest knows where.",
|
|
337
|
+
"examples": [
|
|
338
|
+
"pg"
|
|
339
|
+
]
|
|
340
|
+
},
|
|
341
|
+
"peers": {
|
|
342
|
+
"type": "object",
|
|
343
|
+
"additionalProperties": {
|
|
344
|
+
"type": "string"
|
|
345
|
+
},
|
|
346
|
+
"description": "Which service answers for what this one calls, as the callee's package to its service id: the api id for an HTTP peer, the proto package for a gRPC one. A package with no line here is called as unknown and its steps stay unresolved.",
|
|
347
|
+
"examples": [
|
|
348
|
+
{
|
|
349
|
+
"auth.v1": "auth.auth",
|
|
350
|
+
"shop.v1": "shop.pricing"
|
|
351
|
+
}
|
|
352
|
+
]
|
|
353
|
+
},
|
|
354
|
+
"events": {
|
|
355
|
+
"type": "object",
|
|
356
|
+
"additionalProperties": {
|
|
357
|
+
"type": "string"
|
|
358
|
+
},
|
|
359
|
+
"description": "Which aggregate another service's events belong to, as the import specifier a policy reads them from to the aggregate id, so a policy reacting to a foreign event resolves.",
|
|
360
|
+
"examples": [
|
|
361
|
+
{
|
|
362
|
+
"@acme/payments-events": "payments.ledger.payment"
|
|
363
|
+
}
|
|
364
|
+
]
|
|
365
|
+
},
|
|
366
|
+
"source": {
|
|
367
|
+
"type": "string",
|
|
368
|
+
"description": "The directory the layout starts in, relative to the input root.",
|
|
369
|
+
"default": "src"
|
|
370
|
+
},
|
|
371
|
+
"out": {
|
|
372
|
+
"type": "string",
|
|
373
|
+
"description": "Name of the fragment file, inside the step's output directory.",
|
|
374
|
+
"default": "domain.json"
|
|
375
|
+
},
|
|
376
|
+
"graphql": {
|
|
377
|
+
"type": "string",
|
|
378
|
+
"description": "Where the GraphQL schema is, relative to the input root, for a service whose way in is a graph: its resolvers are read as endpoints, and no domain is expected under src/domain.",
|
|
379
|
+
"examples": [
|
|
380
|
+
"src/schema"
|
|
381
|
+
]
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
},
|
|
386
|
+
{
|
|
387
|
+
"name": "rust-domain",
|
|
388
|
+
"plugin": "extract-rust",
|
|
389
|
+
"summary": "Reads a Rust service by its layout - aggregates, events, use cases, gRPC endpoints, policies, clients - into a catalog fragment.",
|
|
390
|
+
"category": "code",
|
|
391
|
+
"phases": [
|
|
392
|
+
"extract"
|
|
393
|
+
],
|
|
394
|
+
"runtime": "process",
|
|
395
|
+
"toolchain": "cargo",
|
|
396
|
+
"source": "plugins/extract-rust",
|
|
397
|
+
"options": {
|
|
398
|
+
"type": "object",
|
|
399
|
+
"additionalProperties": false,
|
|
400
|
+
"properties": {
|
|
401
|
+
"context": {
|
|
402
|
+
"type": "string",
|
|
403
|
+
"description": "Slug of the bounded context this service belongs to. A crate knows its name, not which context owns it. Defaults to the name of the input directory.",
|
|
404
|
+
"examples": [
|
|
405
|
+
"shop"
|
|
406
|
+
]
|
|
407
|
+
},
|
|
408
|
+
"contextName": {
|
|
409
|
+
"type": "string",
|
|
410
|
+
"description": "What the context is called on the page. Defaults to the slug, titled.",
|
|
411
|
+
"examples": [
|
|
412
|
+
"Shop"
|
|
413
|
+
]
|
|
414
|
+
},
|
|
415
|
+
"contextSummary": {
|
|
416
|
+
"type": "string",
|
|
417
|
+
"description": "A sentence or two on what the context is responsible for. Read on the context page and nowhere else."
|
|
418
|
+
},
|
|
419
|
+
"classification": {
|
|
420
|
+
"enum": [
|
|
421
|
+
"core",
|
|
422
|
+
"supporting",
|
|
423
|
+
"generic"
|
|
424
|
+
],
|
|
425
|
+
"description": "Whether the context is core to the business, supports it, or is generic and could be bought."
|
|
426
|
+
},
|
|
427
|
+
"service": {
|
|
428
|
+
"type": "string",
|
|
429
|
+
"description": "Slug of the service. Defaults to the name of the input directory.",
|
|
430
|
+
"examples": [
|
|
431
|
+
"oms"
|
|
432
|
+
]
|
|
433
|
+
},
|
|
434
|
+
"serviceName": {
|
|
435
|
+
"type": "string",
|
|
436
|
+
"description": "What the service is called on the page. Defaults to the title of its README, and failing that to the slug, titled."
|
|
437
|
+
},
|
|
438
|
+
"repo": {
|
|
439
|
+
"type": "string",
|
|
440
|
+
"description": "Where the source lives. Defaults to the repository in Cargo.toml.",
|
|
441
|
+
"examples": [
|
|
442
|
+
"github.com/shortlink-org/portolan"
|
|
443
|
+
]
|
|
444
|
+
},
|
|
445
|
+
"store": {
|
|
446
|
+
"type": "string",
|
|
447
|
+
"description": "Slug of the database this service keeps its state in, the same one the sql extractor is given. It is here for the flows: a call on a repository lands somewhere, and only the manifest knows where.",
|
|
448
|
+
"examples": [
|
|
449
|
+
"pg"
|
|
450
|
+
]
|
|
451
|
+
},
|
|
452
|
+
"peers": {
|
|
453
|
+
"type": "object",
|
|
454
|
+
"additionalProperties": {
|
|
455
|
+
"type": "string"
|
|
456
|
+
},
|
|
457
|
+
"description": "Which service answers for what this one calls, as the callee's proto package to its service id. The generated client names the package and the rpc; only the manifest knows whose it is. A package with no line here is called as unknown and its steps stay unresolved.",
|
|
458
|
+
"examples": [
|
|
459
|
+
{
|
|
460
|
+
"payments.v1": "payments.ledger"
|
|
461
|
+
}
|
|
462
|
+
]
|
|
463
|
+
},
|
|
464
|
+
"events": {
|
|
465
|
+
"type": "object",
|
|
466
|
+
"additionalProperties": {
|
|
467
|
+
"type": "string"
|
|
468
|
+
},
|
|
469
|
+
"description": "Where another service's events are decoded in this crate, as the module path to the aggregate id they belong to: a policy reacting to a type from that module reacts to that aggregate's event. Without a line the step is unresolved.",
|
|
470
|
+
"examples": [
|
|
471
|
+
{
|
|
472
|
+
"crate::infrastructure::cart": "shop.cart.basket"
|
|
473
|
+
}
|
|
474
|
+
]
|
|
475
|
+
},
|
|
476
|
+
"source": {
|
|
477
|
+
"type": "string",
|
|
478
|
+
"description": "The directory the layout starts in, relative to the input root.",
|
|
479
|
+
"default": "src"
|
|
480
|
+
},
|
|
481
|
+
"out": {
|
|
482
|
+
"type": "string",
|
|
483
|
+
"description": "Name of the fragment file, inside the step's output directory. One extractor writes one file, so that a fragment carries the provenance of the run that produced it.",
|
|
484
|
+
"default": "domain.json"
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
},
|
|
489
|
+
{
|
|
490
|
+
"name": "laravel-domain",
|
|
491
|
+
"plugin": "extract-laravel",
|
|
492
|
+
"summary": "Reads a Laravel application by its framework - Eloquent models, events and listeners, routes and controllers - into a catalog fragment and an inferred HTTP contract.",
|
|
493
|
+
"category": "code",
|
|
494
|
+
"phases": [
|
|
495
|
+
"extract"
|
|
496
|
+
],
|
|
497
|
+
"runtime": "process",
|
|
498
|
+
"toolchain": "cargo",
|
|
499
|
+
"source": "plugins/extract-laravel",
|
|
500
|
+
"options": {
|
|
501
|
+
"type": "object",
|
|
502
|
+
"additionalProperties": false,
|
|
503
|
+
"properties": {
|
|
504
|
+
"context": {
|
|
505
|
+
"type": "string",
|
|
506
|
+
"description": "Slug of the bounded context this application belongs to. A composer.json knows its name, not which context owns it. Defaults to the name of the input directory.",
|
|
507
|
+
"examples": [
|
|
508
|
+
"shop"
|
|
509
|
+
]
|
|
510
|
+
},
|
|
511
|
+
"contextName": {
|
|
512
|
+
"type": "string",
|
|
513
|
+
"description": "What the context is called on the page. Defaults to the slug, titled.",
|
|
514
|
+
"examples": [
|
|
515
|
+
"Shop"
|
|
516
|
+
]
|
|
517
|
+
},
|
|
518
|
+
"contextSummary": {
|
|
519
|
+
"type": "string",
|
|
520
|
+
"description": "A sentence or two on what the context is responsible for. Read on the context page and nowhere else."
|
|
521
|
+
},
|
|
522
|
+
"classification": {
|
|
523
|
+
"enum": [
|
|
524
|
+
"core",
|
|
525
|
+
"supporting",
|
|
526
|
+
"generic"
|
|
527
|
+
],
|
|
528
|
+
"description": "Whether the context is core to the business, supports it, or is generic and could be bought."
|
|
529
|
+
},
|
|
530
|
+
"service": {
|
|
531
|
+
"type": "string",
|
|
532
|
+
"description": "Slug of the service. Defaults to the name of the input directory.",
|
|
533
|
+
"examples": [
|
|
534
|
+
"bagisto"
|
|
535
|
+
]
|
|
536
|
+
},
|
|
537
|
+
"serviceName": {
|
|
538
|
+
"type": "string",
|
|
539
|
+
"description": "What the service is called on the page. Defaults to the title of its README, and failing that to the slug, titled."
|
|
540
|
+
},
|
|
541
|
+
"repo": {
|
|
542
|
+
"type": "string",
|
|
543
|
+
"description": "Where the source lives. Defaults to composer.json's support.source or homepage when either names a repository.",
|
|
544
|
+
"examples": [
|
|
545
|
+
"github.com/bagisto/bagisto"
|
|
546
|
+
]
|
|
547
|
+
},
|
|
548
|
+
"modules": {
|
|
549
|
+
"type": "string",
|
|
550
|
+
"description": "Where the application's modules are, as a directory pattern relative to the input root with `*` for one path segment: `packages/*/*/src` for a package-per-module monolith, `app` for a plain Laravel application. Each match is one module, named after the directory the pattern's last literal segment sits in. Defaults to `packages/*/*/src` when that matches anything, and to `app` otherwise.",
|
|
551
|
+
"examples": [
|
|
552
|
+
"packages/*/*/src",
|
|
553
|
+
"app",
|
|
554
|
+
"modules/*"
|
|
555
|
+
]
|
|
556
|
+
},
|
|
557
|
+
"store": {
|
|
558
|
+
"type": "string",
|
|
559
|
+
"description": "Slug of the database the migrations describe and the models read and write. The store's id is the service id and this slug.",
|
|
560
|
+
"default": "db",
|
|
561
|
+
"examples": [
|
|
562
|
+
"mysql"
|
|
563
|
+
]
|
|
564
|
+
},
|
|
565
|
+
"storeKind": {
|
|
566
|
+
"enum": [
|
|
567
|
+
"postgres",
|
|
568
|
+
"mysql",
|
|
569
|
+
"sqlite",
|
|
570
|
+
"other"
|
|
571
|
+
],
|
|
572
|
+
"description": "Which database the migrations are the schema of. Read off config/database.php's default connection when left out - `env('DB_CONNECTION', 'mysql')` names it - and mysql when that cannot be read; given here, it wins."
|
|
573
|
+
},
|
|
574
|
+
"out": {
|
|
575
|
+
"type": "string",
|
|
576
|
+
"description": "Name of the fragment file, inside the step's output directory. One extractor writes one file, so that a fragment carries the provenance of the run that produced it.",
|
|
577
|
+
"default": "domain.json"
|
|
578
|
+
},
|
|
579
|
+
"storesOut": {
|
|
580
|
+
"type": "string",
|
|
581
|
+
"description": "Name of the store fragment, inside the step's output directory. Written when the migrations declare tables or the code reaches any.",
|
|
582
|
+
"default": "stores.json"
|
|
583
|
+
},
|
|
584
|
+
"openapiOut": {
|
|
585
|
+
"type": "string",
|
|
586
|
+
"description": "Name of the inferred OpenAPI 3.1 document, inside the step's output directory. Written when the route files expose HTTP operations.",
|
|
587
|
+
"default": "openapi.inferred.yaml"
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
},
|
|
592
|
+
{
|
|
593
|
+
"name": "php-ddd",
|
|
594
|
+
"plugin": "extract-php-ddd",
|
|
595
|
+
"summary": "Reads a PHP tree laid out by bounded context, module and hexagonal layer - aggregates, value objects, domain events, commands, queries, subscribers, routes, Doctrine mappings - into a catalog fragment and an inferred HTTP contract.",
|
|
596
|
+
"category": "code",
|
|
597
|
+
"phases": [
|
|
598
|
+
"extract"
|
|
599
|
+
],
|
|
600
|
+
"runtime": "process",
|
|
601
|
+
"toolchain": "cargo",
|
|
602
|
+
"source": "plugins/extract-php-ddd",
|
|
603
|
+
"options": {
|
|
604
|
+
"type": "object",
|
|
605
|
+
"additionalProperties": false,
|
|
606
|
+
"properties": {
|
|
607
|
+
"source": {
|
|
608
|
+
"type": "string",
|
|
609
|
+
"description": "The directory the bounded contexts are in, relative to the input root: one directory per context, one per module under it, `Domain`, `Application` and `Infrastructure` under that. A `Shared` directory at either level is the shared kernel and is not a context or a module.",
|
|
610
|
+
"default": "src"
|
|
611
|
+
},
|
|
612
|
+
"apps": {
|
|
613
|
+
"type": "string",
|
|
614
|
+
"description": "The directory the deployable applications are in, relative to the input root: `<apps>/<context>/<app>`, each with `config/routes/*.yaml` and `src/Controller/`. Each application is a service of its context; a context with none gets one service named after itself.",
|
|
615
|
+
"default": "apps"
|
|
616
|
+
},
|
|
617
|
+
"repo": {
|
|
618
|
+
"type": "string",
|
|
619
|
+
"description": "Where the source lives. Defaults to composer.json's support.source or homepage when either names a repository.",
|
|
620
|
+
"examples": [
|
|
621
|
+
"github.com/CodelyTV/php-ddd-example"
|
|
622
|
+
]
|
|
623
|
+
},
|
|
624
|
+
"exchange": {
|
|
625
|
+
"type": "string",
|
|
626
|
+
"description": "The RabbitMQ exchange domain events are published to. The code reads it from the environment, so the manifest says.",
|
|
627
|
+
"default": "domain_events"
|
|
628
|
+
},
|
|
629
|
+
"storeKind": {
|
|
630
|
+
"enum": [
|
|
631
|
+
"postgres",
|
|
632
|
+
"mysql",
|
|
633
|
+
"sqlite",
|
|
634
|
+
"other"
|
|
635
|
+
],
|
|
636
|
+
"description": "What the Doctrine-mapped tables live in.",
|
|
637
|
+
"default": "mysql"
|
|
638
|
+
},
|
|
639
|
+
"classification": {
|
|
640
|
+
"enum": [
|
|
641
|
+
"core",
|
|
642
|
+
"supporting",
|
|
643
|
+
"generic"
|
|
644
|
+
],
|
|
645
|
+
"description": "Whether the contexts are core to the business, support it, or are generic and could be bought. One value for every context the tree declares."
|
|
646
|
+
},
|
|
647
|
+
"out": {
|
|
648
|
+
"type": "string",
|
|
649
|
+
"description": "Name of the fragment file, inside the step's output directory.",
|
|
650
|
+
"default": "domain.json"
|
|
651
|
+
},
|
|
652
|
+
"openapiOut": {
|
|
653
|
+
"type": "string",
|
|
654
|
+
"description": "Name of the inferred OpenAPI 3.1 document, inside the step's output directory. Written when the route files expose HTTP operations.",
|
|
655
|
+
"default": "openapi.inferred.yaml"
|
|
656
|
+
},
|
|
657
|
+
"storesOut": {
|
|
658
|
+
"type": "string",
|
|
659
|
+
"description": "Name of the store fragment, inside the step's output directory. Written when a Doctrine mapping or a repository adapter names a store.",
|
|
660
|
+
"default": "stores.json"
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
},
|
|
665
|
+
{
|
|
666
|
+
"name": "csharp-ddd",
|
|
667
|
+
"plugin": "extract-csharp-ddd",
|
|
668
|
+
"summary": "A C# tree laid out by module and layer - src/Modules/<Module>/{Domain,Application,Infrastructure,IntegrationEvents}, controllers under an API host, a database project - read into contexts, aggregates, commands and queries, domain and integration events, an in-memory bus, SQL Server schemas and flows, through Roslyn without restoring a package.",
|
|
669
|
+
"category": "code",
|
|
670
|
+
"phases": [
|
|
671
|
+
"extract"
|
|
672
|
+
],
|
|
673
|
+
"runtime": "process",
|
|
674
|
+
"toolchain": "dotnet",
|
|
675
|
+
"source": "plugins/extract-csharp-ddd",
|
|
676
|
+
"options": {
|
|
677
|
+
"type": "object",
|
|
678
|
+
"additionalProperties": false,
|
|
679
|
+
"properties": {
|
|
680
|
+
"modules": {
|
|
681
|
+
"type": "string",
|
|
682
|
+
"description": "The directory the modules are in, relative to the input root: one directory per module, `Domain`, `Application`, `Infrastructure` and `IntegrationEvents` under it. Each module is a bounded context with one service.",
|
|
683
|
+
"default": "src/Modules"
|
|
684
|
+
},
|
|
685
|
+
"api": {
|
|
686
|
+
"type": "string",
|
|
687
|
+
"description": "The directory the HTTP host is in, relative to the input root. Controllers under a `Modules/<Module>` directory beneath it are that module's HTTP edge.",
|
|
688
|
+
"default": "src/API"
|
|
689
|
+
},
|
|
690
|
+
"database": {
|
|
691
|
+
"type": "string",
|
|
692
|
+
"description": "The directory the database project is in, relative to the input root: `Structure/<schema>/Tables/*.sql` and `Structure/<schema>/Views/*.sql` beneath it, one schema per module.",
|
|
693
|
+
"default": "src/Database"
|
|
694
|
+
},
|
|
695
|
+
"repo": {
|
|
696
|
+
"type": "string",
|
|
697
|
+
"description": "Where the source lives, as `host/owner/name`. Nothing in a .NET tree says, so the manifest does.",
|
|
698
|
+
"examples": [
|
|
699
|
+
"github.com/kgrzybek/modular-monolith-with-ddd"
|
|
700
|
+
]
|
|
701
|
+
},
|
|
702
|
+
"bus": {
|
|
703
|
+
"type": "string",
|
|
704
|
+
"description": "The address of the bus integration events cross modules on. The code names the class, `InMemoryEventBus`, and nothing else, so the manifest says.",
|
|
705
|
+
"default": "integration-events"
|
|
706
|
+
},
|
|
707
|
+
"storeKind": {
|
|
708
|
+
"enum": [
|
|
709
|
+
"postgres",
|
|
710
|
+
"mysql",
|
|
711
|
+
"sqlite",
|
|
712
|
+
"other"
|
|
713
|
+
],
|
|
714
|
+
"description": "What the schemas live in. SQL Server is `other`.",
|
|
715
|
+
"default": "other"
|
|
716
|
+
},
|
|
717
|
+
"classification": {
|
|
718
|
+
"enum": [
|
|
719
|
+
"core",
|
|
720
|
+
"supporting",
|
|
721
|
+
"generic"
|
|
722
|
+
],
|
|
723
|
+
"description": "Whether the modules are core to the business, support it, or are generic and could be bought. One value for every module the tree declares."
|
|
724
|
+
},
|
|
725
|
+
"out": {
|
|
726
|
+
"type": "string",
|
|
727
|
+
"description": "Name of the fragment file, inside the step's output directory.",
|
|
728
|
+
"default": "domain.json"
|
|
729
|
+
},
|
|
730
|
+
"openapiOut": {
|
|
731
|
+
"type": "string",
|
|
732
|
+
"description": "Name of the inferred OpenAPI 3.1 document, inside the step's output directory, one per module with controllers; `{service}` is replaced with the module's slug.",
|
|
733
|
+
"default": "openapi.{service}.yaml"
|
|
734
|
+
},
|
|
735
|
+
"storesOut": {
|
|
736
|
+
"type": "string",
|
|
737
|
+
"description": "Name of the store fragment, inside the step's output directory. Written when the database project declares a schema a module maps to.",
|
|
738
|
+
"default": "stores.json"
|
|
739
|
+
}
|
|
740
|
+
}
|
|
741
|
+
}
|
|
742
|
+
},
|
|
743
|
+
{
|
|
744
|
+
"name": "java-domain",
|
|
745
|
+
"plugin": "extract-java",
|
|
746
|
+
"summary": "Reads a Java service by what it declares - jMolecules aggregates, events and ports, Spring's listeners and handlers - into a catalog fragment.",
|
|
747
|
+
"category": "code",
|
|
748
|
+
"phases": [
|
|
749
|
+
"extract"
|
|
750
|
+
],
|
|
751
|
+
"runtime": "process",
|
|
752
|
+
"toolchain": "java",
|
|
753
|
+
"source": "plugins/extract-java",
|
|
754
|
+
"options": {
|
|
755
|
+
"type": "object",
|
|
756
|
+
"additionalProperties": false,
|
|
757
|
+
"properties": {
|
|
758
|
+
"context": {
|
|
759
|
+
"type": "string",
|
|
760
|
+
"description": "Slug of the bounded context this service belongs to. Defaults to the name of the input directory.",
|
|
761
|
+
"examples": [
|
|
762
|
+
"payments"
|
|
763
|
+
]
|
|
764
|
+
},
|
|
765
|
+
"contextName": {
|
|
766
|
+
"type": "string",
|
|
767
|
+
"description": "What the context is called on the page. Defaults to the slug, titled."
|
|
768
|
+
},
|
|
769
|
+
"contextSummary": {
|
|
770
|
+
"type": "string",
|
|
771
|
+
"description": "A sentence or two on what the context is responsible for."
|
|
772
|
+
},
|
|
773
|
+
"classification": {
|
|
774
|
+
"enum": [
|
|
775
|
+
"core",
|
|
776
|
+
"supporting",
|
|
777
|
+
"generic"
|
|
778
|
+
],
|
|
779
|
+
"description": "Whether the context is core to the business, supports it, or is generic and could be bought."
|
|
780
|
+
},
|
|
781
|
+
"service": {
|
|
782
|
+
"type": "string",
|
|
783
|
+
"description": "Slug of the service. Defaults to the name of the input directory.",
|
|
784
|
+
"examples": [
|
|
785
|
+
"ledger"
|
|
786
|
+
]
|
|
787
|
+
},
|
|
788
|
+
"serviceName": {
|
|
789
|
+
"type": "string",
|
|
790
|
+
"description": "What the service is called on the page. Defaults to the title of its README, and failing that to the slug, titled."
|
|
791
|
+
},
|
|
792
|
+
"repo": {
|
|
793
|
+
"type": "string",
|
|
794
|
+
"description": "Where the source lives. Defaults to the scm url in pom.xml.",
|
|
795
|
+
"examples": [
|
|
796
|
+
"github.com/shortlink-org/portolan"
|
|
797
|
+
]
|
|
798
|
+
},
|
|
799
|
+
"store": {
|
|
800
|
+
"type": "string",
|
|
801
|
+
"description": "Slug of the database this service keeps its state in, the same one the sql extractor is given. It is here for the flows: a call on a port lands somewhere, and only the manifest knows where.",
|
|
802
|
+
"examples": [
|
|
803
|
+
"pg"
|
|
804
|
+
]
|
|
805
|
+
},
|
|
806
|
+
"peers": {
|
|
807
|
+
"type": "object",
|
|
808
|
+
"additionalProperties": {
|
|
809
|
+
"type": "string"
|
|
810
|
+
},
|
|
811
|
+
"description": "Which service answers for what this one calls, as the contract vendored beside the adapter to the callee's service id: the proto package for a gRPC peer, the api id of the OpenAPI document (its x-portolan-api, or its title and major version) for an HTTP one. A package with no line here, and none under externals, is called as unknown and its steps stay unresolved.",
|
|
812
|
+
"examples": [
|
|
813
|
+
{
|
|
814
|
+
"shop.v1": "shop.oms",
|
|
815
|
+
"pricing.v1": "shop.pricing"
|
|
816
|
+
}
|
|
817
|
+
]
|
|
818
|
+
},
|
|
819
|
+
"externals": {
|
|
820
|
+
"type": "object",
|
|
821
|
+
"additionalProperties": {
|
|
822
|
+
"type": "string"
|
|
823
|
+
},
|
|
824
|
+
"description": "Which system outside the estate answers for what this one calls, as the api id of the document vendored beside the adapter to the external's id - the same bare name the openapi extractor is given under external. The calls land on the operations the copy declares and are declared, not unresolved; the lane says the far end is outside.",
|
|
825
|
+
"examples": [
|
|
826
|
+
{
|
|
827
|
+
"stripe.v1": "stripe"
|
|
828
|
+
}
|
|
829
|
+
]
|
|
830
|
+
},
|
|
831
|
+
"events": {
|
|
832
|
+
"type": "object",
|
|
833
|
+
"additionalProperties": {
|
|
834
|
+
"type": "string"
|
|
835
|
+
},
|
|
836
|
+
"description": "Which aggregate another service's events belong to, as the package a listener reads them from to the aggregate id, so a policy reacting to a foreign event resolves.",
|
|
837
|
+
"examples": [
|
|
838
|
+
{
|
|
839
|
+
"org.portolan.payments.ledger.infrastructure.oms.event": "shop.oms.order"
|
|
840
|
+
}
|
|
841
|
+
]
|
|
842
|
+
},
|
|
843
|
+
"source": {
|
|
844
|
+
"type": "string",
|
|
845
|
+
"description": "The directory the packages start in, relative to the input root.",
|
|
846
|
+
"default": "src/main/java"
|
|
847
|
+
},
|
|
848
|
+
"out": {
|
|
849
|
+
"type": "string",
|
|
850
|
+
"description": "Name of the fragment file, inside the step's output directory.",
|
|
851
|
+
"default": "domain.json"
|
|
852
|
+
}
|
|
853
|
+
}
|
|
854
|
+
}
|
|
855
|
+
},
|
|
856
|
+
{
|
|
857
|
+
"name": "django-domain",
|
|
858
|
+
"plugin": "extract-django",
|
|
859
|
+
"summary": "Reads a Django service by its applications - models, events, services, DRF views, receivers, clients - into a catalog fragment, and its models into the store they are the schema of.",
|
|
860
|
+
"category": "code",
|
|
861
|
+
"phases": [
|
|
862
|
+
"extract"
|
|
863
|
+
],
|
|
864
|
+
"runtime": "process",
|
|
865
|
+
"toolchain": "python3",
|
|
866
|
+
"source": "plugins/extract-django",
|
|
867
|
+
"options": {
|
|
868
|
+
"type": "object",
|
|
869
|
+
"additionalProperties": false,
|
|
870
|
+
"properties": {
|
|
871
|
+
"context": {
|
|
872
|
+
"type": "string",
|
|
873
|
+
"description": "Slug of the bounded context this service belongs to. Defaults to the name of the input directory.",
|
|
874
|
+
"examples": [
|
|
875
|
+
"shop"
|
|
876
|
+
]
|
|
877
|
+
},
|
|
878
|
+
"contextName": {
|
|
879
|
+
"type": "string",
|
|
880
|
+
"description": "What the context is called on the page. Defaults to the slug, titled."
|
|
881
|
+
},
|
|
882
|
+
"contextSummary": {
|
|
883
|
+
"type": "string",
|
|
884
|
+
"description": "A sentence or two on what the context is responsible for."
|
|
885
|
+
},
|
|
886
|
+
"classification": {
|
|
887
|
+
"enum": [
|
|
888
|
+
"core",
|
|
889
|
+
"supporting",
|
|
890
|
+
"generic"
|
|
891
|
+
],
|
|
892
|
+
"description": "Whether the context is core to the business, supports it, or is generic and could be bought."
|
|
893
|
+
},
|
|
894
|
+
"service": {
|
|
895
|
+
"type": "string",
|
|
896
|
+
"description": "Slug of the service. Defaults to the name of the input directory.",
|
|
897
|
+
"examples": [
|
|
898
|
+
"billing"
|
|
899
|
+
]
|
|
900
|
+
},
|
|
901
|
+
"serviceName": {
|
|
902
|
+
"type": "string",
|
|
903
|
+
"description": "What the service is called on the page. Defaults to the title of its README, and failing that to the slug, titled."
|
|
904
|
+
},
|
|
905
|
+
"repo": {
|
|
906
|
+
"type": "string",
|
|
907
|
+
"description": "Where the source lives. Defaults to the repository url in pyproject.toml.",
|
|
908
|
+
"examples": [
|
|
909
|
+
"github.com/shortlink-org/portolan"
|
|
910
|
+
]
|
|
911
|
+
},
|
|
912
|
+
"store": {
|
|
913
|
+
"type": "string",
|
|
914
|
+
"description": "Slug of the database this service keeps its state in. Defaults from the kind of DATABASES['default'] when that setting is statically readable. The models are read as its schema, and a call into the ORM lands on its lane.",
|
|
915
|
+
"examples": [
|
|
916
|
+
"pg"
|
|
917
|
+
]
|
|
918
|
+
},
|
|
919
|
+
"storeName": {
|
|
920
|
+
"type": "string",
|
|
921
|
+
"description": "What the database is called on the page. Defaults to the service, titled, and the word database."
|
|
922
|
+
},
|
|
923
|
+
"storeKind": {
|
|
924
|
+
"enum": [
|
|
925
|
+
"postgres",
|
|
926
|
+
"mysql",
|
|
927
|
+
"sqlite",
|
|
928
|
+
"redis",
|
|
929
|
+
"mongodb",
|
|
930
|
+
"clickhouse",
|
|
931
|
+
"s3",
|
|
932
|
+
"other"
|
|
933
|
+
],
|
|
934
|
+
"description": "Which database the models are the schema of. Read off DATABASES['default']['ENGINE'] in the settings module when left out; given here, it wins, and a disagreement with the settings is reported. It picks the column types a field becomes; only postgres has a mapping, and a kind without one keeps the field's own name and says so."
|
|
935
|
+
},
|
|
936
|
+
"apps": {
|
|
937
|
+
"type": "array",
|
|
938
|
+
"items": {
|
|
939
|
+
"type": "string"
|
|
940
|
+
},
|
|
941
|
+
"description": "The Django applications to read, as import packages, for a project that keeps them somewhere a models module would not be found. Every package holding one is read when this is left out.",
|
|
942
|
+
"examples": [
|
|
943
|
+
[
|
|
944
|
+
"billing.invoices"
|
|
945
|
+
]
|
|
946
|
+
]
|
|
947
|
+
},
|
|
948
|
+
"aggregates": {
|
|
949
|
+
"type": "object",
|
|
950
|
+
"additionalProperties": {
|
|
951
|
+
"type": "string"
|
|
952
|
+
},
|
|
953
|
+
"description": "Which model is the root of an application's aggregate, as the application to the model. Only needed where the application is not named after its root - `invoices` finds `Invoice` on its own.",
|
|
954
|
+
"examples": [
|
|
955
|
+
{
|
|
956
|
+
"invoices": "Invoice"
|
|
957
|
+
}
|
|
958
|
+
]
|
|
959
|
+
},
|
|
960
|
+
"peers": {
|
|
961
|
+
"type": "object",
|
|
962
|
+
"additionalProperties": {
|
|
963
|
+
"type": "string"
|
|
964
|
+
},
|
|
965
|
+
"description": "Which service answers for what this one calls, as the api id of the document vendored beside the client to the callee's service id. A client with no line here is called as unknown and its steps stay unresolved.",
|
|
966
|
+
"examples": [
|
|
967
|
+
{
|
|
968
|
+
"pricing.v1": "shop.pricing"
|
|
969
|
+
}
|
|
970
|
+
]
|
|
971
|
+
},
|
|
972
|
+
"events": {
|
|
973
|
+
"type": "object",
|
|
974
|
+
"additionalProperties": {
|
|
975
|
+
"type": "string"
|
|
976
|
+
},
|
|
977
|
+
"description": "Which aggregate another service's events belong to, as the module a receiver imports the signal from to the aggregate id, so a policy reacting to a foreign event resolves.",
|
|
978
|
+
"examples": [
|
|
979
|
+
{
|
|
980
|
+
"payments.events": "payments.ledger.payment"
|
|
981
|
+
}
|
|
982
|
+
]
|
|
983
|
+
},
|
|
984
|
+
"flowWrappers": {
|
|
985
|
+
"type": "object",
|
|
986
|
+
"additionalProperties": {
|
|
987
|
+
"type": "object",
|
|
988
|
+
"additionalProperties": false,
|
|
989
|
+
"properties": {
|
|
990
|
+
"label": {
|
|
991
|
+
"type": "string",
|
|
992
|
+
"description": "Business-facing label shown instead of expanding the wrapper's implementation. Defaults to the callable name, titled."
|
|
993
|
+
},
|
|
994
|
+
"target": {
|
|
995
|
+
"type": "string",
|
|
996
|
+
"description": "Service id the wrapper calls. Omit for a semantic operation inside this service."
|
|
997
|
+
},
|
|
998
|
+
"technical": {
|
|
999
|
+
"type": "boolean",
|
|
1000
|
+
"default": false,
|
|
1001
|
+
"description": "Collapse every call to this wrapper in one flow into one counted step."
|
|
1002
|
+
}
|
|
1003
|
+
}
|
|
1004
|
+
},
|
|
1005
|
+
"description": "Project callables that form a meaningful flow boundary, keyed as module.function or module.Class.method. Their internals are replaced by one semantic step; technical wrappers are also deduplicated per flow.",
|
|
1006
|
+
"examples": [
|
|
1007
|
+
{
|
|
1008
|
+
"util.logger.send_log": {
|
|
1009
|
+
"label": "Record application log",
|
|
1010
|
+
"technical": true
|
|
1011
|
+
},
|
|
1012
|
+
"mailer.client.send": {
|
|
1013
|
+
"label": "Send email",
|
|
1014
|
+
"target": "messaging.mailer"
|
|
1015
|
+
}
|
|
1016
|
+
}
|
|
1017
|
+
]
|
|
1018
|
+
},
|
|
1019
|
+
"source": {
|
|
1020
|
+
"type": "string",
|
|
1021
|
+
"description": "The directory the applications are looked for in, relative to the input root.",
|
|
1022
|
+
"default": "."
|
|
1023
|
+
},
|
|
1024
|
+
"settings": {
|
|
1025
|
+
"type": "string",
|
|
1026
|
+
"description": "The Django settings module Celery is configured from, as an import spells it, so an enqueue lands on the queue the routes give it. Defaults to what manage.py sets DJANGO_SETTINGS_MODULE to.",
|
|
1027
|
+
"examples": [
|
|
1028
|
+
"config.settings"
|
|
1029
|
+
]
|
|
1030
|
+
},
|
|
1031
|
+
"out": {
|
|
1032
|
+
"type": "string",
|
|
1033
|
+
"description": "Name of the fragment file, inside the step's output directory.",
|
|
1034
|
+
"default": "domain.json"
|
|
1035
|
+
},
|
|
1036
|
+
"storesOut": {
|
|
1037
|
+
"type": "string",
|
|
1038
|
+
"description": "Name of the fragment holding the database the models describe, inside the step's output directory. Written when store is set or inferred from DATABASES['default'].",
|
|
1039
|
+
"default": "stores.json"
|
|
1040
|
+
},
|
|
1041
|
+
"openapiOut": {
|
|
1042
|
+
"type": "string",
|
|
1043
|
+
"description": "Name of the inferred OpenAPI 3.1 document, inside the step's output directory. Written when URLConf exposes HTTP operations.",
|
|
1044
|
+
"default": "openapi.inferred.yaml"
|
|
1045
|
+
}
|
|
1046
|
+
}
|
|
1047
|
+
}
|
|
1048
|
+
},
|
|
1049
|
+
{
|
|
1050
|
+
"name": "celery",
|
|
1051
|
+
"plugin": "extract-celery",
|
|
1052
|
+
"summary": "Reads Celery task declarations, the calls that enqueue them and the routes that place them into work queues and source-backed job flows.",
|
|
1053
|
+
"category": "messaging",
|
|
1054
|
+
"phases": [
|
|
1055
|
+
"extract"
|
|
1056
|
+
],
|
|
1057
|
+
"runtime": "process",
|
|
1058
|
+
"toolchain": "python3",
|
|
1059
|
+
"source": "plugins/extract-celery",
|
|
1060
|
+
"options": {
|
|
1061
|
+
"type": "object",
|
|
1062
|
+
"additionalProperties": false,
|
|
1063
|
+
"properties": {
|
|
1064
|
+
"context": {
|
|
1065
|
+
"type": "string",
|
|
1066
|
+
"description": "Slug of the bounded context the service belongs to. Defaults to the name of the input directory.",
|
|
1067
|
+
"examples": [
|
|
1068
|
+
"shop"
|
|
1069
|
+
]
|
|
1070
|
+
},
|
|
1071
|
+
"service": {
|
|
1072
|
+
"type": "string",
|
|
1073
|
+
"description": "Slug of the service that enqueues and works the tasks. Defaults to the name of the input directory.",
|
|
1074
|
+
"examples": [
|
|
1075
|
+
"billing"
|
|
1076
|
+
]
|
|
1077
|
+
},
|
|
1078
|
+
"source": {
|
|
1079
|
+
"type": "string",
|
|
1080
|
+
"description": "The directory the tasks and their callers are looked for in, relative to the input root.",
|
|
1081
|
+
"default": "."
|
|
1082
|
+
},
|
|
1083
|
+
"settings": {
|
|
1084
|
+
"type": "string",
|
|
1085
|
+
"description": "The Django settings module the Celery app is configured from, as an import spells it. Defaults to what manage.py sets DJANGO_SETTINGS_MODULE to.",
|
|
1086
|
+
"examples": [
|
|
1087
|
+
"config.settings"
|
|
1088
|
+
]
|
|
1089
|
+
},
|
|
1090
|
+
"out": {
|
|
1091
|
+
"type": "string",
|
|
1092
|
+
"description": "Name of the fragment file, inside the step's output directory.",
|
|
1093
|
+
"default": "celery.json"
|
|
1094
|
+
}
|
|
1095
|
+
}
|
|
1096
|
+
}
|
|
1097
|
+
},
|
|
1098
|
+
{
|
|
1099
|
+
"name": "python-kafka",
|
|
1100
|
+
"plugin": "extract-python-kafka",
|
|
1101
|
+
"summary": "Reads confluent-kafka, kafka-python and aiokafka producers and consumers into message channels and source-backed flows.",
|
|
1102
|
+
"category": "messaging",
|
|
1103
|
+
"phases": [
|
|
1104
|
+
"extract"
|
|
1105
|
+
],
|
|
1106
|
+
"runtime": "process",
|
|
1107
|
+
"toolchain": "python3",
|
|
1108
|
+
"source": "plugins/extract-python-kafka",
|
|
1109
|
+
"options": {
|
|
1110
|
+
"type": "object",
|
|
1111
|
+
"additionalProperties": false,
|
|
1112
|
+
"properties": {
|
|
1113
|
+
"context": {
|
|
1114
|
+
"type": "string",
|
|
1115
|
+
"description": "Slug of the bounded context the service belongs to. Defaults to the input directory name.",
|
|
1116
|
+
"examples": [
|
|
1117
|
+
"shop"
|
|
1118
|
+
]
|
|
1119
|
+
},
|
|
1120
|
+
"service": {
|
|
1121
|
+
"type": "string",
|
|
1122
|
+
"description": "Slug of the service that uses Kafka. Defaults to the input directory name.",
|
|
1123
|
+
"examples": [
|
|
1124
|
+
"billing"
|
|
1125
|
+
]
|
|
1126
|
+
},
|
|
1127
|
+
"source": {
|
|
1128
|
+
"type": "string",
|
|
1129
|
+
"description": "Python source directory to inspect, relative to the input root.",
|
|
1130
|
+
"default": "."
|
|
1131
|
+
},
|
|
1132
|
+
"settings": {
|
|
1133
|
+
"type": "string",
|
|
1134
|
+
"description": "Optional settings module used to resolve values referenced as settings.NAME.",
|
|
1135
|
+
"examples": [
|
|
1136
|
+
"config.settings"
|
|
1137
|
+
]
|
|
1138
|
+
},
|
|
1139
|
+
"out": {
|
|
1140
|
+
"type": "string",
|
|
1141
|
+
"description": "Fragment filename inside the extraction step output directory.",
|
|
1142
|
+
"default": "kafka.json"
|
|
1143
|
+
}
|
|
1144
|
+
}
|
|
1145
|
+
}
|
|
1146
|
+
},
|
|
1147
|
+
{
|
|
1148
|
+
"name": "openapi",
|
|
1149
|
+
"plugin": "extract-openapi",
|
|
1150
|
+
"summary": "Reads an OpenAPI document and answers with the rpc services a service provides, one per tag - or, for a copy vendored from outside the estate, what a third party answers on.",
|
|
1151
|
+
"category": "contracts",
|
|
1152
|
+
"phases": [
|
|
1153
|
+
"extract"
|
|
1154
|
+
],
|
|
1155
|
+
"runtime": "wasm",
|
|
1156
|
+
"source": "plugins/extract-openapi",
|
|
1157
|
+
"options": {
|
|
1158
|
+
"type": "object",
|
|
1159
|
+
"additionalProperties": false,
|
|
1160
|
+
"properties": {
|
|
1161
|
+
"context": {
|
|
1162
|
+
"type": "string",
|
|
1163
|
+
"description": "Slug of the bounded context that owns the service this document belongs to. Defaults to the name of the input directory.",
|
|
1164
|
+
"examples": [
|
|
1165
|
+
"auth"
|
|
1166
|
+
]
|
|
1167
|
+
},
|
|
1168
|
+
"service": {
|
|
1169
|
+
"type": "string",
|
|
1170
|
+
"description": "Slug of the service the document describes. Defaults to the name of the input directory.",
|
|
1171
|
+
"examples": [
|
|
1172
|
+
"auth"
|
|
1173
|
+
]
|
|
1174
|
+
},
|
|
1175
|
+
"spec": {
|
|
1176
|
+
"type": "string",
|
|
1177
|
+
"description": "The OpenAPI document, relative to the input root. Left out, the extractor walks the tree for every document and reads what sits beside each: a server generated from it means this service implements it, a client generated from it means this service calls it, and a called document names a system outside the estate unless peers says the api is one of ours.",
|
|
1178
|
+
"examples": [
|
|
1179
|
+
"internal/infrastructure/transport/http/gen/openapi.yaml"
|
|
1180
|
+
]
|
|
1181
|
+
},
|
|
1182
|
+
"peers": {
|
|
1183
|
+
"type": "object",
|
|
1184
|
+
"additionalProperties": {
|
|
1185
|
+
"type": "string"
|
|
1186
|
+
},
|
|
1187
|
+
"description": "Which called documents are ours, as the api id to the service that implements it. A called document whose api is named here is that service's to describe, and is skipped rather than read as a system outside the estate.",
|
|
1188
|
+
"examples": [
|
|
1189
|
+
{
|
|
1190
|
+
"auth.v1": "auth.auth"
|
|
1191
|
+
}
|
|
1192
|
+
]
|
|
1193
|
+
},
|
|
1194
|
+
"externals": {
|
|
1195
|
+
"type": "object",
|
|
1196
|
+
"additionalProperties": {
|
|
1197
|
+
"type": "string"
|
|
1198
|
+
},
|
|
1199
|
+
"description": "What a called document's system is called when the name its title would give is not the one wanted, as the api id to the external's bare id. Left out, a document titled \"Stripe API\" makes the external stripe.",
|
|
1200
|
+
"examples": [
|
|
1201
|
+
{
|
|
1202
|
+
"stripe.v1": "stripe"
|
|
1203
|
+
}
|
|
1204
|
+
]
|
|
1205
|
+
},
|
|
1206
|
+
"api": {
|
|
1207
|
+
"type": "string",
|
|
1208
|
+
"description": "Prefix for the ids of the rpc services this produces. Left out, it is the document's own x-portolan-api when it carries one, and otherwise built from its title and major version: auth 1.0.0 gives auth.v1, and a tag called users gives auth.v1.Users.",
|
|
1209
|
+
"examples": [
|
|
1210
|
+
"auth.v1"
|
|
1211
|
+
]
|
|
1212
|
+
},
|
|
1213
|
+
"external": {
|
|
1214
|
+
"type": "string",
|
|
1215
|
+
"description": "Id of a system outside the estate the document belongs to, when it is not one of ours: a copy vendored beside the adapter that calls it, read for what the third party answers on. A bare name with no dot, the same one the caller's extractor is given under externals. Set, the fragment carries the external and no service, and context and service are not read.",
|
|
1216
|
+
"examples": [
|
|
1217
|
+
"stripe"
|
|
1218
|
+
]
|
|
1219
|
+
},
|
|
1220
|
+
"externalName": {
|
|
1221
|
+
"type": "string",
|
|
1222
|
+
"description": "What the external is called on the page.",
|
|
1223
|
+
"examples": [
|
|
1224
|
+
"Stripe"
|
|
1225
|
+
]
|
|
1226
|
+
},
|
|
1227
|
+
"externalSummary": {
|
|
1228
|
+
"type": "string",
|
|
1229
|
+
"description": "A sentence or two on what the estate uses it for."
|
|
1230
|
+
},
|
|
1231
|
+
"externalUrl": {
|
|
1232
|
+
"type": "string",
|
|
1233
|
+
"description": "Where the third party documents itself, for a reader who needs more than the vendored copy.",
|
|
1234
|
+
"examples": [
|
|
1235
|
+
"https://docs.stripe.com/api"
|
|
1236
|
+
]
|
|
1237
|
+
},
|
|
1238
|
+
"out": {
|
|
1239
|
+
"type": "string",
|
|
1240
|
+
"description": "Name of the fragment file, inside the step's output directory.",
|
|
1241
|
+
"default": "api.json"
|
|
1242
|
+
}
|
|
1243
|
+
}
|
|
1244
|
+
}
|
|
1245
|
+
},
|
|
1246
|
+
{
|
|
1247
|
+
"name": "wsdl",
|
|
1248
|
+
"plugin": "extract-wsdl",
|
|
1249
|
+
"summary": "Reads WSDL services, SOAP bindings, operations, messages, faults, and local XSD shapes.",
|
|
1250
|
+
"category": "contracts",
|
|
1251
|
+
"phases": [
|
|
1252
|
+
"extract"
|
|
1253
|
+
],
|
|
1254
|
+
"runtime": "wasm",
|
|
1255
|
+
"source": "plugins/extract-wsdl",
|
|
1256
|
+
"options": {
|
|
1257
|
+
"type": "object",
|
|
1258
|
+
"additionalProperties": false,
|
|
1259
|
+
"properties": {
|
|
1260
|
+
"context": {
|
|
1261
|
+
"type": "string",
|
|
1262
|
+
"description": "Top-level group that owns the component implementing the WSDL contract.",
|
|
1263
|
+
"examples": [
|
|
1264
|
+
"booking"
|
|
1265
|
+
]
|
|
1266
|
+
},
|
|
1267
|
+
"service": {
|
|
1268
|
+
"type": "string",
|
|
1269
|
+
"description": "Component implementing the WSDL contract.",
|
|
1270
|
+
"examples": [
|
|
1271
|
+
"gateway"
|
|
1272
|
+
]
|
|
1273
|
+
},
|
|
1274
|
+
"spec": {
|
|
1275
|
+
"type": "string",
|
|
1276
|
+
"description": "Root WSDL document relative to the input. Its local WSDL and XSD imports are followed. Left out, every WSDL in the tree is discovered.",
|
|
1277
|
+
"examples": [
|
|
1278
|
+
"contracts/booking.wsdl"
|
|
1279
|
+
]
|
|
1280
|
+
},
|
|
1281
|
+
"api": {
|
|
1282
|
+
"type": "string",
|
|
1283
|
+
"description": "API id prefix for a single contract. Defaults to the WSDL service name plus .soap.",
|
|
1284
|
+
"examples": [
|
|
1285
|
+
"booking.soap"
|
|
1286
|
+
]
|
|
1287
|
+
},
|
|
1288
|
+
"mode": {
|
|
1289
|
+
"type": "string",
|
|
1290
|
+
"enum": [
|
|
1291
|
+
"service",
|
|
1292
|
+
"external"
|
|
1293
|
+
],
|
|
1294
|
+
"default": "service",
|
|
1295
|
+
"description": "Whether the contract is implemented by this component or is a local copy used to call external systems."
|
|
1296
|
+
},
|
|
1297
|
+
"external": {
|
|
1298
|
+
"type": "string",
|
|
1299
|
+
"description": "One external id for all discovered contracts. In external mode, each WSDL service otherwise derives its own external id."
|
|
1300
|
+
},
|
|
1301
|
+
"externals": {
|
|
1302
|
+
"type": "object",
|
|
1303
|
+
"additionalProperties": {
|
|
1304
|
+
"type": "string"
|
|
1305
|
+
},
|
|
1306
|
+
"description": "External id overrides keyed by derived API id.",
|
|
1307
|
+
"examples": [
|
|
1308
|
+
{
|
|
1309
|
+
"booking-service.soap": "booking-provider"
|
|
1310
|
+
}
|
|
1311
|
+
]
|
|
1312
|
+
},
|
|
1313
|
+
"externalName": {
|
|
1314
|
+
"type": "string",
|
|
1315
|
+
"description": "Display name when external names one combined system."
|
|
1316
|
+
},
|
|
1317
|
+
"externalSummary": {
|
|
1318
|
+
"type": "string",
|
|
1319
|
+
"description": "Description when external names one combined system."
|
|
1320
|
+
},
|
|
1321
|
+
"externalUrl": {
|
|
1322
|
+
"type": "string",
|
|
1323
|
+
"description": "Documentation URL when it differs from the SOAP endpoint."
|
|
1324
|
+
},
|
|
1325
|
+
"out": {
|
|
1326
|
+
"type": "string",
|
|
1327
|
+
"description": "Fragment file name inside the step output directory.",
|
|
1328
|
+
"default": "wsdl.json"
|
|
1329
|
+
}
|
|
1330
|
+
}
|
|
1331
|
+
}
|
|
1332
|
+
},
|
|
1333
|
+
{
|
|
1334
|
+
"name": "http-clients",
|
|
1335
|
+
"plugin": "extract-http-clients",
|
|
1336
|
+
"summary": "Reads outbound HTTP/SOAP calls and joins Go routes, handlers, factories, and providers into source-backed flows.",
|
|
1337
|
+
"category": "code",
|
|
1338
|
+
"phases": [
|
|
1339
|
+
"extract"
|
|
1340
|
+
],
|
|
1341
|
+
"runtime": "process",
|
|
1342
|
+
"toolchain": "go",
|
|
1343
|
+
"source": "plugins/extract-http-clients",
|
|
1344
|
+
"options": {
|
|
1345
|
+
"type": "object",
|
|
1346
|
+
"additionalProperties": false,
|
|
1347
|
+
"properties": {
|
|
1348
|
+
"context": {
|
|
1349
|
+
"type": "string",
|
|
1350
|
+
"description": "Slug of the top-level group that owns the component. Defaults to the input directory name.",
|
|
1351
|
+
"examples": [
|
|
1352
|
+
"avia"
|
|
1353
|
+
]
|
|
1354
|
+
},
|
|
1355
|
+
"service": {
|
|
1356
|
+
"type": "string",
|
|
1357
|
+
"description": "Slug of the component making outbound calls. Defaults to the input directory name.",
|
|
1358
|
+
"examples": [
|
|
1359
|
+
"billing"
|
|
1360
|
+
]
|
|
1361
|
+
},
|
|
1362
|
+
"peers": {
|
|
1363
|
+
"type": "object",
|
|
1364
|
+
"additionalProperties": {
|
|
1365
|
+
"type": "string"
|
|
1366
|
+
},
|
|
1367
|
+
"description": "Internal service answering an API, as API id to service id.",
|
|
1368
|
+
"examples": [
|
|
1369
|
+
{
|
|
1370
|
+
"auth.v1": "auth.auth"
|
|
1371
|
+
}
|
|
1372
|
+
]
|
|
1373
|
+
},
|
|
1374
|
+
"externals": {
|
|
1375
|
+
"type": "object",
|
|
1376
|
+
"additionalProperties": {
|
|
1377
|
+
"type": "string"
|
|
1378
|
+
},
|
|
1379
|
+
"description": "Override for the external system named by a vendored client contract, as API id to external id.",
|
|
1380
|
+
"examples": [
|
|
1381
|
+
{
|
|
1382
|
+
"gordian.v2": "gordian"
|
|
1383
|
+
}
|
|
1384
|
+
]
|
|
1385
|
+
},
|
|
1386
|
+
"out": {
|
|
1387
|
+
"type": "string",
|
|
1388
|
+
"description": "Name of the fragment file inside the step output directory.",
|
|
1389
|
+
"default": "http-clients.json"
|
|
1390
|
+
}
|
|
1391
|
+
}
|
|
1392
|
+
}
|
|
1393
|
+
},
|
|
1394
|
+
{
|
|
1395
|
+
"name": "redis",
|
|
1396
|
+
"plugin": "extract-redis",
|
|
1397
|
+
"summary": "Finds runtime construction of supported Go Redis clients and adds the service-owned Redis store to the catalog.",
|
|
1398
|
+
"category": "data",
|
|
1399
|
+
"phases": [
|
|
1400
|
+
"extract"
|
|
1401
|
+
],
|
|
1402
|
+
"runtime": "wasm",
|
|
1403
|
+
"source": "plugins/extract-redis",
|
|
1404
|
+
"options": {
|
|
1405
|
+
"type": "object",
|
|
1406
|
+
"additionalProperties": false,
|
|
1407
|
+
"properties": {
|
|
1408
|
+
"context": {
|
|
1409
|
+
"type": "string",
|
|
1410
|
+
"description": "Slug of the top-level group that owns the component. Defaults to the input directory name.",
|
|
1411
|
+
"examples": [
|
|
1412
|
+
"avia"
|
|
1413
|
+
]
|
|
1414
|
+
},
|
|
1415
|
+
"service": {
|
|
1416
|
+
"type": "string",
|
|
1417
|
+
"description": "Slug of the component that constructs the Redis client. Defaults to the input directory name.",
|
|
1418
|
+
"examples": [
|
|
1419
|
+
"aviasupp"
|
|
1420
|
+
]
|
|
1421
|
+
},
|
|
1422
|
+
"store": {
|
|
1423
|
+
"type": "string",
|
|
1424
|
+
"description": "Slug of the Redis store beneath the component.",
|
|
1425
|
+
"default": "redis"
|
|
1426
|
+
},
|
|
1427
|
+
"name": {
|
|
1428
|
+
"type": "string",
|
|
1429
|
+
"description": "Human-readable store name. Defaults to '<service> Redis'."
|
|
1430
|
+
},
|
|
1431
|
+
"out": {
|
|
1432
|
+
"type": "string",
|
|
1433
|
+
"description": "Name of the fragment file inside the step output directory.",
|
|
1434
|
+
"default": "redis.json"
|
|
1435
|
+
}
|
|
1436
|
+
}
|
|
1437
|
+
}
|
|
1438
|
+
},
|
|
1439
|
+
{
|
|
1440
|
+
"name": "river",
|
|
1441
|
+
"plugin": "extract-river",
|
|
1442
|
+
"summary": "Reads River JobArgs, Insert calls and registered workers into work queues and source-backed job flows.",
|
|
1443
|
+
"category": "messaging",
|
|
1444
|
+
"phases": [
|
|
1445
|
+
"extract"
|
|
1446
|
+
],
|
|
1447
|
+
"runtime": "wasm",
|
|
1448
|
+
"source": "plugins/extract-river",
|
|
1449
|
+
"options": {
|
|
1450
|
+
"type": "object",
|
|
1451
|
+
"additionalProperties": false,
|
|
1452
|
+
"properties": {
|
|
1453
|
+
"context": {
|
|
1454
|
+
"type": "string",
|
|
1455
|
+
"description": "Slug of the top-level group that owns the component. Defaults to the input directory name.",
|
|
1456
|
+
"examples": [
|
|
1457
|
+
"avia"
|
|
1458
|
+
]
|
|
1459
|
+
},
|
|
1460
|
+
"service": {
|
|
1461
|
+
"type": "string",
|
|
1462
|
+
"description": "Slug of the component that inserts or handles River jobs. Defaults to the input directory name.",
|
|
1463
|
+
"examples": [
|
|
1464
|
+
"billing"
|
|
1465
|
+
]
|
|
1466
|
+
},
|
|
1467
|
+
"out": {
|
|
1468
|
+
"type": "string",
|
|
1469
|
+
"description": "Name of the fragment file inside the step output directory.",
|
|
1470
|
+
"default": "river.json"
|
|
1471
|
+
}
|
|
1472
|
+
}
|
|
1473
|
+
}
|
|
1474
|
+
},
|
|
1475
|
+
{
|
|
1476
|
+
"name": "watermill",
|
|
1477
|
+
"plugin": "extract-watermill",
|
|
1478
|
+
"summary": "Reads Watermill router and CQRS handlers plus publications into channels and source-backed message flows.",
|
|
1479
|
+
"category": "messaging",
|
|
1480
|
+
"phases": [
|
|
1481
|
+
"extract"
|
|
1482
|
+
],
|
|
1483
|
+
"runtime": "wasm",
|
|
1484
|
+
"source": "plugins/extract-watermill",
|
|
1485
|
+
"options": {
|
|
1486
|
+
"type": "object",
|
|
1487
|
+
"additionalProperties": false,
|
|
1488
|
+
"properties": {
|
|
1489
|
+
"context": {
|
|
1490
|
+
"type": "string",
|
|
1491
|
+
"description": "Slug of the top-level group that owns the component. Defaults to the input directory name.",
|
|
1492
|
+
"examples": [
|
|
1493
|
+
"avia"
|
|
1494
|
+
]
|
|
1495
|
+
},
|
|
1496
|
+
"service": {
|
|
1497
|
+
"type": "string",
|
|
1498
|
+
"description": "Slug of the component that registers Watermill handlers or publishes messages. Defaults to the input directory name.",
|
|
1499
|
+
"examples": [
|
|
1500
|
+
"billing"
|
|
1501
|
+
]
|
|
1502
|
+
},
|
|
1503
|
+
"out": {
|
|
1504
|
+
"type": "string",
|
|
1505
|
+
"description": "Name of the fragment file inside the step output directory.",
|
|
1506
|
+
"default": "watermill.json"
|
|
1507
|
+
}
|
|
1508
|
+
}
|
|
1509
|
+
}
|
|
1510
|
+
},
|
|
1511
|
+
{
|
|
1512
|
+
"name": "go-nats",
|
|
1513
|
+
"plugin": "extract-go-nats",
|
|
1514
|
+
"summary": "Reads nats.go and JetStream calls, through the port that wraps them, into the subjects a service listens on and publishes to.",
|
|
1515
|
+
"category": "messaging",
|
|
1516
|
+
"phases": [
|
|
1517
|
+
"extract"
|
|
1518
|
+
],
|
|
1519
|
+
"runtime": "wasm",
|
|
1520
|
+
"source": "plugins/extract-go-nats",
|
|
1521
|
+
"options": {
|
|
1522
|
+
"type": "object",
|
|
1523
|
+
"additionalProperties": false,
|
|
1524
|
+
"properties": {
|
|
1525
|
+
"context": {
|
|
1526
|
+
"type": "string",
|
|
1527
|
+
"description": "Slug of the bounded context this service belongs to. Defaults to the name of the input directory.",
|
|
1528
|
+
"examples": [
|
|
1529
|
+
"shop"
|
|
1530
|
+
]
|
|
1531
|
+
},
|
|
1532
|
+
"service": {
|
|
1533
|
+
"type": "string",
|
|
1534
|
+
"description": "Slug of the service. Defaults to the name of the input directory.",
|
|
1535
|
+
"examples": [
|
|
1536
|
+
"pricing"
|
|
1537
|
+
]
|
|
1538
|
+
},
|
|
1539
|
+
"out": {
|
|
1540
|
+
"type": "string",
|
|
1541
|
+
"description": "Name of the fragment file, inside the step's output directory.",
|
|
1542
|
+
"default": "nats.json"
|
|
1543
|
+
}
|
|
1544
|
+
}
|
|
1545
|
+
}
|
|
1546
|
+
},
|
|
1547
|
+
{
|
|
1548
|
+
"name": "go-sqs",
|
|
1549
|
+
"plugin": "extract-go-sqs",
|
|
1550
|
+
"summary": "Reads aws-sdk-go-v2 SQS calls, through the port that wraps them, into the queues a service sends to and receives from.",
|
|
1551
|
+
"category": "messaging",
|
|
1552
|
+
"phases": [
|
|
1553
|
+
"extract"
|
|
1554
|
+
],
|
|
1555
|
+
"runtime": "wasm",
|
|
1556
|
+
"source": "plugins/extract-go-sqs",
|
|
1557
|
+
"options": {
|
|
1558
|
+
"type": "object",
|
|
1559
|
+
"additionalProperties": false,
|
|
1560
|
+
"properties": {
|
|
1561
|
+
"context": {
|
|
1562
|
+
"type": "string",
|
|
1563
|
+
"description": "Slug of the bounded context this service belongs to. Defaults to the name of the input directory.",
|
|
1564
|
+
"examples": [
|
|
1565
|
+
"shop"
|
|
1566
|
+
]
|
|
1567
|
+
},
|
|
1568
|
+
"service": {
|
|
1569
|
+
"type": "string",
|
|
1570
|
+
"description": "Slug of the service. Defaults to the name of the input directory.",
|
|
1571
|
+
"examples": [
|
|
1572
|
+
"fulfillment"
|
|
1573
|
+
]
|
|
1574
|
+
},
|
|
1575
|
+
"out": {
|
|
1576
|
+
"type": "string",
|
|
1577
|
+
"description": "Name of the fragment file, inside the step's output directory.",
|
|
1578
|
+
"default": "sqs.json"
|
|
1579
|
+
}
|
|
1580
|
+
}
|
|
1581
|
+
}
|
|
1582
|
+
},
|
|
1583
|
+
{
|
|
1584
|
+
"name": "terraform",
|
|
1585
|
+
"plugin": "extract-terraform",
|
|
1586
|
+
"summary": "Reads a Terraform module for AWS into the queues, topics, functions and stores it declares, and the subscriptions, triggers and dead-letter queues that join them.",
|
|
1587
|
+
"category": "infrastructure",
|
|
1588
|
+
"phases": [
|
|
1589
|
+
"extract"
|
|
1590
|
+
],
|
|
1591
|
+
"runtime": "wasm",
|
|
1592
|
+
"source": "plugins/extract-terraform",
|
|
1593
|
+
"options": {
|
|
1594
|
+
"type": "object",
|
|
1595
|
+
"additionalProperties": false,
|
|
1596
|
+
"properties": {
|
|
1597
|
+
"context": {
|
|
1598
|
+
"type": "string",
|
|
1599
|
+
"description": "Slug of the bounded context the module deploys into. Defaults to the name of the input directory.",
|
|
1600
|
+
"examples": [
|
|
1601
|
+
"shop"
|
|
1602
|
+
]
|
|
1603
|
+
},
|
|
1604
|
+
"service": {
|
|
1605
|
+
"type": "string",
|
|
1606
|
+
"description": "Slug of the service the module sits beside. Queues, topics and stores nothing in the module claims are listed on it, and it owns every store. A Lambda function whose name slugs to this becomes the service itself; any other becomes a component of kind function in the same context. Defaults to the name of the input directory.",
|
|
1607
|
+
"examples": [
|
|
1608
|
+
"fulfillment"
|
|
1609
|
+
]
|
|
1610
|
+
},
|
|
1611
|
+
"dir": {
|
|
1612
|
+
"type": "string",
|
|
1613
|
+
"description": "Directory of *.tf files to read, relative to the input root. Left out, the root is read when it holds *.tf files, and otherwise the one directory under it that does - when there are several, the first by name, and the rest are named in a warning. Local modules (source = ./...) are followed from wherever they are called; registry modules are not read.",
|
|
1614
|
+
"examples": [
|
|
1615
|
+
"deploy/terraform"
|
|
1616
|
+
]
|
|
1617
|
+
},
|
|
1618
|
+
"out": {
|
|
1619
|
+
"type": "string",
|
|
1620
|
+
"description": "Name of the fragment file, inside the step's output directory.",
|
|
1621
|
+
"default": "terraform.json"
|
|
1622
|
+
}
|
|
1623
|
+
}
|
|
1624
|
+
}
|
|
1625
|
+
},
|
|
1626
|
+
{
|
|
1627
|
+
"name": "k8s",
|
|
1628
|
+
"plugin": "extract-k8s",
|
|
1629
|
+
"summary": "Reads Kubernetes manifests into the names a service answers on and the in-cluster names it dials; values and secrets are never kept.",
|
|
1630
|
+
"category": "infrastructure",
|
|
1631
|
+
"phases": [
|
|
1632
|
+
"extract"
|
|
1633
|
+
],
|
|
1634
|
+
"runtime": "wasm",
|
|
1635
|
+
"source": "plugins/extract-k8s",
|
|
1636
|
+
"options": {
|
|
1637
|
+
"type": "object",
|
|
1638
|
+
"additionalProperties": false,
|
|
1639
|
+
"properties": {
|
|
1640
|
+
"context": {
|
|
1641
|
+
"type": "string",
|
|
1642
|
+
"description": "Slug of the bounded context this service belongs to. Defaults to the name of the input directory.",
|
|
1643
|
+
"examples": [
|
|
1644
|
+
"shop"
|
|
1645
|
+
]
|
|
1646
|
+
},
|
|
1647
|
+
"service": {
|
|
1648
|
+
"type": "string",
|
|
1649
|
+
"description": "Slug of the service. Defaults to the name of the input directory. The workload is found by this name: a Deployment, StatefulSet, DaemonSet, Job or CronJob called so, or labelled so with `app` or `app.kubernetes.io/name`; when the tree holds exactly one workload, that one.",
|
|
1650
|
+
"examples": [
|
|
1651
|
+
"pricing"
|
|
1652
|
+
]
|
|
1653
|
+
},
|
|
1654
|
+
"paths": {
|
|
1655
|
+
"type": "array",
|
|
1656
|
+
"items": {
|
|
1657
|
+
"type": "string"
|
|
1658
|
+
},
|
|
1659
|
+
"description": "Directories under the input root that hold the manifests, so a repository's other YAML - compose files, CI, buf - is not walked. Left out, the whole root is read and anything without `apiVersion` and `kind` is passed over.",
|
|
1660
|
+
"examples": [
|
|
1661
|
+
[
|
|
1662
|
+
"deploy/k8s"
|
|
1663
|
+
]
|
|
1664
|
+
]
|
|
1665
|
+
},
|
|
1666
|
+
"namespace": {
|
|
1667
|
+
"type": "string",
|
|
1668
|
+
"description": "Read only the objects in this namespace. An object that names no namespace is read either way. Left out, every namespace.",
|
|
1669
|
+
"examples": [
|
|
1670
|
+
"shop"
|
|
1671
|
+
]
|
|
1672
|
+
},
|
|
1673
|
+
"out": {
|
|
1674
|
+
"type": "string",
|
|
1675
|
+
"description": "Name of the fragment file, inside the step's output directory.",
|
|
1676
|
+
"default": "k8s.json"
|
|
1677
|
+
}
|
|
1678
|
+
}
|
|
1679
|
+
}
|
|
1680
|
+
},
|
|
1681
|
+
{
|
|
1682
|
+
"name": "argocd-gitops",
|
|
1683
|
+
"plugin": "extract-argocd",
|
|
1684
|
+
"summary": "Reads the Argo CD Applications and ApplicationSets in a GitOps tree into the deployments they declare - which service, from where, into which cluster and namespace - expanding list, git and matrix generators against the tree.",
|
|
1685
|
+
"category": "infrastructure",
|
|
1686
|
+
"phases": [
|
|
1687
|
+
"extract"
|
|
1688
|
+
],
|
|
1689
|
+
"runtime": "wasm",
|
|
1690
|
+
"source": "plugins/extract-argocd",
|
|
1691
|
+
"options": {
|
|
1692
|
+
"type": "object",
|
|
1693
|
+
"additionalProperties": false,
|
|
1694
|
+
"properties": {
|
|
1695
|
+
"repo": {
|
|
1696
|
+
"type": "string",
|
|
1697
|
+
"description": "The repository this tree is, spelled the way `Service.repo` spells it. A git generator pointing at another repository cannot be walked and is passed over with a warning; left out, every git generator is taken to mean this tree.",
|
|
1698
|
+
"examples": [
|
|
1699
|
+
"github.com/acme/gitops"
|
|
1700
|
+
]
|
|
1701
|
+
},
|
|
1702
|
+
"paths": {
|
|
1703
|
+
"type": "array",
|
|
1704
|
+
"items": {
|
|
1705
|
+
"type": "string"
|
|
1706
|
+
},
|
|
1707
|
+
"description": "Directories under the input root that hold the Applications and ApplicationSets, so overlays and charts beside them are not read for Argo CD objects. Left out, the whole root is walked.",
|
|
1708
|
+
"examples": [
|
|
1709
|
+
[
|
|
1710
|
+
"bootstrap",
|
|
1711
|
+
"appsets"
|
|
1712
|
+
]
|
|
1713
|
+
]
|
|
1714
|
+
},
|
|
1715
|
+
"environmentLabel": {
|
|
1716
|
+
"type": "string",
|
|
1717
|
+
"default": "env",
|
|
1718
|
+
"description": "The Application label that names the environment. An Application without it is placed by the cluster it deploys to."
|
|
1719
|
+
},
|
|
1720
|
+
"labels": {
|
|
1721
|
+
"type": "object",
|
|
1722
|
+
"additionalProperties": false,
|
|
1723
|
+
"description": "Which Application labels name the service it deploys. The defaults are the Kubernetes recommended labels, the same ones fetch-argocd and fetch-k8s read.",
|
|
1724
|
+
"properties": {
|
|
1725
|
+
"context": {
|
|
1726
|
+
"type": "string",
|
|
1727
|
+
"description": "The label whose value is the bounded context's slug.",
|
|
1728
|
+
"default": "app.kubernetes.io/part-of"
|
|
1729
|
+
},
|
|
1730
|
+
"service": {
|
|
1731
|
+
"type": "string",
|
|
1732
|
+
"description": "The label whose value is the service's slug.",
|
|
1733
|
+
"default": "app.kubernetes.io/name"
|
|
1734
|
+
}
|
|
1735
|
+
}
|
|
1736
|
+
},
|
|
1737
|
+
"out": {
|
|
1738
|
+
"type": "string",
|
|
1739
|
+
"description": "Name of the fragment file, inside the step's output directory.",
|
|
1740
|
+
"default": "argocd.json"
|
|
1741
|
+
}
|
|
1742
|
+
}
|
|
1743
|
+
}
|
|
1744
|
+
},
|
|
1745
|
+
{
|
|
1746
|
+
"name": "asyncapi",
|
|
1747
|
+
"plugin": "extract-asyncapi",
|
|
1748
|
+
"summary": "Reads an AsyncAPI document and answers with the channels a service publishes on and listens to.",
|
|
1749
|
+
"category": "contracts",
|
|
1750
|
+
"phases": [
|
|
1751
|
+
"extract"
|
|
1752
|
+
],
|
|
1753
|
+
"runtime": "wasm",
|
|
1754
|
+
"source": "plugins/extract-asyncapi",
|
|
1755
|
+
"options": {
|
|
1756
|
+
"type": "object",
|
|
1757
|
+
"additionalProperties": false,
|
|
1758
|
+
"properties": {
|
|
1759
|
+
"context": {
|
|
1760
|
+
"type": "string",
|
|
1761
|
+
"description": "Slug of the bounded context that owns the service this document belongs to. Defaults to the name of the input directory.",
|
|
1762
|
+
"examples": [
|
|
1763
|
+
"shop"
|
|
1764
|
+
]
|
|
1765
|
+
},
|
|
1766
|
+
"service": {
|
|
1767
|
+
"type": "string",
|
|
1768
|
+
"description": "Slug of the service the document describes. Defaults to the name of the input directory.",
|
|
1769
|
+
"examples": [
|
|
1770
|
+
"cart"
|
|
1771
|
+
]
|
|
1772
|
+
},
|
|
1773
|
+
"spec": {
|
|
1774
|
+
"type": "string",
|
|
1775
|
+
"description": "The AsyncAPI document, relative to the input root. Left out, the extractor looks for one.",
|
|
1776
|
+
"examples": [
|
|
1777
|
+
"src/infrastructure/bus/gen/asyncapi.yaml"
|
|
1778
|
+
]
|
|
1779
|
+
},
|
|
1780
|
+
"out": {
|
|
1781
|
+
"type": "string",
|
|
1782
|
+
"description": "Name of the fragment file, inside the step's output directory.",
|
|
1783
|
+
"default": "bus.json"
|
|
1784
|
+
}
|
|
1785
|
+
}
|
|
1786
|
+
}
|
|
1787
|
+
},
|
|
1788
|
+
{
|
|
1789
|
+
"name": "graphql",
|
|
1790
|
+
"plugin": "extract-graphql",
|
|
1791
|
+
"summary": "Reads a GraphQL schema and answers with the interfaces a service provides, one per schema module.",
|
|
1792
|
+
"category": "contracts",
|
|
1793
|
+
"phases": [
|
|
1794
|
+
"extract"
|
|
1795
|
+
],
|
|
1796
|
+
"runtime": "wasm",
|
|
1797
|
+
"source": "plugins/extract-graphql",
|
|
1798
|
+
"options": {
|
|
1799
|
+
"type": "object",
|
|
1800
|
+
"additionalProperties": false,
|
|
1801
|
+
"properties": {
|
|
1802
|
+
"context": {
|
|
1803
|
+
"type": "string",
|
|
1804
|
+
"description": "Slug of the bounded context that owns the service this schema belongs to. Defaults to the name of the input directory.",
|
|
1805
|
+
"examples": [
|
|
1806
|
+
"storefront"
|
|
1807
|
+
]
|
|
1808
|
+
},
|
|
1809
|
+
"service": {
|
|
1810
|
+
"type": "string",
|
|
1811
|
+
"description": "Slug of the service the schema describes. Defaults to the name of the input directory.",
|
|
1812
|
+
"examples": [
|
|
1813
|
+
"bff"
|
|
1814
|
+
]
|
|
1815
|
+
},
|
|
1816
|
+
"schema": {
|
|
1817
|
+
"type": "string",
|
|
1818
|
+
"description": "The schema, relative to the input root: one .graphql document, or a directory of them read together. Left out, the extractor looks for them.",
|
|
1819
|
+
"examples": [
|
|
1820
|
+
"src/schema"
|
|
1821
|
+
]
|
|
1822
|
+
},
|
|
1823
|
+
"api": {
|
|
1824
|
+
"type": "string",
|
|
1825
|
+
"description": "Prefix for the ids of the interfaces this produces. Left out, it is the service and a major version: bff gives bff.v1, and a module called basket gives bff.v1.Basket.",
|
|
1826
|
+
"examples": [
|
|
1827
|
+
"storefront.v1"
|
|
1828
|
+
]
|
|
1829
|
+
},
|
|
1830
|
+
"out": {
|
|
1831
|
+
"type": "string",
|
|
1832
|
+
"description": "Name of the fragment file, inside the step's output directory.",
|
|
1833
|
+
"default": "graphql.json"
|
|
1834
|
+
}
|
|
1835
|
+
}
|
|
1836
|
+
}
|
|
1837
|
+
},
|
|
1838
|
+
{
|
|
1839
|
+
"name": "sql",
|
|
1840
|
+
"plugin": "extract-sql",
|
|
1841
|
+
"summary": "Reads a service's migrations and Go repository SQL into the store it builds: tables, columns, keys, persisted aggregates, and the methods that read or write each table.",
|
|
1842
|
+
"category": "data",
|
|
1843
|
+
"phases": [
|
|
1844
|
+
"extract"
|
|
1845
|
+
],
|
|
1846
|
+
"runtime": "wasm",
|
|
1847
|
+
"source": "plugins/extract-sql",
|
|
1848
|
+
"options": {
|
|
1849
|
+
"type": "object",
|
|
1850
|
+
"additionalProperties": false,
|
|
1851
|
+
"properties": {
|
|
1852
|
+
"context": {
|
|
1853
|
+
"type": "string",
|
|
1854
|
+
"description": "Slug of the bounded context that owns the service these migrations belong to. Defaults to the name of the input directory.",
|
|
1855
|
+
"examples": [
|
|
1856
|
+
"auth"
|
|
1857
|
+
]
|
|
1858
|
+
},
|
|
1859
|
+
"service": {
|
|
1860
|
+
"type": "string",
|
|
1861
|
+
"description": "Slug of the service that owns the database. A store belongs to exactly one service. Defaults to the name of the input directory.",
|
|
1862
|
+
"examples": [
|
|
1863
|
+
"auth"
|
|
1864
|
+
]
|
|
1865
|
+
},
|
|
1866
|
+
"store": {
|
|
1867
|
+
"type": "string",
|
|
1868
|
+
"description": "Slug of the database these migrations build. One service can keep state in more than one, and a slug is how the two are told apart. Give the go-domain extractor the same one.",
|
|
1869
|
+
"default": "pg"
|
|
1870
|
+
},
|
|
1871
|
+
"name": {
|
|
1872
|
+
"type": "string",
|
|
1873
|
+
"description": "What the database is called on the page.",
|
|
1874
|
+
"examples": [
|
|
1875
|
+
"Auth database"
|
|
1876
|
+
]
|
|
1877
|
+
},
|
|
1878
|
+
"kind": {
|
|
1879
|
+
"enum": [
|
|
1880
|
+
"postgres",
|
|
1881
|
+
"mysql",
|
|
1882
|
+
"sqlite",
|
|
1883
|
+
"redis",
|
|
1884
|
+
"mongodb",
|
|
1885
|
+
"clickhouse",
|
|
1886
|
+
"s3",
|
|
1887
|
+
"other"
|
|
1888
|
+
],
|
|
1889
|
+
"description": "What kind of store it is.",
|
|
1890
|
+
"default": "postgres"
|
|
1891
|
+
},
|
|
1892
|
+
"repositories": {
|
|
1893
|
+
"type": "string",
|
|
1894
|
+
"description": "Optional adapter root relative to the input root: either one package per aggregate with migrations below each package, or one feature repository package with migrations directly below it. When omitted, Go layouts are discovered under both internal/infrastructure/repository/<aggregate> and internal/<aggregate>/infrastructure/repository. The migrations and repository writes determine which aggregate and fields the tables persist."
|
|
1895
|
+
},
|
|
1896
|
+
"projectors": {
|
|
1897
|
+
"type": "string",
|
|
1898
|
+
"description": "Optional projector root relative to the input root, using the same collection-or-feature-package convention as repositories. When omitted, horizontal and feature-sliced Go projector packages are discovered. Every table created there gets the role projection. Its aggregate is read from a `-- aggregate: <id>` line above CREATE TABLE; columns copied from elsewhere carry `-- from:`."
|
|
1899
|
+
},
|
|
1900
|
+
"out": {
|
|
1901
|
+
"type": "string",
|
|
1902
|
+
"description": "Name of the fragment file, inside the step's output directory.",
|
|
1903
|
+
"default": "stores.json"
|
|
1904
|
+
}
|
|
1905
|
+
}
|
|
1906
|
+
}
|
|
1907
|
+
},
|
|
1908
|
+
{
|
|
1909
|
+
"name": "markdown",
|
|
1910
|
+
"plugin": "gen-markdown",
|
|
1911
|
+
"summary": "Renders the merged catalog as a directory of markdown: a page per context, service, aggregate, store and flow.",
|
|
1912
|
+
"category": "exports",
|
|
1913
|
+
"phases": [
|
|
1914
|
+
"generate"
|
|
1915
|
+
],
|
|
1916
|
+
"runtime": "wasm",
|
|
1917
|
+
"source": "plugins/gen-markdown",
|
|
1918
|
+
"options": {
|
|
1919
|
+
"type": "object",
|
|
1920
|
+
"additionalProperties": false,
|
|
1921
|
+
"properties": {
|
|
1922
|
+
"title": {
|
|
1923
|
+
"type": "string",
|
|
1924
|
+
"description": "Heading of the index page. The catalog does not name the estate, so this is the one thing the generator cannot derive.",
|
|
1925
|
+
"examples": [
|
|
1926
|
+
"Example estate"
|
|
1927
|
+
]
|
|
1928
|
+
},
|
|
1929
|
+
"sourceBaseUrl": {
|
|
1930
|
+
"type": "string",
|
|
1931
|
+
"description": "Stable forge tree URL used to link source locations, for example https://github.com/acme/shop/blob/main. External repositories use their immutable catalog pins.",
|
|
1932
|
+
"examples": [
|
|
1933
|
+
"https://github.com/acme/shop/blob/main"
|
|
1934
|
+
]
|
|
1935
|
+
}
|
|
1936
|
+
}
|
|
1937
|
+
}
|
|
1938
|
+
},
|
|
1939
|
+
{
|
|
1940
|
+
"name": "mermaid",
|
|
1941
|
+
"plugin": "gen-mermaid",
|
|
1942
|
+
"summary": "Exports every flow as a standalone Mermaid sequence diagram.",
|
|
1943
|
+
"category": "exports",
|
|
1944
|
+
"phases": [
|
|
1945
|
+
"generate"
|
|
1946
|
+
],
|
|
1947
|
+
"runtime": "wasm",
|
|
1948
|
+
"source": "plugins/gen-mermaid",
|
|
1949
|
+
"options": {
|
|
1950
|
+
"type": "object",
|
|
1951
|
+
"additionalProperties": false,
|
|
1952
|
+
"properties": {
|
|
1953
|
+
"title": {
|
|
1954
|
+
"type": "string",
|
|
1955
|
+
"description": "Heading of the Mermaid bundle index."
|
|
1956
|
+
}
|
|
1957
|
+
}
|
|
1958
|
+
}
|
|
1959
|
+
},
|
|
1960
|
+
{
|
|
1961
|
+
"name": "backstage",
|
|
1962
|
+
"plugin": "gen-backstage",
|
|
1963
|
+
"summary": "Exports contexts, services, APIs, stores and schema modules as a Backstage catalog.",
|
|
1964
|
+
"category": "exports",
|
|
1965
|
+
"phases": [
|
|
1966
|
+
"generate"
|
|
1967
|
+
],
|
|
1968
|
+
"runtime": "wasm",
|
|
1969
|
+
"source": "plugins/gen-backstage",
|
|
1970
|
+
"options": {
|
|
1971
|
+
"type": "object",
|
|
1972
|
+
"additionalProperties": false,
|
|
1973
|
+
"properties": {
|
|
1974
|
+
"domain": {
|
|
1975
|
+
"type": "string",
|
|
1976
|
+
"description": "Backstage metadata.name for the domain containing the exported systems.",
|
|
1977
|
+
"default": "architecture"
|
|
1978
|
+
},
|
|
1979
|
+
"domainTitle": {
|
|
1980
|
+
"type": "string",
|
|
1981
|
+
"description": "Human-readable title of the Backstage domain.",
|
|
1982
|
+
"default": "Architecture"
|
|
1983
|
+
},
|
|
1984
|
+
"owner": {
|
|
1985
|
+
"type": "string",
|
|
1986
|
+
"description": "Fallback Backstage owner for entities without a CODEOWNERS handle.",
|
|
1987
|
+
"default": "architecture"
|
|
1988
|
+
},
|
|
1989
|
+
"lifecycle": {
|
|
1990
|
+
"type": "string",
|
|
1991
|
+
"description": "Lifecycle written on Backstage Components and APIs.",
|
|
1992
|
+
"default": "production"
|
|
1993
|
+
},
|
|
1994
|
+
"sourceBaseUrl": {
|
|
1995
|
+
"type": "string",
|
|
1996
|
+
"description": "Stable forge tree URL used for Backstage source-location annotations."
|
|
1997
|
+
}
|
|
1998
|
+
}
|
|
1999
|
+
}
|
|
2000
|
+
},
|
|
2001
|
+
{
|
|
2002
|
+
"name": "otel",
|
|
2003
|
+
"plugin": "verify-otel",
|
|
2004
|
+
"summary": "Reads OpenTelemetry traces against the catalog and says which hops have been seen running.",
|
|
2005
|
+
"category": "evidence",
|
|
2006
|
+
"phases": [
|
|
2007
|
+
"verify"
|
|
2008
|
+
],
|
|
2009
|
+
"runtime": "wasm",
|
|
2010
|
+
"source": "plugins/verify-otel",
|
|
2011
|
+
"options": {
|
|
2012
|
+
"type": "object",
|
|
2013
|
+
"additionalProperties": false,
|
|
2014
|
+
"required": [
|
|
2015
|
+
"traces"
|
|
2016
|
+
],
|
|
2017
|
+
"properties": {
|
|
2018
|
+
"traces": {
|
|
2019
|
+
"type": "array",
|
|
2020
|
+
"minItems": 1,
|
|
2021
|
+
"items": {
|
|
2022
|
+
"type": "string"
|
|
2023
|
+
},
|
|
2024
|
+
"description": "The recordings to read, as globs relative to the input root. OTLP JSON, one batch per file or one per line.",
|
|
2025
|
+
"examples": [
|
|
2026
|
+
[
|
|
2027
|
+
"telemetry/traces.jsonl"
|
|
2028
|
+
]
|
|
2029
|
+
]
|
|
2030
|
+
},
|
|
2031
|
+
"services": {
|
|
2032
|
+
"type": "object",
|
|
2033
|
+
"additionalProperties": {
|
|
2034
|
+
"type": "string"
|
|
2035
|
+
},
|
|
2036
|
+
"description": "Which catalog service a resource's service.name belongs to, for an estate where the two differ. Without a line here a name is matched to the one service whose slug it is.",
|
|
2037
|
+
"examples": [
|
|
2038
|
+
{
|
|
2039
|
+
"auth-api": "auth.auth"
|
|
2040
|
+
}
|
|
2041
|
+
]
|
|
2042
|
+
},
|
|
2043
|
+
"events": {
|
|
2044
|
+
"type": "object",
|
|
2045
|
+
"additionalProperties": {
|
|
2046
|
+
"type": "string"
|
|
2047
|
+
},
|
|
2048
|
+
"description": "Which catalog event a wire name belongs to, for an estate where the event does not declare its wire name and the last segment of the event.name attribute is not the event's name in the model.",
|
|
2049
|
+
"examples": [
|
|
2050
|
+
{
|
|
2051
|
+
"auth.PasswordChanged": "auth.auth.PasswordChanged"
|
|
2052
|
+
}
|
|
2053
|
+
]
|
|
2054
|
+
},
|
|
2055
|
+
"examples": {
|
|
2056
|
+
"type": "integer",
|
|
2057
|
+
"minimum": 0,
|
|
2058
|
+
"description": "How many recordings a flow keeps as examples of itself running: the ones that show the most of it, earliest first. Five when unset; zero keeps none.",
|
|
2059
|
+
"examples": [
|
|
2060
|
+
3
|
|
2061
|
+
]
|
|
2062
|
+
},
|
|
2063
|
+
"out": {
|
|
2064
|
+
"type": "string",
|
|
2065
|
+
"description": "Name of the fragment file, inside the step's output directory."
|
|
2066
|
+
}
|
|
2067
|
+
}
|
|
2068
|
+
}
|
|
2069
|
+
},
|
|
2070
|
+
{
|
|
2071
|
+
"name": "codeowners",
|
|
2072
|
+
"plugin": "verify-codeowners",
|
|
2073
|
+
"summary": "Reads the repository's CODEOWNERS against the catalog: who to ask about each service, which services nobody owns, and which rules own nothing.",
|
|
2074
|
+
"category": "evidence",
|
|
2075
|
+
"phases": [
|
|
2076
|
+
"verify"
|
|
2077
|
+
],
|
|
2078
|
+
"runtime": "wasm",
|
|
2079
|
+
"source": "plugins/verify-codeowners",
|
|
2080
|
+
"options": {
|
|
2081
|
+
"type": "object",
|
|
2082
|
+
"additionalProperties": false,
|
|
2083
|
+
"properties": {
|
|
2084
|
+
"file": {
|
|
2085
|
+
"type": "string",
|
|
2086
|
+
"description": "The CODEOWNERS to read, relative to the input root. Left out, the three places a forge looks, in order: CODEOWNERS, .github/CODEOWNERS, docs/CODEOWNERS. Its patterns are matched against each service's path as the catalog holds it, so they are repository-relative wherever the file itself sits.",
|
|
2087
|
+
"examples": [
|
|
2088
|
+
"CODEOWNERS",
|
|
2089
|
+
".github/CODEOWNERS"
|
|
2090
|
+
]
|
|
2091
|
+
},
|
|
2092
|
+
"out": {
|
|
2093
|
+
"type": "string",
|
|
2094
|
+
"description": "Name of the fragment file, inside the step's output directory. Left out, owners.json."
|
|
2095
|
+
}
|
|
2096
|
+
}
|
|
2097
|
+
}
|
|
2098
|
+
},
|
|
2099
|
+
{
|
|
2100
|
+
"name": "adr",
|
|
2101
|
+
"plugin": "extract-adr",
|
|
2102
|
+
"summary": "Reads decision records written by hand - MADR, adr-tools and common ADR-numbered Markdown variants - into a catalog fragment.",
|
|
2103
|
+
"category": "documents",
|
|
2104
|
+
"phases": [
|
|
2105
|
+
"extract"
|
|
2106
|
+
],
|
|
2107
|
+
"needs": [
|
|
2108
|
+
"history"
|
|
2109
|
+
],
|
|
2110
|
+
"runtime": "wasm",
|
|
2111
|
+
"source": "plugins/extract-adr",
|
|
2112
|
+
"options": {
|
|
2113
|
+
"type": "object",
|
|
2114
|
+
"additionalProperties": false,
|
|
2115
|
+
"properties": {
|
|
2116
|
+
"files": {
|
|
2117
|
+
"type": "array",
|
|
2118
|
+
"items": {
|
|
2119
|
+
"type": "string"
|
|
2120
|
+
},
|
|
2121
|
+
"description": "The record files to read, as globs relative to the input root. A README.md among them is an index rather than a record and is skipped. Left out, every docs/adr/*.md.",
|
|
2122
|
+
"examples": [
|
|
2123
|
+
[
|
|
2124
|
+
"docs/adr/*.md"
|
|
2125
|
+
],
|
|
2126
|
+
[
|
|
2127
|
+
"adr/*.md"
|
|
2128
|
+
]
|
|
2129
|
+
]
|
|
2130
|
+
},
|
|
2131
|
+
"scope": {
|
|
2132
|
+
"type": "string",
|
|
2133
|
+
"description": "What a record is about when it does not say so itself: \"org\", a context slug, or \"<context>.<service>\". A record written by adr-tools has no scope of its own and takes its id's prefix from here; a MADR record with a Scope bullet keeps its own.",
|
|
2134
|
+
"examples": [
|
|
2135
|
+
"avia.aviasupp",
|
|
2136
|
+
"payments",
|
|
2137
|
+
"org"
|
|
2138
|
+
]
|
|
2139
|
+
},
|
|
2140
|
+
"history": {
|
|
2141
|
+
"enum": [
|
|
2142
|
+
"git",
|
|
2143
|
+
"none"
|
|
2144
|
+
],
|
|
2145
|
+
"description": "Where a record's author and dates come from. \"git\", the default, reads the file's commits: who first added it and who last touched it. \"none\" reads nothing, for a tree that is not a checkout or a fragment that must not change when the history does.",
|
|
2146
|
+
"default": "git"
|
|
2147
|
+
},
|
|
2148
|
+
"out": {
|
|
2149
|
+
"type": "string",
|
|
2150
|
+
"description": "Name of the fragment file, inside the step's output directory. Left out, adr.json."
|
|
2151
|
+
}
|
|
2152
|
+
}
|
|
2153
|
+
}
|
|
2154
|
+
},
|
|
2155
|
+
{
|
|
2156
|
+
"name": "glossary",
|
|
2157
|
+
"plugin": "extract-glossary",
|
|
2158
|
+
"summary": "Reads a context's GLOSSARY.md - one paragraph per term, what it is and what it is not - into a catalog fragment.",
|
|
2159
|
+
"category": "documents",
|
|
2160
|
+
"phases": [
|
|
2161
|
+
"extract"
|
|
2162
|
+
],
|
|
2163
|
+
"runtime": "wasm",
|
|
2164
|
+
"source": "plugins/extract-glossary",
|
|
2165
|
+
"options": {
|
|
2166
|
+
"type": "object",
|
|
2167
|
+
"additionalProperties": false,
|
|
2168
|
+
"properties": {
|
|
2169
|
+
"context": {
|
|
2170
|
+
"type": "string",
|
|
2171
|
+
"description": "Slug of the bounded context whose vocabulary this is. A glossary sits beside a service, and the words in it belong to the context that service is in, so shop/oms/GLOSSARY.md is read as shop. Left out, the name of the input directory.",
|
|
2172
|
+
"examples": [
|
|
2173
|
+
"auth",
|
|
2174
|
+
"shop"
|
|
2175
|
+
]
|
|
2176
|
+
},
|
|
2177
|
+
"files": {
|
|
2178
|
+
"type": "array",
|
|
2179
|
+
"items": {
|
|
2180
|
+
"type": "string"
|
|
2181
|
+
},
|
|
2182
|
+
"description": "The glossaries to read, as globs relative to the input root. Left out, GLOSSARY.md at the root of it.",
|
|
2183
|
+
"examples": [
|
|
2184
|
+
[
|
|
2185
|
+
"GLOSSARY.md"
|
|
2186
|
+
],
|
|
2187
|
+
[
|
|
2188
|
+
"docs/GLOSSARY.md"
|
|
2189
|
+
]
|
|
2190
|
+
]
|
|
2191
|
+
},
|
|
2192
|
+
"out": {
|
|
2193
|
+
"type": "string",
|
|
2194
|
+
"description": "Name of the fragment file, inside the step's output directory. Left out, glossary.json."
|
|
2195
|
+
}
|
|
2196
|
+
}
|
|
2197
|
+
}
|
|
2198
|
+
},
|
|
2199
|
+
{
|
|
2200
|
+
"name": "flows",
|
|
2201
|
+
"plugin": "extract-flows",
|
|
2202
|
+
"summary": "Reads flows written by hand as *.flow.md - one line per hop, frames closed by end - into a catalog fragment.",
|
|
2203
|
+
"category": "documents",
|
|
2204
|
+
"phases": [
|
|
2205
|
+
"extract"
|
|
2206
|
+
],
|
|
2207
|
+
"runtime": "wasm",
|
|
2208
|
+
"source": "plugins/extract-flows",
|
|
2209
|
+
"options": {
|
|
2210
|
+
"type": "object",
|
|
2211
|
+
"additionalProperties": false,
|
|
2212
|
+
"properties": {
|
|
2213
|
+
"files": {
|
|
2214
|
+
"type": "array",
|
|
2215
|
+
"items": {
|
|
2216
|
+
"type": "string"
|
|
2217
|
+
},
|
|
2218
|
+
"description": "The flow files to read, as globs relative to the input root. Left out, every *.flow.md directly under the root.",
|
|
2219
|
+
"examples": [
|
|
2220
|
+
[
|
|
2221
|
+
"*.flow.md"
|
|
2222
|
+
]
|
|
2223
|
+
]
|
|
2224
|
+
},
|
|
2225
|
+
"out": {
|
|
2226
|
+
"type": "string",
|
|
2227
|
+
"description": "Name of the fragment file, inside the step's output directory. Left out, flows.json."
|
|
2228
|
+
}
|
|
2229
|
+
}
|
|
2230
|
+
}
|
|
2231
|
+
},
|
|
2232
|
+
{
|
|
2233
|
+
"name": "bsr",
|
|
2234
|
+
"plugin": "fetch-bsr",
|
|
2235
|
+
"summary": "Fetches pinned modules from a Buf Schema Registry into the tree, with a lock beside each, so the proto extractor can read a published contract.",
|
|
2236
|
+
"category": "sources",
|
|
2237
|
+
"phases": [
|
|
2238
|
+
"extract"
|
|
2239
|
+
],
|
|
2240
|
+
"runtime": "host",
|
|
2241
|
+
"source": "scripts/host-plugins/fetch-bsr.mjs",
|
|
2242
|
+
"options": {
|
|
2243
|
+
"type": "object",
|
|
2244
|
+
"additionalProperties": false,
|
|
2245
|
+
"required": [
|
|
2246
|
+
"modules",
|
|
2247
|
+
"cache"
|
|
2248
|
+
],
|
|
2249
|
+
"properties": {
|
|
2250
|
+
"modules": {
|
|
2251
|
+
"type": "array",
|
|
2252
|
+
"minItems": 1,
|
|
2253
|
+
"description": "The modules to fetch, each pinned to a commit.",
|
|
2254
|
+
"items": {
|
|
2255
|
+
"type": "object",
|
|
2256
|
+
"additionalProperties": false,
|
|
2257
|
+
"required": [
|
|
2258
|
+
"module"
|
|
2259
|
+
],
|
|
2260
|
+
"properties": {
|
|
2261
|
+
"module": {
|
|
2262
|
+
"type": "string",
|
|
2263
|
+
"description": "The module's registry-global name: registry, owner and name.",
|
|
2264
|
+
"examples": [
|
|
2265
|
+
"buf.build/shortlink-org/portolan-shop-order"
|
|
2266
|
+
]
|
|
2267
|
+
},
|
|
2268
|
+
"commit": {
|
|
2269
|
+
"type": "string",
|
|
2270
|
+
"description": "The commit to fetch. A BSR commit is immutable, so a pinned fetch is byte-reproducible, which is what lets an offline run replay it from the tree. Left out, `ref` is resolved online and warned about, and refused offline."
|
|
2271
|
+
},
|
|
2272
|
+
"ref": {
|
|
2273
|
+
"type": "string",
|
|
2274
|
+
"description": "The label to resolve when there is no commit. Defaults to main."
|
|
2275
|
+
},
|
|
2276
|
+
"paths": {
|
|
2277
|
+
"type": "array",
|
|
2278
|
+
"items": {
|
|
2279
|
+
"type": "string"
|
|
2280
|
+
},
|
|
2281
|
+
"description": "Directories of the module to keep, relative to its root; the rest is left behind. Left out, the whole module.",
|
|
2282
|
+
"examples": [
|
|
2283
|
+
[
|
|
2284
|
+
"shop/v1"
|
|
2285
|
+
]
|
|
2286
|
+
]
|
|
2287
|
+
}
|
|
2288
|
+
}
|
|
2289
|
+
}
|
|
2290
|
+
},
|
|
2291
|
+
"registry": {
|
|
2292
|
+
"type": "string",
|
|
2293
|
+
"description": "Overrides the registry in every module name, for a self-hosted BSR: a host, or a URL when it is not https."
|
|
2294
|
+
},
|
|
2295
|
+
"cache": {
|
|
2296
|
+
"type": "string",
|
|
2297
|
+
"description": "Where the last run's files were written, repo-relative: the same path as the step's out. An offline run replays what is there and checks it against the lock beside it."
|
|
2298
|
+
}
|
|
2299
|
+
}
|
|
2300
|
+
}
|
|
2301
|
+
},
|
|
2302
|
+
{
|
|
2303
|
+
"name": "git",
|
|
2304
|
+
"plugin": "fetch-git",
|
|
2305
|
+
"summary": "Fetches pinned directories of another git repository into the tree, with a lock, so extractors can read a service that lives elsewhere.",
|
|
2306
|
+
"category": "sources",
|
|
2307
|
+
"phases": [
|
|
2308
|
+
"extract"
|
|
2309
|
+
],
|
|
2310
|
+
"runtime": "host",
|
|
2311
|
+
"source": "scripts/host-plugins/fetch-git.mjs",
|
|
2312
|
+
"options": {
|
|
2313
|
+
"type": "object",
|
|
2314
|
+
"additionalProperties": false,
|
|
2315
|
+
"required": [
|
|
2316
|
+
"repos",
|
|
2317
|
+
"cache"
|
|
2318
|
+
],
|
|
2319
|
+
"properties": {
|
|
2320
|
+
"repos": {
|
|
2321
|
+
"type": "array",
|
|
2322
|
+
"minItems": 1,
|
|
2323
|
+
"description": "The repositories to fetch, each pinned to a commit.",
|
|
2324
|
+
"items": {
|
|
2325
|
+
"type": "object",
|
|
2326
|
+
"additionalProperties": false,
|
|
2327
|
+
"required": [
|
|
2328
|
+
"repo"
|
|
2329
|
+
],
|
|
2330
|
+
"properties": {
|
|
2331
|
+
"repo": {
|
|
2332
|
+
"type": "string",
|
|
2333
|
+
"description": "Where the repository is: github.com/acme/shop, or any URL git accepts (https://, ssh://, git@host:owner/name).",
|
|
2334
|
+
"examples": [
|
|
2335
|
+
"github.com/acme/shop"
|
|
2336
|
+
]
|
|
2337
|
+
},
|
|
2338
|
+
"commit": {
|
|
2339
|
+
"type": "string",
|
|
2340
|
+
"description": "The commit to fetch. A pinned fetch is byte-reproducible, which is what lets an offline run replay it from the tree. Left out, `ref` is resolved online and warned about, and refused offline."
|
|
2341
|
+
},
|
|
2342
|
+
"ref": {
|
|
2343
|
+
"type": "string",
|
|
2344
|
+
"description": "The branch or tag to resolve when there is no commit. Defaults to the remote's HEAD."
|
|
2345
|
+
},
|
|
2346
|
+
"paths": {
|
|
2347
|
+
"type": "array",
|
|
2348
|
+
"items": {
|
|
2349
|
+
"type": "string"
|
|
2350
|
+
},
|
|
2351
|
+
"description": "Directories to copy, relative to the repository's root; the rest is left behind. Left out, the whole tree.",
|
|
2352
|
+
"examples": [
|
|
2353
|
+
[
|
|
2354
|
+
"services/oms",
|
|
2355
|
+
"proto"
|
|
2356
|
+
]
|
|
2357
|
+
]
|
|
2358
|
+
}
|
|
2359
|
+
}
|
|
2360
|
+
}
|
|
2361
|
+
},
|
|
2362
|
+
"cache": {
|
|
2363
|
+
"type": "string",
|
|
2364
|
+
"description": "Where the last run's files were written, repo-relative: the same path as the step's out. An offline run replays what is there and checks it against the lock beside it."
|
|
2365
|
+
}
|
|
2366
|
+
}
|
|
2367
|
+
}
|
|
2368
|
+
},
|
|
2369
|
+
{
|
|
2370
|
+
"name": "csr",
|
|
2371
|
+
"plugin": "fetch-csr",
|
|
2372
|
+
"summary": "Fetches pinned subject versions from a Confluent Schema Registry into the tree, with a lock beside each, so a schema published to a registry can be read without talking to it.",
|
|
2373
|
+
"category": "sources",
|
|
2374
|
+
"phases": [
|
|
2375
|
+
"extract"
|
|
2376
|
+
],
|
|
2377
|
+
"runtime": "host",
|
|
2378
|
+
"source": "scripts/host-plugins/fetch-csr.mjs",
|
|
2379
|
+
"options": {
|
|
2380
|
+
"type": "object",
|
|
2381
|
+
"additionalProperties": false,
|
|
2382
|
+
"required": [
|
|
2383
|
+
"registry",
|
|
2384
|
+
"subjects",
|
|
2385
|
+
"cache"
|
|
2386
|
+
],
|
|
2387
|
+
"properties": {
|
|
2388
|
+
"registry": {
|
|
2389
|
+
"type": "string",
|
|
2390
|
+
"description": "Base URL of the schema registry. The credential for it is never written here: it comes from the environment, so this file stays committable.",
|
|
2391
|
+
"examples": [
|
|
2392
|
+
"http://localhost:8081",
|
|
2393
|
+
"https://psrc-00000.eu-central-1.aws.confluent.cloud"
|
|
2394
|
+
]
|
|
2395
|
+
},
|
|
2396
|
+
"subjects": {
|
|
2397
|
+
"type": "array",
|
|
2398
|
+
"minItems": 1,
|
|
2399
|
+
"description": "The subjects to fetch, each pinned to a version. A subject a fetched schema references is fetched too, pinned by the reference itself, and needs no entry here.",
|
|
2400
|
+
"items": {
|
|
2401
|
+
"type": "object",
|
|
2402
|
+
"additionalProperties": false,
|
|
2403
|
+
"required": [
|
|
2404
|
+
"subject"
|
|
2405
|
+
],
|
|
2406
|
+
"properties": {
|
|
2407
|
+
"subject": {
|
|
2408
|
+
"type": "string",
|
|
2409
|
+
"description": "The registry's own name for the registration: \"<topic>-value\" under TopicNameStrategy, the record's full name under RecordNameStrategy.",
|
|
2410
|
+
"examples": [
|
|
2411
|
+
"shop.oms.order-value",
|
|
2412
|
+
"shop.oms.OrderPlaced"
|
|
2413
|
+
]
|
|
2414
|
+
},
|
|
2415
|
+
"version": {
|
|
2416
|
+
"type": "integer",
|
|
2417
|
+
"minimum": 1,
|
|
2418
|
+
"description": "The version to fetch. A registered version is immutable, so a pinned fetch is byte-reproducible, which is what lets an offline run replay it from the tree. Left out, `latest` is resolved online and warned about, and refused offline."
|
|
2419
|
+
}
|
|
2420
|
+
}
|
|
2421
|
+
}
|
|
2422
|
+
},
|
|
2423
|
+
"cache": {
|
|
2424
|
+
"type": "string",
|
|
2425
|
+
"description": "Where the last run's files were written, repo-relative: the same path as the step's out. An offline run replays what is there and checks it against the lock beside it.",
|
|
2426
|
+
"examples": [
|
|
2427
|
+
"examples/shop/oms/vendor/schemas"
|
|
2428
|
+
]
|
|
2429
|
+
}
|
|
2430
|
+
}
|
|
2431
|
+
}
|
|
2432
|
+
},
|
|
2433
|
+
{
|
|
2434
|
+
"name": "k8s-cluster",
|
|
2435
|
+
"plugin": "fetch-k8s",
|
|
2436
|
+
"summary": "Reads the workloads, Services, Ingresses and routes of a live cluster through kubectl into the names each service answers on and dials; values and secrets are never kept.",
|
|
2437
|
+
"category": "infrastructure",
|
|
2438
|
+
"phases": [
|
|
2439
|
+
"extract"
|
|
2440
|
+
],
|
|
2441
|
+
"runtime": "host",
|
|
2442
|
+
"source": "scripts/host-plugins/fetch-k8s.mjs",
|
|
2443
|
+
"options": {
|
|
2444
|
+
"type": "object",
|
|
2445
|
+
"additionalProperties": false,
|
|
2446
|
+
"required": [
|
|
2447
|
+
"cache"
|
|
2448
|
+
],
|
|
2449
|
+
"properties": {
|
|
2450
|
+
"kubeContext": {
|
|
2451
|
+
"type": "string",
|
|
2452
|
+
"description": "The kubeconfig context to read, passed to kubectl as --context. Left out, kubectl's current context.",
|
|
2453
|
+
"examples": [
|
|
2454
|
+
"prod-eu"
|
|
2455
|
+
]
|
|
2456
|
+
},
|
|
2457
|
+
"namespaces": {
|
|
2458
|
+
"type": "array",
|
|
2459
|
+
"items": {
|
|
2460
|
+
"type": "string"
|
|
2461
|
+
},
|
|
2462
|
+
"description": "The namespaces to read. Left out, every namespace the credential can list.",
|
|
2463
|
+
"examples": [
|
|
2464
|
+
[
|
|
2465
|
+
"shop",
|
|
2466
|
+
"auth",
|
|
2467
|
+
"payments"
|
|
2468
|
+
]
|
|
2469
|
+
]
|
|
2470
|
+
},
|
|
2471
|
+
"labels": {
|
|
2472
|
+
"type": "object",
|
|
2473
|
+
"additionalProperties": false,
|
|
2474
|
+
"description": "Which labels place a workload into the catalog. The defaults are the Kubernetes recommended labels; an estate that labels differently names its own keys here.",
|
|
2475
|
+
"properties": {
|
|
2476
|
+
"context": {
|
|
2477
|
+
"type": "string",
|
|
2478
|
+
"description": "The label whose value is the bounded context's slug.",
|
|
2479
|
+
"default": "app.kubernetes.io/part-of"
|
|
2480
|
+
},
|
|
2481
|
+
"service": {
|
|
2482
|
+
"type": "string",
|
|
2483
|
+
"description": "The label whose value is the service's slug. A workload without it is named after itself.",
|
|
2484
|
+
"default": "app.kubernetes.io/name"
|
|
2485
|
+
}
|
|
2486
|
+
}
|
|
2487
|
+
},
|
|
2488
|
+
"namespaceContexts": {
|
|
2489
|
+
"type": "object",
|
|
2490
|
+
"additionalProperties": {
|
|
2491
|
+
"type": "string"
|
|
2492
|
+
},
|
|
2493
|
+
"description": "Namespace to bounded context, for workloads that carry no context label. A workload with the label keeps it; one with neither is counted in a warning and left out.",
|
|
2494
|
+
"examples": [
|
|
2495
|
+
{
|
|
2496
|
+
"shop": "shop",
|
|
2497
|
+
"shop-jobs": "shop"
|
|
2498
|
+
}
|
|
2499
|
+
]
|
|
2500
|
+
},
|
|
2501
|
+
"cache": {
|
|
2502
|
+
"type": "string",
|
|
2503
|
+
"description": "Where the last run's fragment was written, repo-relative: the same path as the step's out. An offline run, or one that cannot reach the cluster, replays it unchanged."
|
|
2504
|
+
},
|
|
2505
|
+
"out": {
|
|
2506
|
+
"type": "string",
|
|
2507
|
+
"description": "Name of the fragment file, inside the step's output directory.",
|
|
2508
|
+
"default": "k8s-cluster.json"
|
|
2509
|
+
}
|
|
2510
|
+
}
|
|
2511
|
+
}
|
|
2512
|
+
},
|
|
2513
|
+
{
|
|
2514
|
+
"name": "argocd",
|
|
2515
|
+
"plugin": "fetch-argocd",
|
|
2516
|
+
"summary": "Reads the applications an Argo CD server manages into a snapshot of where each service runs - cluster, namespace, revision, images - with a lock beside it.",
|
|
2517
|
+
"category": "sources",
|
|
2518
|
+
"phases": [
|
|
2519
|
+
"extract"
|
|
2520
|
+
],
|
|
2521
|
+
"runtime": "host",
|
|
2522
|
+
"source": "scripts/host-plugins/fetch-argocd.mjs",
|
|
2523
|
+
"options": {
|
|
2524
|
+
"type": "object",
|
|
2525
|
+
"additionalProperties": false,
|
|
2526
|
+
"required": [
|
|
2527
|
+
"server",
|
|
2528
|
+
"cache"
|
|
2529
|
+
],
|
|
2530
|
+
"properties": {
|
|
2531
|
+
"server": {
|
|
2532
|
+
"type": "string",
|
|
2533
|
+
"description": "The Argo CD API server: a host, or a URL when it is not https. The token comes from ARGOCD_AUTH_TOKEN, never from here.",
|
|
2534
|
+
"examples": [
|
|
2535
|
+
"argocd.example.com"
|
|
2536
|
+
]
|
|
2537
|
+
},
|
|
2538
|
+
"projects": {
|
|
2539
|
+
"type": "array",
|
|
2540
|
+
"items": {
|
|
2541
|
+
"type": "string",
|
|
2542
|
+
"minLength": 1
|
|
2543
|
+
},
|
|
2544
|
+
"description": "Argo CD projects to read applications from. Left out, every application the token can list.",
|
|
2545
|
+
"examples": [
|
|
2546
|
+
[
|
|
2547
|
+
"shop",
|
|
2548
|
+
"platform"
|
|
2549
|
+
]
|
|
2550
|
+
]
|
|
2551
|
+
},
|
|
2552
|
+
"selector": {
|
|
2553
|
+
"type": "string",
|
|
2554
|
+
"description": "A label selector narrowing the applications, as `argocd app list -l` takes one.",
|
|
2555
|
+
"examples": [
|
|
2556
|
+
"team=shop"
|
|
2557
|
+
]
|
|
2558
|
+
},
|
|
2559
|
+
"environmentLabel": {
|
|
2560
|
+
"type": "string",
|
|
2561
|
+
"default": "env",
|
|
2562
|
+
"description": "The application label that names the environment. An application without it is placed by the cluster it deploys to."
|
|
2563
|
+
},
|
|
2564
|
+
"labels": {
|
|
2565
|
+
"type": "object",
|
|
2566
|
+
"additionalProperties": false,
|
|
2567
|
+
"description": "Which application labels name the service it deploys. The defaults are the Kubernetes recommended labels, the same ones fetch-k8s reads off a workload; an estate that labels differently names its own keys here. An application without them is placed by the repository and directory it deploys from.",
|
|
2568
|
+
"properties": {
|
|
2569
|
+
"context": {
|
|
2570
|
+
"type": "string",
|
|
2571
|
+
"description": "The label whose value is the bounded context's slug.",
|
|
2572
|
+
"default": "app.kubernetes.io/part-of"
|
|
2573
|
+
},
|
|
2574
|
+
"service": {
|
|
2575
|
+
"type": "string",
|
|
2576
|
+
"description": "The label whose value is the service's slug.",
|
|
2577
|
+
"default": "app.kubernetes.io/name"
|
|
2578
|
+
}
|
|
2579
|
+
}
|
|
2580
|
+
},
|
|
2581
|
+
"cache": {
|
|
2582
|
+
"type": "string",
|
|
2583
|
+
"description": "Where the last run's snapshot was written, repo-relative: the same path as the step's out. An offline run replays what is there and checks it against the lock beside it."
|
|
2584
|
+
}
|
|
2585
|
+
}
|
|
2586
|
+
}
|
|
2587
|
+
},
|
|
2588
|
+
{
|
|
2589
|
+
"name": "csr-schemas",
|
|
2590
|
+
"plugin": "extract-csr",
|
|
2591
|
+
"summary": "Reads schemas vendored out of a Confluent Schema Registry and answers with the topics they are registered against and the shapes they declare.",
|
|
2592
|
+
"category": "contracts",
|
|
2593
|
+
"phases": [
|
|
2594
|
+
"extract"
|
|
2595
|
+
],
|
|
2596
|
+
"runtime": "wasm",
|
|
2597
|
+
"source": "plugins/extract-csr",
|
|
2598
|
+
"options": {
|
|
2599
|
+
"type": "object",
|
|
2600
|
+
"additionalProperties": false,
|
|
2601
|
+
"properties": {
|
|
2602
|
+
"context": {
|
|
2603
|
+
"type": "string",
|
|
2604
|
+
"description": "Slug of the bounded context that owns the service these schemas belong to. Defaults to the name of the input directory.",
|
|
2605
|
+
"examples": [
|
|
2606
|
+
"shop"
|
|
2607
|
+
]
|
|
2608
|
+
},
|
|
2609
|
+
"service": {
|
|
2610
|
+
"type": "string",
|
|
2611
|
+
"description": "Slug of the service that registers them. Defaults to the name of the input directory.",
|
|
2612
|
+
"examples": [
|
|
2613
|
+
"oms"
|
|
2614
|
+
]
|
|
2615
|
+
},
|
|
2616
|
+
"paths": {
|
|
2617
|
+
"type": "array",
|
|
2618
|
+
"items": {
|
|
2619
|
+
"type": "string"
|
|
2620
|
+
},
|
|
2621
|
+
"description": "Directories fetch-csr vendored into, relative to the input root. Left out, the whole root is walked for locks.",
|
|
2622
|
+
"examples": [
|
|
2623
|
+
[
|
|
2624
|
+
"vendor/schemas"
|
|
2625
|
+
]
|
|
2626
|
+
]
|
|
2627
|
+
},
|
|
2628
|
+
"strategy": {
|
|
2629
|
+
"enum": [
|
|
2630
|
+
"topic",
|
|
2631
|
+
"record",
|
|
2632
|
+
"topic-record"
|
|
2633
|
+
],
|
|
2634
|
+
"default": "topic",
|
|
2635
|
+
"description": "How a subject name relates to a topic and a record - the producer's SubjectNameStrategy. Nothing in the registry's answer says which one was used, so it is told here. `topic` reads \"<topic>-value\" and \"<topic>-key\"; `record` reads the whole subject as the record's full name and yields no topic; `topic-record` reads \"<topic>-<record full name>\"."
|
|
2636
|
+
},
|
|
2637
|
+
"direction": {
|
|
2638
|
+
"enum": [
|
|
2639
|
+
"send",
|
|
2640
|
+
"receive"
|
|
2641
|
+
],
|
|
2642
|
+
"default": "send",
|
|
2643
|
+
"description": "Which way these channels travel, from this service's side. A registry records no producer and no consumer, so this cannot be read and has to be told."
|
|
2644
|
+
},
|
|
2645
|
+
"subjects": {
|
|
2646
|
+
"type": "object",
|
|
2647
|
+
"additionalProperties": {
|
|
2648
|
+
"enum": [
|
|
2649
|
+
"send",
|
|
2650
|
+
"receive"
|
|
2651
|
+
]
|
|
2652
|
+
},
|
|
2653
|
+
"description": "Direction per subject, for a service that both publishes and listens. Overrides `direction`.",
|
|
2654
|
+
"examples": [
|
|
2655
|
+
{
|
|
2656
|
+
"shop.oms.order-value": "send",
|
|
2657
|
+
"payments.ledger.payment-value": "receive"
|
|
2658
|
+
}
|
|
2659
|
+
]
|
|
2660
|
+
},
|
|
2661
|
+
"out": {
|
|
2662
|
+
"type": "string",
|
|
2663
|
+
"description": "Name of the fragment file, inside the step's output directory.",
|
|
2664
|
+
"default": "schemas.json"
|
|
2665
|
+
}
|
|
2666
|
+
}
|
|
2667
|
+
}
|
|
2668
|
+
},
|
|
2669
|
+
{
|
|
2670
|
+
"name": "proto",
|
|
2671
|
+
"plugin": "extract-proto",
|
|
2672
|
+
"summary": "Reads .proto files and answers with what a service provides from the modules it publishes and what it calls from the copies it vendors.",
|
|
2673
|
+
"category": "contracts",
|
|
2674
|
+
"phases": [
|
|
2675
|
+
"extract"
|
|
2676
|
+
],
|
|
2677
|
+
"runtime": "wasm",
|
|
2678
|
+
"source": "plugins/extract-proto",
|
|
2679
|
+
"options": {
|
|
2680
|
+
"type": "object",
|
|
2681
|
+
"additionalProperties": false,
|
|
2682
|
+
"required": [
|
|
2683
|
+
"context",
|
|
2684
|
+
"service"
|
|
2685
|
+
],
|
|
2686
|
+
"properties": {
|
|
2687
|
+
"context": {
|
|
2688
|
+
"type": "string",
|
|
2689
|
+
"description": "Slug of the bounded context the service belongs to. A .proto knows its package, not which context owns it.",
|
|
2690
|
+
"examples": [
|
|
2691
|
+
"shop"
|
|
2692
|
+
]
|
|
2693
|
+
},
|
|
2694
|
+
"service": {
|
|
2695
|
+
"type": "string",
|
|
2696
|
+
"description": "Slug of the service that publishes or calls these protos.",
|
|
2697
|
+
"examples": [
|
|
2698
|
+
"oms"
|
|
2699
|
+
]
|
|
2700
|
+
},
|
|
2701
|
+
"paths": {
|
|
2702
|
+
"type": "array",
|
|
2703
|
+
"items": {
|
|
2704
|
+
"type": "string"
|
|
2705
|
+
},
|
|
2706
|
+
"description": "Directories of protos this service publishes, relative to the input root. They become what it provides. A directory fetch-bsr wrote carries its lock, and the lock says which module the protos came from.",
|
|
2707
|
+
"examples": [
|
|
2708
|
+
[
|
|
2709
|
+
"vendor/proto/shortlink-org/portolan-shop-order"
|
|
2710
|
+
]
|
|
2711
|
+
]
|
|
2712
|
+
},
|
|
2713
|
+
"vendored": {
|
|
2714
|
+
"type": "array",
|
|
2715
|
+
"items": {
|
|
2716
|
+
"type": "string"
|
|
2717
|
+
},
|
|
2718
|
+
"description": "Directories of client copies this service consumes, relative to the input root. They become what it calls. Listed rather than globbed: which copies a service may keep is a boundary a reviewer should see change.",
|
|
2719
|
+
"examples": [
|
|
2720
|
+
[
|
|
2721
|
+
"src/infrastructure/payments/proto"
|
|
2722
|
+
]
|
|
2723
|
+
]
|
|
2724
|
+
},
|
|
2725
|
+
"peers": {
|
|
2726
|
+
"type": "object",
|
|
2727
|
+
"additionalProperties": {
|
|
2728
|
+
"type": "string"
|
|
2729
|
+
},
|
|
2730
|
+
"description": "Which service answers for a vendored copy, as the proto package to its service id. A package with no line here is called as unknown and its steps stay unresolved.",
|
|
2731
|
+
"examples": [
|
|
2732
|
+
{
|
|
2733
|
+
"payments.v1": "payments.ledger"
|
|
2734
|
+
}
|
|
2735
|
+
]
|
|
2736
|
+
},
|
|
2737
|
+
"modules": {
|
|
2738
|
+
"type": "object",
|
|
2739
|
+
"additionalProperties": {
|
|
2740
|
+
"type": "string"
|
|
2741
|
+
},
|
|
2742
|
+
"description": "Which module a directory's protos belong to, as the directory relative to the input root to the module id. Only needed where there is no lock beside them to say.",
|
|
2743
|
+
"examples": [
|
|
2744
|
+
{
|
|
2745
|
+
"src/infrastructure/payments/proto": "buf.build/shortlink-org/portolan-payments-payment"
|
|
2746
|
+
}
|
|
2747
|
+
]
|
|
2748
|
+
},
|
|
2749
|
+
"defs": {
|
|
2750
|
+
"enum": [
|
|
2751
|
+
"shared",
|
|
2752
|
+
"off"
|
|
2753
|
+
],
|
|
2754
|
+
"description": "Whether a message imported from another file is promoted to a shared type, on the reasoning that the import is the author's own signal it is not local.",
|
|
2755
|
+
"default": "shared"
|
|
2756
|
+
},
|
|
2757
|
+
"out": {
|
|
2758
|
+
"type": "string",
|
|
2759
|
+
"description": "Name of the fragment file, inside the step's output directory.",
|
|
2760
|
+
"default": "proto.json"
|
|
2761
|
+
}
|
|
2762
|
+
}
|
|
2763
|
+
}
|
|
2764
|
+
}
|
|
2765
|
+
]
|