@greenpandastudios/aug-cli 0.19.0 → 0.21.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 (628) hide show
  1. package/README.md +9 -6
  2. package/THIRD_PARTY_NOTICES.md +4 -0
  3. package/bin/aug.mjs +12 -2
  4. package/docs/about.md +27 -0
  5. package/docs/api/crypto.md +103 -69
  6. package/docs/api/io.md +35 -33
  7. package/docs/api/json.md +3 -3
  8. package/docs/api/memory.md +23 -19
  9. package/docs/api/time.md +10 -9
  10. package/docs/api/web.md +33 -38
  11. package/docs/assets/benchmarks/execution.svg +774 -637
  12. package/docs/assets/benchmarks/http.svg +278 -249
  13. package/docs/assets/benchmarks/improvements.svg +66 -66
  14. package/docs/assets/benchmarks/kernels-mobile.svg +1 -0
  15. package/docs/assets/benchmarks/kernels.svg +1 -0
  16. package/docs/assets/benchmarks/memory.svg +153 -153
  17. package/docs/benchmark-results.json +227089 -90363
  18. package/docs/compatibility.md +8 -8
  19. package/docs/contributing-benchmarks.md +68 -0
  20. package/docs/dev-containers.md +88 -0
  21. package/docs/dgx-consumers.json +122 -0
  22. package/docs/dgx-gyms.json +784 -0
  23. package/docs/dgx-kernels.json +1170 -0
  24. package/docs/dgx-performance.json +227849 -0
  25. package/docs/dgx-spark.md +64 -0
  26. package/docs/diagnostics.md +15 -5
  27. package/docs/docker.md +173 -12
  28. package/docs/editor.md +35 -0
  29. package/docs/example-projects.json +238 -24
  30. package/docs/examples/approved-design/counters.md +34 -126
  31. package/docs/examples/approved-design/dependencies/august/0.21.0/io/contracts.md +178 -0
  32. package/docs/examples/approved-design/domain/app.md +13 -77
  33. package/docs/examples/approved-design/domain/export.md +5 -19
  34. package/docs/examples/approved-design/domain/models.md +4 -23
  35. package/docs/examples/approved-design/domain/numbers.md +24 -114
  36. package/docs/examples/approved-design/index.md +16 -7
  37. package/docs/examples/approved-design/main.md +19 -96
  38. package/docs/examples/benchmark/index.md +6 -5
  39. package/docs/examples/benchmark/main.md +7 -35
  40. package/docs/examples/calls-benchmark/index.md +36 -0
  41. package/docs/examples/calls-benchmark/main.md +78 -0
  42. package/docs/examples/calls-benchmark/operations.md +60 -0
  43. package/docs/examples/cli-args/index.md +6 -5
  44. package/docs/examples/cli-args/main.md +6 -31
  45. package/docs/examples/collections/index.md +6 -5
  46. package/docs/examples/collections/main.md +7 -35
  47. package/docs/examples/collections-benchmark/index.md +6 -5
  48. package/docs/examples/collections-benchmark/main.md +7 -35
  49. package/docs/examples/cpu-benchmark/index.md +6 -5
  50. package/docs/examples/cpu-benchmark/main.md +5 -24
  51. package/docs/examples/developer-workflow/calculator.md +39 -186
  52. package/docs/examples/developer-workflow/dependencies/august/0.21.0/io/contracts.md +178 -0
  53. package/docs/examples/developer-workflow/index.md +16 -7
  54. package/docs/examples/developer-workflow/logging/console.md +10 -56
  55. package/docs/examples/developer-workflow/logging/export.md +4 -14
  56. package/docs/examples/developer-workflow/logging/logger.md +7 -43
  57. package/docs/examples/developer-workflow/main.md +17 -69
  58. package/docs/examples/drop/index.md +6 -5
  59. package/docs/examples/drop/main.md +7 -27
  60. package/docs/examples/drop/resource.md +7 -30
  61. package/docs/examples/errors/errors.md +7 -27
  62. package/docs/examples/errors/index.md +6 -5
  63. package/docs/examples/errors/main.md +7 -28
  64. package/docs/examples/errors-benchmark/index.md +36 -0
  65. package/docs/examples/errors-benchmark/main.md +92 -0
  66. package/docs/examples/errors-benchmark/operations.md +65 -0
  67. package/docs/examples/ffi/index.md +6 -5
  68. package/docs/examples/ffi/main.md +6 -20
  69. package/docs/examples/ffi/native.md +8 -34
  70. package/docs/examples/float-benchmark/index.md +35 -0
  71. package/docs/examples/float-benchmark/main.md +75 -0
  72. package/docs/examples/generic-di/dependencies/august/0.21.0/io/contracts.md +178 -0
  73. package/docs/examples/generic-di/index.md +6 -5
  74. package/docs/examples/generic-di/main.md +9 -39
  75. package/docs/examples/generic-di/types.md +23 -92
  76. package/docs/examples/generics/index.md +6 -5
  77. package/docs/examples/generics/main.md +10 -47
  78. package/docs/examples/generics/types.md +25 -100
  79. package/docs/examples/hello/app/export.md +4 -12
  80. package/docs/examples/hello/app/greeter.md +13 -91
  81. package/docs/examples/hello/dependencies/august/0.21.0/io/contracts.md +178 -0
  82. package/docs/examples/hello/index.md +17 -6
  83. package/docs/examples/hello/logging/console.md +10 -54
  84. package/docs/examples/hello/logging/export.md +4 -14
  85. package/docs/examples/hello/logging/logger.md +7 -45
  86. package/docs/examples/hello/main.md +9 -39
  87. package/docs/examples/http-benchmark/index.md +6 -5
  88. package/docs/examples/http-benchmark/main.md +6 -20
  89. package/docs/examples/http-benchmark/routes.md +9 -31
  90. package/docs/examples/index.md +63 -29
  91. package/docs/examples/interceptors/app.md +20 -139
  92. package/docs/examples/interceptors/dependencies/august/0.21.0/io/contracts.md +178 -0
  93. package/docs/examples/interceptors/index.md +6 -5
  94. package/docs/examples/interceptors/interceptors.md +24 -148
  95. package/docs/examples/interceptors/logging.md +13 -76
  96. package/docs/examples/interceptors/main.md +10 -65
  97. package/docs/examples/json-benchmark/data.md +4 -20
  98. package/docs/examples/json-benchmark/dependencies/packages/@git/url_2d3c37c690c0fa115be1/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.md +67 -0
  99. package/docs/examples/json-benchmark/index.md +7 -5
  100. package/docs/examples/json-benchmark/main-yaml.md +20 -0
  101. package/docs/examples/json-benchmark/main.md +10 -49
  102. package/docs/examples/list-benchmark/index.md +35 -0
  103. package/docs/examples/list-benchmark/main.md +78 -0
  104. package/docs/examples/map-churn-benchmark/index.md +35 -0
  105. package/docs/examples/map-churn-benchmark/main.md +106 -0
  106. package/docs/examples/native-blake3/dependencies/packages/@greenpandastudios/aug-blake3/0.1.3/api.md +104 -0
  107. package/docs/examples/native-blake3/dependencies/packages/@greenpandastudios/aug-blake3/0.1.3/contracts.md +54 -0
  108. package/docs/examples/native-blake3/dependencies/packages/@greenpandastudios/aug-blake3/0.1.3/native.abi-json.md +48 -0
  109. package/docs/examples/native-blake3/hashing.md +93 -0
  110. package/docs/examples/native-blake3/index.md +38 -0
  111. package/docs/examples/native-blake3/main.md +73 -0
  112. package/docs/examples/native-pytorch/dependencies/packages/@greenpandastudios/aug-pytorch/0.1.4/api.md +406 -0
  113. package/docs/examples/native-pytorch/dependencies/packages/@greenpandastudios/aug-pytorch/0.1.4/bindings.md +51 -0
  114. package/docs/examples/native-pytorch/dependencies/packages/@greenpandastudios/aug-pytorch/0.1.4/contracts.md +63 -0
  115. package/docs/examples/native-pytorch/dependencies/packages/@greenpandastudios/aug-pytorch/0.1.4/native.abi-json.md +161 -0
  116. package/docs/examples/native-pytorch/index.md +38 -0
  117. package/docs/examples/native-pytorch/main.md +73 -0
  118. package/docs/examples/native-pytorch/tensors.md +123 -0
  119. package/docs/examples/native-sqlite/database.md +116 -0
  120. package/docs/examples/native-sqlite/dependencies/packages/@greenpandastudios/aug-sqlite/0.1.3/api.md +284 -0
  121. package/docs/examples/native-sqlite/dependencies/packages/@greenpandastudios/aug-sqlite/0.1.3/bindings.md +51 -0
  122. package/docs/examples/native-sqlite/dependencies/packages/@greenpandastudios/aug-sqlite/0.1.3/contracts.md +75 -0
  123. package/docs/examples/native-sqlite/dependencies/packages/@greenpandastudios/aug-sqlite/0.1.3/native.abi-json.md +119 -0
  124. package/docs/examples/native-sqlite/index.md +38 -0
  125. package/docs/examples/native-sqlite/main.md +73 -0
  126. package/docs/examples/native-zlib/compression.md +99 -0
  127. package/docs/examples/native-zlib/dependencies/packages/@greenpandastudios/aug-zlib/0.1.3/api.md +153 -0
  128. package/docs/examples/native-zlib/dependencies/packages/@greenpandastudios/aug-zlib/0.1.3/contracts.md +54 -0
  129. package/docs/examples/native-zlib/dependencies/packages/@greenpandastudios/aug-zlib/0.1.3/native.abi-json.md +76 -0
  130. package/docs/examples/native-zlib/index.md +38 -0
  131. package/docs/examples/native-zlib/main.md +78 -0
  132. package/docs/examples/new-syntax/console.md +10 -52
  133. package/docs/examples/new-syntax/dependencies/august/0.21.0/io/contracts.md +178 -0
  134. package/docs/examples/new-syntax/greeter.md +13 -71
  135. package/docs/examples/new-syntax/index.md +6 -5
  136. package/docs/examples/new-syntax/logger.md +7 -43
  137. package/docs/examples/new-syntax/main.md +10 -53
  138. package/docs/examples/new-syntax/math.md +6 -24
  139. package/docs/examples/oidc-login/client/contracts.md +10 -61
  140. package/docs/examples/oidc-login/client/endpoints.md +32 -154
  141. package/docs/examples/oidc-login/client/export.md +5 -23
  142. package/docs/examples/oidc-login/client/login.md +234 -344
  143. package/docs/examples/oidc-login/client/logout.md +38 -143
  144. package/docs/examples/oidc-login/client/protocol.md +183 -304
  145. package/docs/examples/oidc-login/client/session.md +41 -149
  146. package/docs/examples/oidc-login/client/views.md +13 -58
  147. package/docs/examples/oidc-login/common/export.md +6 -26
  148. package/docs/examples/oidc-login/common/headers.md +42 -72
  149. package/docs/examples/oidc-login/common/keys.md +40 -164
  150. package/docs/examples/oidc-login/common/settings.md +24 -40
  151. package/docs/examples/oidc-login/common/views.md +7 -28
  152. package/docs/examples/oidc-login/dependencies/packages/@git/url_0eb7c89453c87681ed15/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/store.md +205 -0
  153. package/docs/examples/oidc-login/dependencies/packages/@git/url_2d3c37c690c0fa115be1/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.md +67 -0
  154. package/docs/examples/oidc-login/dependencies/packages/@git/url_897efafd565158fc4908/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.md +267 -0
  155. package/docs/examples/oidc-login/dependencies/packages/@git/url_9ef654c66d34ab8f5527/0.0.0-git.b14a0f9aa41f1ce58bd51133bcdc424033e40d40/contracts.md +415 -0
  156. package/docs/examples/oidc-login/dependencies/packages/@git/url_9ef654c66d34ab8f5527/0.0.0-git.b14a0f9aa41f1ce58bd51133bcdc424033e40d40/jose.md +271 -0
  157. package/docs/examples/oidc-login/dependencies/packages/@git/url_c092cd151499c4e1d8a1/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.md +89 -0
  158. package/docs/examples/oidc-login/index.md +8 -7
  159. package/docs/examples/oidc-login/main-yaml.md +7 -0
  160. package/docs/examples/oidc-login/main.md +26 -153
  161. package/docs/examples/oidc-login/provider/authorization.md +232 -275
  162. package/docs/examples/oidc-login/provider/contracts.md +24 -146
  163. package/docs/examples/oidc-login/provider/credentials.md +24 -57
  164. package/docs/examples/oidc-login/provider/discovery.md +48 -122
  165. package/docs/examples/oidc-login/provider/export.md +11 -37
  166. package/docs/examples/oidc-login/provider/token.md +159 -237
  167. package/docs/examples/oidc-login/provider/userinfo.md +47 -102
  168. package/docs/examples/oidc-login/provider/views.md +13 -53
  169. package/docs/examples/ownership/counter.md +17 -63
  170. package/docs/examples/ownership/index.md +6 -5
  171. package/docs/examples/ownership/main.md +7 -30
  172. package/docs/examples/ownership-transfer/dependencies/august/0.21.0/io/contracts.md +178 -0
  173. package/docs/examples/ownership-transfer/index.md +6 -5
  174. package/docs/examples/ownership-transfer/main.md +10 -52
  175. package/docs/examples/ownership-transfer/resource.md +15 -67
  176. package/docs/examples/packages-app/dependencies/packages/@example/aug-math/0.1.0/arithmetic.md +12 -50
  177. package/docs/examples/packages-app/index.md +7 -6
  178. package/docs/examples/packages-app/main.md +7 -25
  179. package/docs/examples/packages-math/aug-package-json.md +1 -1
  180. package/docs/examples/packages-math/index.md +7 -6
  181. package/docs/examples/packages-math/src/arithmetic.md +12 -50
  182. package/docs/examples/packages-math/src/export.md +4 -12
  183. package/docs/examples/records-benchmark/data.md +55 -0
  184. package/docs/examples/records-benchmark/index.md +36 -0
  185. package/docs/examples/records-benchmark/main.md +85 -0
  186. package/docs/examples/startup-benchmark/index.md +6 -5
  187. package/docs/examples/startup-benchmark/main.md +5 -17
  188. package/docs/examples/strings-benchmark/index.md +35 -0
  189. package/docs/examples/strings-benchmark/main.md +76 -0
  190. package/docs/examples/tasks-benchmark/index.md +36 -0
  191. package/docs/examples/tasks-benchmark/main.md +89 -0
  192. package/docs/examples/tasks-benchmark/operations.md +58 -0
  193. package/docs/examples/visibility/counter.md +19 -67
  194. package/docs/examples/visibility/index.md +6 -5
  195. package/docs/examples/visibility/main.md +7 -31
  196. package/docs/examples/weather-api/forecasts.md +168 -0
  197. package/docs/examples/weather-api/index.md +42 -0
  198. package/docs/examples/weather-api/main-yaml.md +21 -0
  199. package/docs/examples/weather-api/main.md +65 -0
  200. package/docs/examples.json +10 -0
  201. package/docs/getting-started.md +105 -2
  202. package/docs/grammar.md +7 -5
  203. package/docs/guides/change-a-module.md +64 -0
  204. package/docs/guides/index.md +27 -0
  205. package/docs/gym-results.json +784 -0
  206. package/docs/implementation-map.md +6 -0
  207. package/docs/index.md +51 -29
  208. package/docs/kernel-results.json +1170 -0
  209. package/docs/language-conformance.md +7 -1
  210. package/docs/language-constructs.md +30 -22
  211. package/docs/language-design-audit.md +1 -1
  212. package/docs/learn/data-and-errors.md +77 -0
  213. package/docs/learn/index.md +30 -0
  214. package/docs/learn/modules-and-dependencies.md +73 -0
  215. package/docs/learn/state-and-tests.md +71 -0
  216. package/docs/learn/values-and-functions.md +62 -0
  217. package/docs/lesson-failures.json +8 -0
  218. package/docs/maintaining-docs.md +16 -4
  219. package/docs/native-implementation.md +276 -0
  220. package/docs/native-interop-llvm-plan.md +342 -0
  221. package/docs/native-package-examples.md +684 -0
  222. package/docs/native-packages.md +179 -0
  223. package/docs/packages.md +72 -126
  224. package/docs/performance.md +61 -68
  225. package/docs/production-readiness.md +16 -5
  226. package/docs/public/downloads/approved-design.zip +0 -0
  227. package/docs/public/downloads/benchmark.zip +0 -0
  228. package/docs/public/downloads/calls-benchmark.zip +0 -0
  229. package/docs/public/downloads/cli-args.zip +0 -0
  230. package/docs/public/downloads/collections-benchmark.zip +0 -0
  231. package/docs/public/downloads/collections.zip +0 -0
  232. package/docs/public/downloads/cpu-benchmark.zip +0 -0
  233. package/docs/public/downloads/developer-workflow.zip +0 -0
  234. package/docs/public/downloads/drop.zip +0 -0
  235. package/docs/public/downloads/errors-benchmark.zip +0 -0
  236. package/docs/public/downloads/errors.zip +0 -0
  237. package/docs/public/downloads/ffi.zip +0 -0
  238. package/docs/public/downloads/float-benchmark.zip +0 -0
  239. package/docs/public/downloads/generic-di.zip +0 -0
  240. package/docs/public/downloads/generics.zip +0 -0
  241. package/docs/public/downloads/hello.zip +0 -0
  242. package/docs/public/downloads/http-benchmark.zip +0 -0
  243. package/docs/public/downloads/interceptors.zip +0 -0
  244. package/docs/public/downloads/json-benchmark.zip +0 -0
  245. package/docs/public/downloads/list-benchmark.zip +0 -0
  246. package/docs/public/downloads/map-churn-benchmark.zip +0 -0
  247. package/docs/public/downloads/native-blake3.zip +0 -0
  248. package/docs/public/downloads/native-pytorch.zip +0 -0
  249. package/docs/public/downloads/native-sqlite.zip +0 -0
  250. package/docs/public/downloads/native-zlib.zip +0 -0
  251. package/docs/public/downloads/new-syntax.zip +0 -0
  252. package/docs/public/downloads/oidc-login.zip +0 -0
  253. package/docs/public/downloads/ownership-transfer.zip +0 -0
  254. package/docs/public/downloads/ownership.zip +0 -0
  255. package/docs/public/downloads/packages-app.zip +0 -0
  256. package/docs/public/downloads/packages-math.zip +0 -0
  257. package/docs/public/downloads/records-benchmark.zip +0 -0
  258. package/docs/public/downloads/startup-benchmark.zip +0 -0
  259. package/docs/public/downloads/strings-benchmark.zip +0 -0
  260. package/docs/public/downloads/tasks-benchmark.zip +0 -0
  261. package/docs/public/downloads/visibility.zip +0 -0
  262. package/docs/public/downloads/weather-api.zip +0 -0
  263. package/docs/qualification-results.md +66 -0
  264. package/docs/reference.md +47 -17
  265. package/docs/releasing.md +105 -16
  266. package/docs/research/code-to-natural-language.md +108 -0
  267. package/docs/research/ecosystem-workflow.md +41 -0
  268. package/docs/research/libtorch-native-qualification.md +115 -0
  269. package/docs/research/native-interop-llvm.md +197 -0
  270. package/docs/research/qualification-methods.md +15 -0
  271. package/docs/research/wiki-editorial-design.md +71 -0
  272. package/docs/roadmap.md +2 -1
  273. package/docs/safety-gyms.md +41 -0
  274. package/docs/specifications.md +27 -11
  275. package/docs/testing.md +19 -5
  276. package/docs/tooling.md +36 -22
  277. package/docs/weather-api.md +65 -0
  278. package/docs/web-library-gaps.md +1 -1
  279. package/docs/web.md +54 -18
  280. package/docs/writing-docs.md +49 -0
  281. package/examples/{hello/.aug-spec/august/0.19.0 → approved-design/.aug-spec/august/0.21.0}/io/contracts.aug +4 -3
  282. package/examples/approved-design/.aug-spec/august/0.21.0/io/contracts.aug.md +82 -0
  283. package/examples/approved-design/.aug-spec/manifest.json +3 -3
  284. package/examples/approved-design/counters.aug +5 -4
  285. package/examples/approved-design/counters.aug.md +25 -132
  286. package/examples/approved-design/domain/app.aug +2 -1
  287. package/examples/approved-design/domain/app.aug.md +10 -80
  288. package/examples/approved-design/domain/export.aug +1 -0
  289. package/examples/approved-design/domain/export.aug.md +4 -20
  290. package/examples/approved-design/domain/models.aug +1 -0
  291. package/examples/approved-design/domain/models.aug.md +3 -25
  292. package/examples/approved-design/domain/numbers.aug +3 -2
  293. package/examples/approved-design/domain/numbers.aug.md +19 -116
  294. package/examples/approved-design/main.aug +1 -0
  295. package/examples/approved-design/main.aug.md +12 -95
  296. package/examples/benchmark/.aug-spec/manifest.json +1 -1
  297. package/examples/benchmark/main.aug +1 -0
  298. package/examples/benchmark/main.aug.md +6 -36
  299. package/examples/cli-args/.aug-spec/manifest.json +1 -1
  300. package/examples/cli-args/main.aug +1 -0
  301. package/examples/cli-args/main.aug.md +5 -32
  302. package/examples/collections/.aug-spec/manifest.json +1 -1
  303. package/examples/collections/main.aug +1 -0
  304. package/examples/collections/main.aug.md +6 -36
  305. package/examples/{generic-di/.aug-spec/august/0.19.0 → developer-workflow/.aug-spec/august/0.21.0}/io/contracts.aug +4 -3
  306. package/examples/developer-workflow/.aug-spec/august/0.21.0/io/contracts.aug.md +82 -0
  307. package/examples/developer-workflow/.aug-spec/manifest.json +3 -3
  308. package/examples/developer-workflow/calculator.aug +3 -2
  309. package/examples/developer-workflow/calculator.aug.md +28 -189
  310. package/examples/developer-workflow/logging/console.aug +2 -1
  311. package/examples/developer-workflow/logging/console.aug.md +7 -57
  312. package/examples/developer-workflow/logging/export.aug +1 -0
  313. package/examples/developer-workflow/logging/export.aug.md +3 -15
  314. package/examples/developer-workflow/logging/logger.aug +1 -0
  315. package/examples/developer-workflow/logging/logger.aug.md +6 -46
  316. package/examples/developer-workflow/main.aug +1 -0
  317. package/examples/developer-workflow/main.aug.md +10 -68
  318. package/examples/drop/.aug-spec/manifest.json +1 -1
  319. package/examples/drop/main.aug +1 -0
  320. package/examples/drop/main.aug.md +6 -28
  321. package/examples/drop/resource.aug +1 -0
  322. package/examples/drop/resource.aug.md +6 -34
  323. package/examples/errors/.aug-spec/manifest.json +1 -1
  324. package/examples/errors/errors.aug +2 -1
  325. package/examples/errors/errors.aug.md +4 -27
  326. package/examples/errors/main.aug +1 -0
  327. package/examples/errors/main.aug.md +6 -29
  328. package/examples/ffi/.aug-spec/manifest.json +1 -1
  329. package/examples/ffi/main.aug +1 -0
  330. package/examples/ffi/main.aug.md +5 -21
  331. package/examples/ffi/native.aug +2 -1
  332. package/examples/ffi/native.aug.md +5 -35
  333. package/examples/{approved-design/.aug-spec/august/0.19.0 → generic-di/.aug-spec/august/0.21.0}/io/contracts.aug +4 -3
  334. package/examples/generic-di/.aug-spec/august/0.21.0/io/contracts.aug.md +82 -0
  335. package/examples/generic-di/.aug-spec/manifest.json +3 -3
  336. package/examples/generic-di/main.aug +1 -0
  337. package/examples/generic-di/main.aug.md +8 -40
  338. package/examples/generic-di/types.aug +3 -2
  339. package/examples/generic-di/types.aug.md +18 -97
  340. package/examples/generics/.aug-spec/manifest.json +1 -1
  341. package/examples/generics/main.aug +1 -0
  342. package/examples/generics/main.aug.md +9 -48
  343. package/examples/generics/types.aug +4 -3
  344. package/examples/generics/types.aug.md +18 -104
  345. package/examples/{developer-workflow/.aug-spec/august/0.19.0 → hello/.aug-spec/august/0.21.0}/io/contracts.aug +4 -3
  346. package/examples/hello/.aug-spec/august/0.21.0/io/contracts.aug.md +82 -0
  347. package/examples/hello/.aug-spec/manifest.json +3 -3
  348. package/examples/hello/app/export.aug +1 -0
  349. package/examples/hello/app/export.aug.md +3 -13
  350. package/examples/hello/app/greeter.aug +2 -1
  351. package/examples/hello/app/greeter.aug.md +10 -94
  352. package/examples/hello/logging/console.aug +2 -1
  353. package/examples/hello/logging/console.aug.md +7 -55
  354. package/examples/hello/logging/export.aug +1 -0
  355. package/examples/hello/logging/export.aug.md +3 -15
  356. package/examples/hello/logging/logger.aug +1 -0
  357. package/examples/hello/logging/logger.aug.md +6 -48
  358. package/examples/hello/main.aug +1 -0
  359. package/examples/hello/main.aug.md +8 -40
  360. package/examples/interceptors/.aug-spec/august/0.21.0/io/contracts.aug +37 -0
  361. package/examples/interceptors/.aug-spec/august/0.21.0/io/contracts.aug.md +82 -0
  362. package/examples/interceptors/.aug-spec/manifest.json +3 -3
  363. package/examples/interceptors/app.aug +3 -2
  364. package/examples/interceptors/app.aug.md +15 -141
  365. package/examples/interceptors/interceptors.aug +3 -2
  366. package/examples/interceptors/interceptors.aug.md +19 -152
  367. package/examples/interceptors/logging.aug +2 -1
  368. package/examples/interceptors/logging.aug.md +10 -79
  369. package/examples/interceptors/main.aug +1 -0
  370. package/examples/interceptors/main.aug.md +9 -66
  371. package/examples/native-blake3/.aug-spec/manifest.json +16 -0
  372. package/examples/native-blake3/.aug-spec/packages/@greenpandastudios/aug-blake3/0.1.1/native.abi.json +29 -0
  373. package/examples/native-blake3/.aug-spec/packages/@greenpandastudios/aug-blake3/0.1.3/api.aug +14 -0
  374. package/examples/native-blake3/.aug-spec/packages/@greenpandastudios/aug-blake3/0.1.3/api.aug.md +34 -0
  375. package/examples/native-blake3/.aug-spec/packages/@greenpandastudios/aug-blake3/0.1.3/contracts.aug +4 -0
  376. package/examples/native-blake3/.aug-spec/packages/@greenpandastudios/aug-blake3/0.1.3/contracts.aug.md +8 -0
  377. package/examples/native-blake3/.aug-spec/packages/@greenpandastudios/aug-blake3/0.1.3/native.abi.json +29 -0
  378. package/examples/native-blake3/AGENTS.md +5 -0
  379. package/examples/native-blake3/aug.lock.json +253 -0
  380. package/examples/native-blake3/hashing.aug +11 -0
  381. package/examples/native-blake3/hashing.aug.md +25 -0
  382. package/examples/native-blake3/main.aug +8 -0
  383. package/examples/native-blake3/main.aug.md +13 -0
  384. package/examples/native-pytorch/.aug-spec/manifest.json +18 -0
  385. package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.1/native.abi.json +142 -0
  386. package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.3/native.abi.json +142 -0
  387. package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.4/api.aug +101 -0
  388. package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.4/api.aug.md +160 -0
  389. package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.4/bindings.aug +3 -0
  390. package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.4/bindings.aug.md +8 -0
  391. package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.4/contracts.aug +6 -0
  392. package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.4/contracts.aug.md +13 -0
  393. package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.4/native.abi.json +142 -0
  394. package/examples/native-pytorch/AGENTS.md +5 -0
  395. package/examples/native-pytorch/aug.lock.json +309 -0
  396. package/examples/native-pytorch/main.aug +8 -0
  397. package/examples/native-pytorch/main.aug.md +13 -0
  398. package/examples/native-pytorch/tensors.aug +23 -0
  399. package/examples/native-pytorch/tensors.aug.md +35 -0
  400. package/examples/native-sqlite/.aug-spec/manifest.json +18 -0
  401. package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.2/native.abi.json +100 -0
  402. package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.3/api.aug +48 -0
  403. package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.3/api.aug.md +91 -0
  404. package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.3/bindings.aug +3 -0
  405. package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.3/bindings.aug.md +8 -0
  406. package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.3/contracts.aug +8 -0
  407. package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.3/contracts.aug.md +22 -0
  408. package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.3/native.abi.json +100 -0
  409. package/examples/native-sqlite/AGENTS.md +5 -0
  410. package/examples/native-sqlite/aug.lock.json +236 -0
  411. package/examples/native-sqlite/database.aug +15 -0
  412. package/examples/native-sqlite/database.aug.md +27 -0
  413. package/examples/native-sqlite/main.aug +8 -0
  414. package/examples/native-sqlite/main.aug.md +13 -0
  415. package/examples/native-zlib/.aug-spec/manifest.json +16 -0
  416. package/examples/native-zlib/.aug-spec/packages/@greenpandastudios/aug-zlib/0.1.1/native.abi.json +57 -0
  417. package/examples/native-zlib/.aug-spec/packages/@greenpandastudios/aug-zlib/0.1.3/api.aug +29 -0
  418. package/examples/native-zlib/.aug-spec/packages/@greenpandastudios/aug-zlib/0.1.3/api.aug.md +54 -0
  419. package/examples/native-zlib/.aug-spec/packages/@greenpandastudios/aug-zlib/0.1.3/contracts.aug +4 -0
  420. package/examples/native-zlib/.aug-spec/packages/@greenpandastudios/aug-zlib/0.1.3/contracts.aug.md +8 -0
  421. package/examples/native-zlib/.aug-spec/packages/@greenpandastudios/aug-zlib/0.1.3/native.abi.json +57 -0
  422. package/examples/native-zlib/AGENTS.md +5 -0
  423. package/examples/native-zlib/aug.lock.json +236 -0
  424. package/examples/native-zlib/compression.aug +15 -0
  425. package/examples/native-zlib/compression.aug.md +27 -0
  426. package/examples/native-zlib/main.aug +10 -0
  427. package/examples/native-zlib/main.aug.md +13 -0
  428. package/examples/new-syntax/.aug-spec/august/0.21.0/io/contracts.aug +37 -0
  429. package/examples/new-syntax/.aug-spec/august/0.21.0/io/contracts.aug.md +82 -0
  430. package/examples/new-syntax/.aug-spec/manifest.json +3 -3
  431. package/examples/new-syntax/console.aug +2 -1
  432. package/examples/new-syntax/console.aug.md +7 -53
  433. package/examples/new-syntax/greeter.aug +2 -1
  434. package/examples/new-syntax/greeter.aug.md +10 -74
  435. package/examples/new-syntax/logger.aug +1 -0
  436. package/examples/new-syntax/logger.aug.md +6 -46
  437. package/examples/new-syntax/main.aug +1 -0
  438. package/examples/new-syntax/main.aug.md +9 -54
  439. package/examples/new-syntax/math.aug +2 -1
  440. package/examples/new-syntax/math.aug.md +3 -24
  441. package/examples/oidc-login/.aug-spec/manifest.json +13 -13
  442. package/examples/oidc-login/.aug-spec/packages/@git/url_0eb7c89453c87681ed15/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/store.aug.md +71 -0
  443. package/examples/oidc-login/.aug-spec/packages/@git/url_2d3c37c690c0fa115be1/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.aug.md +17 -0
  444. package/examples/oidc-login/.aug-spec/packages/@git/url_897efafd565158fc4908/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.aug.md +125 -0
  445. package/examples/oidc-login/.aug-spec/{august/0.19.0/crypto → packages/@git/url_9ef654c66d34ab8f5527/0.0.0-git.b14a0f9aa41f1ce58bd51133bcdc424033e40d40}/contracts.aug +12 -11
  446. package/examples/oidc-login/.aug-spec/packages/@git/url_9ef654c66d34ab8f5527/0.0.0-git.b14a0f9aa41f1ce58bd51133bcdc424033e40d40/contracts.aug.md +244 -0
  447. package/examples/oidc-login/.aug-spec/{august/0.19.0/crypto → packages/@git/url_9ef654c66d34ab8f5527/0.0.0-git.b14a0f9aa41f1ce58bd51133bcdc424033e40d40}/jose.aug +6 -5
  448. package/examples/oidc-login/.aug-spec/packages/@git/url_9ef654c66d34ab8f5527/0.0.0-git.b14a0f9aa41f1ce58bd51133bcdc424033e40d40/jose.aug.md +71 -0
  449. package/examples/oidc-login/.aug-spec/packages/@git/url_c092cd151499c4e1d8a1/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.aug.md +30 -0
  450. package/examples/oidc-login/aug.lock.json +100 -0
  451. package/examples/oidc-login/client/contracts.aug +1 -0
  452. package/examples/oidc-login/client/contracts.aug.md +9 -66
  453. package/examples/oidc-login/client/endpoints.aug +6 -5
  454. package/examples/oidc-login/client/endpoints.aug.md +13 -145
  455. package/examples/oidc-login/client/export.aug +1 -0
  456. package/examples/oidc-login/client/export.aug.md +4 -24
  457. package/examples/oidc-login/client/login.aug +7 -6
  458. package/examples/oidc-login/client/login.aug.md +25 -303
  459. package/examples/oidc-login/client/logout.aug +5 -4
  460. package/examples/oidc-login/client/logout.aug.md +13 -135
  461. package/examples/oidc-login/client/protocol.aug +7 -6
  462. package/examples/oidc-login/client/protocol.aug.md +36 -283
  463. package/examples/oidc-login/client/session.aug +5 -4
  464. package/examples/oidc-login/client/session.aug.md +12 -139
  465. package/examples/oidc-login/client/views.aug +3 -2
  466. package/examples/oidc-login/client/views.aug.md +8 -57
  467. package/examples/oidc-login/common/export.aug +1 -0
  468. package/examples/oidc-login/common/export.aug.md +5 -27
  469. package/examples/oidc-login/common/headers.aug +4 -3
  470. package/examples/oidc-login/common/headers.aug.md +9 -67
  471. package/examples/oidc-login/common/keys.aug +6 -5
  472. package/examples/oidc-login/common/keys.aug.md +29 -165
  473. package/examples/oidc-login/common/settings.aug +2 -1
  474. package/examples/oidc-login/common/settings.aug.md +5 -39
  475. package/examples/oidc-login/common/views.aug +2 -1
  476. package/examples/oidc-login/common/views.aug.md +4 -28
  477. package/examples/oidc-login/main.aug +6 -16
  478. package/examples/oidc-login/main.aug.md +17 -146
  479. package/examples/oidc-login/main.yaml +7 -0
  480. package/examples/oidc-login/provider/authorization.aug +7 -6
  481. package/examples/oidc-login/provider/authorization.aug.md +23 -238
  482. package/examples/oidc-login/provider/contracts.aug +1 -0
  483. package/examples/oidc-login/provider/contracts.aug.md +23 -158
  484. package/examples/oidc-login/provider/credentials.aug +3 -2
  485. package/examples/oidc-login/provider/credentials.aug.md +9 -53
  486. package/examples/oidc-login/provider/discovery.aug +4 -3
  487. package/examples/oidc-login/provider/discovery.aug.md +11 -118
  488. package/examples/oidc-login/provider/export.aug +1 -0
  489. package/examples/oidc-login/provider/export.aug.md +6 -34
  490. package/examples/oidc-login/provider/token.aug +6 -5
  491. package/examples/oidc-login/provider/token.aug.md +16 -204
  492. package/examples/oidc-login/provider/userinfo.aug +4 -3
  493. package/examples/oidc-login/provider/userinfo.aug.md +10 -92
  494. package/examples/oidc-login/provider/views.aug +3 -2
  495. package/examples/oidc-login/provider/views.aug.md +8 -52
  496. package/examples/ownership/.aug-spec/manifest.json +1 -1
  497. package/examples/ownership/counter.aug +3 -2
  498. package/examples/ownership/counter.aug.md +12 -66
  499. package/examples/ownership/main.aug +1 -0
  500. package/examples/ownership/main.aug.md +6 -31
  501. package/examples/ownership-transfer/.aug-spec/august/0.21.0/io/contracts.aug +37 -0
  502. package/examples/ownership-transfer/.aug-spec/august/0.21.0/io/contracts.aug.md +82 -0
  503. package/examples/ownership-transfer/.aug-spec/manifest.json +3 -3
  504. package/examples/ownership-transfer/main.aug +1 -0
  505. package/examples/ownership-transfer/main.aug.md +9 -53
  506. package/examples/ownership-transfer/resource.aug +2 -1
  507. package/examples/ownership-transfer/resource.aug.md +12 -71
  508. package/examples/packages/app/.aug-spec/manifest.json +1 -1
  509. package/examples/packages/app/.aug-spec/packages/@example/aug-math/0.1.0/arithmetic.aug +2 -1
  510. package/examples/packages/app/.aug-spec/packages/@example/aug-math/0.1.0/arithmetic.aug.md +9 -51
  511. package/examples/packages/app/main.aug +1 -0
  512. package/examples/packages/app/main.aug.md +6 -26
  513. package/examples/packages/math/.aug-spec/manifest.json +1 -1
  514. package/examples/packages/math/aug-package.json +1 -1
  515. package/examples/packages/math/src/arithmetic.aug +2 -1
  516. package/examples/packages/math/src/arithmetic.aug.md +9 -51
  517. package/examples/packages/math/src/export.aug +1 -0
  518. package/examples/packages/math/src/export.aug.md +3 -13
  519. package/examples/visibility/.aug-spec/manifest.json +1 -1
  520. package/examples/visibility/counter.aug +4 -3
  521. package/examples/visibility/counter.aug.md +12 -68
  522. package/examples/visibility/main.aug +1 -0
  523. package/examples/visibility/main.aug.md +6 -32
  524. package/examples/weather-api/.aug-spec/manifest.json +8 -0
  525. package/examples/weather-api/AGENTS.md +17 -0
  526. package/examples/weather-api/README.md +19 -0
  527. package/examples/weather-api/forecasts.aug +47 -0
  528. package/examples/weather-api/forecasts.aug.md +32 -0
  529. package/examples/weather-api/main.aug +4 -0
  530. package/examples/weather-api/main.aug.md +15 -0
  531. package/examples/weather-api/main.yaml +5 -0
  532. package/examples/weather-api/weather.http +5 -0
  533. package/native/compiler-packs.json +43 -0
  534. package/package.json +4 -4
  535. package/runtime/aug_http.c +48 -21
  536. package/runtime/aug_http_ir.c +30 -0
  537. package/runtime/aug_http_ir.h +18 -0
  538. package/runtime/aug_ir.c +209 -0
  539. package/runtime/aug_ir.h +89 -0
  540. package/runtime/aug_json.c +6 -1
  541. package/runtime/aug_runtime.c +82 -16
  542. package/runtime/aug_runtime.h +16 -2
  543. package/runtime/aug_tasks.c +38 -7
  544. package/runtime/aug_values.c +12 -6
  545. package/scripts/bootstrap-native.mjs +184 -106
  546. package/scripts/native-setup.mjs +98 -0
  547. package/scripts/native-toolchain.mjs +28 -0
  548. package/src/ast.js +1 -1
  549. package/src/builtins.js +1 -1
  550. package/src/checker.js +369 -100
  551. package/src/cli.js +198 -26
  552. package/src/codegen.js +32 -7
  553. package/src/compiler-packs.js +66 -0
  554. package/src/config.js +3 -3
  555. package/src/contracts.js +10 -0
  556. package/src/editor.js +86 -22
  557. package/src/fixes.js +90 -2
  558. package/src/formatter.js +23 -10
  559. package/src/git-http.js +137 -0
  560. package/src/git-packages.js +118 -0
  561. package/src/help.js +33 -24
  562. package/src/http-contracts.js +14 -0
  563. package/src/http-policies.js +5 -5
  564. package/src/ir-types.js +5 -0
  565. package/src/ir-verify.js +277 -0
  566. package/src/ir.js +962 -0
  567. package/src/libraries.js +1 -1
  568. package/src/llvm-debug.js +101 -0
  569. package/src/llvm-native.js +152 -0
  570. package/src/llvm-platform.js +20 -0
  571. package/src/llvm.js +781 -0
  572. package/src/lsp.js +14 -5
  573. package/src/native-artifacts.js +207 -0
  574. package/src/native-bindings.js +189 -0
  575. package/src/native-contracts.js +295 -0
  576. package/src/native-declarations.js +68 -0
  577. package/src/native-facts.js +63 -0
  578. package/src/native.js +19 -13
  579. package/src/navigation.js +4 -2
  580. package/src/openapi.js +5 -4
  581. package/src/package-locking.js +88 -0
  582. package/src/package-manager.js +267 -68
  583. package/src/parser.js +32 -6
  584. package/src/policies.js +3 -3
  585. package/src/project-init.js +78 -4
  586. package/src/project.js +11 -9
  587. package/src/runtime-abi.js +23 -0
  588. package/src/runtime-adapters.js +18 -0
  589. package/src/schemas.js +24 -17
  590. package/src/semantic.js +54 -5
  591. package/src/snippets.js +60 -0
  592. package/src/spec-hints.js +56 -0
  593. package/src/spec-tree.js +241 -0
  594. package/src/spec.js +669 -305
  595. package/docs/examples/approved-design/dependencies/august/0.19.0/io/contracts.md +0 -395
  596. package/docs/examples/developer-workflow/dependencies/august/0.19.0/io/contracts.md +0 -395
  597. package/docs/examples/generic-di/dependencies/august/0.19.0/io/contracts.md +0 -395
  598. package/docs/examples/hello/dependencies/august/0.19.0/io/contracts.md +0 -395
  599. package/docs/examples/interceptors/dependencies/august/0.19.0/io/contracts.md +0 -395
  600. package/docs/examples/json-benchmark/dependencies/august/0.19.0/json/contracts.md +0 -103
  601. package/docs/examples/new-syntax/dependencies/august/0.19.0/io/contracts.md +0 -395
  602. package/docs/examples/oidc-login/dependencies/august/0.19.0/crypto/contracts.md +0 -925
  603. package/docs/examples/oidc-login/dependencies/august/0.19.0/crypto/jose.md +0 -434
  604. package/docs/examples/oidc-login/dependencies/august/0.19.0/json/contracts.md +0 -103
  605. package/docs/examples/oidc-login/dependencies/august/0.19.0/memory/store.md +0 -374
  606. package/docs/examples/oidc-login/dependencies/august/0.19.0/time/contracts.md +0 -150
  607. package/docs/examples/oidc-login/dependencies/august/0.19.0/web/contracts.md +0 -532
  608. package/docs/examples/ownership-transfer/dependencies/august/0.19.0/io/contracts.md +0 -395
  609. package/examples/approved-design/.aug-spec/august/0.19.0/io/contracts.aug.md +0 -316
  610. package/examples/developer-workflow/.aug-spec/august/0.19.0/io/contracts.aug.md +0 -316
  611. package/examples/generic-di/.aug-spec/august/0.19.0/io/contracts.aug.md +0 -316
  612. package/examples/hello/.aug-spec/august/0.19.0/io/contracts.aug.md +0 -316
  613. package/examples/interceptors/.aug-spec/august/0.19.0/io/contracts.aug +0 -36
  614. package/examples/interceptors/.aug-spec/august/0.19.0/io/contracts.aug.md +0 -316
  615. package/examples/new-syntax/.aug-spec/august/0.19.0/io/contracts.aug +0 -36
  616. package/examples/new-syntax/.aug-spec/august/0.19.0/io/contracts.aug.md +0 -316
  617. package/examples/oidc-login/.aug-spec/august/0.19.0/crypto/contracts.aug.md +0 -791
  618. package/examples/oidc-login/.aug-spec/august/0.19.0/crypto/jose.aug.md +0 -266
  619. package/examples/oidc-login/.aug-spec/august/0.19.0/json/contracts.aug.md +0 -55
  620. package/examples/oidc-login/.aug-spec/august/0.19.0/memory/store.aug.md +0 -250
  621. package/examples/oidc-login/.aug-spec/august/0.19.0/time/contracts.aug.md +0 -96
  622. package/examples/oidc-login/.aug-spec/august/0.19.0/web/contracts.aug.md +0 -420
  623. package/examples/ownership-transfer/.aug-spec/august/0.19.0/io/contracts.aug +0 -36
  624. package/examples/ownership-transfer/.aug-spec/august/0.19.0/io/contracts.aug.md +0 -316
  625. /package/examples/oidc-login/.aug-spec/{august/0.19.0/memory → packages/@git/url_0eb7c89453c87681ed15/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301}/store.aug +0 -0
  626. /package/examples/oidc-login/.aug-spec/{august/0.19.0/json → packages/@git/url_2d3c37c690c0fa115be1/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301}/contracts.aug +0 -0
  627. /package/examples/oidc-login/.aug-spec/{august/0.19.0/web → packages/@git/url_897efafd565158fc4908/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301}/contracts.aug +0 -0
  628. /package/examples/oidc-login/.aug-spec/{august/0.19.0/time → packages/@git/url_c092cd151499c4e1d8a1/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301}/contracts.aug +0 -0
package/src/policies.js CHANGED
@@ -85,11 +85,11 @@ export function projectPolicies(project) {
85
85
  if (!params.some(param => (param.label ?? param.name) === label))
86
86
  report(node.span, `@param ${label} does not name a public input of ${node.name}`, 'DOC');
87
87
  for (const tag of doc.tags ?? []) {
88
- if (['return', 'returns'].includes(tag.name) && !('returns' in node && node.returns.name !== 'void'))
88
+ if (node.kind !== 'function' && ['return', 'returns'].includes(tag.name))
89
89
  report(node.span, `@${tag.name} requires a value-returning callable`, 'DOC');
90
- if (['throws', 'exception'].includes(tag.name)) {
90
+ if (node.kind !== 'function' && !(node.kind === 'class' && node.record && node.validationDeclared === false) && ['throws', 'exception'].includes(tag.name)) {
91
91
  const name = tag.value.split(/\s/)[0];
92
- const errors = 'throws' in node ? node.throws : 'validationErrors' in node ? node.validationErrors ?? [] : [];
92
+ const errors = node.kind === 'class' ? node.validationErrors ?? [] : [];
93
93
  if (!('annotations' in node && node.annotations?.length) && !errors.some(error => error.name === name))
94
94
  report(node.span, `@${tag.name} ${name} is absent from ${node.name}'s unless contract`, 'DOC');
95
95
  }
@@ -1,18 +1,92 @@
1
1
  import { existsSync, mkdirSync, readdirSync, writeFileSync } from 'node:fs';
2
2
  import { basename, join, resolve } from 'node:path';
3
+ export const agentInstructions = `# Working on this August project
4
+
5
+ Start in main.aug. It shows the imports, dependency bindings, and application startup.
6
+ Read the adjacent .aug.md specification before changing a source file. Generate missing
7
+ or stale explanations with aug spec; they describe checked behavior and link dependencies.
8
+
9
+ Keep tests in the file that declares the behavior. Run aug check, aug test, and aug spec
10
+ after a change, and use aug run to compile and run the application. Run prepares required
11
+ source packages and native libraries. Commit aug.lock.json; do not edit .aug-packages.
12
+
13
+ Use labeled inputs, narrow export.aug files, and underscore-prefixed private helpers.
14
+ Leave return types, effects, and errors to inference when an executable body provides
15
+ the answer. Bodyless interfaces still declare their contracts. Use borrow for mutation,
16
+ and keep unsafe native calls inside small adapters. Explain intent in Javadoc when it
17
+ is not evident from the code. Follow the existing indentation or brace style.
18
+
19
+ Language guide: https://greenpandastudios.github.io/augscript/
20
+ `;
21
+ export const weatherSource = `/** The JSON shape returned by the forecast endpoint. Temperatures use whole degrees. */
22
+ record WeatherForecast(string date, int temperatureC, int temperatureF, string summary)
23
+
24
+ /** Return five simulated forecasts. Fixed data keeps the example and its tests reproducible. */
25
+ endpoint GET "/weatherforecast" as weatherForecast():
26
+ return [
27
+ WeatherForecast(
28
+ date="2026-01-01",
29
+ temperatureC=0,
30
+ temperatureF=32,
31
+ summary="Freezing"
32
+ ),
33
+ WeatherForecast(
34
+ date="2026-01-02",
35
+ temperatureC=10,
36
+ temperatureF=50,
37
+ summary="Cool"
38
+ ),
39
+ WeatherForecast(
40
+ date="2026-01-03",
41
+ temperatureC=20,
42
+ temperatureF=68,
43
+ summary="Mild"
44
+ ),
45
+ WeatherForecast(
46
+ date="2026-01-04",
47
+ temperatureC=30,
48
+ temperatureF=86,
49
+ summary="Warm"
50
+ ),
51
+ WeatherForecast(
52
+ date="2026-01-05",
53
+ temperatureC=35,
54
+ temperatureF=95,
55
+ summary="Hot"
56
+ )
57
+ ]
58
+
59
+ test endpoint weatherForecast client:
60
+ when forecasts:
61
+ it returns_json:
62
+ response = client.request(method="GET", path="/weatherforecast")
63
+ assert(condition=response.status == 200)
64
+ it rejects_other_methods:
65
+ response = client.request(method="POST", path="/weatherforecast")
66
+ assert(condition=response.status == 405)
67
+ `;
3
68
  /** Create a small, runnable application without replacing existing files. */
4
- export function initProject(destination) {
69
+ export function initProject(destination, template = 'hello') {
5
70
  const root = resolve(destination);
6
71
  if (existsSync(root) && readdirSync(root).length)
7
72
  throw new Error(`Directory is not empty: ${root}`);
8
73
  const name = basename(root);
9
74
  mkdirSync(root, { recursive: true });
10
75
  const files = {
76
+ 'AGENTS.md': agentInstructions,
11
77
  'main.aug': `import Greeter and SimpleGreeter from greeting\n\nimplement Greeter with SimpleGreeter\nresolve Greeter to greeter\nprint(value=greeter.greet(name="August"))\n`,
12
- 'greeting.aug': `/** Build a greeting for a named person. */\ninterface Greeter:\n /** Return a greeting for the named person. */\n greet(string name) returns string\n\n/** A plain-language greeting. */\nSimpleGreeter() implements Greeter:\n greet(string name) returns string:\n return "Hello, " + name + "!"\n\ntest SimpleGreeter greeter:\n when greetings:\n greeter = SimpleGreeter()\n it greets_a_person:\n assert(greeter.greet(name="August") == "Hello, August!")\n`,
13
- '.gitignore': '.aug-build/\n.aug-spec/\n*.aug.md\n',
14
- 'README.md': `# ${name}\n\nThis is an August application. Start in \`main.aug\`; its dependencies and startup are visible there.\n\n\`greeting.aug\` contains a public interface, its implementation, and a same-file test.\n\n\`\`\`sh\naug check .\naug test .\naug spec .\naug run .\n\`\`\`\n\nFor the language guide, see https://GreenPandaStudios.github.io/augscript/getting-started.\n`,
78
+ 'greeting.aug': `/** Build a greeting for a named person. */\ninterface Greeter:\n /** Return a greeting for the named person. */\n greet(string name) returns string\n\n/** A plain-language greeting. */\nSimpleGreeter() implements Greeter:\n greet(string name):\n return "Hello, " + name + "!"\n\ntest SimpleGreeter greeter:\n when greetings:\n greeter = SimpleGreeter()\n it greets_a_person:\n assert(greeter.greet(name="August") == "Hello, August!")\n`,
79
+ '.gitignore': '.aug-build/\n.aug-spec/\n.aug-packages/\n.aug-install-*/\n*.aug.md\n',
80
+ 'README.md': `# ${name}\n\nThis is an August application. Start in \`main.aug\`; its dependencies and startup are visible there.\n\n\`greeting.aug\` contains a public interface, its implementation, and a same-file test.\n\n\`\`\`sh\naug run\naug check\naug test\naug spec\n\`\`\`\n\nFor the language guide, see https://GreenPandaStudios.github.io/augscript/getting-started.\n`,
15
81
  };
82
+ if (template === 'weather') {
83
+ delete files['greeting.aug'];
84
+ files['main.aug'] = 'import weatherForecast from forecasts\n\nserve weatherForecast on port 8787\n';
85
+ files['forecasts.aug'] = weatherSource;
86
+ files['weather.http'] = '### Five simulated forecasts\nGET http://127.0.0.1:8787/weatherforecast\n\n### Generated OpenAPI document\nGET http://127.0.0.1:8787/openapi.json\n';
87
+ files['main.yaml'] = 'block_style: indent\nopenapi:\n enabled: true\n title: "Weather forecast API"\n version: "0.1.0"\n';
88
+ files['README.md'] = `# ${name}\n\nA simulated weather API in August. Its endpoint, JSON record, and tests live in forecasts.aug.\n\nRun the server:\n\n\`\`\`sh\naug run\n\`\`\`\n\nOpen http://127.0.0.1:8787/weatherforecast for five forecasts, or http://127.0.0.1:8787/docs for the OpenAPI viewer. These are fixed examples, not live weather observations.\n\n\`\`\`sh\ncurl http://127.0.0.1:8787/weatherforecast\naug test\naug spec\n\`\`\`\n\nGuide: https://greenpandastudios.github.io/augscript/weather-api\n`;
89
+ }
16
90
  for (const [file, contents] of Object.entries(files))
17
91
  writeFileSync(join(root, file), contents, { flag: 'wx' });
18
92
  return root;
package/src/project.js CHANGED
@@ -5,7 +5,8 @@ import { loadConfig } from "./config.js";
5
5
  import { projectPolicies } from "./policies.js";
6
6
  import { builtinFunctions, builtinTypes } from "./builtins.js";
7
7
  import { libraryChild, libraryRelative, standardLibraries } from "./libraries.js";
8
- import { projectPackages, readPackage, sourcePaths } from "./package-manager.js";
8
+ import { packageSpecifications, projectPackages, readPackage, sourcePaths } from "./package-manager.js";
9
+ import { isGitSource, sourceAlias } from "./git-packages.js";
9
10
  export function isPrivateName(name) { return name.startsWith('_'); }
10
11
  function diagnostic(file, line, column, message, code) {
11
12
  return { file, line, column, message, code };
@@ -35,7 +36,7 @@ export function loadProject(projectRoot, overrides = new Map(), cache) {
35
36
  const { config, diagnostics } = loadConfig(root);
36
37
  let library;
37
38
  let sourceRoot = root;
38
- if (existsSync(join(root, 'aug-package.json'))) {
39
+ if (existsSync(join(root, 'aug-package.json')) || !existsSync(join(root, 'main.aug')) && (existsSync(join(root, 'export.aug')) || existsSync(join(root, 'src/export.aug')))) {
39
40
  try {
40
41
  const loaded = readPackage(root);
41
42
  library = loaded.manifest;
@@ -45,7 +46,7 @@ export function loadProject(projectRoot, overrides = new Map(), cache) {
45
46
  diagnostics.push(diagnostic(join(root, 'aug-package.json'), 1, 1, error.message, 'PACKAGE'));
46
47
  }
47
48
  }
48
- const packages = projectPackages(root, library?.dependencies ?? config.packages, sourceRoot);
49
+ const packages = projectPackages(root, packageSpecifications(sourceRoot, library?.dependencies ?? config.packages, overrides), sourceRoot);
49
50
  diagnostics.push(...packages.diagnostics);
50
51
  const read = (path) => {
51
52
  const source = overrides.get(path) ?? readFileSync(path, 'utf8');
@@ -56,7 +57,7 @@ export function loadProject(projectRoot, overrides = new Map(), cache) {
56
57
  cache?.set(path, parsed);
57
58
  return parsed;
58
59
  };
59
- for (const path of new Set([...sourceFiles(sourceRoot), ...overrides.keys()].filter(path => path.endsWith('.aug')))) {
60
+ for (const path of new Set([...sourceFiles(sourceRoot), ...[...overrides.keys()].filter(path => path.startsWith(sourceRoot + '/') || path.startsWith(sourceRoot + '\\'))].filter(path => path.endsWith('.aug')))) {
60
61
  const parsed = read(path);
61
62
  files.set(path, parsed.file);
62
63
  diagnostics.push(...parsed.diagnostics);
@@ -70,7 +71,7 @@ export function loadProject(projectRoot, overrides = new Map(), cache) {
70
71
  }
71
72
  const libraries = standardLibraries();
72
73
  const stdlibRoot = libraries.root;
73
- const libraryFiles = new Set([stdlibRoot, ...libraries.modules.values()].flatMap(sourceFiles));
74
+ const libraryFiles = new Set([join(stdlibRoot, 'export.aug'), ...sourceFiles(join(stdlibRoot, 'io'))]);
74
75
  for (const path of libraryFiles) {
75
76
  const parsed = read(path);
76
77
  parsed.file.builtin = true;
@@ -90,14 +91,14 @@ export function loadProject(projectRoot, overrides = new Map(), cache) {
90
91
  if (!isExport && item.kind === 'export') {
91
92
  diagnostics.push(diagnostic(file.path, item.span.line, item.span.column, 'export declarations belong in export.aug', 'EXPORT'));
92
93
  }
93
- if (file === main && ['class', 'interface', 'function', 'interceptor', 'test', 'composition'].includes(item.kind)) {
94
+ if (file === main && ['class', 'interface', 'function', 'interceptor', 'test', 'composition', 'resource'].includes(item.kind)) {
94
95
  diagnostics.push(diagnostic(file.path, item.span.line, item.span.column, 'Define classes, interfaces, functions, and interceptors outside main.aug', 'MAIN'));
95
96
  }
96
97
  if (file !== main && ['bind', 'include', 'expr', 'assign', 'return', 'throw', 'if', 'while', 'for', 'destructure', 'match', 'scope', 'freeze', 'serve', 'lock',
97
98
  'try', 'unsafe', 'borrow'].includes(item.kind)) {
98
99
  diagnostics.push(diagnostic(file.path, item.span.line, item.span.column, 'Executable statements and bindings belong in main.aug', 'MAIN'));
99
100
  }
100
- if (item.kind === 'class' || item.kind === 'interface' || item.kind === 'function' || item.kind === 'interceptor' || item.kind === 'composition') {
101
+ if (item.kind === 'class' || item.kind === 'interface' || item.kind === 'function' || item.kind === 'interceptor' || item.kind === 'composition' || item.kind === 'resource') {
101
102
  if (item.name in builtinTypes || builtinFunctions.some(operation => operation.name === item.name) || item.name === 'next') {
102
103
  diagnostics.push(diagnostic(file.path, item.span.line, item.span.column, `${item.name} is a reserved built-in name`, 'NAME'));
103
104
  continue;
@@ -216,7 +217,7 @@ export function loadProject(projectRoot, overrides = new Map(), cache) {
216
217
  }
217
218
  return result;
218
219
  };
219
- const privateModule = item.from.find(isPrivateName);
220
+ const privateModule = item.from.slice(isGitSource(item.from[0]) ? 1 : 0).find(isPrivateName);
220
221
  if (privateModule) {
221
222
  diagnostics.push(diagnostic(importer, item.span.line, item.span.column, `Cannot import from private module ${privateModule}`, 'PRIVATE'));
222
223
  return result;
@@ -234,7 +235,8 @@ export function loadProject(projectRoot, overrides = new Map(), cache) {
234
235
  }
235
236
  const owner = files.get(importer)?.package;
236
237
  const ownerScope = owner ? packages.scopes.get(owner) : undefined;
237
- const dependency = ownerScope ? packages.scopes.get(ownerScope.dependencies[item.from[0]]) : packages.roots.get(item.from[0]);
238
+ const alias = isGitSource(item.from[0]) ? sourceAlias(item.from[0]) : item.from[0];
239
+ const dependency = ownerScope ? packages.scopes.get(ownerScope.dependencies[alias]) : packages.roots.get(alias);
238
240
  if (dependency) {
239
241
  let folder = dependency.sourceRoot;
240
242
  for (const child of item.from.slice(1)) {
@@ -0,0 +1,23 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { httpPolicyNames, httpPolicyNativeName } from "./http-policies.js";
3
+ /** Compiler-private identifiers, checked against the compiled target headers. */
4
+ export const runtimeOperations = ['PRINT', 'BINARY', 'UNARY', 'FIELD', 'SET_FIELD', 'LIST', 'TUPLE', 'SET', 'MAP', 'MAP_SET', 'LIST_LENGTH', 'LIST_GET', 'LIST_AT', 'LIST_APPEND', 'TUPLE_LENGTH', 'TUPLE_GET', 'SET_LENGTH', 'SET_ADD', 'SET_CONTAINS', 'MAP_LENGTH', 'MAP_GET', 'MAP_TAKE', 'MAP_CONTAINS', 'STRING_LENGTH', 'STRING_BYTES', 'STRING_SPLIT', 'STRING_STARTS_WITH', 'STRING_IS_TOKEN', 'BYTES_LENGTH', 'BYTES_TEXT', 'BYTES_BASE64URL', 'BASE64URL_DECODE', 'C_INT', 'READ_FILE', 'WRITE_FILE', 'ARGUMENTS', 'FREEZE', 'ITER', 'MAP_ITER', 'IS_TYPE', 'SHARED', 'SHARED_LOCK', 'JSON_WRAP', 'JSON_PARSE', 'JSON_STRINGIFY', 'JSON_GET', 'JSON_REQUIRE', 'JSON_STRING', 'JSON_INTEGER', 'JSON_BOOLEAN', 'JSON_ITEMS', 'TIME_NOW', 'EXIT', 'TEST_CASE'];
5
+ export const httpOperations = ['HTTP_HEADERS', 'HTTP_HEADERS_WITH', 'HTTP_HEADERS_GET', 'HTTP_HEADERS_ALL', 'HTTP_RESPONSE', 'HTTP_RESPONSE_STATUS', 'HTTP_FINISH', 'HTTP_EVENT', 'HTTP_YIELD', 'HTTP_CLIENT_REQUEST', 'HTTP_ACTION'];
6
+ /** Every private operation declares either a fixed or a collection arity. */
7
+ export const runtimeArities = {
8
+ PRINT: 1, BINARY: 2, UNARY: 1, FIELD: 1, SET_FIELD: 2, LIST: 'variadic', TUPLE: 'variadic', SET: 'variadic', MAP: 0, MAP_SET: 3,
9
+ LIST_LENGTH: 1, LIST_GET: 2, LIST_AT: 2, LIST_APPEND: 2, TUPLE_LENGTH: 1, TUPLE_GET: 2, SET_LENGTH: 1, SET_ADD: 2, SET_CONTAINS: 2,
10
+ MAP_LENGTH: 1, MAP_GET: 2, MAP_TAKE: 2, MAP_CONTAINS: 2, STRING_LENGTH: 1, STRING_BYTES: 1, STRING_SPLIT: 2, STRING_STARTS_WITH: 2, STRING_IS_TOKEN: 3,
11
+ BYTES_LENGTH: 1, BYTES_TEXT: 1, BYTES_BASE64URL: 1, BASE64URL_DECODE: 1, C_INT: 1, READ_FILE: 1, WRITE_FILE: 2, ARGUMENTS: 0, FREEZE: 1, ITER: 1, MAP_ITER: 1, IS_TYPE: 1,
12
+ SHARED: 1, SHARED_LOCK: 1, JSON_WRAP: 1, JSON_PARSE: 1, JSON_STRINGIFY: 1, JSON_GET: 2, JSON_REQUIRE: 2, JSON_STRING: 1, JSON_INTEGER: 1, JSON_BOOLEAN: 1, JSON_ITEMS: 1,
13
+ TIME_NOW: 0, EXIT: 1, TEST_CASE: 0, HTTP_HEADERS: 0, HTTP_HEADERS_WITH: 3, HTTP_HEADERS_GET: 2, HTTP_HEADERS_ALL: 2, HTTP_RESPONSE: 3, HTTP_RESPONSE_STATUS: 2,
14
+ HTTP_FINISH: 1, HTTP_EVENT: 4, HTTP_YIELD: 1, HTTP_CLIENT_REQUEST: 5, HTTP_ACTION: 'variadic',
15
+ };
16
+ export const schemaKinds = ['INT', 'C_INT', 'FLOAT', 'BOOL', 'STRING', 'LIST', 'MAP', 'SET', 'TUPLE', 'RECORD', 'JSON'];
17
+ export const runtimeIdentifiers = Object.fromEntries([
18
+ ...runtimeOperations.map((name, index) => ['AUG_IR_' + name, index + 1]),
19
+ ...httpOperations.map((name, index) => ['AUG_IR_' + name, index + 1]),
20
+ ...schemaKinds.map((name, index) => ['AUG_SCHEMA_' + name, index]),
21
+ ...httpPolicyNames.map((name, index) => [httpPolicyNativeName(name), index + 1]),
22
+ ]);
23
+ export const runtimeIdentifierSha256 = createHash('sha256').update(JSON.stringify(runtimeIdentifiers)).digest('hex');
@@ -0,0 +1,18 @@
1
+ export const runtimeAdapters = [
2
+ { name: '_aug_crypto_random', parameters: ['int'], returns: 'Bytes', component: 'crypto' },
3
+ { name: '_aug_crypto_sha256', parameters: ['Bytes'], returns: 'Bytes', component: 'crypto' },
4
+ { name: '_aug_crypto_generate_rsa', parameters: [], returns: 'RsaPrivateKey', component: 'crypto' },
5
+ { name: '_aug_crypto_public_rsa', parameters: ['RsaPrivateKey'], returns: 'RsaPublicKey', component: 'crypto' },
6
+ { name: '_aug_crypto_sign_rsa', parameters: ['RsaPrivateKey', 'Bytes'], returns: 'Bytes', component: 'crypto' },
7
+ { name: '_aug_crypto_verify_rsa', parameters: ['RsaPublicKey', 'Bytes', 'Bytes'], returns: 'bool', component: 'crypto' },
8
+ { name: '_aug_crypto_decode_base64url', parameters: ['string'], returns: 'Bytes', component: 'crypto' },
9
+ { name: '_aug_crypto_equal', parameters: ['Bytes', 'Bytes'], returns: 'bool', component: 'crypto' },
10
+ { name: '_aug_crypto_export_rsa', parameters: ['RsaPublicKey'], returns: 'Tuple<Bytes,Bytes>', component: 'crypto' },
11
+ { name: '_aug_crypto_import_rsa', parameters: ['Bytes', 'Bytes'], returns: 'RsaPublicKey', component: 'crypto' },
12
+ { name: '_aug_crypto_password_hash', parameters: ['Bytes', 'Bytes', 'int'], returns: 'Bytes', component: 'crypto' },
13
+ { name: '_aug_http_log', parameters: ['string', 'string', 'int', 'int'], returns: 'void', component: 'http' },
14
+ { name: '_aug_http_request', parameters: ['string', 'string', 'optional Headers', 'optional Bytes'], returns: 'HttpResponse<Bytes>', component: 'http' },
15
+ { name: '_aug_http_url_encode', parameters: ['string'], returns: 'string', component: 'http' },
16
+ { name: '_aug_http_cookie', parameters: ['string', 'string', 'string', 'int', 'bool'], returns: 'Headers', component: 'http' }
17
+ ];
18
+ export function adapterSymbol(adapter) { return 'aug_ir_private' + adapter.name; }
package/src/schemas.js CHANGED
@@ -21,11 +21,10 @@ export function jsonDataType(project, type, seen = new Set()) {
21
21
  const params = new Map(node.typeParams.map((name, i) => [name, type.args[i]]));
22
22
  return node.fields.every(field => jsonDataType(project, schemaType(project, field.type, type.def.file, params), seen));
23
23
  }
24
- /** One shared native schema per concrete type, used by HTTP and explicit JSON decoding. */
25
- export class NativeSchemas {
24
+ /** Backend-neutral, resolved schema graph shared by HTTP and JSON decoding. */
25
+ export class DataSchemas {
26
26
  names = new Map();
27
- output = [];
28
- forwards = [];
27
+ nodes = [];
29
28
  project;
30
29
  constructorName;
31
30
  constructor(project, constructorName) {
@@ -39,24 +38,32 @@ export class NativeSchemas {
39
38
  return previous;
40
39
  const name = 'aug_schema_' + this.names.size;
41
40
  this.names.set(key, name);
42
- this.forwards.push(`static const AugSchema ${name};`);
43
- let kind = 'AUG_SCHEMA_' + type.name.toUpperCase(), fields = [], labels = [], maker = 'NULL';
41
+ const schema = { name, kind: type.name.toUpperCase(), nullable: type.nullable,
42
+ optional: !!type.optional, fields: [], labels: [] };
43
+ this.nodes.push(schema);
44
44
  if (type.def?.node.kind === 'class' && type.def.node.record) {
45
- kind = 'AUG_SCHEMA_RECORD';
45
+ schema.kind = 'RECORD';
46
46
  const node = type.def.node, params = new Map(node.typeParams.map((param, i) => [param, type.args[i]]));
47
- fields = node.fields.map(field => '&' + this.request(schemaType(this.project, field.type, type.def.file, params)));
48
- labels = node.fields.map(field => JSON.stringify(field.name));
49
- maker = this.constructorName(type.def);
47
+ schema.fields = node.fields.map(field => this.request(schemaType(this.project, field.type, type.def.file, params)));
48
+ schema.labels = node.fields.map(field => field.name);
49
+ schema.maker = this.constructorName(type.def);
50
50
  }
51
51
  else
52
- fields = type.args.map(arg => '&' + this.request(arg));
53
- if (fields.length)
54
- this.output.push(`static const AugSchema *const ${name}_fields[] = {${fields.join(', ')}};`);
55
- if (labels.length)
56
- this.output.push(`static const char *const ${name}_names[] = {${labels.join(', ')}};`);
57
- this.output.push(`static const AugSchema ${name} = {${kind}, ${type.nullable ? 'true' : 'false'}, ${type.optional ? 'true' : 'false'}, ${fields.length}, ${fields.length ? name + '_fields' : 'NULL'}, ${labels.length ? name + '_names' : 'NULL'}, ${maker}};`);
52
+ schema.fields = type.args.map(arg => this.request(arg));
58
53
  return name;
59
54
  }
60
55
  identity(type) { return [type.id, type.nullable, !!type.optional, type.args.map(arg => this.identity(arg))]; }
61
- declarations() { return [...this.forwards, ...this.output].join('\n'); }
56
+ }
57
+ /** C representation of the same checked concrete schema graph. */
58
+ export class NativeSchemas extends DataSchemas {
59
+ declarations() {
60
+ return [...this.nodes.map(schema => `static const AugSchema ${schema.name};`), ...this.nodes.flatMap(schema => {
61
+ const { name, fields, labels } = schema;
62
+ return [
63
+ ...(fields.length ? [`static const AugSchema *const ${name}_fields[] = {${fields.map(field => '&' + field).join(', ')}};`] : []),
64
+ ...(labels.length ? [`static const char *const ${name}_names[] = {${labels.map(label => JSON.stringify(label)).join(', ')}};`] : []),
65
+ `static const AugSchema ${name} = {AUG_SCHEMA_${schema.kind}, ${schema.nullable ? 'true' : 'false'}, ${schema.optional ? 'true' : 'false'}, ${fields.length}, ${fields.length ? name + '_fields' : 'NULL'}, ${labels.length ? name + '_names' : 'NULL'}, ${schema.maker ?? 'NULL'}, NULL};`
66
+ ];
67
+ })].join('\n');
68
+ }
62
69
  }
package/src/semantic.js CHANGED
@@ -11,6 +11,8 @@ import { javadocBefore } from "./javadoc.js";
11
11
  import { checkUnitTests, discoverTests, mergeTestAnalysis, uniqueDiagnostics } from "./testing.js";
12
12
  import { formatFile } from "./formatter.js";
13
13
  import { interceptorBehavior } from "./interceptors.js";
14
+ import { callableResult, callableErrors } from "./contracts.js";
15
+ import { nativeFact, nativeDependencies } from "./native-facts.js";
14
16
  const genericFacts = (header) => header.typeParams.map(name => ({ name,
15
17
  variance: header.typeVariance?.[name] ?? 'invariant', constraints: (header.typeConstraints?.[name] ?? []).map(typeName) }));
16
18
  export function contractFacts(checked) {
@@ -18,18 +20,21 @@ export function contractFacts(checked) {
18
20
  const callable = (method, constructor) => {
19
21
  const contract = checked.effectContracts.get(method);
20
22
  const layers = checked.interceptorPlans.get(constructor ?? method) ?? [];
23
+ const native = nativeFact(checked, method);
21
24
  return { name: method.name, location: method.span, genericParameters: genericFacts(method),
25
+ native: native?.kind === 'function' ? native : undefined, nativeDependencies: nativeDependencies(checked, method), nativeCoverage: 'resolved-standalone-calls',
22
26
  inputs: method.params.map(param => ({ label: param.label ?? param.name, name: param.name,
23
27
  type: typeName(param.type), ownership: param.ownership, injected: param.injected, source: param.source })),
24
28
  http: method.endpoint ? { method: method.endpoint.method, path: method.endpoint.path, status: method.endpoint.status,
25
29
  streaming: !!method.endpoint.streams, errors: method.endpoint.errors.map(error => ({ type: typeName(error.type), status: error.status })) } : undefined,
26
30
  policies: (checked.httpPolicies.get(method) ?? []).map((policy, index) => ({ name: policy.name, order: index + 1, options: policy.options,
27
31
  dependencies: policy.dependencies.map(index => method.params[index]?.label ?? method.params[index]?.name ?? '') })),
28
- result: `${method.returnOwnership === 'own' ? 'own ' : ''}${typeName(method.returns)}`,
32
+ result: `${method.returnOwnership === 'own' ? 'own ' : ''}${tyName(callableResult(checked, method))}`,
29
33
  changes: [...(contract?.changes ?? method.changes ?? [])],
30
- capabilities: [...(contract?.uses.values() ?? [])].map(effect => `${effect.source}.${effect.operation}`).concat(method.externC ? [`C.${method.name}`] : []),
34
+ capabilities: [...(contract?.uses.values() ?? [])].map(effect => `${effect.source}.${effect.operation}`).concat(method.externC && !native ? [`C.${method.name}`] : []),
31
35
  inferredEffects: !!contract?.inferred,
32
- errors: [...new Set([...method.throws.map(typeName), ...layers.flatMap(layer => layer.errors.map(tyName))])],
36
+ errors: constructor ? [...new Set([...(checked.constructorContracts.get(constructor)?.errors.map(tyName) ?? constructor.validationErrors?.map(typeName) ?? []),
37
+ ...layers.flatMap(layer => layer.errors.map(tyName))])].sort() : callableErrors(checked, method),
33
38
  interceptors: layers.map((layer, order) => {
34
39
  const effects = checked.effectContracts.get(layer.around);
35
40
  return { name: layer.definition.name, order: order + 1, location: layer.definition.node.span,
@@ -66,8 +71,10 @@ export function contractFacts(checked) {
66
71
  visit(child);
67
72
  };
68
73
  visit(node);
74
+ const native = node.kind === 'resource' ? nativeFact(checked, node) : undefined;
69
75
  return { id: def.id, name: def.name, kind: node.kind === 'class' && node.record ? 'record' :
70
76
  node.kind === 'interface' && node.capability ? 'capability' : node.kind,
77
+ native: native?.kind === 'resource' ? native : undefined,
71
78
  location: node.span, public: !node.name.startsWith('_'), typeParameters: node.typeParams, genericParameters: genericFacts(node),
72
79
  documentation: javadocBefore(file.source, 'annotations' in node ? node.annotations?.[0]?.span.start ?? node.span.start : node.span.start)?.markdown,
73
80
  interfaces: node.kind === 'class' ? node.implements.map(typeName) : node.kind === 'interface' ? node.extends.map(typeName) : [],
@@ -77,7 +84,7 @@ export function contractFacts(checked) {
77
84
  typeConstraints: node.typeConstraints, typeVariance: node.typeVariance, params: node.fields,
78
85
  returns: syntheticType(node.name, node.span), returnOwnership: 'managed',
79
86
  throws: node.validationErrors ?? [], changes: [], uses: [], body: node.constructorBody, externC: false, span: node.span }, node)] : []),
80
- ...methods.filter(method => !method.name.startsWith('_')).map(method => callable(method))], calls,
87
+ ...methods.filter(method => node.kind === 'function' || !method.name.startsWith('_')).map(method => callable(method))], calls,
81
88
  tests: file.items.flatMap(item => item.kind === 'test' && item.type.name === def.name ? item.groups.flatMap(group => group.cases.map(test => ({ group: group.name, name: test.name, location: test.span }))) : []) };
82
89
  });
83
90
  }
@@ -145,7 +152,7 @@ export function describe(checked, fileName, options = {}) {
145
152
  const module = { file: source.path, dependencies: [...new Set(source.items.flatMap(item => item.kind === 'import' ?
146
153
  (checked.project.imports.get(item) ?? []).map(def => def.file) : []))].sort(),
147
154
  public: publicFacts.map(fact => ({ name: fact.name, shape: createHash('sha256').update(JSON.stringify({ kind: fact.kind,
148
- generics: fact.genericParameters, fields: fact.fields.filter(field => !field.storage.startsWith('_')),
155
+ native: fact.native, generics: fact.genericParameters, fields: fact.fields.filter(field => !field.storage.startsWith('_')),
149
156
  interfaces: fact.interfaces, callables: fact.callables.map(({ location, interceptors, inputs, ...contract }) => ({ ...contract,
150
157
  inputs: inputs.map(({ name, ...input }) => input),
151
158
  interceptors: interceptors.map(({ location, ...layer }) => layer) })) })).digest('hex') })),
@@ -186,6 +193,48 @@ export class SemanticDocument {
186
193
  complete(offset) { return completions(this.checked, this.path, offset); }
187
194
  tokens() { return semanticTokens(this.checked, this.path); }
188
195
  fixes() { return suggestedFixes(this.checked, this.path); }
196
+ /** Non-editable declaration hints. Formatting never adds inferred source clauses. */
197
+ inlayHints(start = 0, end = this.source.length) {
198
+ const hints = [];
199
+ for (const [method, contract] of this.checked.callableContracts) {
200
+ if (method.span.file !== this.path || !method.body || method.headerEnd === undefined)
201
+ continue;
202
+ let offset = method.headerEnd;
203
+ while (offset > method.span.start && /\s/.test(this.source[offset - 1]))
204
+ offset--;
205
+ if (offset < start || offset > end)
206
+ continue;
207
+ const clauses = [];
208
+ if (contract.inferredResult && contract.result.kind !== 'error' && contract.result.name !== 'void')
209
+ clauses.push(contract.result.name === '<target result>' ? 'returns the target result' : `returns ${tyName(contract.result)}`);
210
+ const effects = this.checked.effectContracts.get(method);
211
+ if (effects?.inferredChanges && effects.changes.length)
212
+ clauses.push(`changes ${effects.changes.join(' and ')}`);
213
+ const uses = [...(effects?.uses.values() ?? [])].map(effect => `${effect.source}.${effect.operation}`).sort();
214
+ if (effects?.inferred && uses.length)
215
+ clauses.push(`uses ${[...new Set(uses)].join(' and ')}`);
216
+ const errors = callableErrors(this.checked, method);
217
+ if (contract.inferredErrors && errors.length)
218
+ clauses.push(`unless ${errors.join(' and ')}`);
219
+ const complete = clauses.join(' ');
220
+ const compact = complete.length > 120 ? clauses.map(clause => clause.startsWith('uses ') && clause.length > 50 ? `uses ${new Set(uses).size} operations` :
221
+ clause.startsWith('unless ') && clause.length > 50 ? `unless ${errors.length} errors` : clause).join(' ') : complete;
222
+ if (clauses.length)
223
+ hints.push({ offset, label: compact,
224
+ tooltip: `\`\`\`augscript\n${complete}\n\`\`\`\n\n` + 'Inferred from the body, implemented interface, and interceptor layers. These hints are not source text. The compiler still checks ownership, interface limits, and escaping errors. See the adjacent .aug.md spec for the full explanation.' });
225
+ }
226
+ for (const [record, contract] of this.checked.constructorContracts) {
227
+ if (record.span.file !== this.path || !contract.inferredErrors || !contract.errors.length || record.headerEnd === undefined)
228
+ continue;
229
+ let offset = record.headerEnd;
230
+ while (offset > record.span.start && /\s/.test(this.source[offset - 1]))
231
+ offset--;
232
+ if (offset >= start && offset <= end)
233
+ hints.push({ offset, label: 'unless ' + contract.errors.map(tyName).sort().join(' and '),
234
+ tooltip: 'Checked errors inferred from record validation. Callers must catch or propagate them. These hints are not saved source.' });
235
+ }
236
+ return hints.sort((left, right) => left.offset - right.offset);
237
+ }
189
238
  format() { return formatFile(this.checked.project, this.checked.project.files.get(this.path)); }
190
239
  describe(options) { return describe(this.checked, this.path, options); }
191
240
  definition(offset) {
@@ -0,0 +1,60 @@
1
+ /** Small starting points for ordinary August declarations and statements. */
2
+ export const snippetCatalog = [
3
+ { prefix: 'record', description: 'Immutable data with named fields', body: 'record ${1:User}(${2:string name})' },
4
+ { prefix: 'interface', description: 'A public behavior contract', body: 'interface ${1:Greeter}:\n ${2:greet}(${3:string name}) returns ${4:string}' },
5
+ { prefix: 'capability', description: 'An explicit I/O contract', body: 'capability ${1:Logger}:\n ${2:log}(${3:string message}) uses ${1:Logger}.${2:log}' },
6
+ { prefix: 'implementation', description: 'A class implementing an interface', body: '${1:SimpleGreeter}(${2:resolve Logger logger}) implements ${3:Greeter}:\n ${4:greet}(${5:string name}):\n $0' },
7
+ { prefix: 'method', description: 'A function or method with an inferred result', body: '${1:calculate}(${2:int value}):\n $0' },
8
+ { prefix: 'generic', description: 'A generic identity function', body: '${1:identity}<T>(T value):\n return value' },
9
+ { prefix: 'initialize', description: 'Initialize constructor fields or validate a record', body: 'initialize:\n $0' },
10
+ { prefix: 'import', description: 'Import a public declaration', body: 'import ${1:Name} from ${2:module}' },
11
+ { prefix: 'importurl', description: 'Import directly from a public Git repository', body: 'import ${1:Name} from "https://github.com/${2:owner}/${3:library}"' },
12
+ { prefix: 'export', description: 'Expose one declaration from a sibling file', body: 'export ${1:Name} from ${2:file}' },
13
+ { prefix: 'exportfolder', description: 'Expose a child module with its own export.aug', body: 'export folder ${1:module}' },
14
+ { prefix: 'implement', description: 'Select a dependency provider in main.aug', body: 'implement ${1:Contract} with ${2:Provider}' },
15
+ { prefix: 'resolve', description: 'Resolve a dependency explicitly', body: 'resolve ${1:Contract} to ${2:service}' },
16
+ { prefix: 'if', description: 'Conditional code', body: 'if ${1:condition}:\n $0' },
17
+ { prefix: 'ifelse', description: 'Two alternatives', body: 'if ${1:condition}:\n $2\nelse:\n $0' },
18
+ { prefix: 'for', description: 'Visit collection values', body: 'for ${1:item} in ${2:items}:\n $0' },
19
+ { prefix: 'while', description: 'Repeat while a condition holds', body: 'while ${1:condition}:\n $0' },
20
+ { prefix: 'matchoptional', description: 'Handle a value or null', body: 'match ${1:value}:\n when some ${2:item}:\n $3\n when null:\n $0' },
21
+ { prefix: 'try', description: 'Recover from a checked failure', body: 'try:\n $1\ncatch ${2:FileError} ${3:error}:\n $0' },
22
+ { prefix: 'borrow', description: 'Grant bounded mutable access', body: 'borrow ${1:value}:\n $0' },
23
+ { prefix: 'scope', description: 'Start and join a child computation', body: 'scope:\n ${1:pending} = start ${2:load}(${3:})\n wait for ${1:pending} as ${4:result}\n $0' },
24
+ { prefix: 'waitall', description: 'Join two computations', body: 'wait for ${1:loadingUsers} and ${2:loadingOrders} as ${3:users} and ${4:orders}' },
25
+ { prefix: 'lock', description: 'Access shared mutable state inside a bounded lock', body: 'lock ${1:shared} as ${2:value}:\n $0' },
26
+ { prefix: 'unsafe', description: 'Contain a native C call', body: 'unsafe:\n $0' },
27
+ { prefix: 'resource', description: 'An opaque native package resource with checked cleanup', body: 'extern C resource ${1:Handle}' },
28
+ { prefix: 'serve', description: 'Start a native HTTP listener', body: 'serve ${1:endpoint} on port ${2:8787}' },
29
+ ...['GET', 'POST', 'PATCH', 'DELETE'].map(method => ({ prefix: 'endpoint' + method.toLowerCase(), description: `A typed ${method} endpoint`, body: `endpoint ${method} "\${1:/items}" as \${2:handler}(\${3:}):\n $0` })),
30
+ { prefix: 'stream', description: 'An endpoint yielding server-sent events', body: 'endpoint GET "${1:/events}" as ${2:events}() streams ServerEvent<string>:\n yield ServerEvent(data=${3:"hello"})' },
31
+ { prefix: 'component', description: 'An embeddable server-rendered HTML component', body: '${1:Heading}(string text) returns Html:\n return <h1>{text}</h1>' },
32
+ { prefix: 'test', description: 'A same-file function test', body: 'test ${1:calculate}:\n when ${2:inputs}:\n it ${3:works}:\n assert(condition=${4:true})' },
33
+ { prefix: 'testclass', description: 'Fresh setup for each class test', body: 'test ${1:Worker} ${2:worker}:\n when ${3:ready}:\n ${2:worker} = ${1:Worker}(${4:})\n it ${5:works}:\n assert(condition=${6:true})' },
34
+ { prefix: 'testendpoint', description: 'Exercise the real endpoint pipeline', body: 'test endpoint ${1:handler} client:\n when requests:\n it succeeds:\n response = client.request(method="GET", path="${2:/items}")\n assert(condition=response.status == 200)' },
35
+ { prefix: 'it', description: 'A named test case', body: 'it ${1:works}:\n assert(condition=${2:true})' },
36
+ { prefix: 'fixture', description: 'A reusable same-file test fixture', body: 'fixture ${1:sample}():\n return ${2:42}' },
37
+ { prefix: 'interceptor', description: 'Wrap a call and preserve its result', body: 'interceptor ${1:Audit}<T>():\n around():\n result = next()\n $0\n return result' },
38
+ { prefix: 'javadoc', description: 'Document intent and labeled inputs', body: '/**\n * ${1:Explain why this declaration exists.}\n * @param ${2:name} ${3:What the input means.}\n */' },
39
+ ];
40
+ export function snippetBody(body, style, tabs = false) {
41
+ if (style === 'braces') {
42
+ const result = [];
43
+ let depth = 0;
44
+ for (const line of body.split('\n')) {
45
+ const level = Math.floor((/^ */.exec(line)?.[0].length ?? 0) / 4);
46
+ while (depth > level)
47
+ result.push(' '.repeat(--depth) + '}');
48
+ if (line.endsWith(':')) {
49
+ result.push(line.slice(0, -1) + ' {');
50
+ depth = level + 1;
51
+ }
52
+ else
53
+ result.push(line);
54
+ }
55
+ while (depth)
56
+ result.push(' '.repeat(--depth) + '}');
57
+ body = result.join('\n');
58
+ }
59
+ return tabs ? body.replace(/^(?: {4})+/gm, prefix => '\t'.repeat(prefix.length / 4)) : body;
60
+ }
@@ -0,0 +1,56 @@
1
+ import { existsSync, lstatSync, readFileSync, renameSync, rmSync, writeFileSync } from 'node:fs';
2
+ import { basename, dirname, relative } from 'node:path';
3
+ import { checkProject } from "./checker.js";
4
+ import { loadProject } from "./project.js";
5
+ import { checkUnitTests, discoverTests, mergeTestAnalysis } from "./testing.js";
6
+ const marker = '// aug-spec: ';
7
+ /** One compiler-managed pointer. It gives readers an action and a precise neighboring filename. */
8
+ export function specHint(file) {
9
+ const newline = file.source.includes('\r\n') ? '\r\n' : '\n';
10
+ const pointer = marker + JSON.stringify(basename(file.path) + '.md') + ' explains this file. Read it before changes; refresh with aug spec.' + newline;
11
+ const old = file.source.startsWith(marker) ? (file.source.includes('\n') ? file.source.indexOf('\n') + 1 : file.source.length) : 0;
12
+ const body = old ? file.source.slice(old) : file.source;
13
+ return { file, text: pointer + body, lineOffset: old ? 0 : 1 };
14
+ }
15
+ /** Prepare hints before native emission so debugger/source-map lines use the updated sources. */
16
+ export function updateSpecHints(checked) {
17
+ const hints = [...checked.project.files.values()].filter(file => !file.builtin && !file.package).map(specHint)
18
+ .filter(hint => hint.text !== hint.file.source);
19
+ if (!hints.length)
20
+ return checked;
21
+ if (checked.diagnostics.some(issue => issue.severity !== 'warning'))
22
+ throw new Error('Fix compiler errors before adding specification pointers');
23
+ for (const { file } of hints) {
24
+ const root = checked.project.root;
25
+ if (relative(root, file.path).startsWith('..'))
26
+ throw new Error('Specification pointer escapes the project');
27
+ let parent = dirname(file.path);
28
+ while (parent !== root && parent !== dirname(parent)) {
29
+ if (lstatSync(parent).isSymbolicLink())
30
+ throw new Error('Specification source directory is a symbolic link');
31
+ parent = dirname(parent);
32
+ }
33
+ if (lstatSync(file.path).isSymbolicLink())
34
+ throw new Error('Specification source is a symbolic link');
35
+ if (readFileSync(file.path, 'utf8') !== file.source)
36
+ throw new Error('Source changed during compilation; retry before generating specifications');
37
+ }
38
+ for (const { file, text } of hints) {
39
+ const temporary = file.path + '.aug-spec-tmp';
40
+ let created = false;
41
+ try {
42
+ writeFileSync(temporary, text, { flag: 'wx', mode: lstatSync(file.path).mode });
43
+ created = true;
44
+ renameSync(temporary, file.path);
45
+ }
46
+ finally {
47
+ if (created && existsSync(temporary))
48
+ rmSync(temporary);
49
+ }
50
+ }
51
+ const project = loadProject(checked.project.root), fresh = checkProject(project), discovery = discoverTests(project);
52
+ const tests = checkUnitTests(project, discovery.tests);
53
+ fresh.diagnostics.push(...discovery.diagnostics, ...tests.flatMap(test => test.checked.diagnostics));
54
+ mergeTestAnalysis(fresh, tests);
55
+ return fresh;
56
+ }