@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,932 @@
1
+ // Package catalog is the Go side of the contract in src/catalog.ts.
2
+ //
3
+ // It is a MIRROR, not a second definition (portolan.0003). The TypeScript file is where the
4
+ // shape is decided and where the prose explaining each decision lives; this
5
+ // package exists so a plugin written in Go can read a catalog without
6
+ // reinventing it, and it is held to the original by a round-trip test rather
7
+ // than by anyone remembering to update both.
8
+ //
9
+ // Nothing here validates. A plugin receives a catalog that the host has
10
+ // already validated, and a second opinion in a second language is how the two
11
+ // drift apart.
12
+ package catalog
13
+
14
+ import (
15
+ "encoding/json"
16
+ "fmt"
17
+ )
18
+
19
+ type Status string
20
+
21
+ const (
22
+ StatusVerified Status = "verified"
23
+ StatusDeclared Status = "declared"
24
+ StatusUnresolved Status = "unresolved"
25
+ )
26
+
27
+ // Catalog is one source of facts. The estate a reader sees is the merge of
28
+ // several of these, so nothing in a plugin may assume it holds all of them.
29
+ type Catalog struct {
30
+ // The stamp the HOST writes, from the last commit that touched the input
31
+ // this source was read from - never a plugin, which would have to read a
32
+ // clock and produce a different fragment on every run. Both are omitted
33
+ // when empty, because a source nobody generates carries no stamp at all
34
+ // and a mirror that wrote `"generatedAt": ""` would be inventing an answer
35
+ // to a question the file does not answer. The merge dates the estate from
36
+ // the sources that do carry one.
37
+ GeneratedAt string `json:"generatedAt,omitempty"`
38
+ Commit string `json:"commit,omitempty"`
39
+ Contexts []BoundedContext `json:"contexts"`
40
+ Defs map[string]TypeDef `json:"defs"`
41
+ Flows []Flow `json:"flows"`
42
+ Adrs []Adr `json:"adrs"`
43
+ Stores []Store `json:"stores,omitempty"`
44
+ Modules []ProtoModule `json:"modules,omitempty"`
45
+ Terms []Term `json:"terms,omitempty"`
46
+ Repos []RepoPin `json:"repos,omitempty"`
47
+ Externals []External `json:"externals,omitempty"`
48
+ }
49
+
50
+ // External is a system outside the estate with a contract: what it answers on,
51
+ // read from the copy of its document vendored beside the adapter that calls it,
52
+ // and nothing else. It sits at the root beside the contexts, so its id is its
53
+ // slug and carries no dot.
54
+ type External struct {
55
+ ID string `json:"id"`
56
+ Slug string `json:"slug"`
57
+ Name string `json:"name"`
58
+ Summary string `json:"summary"`
59
+ URL string `json:"url,omitempty"`
60
+ Provides []RpcService `json:"provides"`
61
+ }
62
+
63
+ // RepoPin is a repository the estate was read at, and the commit it was read
64
+ // at, so a source path in another repository can still be a link.
65
+ //
66
+ // A list on the catalog rather than a field on Service: the pin is a fact
67
+ // about the estate, and a repository holding three services is fetched once.
68
+ type RepoPin struct {
69
+ // Repo is spelled the way Service.Repo spells it: "github.com/acme/shop".
70
+ Repo string `json:"repo"`
71
+
72
+ // Commit is the full sha. Nothing resolves it locally, so there is
73
+ // nothing a short one could be expanded against.
74
+ Commit string `json:"commit"`
75
+ }
76
+
77
+ type Classification string
78
+
79
+ const (
80
+ ClassificationCore Classification = "core"
81
+ ClassificationSupporting Classification = "supporting"
82
+ ClassificationGeneric Classification = "generic"
83
+ )
84
+
85
+ // How a context is read. The keys stay `contexts` and `services` (portolan.0004).
86
+ type GroupKind string
87
+
88
+ const (
89
+ GroupKindBoundedContext GroupKind = "bounded-context"
90
+ GroupKindSystem GroupKind = "system"
91
+ GroupKindProduct GroupKind = "product"
92
+ GroupKindTeam GroupKind = "team"
93
+ GroupKindNamespace GroupKind = "namespace"
94
+ )
95
+
96
+ type BoundedContext struct {
97
+ ID string `json:"id"`
98
+ Slug string `json:"slug"`
99
+ Name string `json:"name"`
100
+ Summary string `json:"summary"`
101
+ Kind GroupKind `json:"kind,omitempty"`
102
+ Classification Classification `json:"classification,omitempty"`
103
+ ViewID string `json:"viewId,omitempty"`
104
+ Services []Service `json:"services"`
105
+ }
106
+
107
+ type ComponentKind string
108
+
109
+ const (
110
+ ComponentKindService ComponentKind = "service"
111
+ ComponentKindApplication ComponentKind = "application"
112
+ ComponentKindWebapp ComponentKind = "webapp"
113
+ ComponentKindWorker ComponentKind = "worker"
114
+ ComponentKindJob ComponentKind = "job"
115
+ ComponentKindFunction ComponentKind = "function"
116
+ ComponentKindCLI ComponentKind = "cli"
117
+ ComponentKindLibrary ComponentKind = "library"
118
+ ComponentKindDataPipeline ComponentKind = "data-pipeline"
119
+ )
120
+
121
+ type Service struct {
122
+ ID string `json:"id"`
123
+ Slug string `json:"slug"`
124
+ Name string `json:"name"`
125
+ Repo string `json:"repo"`
126
+ Path string `json:"path"`
127
+ Readme string `json:"readme"`
128
+ Kind ComponentKind `json:"kind,omitempty"`
129
+ Technologies []string `json:"technologies,omitempty"`
130
+ Provides []RpcService `json:"provides"`
131
+ Consumes []RpcCall `json:"consumes"`
132
+ Aggregates []Aggregate `json:"aggregates"`
133
+ // Stores this service touches, by id. Ownership is not stated here - a
134
+ // store names its own owner, so an id in this list that the store does not
135
+ // call its owner is a read.
136
+ Stores []string `json:"stores,omitempty"`
137
+
138
+ // Modules this service publishes or vendors, by id. Same rule as Stores: a
139
+ // module names its own owner, so an id here that does not call this service
140
+ // its owner is one the service reads.
141
+ Modules []string `json:"modules,omitempty"`
142
+
143
+ // Channels this service declares it publishes on or listens to, read out of
144
+ // an AsyncAPI document. Absent for a service that has no such document,
145
+ // which is not the same as a service that speaks to nobody.
146
+ Channels []Channel `json:"channels,omitempty"`
147
+
148
+ // Owners is who to ask about it, as CODEOWNERS spells them. Handles and
149
+ // nothing more: resolving one to people is a call to a forge, and the
150
+ // handle is what a reviewer types anyway.
151
+ Owners []string `json:"owners,omitempty"`
152
+
153
+ // Commands are what a developer types against the checkout - the make
154
+ // targets, npm scripts, just recipes and task-runner tasks the repository
155
+ // declares. Read from the runner files, never from the README, so the
156
+ // list is the one the runner would accept. Absent when nothing declares
157
+ // any, which is not the same as a service that cannot be built.
158
+ Commands []Command `json:"commands,omitempty"`
159
+ }
160
+
161
+ // Command is one entry of a task runner's file: a make target, an npm script,
162
+ // a just recipe, a Taskfile task, a poe or pdm task.
163
+ //
164
+ // Run is the whole point - the line a reader copies - and it is spelled here
165
+ // rather than rebuilt from Runner and Name, because `npm test` and
166
+ // `npm run typecheck` are two spellings of one runner and the page should not
167
+ // have to know which scripts npm treats specially.
168
+ type Command struct {
169
+ // Runner is the tool the line is typed at: make, npm, pnpm, yarn, bun,
170
+ // just, task, poe, pdm.
171
+ Runner string `json:"runner"`
172
+ // Name is the target, script, recipe or task as its file spells it.
173
+ Name string `json:"name"`
174
+ // Run is the line to type at a shell in the service's directory.
175
+ Run string `json:"run"`
176
+ // Doc is what the file says the command is for, when it says anything: a
177
+ // `## comment` on a make target, a `#` line over a just recipe, a task's
178
+ // `desc`, a poe task's `help`. Most files say nothing.
179
+ Doc string `json:"doc,omitempty"`
180
+ // Body is what the runner executes for it: the recipe, the script line,
181
+ // the cmds. Carried so a name that says nothing can still be read, and
182
+ // shown folded, because a build script is not a sentence.
183
+ Body string `json:"body,omitempty"`
184
+ // Source is the file and line the entry was read at.
185
+ Source string `json:"source,omitempty"`
186
+ }
187
+
188
+ type RpcService struct {
189
+ ID string `json:"id"`
190
+ Methods []RpcMethod `json:"methods"`
191
+ Source string `json:"source"`
192
+ Messages []RpcMessage `json:"messages,omitempty"`
193
+ // Enums are the closed sets the messages' fields take values from, reached
194
+ // the way Messages are: from the methods, through the fields, as far as
195
+ // the protos read here declare them.
196
+ Enums []RpcEnum `json:"enums,omitempty"`
197
+
198
+ // Module is the schema module declaring this interface, by ProtoModule.ID.
199
+ Module string `json:"module,omitempty"`
200
+ }
201
+
202
+ // RpcEnum is an enum a message field names, as the interface's document
203
+ // declares it. Values carry their wire number because a proto consumer sees
204
+ // the number, not the name, in a binary message.
205
+ type RpcEnum struct {
206
+ Name string `json:"name"`
207
+ Doc string `json:"doc,omitempty"`
208
+ Values []RpcEnumValue `json:"values"`
209
+ }
210
+
211
+ type RpcEnumValue struct {
212
+ Name string `json:"name"`
213
+ Number int `json:"number"`
214
+ Doc string `json:"doc,omitempty"`
215
+ }
216
+
217
+ // RpcMethod is one method of one interface.
218
+ //
219
+ // A string would have done for the name, and did until protos were read. What
220
+ // a string could not carry is the shapes on either side: an endpoint whose
221
+ // request and response are named is one a reader can follow without opening
222
+ // the source, and a streaming method drawn as a unary call is a lie about how
223
+ // the two ends are coupled.
224
+ //
225
+ // Only Name is required. An interface read from an OpenAPI document supplies
226
+ // nothing else, and must keep reading the way it always did.
227
+ type RpcMethod struct {
228
+ // Name is what the interface declares - a proto method, an OpenAPI
229
+ // operationId. This is what Operation.ExposedBy names.
230
+ Name string `json:"name"`
231
+ Doc string `json:"doc,omitempty"`
232
+
233
+ // Request and Response name messages in RpcService.Messages; the Ref forms
234
+ // key Catalog.Defs when the shape is shared. The same pairing, for the same
235
+ // reason, as Field.Type and Field.Ref.
236
+ Request string `json:"request,omitempty"`
237
+ RequestRef string `json:"requestRef,omitempty"`
238
+ Response string `json:"response,omitempty"`
239
+ ResponseRef string `json:"responseRef,omitempty"`
240
+
241
+ // Streaming is empty for a unary method, which is most of them.
242
+ Streaming Streaming `json:"streaming,omitempty"`
243
+ Deprecated bool `json:"deprecated,omitempty"`
244
+
245
+ // HTTP is the route, for a method read from an OpenAPI document. It is
246
+ // what lets a request seen on the wire be read back to the operation.
247
+ HTTP *HttpRoute `json:"http,omitempty"`
248
+
249
+ // SOAP is the concrete binding of a WSDL operation. Unlike Doc, these
250
+ // fields participate in comparison and let renderers present the contract
251
+ // without reparsing the source document.
252
+ SOAP *SoapRoute `json:"soap,omitempty"`
253
+ }
254
+
255
+ type HttpRoute struct {
256
+ // Method is upper case: POST.
257
+ Method string `json:"method"`
258
+ // Path is the template as the document writes it: /v1/users/{id}.
259
+ Path string `json:"path"`
260
+ }
261
+
262
+ // SoapRoute is the wire-level part of one WSDL operation. Request, response
263
+ // and fault shapes remain on RpcMethod/RpcService, beside their proto and
264
+ // OpenAPI equivalents.
265
+ type SoapRoute struct {
266
+ Action string `json:"action,omitempty"`
267
+ Version string `json:"version,omitempty"`
268
+ Style string `json:"style,omitempty"`
269
+ Endpoint string `json:"endpoint,omitempty"`
270
+ Binding string `json:"binding,omitempty"`
271
+ Faults []string `json:"faults,omitempty"`
272
+ Headers []string `json:"headers,omitempty"`
273
+ }
274
+
275
+ type Streaming string
276
+
277
+ const (
278
+ StreamingClient Streaming = "client"
279
+ StreamingServer Streaming = "server"
280
+ StreamingBidi Streaming = "bidi"
281
+ )
282
+
283
+ type RpcMessage struct {
284
+ Name string `json:"name"`
285
+ Fields []Field `json:"fields"`
286
+ Discriminator *RpcDiscriminator `json:"discriminator,omitempty"`
287
+ }
288
+
289
+ // RpcDiscriminator explains how a polymorphic OpenAPI message selects its
290
+ // concrete shape on the wire.
291
+ type RpcDiscriminator struct {
292
+ Property string `json:"property"`
293
+ Variants []RpcVariant `json:"variants"`
294
+ }
295
+
296
+ type RpcVariant struct {
297
+ Value string `json:"value"`
298
+ Message string `json:"message"`
299
+ }
300
+
301
+ type RpcCall struct {
302
+ ID string `json:"id"`
303
+ Peer string `json:"peer"`
304
+ Status Status `json:"status"`
305
+ Source string `json:"source"`
306
+ Note string `json:"note,omitempty"`
307
+
308
+ // Module is the module the vendored copy this call was read from belongs to.
309
+ Module string `json:"module,omitempty"`
310
+
311
+ // Via is set when the call was derived from a flow step rather than declared.
312
+ Via *EdgeVia `json:"via,omitempty"`
313
+ }
314
+
315
+ // EdgeVia names the flow step a derived consumer or call was read from. A
316
+ // plugin never writes one: the host derives edges from flows after the merge,
317
+ // and this is how the generated output can say where an arrow came from.
318
+ type EdgeVia struct {
319
+ Flow string `json:"flow"`
320
+ Step string `json:"step"`
321
+ }
322
+
323
+ // ProtoModule is a schema module: a set of .proto files with a name, a version
324
+ // and a publisher - "buf.build/acme/shop".
325
+ //
326
+ // It sits at the top level rather than inside the service that publishes it,
327
+ // because the interesting fact about a module is usually who ELSE reads it.
328
+ //
329
+ // Its ID is the module's own registry-global name and NOT "<owner>.<slug>" the
330
+ // way a Store's is. A store is declared by exactly one source. A module is
331
+ // declared by several that do not know each other - the producer, and each
332
+ // consumer reading a vendored copy in another repository - and since the merge
333
+ // unions top-level entities BY ID, an owner-derived id would grow one module
334
+ // per consumer.
335
+ //
336
+ // What it carries is identity and inventory, not schema: the interfaces are
337
+ // found through RpcService.Module and the shapes live in RpcService.Messages.
338
+ type ProtoModule struct {
339
+ // ID is "buf.build/acme/shop", or "local:proto/shop" for a set never
340
+ // published to a registry.
341
+ ID string `json:"id"`
342
+
343
+ // Slug is unique across the catalog, and what the URL uses: "acme-shop".
344
+ Slug string `json:"slug"`
345
+ Name string `json:"name"`
346
+
347
+ // Registry is "buf.build", empty when the module was never published.
348
+ Registry string `json:"registry,omitempty"`
349
+
350
+ // Owner is the service that publishes it, when the estate knows. Empty is
351
+ // an honest answer rather than a defect: a module published by a team, or
352
+ // by a repository outside the estate, is the ordinary case.
353
+ Owner string `json:"owner,omitempty"`
354
+
355
+ Commit string `json:"commit,omitempty"`
356
+ Digest string `json:"digest,omitempty"`
357
+
358
+ Packages []string `json:"packages"`
359
+ Files []string `json:"files"`
360
+ Deps []string `json:"deps,omitempty"`
361
+ Source string `json:"source"`
362
+ }
363
+
364
+ type Aggregate struct {
365
+ ID string `json:"id"`
366
+ Slug string `json:"slug"`
367
+ Name string `json:"name"`
368
+ Readme string `json:"readme"`
369
+ Root string `json:"root"`
370
+ Entities []Block `json:"entities"`
371
+ ValueObjects []Block `json:"valueObjects"`
372
+ Operations []Operation `json:"operations"`
373
+ Events []Event `json:"events"`
374
+ // Enums are the closed sets the aggregate's fields take values from. A
375
+ // list beside Entities and ValueObjects rather than a Block with values:
376
+ // an enum has no fields, and a consumer switches on it rather than reads
377
+ // it. Omitted when the source declares none.
378
+ Enums []Enum `json:"enums,omitempty"`
379
+ Lifecycle *Lifecycle `json:"lifecycle,omitempty"`
380
+ }
381
+
382
+ // Enum is a closed set of values a field can hold - a reason, a status, a
383
+ // code. What a consumer of an event switches on, and so what it has to be
384
+ // told: free text from a schema row says "reason: Reason", and this is what
385
+ // Reason can be.
386
+ type Enum struct {
387
+ ID string `json:"id"` // "<aggregate id>.<slug>"
388
+ Slug string `json:"slug"`
389
+ Name string `json:"name"`
390
+ Doc string `json:"doc"`
391
+ // Deprecated marks the whole set as on its way out.
392
+ Deprecated bool `json:"deprecated,omitempty"`
393
+ Values []EnumValue `json:"values"`
394
+ }
395
+
396
+ // EnumValue is one member of an Enum. Name is what a consumer sees on the
397
+ // wire when the source says so - a Go constant's literal - and the variant's
398
+ // own name otherwise.
399
+ type EnumValue struct {
400
+ Name string `json:"name"`
401
+ Doc string `json:"doc"`
402
+ Deprecated bool `json:"deprecated,omitempty"`
403
+ }
404
+
405
+ // Lifecycle is the root's state machine as the code writes it down: the
406
+ // states in the order listed, the first being where a new root starts, and
407
+ // every move between them. A state nothing leads out of is terminal.
408
+ type Lifecycle struct {
409
+ States []string `json:"states"`
410
+ Transitions []Transition `json:"transitions"`
411
+ }
412
+
413
+ // Transition is one move: the method on the root that makes it, and the
414
+ // event it hands back for it when it hands one back.
415
+ type Transition struct {
416
+ From string `json:"from"`
417
+ To string `json:"to"`
418
+ On string `json:"on"`
419
+ Emits string `json:"emits,omitempty"`
420
+ Source string `json:"source,omitempty"`
421
+ }
422
+
423
+ type OperationKind string
424
+
425
+ const (
426
+ OperationCommand OperationKind = "command"
427
+ OperationQuery OperationKind = "query"
428
+ )
429
+
430
+ type Operation struct {
431
+ ID string `json:"id"`
432
+ Kind OperationKind `json:"kind"`
433
+ Doc string `json:"doc,omitempty"`
434
+ // ExposedBy names the interface methods that run this operation, as they
435
+ // appear in RpcService.Methods. Empty means nothing outside the service can
436
+ // reach it, which is a fact worth having rather than a gap.
437
+ ExposedBy []string `json:"exposedBy,omitempty"`
438
+ }
439
+
440
+ // Block is an entity or a value object. The two are told apart by the list
441
+ // they sit in, not by a field, which is why one struct serves both.
442
+ type Block struct {
443
+ ID string `json:"id"`
444
+ Slug string `json:"slug"`
445
+ Name string `json:"name"`
446
+ Doc string `json:"doc"`
447
+ // Ref names a shared catalog.defs entry. When it is set the shape is that
448
+ // def's, and Fields is empty; when it is not, Fields carries a shape local
449
+ // to this aggregate.
450
+ Ref string `json:"ref,omitempty"`
451
+ Fields []Field `json:"fields,omitempty"`
452
+ }
453
+
454
+ type Event struct {
455
+ ID string `json:"id"`
456
+ Slug string `json:"slug"`
457
+ Name string `json:"name"`
458
+ Versions []EventVersion `json:"versions"`
459
+ Consumers []EventConsumer `json:"consumers"`
460
+ // Wire is how the event leaves the service; nil when the source does
461
+ // not say.
462
+ Wire *EventWire `json:"wire,omitempty"`
463
+ }
464
+
465
+ // EventWire is the event as the bus sees it: its name on the message and the
466
+ // channel it is published on. A trace carries both, as `event.name` and
467
+ // `messaging.destination.name`, and this is where the catalog meets it.
468
+ type EventWire struct {
469
+ // Name is the name on the message: "cart.BasketCreated".
470
+ Name string `json:"name"`
471
+ // Channel is the topic, subject or stream: "cart_basket". Empty when the
472
+ // source names the event but not where it goes.
473
+ Channel string `json:"channel,omitempty"`
474
+ }
475
+
476
+ // Channel is a topic, subject or stream a service says it uses, and the
477
+ // messages that travel on it. It is what an AsyncAPI document declares, and it
478
+ // is the async half of what an OpenAPI document says about routes.
479
+ //
480
+ // The catalog already knew about channels, but only by inference: an event
481
+ // carries a Wire, and the channel was whatever the events happened to name. A
482
+ // declaration is a different fact. It says what the service means to put on the
483
+ // bus whether or not any event was found saying so, and it says what the
484
+ // service listens for - which nothing in a publisher's source could ever say.
485
+ type Channel struct {
486
+ // Address is the channel as the broker knows it: "shop.cart.basket". It is
487
+ // the same string an event's Wire.Channel carries, and comparing the two is
488
+ // how a document and the code it belongs to are held against each other.
489
+ Address string `json:"address"`
490
+ // Kind distinguishes domain-event channels, work queues, and generic message
491
+ // streams. Only event channels are checked against the domain event model.
492
+ Kind ChannelKind `json:"kind,omitempty"`
493
+
494
+ Title string `json:"title,omitempty"`
495
+ Doc string `json:"doc,omitempty"`
496
+
497
+ Messages []ChannelMessage `json:"messages"`
498
+
499
+ // Source is the document this was read out of.
500
+ Source string `json:"source,omitempty"`
501
+ }
502
+
503
+ type ChannelKind string
504
+
505
+ const (
506
+ ChannelKindEvent ChannelKind = "event"
507
+ ChannelKindJob ChannelKind = "job"
508
+ ChannelKindMessage ChannelKind = "message"
509
+ )
510
+
511
+ // ChannelDirection is which way a message travels, from this service's side.
512
+ //
513
+ // It decides ownership: a service that sends on a channel is publishing on it,
514
+ // and a channel has one publisher. A service that only receives is a
515
+ // subscriber, and any number of those is fine.
516
+ type ChannelDirection string
517
+
518
+ const (
519
+ ChannelSend ChannelDirection = "send"
520
+ ChannelReceive ChannelDirection = "receive"
521
+ )
522
+
523
+ // ChannelMessage is one message on a channel, by the name it goes by on the
524
+ // wire - the same name an event's Wire.Name carries.
525
+ type ChannelMessage struct {
526
+ Name string `json:"name"`
527
+ Title string `json:"title,omitempty"`
528
+ Doc string `json:"doc,omitempty"`
529
+ Direction ChannelDirection `json:"direction"`
530
+ }
531
+
532
+ type EventConsumer struct {
533
+ Service string `json:"service"`
534
+ Status Status `json:"status"`
535
+ Note string `json:"note,omitempty"`
536
+
537
+ // Via is set when the consumer was derived from a flow step rather than declared.
538
+ Via *EdgeVia `json:"via,omitempty"`
539
+ }
540
+
541
+ type EventVersion struct {
542
+ Version string `json:"version"`
543
+ Doc string `json:"doc"`
544
+ Source string `json:"source"`
545
+ Fields []Field `json:"fields"`
546
+ }
547
+
548
+ type Field struct {
549
+ Name string `json:"name"`
550
+ Type string `json:"type"`
551
+ Doc string `json:"doc"`
552
+ Ref string `json:"ref,omitempty"`
553
+ }
554
+
555
+ type TypeDef struct {
556
+ Fields []Field `json:"fields"`
557
+ }
558
+
559
+ type StoreKind string
560
+
561
+ const (
562
+ StoreKindPostgres StoreKind = "postgres"
563
+ StoreKindMySQL StoreKind = "mysql"
564
+ StoreKindSQLite StoreKind = "sqlite"
565
+ StoreKindRedis StoreKind = "redis"
566
+ StoreKindMongoDB StoreKind = "mongodb"
567
+ StoreKindClickHouse StoreKind = "clickhouse"
568
+ StoreKindS3 StoreKind = "s3"
569
+ StoreKindOther StoreKind = "other"
570
+ )
571
+
572
+ type Store struct {
573
+ ID string `json:"id"`
574
+ Slug string `json:"slug"`
575
+ Name string `json:"name"`
576
+ Kind StoreKind `json:"kind"`
577
+ Owner string `json:"owner"`
578
+ Tables []Table `json:"tables"`
579
+ Views []View `json:"views,omitempty"`
580
+ Keyspaces []RedisKeyspace `json:"keyspaces,omitempty"`
581
+ Source string `json:"source,omitempty"`
582
+ }
583
+
584
+ type RedisOperation string
585
+
586
+ const (
587
+ RedisOperationRead RedisOperation = "read"
588
+ RedisOperationWrite RedisOperation = "write"
589
+ RedisOperationDelete RedisOperation = "delete"
590
+ RedisOperationExists RedisOperation = "exists"
591
+ RedisOperationExpire RedisOperation = "expire"
592
+ RedisOperationCount RedisOperation = "count"
593
+ )
594
+
595
+ // RedisKeyspace is a family of keys proved by the expressions passed to a
596
+ // Redis client. Pattern keeps literal separators and writes dynamic pieces in
597
+ // braces; square brackets mark a conditional suffix.
598
+ type RedisKeyspace struct {
599
+ Pattern string `json:"pattern"`
600
+ Operations []RedisOperation `json:"operations"`
601
+ TTL string `json:"ttl,omitempty"`
602
+ Value string `json:"value,omitempty"`
603
+ Source string `json:"source,omitempty"`
604
+ }
605
+
606
+ type TableRole string
607
+
608
+ const (
609
+ TableRoleAggregateRoot TableRole = "aggregate-root"
610
+ TableRoleChild TableRole = "child"
611
+ TableRoleOutbox TableRole = "outbox"
612
+ TableRoleProjection TableRole = "projection"
613
+ TableRoleLookup TableRole = "lookup"
614
+ TableRoleOther TableRole = "other"
615
+ )
616
+
617
+ type Table struct {
618
+ ID string `json:"id"`
619
+ Name string `json:"name"`
620
+ Doc string `json:"doc,omitempty"`
621
+ Columns []Column `json:"columns"`
622
+ Indexes []TableIndex `json:"indexes,omitempty"`
623
+ Persists *Persists `json:"persists,omitempty"`
624
+ Role TableRole `json:"role,omitempty"`
625
+ }
626
+
627
+ // Persists is the link back to the model: which domain object these rows hold.
628
+ type Persists struct {
629
+ Aggregate string `json:"aggregate,omitempty"`
630
+ Block string `json:"block,omitempty"`
631
+ }
632
+
633
+ type TableIndex struct {
634
+ Name string `json:"name"`
635
+ Columns []string `json:"columns"`
636
+ Unique bool `json:"unique"`
637
+ }
638
+
639
+ type Column struct {
640
+ Name string `json:"name"`
641
+ // Type is the db type as declared - uuid, timestamptz, jsonb - never
642
+ // normalised. A reader comparing a column to a migration wants the string
643
+ // the migration used.
644
+ Type string `json:"type"`
645
+ Nullable bool `json:"nullable"`
646
+ PK bool `json:"pk,omitempty"`
647
+ FK *FK `json:"fk,omitempty"`
648
+ // From is lineage: where this value CAME FROM, as "<table or view id>.<column>".
649
+ // A foreign key answers a different question - which row it points at.
650
+ From []string `json:"from,omitempty"`
651
+ Maps string `json:"maps,omitempty"`
652
+ Doc string `json:"doc,omitempty"`
653
+ }
654
+
655
+ type FK struct {
656
+ Table string `json:"table"`
657
+ Column string `json:"column"`
658
+ OnDelete string `json:"onDelete,omitempty"`
659
+ }
660
+
661
+ type View struct {
662
+ ID string `json:"id"`
663
+ Name string `json:"name"`
664
+ Doc string `json:"doc,omitempty"`
665
+ // Materialized: the database keeps the rows rather than recomputing them,
666
+ // which means they can be stale. A reader has to know that before believing
667
+ // one, so it is drawn differently rather than noted in prose.
668
+ Materialized bool `json:"materialized,omitempty"`
669
+ Columns []Column `json:"columns"`
670
+ Reads []string `json:"reads,omitempty"`
671
+ Definition string `json:"definition,omitempty"`
672
+ Persists *Persists `json:"persists,omitempty"`
673
+ Source string `json:"source,omitempty"`
674
+ }
675
+
676
+ // Flow is a sequence read out of source. Extractors may attach the execution
677
+ // trigger they proved; authored flows omit it when that evidence is not part of
678
+ // the document.
679
+ type Flow struct {
680
+ ID string `json:"id"`
681
+ Slug string `json:"slug"`
682
+ Name string `json:"name"`
683
+ Summary string `json:"summary"`
684
+ Source string `json:"source,omitempty"`
685
+ // Trigger says how execution enters this flow and how strong the static
686
+ // evidence is. Authored flows may omit it; source extractors should not.
687
+ Trigger *FlowTrigger `json:"trigger,omitempty"`
688
+ // EntryPoint is the source function this fragment expands. It is machine
689
+ // evidence for composing a queue handler with the outbound flow extracted
690
+ // independently from the same function; ordinary authored flows omit it.
691
+ EntryPoint string `json:"entrypoint,omitempty"`
692
+ // Includes names source-backed flow fragments composed into this root flow.
693
+ // It makes composition idempotent and leaves visible provenance for readers.
694
+ Includes []string `json:"includes,omitempty"`
695
+ // Owner is the bounded context the flow belongs to. The extractor knows it
696
+ // - it read the service's own tree to find the flow - so it says so rather
697
+ // than leaving a reader to work it back out of a path.
698
+ Owner string `json:"owner"`
699
+ // Participants order is significant: it is the lane order.
700
+ Participants []Participant `json:"participants"`
701
+ Steps FlowNodes `json:"steps"`
702
+ }
703
+
704
+ type FlowTrigger struct {
705
+ Kind string `json:"kind"`
706
+ Label string `json:"label,omitempty"`
707
+ Confidence string `json:"confidence"`
708
+ }
709
+
710
+ type ParticipantKind string
711
+
712
+ const (
713
+ ParticipantActor ParticipantKind = "actor"
714
+ ParticipantService ParticipantKind = "service"
715
+ ParticipantBroker ParticipantKind = "broker"
716
+ ParticipantStore ParticipantKind = "store"
717
+ ParticipantExternal ParticipantKind = "external"
718
+ ParticipantUnknown ParticipantKind = "unknown"
719
+ )
720
+
721
+ type Participant struct {
722
+ ID string `json:"id"`
723
+ Kind ParticipantKind `json:"kind"`
724
+ // Context is null for actors and brokers, which is a fact rather than an
725
+ // absence - hence a pointer that marshals to null, not an empty string.
726
+ Context *string `json:"context"`
727
+ Label string `json:"label,omitempty"`
728
+ }
729
+
730
+ // FlowNode is one entry in a flow: a step, or one of the three shapes that
731
+ // hold steps. It is an interface rather than a struct with four optional
732
+ // members so that a renderer has to say which shape it is handling - a flow
733
+ // that quietly treats an alt as a sequence reads as "the order was cancelled
734
+ // and then charged".
735
+ type FlowNode interface {
736
+ NodeType() string
737
+ }
738
+
739
+ // FlowNodes is a list of them. The custom unmarshaller is the only place that
740
+ // knows how the union is discriminated on the wire.
741
+ type FlowNodes []FlowNode
742
+
743
+ func (n *FlowNodes) UnmarshalJSON(data []byte) error {
744
+ var raw []json.RawMessage
745
+ if err := json.Unmarshal(data, &raw); err != nil {
746
+ return err
747
+ }
748
+
749
+ out := make(FlowNodes, 0, len(raw))
750
+ for i, item := range raw {
751
+ var probe struct {
752
+ Type string `json:"type"`
753
+ }
754
+ if err := json.Unmarshal(item, &probe); err != nil {
755
+ return fmt.Errorf("node %d: %w", i, err)
756
+ }
757
+
758
+ var node FlowNode
759
+ switch probe.Type {
760
+ case "step":
761
+ node = &Step{}
762
+ case "parallel":
763
+ node = &Parallel{}
764
+ case "alt":
765
+ node = &Alt{}
766
+ case "loop":
767
+ node = &Loop{}
768
+ default:
769
+ return fmt.Errorf("node %d: unknown flow node type %q", i, probe.Type)
770
+ }
771
+
772
+ if err := json.Unmarshal(item, node); err != nil {
773
+ return fmt.Errorf("node %d (%s): %w", i, probe.Type, err)
774
+ }
775
+ out = append(out, node)
776
+ }
777
+
778
+ *n = out
779
+
780
+ return nil
781
+ }
782
+
783
+ type StepKind string
784
+
785
+ const (
786
+ StepRPC StepKind = "rpc"
787
+ StepEvent StepKind = "event"
788
+ StepCall StepKind = "call"
789
+ )
790
+
791
+ type Step struct {
792
+ Type string `json:"type"`
793
+ ID string `json:"id"`
794
+ From string `json:"from"`
795
+ // To is a participant id. From == To is a self-message.
796
+ To string `json:"to"`
797
+ Kind StepKind `json:"kind"`
798
+ // Ref is an Event.id or an RpcCall.id. It resolves, or Status says
799
+ // unresolved; there is no third option.
800
+ Ref string `json:"ref,omitempty"`
801
+ Label string `json:"label,omitempty"`
802
+ Status Status `json:"status"`
803
+ Note string `json:"note,omitempty"`
804
+ Line string `json:"line,omitempty"`
805
+ // ContinuesAt names the source function execution enters after this step.
806
+ // The merge uses it only when exactly one flow declares that entry point.
807
+ ContinuesAt string `json:"continuesAt,omitempty"`
808
+ // Reaches names source functions proven to execute on the path represented
809
+ // by this step. The merge may use them to attach independently extracted
810
+ // protocol fragments that expand those exact functions.
811
+ Reaches []string `json:"reaches,omitempty"`
812
+ // Handoff identifies a source-backed send or receive through an asynchronous
813
+ // channel. Matching is exact on kind, channel, and message.
814
+ Handoff *FlowHandoff `json:"handoff,omitempty"`
815
+ }
816
+
817
+ func (*Step) NodeType() string { return "step" }
818
+
819
+ type FlowHandoff struct {
820
+ Kind string `json:"kind"`
821
+ Transport string `json:"transport"`
822
+ Channel string `json:"channel"`
823
+ Message string `json:"message,omitempty"`
824
+ Direction string `json:"direction"`
825
+ }
826
+
827
+ type Parallel struct {
828
+ Type string `json:"type"`
829
+ ID string `json:"id"`
830
+ Title string `json:"title,omitempty"`
831
+ Branches []FlowNodes `json:"branches"`
832
+ }
833
+
834
+ func (*Parallel) NodeType() string { return "parallel" }
835
+
836
+ // Alt is a choice: exactly one branch runs. The branches are not a sequence
837
+ // and nothing that reads a flow may render them as one.
838
+ type Alt struct {
839
+ Type string `json:"type"`
840
+ ID string `json:"id"`
841
+ Branches []AltBranch `json:"branches"`
842
+ }
843
+
844
+ func (*Alt) NodeType() string { return "alt" }
845
+
846
+ type AltBranch struct {
847
+ // Title is the condition under which this branch runs, in words.
848
+ Title string `json:"title"`
849
+ Steps FlowNodes `json:"steps"`
850
+ // Terminal marks a branch that ENDS the flow instead of rejoining it.
851
+ // Without it, the steps drawn after the alt read as if they follow this
852
+ // branch too.
853
+ Terminal bool `json:"terminal,omitempty"`
854
+ }
855
+
856
+ type Loop struct {
857
+ Type string `json:"type"`
858
+ ID string `json:"id"`
859
+ Title string `json:"title"`
860
+ Steps FlowNodes `json:"steps"`
861
+ }
862
+
863
+ func (*Loop) NodeType() string { return "loop" }
864
+
865
+ type AdrStatus string
866
+
867
+ const (
868
+ AdrProposed AdrStatus = "proposed"
869
+ AdrAccepted AdrStatus = "accepted"
870
+ AdrSuperseded AdrStatus = "superseded"
871
+ AdrDeprecated AdrStatus = "deprecated"
872
+ AdrRejected AdrStatus = "rejected"
873
+ )
874
+
875
+ // AdrScope is org-wide, or one context, or one service. The kind says which of
876
+ // the two ids is set.
877
+ type AdrScope struct {
878
+ Kind string `json:"kind"`
879
+ Context string `json:"context,omitempty"`
880
+ Service string `json:"service,omitempty"`
881
+ }
882
+
883
+ // Adr is frozen history. It says what was decided and when, not what the model
884
+ // looks like now, so nothing on it is ever regenerated from the current
885
+ // catalog.
886
+ type Adr struct {
887
+ ID string `json:"id"`
888
+ Slug string `json:"slug"`
889
+ Number int `json:"number"`
890
+ Title string `json:"title"`
891
+ Status AdrStatus `json:"status"`
892
+ Date string `json:"date"`
893
+ Scope AdrScope `json:"scope"`
894
+ Body string `json:"body"`
895
+ Note string `json:"note,omitempty"`
896
+ SupersededBy string `json:"supersededBy,omitempty"`
897
+ Supersedes []string `json:"supersedes,omitempty"`
898
+ Relates AdrRelates `json:"relates"`
899
+ Source string `json:"source"`
900
+
901
+ // Created is the commit that first added the file, and Revised the one
902
+ // that last touched it, when that is a different commit. Absent when the
903
+ // tree has no history to read.
904
+ Created *AdrCommit `json:"created,omitempty"`
905
+ Revised *AdrCommit `json:"revised,omitempty"`
906
+ }
907
+
908
+ // AdrCommit is one commit of a record's file: who made it and when. The
909
+ // markdown says when a decision was taken; git says when it was written down
910
+ // and by whom, which is the other half of "who decided this".
911
+ type AdrCommit struct {
912
+ Commit string `json:"commit"`
913
+ Author string `json:"author"`
914
+ Date string `json:"date"`
915
+ }
916
+
917
+ type AdrRelates struct {
918
+ Services []string `json:"services,omitempty"`
919
+ Events []string `json:"events,omitempty"`
920
+ Flows []string `json:"flows,omitempty"`
921
+ }
922
+
923
+ // Term is one entry of a context's glossary: a word, and what it means inside
924
+ // the boundary that means it.
925
+ type Term struct {
926
+ ID string `json:"id"`
927
+ Slug string `json:"slug"`
928
+ Context string `json:"context"`
929
+ Name string `json:"name"`
930
+ Definition string `json:"definition"`
931
+ Source string `json:"source"`
932
+ }