@voxgig/sdkgen 2.0.1 → 3.0.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 (394) hide show
  1. package/bin/voxgig-sdkgen +22 -2
  2. package/dist/action/doctor.d.ts +14 -0
  3. package/dist/action/doctor.js +296 -0
  4. package/dist/action/doctor.js.map +1 -0
  5. package/dist/action/feature.js +48 -9
  6. package/dist/action/feature.js.map +1 -1
  7. package/dist/action/target.d.ts +6 -1
  8. package/dist/action/target.js +134 -22
  9. package/dist/action/target.js.map +1 -1
  10. package/dist/cmp/Entity.js +5 -0
  11. package/dist/cmp/Entity.js.map +1 -1
  12. package/dist/cmp/Feature.js +2 -1
  13. package/dist/cmp/Feature.js.map +1 -1
  14. package/dist/cmp/Main.js +5 -1
  15. package/dist/cmp/Main.js.map +1 -1
  16. package/dist/cmp/ReadmeExplanation.js +1 -1
  17. package/dist/cmp/ReadmeExplanation.js.map +1 -1
  18. package/dist/cmp/ReadmeTop.js +16 -6
  19. package/dist/cmp/ReadmeTop.js.map +1 -1
  20. package/dist/cmp/Registered.d.ts +7 -0
  21. package/dist/cmp/Registered.js +70 -0
  22. package/dist/cmp/Registered.js.map +1 -0
  23. package/dist/cmp/Test.js +3 -1
  24. package/dist/cmp/Test.js.map +1 -1
  25. package/dist/helpers/dryrun.d.ts +10 -0
  26. package/dist/helpers/dryrun.js +35 -0
  27. package/dist/helpers/dryrun.js.map +1 -0
  28. package/dist/helpers/featureSource.d.ts +13 -0
  29. package/dist/helpers/featureSource.js +156 -0
  30. package/dist/helpers/featureSource.js.map +1 -0
  31. package/dist/helpers/naming.d.ts +9 -1
  32. package/dist/helpers/naming.js +66 -2
  33. package/dist/helpers/naming.js.map +1 -1
  34. package/dist/helpers/opExample.js +23 -3
  35. package/dist/helpers/opExample.js.map +1 -1
  36. package/dist/helpers/opShape.d.ts +11 -1
  37. package/dist/helpers/opShape.js +51 -0
  38. package/dist/helpers/opShape.js.map +1 -1
  39. package/dist/helpers/packageMeta.d.ts +8 -1
  40. package/dist/helpers/packageMeta.js +141 -10
  41. package/dist/helpers/packageMeta.js.map +1 -1
  42. package/dist/helpers/stdrep.d.ts +3 -0
  43. package/dist/helpers/stdrep.js +47 -0
  44. package/dist/helpers/stdrep.js.map +1 -0
  45. package/dist/helpers/testPolicy.d.ts +2 -0
  46. package/dist/helpers/testPolicy.js +46 -0
  47. package/dist/helpers/testPolicy.js.map +1 -0
  48. package/dist/sdkgen.d.ts +15 -6
  49. package/dist/sdkgen.js +45 -4
  50. package/dist/sdkgen.js.map +1 -1
  51. package/dist/tsconfig.tsbuildinfo +1 -1
  52. package/model/sdkgen.aontu +125 -0
  53. package/package.json +8 -5
  54. package/project/.sdk/model/target/c.aontu +28 -3
  55. package/project/.sdk/model/target/clojure.aontu +24 -3
  56. package/project/.sdk/model/target/cpp.aontu +25 -3
  57. package/project/.sdk/model/target/csharp.aontu +25 -3
  58. package/project/.sdk/model/target/dart.aontu +15 -3
  59. package/project/.sdk/model/target/elixir.aontu +15 -3
  60. package/project/.sdk/model/target/go-cli.aontu +17 -1
  61. package/project/.sdk/model/target/go-mcp.aontu +17 -1
  62. package/project/.sdk/model/target/go.aontu +14 -4
  63. package/project/.sdk/model/target/haskell.aontu +24 -3
  64. package/project/.sdk/model/target/java.aontu +26 -3
  65. package/project/.sdk/model/target/js.aontu +15 -3
  66. package/project/.sdk/model/target/kotlin.aontu +26 -3
  67. package/project/.sdk/model/target/lean.aontu +25 -3
  68. package/project/.sdk/model/target/lua.aontu +15 -3
  69. package/project/.sdk/model/target/ocaml.aontu +24 -3
  70. package/project/.sdk/model/target/perl.aontu +15 -3
  71. package/project/.sdk/model/target/php.aontu +15 -3
  72. package/project/.sdk/model/target/py-data.aontu +16 -3
  73. package/project/.sdk/model/target/py.aontu +15 -3
  74. package/project/.sdk/model/target/rb.aontu +15 -3
  75. package/project/.sdk/model/target/rust.aontu +25 -3
  76. package/project/.sdk/model/target/scala.aontu +25 -3
  77. package/project/.sdk/model/target/swift.aontu +25 -3
  78. package/project/.sdk/model/target/ts.aontu +15 -3
  79. package/project/.sdk/model/target/zig.aontu +26 -3
  80. package/project/.sdk/src/cmp/c/Config_c.ts +10 -11
  81. package/project/.sdk/src/cmp/c/Entity_c.ts +5 -1
  82. package/project/.sdk/src/cmp/c/fragment/Entity.fragment.c +23 -5
  83. package/project/.sdk/src/cmp/c/fragment/EntityCreateOp.fragment.c +9 -2
  84. package/project/.sdk/src/cmp/c/fragment/EntityListOp.fragment.c +19 -2
  85. package/project/.sdk/src/cmp/c/fragment/EntityLoadOp.fragment.c +9 -2
  86. package/project/.sdk/src/cmp/c/fragment/EntityRemoveOp.fragment.c +12 -2
  87. package/project/.sdk/src/cmp/c/fragment/EntityUpdateOp.fragment.c +9 -2
  88. package/project/.sdk/src/cmp/c/fragment/Main.fragment.c +1 -0
  89. package/project/.sdk/src/cmp/clojure/TestEntity_clojure.ts +6 -3
  90. package/project/.sdk/src/cmp/clojure/fragment/Entity.fragment.clj +18 -1
  91. package/project/.sdk/src/cmp/clojure/fragment/EntityCreateOp.fragment.clj +2 -2
  92. package/project/.sdk/src/cmp/clojure/fragment/EntityLoadOp.fragment.clj +2 -2
  93. package/project/.sdk/src/cmp/clojure/fragment/EntityRemoveOp.fragment.clj +12 -8
  94. package/project/.sdk/src/cmp/clojure/fragment/EntityUpdateOp.fragment.clj +2 -2
  95. package/project/.sdk/src/cmp/cpp/Entity_cpp.ts +5 -1
  96. package/project/.sdk/src/cmp/cpp/TestEntity_cpp.ts +24 -11
  97. package/project/.sdk/src/cmp/cpp/fragment/EntityCreateOp.fragment.cpp +8 -2
  98. package/project/.sdk/src/cmp/cpp/fragment/EntityListOp.fragment.cpp +18 -2
  99. package/project/.sdk/src/cmp/cpp/fragment/EntityLoadOp.fragment.cpp +8 -2
  100. package/project/.sdk/src/cmp/cpp/fragment/EntityRemoveOp.fragment.cpp +11 -2
  101. package/project/.sdk/src/cmp/cpp/fragment/EntityUpdateOp.fragment.cpp +8 -2
  102. package/project/.sdk/src/cmp/csharp/Package_csharp.ts +2 -1
  103. package/project/.sdk/src/cmp/csharp/TestDirect_csharp.ts +3 -3
  104. package/project/.sdk/src/cmp/csharp/TestEntity_csharp.ts +6 -6
  105. package/project/.sdk/src/cmp/csharp/fragment/EntityBase.fragment.cs +38 -1
  106. package/project/.sdk/src/cmp/csharp/fragment/Main.fragment.cs +42 -33
  107. package/project/.sdk/src/cmp/dart/Config_dart.ts +6 -0
  108. package/project/.sdk/src/cmp/dart/Package_dart.ts +2 -1
  109. package/project/.sdk/src/cmp/dart/ReadmeEntity_dart.ts +13 -2
  110. package/project/.sdk/src/cmp/dart/ReadmeHowto_dart.ts +2 -1
  111. package/project/.sdk/src/cmp/dart/ReadmeInstall_dart.ts +3 -3
  112. package/project/.sdk/src/cmp/dart/ReadmeModel_dart.ts +1 -1
  113. package/project/.sdk/src/cmp/dart/ReadmeQuick_dart.ts +17 -6
  114. package/project/.sdk/src/cmp/dart/ReadmeRef_dart.ts +13 -2
  115. package/project/.sdk/src/cmp/dart/ReadmeTopQuick_dart.ts +13 -2
  116. package/project/.sdk/src/cmp/dart/TestDirect_dart.ts +3 -3
  117. package/project/.sdk/src/cmp/dart/TestEntity_dart.ts +8 -8
  118. package/project/.sdk/src/cmp/dart/fragment/EntityBase.fragment.dart +18 -1
  119. package/project/.sdk/src/cmp/dart/fragment/EntityCreateOp.fragment.dart +9 -1
  120. package/project/.sdk/src/cmp/dart/fragment/EntityLoadOp.fragment.dart +9 -1
  121. package/project/.sdk/src/cmp/dart/fragment/EntityRemoveOp.fragment.dart +15 -1
  122. package/project/.sdk/src/cmp/dart/fragment/EntityUpdateOp.fragment.dart +9 -1
  123. package/project/.sdk/src/cmp/dart/fragment/SdkError.fragment.dart +8 -0
  124. package/project/.sdk/src/cmp/elixir/Package_elixir.ts +3 -1
  125. package/project/.sdk/src/cmp/elixir/ReadmeInstall_elixir.ts +2 -2
  126. package/project/.sdk/src/cmp/elixir/ReadmeTopQuick_elixir.ts +7 -4
  127. package/project/.sdk/src/cmp/elixir/TestEntity_elixir.ts +11 -2
  128. package/project/.sdk/src/cmp/elixir/fragment/EntityCreateOp.fragment.ex +2 -1
  129. package/project/.sdk/src/cmp/elixir/fragment/EntityListOp.fragment.ex +1 -0
  130. package/project/.sdk/src/cmp/elixir/fragment/EntityLoadOp.fragment.ex +2 -1
  131. package/project/.sdk/src/cmp/elixir/fragment/EntityRemoveOp.fragment.ex +4 -1
  132. package/project/.sdk/src/cmp/elixir/fragment/EntityUpdateOp.fragment.ex +2 -1
  133. package/project/.sdk/src/cmp/go/EntityTypes_go.ts +38 -8
  134. package/project/.sdk/src/cmp/go/Entity_go.ts +2 -2
  135. package/project/.sdk/src/cmp/go/Main_go.ts +4 -5
  136. package/project/.sdk/src/cmp/go/Package_go.ts +8 -5
  137. package/project/.sdk/src/cmp/go/ReadmeExplanation_go.ts +2 -2
  138. package/project/.sdk/src/cmp/go/ReadmeHowto_go.ts +2 -2
  139. package/project/.sdk/src/cmp/go/ReadmeInstall_go.ts +4 -2
  140. package/project/.sdk/src/cmp/go/ReadmeModel_go.ts +2 -2
  141. package/project/.sdk/src/cmp/go/ReadmeQuick_go.ts +2 -2
  142. package/project/.sdk/src/cmp/go/ReadmeTopQuick_go.ts +2 -2
  143. package/project/.sdk/src/cmp/go/ReadmeTopTest_go.ts +2 -2
  144. package/project/.sdk/src/cmp/go/TestDirect_go.ts +21 -15
  145. package/project/.sdk/src/cmp/go/TestEntity_go.ts +9 -9
  146. package/project/.sdk/src/cmp/go/Test_go.ts +2 -2
  147. package/project/.sdk/src/cmp/go/fragment/Entity.fragment.go +42 -1
  148. package/project/.sdk/src/cmp/go-cli/Main_go-cli.ts +4 -4
  149. package/project/.sdk/src/cmp/go-mcp/Main_go-mcp.ts +4 -4
  150. package/project/.sdk/src/cmp/haskell/Package_haskell.ts +2 -1
  151. package/project/.sdk/src/cmp/haskell/ReadmeEntity_haskell.ts +10 -5
  152. package/project/.sdk/src/cmp/haskell/ReadmeModel_haskell.ts +10 -8
  153. package/project/.sdk/src/cmp/haskell/ReadmeQuick_haskell.ts +14 -10
  154. package/project/.sdk/src/cmp/haskell/ReadmeRef_haskell.ts +21 -18
  155. package/project/.sdk/src/cmp/haskell/ReadmeTopQuick_haskell.ts +4 -4
  156. package/project/.sdk/src/cmp/haskell/Test_haskell.ts +23 -11
  157. package/project/.sdk/src/cmp/java/Package_java.ts +2 -1
  158. package/project/.sdk/src/cmp/java/ReadmeHowto_java.ts +2 -1
  159. package/project/.sdk/src/cmp/java/ReadmeInstall_java.ts +2 -2
  160. package/project/.sdk/src/cmp/java/ReadmeModel_java.ts +1 -1
  161. package/project/.sdk/src/cmp/java/ReadmeQuick_java.ts +3 -3
  162. package/project/.sdk/src/cmp/java/TestDirect_java.ts +3 -3
  163. package/project/.sdk/src/cmp/java/TestEntity_java.ts +6 -6
  164. package/project/.sdk/src/cmp/java/fragment/EntityBase.fragment.java +34 -1
  165. package/project/.sdk/src/cmp/java/fragment/SdkError.fragment.java +12 -0
  166. package/project/.sdk/src/cmp/js/Main_js.ts +4 -1
  167. package/project/.sdk/src/cmp/js/Package_js.ts +7 -1
  168. package/project/.sdk/src/cmp/js/ReadmeEntity_js.ts +13 -2
  169. package/project/.sdk/src/cmp/js/ReadmeHowto_js.ts +2 -1
  170. package/project/.sdk/src/cmp/js/ReadmeQuick_js.ts +13 -2
  171. package/project/.sdk/src/cmp/js/ReadmeTopQuick_js.ts +13 -2
  172. package/project/.sdk/src/cmp/js/ReadmeTopTest_js.ts +2 -1
  173. package/project/.sdk/src/cmp/js/TestDirect_js.ts +3 -3
  174. package/project/.sdk/src/cmp/js/TestEntity_js.ts +8 -8
  175. package/project/.sdk/src/cmp/js/fragment/EntityBase.fragment.js +22 -1
  176. package/project/.sdk/src/cmp/js/fragment/EntityCreateOp.fragment.js +9 -1
  177. package/project/.sdk/src/cmp/js/fragment/EntityLoadOp.fragment.js +9 -1
  178. package/project/.sdk/src/cmp/js/fragment/EntityRemoveOp.fragment.js +15 -1
  179. package/project/.sdk/src/cmp/js/fragment/EntityUpdateOp.fragment.js +9 -1
  180. package/project/.sdk/src/cmp/js/fragment/SdkError.fragment.js +13 -0
  181. package/project/.sdk/src/cmp/kotlin/Package_kotlin.ts +2 -1
  182. package/project/.sdk/src/cmp/kotlin/ReadmeHowto_kotlin.ts +2 -1
  183. package/project/.sdk/src/cmp/kotlin/ReadmeInstall_kotlin.ts +2 -2
  184. package/project/.sdk/src/cmp/kotlin/ReadmeModel_kotlin.ts +1 -1
  185. package/project/.sdk/src/cmp/kotlin/ReadmeQuick_kotlin.ts +3 -3
  186. package/project/.sdk/src/cmp/kotlin/TestDirect_kotlin.ts +3 -3
  187. package/project/.sdk/src/cmp/kotlin/TestEntity_kotlin.ts +6 -6
  188. package/project/.sdk/src/cmp/kotlin/fragment/EntityBase.fragment.kt +32 -1
  189. package/project/.sdk/src/cmp/lean/Package_lean.ts +3 -1
  190. package/project/.sdk/src/cmp/lean/Test_lean.ts +75 -21
  191. package/project/.sdk/src/cmp/lua/MainEntity_lua.ts +9 -4
  192. package/project/.sdk/src/cmp/lua/Package_lua.ts +4 -3
  193. package/project/.sdk/src/cmp/lua/ReadmeModel_lua.ts +11 -3
  194. package/project/.sdk/src/cmp/lua/ReadmeQuick_lua.ts +1 -1
  195. package/project/.sdk/src/cmp/lua/TestDirect_lua.ts +3 -3
  196. package/project/.sdk/src/cmp/lua/TestEntity_lua.ts +9 -9
  197. package/project/.sdk/src/cmp/lua/fragment/Entity.fragment.lua +37 -1
  198. package/project/.sdk/src/cmp/lua/fragment/SdkError.fragment.lua +12 -0
  199. package/project/.sdk/src/cmp/ocaml/EntityOperation_ocaml.ts +30 -3
  200. package/project/.sdk/src/cmp/ocaml/Entity_ocaml.ts +11 -5
  201. package/project/.sdk/src/cmp/ocaml/Package_ocaml.ts +3 -1
  202. package/project/.sdk/src/cmp/ocaml/ReadmeEntity_ocaml.ts +10 -5
  203. package/project/.sdk/src/cmp/ocaml/ReadmeHowto_ocaml.ts +6 -2
  204. package/project/.sdk/src/cmp/ocaml/ReadmeModel_ocaml.ts +10 -8
  205. package/project/.sdk/src/cmp/ocaml/ReadmeQuick_ocaml.ts +14 -13
  206. package/project/.sdk/src/cmp/ocaml/ReadmeRef_ocaml.ts +20 -18
  207. package/project/.sdk/src/cmp/ocaml/ReadmeTopQuick_ocaml.ts +4 -4
  208. package/project/.sdk/src/cmp/ocaml/ReadmeTopTest_ocaml.ts +8 -2
  209. package/project/.sdk/src/cmp/ocaml/TestEntity_ocaml.ts +8 -5
  210. package/project/.sdk/src/cmp/perl/ReadmeHowto_perl.ts +2 -1
  211. package/project/.sdk/src/cmp/perl/ReadmeModel_perl.ts +1 -1
  212. package/project/.sdk/src/cmp/perl/ReadmeQuick_perl.ts +3 -3
  213. package/project/.sdk/src/cmp/perl/ReadmeTopQuick_perl.ts +1 -1
  214. package/project/.sdk/src/cmp/perl/TestDirect_perl.ts +3 -3
  215. package/project/.sdk/src/cmp/perl/TestEntity_perl.ts +6 -6
  216. package/project/.sdk/src/cmp/perl/fragment/Entity.fragment.pm +36 -1
  217. package/project/.sdk/src/cmp/php/MainEntity_php.ts +21 -16
  218. package/project/.sdk/src/cmp/php/Package_php.ts +2 -2
  219. package/project/.sdk/src/cmp/php/ReadmeEntity_php.ts +6 -6
  220. package/project/.sdk/src/cmp/php/ReadmeHowto_php.ts +4 -3
  221. package/project/.sdk/src/cmp/php/ReadmeIntro_php.ts +2 -2
  222. package/project/.sdk/src/cmp/php/ReadmeModel_php.ts +1 -1
  223. package/project/.sdk/src/cmp/php/ReadmeQuick_php.ts +12 -12
  224. package/project/.sdk/src/cmp/php/ReadmeRef_php.ts +6 -6
  225. package/project/.sdk/src/cmp/php/ReadmeTopQuick_php.ts +4 -4
  226. package/project/.sdk/src/cmp/php/ReadmeTopTest_php.ts +2 -2
  227. package/project/.sdk/src/cmp/php/TestDirect_php.ts +3 -3
  228. package/project/.sdk/src/cmp/php/TestEntity_php.ts +17 -15
  229. package/project/.sdk/src/cmp/php/fragment/Entity.fragment.php +20 -1
  230. package/project/.sdk/src/cmp/php/fragment/SdkError.fragment.php +11 -0
  231. package/project/.sdk/src/cmp/py/Package_py.ts +4 -3
  232. package/project/.sdk/src/cmp/py/ReadmeEntity_py.ts +13 -2
  233. package/project/.sdk/src/cmp/py/ReadmeHowto_py.ts +2 -1
  234. package/project/.sdk/src/cmp/py/ReadmeModel_py.ts +1 -1
  235. package/project/.sdk/src/cmp/py/ReadmeQuick_py.ts +17 -6
  236. package/project/.sdk/src/cmp/py/ReadmeRef_py.ts +14 -3
  237. package/project/.sdk/src/cmp/py/ReadmeTopQuick_py.ts +13 -2
  238. package/project/.sdk/src/cmp/py/TestDirect_py.ts +3 -3
  239. package/project/.sdk/src/cmp/py/TestEntity_py.ts +9 -9
  240. package/project/.sdk/src/cmp/py/Test_py.ts +4 -1
  241. package/project/.sdk/src/cmp/py/fragment/Entity.fragment.py +29 -1
  242. package/project/.sdk/src/cmp/py/fragment/SdkError.fragment.py +11 -0
  243. package/project/.sdk/src/cmp/py-data/Main_py-data.ts +2 -1
  244. package/project/.sdk/src/cmp/rb/Package_rb.ts +4 -3
  245. package/project/.sdk/src/cmp/rb/ReadmeEntity_rb.ts +1 -1
  246. package/project/.sdk/src/cmp/rb/ReadmeHowto_rb.ts +2 -1
  247. package/project/.sdk/src/cmp/rb/ReadmeQuick_rb.ts +5 -5
  248. package/project/.sdk/src/cmp/rb/ReadmeTopQuick_rb.ts +1 -1
  249. package/project/.sdk/src/cmp/rb/TestDirect_rb.ts +3 -3
  250. package/project/.sdk/src/cmp/rb/TestEntity_rb.ts +9 -9
  251. package/project/.sdk/src/cmp/rb/fragment/Entity.fragment.rb +31 -1
  252. package/project/.sdk/src/cmp/rb/fragment/SdkError.fragment.rb +10 -1
  253. package/project/.sdk/src/cmp/rust/Entity_rust.ts +5 -1
  254. package/project/.sdk/src/cmp/rust/Main_rust.ts +21 -0
  255. package/project/.sdk/src/cmp/rust/Package_rust.ts +2 -1
  256. package/project/.sdk/src/cmp/rust/TestDirect_rust.ts +3 -3
  257. package/project/.sdk/src/cmp/rust/TestEntity_rust.ts +12 -12
  258. package/project/.sdk/src/cmp/rust/fragment/Entity.fragment.rs +18 -0
  259. package/project/.sdk/src/cmp/rust/fragment/EntityCreateOp.fragment.rs +8 -2
  260. package/project/.sdk/src/cmp/rust/fragment/EntityListOp.fragment.rs +20 -3
  261. package/project/.sdk/src/cmp/rust/fragment/EntityLoadOp.fragment.rs +8 -2
  262. package/project/.sdk/src/cmp/rust/fragment/EntityRemoveOp.fragment.rs +10 -2
  263. package/project/.sdk/src/cmp/rust/fragment/EntityUpdateOp.fragment.rs +8 -2
  264. package/project/.sdk/src/cmp/rust/fragment/SdkError.fragment.rs +10 -0
  265. package/project/.sdk/src/cmp/scala/ReadmeHowto_scala.ts +2 -1
  266. package/project/.sdk/src/cmp/scala/ReadmeInstall_scala.ts +3 -3
  267. package/project/.sdk/src/cmp/scala/ReadmeModel_scala.ts +1 -1
  268. package/project/.sdk/src/cmp/scala/ReadmeQuick_scala.ts +3 -3
  269. package/project/.sdk/src/cmp/scala/TestEntity_scala.ts +3 -3
  270. package/project/.sdk/src/cmp/scala/fragment/EntityBase.fragment.scala +27 -1
  271. package/project/.sdk/src/cmp/swift/ReadmeHowto_swift.ts +2 -1
  272. package/project/.sdk/src/cmp/swift/ReadmeInstall_swift.ts +3 -3
  273. package/project/.sdk/src/cmp/swift/ReadmeModel_swift.ts +1 -1
  274. package/project/.sdk/src/cmp/swift/ReadmeQuick_swift.ts +3 -3
  275. package/project/.sdk/src/cmp/swift/fragment/EntityBase.fragment.swift +34 -1
  276. package/project/.sdk/src/cmp/ts/EntityOperation_ts.ts +9 -1
  277. package/project/.sdk/src/cmp/ts/EntityTypes_ts.ts +18 -1
  278. package/project/.sdk/src/cmp/ts/Gitignore_ts.ts +5 -2
  279. package/project/.sdk/src/cmp/ts/Main_ts.ts +4 -1
  280. package/project/.sdk/src/cmp/ts/Package_ts.ts +10 -1
  281. package/project/.sdk/src/cmp/ts/ReadmeEntity_ts.ts +13 -2
  282. package/project/.sdk/src/cmp/ts/ReadmeHowto_ts.ts +2 -1
  283. package/project/.sdk/src/cmp/ts/ReadmeQuick_ts.ts +21 -6
  284. package/project/.sdk/src/cmp/ts/ReadmeRef_ts.ts +52 -2
  285. package/project/.sdk/src/cmp/ts/ReadmeTopQuick_ts.ts +14 -3
  286. package/project/.sdk/src/cmp/ts/ReadmeTopTest_ts.ts +34 -2
  287. package/project/.sdk/src/cmp/ts/TestDirect_ts.ts +64 -43
  288. package/project/.sdk/src/cmp/ts/TestEntity_ts.ts +8 -8
  289. package/project/.sdk/src/cmp/ts/fragment/Direct.test.fragment.ts +2 -2
  290. package/project/.sdk/src/cmp/ts/fragment/Entity.test.fragment.ts +2 -2
  291. package/project/.sdk/src/cmp/ts/fragment/EntityBase.fragment.ts +25 -1
  292. package/project/.sdk/src/cmp/ts/fragment/EntityCreateOp.fragment.ts +10 -2
  293. package/project/.sdk/src/cmp/ts/fragment/EntityListOp.fragment.ts +1 -1
  294. package/project/.sdk/src/cmp/ts/fragment/EntityLoadOp.fragment.ts +10 -2
  295. package/project/.sdk/src/cmp/ts/fragment/EntityRemoveOp.fragment.ts +27 -3
  296. package/project/.sdk/src/cmp/ts/fragment/EntityUpdateOp.fragment.ts +10 -2
  297. package/project/.sdk/src/cmp/ts/fragment/SdkError.fragment.ts +15 -0
  298. package/project/.sdk/src/cmp/zig/Entity_zig.ts +5 -1
  299. package/project/.sdk/src/cmp/zig/Package_zig.ts +3 -1
  300. package/project/.sdk/src/cmp/zig/fragment/Entity.fragment.zig +39 -0
  301. package/project/.sdk/src/cmp/zig/fragment/EntityCreateOp.fragment.zig +2 -2
  302. package/project/.sdk/src/cmp/zig/fragment/EntityListOp.fragment.zig +21 -2
  303. package/project/.sdk/src/cmp/zig/fragment/EntityLoadOp.fragment.zig +2 -2
  304. package/project/.sdk/src/cmp/zig/fragment/EntityRemoveOp.fragment.zig +5 -2
  305. package/project/.sdk/src/cmp/zig/fragment/EntityUpdateOp.fragment.zig +2 -2
  306. package/project/.sdk/tm/c/VERSION +1 -1
  307. package/project/.sdk/tm/c/core/helpers.c +1 -0
  308. package/project/.sdk/tm/c/core/sdk.h +22 -6
  309. package/project/.sdk/tm/c/tests/feature_harness.h +1 -0
  310. package/project/.sdk/tm/c/tests/primary_utility_test.c +4 -1
  311. package/project/.sdk/tm/c/utility/graphql.c +1 -1
  312. package/project/.sdk/tm/c/utility/make_url.c +1 -0
  313. package/project/.sdk/tm/c/utility/param.c +1 -0
  314. package/project/.sdk/tm/clojure/VERSION +1 -1
  315. package/project/.sdk/tm/cpp/VERSION +1 -1
  316. package/project/.sdk/tm/cpp/core/types.hpp +33 -8
  317. package/project/.sdk/tm/cpp/test/pipeline_test.cpp +5 -0
  318. package/project/.sdk/tm/cpp/test/runner_support.hpp +4 -4
  319. package/project/.sdk/tm/csharp/VERSION +1 -1
  320. package/project/.sdk/tm/csharp/core/Types.cs +6 -0
  321. package/project/.sdk/tm/csharp/test/FeatureHarness.cs +396 -0
  322. package/project/.sdk/tm/csharp/test/FeatureTest.cs +7 -385
  323. package/project/.sdk/tm/csharp/test/Runner.cs +4 -4
  324. package/project/.sdk/tm/dart/lib/utility/MakeErrorUtility.dart +4 -0
  325. package/project/.sdk/tm/dart/test/utility.dart +4 -4
  326. package/project/.sdk/tm/elixir/VERSION +1 -1
  327. package/project/.sdk/tm/elixir/lib/projectname/entity_base.ex +26 -0
  328. package/project/.sdk/tm/go/VERSION +1 -1
  329. package/project/.sdk/tm/go/core/types.go +6 -0
  330. package/project/.sdk/tm/go/test/feature_harness_test.go +361 -0
  331. package/project/.sdk/tm/go/test/feature_test.go +7 -350
  332. package/project/.sdk/tm/go/test/pipeline_test.go +6 -0
  333. package/project/.sdk/tm/go/test/runner_test.go +16 -4
  334. package/project/.sdk/tm/haskell/VERSION +1 -1
  335. package/project/.sdk/tm/haskell/src/SdkFeatures.hs +28 -5
  336. package/project/.sdk/tm/haskell/src/SdkTypes.hs +14 -5
  337. package/project/.sdk/tm/java/VERSION +1 -1
  338. package/project/.sdk/tm/java/test/RunnerSupport.java +4 -4
  339. package/project/.sdk/tm/java/utility/MakeError.java +4 -0
  340. package/project/.sdk/tm/js/src/utility/MakeErrorUtility.js +4 -0
  341. package/project/.sdk/tm/js/test/utility.js +3 -3
  342. package/project/.sdk/tm/kotlin/VERSION +1 -1
  343. package/project/.sdk/tm/kotlin/core/Utility.kt +2 -0
  344. package/project/.sdk/tm/kotlin/test/RunnerSupport.kt +3 -3
  345. package/project/.sdk/tm/lean/Makefile +25 -0
  346. package/project/.sdk/tm/lean/VERSION +1 -1
  347. package/project/.sdk/tm/lean/src/SdkUtility.lean +11 -9
  348. package/project/.sdk/tm/lean/test/TFeature.lean +27 -14
  349. package/project/.sdk/tm/lean/test/TPrimaryUtility.lean +5 -2
  350. package/project/.sdk/tm/lua/test/runner.lua +4 -4
  351. package/project/.sdk/tm/lua/utility/make_error.lua +4 -0
  352. package/project/.sdk/tm/ocaml/VERSION +1 -1
  353. package/project/.sdk/tm/ocaml/sdk_types.ml +14 -5
  354. package/project/.sdk/tm/ocaml/test/t_pipeline.ml +5 -2
  355. package/project/.sdk/tm/perl/t/runner.pm +4 -4
  356. package/project/.sdk/tm/php/VERSION +1 -1
  357. package/project/.sdk/tm/php/test/Runner.php +4 -4
  358. package/project/.sdk/tm/php/utility/MakeError.php +5 -0
  359. package/project/.sdk/tm/py/pkg/utility/make_error.py +4 -0
  360. package/project/.sdk/tm/py/test/runner.py +19 -4
  361. package/project/.sdk/tm/rb/test/runner.rb +4 -4
  362. package/project/.sdk/tm/rb/utility/make_error.rb +4 -0
  363. package/project/.sdk/tm/rust/VERSION +1 -1
  364. package/project/.sdk/tm/rust/core/types.rs +22 -6
  365. package/project/.sdk/tm/rust/tests/common/mod.rs +6 -6
  366. package/project/.sdk/tm/rust/tests/pipeline_test.rs +6 -0
  367. package/project/.sdk/tm/rust/utility/make_error.rs +4 -0
  368. package/project/.sdk/tm/scala/VERSION +1 -1
  369. package/project/.sdk/tm/swift/VERSION +1 -1
  370. package/project/.sdk/tm/ts/src/tsconfig.json +1 -0
  371. package/project/.sdk/tm/ts/src/utility/MakeErrorUtility.ts +4 -0
  372. package/project/.sdk/tm/ts/test/tsconfig.json +1 -0
  373. package/project/.sdk/tm/ts/test/utility.ts +3 -3
  374. package/project/.sdk/tm/zig/VERSION +1 -1
  375. package/src/action/doctor.ts +410 -0
  376. package/src/action/feature.ts +54 -16
  377. package/src/action/target.ts +174 -25
  378. package/src/cmp/Entity.ts +7 -0
  379. package/src/cmp/Feature.ts +3 -1
  380. package/src/cmp/Main.ts +7 -1
  381. package/src/cmp/ReadmeExplanation.ts +2 -2
  382. package/src/cmp/ReadmeTop.ts +22 -9
  383. package/src/cmp/Registered.ts +100 -0
  384. package/src/cmp/Test.ts +4 -1
  385. package/src/helpers/dryrun.ts +57 -0
  386. package/src/helpers/featureSource.ts +208 -0
  387. package/src/helpers/naming.ts +73 -2
  388. package/src/helpers/opExample.ts +19 -2
  389. package/src/helpers/opShape.ts +65 -0
  390. package/src/helpers/packageMeta.ts +163 -10
  391. package/src/helpers/stdrep.ts +56 -0
  392. package/src/helpers/testPolicy.ts +52 -0
  393. package/src/sdkgen.ts +70 -4
  394. package/project/.sdk/tm/rust/feature/mod.rs +0 -24
@@ -28,7 +28,7 @@
28
28
 
29
29
  import {
30
30
  cmp, each,
31
- File, Content, Folder,
31
+ File, Content, Folder, goModule
32
32
  } from '@voxgig/sdkgen'
33
33
 
34
34
  import { canonToType, opTypeName, opRequestShape, warnEntityTypeCollisions , deriveEntityNames } from '@voxgig/sdkgen'
@@ -165,6 +165,10 @@ const EntityTypes = cmp(function EntityTypes(props: any) {
165
165
  const { target } = props
166
166
  const { model, log } = props.ctx$
167
167
 
168
+ // This file is GENERATED, not templated, so the GOMODULE placeholder is
169
+ // never substituted for it — the module path has to be interpolated.
170
+ const gomodule = goModule(model, 'go')
171
+
168
172
  // only_active:false — getModelPath DROPS active:false entries by default,
169
173
  // but the consumer scaffold (create-sdkgen Root.ts) iterates the RAW entity
170
174
  // collection, so inactive entities still get generated entity code that
@@ -196,7 +200,11 @@ const EntityTypes = cmp(function EntityTypes(props: any) {
196
200
  // @voxgig/apidef VALID_CANON). Do not edit by hand.
197
201
  package entity
198
202
 
199
- import "encoding/json"
203
+ import (
204
+ "encoding/json"
205
+
206
+ "${gomodule}/core"
207
+ )
200
208
 
201
209
  `)
202
210
 
@@ -262,12 +270,26 @@ func asMap(v any) map[string]any {
262
270
  return out
263
271
  }
264
272
 
265
- // typedFrom decodes a runtime value (a map[string]any produced by the op
266
- // pipeline) into a typed model T via a JSON round-trip. On any error it
267
- // returns the zero value of T; the op's own (value, error) tuple carries the
268
- // real error.
273
+ // entityData unwraps an entity to its data map.
274
+ //
275
+ // Operations resolve to the ENTITY, not the raw data (see AGENTS.md), and an
276
+ // entity's fields are UNEXPORTED — marshalling one directly yields \`{}\`, so
277
+ // every typed accessor would silently hand back a zero-valued struct. The
278
+ // typed boundary therefore takes the data hop first.
279
+ func entityData(v any) any {
280
+ if ent, ok := v.(core.Entity); ok {
281
+ return ent.Data()
282
+ }
283
+ return v
284
+ }
285
+
286
+ // typedFrom decodes a runtime value (an entity, or the map[string]any the op
287
+ // pipeline produced) into a typed model T via a JSON round-trip. On any error
288
+ // it returns the zero value of T; the op's own (value, error) tuple carries
289
+ // the real error.
269
290
  func typedFrom[T any](v any) T {
270
291
  var out T
292
+ v = entityData(v)
271
293
  if v == nil {
272
294
  return out
273
295
  }
@@ -279,13 +301,21 @@ func typedFrom[T any](v any) T {
279
301
  return out
280
302
  }
281
303
 
282
- // typedSliceFrom decodes a runtime list value ([]any of maps) into a typed
283
- // slice []T via a JSON round-trip, for list ops.
304
+ // typedSliceFrom decodes a runtime list value into a typed slice []T via a
305
+ // JSON round-trip, for list ops. \`list\` resolves to a slice of ENTITY
306
+ // instances, so each element takes the data hop.
284
307
  func typedSliceFrom[T any](v any) []T {
285
308
  var out []T
286
309
  if v == nil {
287
310
  return out
288
311
  }
312
+ if list, ok := v.([]any); ok {
313
+ unwrapped := make([]any, 0, len(list))
314
+ for _, item := range list {
315
+ unwrapped = append(unwrapped, entityData(item))
316
+ }
317
+ v = unwrapped
318
+ }
289
319
  b, err := json.Marshal(v)
290
320
  if err != nil {
291
321
  return out
@@ -4,7 +4,7 @@ import * as Path from 'node:path'
4
4
  import {
5
5
  cmp, each, camelify, names,
6
6
  File, Content, Folder, Fragment, Line, FeatureHook, Slot,
7
- entityClassName, entityCollection,
7
+ entityClassName, entityCollection, goModule
8
8
  } from '@voxgig/sdkgen'
9
9
 
10
10
  import {
@@ -21,7 +21,7 @@ const Entity = cmp(function Entity(props: any) {
21
21
 
22
22
  // Module name: concatenated lowercase
23
23
  // Go module path == repo path on GitHub (org from model.origin).
24
- const gomodule = `github.com/${model.origin || 'voxgig-sdk'}/${model.name}-sdk/go`
24
+ const gomodule = goModule(model, 'go')
25
25
 
26
26
  // Collision-free entity CLASS name (see entityClassName): normally
27
27
  // `<Name>Entity`, but disambiguated (e.g. `<Name>EntityClient`) when it would
@@ -4,7 +4,7 @@ import * as Path from 'node:path'
4
4
  import {
5
5
  cmp, each, names, cmap,
6
6
  List, File, Content, Copy, Folder, Fragment, Line, FeatureHook,
7
- entityClassName, entityCollection,
7
+ entityClassName, entityCollection, goModule, goPackageIdent
8
8
  } from '@voxgig/sdkgen'
9
9
 
10
10
 
@@ -37,11 +37,10 @@ const Main = cmp(async function Main(props: any) {
37
37
 
38
38
  // Go module path == the repo path on GitHub (org from model.origin),
39
39
  // e.g. github.com/voxgig-sdk/<slug>-sdk. Used in go.mod and every import.
40
- const gomodule = `github.com/${model.origin || 'voxgig-sdk'}/${model.name}-sdk/go`
40
+ const gomodule = goModule(model, 'go')
41
41
  // The root package name must be a plain Go identifier (can't be a path),
42
- // so it stays as the concatenated-lowercase form (e.g. voxgigdogsdk).
43
- const gopackage = (model.origin || 'voxgig-sdk').replace(/-sdk$/, '').replace(/[^a-z0-9]/gi, '') +
44
- model.name.replace(/[^a-z0-9]/gi, '').toLowerCase() + 'sdk'
42
+ // so it stays a concatenated-lowercase form (e.g. voxgigdogsdk).
43
+ const gopackage = goPackageIdent(model, 'go')
45
44
 
46
45
  Package({ target })
47
46
 
@@ -3,7 +3,7 @@ import {
3
3
  Content,
4
4
  File,
5
5
  cmp,
6
- collectDeps,
6
+ collectDeps, goModule, goVersion
7
7
  } from '@voxgig/sdkgen'
8
8
 
9
9
 
@@ -18,14 +18,17 @@ const Package = cmp(async function Package(props: any) {
18
18
 
19
19
  const model: Model = ctx$.model
20
20
 
21
- // Module name: concatenated lowercase (e.g., voxgigsolardemosdk)
22
- // Go module path == repo path on GitHub (org from model.origin).
23
- const gomodule = `github.com/${model.origin || 'voxgig-sdk'}/${model.name}-sdk/go`
21
+ // Module path and language version both come from the model — see
22
+ // goModule / goVersion. Neither is derivable from the slug alone: the repo
23
+ // may not be named `<slug>-sdk`, and the hardcoded `go 1.20` this used to
24
+ // emit could not compile sdkgen's own `log` feature (it imports log/slog,
25
+ // which needs 1.21).
26
+ const gomodule = goModule(model, 'go')
24
27
 
25
28
  File({ name: 'go.mod' }, () => {
26
29
  Content(`module ${gomodule}
27
30
 
28
- go 1.20
31
+ go ${goVersion(model, target.name)}
29
32
 
30
33
  `)
31
34
 
@@ -1,12 +1,12 @@
1
1
 
2
- import { cmp, Content } from '@voxgig/sdkgen'
2
+ import { cmp, Content, goModule } from '@voxgig/sdkgen'
3
3
 
4
4
 
5
5
  const ReadmeExplanation = cmp(function ReadmeExplanation(props: any) {
6
6
  const { target, ctx$: { model } } = props
7
7
 
8
8
  // Go module path == repo path on GitHub (org from model.origin).
9
- const gomodule = `github.com/${model.origin || 'voxgig-sdk'}/${model.name}-sdk/go`
9
+ const gomodule = goModule(model, 'go')
10
10
 
11
11
  Content(`### Data as maps
12
12
 
@@ -1,5 +1,5 @@
1
1
 
2
- import { cmp, Content, isAuthActive, envName, canonKey, entityIdField, pickExampleEntity, opRequestShape } from '@voxgig/sdkgen'
2
+ import { cmp, Content, isAuthActive, envName, canonKey, entityIdField, pickExampleEntity, opRequestShape, goModule } from '@voxgig/sdkgen'
3
3
 
4
4
  import {
5
5
  KIT,
@@ -29,7 +29,7 @@ const ReadmeHowto = cmp(function ReadmeHowto(props: any) {
29
29
  const { target, ctx$: { model } } = props
30
30
 
31
31
  // Go module path == repo path on GitHub (org from model.origin).
32
- const gomodule = `github.com/${model.origin || 'voxgig-sdk'}/${model.name}-sdk/go`
32
+ const gomodule = goModule(model, 'go')
33
33
 
34
34
  const entity = getModelPath(model, `main.${KIT}.entity`)
35
35
  // Pick an entity with a real op (prefer a read op) — never fabricate a
@@ -8,7 +8,9 @@ const ReadmeInstall = cmp(function ReadmeInstall(props: any) {
8
8
 
9
9
  // Go module path == repo path on GitHub (org from model.origin).
10
10
  const gomodule = packageName(model, 'go')
11
- const { releasesUrl } = repoInfo(model)
11
+ // `repo` is the directory a `git clone` of this project creates — not
12
+ // `<slug>-sdk`, which is only the DEFAULT repo name.
13
+ const { releasesUrl, repo } = repoInfo(model)
12
14
 
13
15
  Content(`\`\`\`bash
14
16
  go get ${gomodule}@latest
@@ -22,7 +24,7 @@ project and add a \`replace\` directive pointing at the checked-out
22
24
  \`go/\` directory:
23
25
 
24
26
  \`\`\`bash
25
- go mod edit -replace ${gomodule}=../${model.name}-sdk/go
27
+ go mod edit -replace ${gomodule}=../${repo}/go
26
28
  \`\`\`
27
29
 
28
30
  `)
@@ -1,5 +1,5 @@
1
1
 
2
- import { cmp, each, Content, isAuthActive, entityIdField, entityPrimaryOp } from '@voxgig/sdkgen'
2
+ import { cmp, each, Content, isAuthActive, entityIdField, entityPrimaryOp, goModule } from '@voxgig/sdkgen'
3
3
 
4
4
  import {
5
5
  KIT,
@@ -44,7 +44,7 @@ const ReadmeModel = cmp(function ReadmeModel(props: any) {
44
44
  const resultShapeRows = resultRows.join('\n')
45
45
 
46
46
  // Go module path == repo path on GitHub (org from model.origin).
47
- const gomodule = `github.com/${model.origin || 'voxgig-sdk'}/${model.name}-sdk/go`
47
+ const gomodule = goModule(model, 'go')
48
48
 
49
49
  const apikeyOptionRow = isAuthActive(model)
50
50
  ? '| `"apikey"` | `string` | API key for authentication. |\n'
@@ -1,5 +1,5 @@
1
1
 
2
- import { cmp, Content, isAuthActive, envName, opRequestShape, entityIdField, entityOps } from '@voxgig/sdkgen'
2
+ import { cmp, Content, isAuthActive, envName, opRequestShape, entityIdField, entityOps, goModule } from '@voxgig/sdkgen'
3
3
 
4
4
  import {
5
5
  KIT,
@@ -20,7 +20,7 @@ const ReadmeQuick = cmp(function ReadmeQuick(props: any) {
20
20
 
21
21
  const entity = getModelPath(model, `main.${KIT}.entity`)
22
22
  // Go module path == repo path on GitHub (org from model.origin).
23
- const gomodule = `github.com/${model.origin || 'voxgig-sdk'}/${model.name}-sdk/go`
23
+ const gomodule = goModule(model, 'go')
24
24
 
25
25
  const exampleEntity = Object.values(entity).find((e: any) => e.active !== false) as any
26
26
 
@@ -1,5 +1,5 @@
1
1
 
2
- import { cmp, Content, isAuthActive, envName, entityIdField, entityOps, opRequestShape } from '@voxgig/sdkgen'
2
+ import { cmp, Content, isAuthActive, envName, entityIdField, entityOps, opRequestShape, goModule } from '@voxgig/sdkgen'
3
3
 
4
4
  import {
5
5
  KIT,
@@ -15,7 +15,7 @@ const ReadmeTopQuick = cmp(function ReadmeTopQuick(props: any) {
15
15
 
16
16
  const entity = getModelPath(model, `main.${KIT}.entity`)
17
17
  // Go module path == repo path on GitHub (org from model.origin).
18
- const gomodule = `github.com/${model.origin || 'voxgig-sdk'}/${model.name}-sdk/go`
18
+ const gomodule = goModule(model, 'go')
19
19
 
20
20
  const exampleEntity = Object.values(entity).find((e: any) => e.active !== false) as any
21
21
 
@@ -1,5 +1,5 @@
1
1
 
2
- import { cmp, Content, canonKey, entityIdField, pickExampleEntity, opRequestShape } from '@voxgig/sdkgen'
2
+ import { cmp, Content, canonKey, entityIdField, pickExampleEntity, opRequestShape, goModule } from '@voxgig/sdkgen'
3
3
 
4
4
  import {
5
5
  KIT,
@@ -28,7 +28,7 @@ const ReadmeTopTest = cmp(function ReadmeTopTest(props: any) {
28
28
 
29
29
  const entity = getModelPath(model, `main.${KIT}.entity`)
30
30
  // Go module path == repo path on GitHub (org from model.origin).
31
- const gomodule = `github.com/${model.origin || 'voxgig-sdk'}/${model.name}-sdk/go`
31
+ const gomodule = goModule(model, 'go')
32
32
 
33
33
  // Pick an entity with a real op (prefer a read op) — never fabricate a
34
34
  // `load` on an op-less entity like Cloudsmith's `Abort`.
@@ -11,7 +11,7 @@ import {
11
11
  File,
12
12
  cmp,
13
13
  snakify,
14
- isAuthActive,
14
+ isAuthActive, envName, envToken, liveStrict
15
15
  } from '@voxgig/sdkgen'
16
16
 
17
17
 
@@ -65,7 +65,11 @@ const TestDirect = cmp(function TestDirect(props: any) {
65
65
  const entity: ModelEntity = props.entity
66
66
  const gomodule = props.gomodule
67
67
 
68
- const PROJECTNAME = nom(model, 'Name').toUpperCase().replace(/[^A-Z_]/g, '_')
68
+ const PROJECTNAME = envName(model)
69
+
70
+ // Does a live run ASSERT, or merely observe? See helpers/testPolicy.
71
+ // t.Skipf passes; t.Fatalf does not.
72
+ const liveFail = liveStrict(model, target.name) ? 'Fatalf' : 'Skipf'
69
73
 
70
74
  const authActive = isAuthActive(model)
71
75
  const apikeyEnvEntry = authActive
@@ -146,7 +150,7 @@ const TestDirect = cmp(function TestDirect(props: any) {
146
150
  : ''
147
151
 
148
152
  // Build the ENTID env var name for this entity
149
- const entidEnvVar = `${PROJECTNAME}_TEST_${nom(entity, 'NAME').replace(/[^A-Z_]/g, '_')}_ENTID`
153
+ const entidEnvVar = `${PROJECTNAME}_TEST_${envToken(entity.name)}_ENTID`
150
154
 
151
155
  File({ name: entity.name + '_direct_test.' + target.ext }, () => {
152
156
 
@@ -254,18 +258,19 @@ ${listSkipBlock} client := setup.client
254
258
  }
255
259
 
256
260
  Content(` if setup.live {
257
- // Live mode is lenient: synthetic IDs frequently 4xx and the
258
- // list-response shape varies wildly across public APIs. Skip
259
- // rather than fail when the call doesn't return a usable list.
261
+ // Live-mode leniency is a model decision
262
+ // (main.kit.test.live.strict): synthetic IDs 4xx constantly
263
+ // against an arbitrary public API, so the default SKIPS here.
264
+ // A project that owns its test server sets strict and FAILS.
260
265
  if err != nil {
261
- t.Skipf("list call failed (likely synthetic IDs against live API): %v", err)
266
+ t.${liveFail}("list call failed (likely synthetic IDs against live API): %v", err)
262
267
  }
263
268
  if result["ok"] != true {
264
- t.Skipf("list call not ok (likely synthetic IDs against live API): %v", result)
269
+ t.${liveFail}("list call not ok (likely synthetic IDs against live API): %v", result)
265
270
  }
266
271
  status := core.ToInt(result["status"])
267
272
  if status < 200 || status >= 300 {
268
- t.Skipf("expected 2xx status, got %v", result["status"])
273
+ t.${liveFail}("expected 2xx status, got %v", result["status"])
269
274
  }
270
275
  } else {
271
276
  if err != nil {
@@ -413,10 +418,10 @@ ${loadSkipBlock} client := setup.client
413
418
  "params": listParams,
414
419
  })
415
420
  if listErr != nil {
416
- t.Skipf("list call failed (likely synthetic IDs against live API): %v", listErr)
421
+ t.${liveFail}("list call failed (likely synthetic IDs against live API): %v", listErr)
417
422
  }
418
423
  if listResult["ok"] != true {
419
- t.Skipf("list call not ok (likely synthetic IDs against live API): %v", listResult)
424
+ t.${liveFail}("list call not ok (likely synthetic IDs against live API): %v", listResult)
420
425
  }
421
426
 
422
427
  // Get first entity ID from list
@@ -468,16 +473,17 @@ ${loadSkipBlock} client := setup.client
468
473
  if setup.live {
469
474
  // Live mode is lenient: synthetic IDs frequently 4xx. Skip
470
475
  // rather than fail when the load endpoint isn't reachable with
471
- // the IDs we can construct from setup.idmap.
476
+ // the IDs we can construct from setup.idmap — unless the model
477
+ // sets main.kit.test.live.strict.
472
478
  if err != nil {
473
- t.Skipf("load call failed (likely synthetic IDs against live API): %v", err)
479
+ t.${liveFail}("load call failed (likely synthetic IDs against live API): %v", err)
474
480
  }
475
481
  if result["ok"] != true {
476
- t.Skipf("load call not ok (likely synthetic IDs against live API): %v", result)
482
+ t.${liveFail}("load call not ok (likely synthetic IDs against live API): %v", result)
477
483
  }
478
484
  status := core.ToInt(result["status"])
479
485
  if status < 200 || status >= 300 {
480
- t.Skipf("expected 2xx status, got %v", result["status"])
486
+ t.${liveFail}("expected 2xx status, got %v", result["status"])
481
487
  }
482
488
  } else {
483
489
  if err != nil {
@@ -24,7 +24,7 @@ import {
24
24
  buildIdNames,
25
25
  getMatchEntries,
26
26
  isAuthActive,
27
- entityDataIdField,
27
+ entityDataIdField, envName, envToken
28
28
  } from '@voxgig/sdkgen'
29
29
 
30
30
 
@@ -67,7 +67,7 @@ const TestEntity = cmp(function TestEntity(props: any) {
67
67
  return
68
68
  }
69
69
 
70
- const PROJUPPER = nom(model.const, 'Name').toUpperCase().replace(/[^A-Z_]/g, '_')
70
+ const PROJUPPER = envName(model)
71
71
 
72
72
  const authActive = isAuthActive(model)
73
73
  const apikeyEnvEntry = authActive
@@ -194,7 +194,7 @@ ${hasList ? `
194
194
  // The basic flow consumes synthetic IDs from the fixture. In live mode
195
195
  // without an *_ENTID env override, those IDs hit the live API and 4xx.
196
196
  if setup.syntheticOnly {
197
- t.Skip("live entity test uses synthetic IDs from fixture — set ${PROJUPPER}_TEST_${entity.name.toUpperCase().replace(/[^A-Z_]/g, '_')}_ENTID JSON to run live")
197
+ t.Skip("live entity test uses synthetic IDs from fixture — set ${PROJUPPER}_TEST_${envToken(entity.name)}_ENTID JSON to run live")
198
198
  return
199
199
  }
200
200
  ${allSteps.length > 0 ? '\t\tclient := setup.client\n\n' : ''}`)
@@ -281,16 +281,16 @@ ${allSteps.length > 0 ? '\t\tclient := setup.client\n\n' : ''}`)
281
281
  // Detect ENTID env override before envOverride consumes it. When live
282
282
  // mode is on without a real override, the basic test runs against synthetic
283
283
  // IDs from the fixture and 4xx's. Surface this so the test can skip.
284
- entidEnvRaw := os.Getenv("${PROJUPPER}_TEST_${entity.name.toUpperCase().replace(/[^A-Z_]/g, '_')}_ENTID")
284
+ entidEnvRaw := os.Getenv("${PROJUPPER}_TEST_${envToken(entity.name)}_ENTID")
285
285
  idmapOverridden := entidEnvRaw != "" && strings.HasPrefix(strings.TrimSpace(entidEnvRaw), "{")
286
286
 
287
287
  env := envOverride(map[string]any{
288
- "${PROJUPPER}_TEST_${entity.name.toUpperCase().replace(/[^A-Z_]/g, '_')}_ENTID": idmap,
288
+ "${PROJUPPER}_TEST_${envToken(entity.name)}_ENTID": idmap,
289
289
  "${PROJUPPER}_TEST_LIVE": "FALSE",
290
290
  "${PROJUPPER}_TEST_EXPLAIN": "FALSE",${apikeyEnvEntry}
291
291
  })
292
292
 
293
- idmapResolved := core.ToMapAny(env["${PROJUPPER}_TEST_${entity.name.toUpperCase().replace(/[^A-Z_]/g, '_')}_ENTID"])
293
+ idmapResolved := core.ToMapAny(env["${PROJUPPER}_TEST_${envToken(entity.name)}_ENTID"])
294
294
  if idmapResolved == nil {
295
295
  idmapResolved = core.ToMapAny(idmap)
296
296
  }
@@ -381,7 +381,7 @@ const generateCreate: OpGen = (ctx, step, index) => {
381
381
  if err != nil {
382
382
  t.Fatalf("create failed: %v", err)
383
383
  }
384
- ${datavar} = core.ToMapAny(${datavar}Result)
384
+ ${datavar} = core.ToMapAny(entityData(${datavar}Result))
385
385
  if ${datavar} == nil {
386
386
  t.Fatal("expected create result to be a map")
387
387
  }
@@ -546,7 +546,7 @@ const generateUpdate: OpGen = (ctx, step, index) => {
546
546
  if err != nil {
547
547
  t.Fatalf("update failed: %v", err)
548
548
  }
549
- ${resdatavar} := core.ToMapAny(${resdatavar}Result)
549
+ ${resdatavar} := core.ToMapAny(entityData(${resdatavar}Result))
550
550
  if ${resdatavar} == nil {
551
551
  t.Fatal("expected update result to be a map")
552
552
  }
@@ -621,7 +621,7 @@ const generateLoad: OpGen = (ctx, step, index) => {
621
621
  if err != nil {
622
622
  t.Fatalf("load failed: %v", err)
623
623
  }
624
- ${datavar}LoadResult := core.ToMapAny(${datavar}Loaded)
624
+ ${datavar}LoadResult := core.ToMapAny(entityData(${datavar}Loaded))
625
625
  if ${datavar}LoadResult == nil {
626
626
  t.Fatal("expected load result to be a map")
627
627
  }
@@ -8,7 +8,7 @@ import type {
8
8
  ModelEntity
9
9
  } from '@voxgig/apidef'
10
10
 
11
- import { cmp, each, Folder, File, Content } from '@voxgig/sdkgen'
11
+ import { cmp, each, Folder, File, Content, goModule } from '@voxgig/sdkgen'
12
12
 
13
13
 
14
14
  import { TestEntity } from './TestEntity_go'
@@ -22,7 +22,7 @@ const Test = cmp(function Test(props: any) {
22
22
 
23
23
  // Module name: concatenated lowercase
24
24
  // Go module path == repo path on GitHub (org from model.origin).
25
- const gomodule = `github.com/${model.origin || 'voxgig-sdk'}/${model.name}-sdk/go`
25
+ const gomodule = goModule(model, 'go')
26
26
 
27
27
  Folder({ name: 'test' }, () => {
28
28
 
@@ -14,6 +14,7 @@ type EntyClass struct {
14
14
  data map[string]any
15
15
  match map[string]any
16
16
  entctx *core.Context
17
+ deleted bool
17
18
  }
18
19
 
19
20
  func NewEntyClass(client *core.ProjectNameSDK, entopts map[string]any) *EntyClass {
@@ -49,6 +50,21 @@ func NewEntyClass(client *core.ProjectNameSDK, entopts map[string]any) *EntyClas
49
50
 
50
51
  func (e *EntyClass) GetName() string { return e.name }
51
52
 
53
+ // Deleted marks this instance as removed. `Remove` resolves to the entity
54
+ // like every other operation, and the instance KEEPS the data it held — a
55
+ // caller can still read what was deleted — but it is no longer a live
56
+ // record. See AGENTS.md "Entity operations return ENTITIES".
57
+ func (e *EntyClass) MarkDeleted() {
58
+ e.deleted = true
59
+ }
60
+
61
+
62
+ // Deleted reports whether a successful Remove has resolved on this instance.
63
+ func (e *EntyClass) Deleted() bool {
64
+ return e.deleted
65
+ }
66
+
67
+
52
68
  func (e *EntyClass) Make() core.Entity {
53
69
  opts := map[string]any{}
54
70
  for k, v := range e.entopts {
@@ -296,5 +312,30 @@ func (e *EntyClass) runOp(ctx *core.Context, postDone func()) (any, error) {
296
312
 
297
313
  postDone()
298
314
 
299
- return utility.Done(ctx)
315
+ out, doneErr := utility.Done(ctx)
316
+ if doneErr != nil {
317
+ return out, doneErr
318
+ }
319
+
320
+ // An operation resolves to the ENTITY, not the raw data. Entities are
321
+ // stateful: post_done has just absorbed resdata/resmatch into this
322
+ // instance, and the caller reaches the record through data(). Two
323
+ // structural exceptions: `list` resolves to the ARRAY of entity
324
+ // instances make_result built, and a failed op with throwing disabled
325
+ // hands back the error payload unchanged. `remove` additionally marks
326
+ // the entity deleted; it KEEPS its data, so a caller can still read
327
+ // what was removed. See AGENTS.md "Entity operations return ENTITIES".
328
+ opname := ""
329
+ if ctx.Op != nil {
330
+ opname = ctx.Op.Name
331
+ }
332
+
333
+ if ctx.Result != nil && ctx.Result.Ok && opname != "list" {
334
+ if opname == "remove" {
335
+ e.MarkDeleted()
336
+ }
337
+ return e, nil
338
+ }
339
+
340
+ return out, nil
300
341
  }
@@ -3,7 +3,7 @@ import * as Path from 'node:path'
3
3
 
4
4
  import {
5
5
  cmp, each, deriveEntityNames,
6
- File, Content, Fragment, Slot,
6
+ File, Content, Fragment, Slot, goModule, goVersion
7
7
  } from '@voxgig/sdkgen'
8
8
 
9
9
  import type {
@@ -50,8 +50,8 @@ const Main = cmp(function Main(props: any) {
50
50
  const { model } = props.ctx$
51
51
 
52
52
  const org = model.origin || 'voxgig-sdk'
53
- const sdkModule = `github.com/${org}/${model.name}-sdk/go`
54
- const cliModule = `github.com/${org}/${model.name}-sdk/go-cli`
53
+ const sdkModule = goModule(model, 'go')
54
+ const cliModule = goModule(model, 'go-cli')
55
55
 
56
56
  const entityMap: any = getModelPath(model, `main.${KIT}.entity`)
57
57
  // Derive each entity's PascalCase `Name` here rather than relying on another
@@ -369,7 +369,7 @@ this repo, or upstream at
369
369
  // (go 1.24.7) — keep in step with BORU_ENG_VERSION.
370
370
  File({ name: 'go.mod' }, () => Content(`module ${cliModule}
371
371
 
372
- go 1.24.7
372
+ go ${goVersion(model, 'go-cli', '1.24.7')}
373
373
 
374
374
  require ${sdkModule} v0.0.0
375
375
  require github.com/boru-lang/boru/eng/go ${BORU_ENG_VERSION}
@@ -3,7 +3,7 @@ import * as Path from 'node:path'
3
3
 
4
4
  import {
5
5
  cmp, each, deriveEntityNames,
6
- File, Content, Fragment, Slot,
6
+ File, Content, Fragment, Slot, goModule, goVersion
7
7
  } from '@voxgig/sdkgen'
8
8
 
9
9
  import type {
@@ -50,8 +50,8 @@ const Main = cmp(function Main(props: any) {
50
50
  const { model } = props.ctx$
51
51
 
52
52
  const org = model.origin || 'voxgig-sdk'
53
- const sdkModule = `github.com/${org}/${model.name}-sdk/go`
54
- const mcpModule = `github.com/${org}/${model.name}-sdk/go-mcp`
53
+ const sdkModule = goModule(model, 'go')
54
+ const mcpModule = goModule(model, 'go-mcp')
55
55
 
56
56
  const entityMap: any = getModelPath(model, `main.${KIT}.entity`)
57
57
  // Derive each entity's PascalCase `Name` here rather than relying on another
@@ -319,7 +319,7 @@ this repo, or upstream at
319
319
  // the public proxy. The MCP Go SDK requires go >= 1.25.
320
320
  File({ name: 'go.mod' }, () => Content(`module ${mcpModule}
321
321
 
322
- go 1.25.0
322
+ go ${goVersion(model, 'go-mcp', '1.25.0')}
323
323
 
324
324
  require ${sdkModule} v0.0.0
325
325
  require github.com/modelcontextprotocol/go-sdk ${MCP_GO_SDK_VERSION}
@@ -2,6 +2,7 @@ import {
2
2
  Content,
3
3
  File,
4
4
  cmp,
5
+ packageVersion,
5
6
  } from '@voxgig/sdkgen'
6
7
 
7
8
 
@@ -28,7 +29,7 @@ const Package = cmp(async function Package(props: any) {
28
29
  File({ name: pkgName(model) + '.cabal' }, () => {
29
30
  Content(`cabal-version: 2.4
30
31
  name: ${pkgName(model)}
31
- version: 0.0.1
32
+ version: ${packageVersion(model, target.name)}
32
33
  synopsis: ${model.const.Name} SDK for Haskell (generated by @voxgig/sdkgen)
33
34
  license: MIT
34
35
  build-type: Simple
@@ -33,11 +33,11 @@ function hsType(type: any): string {
33
33
 
34
34
 
35
35
  const OP_DESC: Record<string, { method: string, desc: string }> = {
36
- load: { method: 'eLoad ent match ctrl', desc: 'Load a single entity by match criteria.' },
37
- list: { method: 'eList ent match ctrl', desc: 'List entities, optionally matching the given criteria.' },
38
- create: { method: 'eCreate ent data ctrl', desc: 'Create a new entity with the given data.' },
39
- update: { method: 'eUpdate ent data ctrl', desc: 'Update an existing entity.' },
40
- remove: { method: 'eRemove ent match ctrl', desc: 'Remove the matching entity.' },
36
+ load: { method: 'eLoad ent match ctrl', desc: 'Load a single entity by match criteria. Resolves to the entity.' },
37
+ list: { method: 'eList ent match ctrl', desc: 'List entities, optionally matching the given criteria. Resolves to one entity per record.' },
38
+ create: { method: 'eCreate ent data ctrl', desc: 'Create a new entity with the given data. Resolves to the entity.' },
39
+ update: { method: 'eUpdate ent data ctrl', desc: 'Update an existing entity. Resolves to the entity.' },
40
+ remove: { method: 'eRemove ent match ctrl', desc: 'Remove the matching entity. Resolves to the entity, marked deleted.' },
41
41
  }
42
42
 
43
43
 
@@ -133,6 +133,8 @@ const ReadmeEntity = cmp(function ReadmeEntity(props: any) {
133
133
  match <- jo ${loadArg}
134
134
  ctrl <- emptyMap
135
135
  ${eFn} <- Sdk.eLoad ent match ctrl
136
+ -- The op resolves to the ENTITY; the record is inside it.
137
+ ${eFn}Data <- Sdk.eDataGet ${eFn}
136
138
  \`\`\`
137
139
 
138
140
  `)
@@ -145,7 +147,9 @@ const ReadmeEntity = cmp(function ReadmeEntity(props: any) {
145
147
  ent <- Sdk.${eFn} sdk VNoval
146
148
  match <- emptyMap
147
149
  ctrl <- emptyMap
150
+ -- One ENTITY per record.
148
151
  ${eFn}s <- Sdk.eList ent match ctrl
152
+ ${eFn}Datas <- mapM Sdk.eDataGet ${eFn}s
149
153
  \`\`\`
150
154
 
151
155
  `)
@@ -168,6 +172,7 @@ const ReadmeEntity = cmp(function ReadmeEntity(props: any) {
168
172
  Content(`]
169
173
  ctrl <- emptyMap
170
174
  ${eFn} <- Sdk.eCreate ent d ctrl
175
+ ${eFn}Data <- Sdk.eDataGet ${eFn}
171
176
  \`\`\`
172
177
 
173
178
  `)