@shortlink-org/portolan 0.1.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.
Files changed (826) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +387 -0
  3. package/catalog/enum_test.go +46 -0
  4. package/catalog/model.go +932 -0
  5. package/catalog/roundtrip_test.go +185 -0
  6. package/catalog/via_test.go +38 -0
  7. package/cli/portolan.mjs +368 -0
  8. package/go.mod +14 -0
  9. package/go.sum +14 -0
  10. package/index.html +13 -0
  11. package/internal/commands/cargo.go +154 -0
  12. package/internal/commands/commands.go +143 -0
  13. package/internal/commands/commands_test.go +323 -0
  14. package/internal/commands/gradle.go +77 -0
  15. package/internal/commands/justfile.go +82 -0
  16. package/internal/commands/makefile.go +106 -0
  17. package/internal/commands/maven.go +93 -0
  18. package/internal/commands/packagejson.go +159 -0
  19. package/internal/commands/pyproject.go +169 -0
  20. package/internal/commands/taskfile.go +101 -0
  21. package/internal/commands/testdata/estate/.cargo/config.toml +7 -0
  22. package/internal/commands/testdata/estate/Makefile +33 -0
  23. package/internal/commands/testdata/estate/Taskfile.yml +21 -0
  24. package/internal/commands/testdata/estate/build.gradle.kts +21 -0
  25. package/internal/commands/testdata/estate/justfile +20 -0
  26. package/internal/commands/testdata/estate/package.json +13 -0
  27. package/internal/commands/testdata/estate/pom.xml +29 -0
  28. package/internal/commands/testdata/estate/pyproject.toml +27 -0
  29. package/internal/commands/testdata/estate/xtask/src/main.rs +27 -0
  30. package/internal/commands/testdata/golden/commands.json +305 -0
  31. package/internal/gohttp/analyze.go +2500 -0
  32. package/internal/gohttp/endpoints.go +1067 -0
  33. package/internal/gohttp/roots.go +320 -0
  34. package/internal/gohttp/typed.go +143 -0
  35. package/internal/goscan/constants.go +85 -0
  36. package/internal/goscan/goscan_test.go +227 -0
  37. package/internal/goscan/names.go +52 -0
  38. package/internal/goscan/parse_test.go +11 -0
  39. package/internal/goscan/source.go +36 -0
  40. package/internal/goscan/tree.go +155 -0
  41. package/internal/goscan/types.go +99 -0
  42. package/internal/wsdl/ids.go +127 -0
  43. package/internal/wsdl/ids_test.go +21 -0
  44. package/internal/wsdl/model.go +62 -0
  45. package/internal/wsdl/parse.go +920 -0
  46. package/internal/wsdl/parse_test.go +133 -0
  47. package/package.json +117 -0
  48. package/plugin/describe.go +107 -0
  49. package/plugin/describe_test.go +114 -0
  50. package/plugin/protocol.go +117 -0
  51. package/plugin/schematest/schematest.go +126 -0
  52. package/plugins/README.md +1160 -0
  53. package/plugins/extract-adr/describe.go +19 -0
  54. package/plugins/extract-adr/describe_test.go +11 -0
  55. package/plugins/extract-adr/extract.go +153 -0
  56. package/plugins/extract-adr/extract_test.go +350 -0
  57. package/plugins/extract-adr/history.go +99 -0
  58. package/plugins/extract-adr/main.go +65 -0
  59. package/plugins/extract-adr/options.schema.json +26 -0
  60. package/plugins/extract-adr/parse.go +642 -0
  61. package/plugins/extract-adr/parse_test.go +405 -0
  62. package/plugins/extract-asyncapi/describe.go +19 -0
  63. package/plugins/extract-asyncapi/describe_test.go +11 -0
  64. package/plugins/extract-asyncapi/extract.go +315 -0
  65. package/plugins/extract-asyncapi/extract_test.go +197 -0
  66. package/plugins/extract-asyncapi/main.go +48 -0
  67. package/plugins/extract-asyncapi/options.schema.json +26 -0
  68. package/plugins/extract-asyncapi/spec.go +151 -0
  69. package/plugins/extract-celery/README.md +169 -0
  70. package/plugins/extract-celery/extract.py +346 -0
  71. package/plugins/extract-celery/extract_test.py +192 -0
  72. package/plugins/extract-celery/main.py +66 -0
  73. package/plugins/extract-celery/options.py +31 -0
  74. package/plugins/extract-celery/options.schema.json +31 -0
  75. package/plugins/extract-celery/producers.py +156 -0
  76. package/plugins/extract-celery/routes_test.py +106 -0
  77. package/plugins/extract-commands/describe.go +19 -0
  78. package/plugins/extract-commands/describe_test.go +11 -0
  79. package/plugins/extract-commands/extract.go +79 -0
  80. package/plugins/extract-commands/extract_test.go +92 -0
  81. package/plugins/extract-commands/main.go +55 -0
  82. package/plugins/extract-commands/options.schema.json +20 -0
  83. package/plugins/extract-csr/avro.go +258 -0
  84. package/plugins/extract-csr/describe.go +19 -0
  85. package/plugins/extract-csr/describe_test.go +11 -0
  86. package/plugins/extract-csr/extract.go +338 -0
  87. package/plugins/extract-csr/extract_test.go +374 -0
  88. package/plugins/extract-csr/jsonschema.go +343 -0
  89. package/plugins/extract-csr/lock.go +25 -0
  90. package/plugins/extract-csr/main.go +84 -0
  91. package/plugins/extract-csr/options.schema.json +43 -0
  92. package/plugins/extract-csr/subject.go +102 -0
  93. package/plugins/extract-django/README.md +386 -0
  94. package/plugins/extract-django/apps.py +100 -0
  95. package/plugins/extract-django/auth.py +302 -0
  96. package/plugins/extract-django/auth_test.py +188 -0
  97. package/plugins/extract-django/clients.py +121 -0
  98. package/plugins/extract-django/contracts.py +458 -0
  99. package/plugins/extract-django/database.py +119 -0
  100. package/plugins/extract-django/domain.py +318 -0
  101. package/plugins/extract-django/events.py +86 -0
  102. package/plugins/extract-django/extract.py +601 -0
  103. package/plugins/extract-django/extract_test.py +397 -0
  104. package/plugins/extract-django/flows.py +1278 -0
  105. package/plugins/extract-django/flows_test.py +338 -0
  106. package/plugins/extract-django/ids.py +42 -0
  107. package/plugins/extract-django/ids_test.py +30 -0
  108. package/plugins/extract-django/lifecycle.py +222 -0
  109. package/plugins/extract-django/lifecycle_test.py +76 -0
  110. package/plugins/extract-django/main.py +66 -0
  111. package/plugins/extract-django/openapi.py +229 -0
  112. package/plugins/extract-django/openapi_test.py +60 -0
  113. package/plugins/extract-django/operations.py +96 -0
  114. package/plugins/extract-django/options.py +61 -0
  115. package/plugins/extract-django/options.schema.json +126 -0
  116. package/plugins/extract-django/routing.py +214 -0
  117. package/plugins/extract-django/routing_test.py +198 -0
  118. package/plugins/extract-django/serializers.py +558 -0
  119. package/plugins/extract-django/store.py +434 -0
  120. package/plugins/extract-django/transport.py +242 -0
  121. package/plugins/extract-flows/describe.go +19 -0
  122. package/plugins/extract-flows/describe_test.go +11 -0
  123. package/plugins/extract-flows/extract.go +91 -0
  124. package/plugins/extract-flows/main.go +45 -0
  125. package/plugins/extract-flows/options.schema.json +16 -0
  126. package/plugins/extract-flows/parse.go +593 -0
  127. package/plugins/extract-flows/parse_test.go +204 -0
  128. package/plugins/extract-glossary/describe.go +19 -0
  129. package/plugins/extract-glossary/describe_test.go +11 -0
  130. package/plugins/extract-glossary/extract.go +115 -0
  131. package/plugins/extract-glossary/extract_test.go +220 -0
  132. package/plugins/extract-glossary/main.go +59 -0
  133. package/plugins/extract-glossary/options.schema.json +21 -0
  134. package/plugins/extract-glossary/parse.go +214 -0
  135. package/plugins/extract-glossary/parse_test.go +203 -0
  136. package/plugins/extract-go/aggregate.go +214 -0
  137. package/plugins/extract-go/client.go +409 -0
  138. package/plugins/extract-go/client_test.go +266 -0
  139. package/plugins/extract-go/describe.go +19 -0
  140. package/plugins/extract-go/describe_test.go +11 -0
  141. package/plugins/extract-go/enum.go +195 -0
  142. package/plugins/extract-go/enum_test.go +82 -0
  143. package/plugins/extract-go/event.go +99 -0
  144. package/plugins/extract-go/extract.go +191 -0
  145. package/plugins/extract-go/extract_test.go +261 -0
  146. package/plugins/extract-go/flow.go +1441 -0
  147. package/plugins/extract-go/flow_test.go +609 -0
  148. package/plugins/extract-go/httpclient.go +174 -0
  149. package/plugins/extract-go/httpclient_test.go +296 -0
  150. package/plugins/extract-go/ids.go +92 -0
  151. package/plugins/extract-go/layout.go +225 -0
  152. package/plugins/extract-go/layout_test.go +125 -0
  153. package/plugins/extract-go/lifecycle.go +324 -0
  154. package/plugins/extract-go/lifecycle_test.go +108 -0
  155. package/plugins/extract-go/main.go +79 -0
  156. package/plugins/extract-go/operation.go +157 -0
  157. package/plugins/extract-go/options.schema.json +66 -0
  158. package/plugins/extract-go/source.go +316 -0
  159. package/plugins/extract-go/transport.go +321 -0
  160. package/plugins/extract-go/transport_test.go +145 -0
  161. package/plugins/extract-go/wiring.go +434 -0
  162. package/plugins/extract-go-nats/describe.go +19 -0
  163. package/plugins/extract-go-nats/describe_test.go +11 -0
  164. package/plugins/extract-go-nats/extract.go +177 -0
  165. package/plugins/extract-go-nats/extract_test.go +389 -0
  166. package/plugins/extract-go-nats/index.go +379 -0
  167. package/plugins/extract-go-nats/main.go +42 -0
  168. package/plugins/extract-go-nats/options.schema.json +21 -0
  169. package/plugins/extract-go-nats/resolve.go +161 -0
  170. package/plugins/extract-go-nats/sites.go +224 -0
  171. package/plugins/extract-graphql/describe.go +19 -0
  172. package/plugins/extract-graphql/describe_test.go +11 -0
  173. package/plugins/extract-graphql/extract.go +433 -0
  174. package/plugins/extract-graphql/extract_test.go +256 -0
  175. package/plugins/extract-graphql/ids.go +49 -0
  176. package/plugins/extract-graphql/lex.go +237 -0
  177. package/plugins/extract-graphql/main.go +51 -0
  178. package/plugins/extract-graphql/options.schema.json +31 -0
  179. package/plugins/extract-graphql/parse.go +621 -0
  180. package/plugins/extract-graphql/parse_test.go +122 -0
  181. package/plugins/extract-http-clients/describe.go +19 -0
  182. package/plugins/extract-http-clients/describe_test.go +11 -0
  183. package/plugins/extract-http-clients/extract.go +705 -0
  184. package/plugins/extract-http-clients/extract_test.go +1263 -0
  185. package/plugins/extract-http-clients/main.go +42 -0
  186. package/plugins/extract-http-clients/options.schema.json +33 -0
  187. package/plugins/extract-java/README.md +190 -0
  188. package/plugins/extract-java/build/org/portolan/extract/Catalog.class +0 -0
  189. package/plugins/extract-java/build/org/portolan/extract/Clients$1.class +0 -0
  190. package/plugins/extract-java/build/org/portolan/extract/Clients$2.class +0 -0
  191. package/plugins/extract-java/build/org/portolan/extract/Clients$Call.class +0 -0
  192. package/plugins/extract-java/build/org/portolan/extract/Clients$Client.class +0 -0
  193. package/plugins/extract-java/build/org/portolan/extract/Clients$Route.class +0 -0
  194. package/plugins/extract-java/build/org/portolan/extract/Clients.class +0 -0
  195. package/plugins/extract-java/build/org/portolan/extract/Domain$Aggregate.class +0 -0
  196. package/plugins/extract-java/build/org/portolan/extract/Domain.class +0 -0
  197. package/plugins/extract-java/build/org/portolan/extract/Events$Found.class +0 -0
  198. package/plugins/extract-java/build/org/portolan/extract/Events.class +0 -0
  199. package/plugins/extract-java/build/org/portolan/extract/Extract.class +0 -0
  200. package/plugins/extract-java/build/org/portolan/extract/Flows$1.class +0 -0
  201. package/plugins/extract-java/build/org/portolan/extract/Flows$Binding.class +0 -0
  202. package/plugins/extract-java/build/org/portolan/extract/Flows$Draft.class +0 -0
  203. package/plugins/extract-java/build/org/portolan/extract/Flows$Frame.class +0 -0
  204. package/plugins/extract-java/build/org/portolan/extract/Flows$Options.class +0 -0
  205. package/plugins/extract-java/build/org/portolan/extract/Flows.class +0 -0
  206. package/plugins/extract-java/build/org/portolan/extract/Ids.class +0 -0
  207. package/plugins/extract-java/build/org/portolan/extract/Json$Reader.class +0 -0
  208. package/plugins/extract-java/build/org/portolan/extract/Json.class +0 -0
  209. package/plugins/extract-java/build/org/portolan/extract/Lifecycle$1.class +0 -0
  210. package/plugins/extract-java/build/org/portolan/extract/Lifecycle$Move.class +0 -0
  211. package/plugins/extract-java/build/org/portolan/extract/Lifecycle.class +0 -0
  212. package/plugins/extract-java/build/org/portolan/extract/Main.class +0 -0
  213. package/plugins/extract-java/build/org/portolan/extract/OpenApi$Operation.class +0 -0
  214. package/plugins/extract-java/build/org/portolan/extract/OpenApi$Spec.class +0 -0
  215. package/plugins/extract-java/build/org/portolan/extract/OpenApi.class +0 -0
  216. package/plugins/extract-java/build/org/portolan/extract/Operations$1.class +0 -0
  217. package/plugins/extract-java/build/org/portolan/extract/Operations$UseCase.class +0 -0
  218. package/plugins/extract-java/build/org/portolan/extract/Operations.class +0 -0
  219. package/plugins/extract-java/build/org/portolan/extract/Proto$Rpc.class +0 -0
  220. package/plugins/extract-java/build/org/portolan/extract/Proto$Service.class +0 -0
  221. package/plugins/extract-java/build/org/portolan/extract/Proto.class +0 -0
  222. package/plugins/extract-java/build/org/portolan/extract/Protocol$Builder.class +0 -0
  223. package/plugins/extract-java/build/org/portolan/extract/Protocol$Input.class +0 -0
  224. package/plugins/extract-java/build/org/portolan/extract/Protocol$Options.class +0 -0
  225. package/plugins/extract-java/build/org/portolan/extract/Protocol.class +0 -0
  226. package/plugins/extract-java/build/org/portolan/extract/Source$Project.class +0 -0
  227. package/plugins/extract-java/build/org/portolan/extract/Source$Unit.class +0 -0
  228. package/plugins/extract-java/build/org/portolan/extract/Source.class +0 -0
  229. package/plugins/extract-java/build/org/portolan/extract/Transport$Endpoint.class +0 -0
  230. package/plugins/extract-java/build/org/portolan/extract/Transport.class +0 -0
  231. package/plugins/extract-java/build/org/portolan/extract/Yaml$Line.class +0 -0
  232. package/plugins/extract-java/build/org/portolan/extract/Yaml$Reader.class +0 -0
  233. package/plugins/extract-java/build/org/portolan/extract/Yaml.class +0 -0
  234. package/plugins/extract-java/options.schema.json +70 -0
  235. package/plugins/extract-openapi/describe.go +19 -0
  236. package/plugins/extract-openapi/describe_test.go +11 -0
  237. package/plugins/extract-openapi/discover.go +243 -0
  238. package/plugins/extract-openapi/extract.go +526 -0
  239. package/plugins/extract-openapi/extract_test.go +545 -0
  240. package/plugins/extract-openapi/main.go +75 -0
  241. package/plugins/extract-openapi/options.schema.json +62 -0
  242. package/plugins/extract-openapi/spec.go +350 -0
  243. package/plugins/extract-project/README.md +22 -0
  244. package/plugins/extract-project/describe.go +19 -0
  245. package/plugins/extract-project/describe_test.go +11 -0
  246. package/plugins/extract-project/extract.go +221 -0
  247. package/plugins/extract-project/extract_test.go +109 -0
  248. package/plugins/extract-project/main.go +41 -0
  249. package/plugins/extract-project/options.schema.json +48 -0
  250. package/plugins/extract-proto/ast.go +125 -0
  251. package/plugins/extract-proto/consumes.go +77 -0
  252. package/plugins/extract-proto/describe.go +19 -0
  253. package/plugins/extract-proto/extract.go +293 -0
  254. package/plugins/extract-proto/extract_test.go +459 -0
  255. package/plugins/extract-proto/ids.go +89 -0
  256. package/plugins/extract-proto/ids_test.go +57 -0
  257. package/plugins/extract-proto/lex.go +285 -0
  258. package/plugins/extract-proto/main.go +100 -0
  259. package/plugins/extract-proto/module.go +120 -0
  260. package/plugins/extract-proto/options.schema.json +51 -0
  261. package/plugins/extract-proto/parse.go +720 -0
  262. package/plugins/extract-proto/parse_test.go +307 -0
  263. package/plugins/extract-proto/provides.go +236 -0
  264. package/plugins/extract-proto/resolve.go +222 -0
  265. package/plugins/extract-proto/resolve_test.go +119 -0
  266. package/plugins/extract-python-kafka/README.md +36 -0
  267. package/plugins/extract-python-kafka/extract.py +211 -0
  268. package/plugins/extract-python-kafka/extract_test.py +68 -0
  269. package/plugins/extract-python-kafka/main.py +59 -0
  270. package/plugins/extract-python-kafka/options.py +29 -0
  271. package/plugins/extract-python-kafka/options.schema.json +31 -0
  272. package/plugins/extract-redis/README.md +11 -0
  273. package/plugins/extract-redis/describe.go +19 -0
  274. package/plugins/extract-redis/describe_test.go +11 -0
  275. package/plugins/extract-redis/extract.go +183 -0
  276. package/plugins/extract-redis/extract_test.go +168 -0
  277. package/plugins/extract-redis/keyspaces.go +469 -0
  278. package/plugins/extract-redis/main.go +44 -0
  279. package/plugins/extract-redis/options.schema.json +30 -0
  280. package/plugins/extract-river/describe.go +19 -0
  281. package/plugins/extract-river/describe_test.go +11 -0
  282. package/plugins/extract-river/extract.go +507 -0
  283. package/plugins/extract-river/extract_test.go +132 -0
  284. package/plugins/extract-river/main.go +42 -0
  285. package/plugins/extract-river/options.schema.json +21 -0
  286. package/plugins/extract-rust/Cargo.lock +133 -0
  287. package/plugins/extract-rust/Cargo.toml +23 -0
  288. package/plugins/extract-rust/README.md +204 -0
  289. package/plugins/extract-rust/options.schema.json +65 -0
  290. package/plugins/extract-rust/rustfmt.toml +1 -0
  291. package/plugins/extract-sql/ddl.go +893 -0
  292. package/plugins/extract-sql/ddl_test.go +401 -0
  293. package/plugins/extract-sql/describe.go +19 -0
  294. package/plugins/extract-sql/describe_test.go +11 -0
  295. package/plugins/extract-sql/layout.go +221 -0
  296. package/plugins/extract-sql/layout_test.go +55 -0
  297. package/plugins/extract-sql/lineage.go +107 -0
  298. package/plugins/extract-sql/main.go +141 -0
  299. package/plugins/extract-sql/maps.go +564 -0
  300. package/plugins/extract-sql/maps_java.go +117 -0
  301. package/plugins/extract-sql/maps_rust.go +333 -0
  302. package/plugins/extract-sql/maps_rust_test.go +70 -0
  303. package/plugins/extract-sql/maps_test.go +204 -0
  304. package/plugins/extract-sql/maps_ts.go +398 -0
  305. package/plugins/extract-sql/maps_ts_test.go +136 -0
  306. package/plugins/extract-sql/options.schema.json +53 -0
  307. package/plugins/extract-sql/projection.go +70 -0
  308. package/plugins/extract-sql/projection_test.go +50 -0
  309. package/plugins/extract-sql/store.go +420 -0
  310. package/plugins/extract-sql/store_test.go +233 -0
  311. package/plugins/extract-sql/view.go +295 -0
  312. package/plugins/extract-ts/README.md +306 -0
  313. package/plugins/extract-ts/ast.test.ts +178 -0
  314. package/plugins/extract-ts/ast.ts +648 -0
  315. package/plugins/extract-ts/clients.ts +185 -0
  316. package/plugins/extract-ts/domain.ts +164 -0
  317. package/plugins/extract-ts/extract.test.ts +208 -0
  318. package/plugins/extract-ts/extract.ts +200 -0
  319. package/plugins/extract-ts/flows.ts +783 -0
  320. package/plugins/extract-ts/graphql.test.ts +73 -0
  321. package/plugins/extract-ts/graphql.ts +181 -0
  322. package/plugins/extract-ts/ids.test.ts +21 -0
  323. package/plugins/extract-ts/ids.ts +52 -0
  324. package/plugins/extract-ts/lifecycle.ts +138 -0
  325. package/plugins/extract-ts/main.ts +48 -0
  326. package/plugins/extract-ts/openapi.test.ts +64 -0
  327. package/plugins/extract-ts/openapi.ts +99 -0
  328. package/plugins/extract-ts/operations.ts +93 -0
  329. package/plugins/extract-ts/options.schema.json +96 -0
  330. package/plugins/extract-ts/source.test.ts +174 -0
  331. package/plugins/extract-ts/source.ts +465 -0
  332. package/plugins/extract-ts/transport.ts +147 -0
  333. package/plugins/extract-ts/tsconfig.json +13 -0
  334. package/plugins/extract-ts/wiring.ts +190 -0
  335. package/plugins/extract-watermill/describe.go +19 -0
  336. package/plugins/extract-watermill/describe_test.go +11 -0
  337. package/plugins/extract-watermill/extract.go +1228 -0
  338. package/plugins/extract-watermill/extract_test.go +234 -0
  339. package/plugins/extract-watermill/main.go +41 -0
  340. package/plugins/extract-watermill/options.schema.json +21 -0
  341. package/plugins/extract-wsdl/describe.go +19 -0
  342. package/plugins/extract-wsdl/describe_test.go +11 -0
  343. package/plugins/extract-wsdl/extract.go +148 -0
  344. package/plugins/extract-wsdl/extract_test.go +45 -0
  345. package/plugins/extract-wsdl/main.go +53 -0
  346. package/plugins/extract-wsdl/options.schema.json +59 -0
  347. package/plugins/fetch-bsr/auth.go +114 -0
  348. package/plugins/fetch-bsr/bsr.go +240 -0
  349. package/plugins/fetch-bsr/cache.go +66 -0
  350. package/plugins/fetch-bsr/describe.go +19 -0
  351. package/plugins/fetch-bsr/fetch.go +192 -0
  352. package/plugins/fetch-bsr/fetch_test.go +465 -0
  353. package/plugins/fetch-bsr/lock.go +71 -0
  354. package/plugins/fetch-bsr/main.go +117 -0
  355. package/plugins/fetch-bsr/options.schema.json +42 -0
  356. package/plugins/fetch-csr/auth.go +95 -0
  357. package/plugins/fetch-csr/cache.go +69 -0
  358. package/plugins/fetch-csr/describe.go +19 -0
  359. package/plugins/fetch-csr/describe_test.go +11 -0
  360. package/plugins/fetch-csr/fetch.go +254 -0
  361. package/plugins/fetch-csr/fetch_test.go +494 -0
  362. package/plugins/fetch-csr/lock.go +95 -0
  363. package/plugins/fetch-csr/main.go +122 -0
  364. package/plugins/fetch-csr/options.schema.json +42 -0
  365. package/plugins/fetch-csr/registry.go +209 -0
  366. package/plugins/fetch-git/cache.go +65 -0
  367. package/plugins/fetch-git/describe.go +19 -0
  368. package/plugins/fetch-git/describe_test.go +11 -0
  369. package/plugins/fetch-git/fetch.go +181 -0
  370. package/plugins/fetch-git/fetch_test.go +332 -0
  371. package/plugins/fetch-git/git.go +169 -0
  372. package/plugins/fetch-git/lock.go +72 -0
  373. package/plugins/fetch-git/main.go +127 -0
  374. package/plugins/fetch-git/offline.go +39 -0
  375. package/plugins/fetch-git/options.schema.json +42 -0
  376. package/plugins/fetch-git/pin.go +90 -0
  377. package/plugins/fetch-git/pin_test.go +74 -0
  378. package/plugins/gen-backstage/describe.go +17 -0
  379. package/plugins/gen-backstage/main.go +22 -0
  380. package/plugins/gen-backstage/options.schema.json +30 -0
  381. package/plugins/gen-backstage/plugin.go +473 -0
  382. package/plugins/gen-backstage/plugin_test.go +145 -0
  383. package/plugins/gen-backstage.wasm +0 -0
  384. package/plugins/gen-markdown/adr.go +162 -0
  385. package/plugins/gen-markdown/aggregate.go +362 -0
  386. package/plugins/gen-markdown/canonical.go +93 -0
  387. package/plugins/gen-markdown/context.go +90 -0
  388. package/plugins/gen-markdown/coverage_test.go +89 -0
  389. package/plugins/gen-markdown/describe.go +19 -0
  390. package/plugins/gen-markdown/describe_test.go +11 -0
  391. package/plugins/gen-markdown/external.go +71 -0
  392. package/plugins/gen-markdown/flow.go +277 -0
  393. package/plugins/gen-markdown/glossary.go +76 -0
  394. package/plugins/gen-markdown/glossary_test.go +148 -0
  395. package/plugins/gen-markdown/llms.go +302 -0
  396. package/plugins/gen-markdown/main.go +22 -0
  397. package/plugins/gen-markdown/markdown.go +254 -0
  398. package/plugins/gen-markdown/markdown_test.go +100 -0
  399. package/plugins/gen-markdown/module.go +107 -0
  400. package/plugins/gen-markdown/options.schema.json +16 -0
  401. package/plugins/gen-markdown/plugin.go +39 -0
  402. package/plugins/gen-markdown/quality_test.go +176 -0
  403. package/plugins/gen-markdown/redis_test.go +38 -0
  404. package/plugins/gen-markdown/render.go +344 -0
  405. package/plugins/gen-markdown/render_test.go +186 -0
  406. package/plugins/gen-markdown/service.go +456 -0
  407. package/plugins/gen-markdown/source.go +177 -0
  408. package/plugins/gen-markdown/store.go +201 -0
  409. package/plugins/gen-markdown.wasm +0 -0
  410. package/plugins/gen-mermaid/describe.go +17 -0
  411. package/plugins/gen-mermaid/main.go +22 -0
  412. package/plugins/gen-mermaid/options.schema.json +10 -0
  413. package/plugins/gen-mermaid/plugin.go +104 -0
  414. package/plugins/gen-mermaid/plugin_test.go +33 -0
  415. package/plugins/gen-mermaid.wasm +0 -0
  416. package/plugins/openapi/ids.go +261 -0
  417. package/plugins/openapi/ids_test.go +98 -0
  418. package/plugins/pyplugin/catalog.py +209 -0
  419. package/plugins/pyplugin/celery_conf.py +436 -0
  420. package/plugins/pyplugin/celery_tasks.py +76 -0
  421. package/plugins/pyplugin/kafka.py +570 -0
  422. package/plugins/pyplugin/names.py +38 -0
  423. package/plugins/pyplugin/protocol.py +79 -0
  424. package/plugins/pyplugin/source.py +285 -0
  425. package/plugins/verify-codeowners/describe.go +19 -0
  426. package/plugins/verify-codeowners/describe_test.go +11 -0
  427. package/plugins/verify-codeowners/main.go +75 -0
  428. package/plugins/verify-codeowners/match.go +85 -0
  429. package/plugins/verify-codeowners/match_test.go +47 -0
  430. package/plugins/verify-codeowners/options.schema.json +15 -0
  431. package/plugins/verify-codeowners/owners.go +164 -0
  432. package/plugins/verify-codeowners/owners_test.go +225 -0
  433. package/plugins/verify-codeowners/parse.go +90 -0
  434. package/plugins/verify-codeowners/parse_test.go +62 -0
  435. package/plugins/verify-otel/describe.go +19 -0
  436. package/plugins/verify-otel/describe_test.go +11 -0
  437. package/plugins/verify-otel/main.go +53 -0
  438. package/plugins/verify-otel/match.go +336 -0
  439. package/plugins/verify-otel/options.schema.json +30 -0
  440. package/plugins/verify-otel/otlp.go +200 -0
  441. package/plugins/verify-otel/verify.go +734 -0
  442. package/plugins/verify-otel/verify_test.go +460 -0
  443. package/portolan.json +1073 -0
  444. package/public/favicon.svg +12 -0
  445. package/schema/portolan.schema.json +2558 -0
  446. package/scripts/README.md +53 -0
  447. package/scripts/build-report.mjs +60 -0
  448. package/scripts/build-report.test.mjs +44 -0
  449. package/scripts/builtin-plugins.mjs +49 -0
  450. package/scripts/catalog-sources.mjs +67 -0
  451. package/scripts/diff.mjs +315 -0
  452. package/scripts/diff.test.mjs +151 -0
  453. package/scripts/forge-comment.mjs +144 -0
  454. package/scripts/forge-comment.test.mjs +151 -0
  455. package/scripts/forge-release.mjs +138 -0
  456. package/scripts/forge-release.test.mjs +106 -0
  457. package/scripts/forge.mjs +61 -0
  458. package/scripts/gen-likec4.mjs +854 -0
  459. package/scripts/gen-likec4.test.mjs +258 -0
  460. package/scripts/gen.mjs +603 -0
  461. package/scripts/generated-docs.test.mjs +66 -0
  462. package/scripts/local-api.mjs +1192 -0
  463. package/scripts/local-api.test.mjs +387 -0
  464. package/scripts/manifest.mjs +214 -0
  465. package/scripts/manifest.test.mjs +148 -0
  466. package/scripts/output-path.mjs +79 -0
  467. package/scripts/output-path.test.mjs +45 -0
  468. package/scripts/package-smoke.mjs +37 -0
  469. package/scripts/plugin-host.mjs +419 -0
  470. package/scripts/plugin-host.test.mjs +109 -0
  471. package/scripts/plugin-wasm-worker.mjs +34 -0
  472. package/scripts/run-builtin.mjs +81 -0
  473. package/scripts/schema.mjs +357 -0
  474. package/scripts/site-docs.mjs +295 -0
  475. package/scripts/site-docs.test.mjs +181 -0
  476. package/scripts/vendor-lock.mjs +58 -0
  477. package/scripts/vendor-lock.test.mjs +69 -0
  478. package/src/README.md +38 -0
  479. package/src/app/App.tsx +448 -0
  480. package/src/app/BranchPicker.test.ts +46 -0
  481. package/src/app/BranchPicker.tsx +153 -0
  482. package/src/app/Breadcrumbs.test.ts +38 -0
  483. package/src/app/Breadcrumbs.tsx +223 -0
  484. package/src/app/BuildStamp.tsx +146 -0
  485. package/src/app/CommandPalette.tsx +292 -0
  486. package/src/app/HashScroll.tsx +45 -0
  487. package/src/app/Sidebar.tsx +1742 -0
  488. package/src/app/TopBar.tsx +393 -0
  489. package/src/app/density.tsx +64 -0
  490. package/src/app/forge-access.test.ts +27 -0
  491. package/src/app/forge-access.tsx +80 -0
  492. package/src/app/panels.tsx +141 -0
  493. package/src/app/pins.tsx +242 -0
  494. package/src/app/query-client.ts +24 -0
  495. package/src/app/responsive.ts +55 -0
  496. package/src/app/shortcuts.test.ts +39 -0
  497. package/src/app/shortcuts.tsx +282 -0
  498. package/src/app/theme.tsx +51 -0
  499. package/src/app/title.test.ts +14 -0
  500. package/src/app/title.ts +30 -0
  501. package/src/app/toast.tsx +59 -0
  502. package/src/app/tree-keys.test.ts +80 -0
  503. package/src/app/tree-keys.ts +87 -0
  504. package/src/app/ui-store.ts +52 -0
  505. package/src/catalog-error.test.ts +105 -0
  506. package/src/catalog-profile.test.ts +59 -0
  507. package/src/catalog-profile.ts +101 -0
  508. package/src/catalog-stores.test.ts +431 -0
  509. package/src/catalog.test.ts +1215 -0
  510. package/src/catalog.ts +3125 -0
  511. package/src/chat/Cards.tsx +408 -0
  512. package/src/chat/ChatPanel.tsx +79 -0
  513. package/src/chat/ChatSettings.tsx +219 -0
  514. package/src/chat/Composer.tsx +99 -0
  515. package/src/chat/Conversation.tsx +281 -0
  516. package/src/chat/Header.tsx +46 -0
  517. package/src/chat/Message.tsx +49 -0
  518. package/src/chat/Notice.tsx +195 -0
  519. package/src/chat/Starter.tsx +67 -0
  520. package/src/chat/Steps.tsx +45 -0
  521. package/src/chat/Waiting.tsx +87 -0
  522. package/src/chat/flags.test.ts +59 -0
  523. package/src/chat/flags.ts +155 -0
  524. package/src/chat/linkify.test.ts +30 -0
  525. package/src/chat/linkify.ts +45 -0
  526. package/src/chat/prefs.ts +56 -0
  527. package/src/chat/prompt.test.ts +43 -0
  528. package/src/chat/prompt.ts +157 -0
  529. package/src/chat/store.ts +35 -0
  530. package/src/chat/tools.ts +58 -0
  531. package/src/chat/transport.ts +70 -0
  532. package/src/components/AdrRow.tsx +29 -0
  533. package/src/components/AnchorLink.tsx +67 -0
  534. package/src/components/ApiReference.tsx +134 -0
  535. package/src/components/AsyncApiReference.tsx +120 -0
  536. package/src/components/CatalogStamp.tsx +155 -0
  537. package/src/components/ChannelRows.tsx +132 -0
  538. package/src/components/CommandRows.tsx +139 -0
  539. package/src/components/DiagramSkeleton.tsx +71 -0
  540. package/src/components/EditorLink.tsx +85 -0
  541. package/src/components/FieldTree.tsx +305 -0
  542. package/src/components/FlowTrigger.tsx +34 -0
  543. package/src/components/Ident.tsx +89 -0
  544. package/src/components/Integrations.tsx +243 -0
  545. package/src/components/LifecycleDiagram.tsx +110 -0
  546. package/src/components/MachineDocs.tsx +42 -0
  547. package/src/components/Markdown.tsx +173 -0
  548. package/src/components/MarkdownTable.tsx +206 -0
  549. package/src/components/Mermaid.tsx +211 -0
  550. package/src/components/MethodRows.tsx +309 -0
  551. package/src/components/Overlay.tsx +125 -0
  552. package/src/components/PageHeader.tsx +189 -0
  553. package/src/components/RowActions.tsx +97 -0
  554. package/src/components/SchemaDocument.tsx +89 -0
  555. package/src/components/Select.tsx +126 -0
  556. package/src/components/ShapeRows.tsx +118 -0
  557. package/src/components/SourceDoc.tsx +82 -0
  558. package/src/components/SourcePreview.tsx +441 -0
  559. package/src/components/TabRow.tsx +182 -0
  560. package/src/components/TechIcon.tsx +34 -0
  561. package/src/components/Toc.tsx +132 -0
  562. package/src/components/WhatLinksHere.tsx +273 -0
  563. package/src/components/WsdlReference.tsx +84 -0
  564. package/src/components/ddd-icons.tsx +107 -0
  565. package/src/components/kind.tsx +157 -0
  566. package/src/components/logo.tsx +61 -0
  567. package/src/components/primitives.tsx +264 -0
  568. package/src/data.test.ts +18 -0
  569. package/src/data.ts +202 -0
  570. package/src/enrich.test.ts +1150 -0
  571. package/src/enrich.ts +672 -0
  572. package/src/er/ErCanvas.tsx +533 -0
  573. package/src/er/RedisSchema.tsx +74 -0
  574. package/src/er/RelationCard.tsx +267 -0
  575. package/src/er/StoreHeader.tsx +155 -0
  576. package/src/er/TableNode.tsx +84 -0
  577. package/src/er/ViewNode.tsx +83 -0
  578. package/src/er/layout.test.ts +115 -0
  579. package/src/er/layout.ts +77 -0
  580. package/src/er/lineage.test.ts +140 -0
  581. package/src/er/lineage.ts +107 -0
  582. package/src/er/markers.tsx +79 -0
  583. package/src/er/spec.test.ts +344 -0
  584. package/src/er/spec.ts +426 -0
  585. package/src/flow/ChainList.tsx +162 -0
  586. package/src/flow/FlowTable.tsx +123 -0
  587. package/src/flow/FlowToolbar.tsx +372 -0
  588. package/src/flow/StepDetail.tsx +380 -0
  589. package/src/flow/StepRail.tsx +428 -0
  590. package/src/flow/answers.test.ts +50 -0
  591. package/src/flow/answers.ts +58 -0
  592. package/src/flow/chain.test.ts +383 -0
  593. package/src/flow/chain.ts +353 -0
  594. package/src/flow/chapters.test.ts +185 -0
  595. package/src/flow/chapters.ts +225 -0
  596. package/src/flow/continues.test.ts +102 -0
  597. package/src/flow/continues.ts +65 -0
  598. package/src/flow/cross-context.test.ts +97 -0
  599. package/src/flow/cross-context.ts +35 -0
  600. package/src/flow/mermaid.test.ts +22 -0
  601. package/src/flow/mermaid.ts +141 -0
  602. package/src/flow/outline.test.ts +212 -0
  603. package/src/flow/outline.ts +170 -0
  604. package/src/flow/paths.test.ts +129 -0
  605. package/src/flow/paths.ts +147 -0
  606. package/src/flow/prefs.test.ts +80 -0
  607. package/src/flow/prefs.ts +104 -0
  608. package/src/graph/DependencyGraph.tsx +283 -0
  609. package/src/graph/DependencyNodes.tsx +162 -0
  610. package/src/graph/EdgeLabel.tsx +61 -0
  611. package/src/graph/FocusedEventGraph.tsx +211 -0
  612. package/src/graph/GraphToolbar.tsx +187 -0
  613. package/src/graph/RoutedEdge.tsx +80 -0
  614. package/src/graph/dependency-layout.test.ts +360 -0
  615. package/src/graph/dependency-layout.ts +444 -0
  616. package/src/graph/elk.test.ts +70 -0
  617. package/src/graph/elk.ts +287 -0
  618. package/src/graph/nodes.tsx +97 -0
  619. package/src/graph/theme.ts +81 -0
  620. package/src/graph/useElkFlow.ts +125 -0
  621. package/src/index.css +1547 -0
  622. package/src/language/InLanguage.tsx +40 -0
  623. package/src/language/TermCard.tsx +132 -0
  624. package/src/language/cards.test.ts +114 -0
  625. package/src/language/cards.ts +111 -0
  626. package/src/lib/admonition.test.ts +49 -0
  627. package/src/lib/admonition.ts +48 -0
  628. package/src/lib/adr.test.ts +131 -0
  629. package/src/lib/adr.ts +68 -0
  630. package/src/lib/api.test.ts +122 -0
  631. package/src/lib/api.ts +135 -0
  632. package/src/lib/backlinks.test.ts +330 -0
  633. package/src/lib/backlinks.ts +567 -0
  634. package/src/lib/branch-compare.ts +16 -0
  635. package/src/lib/build-info.test.ts +76 -0
  636. package/src/lib/build-info.ts +80 -0
  637. package/src/lib/catalog-diff.test.ts +275 -0
  638. package/src/lib/catalog-diff.ts +655 -0
  639. package/src/lib/clipboard.ts +43 -0
  640. package/src/lib/comparison-memory.test.ts +40 -0
  641. package/src/lib/comparison-memory.ts +39 -0
  642. package/src/lib/context-color.ts +27 -0
  643. package/src/lib/context-map.test.ts +148 -0
  644. package/src/lib/context-map.ts +399 -0
  645. package/src/lib/data-model.test.ts +245 -0
  646. package/src/lib/data-model.ts +399 -0
  647. package/src/lib/data-problems.test.ts +178 -0
  648. package/src/lib/data-problems.ts +314 -0
  649. package/src/lib/derive.test.ts +251 -0
  650. package/src/lib/derive.ts +515 -0
  651. package/src/lib/editor-link.test.ts +125 -0
  652. package/src/lib/editor-link.ts +96 -0
  653. package/src/lib/editor-prefs.ts +27 -0
  654. package/src/lib/event-graph.test.ts +237 -0
  655. package/src/lib/event-graph.ts +327 -0
  656. package/src/lib/export-canvas.ts +37 -0
  657. package/src/lib/export-file.test.ts +30 -0
  658. package/src/lib/export-file.ts +20 -0
  659. package/src/lib/flow-tree.test.ts +177 -0
  660. package/src/lib/flow-tree.ts +160 -0
  661. package/src/lib/forge-refs.test.ts +50 -0
  662. package/src/lib/forge-refs.ts +60 -0
  663. package/src/lib/format.test.ts +35 -0
  664. package/src/lib/format.ts +64 -0
  665. package/src/lib/github-catalog.test.ts +301 -0
  666. package/src/lib/github-catalog.ts +610 -0
  667. package/src/lib/integrations.test.ts +119 -0
  668. package/src/lib/integrations.ts +133 -0
  669. package/src/lib/kinds.test.ts +91 -0
  670. package/src/lib/kinds.ts +204 -0
  671. package/src/lib/lifecycle.test.ts +93 -0
  672. package/src/lib/lifecycle.ts +165 -0
  673. package/src/lib/local-api.ts +194 -0
  674. package/src/lib/motion-features.ts +11 -0
  675. package/src/lib/motion.test.ts +120 -0
  676. package/src/lib/motion.tsx +269 -0
  677. package/src/lib/palette-recent.test.ts +80 -0
  678. package/src/lib/palette-recent.ts +90 -0
  679. package/src/lib/palette.test.ts +365 -0
  680. package/src/lib/palette.ts +593 -0
  681. package/src/lib/pins.test.ts +139 -0
  682. package/src/lib/pins.ts +130 -0
  683. package/src/lib/problems.test.ts +112 -0
  684. package/src/lib/project-preview.ts +5 -0
  685. package/src/lib/proto-problems.test.ts +121 -0
  686. package/src/lib/proto-problems.ts +65 -0
  687. package/src/lib/queries.test.ts +113 -0
  688. package/src/lib/queries.ts +131 -0
  689. package/src/lib/registry.test.ts +219 -0
  690. package/src/lib/registry.ts +208 -0
  691. package/src/lib/scenarios.ts +547 -0
  692. package/src/lib/setup-info.test.ts +199 -0
  693. package/src/lib/setup-info.ts +415 -0
  694. package/src/lib/shape.test.ts +289 -0
  695. package/src/lib/shape.ts +454 -0
  696. package/src/lib/sidebar-prefs.test.ts +32 -0
  697. package/src/lib/sidebar-prefs.ts +75 -0
  698. package/src/lib/source-code.test.ts +159 -0
  699. package/src/lib/source-code.ts +286 -0
  700. package/src/lib/source-doc.test.ts +131 -0
  701. package/src/lib/source-doc.ts +103 -0
  702. package/src/lib/source-highlight.test.ts +29 -0
  703. package/src/lib/source-highlight.ts +24 -0
  704. package/src/lib/source-link.test.ts +153 -0
  705. package/src/lib/source-link.ts +201 -0
  706. package/src/lib/spec-files.test.ts +24 -0
  707. package/src/lib/spec-files.ts +23 -0
  708. package/src/lib/table-directive.test.ts +139 -0
  709. package/src/lib/table-directive.ts +106 -0
  710. package/src/lib/tech.test.ts +120 -0
  711. package/src/lib/tech.ts +421 -0
  712. package/src/lib/terms.test.ts +67 -0
  713. package/src/lib/terms.ts +179 -0
  714. package/src/lib/wire-problems.test.ts +263 -0
  715. package/src/lib/wire-problems.ts +281 -0
  716. package/src/likec4/C4View.tsx +55 -0
  717. package/src/likec4/CanvasBridge.tsx +187 -0
  718. package/src/likec4/FlowView.tsx +235 -0
  719. package/src/likec4/InteractiveView.tsx +144 -0
  720. package/src/likec4/canvas-viewport.test.ts +149 -0
  721. package/src/likec4/canvas-viewport.ts +135 -0
  722. package/src/likec4/flow-edges.test.ts +51 -0
  723. package/src/likec4/flow-edges.ts +89 -0
  724. package/src/likec4/frame-theme.test.ts +76 -0
  725. package/src/likec4/frame-theme.ts +101 -0
  726. package/src/likec4/highlight-css.test.ts +49 -0
  727. package/src/likec4/highlight-css.ts +52 -0
  728. package/src/likec4/ids.test.ts +151 -0
  729. package/src/likec4/ids.ts +115 -0
  730. package/src/likec4/levels.tsx +70 -0
  731. package/src/likec4/mapping.test.ts +66 -0
  732. package/src/likec4/mapping.ts +54 -0
  733. package/src/likec4/reserved.json +141 -0
  734. package/src/likec4/view-index.ts +78 -0
  735. package/src/main.tsx +13 -0
  736. package/src/map/ContextMapGraph.tsx +274 -0
  737. package/src/map/ContextNode.tsx +70 -0
  738. package/src/map/FloatingEdge.tsx +86 -0
  739. package/src/merge.test.ts +1038 -0
  740. package/src/merge.ts +1004 -0
  741. package/src/pages/AdrDetail.tsx +242 -0
  742. package/src/pages/AdrIndex.tsx +114 -0
  743. package/src/pages/AggregatePage.tsx +727 -0
  744. package/src/pages/BlockPage.tsx +478 -0
  745. package/src/pages/CatalogFailure.tsx +111 -0
  746. package/src/pages/Changes.tsx +313 -0
  747. package/src/pages/ContextMap.tsx +534 -0
  748. package/src/pages/ContextPage.tsx +346 -0
  749. package/src/pages/EnumPage.tsx +282 -0
  750. package/src/pages/EventPage.tsx +686 -0
  751. package/src/pages/ExternalPage.tsx +204 -0
  752. package/src/pages/FlowDetail.tsx +663 -0
  753. package/src/pages/FlowIndex.tsx +303 -0
  754. package/src/pages/GraphPage.tsx +217 -0
  755. package/src/pages/Language.tsx +257 -0
  756. package/src/pages/ModulePage.tsx +366 -0
  757. package/src/pages/NotFound.tsx +54 -0
  758. package/src/pages/Overview.tsx +344 -0
  759. package/src/pages/Problems.tsx +360 -0
  760. package/src/pages/RegistryIndex.tsx +118 -0
  761. package/src/pages/ServicePage.tsx +746 -0
  762. package/src/pages/Settings.tsx +975 -0
  763. package/src/pages/StorePage.tsx +114 -0
  764. package/src/peek/PeekCard.test.ts +35 -0
  765. package/src/peek/PeekCard.tsx +118 -0
  766. package/src/peek/PeekLayer.tsx +147 -0
  767. package/src/peek/model.test.ts +156 -0
  768. package/src/peek/model.ts +253 -0
  769. package/src/routes.test.ts +222 -0
  770. package/src/routes.ts +449 -0
  771. package/src/selection/DetailPanel.tsx +1407 -0
  772. package/src/selection/hash.test.ts +73 -0
  773. package/src/selection/hash.ts +58 -0
  774. package/src/selection/model.test.ts +199 -0
  775. package/src/selection/model.ts +473 -0
  776. package/src/selection/pages.test.ts +115 -0
  777. package/src/selection/pages.ts +268 -0
  778. package/src/selection/store.test.ts +62 -0
  779. package/src/selection/store.ts +46 -0
  780. package/src/selection/sync.tsx +99 -0
  781. package/src/table/ColumnsMenu.tsx +72 -0
  782. package/src/table/DataTable.tsx +780 -0
  783. package/src/table/Facets.tsx +54 -0
  784. package/src/table/GroupMenu.tsx +69 -0
  785. package/src/table/Toolbar.tsx +190 -0
  786. package/src/table/cells.tsx +117 -0
  787. package/src/table/compare.test.ts +117 -0
  788. package/src/table/compare.ts +196 -0
  789. package/src/table/export.test.ts +88 -0
  790. package/src/table/export.ts +66 -0
  791. package/src/table/facet-groups.test.ts +74 -0
  792. package/src/table/facet-groups.ts +56 -0
  793. package/src/table/grouping.test.ts +84 -0
  794. package/src/table/grouping.ts +82 -0
  795. package/src/table/infer.test.ts +57 -0
  796. package/src/table/infer.ts +50 -0
  797. package/src/table/persist.test.ts +76 -0
  798. package/src/table/persist.ts +112 -0
  799. package/src/table/sort-url.test.ts +75 -0
  800. package/src/table/sort-url.ts +52 -0
  801. package/src/table/types.ts +80 -0
  802. package/src/table/useTableState.ts +220 -0
  803. package/src/test-catalog.ts +7 -0
  804. package/src/testing/estate/data__catalog.json +2847 -0
  805. package/src/testing/estate/data__flows.json +1724 -0
  806. package/src/testing/estate/examples__auth__portolan__api.json +212 -0
  807. package/src/testing/estate/examples__auth__portolan__domain.json +1204 -0
  808. package/src/testing/estate/examples__auth__portolan__glossary.json +226 -0
  809. package/src/testing/estate/examples__auth__portolan__observed.json +757 -0
  810. package/src/testing/estate/examples__auth__portolan__stores.json +195 -0
  811. package/src/testing/estate/examples__shop__cart__portolan__api.json +234 -0
  812. package/src/testing/estate/examples__shop__cart__portolan__commands.json +86 -0
  813. package/src/testing/estate/examples__shop__cart__portolan__domain.json +966 -0
  814. package/src/testing/estate/examples__shop__cart__portolan__observed.json +498 -0
  815. package/src/testing/estate/examples__shop__cart__portolan__stores.json +208 -0
  816. package/src/testing/estate/examples__shop__oms__portolan__glossary.json +98 -0
  817. package/src/testing/estate/examples__shop__oms__portolan__proto.json +186 -0
  818. package/src/testing/estate.ts +49 -0
  819. package/src/trail/Trail.tsx +81 -0
  820. package/src/trail/model.test.ts +157 -0
  821. package/src/trail/model.ts +189 -0
  822. package/src/trail/record.tsx +32 -0
  823. package/src/trail/store.test.ts +66 -0
  824. package/src/trail/store.ts +102 -0
  825. package/tsconfig.json +35 -0
  826. package/vite.config.ts +171 -0
@@ -0,0 +1,2558 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/shortlink-org/portolan/schema/portolan.schema.json",
4
+ "title": "portolan manifest",
5
+ "description": "Where the facts come from, what produces them, and what turns them into something to read. Generated by scripts/schema.mjs from the plugins this manifest declares; run `npm run schema` after changing them.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "sources"
10
+ ],
11
+ "properties": {
12
+ "$schema": {
13
+ "type": "string"
14
+ },
15
+ "$comment": {
16
+ "type": "string"
17
+ },
18
+ "sources": {
19
+ "type": "array",
20
+ "minItems": 1,
21
+ "items": {
22
+ "type": "string"
23
+ },
24
+ "description": "Globs of the catalog fragments that make up the estate. They are merged, then validated as a union, so a fragment naming a peer it does not own is normal rather than broken."
25
+ },
26
+ "defaultCatalog": {
27
+ "type": "string",
28
+ "minLength": 1,
29
+ "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
30
+ "description": "Catalog profile selected when the URL does not name one."
31
+ },
32
+ "catalogs": {
33
+ "type": "array",
34
+ "minItems": 1,
35
+ "items": {
36
+ "$ref": "#/$defs/catalogProfile"
37
+ },
38
+ "description": "Independent presentations of the available fragments. Each profile is merged, enriched and validated on its own."
39
+ },
40
+ "projects": {
41
+ "type": "array",
42
+ "items": {
43
+ "$ref": "#/$defs/project"
44
+ },
45
+ "description": "The source projects that make up the estate. A project gives repeated pipeline inputs one name for the generated site's Settings page; estate-wide inputs such as flows need no project."
46
+ },
47
+ "plugins": {
48
+ "type": "array",
49
+ "items": {
50
+ "$ref": "#/$defs/plugin"
51
+ },
52
+ "description": "How to run each plugin. A step names one by the name declared here."
53
+ },
54
+ "extract": {
55
+ "type": "array",
56
+ "items": {
57
+ "type": "object",
58
+ "additionalProperties": false,
59
+ "required": [
60
+ "plugin",
61
+ "in",
62
+ "out"
63
+ ],
64
+ "properties": {
65
+ "plugin": {
66
+ "enum": [
67
+ "project",
68
+ "commands",
69
+ "go-domain",
70
+ "ts-domain",
71
+ "rust-domain",
72
+ "java-domain",
73
+ "django-domain",
74
+ "celery",
75
+ "python-kafka",
76
+ "openapi",
77
+ "wsdl",
78
+ "http-clients",
79
+ "redis",
80
+ "river",
81
+ "watermill",
82
+ "go-nats",
83
+ "asyncapi",
84
+ "graphql",
85
+ "sql",
86
+ "adr",
87
+ "glossary",
88
+ "flows",
89
+ "bsr",
90
+ "git",
91
+ "proto"
92
+ ],
93
+ "description": "A plugin declared above, one that belongs in this phase."
94
+ },
95
+ "in": {
96
+ "type": "string",
97
+ "description": "The directory to read, relative to the repository."
98
+ },
99
+ "out": {
100
+ "type": "string",
101
+ "description": "Where what comes back is written. A plugin names files; nothing it names is allowed to land outside this directory."
102
+ },
103
+ "options": {
104
+ "type": "object",
105
+ "description": "Passed to the plugin unread. What it accepts is described below."
106
+ }
107
+ },
108
+ "allOf": [
109
+ {
110
+ "if": {
111
+ "required": [
112
+ "plugin"
113
+ ],
114
+ "properties": {
115
+ "plugin": {
116
+ "const": "project"
117
+ }
118
+ }
119
+ },
120
+ "then": {
121
+ "properties": {
122
+ "options": {
123
+ "$ref": "#/$defs/options.project"
124
+ }
125
+ }
126
+ }
127
+ },
128
+ {
129
+ "if": {
130
+ "required": [
131
+ "plugin"
132
+ ],
133
+ "properties": {
134
+ "plugin": {
135
+ "const": "commands"
136
+ }
137
+ }
138
+ },
139
+ "then": {
140
+ "properties": {
141
+ "options": {
142
+ "$ref": "#/$defs/options.commands"
143
+ }
144
+ }
145
+ }
146
+ },
147
+ {
148
+ "if": {
149
+ "required": [
150
+ "plugin"
151
+ ],
152
+ "properties": {
153
+ "plugin": {
154
+ "const": "go-domain"
155
+ }
156
+ }
157
+ },
158
+ "then": {
159
+ "properties": {
160
+ "options": {
161
+ "$ref": "#/$defs/options.go-domain"
162
+ }
163
+ }
164
+ }
165
+ },
166
+ {
167
+ "if": {
168
+ "required": [
169
+ "plugin"
170
+ ],
171
+ "properties": {
172
+ "plugin": {
173
+ "const": "ts-domain"
174
+ }
175
+ }
176
+ },
177
+ "then": {
178
+ "properties": {
179
+ "options": {
180
+ "$ref": "#/$defs/options.ts-domain"
181
+ }
182
+ }
183
+ }
184
+ },
185
+ {
186
+ "if": {
187
+ "required": [
188
+ "plugin"
189
+ ],
190
+ "properties": {
191
+ "plugin": {
192
+ "const": "rust-domain"
193
+ }
194
+ }
195
+ },
196
+ "then": {
197
+ "properties": {
198
+ "options": {
199
+ "$ref": "#/$defs/options.rust-domain"
200
+ }
201
+ }
202
+ }
203
+ },
204
+ {
205
+ "if": {
206
+ "required": [
207
+ "plugin"
208
+ ],
209
+ "properties": {
210
+ "plugin": {
211
+ "const": "java-domain"
212
+ }
213
+ }
214
+ },
215
+ "then": {
216
+ "properties": {
217
+ "options": {
218
+ "$ref": "#/$defs/options.java-domain"
219
+ }
220
+ }
221
+ }
222
+ },
223
+ {
224
+ "if": {
225
+ "required": [
226
+ "plugin"
227
+ ],
228
+ "properties": {
229
+ "plugin": {
230
+ "const": "django-domain"
231
+ }
232
+ }
233
+ },
234
+ "then": {
235
+ "properties": {
236
+ "options": {
237
+ "$ref": "#/$defs/options.django-domain"
238
+ }
239
+ }
240
+ }
241
+ },
242
+ {
243
+ "if": {
244
+ "required": [
245
+ "plugin"
246
+ ],
247
+ "properties": {
248
+ "plugin": {
249
+ "const": "celery"
250
+ }
251
+ }
252
+ },
253
+ "then": {
254
+ "properties": {
255
+ "options": {
256
+ "$ref": "#/$defs/options.celery"
257
+ }
258
+ }
259
+ }
260
+ },
261
+ {
262
+ "if": {
263
+ "required": [
264
+ "plugin"
265
+ ],
266
+ "properties": {
267
+ "plugin": {
268
+ "const": "python-kafka"
269
+ }
270
+ }
271
+ },
272
+ "then": {
273
+ "properties": {
274
+ "options": {
275
+ "$ref": "#/$defs/options.python-kafka"
276
+ }
277
+ }
278
+ }
279
+ },
280
+ {
281
+ "if": {
282
+ "required": [
283
+ "plugin"
284
+ ],
285
+ "properties": {
286
+ "plugin": {
287
+ "const": "openapi"
288
+ }
289
+ }
290
+ },
291
+ "then": {
292
+ "properties": {
293
+ "options": {
294
+ "$ref": "#/$defs/options.openapi"
295
+ }
296
+ }
297
+ }
298
+ },
299
+ {
300
+ "if": {
301
+ "required": [
302
+ "plugin"
303
+ ],
304
+ "properties": {
305
+ "plugin": {
306
+ "const": "wsdl"
307
+ }
308
+ }
309
+ },
310
+ "then": {
311
+ "properties": {
312
+ "options": {
313
+ "$ref": "#/$defs/options.wsdl"
314
+ }
315
+ }
316
+ }
317
+ },
318
+ {
319
+ "if": {
320
+ "required": [
321
+ "plugin"
322
+ ],
323
+ "properties": {
324
+ "plugin": {
325
+ "const": "http-clients"
326
+ }
327
+ }
328
+ },
329
+ "then": {
330
+ "properties": {
331
+ "options": {
332
+ "$ref": "#/$defs/options.http-clients"
333
+ }
334
+ }
335
+ }
336
+ },
337
+ {
338
+ "if": {
339
+ "required": [
340
+ "plugin"
341
+ ],
342
+ "properties": {
343
+ "plugin": {
344
+ "const": "redis"
345
+ }
346
+ }
347
+ },
348
+ "then": {
349
+ "properties": {
350
+ "options": {
351
+ "$ref": "#/$defs/options.redis"
352
+ }
353
+ }
354
+ }
355
+ },
356
+ {
357
+ "if": {
358
+ "required": [
359
+ "plugin"
360
+ ],
361
+ "properties": {
362
+ "plugin": {
363
+ "const": "river"
364
+ }
365
+ }
366
+ },
367
+ "then": {
368
+ "properties": {
369
+ "options": {
370
+ "$ref": "#/$defs/options.river"
371
+ }
372
+ }
373
+ }
374
+ },
375
+ {
376
+ "if": {
377
+ "required": [
378
+ "plugin"
379
+ ],
380
+ "properties": {
381
+ "plugin": {
382
+ "const": "watermill"
383
+ }
384
+ }
385
+ },
386
+ "then": {
387
+ "properties": {
388
+ "options": {
389
+ "$ref": "#/$defs/options.watermill"
390
+ }
391
+ }
392
+ }
393
+ },
394
+ {
395
+ "if": {
396
+ "required": [
397
+ "plugin"
398
+ ],
399
+ "properties": {
400
+ "plugin": {
401
+ "const": "go-nats"
402
+ }
403
+ }
404
+ },
405
+ "then": {
406
+ "properties": {
407
+ "options": {
408
+ "$ref": "#/$defs/options.go-nats"
409
+ }
410
+ }
411
+ }
412
+ },
413
+ {
414
+ "if": {
415
+ "required": [
416
+ "plugin"
417
+ ],
418
+ "properties": {
419
+ "plugin": {
420
+ "const": "asyncapi"
421
+ }
422
+ }
423
+ },
424
+ "then": {
425
+ "properties": {
426
+ "options": {
427
+ "$ref": "#/$defs/options.asyncapi"
428
+ }
429
+ }
430
+ }
431
+ },
432
+ {
433
+ "if": {
434
+ "required": [
435
+ "plugin"
436
+ ],
437
+ "properties": {
438
+ "plugin": {
439
+ "const": "graphql"
440
+ }
441
+ }
442
+ },
443
+ "then": {
444
+ "properties": {
445
+ "options": {
446
+ "$ref": "#/$defs/options.graphql"
447
+ }
448
+ }
449
+ }
450
+ },
451
+ {
452
+ "if": {
453
+ "required": [
454
+ "plugin"
455
+ ],
456
+ "properties": {
457
+ "plugin": {
458
+ "const": "sql"
459
+ }
460
+ }
461
+ },
462
+ "then": {
463
+ "properties": {
464
+ "options": {
465
+ "$ref": "#/$defs/options.sql"
466
+ }
467
+ }
468
+ }
469
+ },
470
+ {
471
+ "if": {
472
+ "required": [
473
+ "plugin"
474
+ ],
475
+ "properties": {
476
+ "plugin": {
477
+ "const": "adr"
478
+ }
479
+ }
480
+ },
481
+ "then": {
482
+ "properties": {
483
+ "options": {
484
+ "$ref": "#/$defs/options.adr"
485
+ }
486
+ }
487
+ }
488
+ },
489
+ {
490
+ "if": {
491
+ "required": [
492
+ "plugin"
493
+ ],
494
+ "properties": {
495
+ "plugin": {
496
+ "const": "glossary"
497
+ }
498
+ }
499
+ },
500
+ "then": {
501
+ "properties": {
502
+ "options": {
503
+ "$ref": "#/$defs/options.glossary"
504
+ }
505
+ }
506
+ }
507
+ },
508
+ {
509
+ "if": {
510
+ "required": [
511
+ "plugin"
512
+ ],
513
+ "properties": {
514
+ "plugin": {
515
+ "const": "flows"
516
+ }
517
+ }
518
+ },
519
+ "then": {
520
+ "properties": {
521
+ "options": {
522
+ "$ref": "#/$defs/options.flows"
523
+ }
524
+ }
525
+ }
526
+ },
527
+ {
528
+ "if": {
529
+ "required": [
530
+ "plugin"
531
+ ],
532
+ "properties": {
533
+ "plugin": {
534
+ "const": "bsr"
535
+ }
536
+ }
537
+ },
538
+ "then": {
539
+ "properties": {
540
+ "options": {
541
+ "$ref": "#/$defs/options.bsr"
542
+ }
543
+ }
544
+ }
545
+ },
546
+ {
547
+ "if": {
548
+ "required": [
549
+ "plugin"
550
+ ],
551
+ "properties": {
552
+ "plugin": {
553
+ "const": "git"
554
+ }
555
+ }
556
+ },
557
+ "then": {
558
+ "properties": {
559
+ "options": {
560
+ "$ref": "#/$defs/options.git"
561
+ }
562
+ }
563
+ }
564
+ },
565
+ {
566
+ "if": {
567
+ "required": [
568
+ "plugin"
569
+ ],
570
+ "properties": {
571
+ "plugin": {
572
+ "const": "proto"
573
+ }
574
+ }
575
+ },
576
+ "then": {
577
+ "properties": {
578
+ "options": {
579
+ "$ref": "#/$defs/options.proto"
580
+ }
581
+ }
582
+ }
583
+ }
584
+ ]
585
+ },
586
+ "description": "Steps that read source and write catalog fragments. They run first, before there is a catalog."
587
+ },
588
+ "verify": {
589
+ "type": "array",
590
+ "items": {
591
+ "type": "object",
592
+ "additionalProperties": false,
593
+ "required": [
594
+ "plugin",
595
+ "in",
596
+ "out"
597
+ ],
598
+ "properties": {
599
+ "plugin": {
600
+ "enum": [
601
+ "otel",
602
+ "codeowners"
603
+ ],
604
+ "description": "A plugin declared above, one that belongs in this phase."
605
+ },
606
+ "in": {
607
+ "type": "string",
608
+ "description": "The directory to read, relative to the repository."
609
+ },
610
+ "out": {
611
+ "type": "string",
612
+ "description": "Where what comes back is written. A plugin names files; nothing it names is allowed to land outside this directory."
613
+ },
614
+ "options": {
615
+ "type": "object",
616
+ "description": "Passed to the plugin unread. What it accepts is described below."
617
+ }
618
+ },
619
+ "allOf": [
620
+ {
621
+ "if": {
622
+ "required": [
623
+ "plugin"
624
+ ],
625
+ "properties": {
626
+ "plugin": {
627
+ "const": "otel"
628
+ }
629
+ }
630
+ },
631
+ "then": {
632
+ "properties": {
633
+ "options": {
634
+ "$ref": "#/$defs/options.otel"
635
+ }
636
+ }
637
+ }
638
+ },
639
+ {
640
+ "if": {
641
+ "required": [
642
+ "plugin"
643
+ ],
644
+ "properties": {
645
+ "plugin": {
646
+ "const": "codeowners"
647
+ }
648
+ }
649
+ },
650
+ "then": {
651
+ "properties": {
652
+ "options": {
653
+ "$ref": "#/$defs/options.codeowners"
654
+ }
655
+ }
656
+ }
657
+ }
658
+ ]
659
+ },
660
+ "description": "Steps that read something observed - traces, a test's record - and answer with a fragment about the catalog somebody else declared."
661
+ },
662
+ "generate": {
663
+ "type": "array",
664
+ "items": {
665
+ "type": "object",
666
+ "additionalProperties": false,
667
+ "required": [
668
+ "plugin",
669
+ "out"
670
+ ],
671
+ "properties": {
672
+ "plugin": {
673
+ "enum": [
674
+ "markdown",
675
+ "mermaid",
676
+ "backstage"
677
+ ],
678
+ "description": "A plugin declared above, one that belongs in this phase."
679
+ },
680
+ "catalog": {
681
+ "type": "string",
682
+ "minLength": 1,
683
+ "description": "Catalog profile supplied to this generator."
684
+ },
685
+ "out": {
686
+ "type": "string",
687
+ "description": "Where what comes back is written. A plugin names files; nothing it names is allowed to land outside this directory."
688
+ },
689
+ "options": {
690
+ "type": "object",
691
+ "description": "Passed to the plugin unread. What it accepts is described below."
692
+ }
693
+ },
694
+ "allOf": [
695
+ {
696
+ "if": {
697
+ "required": [
698
+ "plugin"
699
+ ],
700
+ "properties": {
701
+ "plugin": {
702
+ "const": "markdown"
703
+ }
704
+ }
705
+ },
706
+ "then": {
707
+ "properties": {
708
+ "options": {
709
+ "$ref": "#/$defs/options.markdown"
710
+ }
711
+ }
712
+ }
713
+ },
714
+ {
715
+ "if": {
716
+ "required": [
717
+ "plugin"
718
+ ],
719
+ "properties": {
720
+ "plugin": {
721
+ "const": "mermaid"
722
+ }
723
+ }
724
+ },
725
+ "then": {
726
+ "properties": {
727
+ "options": {
728
+ "$ref": "#/$defs/options.mermaid"
729
+ }
730
+ }
731
+ }
732
+ },
733
+ {
734
+ "if": {
735
+ "required": [
736
+ "plugin"
737
+ ],
738
+ "properties": {
739
+ "plugin": {
740
+ "const": "backstage"
741
+ }
742
+ }
743
+ },
744
+ "then": {
745
+ "properties": {
746
+ "options": {
747
+ "$ref": "#/$defs/options.backstage"
748
+ }
749
+ }
750
+ }
751
+ }
752
+ ]
753
+ },
754
+ "description": "Steps that read the merged catalog and write something to read."
755
+ }
756
+ },
757
+ "$defs": {
758
+ "catalogProfile": {
759
+ "type": "object",
760
+ "additionalProperties": false,
761
+ "required": [
762
+ "id",
763
+ "title",
764
+ "sources",
765
+ "contexts",
766
+ "projects"
767
+ ],
768
+ "properties": {
769
+ "id": {
770
+ "type": "string",
771
+ "minLength": 1,
772
+ "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
773
+ "description": "Stable profile id used in URLs and generator steps."
774
+ },
775
+ "title": {
776
+ "type": "string",
777
+ "minLength": 1
778
+ },
779
+ "sources": {
780
+ "type": "array",
781
+ "minItems": 1,
782
+ "items": {
783
+ "type": "string"
784
+ },
785
+ "description": "Catalog fragment globs merged for this profile."
786
+ },
787
+ "contexts": {
788
+ "type": "array",
789
+ "minItems": 1,
790
+ "items": {
791
+ "type": "string",
792
+ "minLength": 1
793
+ },
794
+ "description": "Top-level catalog groups visible in this profile."
795
+ },
796
+ "projects": {
797
+ "type": "array",
798
+ "items": {
799
+ "type": "string",
800
+ "minLength": 1
801
+ },
802
+ "description": "Project ids belonging to this profile."
803
+ }
804
+ }
805
+ },
806
+ "project": {
807
+ "type": "object",
808
+ "additionalProperties": false,
809
+ "required": [
810
+ "id",
811
+ "name",
812
+ "root"
813
+ ],
814
+ "properties": {
815
+ "id": {
816
+ "type": "string",
817
+ "minLength": 1,
818
+ "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
819
+ "description": "Stable id used to associate pipeline inputs with this project."
820
+ },
821
+ "name": {
822
+ "type": "string",
823
+ "minLength": 1,
824
+ "description": "Human-readable project name shown in the generated site."
825
+ },
826
+ "root": {
827
+ "type": "string",
828
+ "minLength": 1,
829
+ "description": "Repository-relative root. A pipeline input at or below this path belongs to the project."
830
+ },
831
+ "context": {
832
+ "type": "string",
833
+ "minLength": 1,
834
+ "description": "Legacy alias for group. Kept so existing manifests remain valid."
835
+ },
836
+ "service": {
837
+ "type": "string",
838
+ "minLength": 1,
839
+ "description": "Legacy alias for component. Kept so existing manifests remain valid."
840
+ },
841
+ "group": {
842
+ "type": "string",
843
+ "minLength": 1,
844
+ "description": "Neutral top-level group this project contributes to."
845
+ },
846
+ "component": {
847
+ "type": "string",
848
+ "minLength": 1,
849
+ "description": "Component slug inside the group."
850
+ },
851
+ "groupKind": {
852
+ "enum": [
853
+ "bounded-context",
854
+ "system",
855
+ "product",
856
+ "team",
857
+ "namespace"
858
+ ],
859
+ "description": "Semantic role of the project's top-level group."
860
+ },
861
+ "componentKind": {
862
+ "enum": [
863
+ "service",
864
+ "application",
865
+ "webapp",
866
+ "worker",
867
+ "job",
868
+ "function",
869
+ "cli",
870
+ "library",
871
+ "data-pipeline"
872
+ ],
873
+ "description": "Runtime or code role of the project component."
874
+ },
875
+ "repository": {
876
+ "type": "string",
877
+ "minLength": 1,
878
+ "description": "Repository page or clone URL, when the project comes from another repository."
879
+ }
880
+ }
881
+ },
882
+ "plugin": {
883
+ "type": "object",
884
+ "additionalProperties": false,
885
+ "required": [
886
+ "name"
887
+ ],
888
+ "oneOf": [
889
+ {
890
+ "required": [
891
+ "wasm"
892
+ ]
893
+ },
894
+ {
895
+ "required": [
896
+ "process"
897
+ ]
898
+ }
899
+ ],
900
+ "properties": {
901
+ "name": {
902
+ "type": "string",
903
+ "description": "What the steps below call this plugin. It need not be the plugin's own name."
904
+ },
905
+ "wasm": {
906
+ "type": "object",
907
+ "additionalProperties": false,
908
+ "required": [
909
+ "url"
910
+ ],
911
+ "description": "The default. The module gets no filesystem, no network and no environment, so a plugin from somebody else's repository can be run over your source tree without reading it.",
912
+ "properties": {
913
+ "url": {
914
+ "type": "string",
915
+ "pattern": "^(https://|file://)",
916
+ "description": "https:// to download, or file:// for a path beside the manifest, as in file://plugins/gen-markdown.wasm."
917
+ },
918
+ "sha256": {
919
+ "type": "string",
920
+ "pattern": "^[0-9a-f]{64}$",
921
+ "description": "Checksum of the module. Required for a download; optional for a local file, which it does not protect."
922
+ }
923
+ }
924
+ },
925
+ "process": {
926
+ "type": "object",
927
+ "additionalProperties": false,
928
+ "required": [
929
+ "command"
930
+ ],
931
+ "description": "The escape hatch for a plugin that needs a toolchain. Same protocol, none of the sandbox, which is the trade being made.",
932
+ "properties": {
933
+ "command": {
934
+ "type": "string",
935
+ "minLength": 1,
936
+ "description": "The executable to run. It is passed directly to the OS, never through a shell."
937
+ },
938
+ "args": {
939
+ "type": "array",
940
+ "items": {
941
+ "type": "string"
942
+ },
943
+ "description": "Arguments passed to the executable without shell parsing."
944
+ }
945
+ }
946
+ }
947
+ }
948
+ },
949
+ "options.project": {
950
+ "type": "object",
951
+ "additionalProperties": false,
952
+ "properties": {
953
+ "group": {
954
+ "type": "string",
955
+ "description": "Slug of the neutral top-level group. Defaults to the input directory name."
956
+ },
957
+ "groupName": {
958
+ "type": "string",
959
+ "description": "Human-readable group name. Defaults to the group slug, titled."
960
+ },
961
+ "groupSummary": {
962
+ "type": "string",
963
+ "description": "A short statement of what the group is responsible for."
964
+ },
965
+ "groupKind": {
966
+ "enum": [
967
+ "bounded-context",
968
+ "system",
969
+ "product",
970
+ "team",
971
+ "namespace"
972
+ ],
973
+ "description": "Semantic role of the top-level group. Defaults to system for this neutral extractor."
974
+ },
975
+ "component": {
976
+ "type": "string",
977
+ "description": "Slug of the component. Defaults to the input directory name."
978
+ },
979
+ "componentName": {
980
+ "type": "string",
981
+ "description": "Human-readable component name. Defaults to the README title and then the slug, titled."
982
+ },
983
+ "componentKind": {
984
+ "enum": [
985
+ "service",
986
+ "application",
987
+ "webapp",
988
+ "worker",
989
+ "job",
990
+ "function",
991
+ "cli",
992
+ "library",
993
+ "data-pipeline"
994
+ ],
995
+ "description": "Runtime or code role. When absent, the extractor uses conservative repository evidence."
996
+ },
997
+ "technologies": {
998
+ "type": "array",
999
+ "items": {
1000
+ "type": "string"
1001
+ },
1002
+ "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."
1003
+ },
1004
+ "repo": {
1005
+ "type": "string",
1006
+ "description": "Source repository identity. Defaults to a Go module, package.json repository, Cargo package, or Maven coordinates when present."
1007
+ },
1008
+ "out": {
1009
+ "type": "string",
1010
+ "description": "Name of the fragment file inside the step output directory.",
1011
+ "default": "project.json"
1012
+ }
1013
+ }
1014
+ },
1015
+ "options.commands": {
1016
+ "type": "object",
1017
+ "additionalProperties": false,
1018
+ "properties": {
1019
+ "context": {
1020
+ "type": "string",
1021
+ "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.",
1022
+ "examples": [
1023
+ "auth",
1024
+ "shop"
1025
+ ]
1026
+ },
1027
+ "service": {
1028
+ "type": "string",
1029
+ "description": "Slug of the service the commands belong to. Left out, the name of the input directory.",
1030
+ "examples": [
1031
+ "cart",
1032
+ "pricing"
1033
+ ]
1034
+ },
1035
+ "out": {
1036
+ "type": "string",
1037
+ "description": "Name of the fragment file, inside the step's output directory. Left out, commands.json."
1038
+ }
1039
+ }
1040
+ },
1041
+ "options.go-domain": {
1042
+ "type": "object",
1043
+ "additionalProperties": false,
1044
+ "properties": {
1045
+ "context": {
1046
+ "type": "string",
1047
+ "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.",
1048
+ "examples": [
1049
+ "auth",
1050
+ "shop"
1051
+ ]
1052
+ },
1053
+ "contextName": {
1054
+ "type": "string",
1055
+ "description": "What the context is called on the page. Defaults to the slug, titled.",
1056
+ "examples": [
1057
+ "Authentication"
1058
+ ]
1059
+ },
1060
+ "contextSummary": {
1061
+ "type": "string",
1062
+ "description": "A sentence or two on what the context is responsible for. Read on the context page and nowhere else."
1063
+ },
1064
+ "classification": {
1065
+ "enum": [
1066
+ "core",
1067
+ "supporting",
1068
+ "generic"
1069
+ ],
1070
+ "description": "Whether the context is core to the business, supports it, or is generic and could be bought."
1071
+ },
1072
+ "service": {
1073
+ "type": "string",
1074
+ "description": "Slug of the service. Defaults to the name of the input directory.",
1075
+ "examples": [
1076
+ "auth"
1077
+ ]
1078
+ },
1079
+ "serviceName": {
1080
+ "type": "string",
1081
+ "description": "What the service is called on the page. Defaults to the title of its README, and failing that to the slug, titled."
1082
+ },
1083
+ "repo": {
1084
+ "type": "string",
1085
+ "description": "Where the source lives. Defaults to the module path in go.mod.",
1086
+ "examples": [
1087
+ "github.com/shortlink-org/portolan"
1088
+ ]
1089
+ },
1090
+ "store": {
1091
+ "type": "string",
1092
+ "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.",
1093
+ "examples": [
1094
+ "pg"
1095
+ ]
1096
+ },
1097
+ "peers": {
1098
+ "type": "object",
1099
+ "additionalProperties": {
1100
+ "type": "string"
1101
+ },
1102
+ "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.",
1103
+ "examples": [
1104
+ {
1105
+ "risk.v1": "shop.risk",
1106
+ "auth.v1": "auth.auth"
1107
+ }
1108
+ ]
1109
+ },
1110
+ "externals": {
1111
+ "type": "object",
1112
+ "additionalProperties": {
1113
+ "type": "string"
1114
+ },
1115
+ "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.",
1116
+ "examples": [
1117
+ {
1118
+ "stripe.v1": "stripe"
1119
+ }
1120
+ ]
1121
+ },
1122
+ "events": {
1123
+ "type": "object",
1124
+ "additionalProperties": {
1125
+ "type": "string"
1126
+ },
1127
+ "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.",
1128
+ "examples": [
1129
+ {
1130
+ "github.com/acme/shop/pricing/internal/infrastructure/cart": "shop.cart.basket"
1131
+ }
1132
+ ]
1133
+ },
1134
+ "out": {
1135
+ "type": "string",
1136
+ "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.",
1137
+ "default": "domain.json"
1138
+ }
1139
+ }
1140
+ },
1141
+ "options.ts-domain": {
1142
+ "type": "object",
1143
+ "additionalProperties": false,
1144
+ "properties": {
1145
+ "context": {
1146
+ "type": "string",
1147
+ "description": "Slug of the bounded context this service belongs to. Defaults to the name of the input directory.",
1148
+ "examples": [
1149
+ "shop"
1150
+ ]
1151
+ },
1152
+ "contextName": {
1153
+ "type": "string",
1154
+ "description": "What the context is called on the page. Defaults to the slug, titled."
1155
+ },
1156
+ "contextSummary": {
1157
+ "type": "string",
1158
+ "description": "A sentence or two on what the context is responsible for."
1159
+ },
1160
+ "classification": {
1161
+ "enum": [
1162
+ "core",
1163
+ "supporting",
1164
+ "generic"
1165
+ ],
1166
+ "description": "Whether the context is core to the business, supports it, or is generic and could be bought."
1167
+ },
1168
+ "service": {
1169
+ "type": "string",
1170
+ "description": "Slug of the service. Defaults to the name of the input directory.",
1171
+ "examples": [
1172
+ "cart"
1173
+ ]
1174
+ },
1175
+ "serviceName": {
1176
+ "type": "string",
1177
+ "description": "What the service is called on the page. Defaults to the title of its README, and failing that to the slug, titled."
1178
+ },
1179
+ "repo": {
1180
+ "type": "string",
1181
+ "description": "Where the source lives. Defaults to the repository field of package.json.",
1182
+ "examples": [
1183
+ "github.com/shortlink-org/portolan"
1184
+ ]
1185
+ },
1186
+ "store": {
1187
+ "type": "string",
1188
+ "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.",
1189
+ "examples": [
1190
+ "pg"
1191
+ ]
1192
+ },
1193
+ "peers": {
1194
+ "type": "object",
1195
+ "additionalProperties": {
1196
+ "type": "string"
1197
+ },
1198
+ "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.",
1199
+ "examples": [
1200
+ {
1201
+ "auth.v1": "auth.auth",
1202
+ "shop.v1": "shop.pricing"
1203
+ }
1204
+ ]
1205
+ },
1206
+ "events": {
1207
+ "type": "object",
1208
+ "additionalProperties": {
1209
+ "type": "string"
1210
+ },
1211
+ "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.",
1212
+ "examples": [
1213
+ {
1214
+ "@acme/payments-events": "payments.ledger.payment"
1215
+ }
1216
+ ]
1217
+ },
1218
+ "source": {
1219
+ "type": "string",
1220
+ "description": "The directory the layout starts in, relative to the input root.",
1221
+ "default": "src"
1222
+ },
1223
+ "out": {
1224
+ "type": "string",
1225
+ "description": "Name of the fragment file, inside the step's output directory.",
1226
+ "default": "domain.json"
1227
+ },
1228
+ "graphql": {
1229
+ "type": "string",
1230
+ "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.",
1231
+ "examples": [
1232
+ "src/schema"
1233
+ ]
1234
+ }
1235
+ }
1236
+ },
1237
+ "options.rust-domain": {
1238
+ "type": "object",
1239
+ "additionalProperties": false,
1240
+ "properties": {
1241
+ "context": {
1242
+ "type": "string",
1243
+ "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.",
1244
+ "examples": [
1245
+ "shop"
1246
+ ]
1247
+ },
1248
+ "contextName": {
1249
+ "type": "string",
1250
+ "description": "What the context is called on the page. Defaults to the slug, titled.",
1251
+ "examples": [
1252
+ "Shop"
1253
+ ]
1254
+ },
1255
+ "contextSummary": {
1256
+ "type": "string",
1257
+ "description": "A sentence or two on what the context is responsible for. Read on the context page and nowhere else."
1258
+ },
1259
+ "classification": {
1260
+ "enum": [
1261
+ "core",
1262
+ "supporting",
1263
+ "generic"
1264
+ ],
1265
+ "description": "Whether the context is core to the business, supports it, or is generic and could be bought."
1266
+ },
1267
+ "service": {
1268
+ "type": "string",
1269
+ "description": "Slug of the service. Defaults to the name of the input directory.",
1270
+ "examples": [
1271
+ "oms"
1272
+ ]
1273
+ },
1274
+ "serviceName": {
1275
+ "type": "string",
1276
+ "description": "What the service is called on the page. Defaults to the title of its README, and failing that to the slug, titled."
1277
+ },
1278
+ "repo": {
1279
+ "type": "string",
1280
+ "description": "Where the source lives. Defaults to the repository in Cargo.toml.",
1281
+ "examples": [
1282
+ "github.com/shortlink-org/portolan"
1283
+ ]
1284
+ },
1285
+ "store": {
1286
+ "type": "string",
1287
+ "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.",
1288
+ "examples": [
1289
+ "pg"
1290
+ ]
1291
+ },
1292
+ "peers": {
1293
+ "type": "object",
1294
+ "additionalProperties": {
1295
+ "type": "string"
1296
+ },
1297
+ "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.",
1298
+ "examples": [
1299
+ {
1300
+ "payments.v1": "payments.ledger"
1301
+ }
1302
+ ]
1303
+ },
1304
+ "events": {
1305
+ "type": "object",
1306
+ "additionalProperties": {
1307
+ "type": "string"
1308
+ },
1309
+ "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.",
1310
+ "examples": [
1311
+ {
1312
+ "crate::infrastructure::cart": "shop.cart.basket"
1313
+ }
1314
+ ]
1315
+ },
1316
+ "source": {
1317
+ "type": "string",
1318
+ "description": "The directory the layout starts in, relative to the input root.",
1319
+ "default": "src"
1320
+ },
1321
+ "out": {
1322
+ "type": "string",
1323
+ "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.",
1324
+ "default": "domain.json"
1325
+ }
1326
+ }
1327
+ },
1328
+ "options.java-domain": {
1329
+ "type": "object",
1330
+ "additionalProperties": false,
1331
+ "properties": {
1332
+ "context": {
1333
+ "type": "string",
1334
+ "description": "Slug of the bounded context this service belongs to. Defaults to the name of the input directory.",
1335
+ "examples": [
1336
+ "payments"
1337
+ ]
1338
+ },
1339
+ "contextName": {
1340
+ "type": "string",
1341
+ "description": "What the context is called on the page. Defaults to the slug, titled."
1342
+ },
1343
+ "contextSummary": {
1344
+ "type": "string",
1345
+ "description": "A sentence or two on what the context is responsible for."
1346
+ },
1347
+ "classification": {
1348
+ "enum": [
1349
+ "core",
1350
+ "supporting",
1351
+ "generic"
1352
+ ],
1353
+ "description": "Whether the context is core to the business, supports it, or is generic and could be bought."
1354
+ },
1355
+ "service": {
1356
+ "type": "string",
1357
+ "description": "Slug of the service. Defaults to the name of the input directory.",
1358
+ "examples": [
1359
+ "ledger"
1360
+ ]
1361
+ },
1362
+ "serviceName": {
1363
+ "type": "string",
1364
+ "description": "What the service is called on the page. Defaults to the title of its README, and failing that to the slug, titled."
1365
+ },
1366
+ "repo": {
1367
+ "type": "string",
1368
+ "description": "Where the source lives. Defaults to the scm url in pom.xml.",
1369
+ "examples": [
1370
+ "github.com/shortlink-org/portolan"
1371
+ ]
1372
+ },
1373
+ "store": {
1374
+ "type": "string",
1375
+ "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.",
1376
+ "examples": [
1377
+ "pg"
1378
+ ]
1379
+ },
1380
+ "peers": {
1381
+ "type": "object",
1382
+ "additionalProperties": {
1383
+ "type": "string"
1384
+ },
1385
+ "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.",
1386
+ "examples": [
1387
+ {
1388
+ "shop.v1": "shop.oms",
1389
+ "pricing.v1": "shop.pricing"
1390
+ }
1391
+ ]
1392
+ },
1393
+ "externals": {
1394
+ "type": "object",
1395
+ "additionalProperties": {
1396
+ "type": "string"
1397
+ },
1398
+ "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.",
1399
+ "examples": [
1400
+ {
1401
+ "stripe.v1": "stripe"
1402
+ }
1403
+ ]
1404
+ },
1405
+ "events": {
1406
+ "type": "object",
1407
+ "additionalProperties": {
1408
+ "type": "string"
1409
+ },
1410
+ "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.",
1411
+ "examples": [
1412
+ {
1413
+ "org.portolan.payments.ledger.infrastructure.oms.event": "shop.oms.order"
1414
+ }
1415
+ ]
1416
+ },
1417
+ "source": {
1418
+ "type": "string",
1419
+ "description": "The directory the packages start in, relative to the input root.",
1420
+ "default": "src/main/java"
1421
+ },
1422
+ "out": {
1423
+ "type": "string",
1424
+ "description": "Name of the fragment file, inside the step's output directory.",
1425
+ "default": "domain.json"
1426
+ }
1427
+ }
1428
+ },
1429
+ "options.django-domain": {
1430
+ "type": "object",
1431
+ "additionalProperties": false,
1432
+ "properties": {
1433
+ "context": {
1434
+ "type": "string",
1435
+ "description": "Slug of the bounded context this service belongs to. Defaults to the name of the input directory.",
1436
+ "examples": [
1437
+ "shop"
1438
+ ]
1439
+ },
1440
+ "contextName": {
1441
+ "type": "string",
1442
+ "description": "What the context is called on the page. Defaults to the slug, titled."
1443
+ },
1444
+ "contextSummary": {
1445
+ "type": "string",
1446
+ "description": "A sentence or two on what the context is responsible for."
1447
+ },
1448
+ "classification": {
1449
+ "enum": [
1450
+ "core",
1451
+ "supporting",
1452
+ "generic"
1453
+ ],
1454
+ "description": "Whether the context is core to the business, supports it, or is generic and could be bought."
1455
+ },
1456
+ "service": {
1457
+ "type": "string",
1458
+ "description": "Slug of the service. Defaults to the name of the input directory.",
1459
+ "examples": [
1460
+ "billing"
1461
+ ]
1462
+ },
1463
+ "serviceName": {
1464
+ "type": "string",
1465
+ "description": "What the service is called on the page. Defaults to the title of its README, and failing that to the slug, titled."
1466
+ },
1467
+ "repo": {
1468
+ "type": "string",
1469
+ "description": "Where the source lives. Defaults to the repository url in pyproject.toml.",
1470
+ "examples": [
1471
+ "github.com/shortlink-org/portolan"
1472
+ ]
1473
+ },
1474
+ "store": {
1475
+ "type": "string",
1476
+ "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.",
1477
+ "examples": [
1478
+ "pg"
1479
+ ]
1480
+ },
1481
+ "storeName": {
1482
+ "type": "string",
1483
+ "description": "What the database is called on the page. Defaults to the service, titled, and the word database."
1484
+ },
1485
+ "storeKind": {
1486
+ "enum": [
1487
+ "postgres",
1488
+ "mysql",
1489
+ "sqlite",
1490
+ "redis",
1491
+ "mongodb",
1492
+ "clickhouse",
1493
+ "s3",
1494
+ "other"
1495
+ ],
1496
+ "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."
1497
+ },
1498
+ "apps": {
1499
+ "type": "array",
1500
+ "items": {
1501
+ "type": "string"
1502
+ },
1503
+ "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.",
1504
+ "examples": [
1505
+ [
1506
+ "billing.invoices"
1507
+ ]
1508
+ ]
1509
+ },
1510
+ "aggregates": {
1511
+ "type": "object",
1512
+ "additionalProperties": {
1513
+ "type": "string"
1514
+ },
1515
+ "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.",
1516
+ "examples": [
1517
+ {
1518
+ "invoices": "Invoice"
1519
+ }
1520
+ ]
1521
+ },
1522
+ "peers": {
1523
+ "type": "object",
1524
+ "additionalProperties": {
1525
+ "type": "string"
1526
+ },
1527
+ "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.",
1528
+ "examples": [
1529
+ {
1530
+ "pricing.v1": "shop.pricing"
1531
+ }
1532
+ ]
1533
+ },
1534
+ "events": {
1535
+ "type": "object",
1536
+ "additionalProperties": {
1537
+ "type": "string"
1538
+ },
1539
+ "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.",
1540
+ "examples": [
1541
+ {
1542
+ "payments.events": "payments.ledger.payment"
1543
+ }
1544
+ ]
1545
+ },
1546
+ "flowWrappers": {
1547
+ "type": "object",
1548
+ "additionalProperties": {
1549
+ "type": "object",
1550
+ "additionalProperties": false,
1551
+ "properties": {
1552
+ "label": {
1553
+ "type": "string",
1554
+ "description": "Business-facing label shown instead of expanding the wrapper's implementation. Defaults to the callable name, titled."
1555
+ },
1556
+ "target": {
1557
+ "type": "string",
1558
+ "description": "Service id the wrapper calls. Omit for a semantic operation inside this service."
1559
+ },
1560
+ "technical": {
1561
+ "type": "boolean",
1562
+ "default": false,
1563
+ "description": "Collapse every call to this wrapper in one flow into one counted step."
1564
+ }
1565
+ }
1566
+ },
1567
+ "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.",
1568
+ "examples": [
1569
+ {
1570
+ "util.logger.send_log": {
1571
+ "label": "Record application log",
1572
+ "technical": true
1573
+ },
1574
+ "mailer.client.send": {
1575
+ "label": "Send email",
1576
+ "target": "messaging.mailer"
1577
+ }
1578
+ }
1579
+ ]
1580
+ },
1581
+ "source": {
1582
+ "type": "string",
1583
+ "description": "The directory the applications are looked for in, relative to the input root.",
1584
+ "default": "."
1585
+ },
1586
+ "settings": {
1587
+ "type": "string",
1588
+ "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.",
1589
+ "examples": [
1590
+ "config.settings"
1591
+ ]
1592
+ },
1593
+ "out": {
1594
+ "type": "string",
1595
+ "description": "Name of the fragment file, inside the step's output directory.",
1596
+ "default": "domain.json"
1597
+ },
1598
+ "storesOut": {
1599
+ "type": "string",
1600
+ "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'].",
1601
+ "default": "stores.json"
1602
+ },
1603
+ "openapiOut": {
1604
+ "type": "string",
1605
+ "description": "Name of the inferred OpenAPI 3.1 document, inside the step's output directory. Written when URLConf exposes HTTP operations.",
1606
+ "default": "openapi.inferred.yaml"
1607
+ }
1608
+ }
1609
+ },
1610
+ "options.celery": {
1611
+ "type": "object",
1612
+ "additionalProperties": false,
1613
+ "properties": {
1614
+ "context": {
1615
+ "type": "string",
1616
+ "description": "Slug of the bounded context the service belongs to. Defaults to the name of the input directory.",
1617
+ "examples": [
1618
+ "shop"
1619
+ ]
1620
+ },
1621
+ "service": {
1622
+ "type": "string",
1623
+ "description": "Slug of the service that enqueues and works the tasks. Defaults to the name of the input directory.",
1624
+ "examples": [
1625
+ "billing"
1626
+ ]
1627
+ },
1628
+ "source": {
1629
+ "type": "string",
1630
+ "description": "The directory the tasks and their callers are looked for in, relative to the input root.",
1631
+ "default": "."
1632
+ },
1633
+ "settings": {
1634
+ "type": "string",
1635
+ "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.",
1636
+ "examples": [
1637
+ "config.settings"
1638
+ ]
1639
+ },
1640
+ "out": {
1641
+ "type": "string",
1642
+ "description": "Name of the fragment file, inside the step's output directory.",
1643
+ "default": "celery.json"
1644
+ }
1645
+ }
1646
+ },
1647
+ "options.python-kafka": {
1648
+ "type": "object",
1649
+ "additionalProperties": false,
1650
+ "properties": {
1651
+ "context": {
1652
+ "type": "string",
1653
+ "description": "Slug of the bounded context the service belongs to. Defaults to the input directory name.",
1654
+ "examples": [
1655
+ "shop"
1656
+ ]
1657
+ },
1658
+ "service": {
1659
+ "type": "string",
1660
+ "description": "Slug of the service that uses Kafka. Defaults to the input directory name.",
1661
+ "examples": [
1662
+ "billing"
1663
+ ]
1664
+ },
1665
+ "source": {
1666
+ "type": "string",
1667
+ "description": "Python source directory to inspect, relative to the input root.",
1668
+ "default": "."
1669
+ },
1670
+ "settings": {
1671
+ "type": "string",
1672
+ "description": "Optional settings module used to resolve values referenced as settings.NAME.",
1673
+ "examples": [
1674
+ "config.settings"
1675
+ ]
1676
+ },
1677
+ "out": {
1678
+ "type": "string",
1679
+ "description": "Fragment filename inside the extraction step output directory.",
1680
+ "default": "kafka.json"
1681
+ }
1682
+ }
1683
+ },
1684
+ "options.openapi": {
1685
+ "type": "object",
1686
+ "additionalProperties": false,
1687
+ "properties": {
1688
+ "context": {
1689
+ "type": "string",
1690
+ "description": "Slug of the bounded context that owns the service this document belongs to. Defaults to the name of the input directory.",
1691
+ "examples": [
1692
+ "auth"
1693
+ ]
1694
+ },
1695
+ "service": {
1696
+ "type": "string",
1697
+ "description": "Slug of the service the document describes. Defaults to the name of the input directory.",
1698
+ "examples": [
1699
+ "auth"
1700
+ ]
1701
+ },
1702
+ "spec": {
1703
+ "type": "string",
1704
+ "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.",
1705
+ "examples": [
1706
+ "internal/infrastructure/transport/http/gen/openapi.yaml"
1707
+ ]
1708
+ },
1709
+ "peers": {
1710
+ "type": "object",
1711
+ "additionalProperties": {
1712
+ "type": "string"
1713
+ },
1714
+ "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.",
1715
+ "examples": [
1716
+ {
1717
+ "auth.v1": "auth.auth"
1718
+ }
1719
+ ]
1720
+ },
1721
+ "externals": {
1722
+ "type": "object",
1723
+ "additionalProperties": {
1724
+ "type": "string"
1725
+ },
1726
+ "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.",
1727
+ "examples": [
1728
+ {
1729
+ "stripe.v1": "stripe"
1730
+ }
1731
+ ]
1732
+ },
1733
+ "api": {
1734
+ "type": "string",
1735
+ "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.",
1736
+ "examples": [
1737
+ "auth.v1"
1738
+ ]
1739
+ },
1740
+ "external": {
1741
+ "type": "string",
1742
+ "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.",
1743
+ "examples": [
1744
+ "stripe"
1745
+ ]
1746
+ },
1747
+ "externalName": {
1748
+ "type": "string",
1749
+ "description": "What the external is called on the page.",
1750
+ "examples": [
1751
+ "Stripe"
1752
+ ]
1753
+ },
1754
+ "externalSummary": {
1755
+ "type": "string",
1756
+ "description": "A sentence or two on what the estate uses it for."
1757
+ },
1758
+ "externalUrl": {
1759
+ "type": "string",
1760
+ "description": "Where the third party documents itself, for a reader who needs more than the vendored copy.",
1761
+ "examples": [
1762
+ "https://docs.stripe.com/api"
1763
+ ]
1764
+ },
1765
+ "out": {
1766
+ "type": "string",
1767
+ "description": "Name of the fragment file, inside the step's output directory.",
1768
+ "default": "api.json"
1769
+ }
1770
+ }
1771
+ },
1772
+ "options.wsdl": {
1773
+ "type": "object",
1774
+ "additionalProperties": false,
1775
+ "properties": {
1776
+ "context": {
1777
+ "type": "string",
1778
+ "description": "Top-level group that owns the component implementing the WSDL contract.",
1779
+ "examples": [
1780
+ "booking"
1781
+ ]
1782
+ },
1783
+ "service": {
1784
+ "type": "string",
1785
+ "description": "Component implementing the WSDL contract.",
1786
+ "examples": [
1787
+ "gateway"
1788
+ ]
1789
+ },
1790
+ "spec": {
1791
+ "type": "string",
1792
+ "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.",
1793
+ "examples": [
1794
+ "contracts/booking.wsdl"
1795
+ ]
1796
+ },
1797
+ "api": {
1798
+ "type": "string",
1799
+ "description": "API id prefix for a single contract. Defaults to the WSDL service name plus .soap.",
1800
+ "examples": [
1801
+ "booking.soap"
1802
+ ]
1803
+ },
1804
+ "mode": {
1805
+ "type": "string",
1806
+ "enum": [
1807
+ "service",
1808
+ "external"
1809
+ ],
1810
+ "default": "service",
1811
+ "description": "Whether the contract is implemented by this component or is a local copy used to call external systems."
1812
+ },
1813
+ "external": {
1814
+ "type": "string",
1815
+ "description": "One external id for all discovered contracts. In external mode, each WSDL service otherwise derives its own external id."
1816
+ },
1817
+ "externals": {
1818
+ "type": "object",
1819
+ "additionalProperties": {
1820
+ "type": "string"
1821
+ },
1822
+ "description": "External id overrides keyed by derived API id.",
1823
+ "examples": [
1824
+ {
1825
+ "booking-service.soap": "booking-provider"
1826
+ }
1827
+ ]
1828
+ },
1829
+ "externalName": {
1830
+ "type": "string",
1831
+ "description": "Display name when external names one combined system."
1832
+ },
1833
+ "externalSummary": {
1834
+ "type": "string",
1835
+ "description": "Description when external names one combined system."
1836
+ },
1837
+ "externalUrl": {
1838
+ "type": "string",
1839
+ "description": "Documentation URL when it differs from the SOAP endpoint."
1840
+ },
1841
+ "out": {
1842
+ "type": "string",
1843
+ "description": "Fragment file name inside the step output directory.",
1844
+ "default": "wsdl.json"
1845
+ }
1846
+ }
1847
+ },
1848
+ "options.http-clients": {
1849
+ "type": "object",
1850
+ "additionalProperties": false,
1851
+ "properties": {
1852
+ "context": {
1853
+ "type": "string",
1854
+ "description": "Slug of the top-level group that owns the component. Defaults to the input directory name.",
1855
+ "examples": [
1856
+ "avia"
1857
+ ]
1858
+ },
1859
+ "service": {
1860
+ "type": "string",
1861
+ "description": "Slug of the component making outbound calls. Defaults to the input directory name.",
1862
+ "examples": [
1863
+ "billing"
1864
+ ]
1865
+ },
1866
+ "peers": {
1867
+ "type": "object",
1868
+ "additionalProperties": {
1869
+ "type": "string"
1870
+ },
1871
+ "description": "Internal service answering an API, as API id to service id.",
1872
+ "examples": [
1873
+ {
1874
+ "auth.v1": "auth.auth"
1875
+ }
1876
+ ]
1877
+ },
1878
+ "externals": {
1879
+ "type": "object",
1880
+ "additionalProperties": {
1881
+ "type": "string"
1882
+ },
1883
+ "description": "Override for the external system named by a vendored client contract, as API id to external id.",
1884
+ "examples": [
1885
+ {
1886
+ "gordian.v2": "gordian"
1887
+ }
1888
+ ]
1889
+ },
1890
+ "out": {
1891
+ "type": "string",
1892
+ "description": "Name of the fragment file inside the step output directory.",
1893
+ "default": "http-clients.json"
1894
+ }
1895
+ }
1896
+ },
1897
+ "options.redis": {
1898
+ "type": "object",
1899
+ "additionalProperties": false,
1900
+ "properties": {
1901
+ "context": {
1902
+ "type": "string",
1903
+ "description": "Slug of the top-level group that owns the component. Defaults to the input directory name.",
1904
+ "examples": [
1905
+ "avia"
1906
+ ]
1907
+ },
1908
+ "service": {
1909
+ "type": "string",
1910
+ "description": "Slug of the component that constructs the Redis client. Defaults to the input directory name.",
1911
+ "examples": [
1912
+ "aviasupp"
1913
+ ]
1914
+ },
1915
+ "store": {
1916
+ "type": "string",
1917
+ "description": "Slug of the Redis store beneath the component.",
1918
+ "default": "redis"
1919
+ },
1920
+ "name": {
1921
+ "type": "string",
1922
+ "description": "Human-readable store name. Defaults to '<service> Redis'."
1923
+ },
1924
+ "out": {
1925
+ "type": "string",
1926
+ "description": "Name of the fragment file inside the step output directory.",
1927
+ "default": "redis.json"
1928
+ }
1929
+ }
1930
+ },
1931
+ "options.river": {
1932
+ "type": "object",
1933
+ "additionalProperties": false,
1934
+ "properties": {
1935
+ "context": {
1936
+ "type": "string",
1937
+ "description": "Slug of the top-level group that owns the component. Defaults to the input directory name.",
1938
+ "examples": [
1939
+ "avia"
1940
+ ]
1941
+ },
1942
+ "service": {
1943
+ "type": "string",
1944
+ "description": "Slug of the component that inserts or handles River jobs. Defaults to the input directory name.",
1945
+ "examples": [
1946
+ "billing"
1947
+ ]
1948
+ },
1949
+ "out": {
1950
+ "type": "string",
1951
+ "description": "Name of the fragment file inside the step output directory.",
1952
+ "default": "river.json"
1953
+ }
1954
+ }
1955
+ },
1956
+ "options.watermill": {
1957
+ "type": "object",
1958
+ "additionalProperties": false,
1959
+ "properties": {
1960
+ "context": {
1961
+ "type": "string",
1962
+ "description": "Slug of the top-level group that owns the component. Defaults to the input directory name.",
1963
+ "examples": [
1964
+ "avia"
1965
+ ]
1966
+ },
1967
+ "service": {
1968
+ "type": "string",
1969
+ "description": "Slug of the component that registers Watermill handlers or publishes messages. Defaults to the input directory name.",
1970
+ "examples": [
1971
+ "billing"
1972
+ ]
1973
+ },
1974
+ "out": {
1975
+ "type": "string",
1976
+ "description": "Name of the fragment file inside the step output directory.",
1977
+ "default": "watermill.json"
1978
+ }
1979
+ }
1980
+ },
1981
+ "options.go-nats": {
1982
+ "type": "object",
1983
+ "additionalProperties": false,
1984
+ "properties": {
1985
+ "context": {
1986
+ "type": "string",
1987
+ "description": "Slug of the bounded context this service belongs to. Defaults to the name of the input directory.",
1988
+ "examples": [
1989
+ "shop"
1990
+ ]
1991
+ },
1992
+ "service": {
1993
+ "type": "string",
1994
+ "description": "Slug of the service. Defaults to the name of the input directory.",
1995
+ "examples": [
1996
+ "pricing"
1997
+ ]
1998
+ },
1999
+ "out": {
2000
+ "type": "string",
2001
+ "description": "Name of the fragment file, inside the step's output directory.",
2002
+ "default": "nats.json"
2003
+ }
2004
+ }
2005
+ },
2006
+ "options.asyncapi": {
2007
+ "type": "object",
2008
+ "additionalProperties": false,
2009
+ "properties": {
2010
+ "context": {
2011
+ "type": "string",
2012
+ "description": "Slug of the bounded context that owns the service this document belongs to. Defaults to the name of the input directory.",
2013
+ "examples": [
2014
+ "shop"
2015
+ ]
2016
+ },
2017
+ "service": {
2018
+ "type": "string",
2019
+ "description": "Slug of the service the document describes. Defaults to the name of the input directory.",
2020
+ "examples": [
2021
+ "cart"
2022
+ ]
2023
+ },
2024
+ "spec": {
2025
+ "type": "string",
2026
+ "description": "The AsyncAPI document, relative to the input root. Left out, the extractor looks for one.",
2027
+ "examples": [
2028
+ "src/infrastructure/bus/gen/asyncapi.yaml"
2029
+ ]
2030
+ },
2031
+ "out": {
2032
+ "type": "string",
2033
+ "description": "Name of the fragment file, inside the step's output directory.",
2034
+ "default": "bus.json"
2035
+ }
2036
+ }
2037
+ },
2038
+ "options.graphql": {
2039
+ "type": "object",
2040
+ "additionalProperties": false,
2041
+ "properties": {
2042
+ "context": {
2043
+ "type": "string",
2044
+ "description": "Slug of the bounded context that owns the service this schema belongs to. Defaults to the name of the input directory.",
2045
+ "examples": [
2046
+ "storefront"
2047
+ ]
2048
+ },
2049
+ "service": {
2050
+ "type": "string",
2051
+ "description": "Slug of the service the schema describes. Defaults to the name of the input directory.",
2052
+ "examples": [
2053
+ "bff"
2054
+ ]
2055
+ },
2056
+ "schema": {
2057
+ "type": "string",
2058
+ "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.",
2059
+ "examples": [
2060
+ "src/schema"
2061
+ ]
2062
+ },
2063
+ "api": {
2064
+ "type": "string",
2065
+ "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.",
2066
+ "examples": [
2067
+ "storefront.v1"
2068
+ ]
2069
+ },
2070
+ "out": {
2071
+ "type": "string",
2072
+ "description": "Name of the fragment file, inside the step's output directory.",
2073
+ "default": "graphql.json"
2074
+ }
2075
+ }
2076
+ },
2077
+ "options.sql": {
2078
+ "type": "object",
2079
+ "additionalProperties": false,
2080
+ "properties": {
2081
+ "context": {
2082
+ "type": "string",
2083
+ "description": "Slug of the bounded context that owns the service these migrations belong to. Defaults to the name of the input directory.",
2084
+ "examples": [
2085
+ "auth"
2086
+ ]
2087
+ },
2088
+ "service": {
2089
+ "type": "string",
2090
+ "description": "Slug of the service that owns the database. A store belongs to exactly one service. Defaults to the name of the input directory.",
2091
+ "examples": [
2092
+ "auth"
2093
+ ]
2094
+ },
2095
+ "store": {
2096
+ "type": "string",
2097
+ "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.",
2098
+ "default": "pg"
2099
+ },
2100
+ "name": {
2101
+ "type": "string",
2102
+ "description": "What the database is called on the page.",
2103
+ "examples": [
2104
+ "Auth database"
2105
+ ]
2106
+ },
2107
+ "kind": {
2108
+ "enum": [
2109
+ "postgres",
2110
+ "mysql",
2111
+ "sqlite",
2112
+ "redis",
2113
+ "mongodb",
2114
+ "clickhouse",
2115
+ "s3",
2116
+ "other"
2117
+ ],
2118
+ "description": "What kind of store it is.",
2119
+ "default": "postgres"
2120
+ },
2121
+ "repositories": {
2122
+ "type": "string",
2123
+ "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."
2124
+ },
2125
+ "projectors": {
2126
+ "type": "string",
2127
+ "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:`."
2128
+ },
2129
+ "out": {
2130
+ "type": "string",
2131
+ "description": "Name of the fragment file, inside the step's output directory.",
2132
+ "default": "stores.json"
2133
+ }
2134
+ }
2135
+ },
2136
+ "options.markdown": {
2137
+ "type": "object",
2138
+ "additionalProperties": false,
2139
+ "properties": {
2140
+ "title": {
2141
+ "type": "string",
2142
+ "description": "Heading of the index page. The catalog does not name the estate, so this is the one thing the generator cannot derive.",
2143
+ "examples": [
2144
+ "Example estate"
2145
+ ]
2146
+ },
2147
+ "sourceBaseUrl": {
2148
+ "type": "string",
2149
+ "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.",
2150
+ "examples": [
2151
+ "https://github.com/acme/shop/blob/main"
2152
+ ]
2153
+ }
2154
+ }
2155
+ },
2156
+ "options.mermaid": {
2157
+ "type": "object",
2158
+ "additionalProperties": false,
2159
+ "properties": {
2160
+ "title": {
2161
+ "type": "string",
2162
+ "description": "Heading of the Mermaid bundle index."
2163
+ }
2164
+ }
2165
+ },
2166
+ "options.backstage": {
2167
+ "type": "object",
2168
+ "additionalProperties": false,
2169
+ "properties": {
2170
+ "domain": {
2171
+ "type": "string",
2172
+ "description": "Backstage metadata.name for the domain containing the exported systems.",
2173
+ "default": "architecture"
2174
+ },
2175
+ "domainTitle": {
2176
+ "type": "string",
2177
+ "description": "Human-readable title of the Backstage domain.",
2178
+ "default": "Architecture"
2179
+ },
2180
+ "owner": {
2181
+ "type": "string",
2182
+ "description": "Fallback Backstage owner for entities without a CODEOWNERS handle.",
2183
+ "default": "architecture"
2184
+ },
2185
+ "lifecycle": {
2186
+ "type": "string",
2187
+ "description": "Lifecycle written on Backstage Components and APIs.",
2188
+ "default": "production"
2189
+ },
2190
+ "sourceBaseUrl": {
2191
+ "type": "string",
2192
+ "description": "Stable forge tree URL used for Backstage source-location annotations."
2193
+ }
2194
+ }
2195
+ },
2196
+ "options.otel": {
2197
+ "type": "object",
2198
+ "additionalProperties": false,
2199
+ "required": [
2200
+ "traces"
2201
+ ],
2202
+ "properties": {
2203
+ "traces": {
2204
+ "type": "array",
2205
+ "minItems": 1,
2206
+ "items": {
2207
+ "type": "string"
2208
+ },
2209
+ "description": "The recordings to read, as globs relative to the input root. OTLP JSON, one batch per file or one per line.",
2210
+ "examples": [
2211
+ [
2212
+ "telemetry/traces.jsonl"
2213
+ ]
2214
+ ]
2215
+ },
2216
+ "services": {
2217
+ "type": "object",
2218
+ "additionalProperties": {
2219
+ "type": "string"
2220
+ },
2221
+ "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.",
2222
+ "examples": [
2223
+ {
2224
+ "auth-api": "auth.auth"
2225
+ }
2226
+ ]
2227
+ },
2228
+ "events": {
2229
+ "type": "object",
2230
+ "additionalProperties": {
2231
+ "type": "string"
2232
+ },
2233
+ "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.",
2234
+ "examples": [
2235
+ {
2236
+ "auth.PasswordChanged": "auth.auth.PasswordChanged"
2237
+ }
2238
+ ]
2239
+ },
2240
+ "out": {
2241
+ "type": "string",
2242
+ "description": "Name of the fragment file, inside the step's output directory."
2243
+ }
2244
+ }
2245
+ },
2246
+ "options.codeowners": {
2247
+ "type": "object",
2248
+ "additionalProperties": false,
2249
+ "properties": {
2250
+ "file": {
2251
+ "type": "string",
2252
+ "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.",
2253
+ "examples": [
2254
+ "CODEOWNERS",
2255
+ ".github/CODEOWNERS"
2256
+ ]
2257
+ },
2258
+ "out": {
2259
+ "type": "string",
2260
+ "description": "Name of the fragment file, inside the step's output directory. Left out, owners.json."
2261
+ }
2262
+ }
2263
+ },
2264
+ "options.adr": {
2265
+ "type": "object",
2266
+ "additionalProperties": false,
2267
+ "properties": {
2268
+ "files": {
2269
+ "type": "array",
2270
+ "items": {
2271
+ "type": "string"
2272
+ },
2273
+ "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.",
2274
+ "examples": [
2275
+ [
2276
+ "docs/adr/*.md"
2277
+ ],
2278
+ [
2279
+ "adr/*.md"
2280
+ ]
2281
+ ]
2282
+ },
2283
+ "scope": {
2284
+ "type": "string",
2285
+ "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.",
2286
+ "examples": [
2287
+ "avia.aviasupp",
2288
+ "payments",
2289
+ "org"
2290
+ ]
2291
+ },
2292
+ "history": {
2293
+ "enum": [
2294
+ "git",
2295
+ "none"
2296
+ ],
2297
+ "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.",
2298
+ "default": "git"
2299
+ },
2300
+ "out": {
2301
+ "type": "string",
2302
+ "description": "Name of the fragment file, inside the step's output directory. Left out, adr.json."
2303
+ }
2304
+ }
2305
+ },
2306
+ "options.glossary": {
2307
+ "type": "object",
2308
+ "additionalProperties": false,
2309
+ "properties": {
2310
+ "context": {
2311
+ "type": "string",
2312
+ "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.",
2313
+ "examples": [
2314
+ "auth",
2315
+ "shop"
2316
+ ]
2317
+ },
2318
+ "files": {
2319
+ "type": "array",
2320
+ "items": {
2321
+ "type": "string"
2322
+ },
2323
+ "description": "The glossaries to read, as globs relative to the input root. Left out, GLOSSARY.md at the root of it.",
2324
+ "examples": [
2325
+ [
2326
+ "GLOSSARY.md"
2327
+ ],
2328
+ [
2329
+ "docs/GLOSSARY.md"
2330
+ ]
2331
+ ]
2332
+ },
2333
+ "out": {
2334
+ "type": "string",
2335
+ "description": "Name of the fragment file, inside the step's output directory. Left out, glossary.json."
2336
+ }
2337
+ }
2338
+ },
2339
+ "options.flows": {
2340
+ "type": "object",
2341
+ "additionalProperties": false,
2342
+ "properties": {
2343
+ "files": {
2344
+ "type": "array",
2345
+ "items": {
2346
+ "type": "string"
2347
+ },
2348
+ "description": "The flow files to read, as globs relative to the input root. Left out, every *.flow.md directly under the root.",
2349
+ "examples": [
2350
+ [
2351
+ "*.flow.md"
2352
+ ]
2353
+ ]
2354
+ },
2355
+ "out": {
2356
+ "type": "string",
2357
+ "description": "Name of the fragment file, inside the step's output directory. Left out, flows.json."
2358
+ }
2359
+ }
2360
+ },
2361
+ "options.bsr": {
2362
+ "type": "object",
2363
+ "additionalProperties": false,
2364
+ "required": [
2365
+ "modules",
2366
+ "cache"
2367
+ ],
2368
+ "properties": {
2369
+ "modules": {
2370
+ "type": "array",
2371
+ "minItems": 1,
2372
+ "description": "The modules to fetch, each pinned to a commit.",
2373
+ "items": {
2374
+ "type": "object",
2375
+ "additionalProperties": false,
2376
+ "required": [
2377
+ "module"
2378
+ ],
2379
+ "properties": {
2380
+ "module": {
2381
+ "type": "string",
2382
+ "description": "The module's registry-global name: registry, owner and name.",
2383
+ "examples": [
2384
+ "buf.build/shortlink-org/portolan-shop-order"
2385
+ ]
2386
+ },
2387
+ "commit": {
2388
+ "type": "string",
2389
+ "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."
2390
+ },
2391
+ "ref": {
2392
+ "type": "string",
2393
+ "description": "The label to resolve when there is no commit. Defaults to main."
2394
+ },
2395
+ "paths": {
2396
+ "type": "array",
2397
+ "items": {
2398
+ "type": "string"
2399
+ },
2400
+ "description": "Directories of the module to keep, relative to its root; the rest is left behind. Left out, the whole module.",
2401
+ "examples": [
2402
+ [
2403
+ "shop/v1"
2404
+ ]
2405
+ ]
2406
+ }
2407
+ }
2408
+ }
2409
+ },
2410
+ "cache": {
2411
+ "type": "string",
2412
+ "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."
2413
+ }
2414
+ }
2415
+ },
2416
+ "options.git": {
2417
+ "type": "object",
2418
+ "additionalProperties": false,
2419
+ "required": [
2420
+ "repos",
2421
+ "cache"
2422
+ ],
2423
+ "properties": {
2424
+ "repos": {
2425
+ "type": "array",
2426
+ "minItems": 1,
2427
+ "description": "The repositories to fetch, each pinned to a commit.",
2428
+ "items": {
2429
+ "type": "object",
2430
+ "additionalProperties": false,
2431
+ "required": [
2432
+ "repo"
2433
+ ],
2434
+ "properties": {
2435
+ "repo": {
2436
+ "type": "string",
2437
+ "description": "Where the repository is: github.com/acme/shop, or any URL git accepts (https://, ssh://, git@host:owner/name).",
2438
+ "examples": [
2439
+ "github.com/acme/shop"
2440
+ ]
2441
+ },
2442
+ "commit": {
2443
+ "type": "string",
2444
+ "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."
2445
+ },
2446
+ "ref": {
2447
+ "type": "string",
2448
+ "description": "The branch or tag to resolve when there is no commit. Defaults to the remote's HEAD."
2449
+ },
2450
+ "paths": {
2451
+ "type": "array",
2452
+ "items": {
2453
+ "type": "string"
2454
+ },
2455
+ "description": "Directories to copy, relative to the repository's root; the rest is left behind. Left out, the whole tree.",
2456
+ "examples": [
2457
+ [
2458
+ "services/oms",
2459
+ "proto"
2460
+ ]
2461
+ ]
2462
+ }
2463
+ }
2464
+ }
2465
+ },
2466
+ "cache": {
2467
+ "type": "string",
2468
+ "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."
2469
+ }
2470
+ }
2471
+ },
2472
+ "options.proto": {
2473
+ "type": "object",
2474
+ "additionalProperties": false,
2475
+ "required": [
2476
+ "context",
2477
+ "service"
2478
+ ],
2479
+ "properties": {
2480
+ "context": {
2481
+ "type": "string",
2482
+ "description": "Slug of the bounded context the service belongs to. A .proto knows its package, not which context owns it.",
2483
+ "examples": [
2484
+ "shop"
2485
+ ]
2486
+ },
2487
+ "service": {
2488
+ "type": "string",
2489
+ "description": "Slug of the service that publishes or calls these protos.",
2490
+ "examples": [
2491
+ "oms"
2492
+ ]
2493
+ },
2494
+ "paths": {
2495
+ "type": "array",
2496
+ "items": {
2497
+ "type": "string"
2498
+ },
2499
+ "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.",
2500
+ "examples": [
2501
+ [
2502
+ "vendor/proto/shortlink-org/portolan-shop-order"
2503
+ ]
2504
+ ]
2505
+ },
2506
+ "vendored": {
2507
+ "type": "array",
2508
+ "items": {
2509
+ "type": "string"
2510
+ },
2511
+ "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.",
2512
+ "examples": [
2513
+ [
2514
+ "src/infrastructure/payments/proto"
2515
+ ]
2516
+ ]
2517
+ },
2518
+ "peers": {
2519
+ "type": "object",
2520
+ "additionalProperties": {
2521
+ "type": "string"
2522
+ },
2523
+ "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.",
2524
+ "examples": [
2525
+ {
2526
+ "payments.v1": "payments.ledger"
2527
+ }
2528
+ ]
2529
+ },
2530
+ "modules": {
2531
+ "type": "object",
2532
+ "additionalProperties": {
2533
+ "type": "string"
2534
+ },
2535
+ "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.",
2536
+ "examples": [
2537
+ {
2538
+ "src/infrastructure/payments/proto": "buf.build/shortlink-org/portolan-payments-payment"
2539
+ }
2540
+ ]
2541
+ },
2542
+ "defs": {
2543
+ "enum": [
2544
+ "shared",
2545
+ "off"
2546
+ ],
2547
+ "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.",
2548
+ "default": "shared"
2549
+ },
2550
+ "out": {
2551
+ "type": "string",
2552
+ "description": "Name of the fragment file, inside the step's output directory.",
2553
+ "default": "proto.json"
2554
+ }
2555
+ }
2556
+ }
2557
+ }
2558
+ }