@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
@@ -0,0 +1,88 @@
1
+ import { existsSync, mkdirSync, readFileSync, rmSync, statSync, writeFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ /** Serialize writers while allowing independent projects to share immutable cached Git objects. */
4
+ export function withPackageLock(path, action) {
5
+ const deadline = Date.now() + 30000;
6
+ while (true) {
7
+ try {
8
+ mkdirSync(path);
9
+ break;
10
+ }
11
+ catch (error) {
12
+ if (!error || typeof error !== 'object' || !('code' in error) || error.code !== 'EEXIST')
13
+ throw error;
14
+ let stale = false;
15
+ try {
16
+ const pid = Number(readFileSync(join(path, 'pid'), 'utf8'));
17
+ if (!Number.isSafeInteger(pid) || pid < 1)
18
+ throw new Error('Invalid lock owner');
19
+ try {
20
+ process.kill(pid, 0);
21
+ }
22
+ catch (error) {
23
+ stale = !!error && typeof error === 'object' && 'code' in error && error.code === 'ESRCH';
24
+ }
25
+ }
26
+ catch {
27
+ stale = existsSync(path) && Date.now() - statSync(path).mtimeMs > 180000;
28
+ }
29
+ if (stale) {
30
+ rmSync(path, { recursive: true, force: true });
31
+ continue;
32
+ }
33
+ if (Date.now() >= deadline)
34
+ throw new Error('Another August package installation is still running. Let it finish, then retry. Lock: ' + path);
35
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 100);
36
+ }
37
+ }
38
+ try {
39
+ writeFileSync(join(path, 'pid'), String(process.pid));
40
+ return action();
41
+ }
42
+ finally {
43
+ rmSync(path, { recursive: true, force: true });
44
+ }
45
+ }
46
+ /** Network-backed installs keep the writer lock until the asynchronous action completes. */
47
+ export async function withPackageLockAsync(path, action) {
48
+ const deadline = Date.now() + 30000;
49
+ while (true) {
50
+ try {
51
+ mkdirSync(path);
52
+ break;
53
+ }
54
+ catch (error) {
55
+ if (!error || typeof error !== 'object' || !('code' in error) || error.code !== 'EEXIST')
56
+ throw error;
57
+ let stale = false;
58
+ try {
59
+ const pid = Number(readFileSync(join(path, 'pid'), 'utf8'));
60
+ if (!Number.isSafeInteger(pid) || pid < 1)
61
+ throw new Error('Invalid lock owner');
62
+ try {
63
+ process.kill(pid, 0);
64
+ }
65
+ catch (e) {
66
+ stale = !!e && typeof e === 'object' && 'code' in e && e.code === 'ESRCH';
67
+ }
68
+ }
69
+ catch {
70
+ stale = existsSync(path) && Date.now() - statSync(path).mtimeMs > 180000;
71
+ }
72
+ if (stale) {
73
+ rmSync(path, { recursive: true, force: true });
74
+ continue;
75
+ }
76
+ if (Date.now() >= deadline)
77
+ throw new Error('Another August installation is still running. Lock: ' + path);
78
+ await new Promise(resolve => setTimeout(resolve, 100));
79
+ }
80
+ }
81
+ try {
82
+ writeFileSync(join(path, 'pid'), String(process.pid));
83
+ return await action();
84
+ }
85
+ finally {
86
+ rmSync(path, { recursive: true, force: true });
87
+ }
88
+ }
@@ -2,9 +2,26 @@ import { createHash } from 'node:crypto';
2
2
  import { existsSync, lstatSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, realpathSync, renameSync, rmSync, writeFileSync } from 'node:fs';
3
3
  import { basename, dirname, isAbsolute, join, relative, resolve, sep } from 'node:path';
4
4
  import { spawnSync } from 'node:child_process';
5
+ import { x as extractArchive } from 'tar';
5
6
  import { loadConfig } from "./config.js";
7
+ import { parse } from "./parser.js";
8
+ import { isGitSource, materializeGit, sourceAlias } from "./git-packages.js";
9
+ import { agentInstructions } from "./project-init.js";
10
+ import { withPackageLock } from "./package-locking.js";
11
+ import { validateNativeManifest, readNativeDescriptor } from "./native-contracts.js";
6
12
  export const compilerVersion = () => JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')).version;
7
13
  export const packageAlias = (name) => /^[a-z][a-z0-9_]*$/.test(name) && name !== 'august';
14
+ /** Repository imports declare their dependencies beside the code that uses them. */
15
+ export function packageSpecifications(sourceRoot, declared, overrides = new Map()) {
16
+ const specifications = { ...declared };
17
+ for (const path of sourcePaths(sourceRoot)) {
18
+ const file = parse(path, overrides.get(path) ?? readFileSync(path, 'utf8')).file;
19
+ for (const item of file.items)
20
+ if (item.kind === 'import' && isGitSource(item.from[0]))
21
+ specifications[sourceAlias(item.from[0])] = item.from[0];
22
+ }
23
+ return ordered(specifications);
24
+ }
8
25
  const version = /^\d+\.\d+\.\d+(?:-[A-Za-z0-9.-]+)?$/;
9
26
  const npmName = /^(?:@[a-z0-9][a-z0-9._-]*\/)?[a-z0-9][a-z0-9._-]*$/;
10
27
  const json = (file) => JSON.parse(readFileSync(file, 'utf8'));
@@ -38,8 +55,11 @@ export function sourcePaths(root) {
38
55
  if (entry.name.startsWith('.') || ['node_modules', 'dist'].includes(entry.name))
39
56
  continue;
40
57
  const file = join(root, entry.name);
41
- if (entry.isSymbolicLink())
42
- throw new Error(`Package source cannot contain a symlink: ${file}`);
58
+ if (entry.isSymbolicLink()) {
59
+ if (entry.name.endsWith('.aug'))
60
+ throw new Error(`Package source cannot contain a symbolic link: ${file}`);
61
+ continue;
62
+ }
43
63
  if (entry.isDirectory())
44
64
  result.push(...sourcePaths(file));
45
65
  else if (entry.isFile() && entry.name.endsWith('.aug'))
@@ -48,10 +68,19 @@ export function sourcePaths(root) {
48
68
  return result;
49
69
  }
50
70
  export function readPackage(directory) {
51
- const manifest = json(join(directory, 'aug-package.json'));
52
- if (manifest.format !== 1 || !npmName.test(manifest.name ?? '') || !version.test(manifest.version ?? '') ||
71
+ const manifest = existsSync(join(directory, 'aug-package.json')) ? json(join(directory, 'aug-package.json')) : {
72
+ format: 1, name: 'aug-' + sourceAlias(realpathSync(directory)), version: '0.0.0', compiler: compilerVersion(),
73
+ source: existsSync(join(directory, 'export.aug')) ? '.' : 'src', dependencies: {}
74
+ };
75
+ if (![1, 2].includes(manifest.format) || !npmName.test(manifest.name ?? '') || !version.test(manifest.version ?? '') ||
53
76
  manifest.compiler !== compilerVersion())
54
77
  throw new Error(`Invalid August package or compiler mismatch in ${directory}; expected compiler ${compilerVersion()}`);
78
+ if (manifest.format === 1 && manifest.native !== undefined)
79
+ throw new Error('Native packages require manifest format 2');
80
+ if (manifest.format === 2) {
81
+ manifest.native = validateNativeManifest(manifest.native);
82
+ readNativeDescriptor(directory, manifest.native);
83
+ }
55
84
  if (typeof manifest.source !== 'string' || !manifest.source || isAbsolute(manifest.source))
56
85
  throw new Error('Package source must be a relative folder');
57
86
  const sourceRoot = realpathSync(resolve(directory, manifest.source));
@@ -64,12 +93,14 @@ export function readPackage(directory) {
64
93
  throw new Error(`Invalid package dependency ${alias}`);
65
94
  normalizeSpecifier(spec, directory, false);
66
95
  }
67
- const published = json(join(directory, 'package.json'));
68
- if (published.name !== manifest.name || published.version !== manifest.version)
96
+ const published = existsSync(join(directory, 'package.json')) ? json(join(directory, 'package.json')) : undefined;
97
+ if (published && (published.name !== manifest.name || published.version !== manifest.version))
69
98
  throw new Error('package.json and aug-package.json names/versions must match');
70
- const declared = manifest.dependencies ?? {}, actual = published.dependencies ?? {};
71
- if (Object.keys(actual).length !== Object.keys(declared).length || Object.entries(declared).some(([alias, spec]) => actual[alias] !== spec))
72
- throw new Error('package.json dependencies must match the August dependency aliases; aug package pack synchronizes them');
99
+ const configuration = loadConfig(directory);
100
+ if (configuration.diagnostics.length)
101
+ throw new Error(`Invalid package configuration in ${directory}: ${configuration.diagnostics.map(issue => issue.message).join('; ')}`);
102
+ manifest.dependencies = { ...configuration.config.packages, ...manifest.dependencies };
103
+ const declared = manifest.dependencies ?? {};
73
104
  for (const alias of Object.keys(declared))
74
105
  assertAlias(sourceRoot, alias);
75
106
  return { manifest, sourceRoot };
@@ -81,6 +112,8 @@ function assertAlias(root, alias) {
81
112
  throw new Error(`Package alias ${alias} conflicts with a local module`);
82
113
  }
83
114
  function normalizeSpecifier(spec, root, requirePath = true) {
115
+ if (isGitSource(spec))
116
+ return spec;
84
117
  if (spec.startsWith('npm:')) {
85
118
  const match = /^npm:((?:@[^/]+\/)?[^@]+)@(.+)$/.exec(spec);
86
119
  if (!match || !npmName.test(match[1]) || !version.test(match[2]))
@@ -101,7 +134,7 @@ function normalizeSpecifier(spec, root, requirePath = true) {
101
134
  }
102
135
  function packageDigest(directory, sourceRoot) {
103
136
  const hash = createHash('sha256');
104
- for (const file of [join(directory, 'aug-package.json'), join(directory, 'package.json'), ...sourcePaths(sourceRoot)].sort()) {
137
+ for (const file of [join(directory, 'aug-package.json'), join(directory, 'package.json'), join(directory, 'native.abi.json'), join(directory, 'THIRD_PARTY_NOTICES.md'), ...sourcePaths(sourceRoot)].filter(existsSync).sort()) {
105
138
  hash.update(relative(directory, file).replaceAll('\\', '/'));
106
139
  hash.update('\0');
107
140
  hash.update(readFileSync(file));
@@ -111,7 +144,7 @@ function packageDigest(directory, sourceRoot) {
111
144
  }
112
145
  /** Compilation reads only a verified installed snapshot. It never fetches dependencies. */
113
146
  export function projectPackages(root, specifications, sourceFolder = root) {
114
- const result = { roots: new Map(), scopes: new Map(), diagnostics: [] };
147
+ const result = { roots: new Map(), scopes: new Map(), diagnostics: [], specifications };
115
148
  if (!Object.keys(specifications).length)
116
149
  return result;
117
150
  try {
@@ -130,10 +163,12 @@ export function projectPackages(root, specifications, sourceFolder = root) {
130
163
  if (manifest.name !== entry.name || manifest.version !== entry.version || manifest.source !== entry.source ||
131
164
  packageDigest(directory, sourceRoot) !== entry.digest)
132
165
  throw new Error(`Installed ${entry.name} changed; run aug install`);
166
+ if (JSON.stringify(entry.native) !== JSON.stringify(manifest.native))
167
+ throw new Error(`NATIVE_LOCK: Native metadata for ${entry.name} differs from its verified source manifest; run aug install`);
133
168
  if (result.scopes.has(entry.path))
134
169
  throw new Error('Duplicate package lock path');
135
170
  manifests.set(entry.path, manifest);
136
- result.scopes.set(entry.path, { ...entry, directory, sourceRoot });
171
+ result.scopes.set(entry.path, { ...entry, native: manifest.native, directory, sourceRoot, specifications: manifest.dependencies ?? {} });
137
172
  }
138
173
  verifyIdentities(lock.packages);
139
174
  for (const scope of result.scopes.values()) {
@@ -179,76 +214,212 @@ export function projectPackages(root, specifications, sourceFolder = root) {
179
214
  }
180
215
  function npm(args, cwd) {
181
216
  const process = spawnSync('npm', args, { cwd, encoding: 'utf8', timeout: 120000 });
182
- if (process.error || process.status !== 0)
183
- throw new Error(process.error?.message ?? process.stderr ?? 'npm failed');
217
+ if (process.error)
218
+ throw new Error(`Cannot install August packages: ${'code' in process.error && process.error.code === 'ENOENT' ? 'npm is missing from PATH. Install Node.js 24 or newer, which includes npm.' : process.error.message}\nRetry aug run after fixing the package installer.`);
219
+ if (process.status !== 0)
220
+ throw new Error(`August package installation failed.\n${(process.stderr || process.stdout || `npm exited ${process.status}`).trim()}\nCheck the package versions and paths in main.yaml, your network connection, and npm registry configuration. Retry aug run; use aug install for an explicit installation.`);
184
221
  return process.stdout;
185
222
  }
186
- export function installPackages(root, frozen = false, offline = false) {
223
+ /** Running an application prepares its declared packages; checking remains read-only. */
224
+ export function prepareRunPackages(root, offline = false, frozen = false) {
225
+ const loaded = loadConfig(root);
226
+ if (loaded.diagnostics.length)
227
+ return; // The checker renders the configuration's source diagnostics.
228
+ const library = isLibrary(root) ? readPackage(root) : undefined;
229
+ const specifications = packageSpecifications(library?.sourceRoot ?? root, library?.manifest.dependencies ?? loaded.config.packages);
230
+ const lockPath = join(root, 'aug.lock.json');
231
+ let lock;
232
+ if (existsSync(lockPath)) {
233
+ try {
234
+ lock = json(lockPath);
235
+ }
236
+ catch {
237
+ throw new Error('aug.lock.json is unreadable. Restore it from version control or run aug install to recreate it.');
238
+ }
239
+ if (lock?.format !== 1 || !Array.isArray(lock.packages) || !lock.specifications || typeof lock.specifications !== 'object')
240
+ throw new Error('aug.lock.json has an unsupported structure. Run aug install to recreate it.');
241
+ }
242
+ const matching = lock?.compiler === compilerVersion() && sameSpecifications(lock.specifications, specifications);
243
+ if (!matching) {
244
+ if (!lock && !Object.keys(specifications).length)
245
+ return;
246
+ if (frozen)
247
+ throw new Error('PACKAGE_LOCK: Frozen run requires a matching aug.lock.json for the current imports, configuration and compiler. Run aug install before retrying.');
248
+ process.stderr.write('Installing August packages declared by imports and main.yaml…\n');
249
+ installPackages(root, false, offline);
250
+ return;
251
+ }
252
+ const snapshot = resolve(root, '.aug-packages');
253
+ const missing = lock.packages.some(entry => {
254
+ if (typeof entry.path !== 'string' || isAbsolute(entry.path) || !inside(snapshot, resolve(snapshot, entry.path)))
255
+ throw new Error('Package lock contains a path outside its snapshot. Run aug install to recreate it.');
256
+ return !existsSync(resolve(snapshot, entry.path));
257
+ });
258
+ if (missing) {
259
+ process.stderr.write('Restoring August packages from aug.lock.json…\n');
260
+ installPackages(root, true, offline);
261
+ }
262
+ // projectPackages checks contents and integrity before compilation. Changed installed sources are never silently replaced.
263
+ }
264
+ export function installPackages(root, frozen = false, offline = false, update = false) {
265
+ return withPackageLock(join(root, '.aug-install.lock'), () => installLocked(root, frozen, offline, update));
266
+ }
267
+ function installLocked(root, frozen, offline, update) {
268
+ if (frozen && update)
269
+ throw new Error('--frozen and --update cannot be used together.');
187
270
  const loaded = loadConfig(root);
188
271
  if (loaded.diagnostics.length)
189
272
  throw new Error(loaded.diagnostics.map(issue => issue.message).join('\n'));
190
- const library = existsSync(join(root, 'aug-package.json')) ? json(join(root, 'aug-package.json')) : undefined;
191
- if (library)
192
- preparePackage(root);
193
- const specifications = ordered(library?.dependencies ?? loaded.config.packages);
273
+ const library = isLibrary(root) ? readPackage(root) : undefined;
274
+ const specifications = packageSpecifications(library?.sourceRoot ?? root, library?.manifest.dependencies ?? loaded.config.packages);
194
275
  for (const alias of Object.keys(specifications))
195
- assertAlias(library ? resolve(root, library.source) : root, alias);
276
+ assertAlias(library?.sourceRoot ?? root, alias);
196
277
  const lockPath = join(root, 'aug.lock.json');
197
278
  const previous = existsSync(lockPath) ? json(lockPath) : undefined;
198
- const same = previous?.compiler === compilerVersion() && sameSpecifications(previous.specifications, specifications);
279
+ const same = !update && previous?.compiler === compilerVersion() && sameSpecifications(previous.specifications, specifications);
199
280
  if (frozen && !same)
200
281
  throw new Error('Frozen installation requires a matching aug.lock.json');
282
+ return installSourceGraph(root, specifications, frozen, offline, same ? previous : undefined);
283
+ }
284
+ const isLibrary = (root) => existsSync(join(root, 'aug-package.json')) ||
285
+ !existsSync(join(root, 'main.aug')) && (existsSync(join(root, 'export.aug')) || existsSync(join(root, 'src/export.aug')));
286
+ const selectedSource = (file) => file.endsWith('.aug') || ['aug-package.json', 'package.json', 'main.yaml', 'README.md', 'LICENSE', 'native.abi.json', 'THIRD_PARTY_NOTICES.md'].includes(file);
287
+ function copySource(origin, destination) {
288
+ let bytes = 0, count = 0;
289
+ const copy = (folder) => {
290
+ for (const entry of readdirSync(folder, { withFileTypes: true })) {
291
+ if (entry.name.startsWith('.') || ['node_modules', 'dist'].includes(entry.name))
292
+ continue;
293
+ const file = join(folder, entry.name), name = relative(origin, file);
294
+ if (entry.isDirectory())
295
+ copy(file);
296
+ else if (selectedSource(name)) {
297
+ if (!entry.isFile())
298
+ throw new Error('Package source must contain regular files: ' + name);
299
+ const data = readFileSync(file);
300
+ bytes += data.length;
301
+ if (++count > 10000 || bytes > 32 * 1024 * 1024)
302
+ throw new Error('Source package exceeds 10,000 files or 32 MiB.');
303
+ mkdirSync(dirname(join(destination, name)), { recursive: true });
304
+ writeFileSync(join(destination, name), data);
305
+ }
306
+ }
307
+ };
308
+ copy(origin);
309
+ }
310
+ function unpackSource(archive, destination) {
311
+ let bytes = 0, count = 0;
312
+ const paths = new Set();
313
+ extractArchive({ file: archive, cwd: destination, strip: 1, sync: true, strict: true, filter: (path, entry) => {
314
+ if (!('type' in entry))
315
+ throw new Error('Expected an archive entry.');
316
+ const parts = path.split('/');
317
+ if (isAbsolute(path) || path.includes('\\') || parts.some(part => part === '..'))
318
+ throw new Error('Package archive contains a path outside its folder.');
319
+ const name = parts.slice(1).join('/');
320
+ if (entry.type === 'Directory')
321
+ return false;
322
+ if (!selectedSource(name))
323
+ return false;
324
+ if (entry.type !== 'File' || !name || parts[0] !== 'package' || parts.slice(1).some(part => !part || part.startsWith('.')))
325
+ throw new Error('Package archive source must be regular files inside package/.');
326
+ if (paths.has(name))
327
+ throw new Error('Package archive repeats a source file: ' + name);
328
+ paths.add(name);
329
+ bytes += entry.size;
330
+ if (++count > 10000 || bytes > 32 * 1024 * 1024)
331
+ throw new Error('Source package exceeds 10,000 files or 32 MiB.');
332
+ return true;
333
+ } });
334
+ }
335
+ /** Git libraries use the same checked source graph as registry libraries. No remote program is executed. */
336
+ function installSourceGraph(root, specifications, frozen, offline, previous) {
201
337
  const stage = realpathSync(mkdtempSync(join(root, '.aug-install-')));
338
+ const packages = new Map(), visited = new Map();
339
+ const gitSources = new Map();
340
+ const registry = {};
341
+ const locked = new Map((previous?.git ?? []).map(source => [source.request, source]));
342
+ const visit = (spec, owner) => {
343
+ const normalized = normalizeSpecifier(spec, owner);
344
+ if (visited.has(normalized))
345
+ return visited.get(normalized);
346
+ if (visited.size >= 1000)
347
+ throw new Error('Package graph exceeds 1,000 source packages.');
348
+ const identity = normalized.startsWith('file:') ? 'file:' + relative(root, normalized.slice(5)).replaceAll('\\', '/') : normalized;
349
+ const path = 'packages/' + sourceAlias(identity), directory = join(stage, path);
350
+ visited.set(normalized, path);
351
+ mkdirSync(directory, { recursive: true });
352
+ let origin = directory;
353
+ let source;
354
+ if (isGitSource(normalized)) {
355
+ source = materializeGit(normalized, directory, offline, locked.get(normalized));
356
+ gitSources.set(normalized, source);
357
+ }
358
+ else if (normalized.startsWith('file:') && lstatSync(normalized.slice(5)).isDirectory()) {
359
+ origin = normalized.slice(5);
360
+ copySource(origin, directory);
361
+ }
362
+ else {
363
+ const transport = join(stage, 'transport', sourceAlias(normalized));
364
+ mkdirSync(transport, { recursive: true });
365
+ const request = normalized.startsWith('npm:') ? normalized.slice(4) : normalized.slice(5);
366
+ const packed = JSON.parse(npm(['pack', request, '--ignore-scripts', '--json', '--pack-destination', transport,
367
+ ...(offline ? ['--offline'] : [])], transport))[0];
368
+ if (!packed?.filename || !/^sha512-[A-Za-z0-9+/=]+$/.test(packed.integrity ?? ''))
369
+ throw new Error('Package archive is missing its SHA-512 integrity.');
370
+ registry[normalized] = { integrity: packed.integrity, name: packed.name, version: packed.version };
371
+ const archive = join(transport, basename(packed.filename));
372
+ const actual = 'sha512-' + createHash('sha512').update(readFileSync(archive)).digest('base64');
373
+ if (actual !== packed.integrity)
374
+ throw new Error('Package archive integrity mismatch.');
375
+ if (frozen && JSON.stringify(previous?.npm?.[normalized]) !== JSON.stringify(registry[normalized]))
376
+ throw new Error('Frozen package archive changed. Publish a new version instead of replacing an archive.');
377
+ unpackSource(archive, directory);
378
+ }
379
+ if (!existsSync(join(directory, 'aug-package.json'))) {
380
+ const folder = existsSync(join(directory, 'export.aug')) ? '.' : 'src';
381
+ const published = existsSync(join(directory, 'package.json')) ? json(join(directory, 'package.json')) : undefined;
382
+ writeJson(join(directory, 'aug-package.json'), { format: 1,
383
+ name: published?.name ?? '@git/' + sourceAlias(source ? source.repository + '/' + source.folder : identity),
384
+ version: published?.version ?? (source ? '0.0.0-git.' + source.commit : '0.0.0'),
385
+ compiler: compilerVersion(), source: folder, dependencies: published?.dependencies ?? {} });
386
+ }
387
+ const manifest = json(join(directory, 'aug-package.json'));
388
+ // A Git folder owns its August manifest. npm metadata and lifecycle scripts have no role here.
389
+ const dependencies = packageSpecifications(resolve(directory, manifest.source), { ...loadConfig(directory).config.packages, ...manifest.dependencies });
390
+ manifest.dependencies = dependencies;
391
+ writeJson(join(directory, 'aug-package.json'), manifest);
392
+ writeJson(join(directory, 'package.json'), { name: manifest.name, version: manifest.version, private: true, dependencies });
393
+ const { sourceRoot } = readPackage(directory);
394
+ const entry = { path, name: manifest.name, version: manifest.version, source: manifest.source,
395
+ digest: packageDigest(directory, sourceRoot), dependencies: {}, ...(manifest.native ? { native: manifest.native } : {}) };
396
+ packages.set(path, entry);
397
+ for (const [alias, request] of Object.entries(dependencies)) {
398
+ entry.dependencies[alias] = visit(request, origin);
399
+ verifyReference(request, packages.get(entry.dependencies[alias]));
400
+ }
401
+ return path;
402
+ };
202
403
  try {
203
- const dependencies = Object.fromEntries(Object.entries(specifications).map(([alias, spec]) => {
204
- const normalized = normalizeSpecifier(spec, root);
205
- return [alias, normalized.startsWith('file:') ? 'file:' + relative(stage, normalized.slice(5)).replaceAll('\\', '/') : normalized];
206
- }));
207
- writeJson(join(stage, 'package.json'), { name: 'august-project-dependencies', version: '0.0.0', private: true, dependencies });
208
- if (same && previous?.npm)
209
- writeJson(join(stage, 'package-lock.json'), previous.npm);
210
- npm([frozen ? 'ci' : 'install', '--ignore-scripts', '--install-links', '--bin-links=false', '--no-audit', '--no-fund',
211
- ...(offline ? ['--offline'] : [])], stage);
212
- const packages = new Map();
213
- const visit = (directory) => {
214
- const actual = realpathSync(directory);
215
- if (!inside(stage, actual))
216
- throw new Error('Package installer did not create a self-contained snapshot');
217
- const path = relative(stage, actual).replaceAll('\\', '/');
218
- if (packages.has(path))
219
- return path;
220
- const { manifest, sourceRoot } = readPackage(actual);
221
- const entry = { path, name: manifest.name, version: manifest.version, source: manifest.source,
222
- digest: packageDigest(actual, sourceRoot), dependencies: {} };
223
- packages.set(path, entry);
224
- for (const alias of Object.keys(manifest.dependencies ?? {})) {
225
- let owner = actual;
226
- while (inside(stage, owner) && !existsSync(join(owner, 'node_modules', alias, 'aug-package.json')))
227
- owner = dirname(owner);
228
- if (!inside(stage, owner))
229
- throw new Error(`${manifest.name} is missing dependency ${alias}`);
230
- entry.dependencies[alias] = visit(join(owner, 'node_modules', alias));
231
- verifyReference(manifest.dependencies[alias], packages.get(entry.dependencies[alias]));
232
- }
233
- return path;
234
- };
235
- const roots = Object.fromEntries(Object.keys(specifications).map(alias => [alias, visit(join(stage, 'node_modules', alias))]));
236
- const lock = { format: 1, compiler: compilerVersion(), specifications, roots,
237
- packages: [...packages.values()].sort((a, b) => a.path.localeCompare(b.path)), npm: json(join(stage, 'package-lock.json')) };
238
- verifyIdentities(lock.packages);
239
- for (const [alias, path] of Object.entries(roots))
240
- verifyReference(specifications[alias], packages.get(path));
241
- if (frozen && JSON.stringify(lock.packages) !== JSON.stringify(previous.packages))
242
- throw new Error('Frozen package contents changed; update the lock explicitly with aug install');
404
+ const roots = Object.fromEntries(Object.entries(specifications).map(([alias, request]) => [alias, visit(request, root)]));
405
+ verifyIdentities(packages.values());
406
+ const lock = { format: 1, compiler: compilerVersion(), specifications, roots, npm: registry,
407
+ git: [...gitSources.values()].sort((a, b) => a.request.localeCompare(b.request)),
408
+ packages: [...packages.values()].sort((a, b) => a.path.localeCompare(b.path)) };
409
+ if (previous?.native && JSON.stringify(lock.packages) === JSON.stringify(previous.packages))
410
+ lock.native = previous.native;
411
+ if (frozen && JSON.stringify(lock.packages) !== JSON.stringify(previous?.packages))
412
+ throw new Error('Frozen package contents changed; use aug install --update to choose new revisions.');
413
+ rmSync(join(stage, 'transport'), { recursive: true, force: true });
243
414
  const cache = join(root, '.aug-packages'), backup = join(root, '.aug-packages-old');
244
415
  if (existsSync(backup))
245
- throw new Error('Previous package install backup exists; inspect .aug-packages-old before installing');
416
+ throw new Error('Previous package install backup exists; inspect .aug-packages-old before installing.');
246
417
  if (existsSync(cache))
247
418
  renameSync(cache, backup);
248
419
  try {
249
420
  renameSync(stage, cache);
250
- writeJson(lockPath + '.tmp', lock);
251
- renameSync(lockPath + '.tmp', lockPath);
421
+ writeJson(join(root, 'aug.lock.json.tmp'), lock);
422
+ renameSync(join(root, 'aug.lock.json.tmp'), join(root, 'aug.lock.json'));
252
423
  }
253
424
  catch (error) {
254
425
  rmSync(cache, { recursive: true, force: true });
@@ -263,16 +434,18 @@ export function installPackages(root, frozen = false, offline = false) {
263
434
  rmSync(stage, { recursive: true, force: true });
264
435
  }
265
436
  }
266
- export function initPackage(directory, name) {
437
+ export function initPackage(directory, name, npmMetadata = false) {
267
438
  if (!npmName.test(name))
268
439
  throw new Error('Package name must be an npm name, for example @owner/aug-math');
269
440
  if (existsSync(directory) && readdirSync(directory).length)
270
441
  throw new Error('Package init requires a new or empty directory');
271
442
  mkdirSync(join(directory, 'src'), { recursive: true });
443
+ writeFileSync(join(directory, 'AGENTS.md'), agentInstructions);
272
444
  const manifest = { format: 1, name, version: '0.1.0', compiler: compilerVersion(), source: 'src', dependencies: {} };
273
445
  writeJson(join(directory, 'aug-package.json'), manifest);
274
- writeJson(join(directory, 'package.json'), { name, version: manifest.version, description: 'An August source library',
275
- files: ['src', '.aug-spec', 'aug-package.json', 'README.md', 'LICENSE'], exports: { './aug-package.json': './aug-package.json' }, dependencies: {} });
446
+ if (npmMetadata)
447
+ writeJson(join(directory, 'package.json'), { name, version: manifest.version, description: 'An August source library',
448
+ files: ['src', '.aug-spec', 'aug-package.json', 'README.md', 'LICENSE'], exports: { './aug-package.json': './aug-package.json' }, dependencies: {} });
276
449
  writeFileSync(join(directory, 'src/export.aug'), 'export add from arithmetic\n');
277
450
  writeFileSync(join(directory, 'src/arithmetic.aug'), '/** Add two integers. @param left First value. @param right Second value. @return Their sum. */\nadd(int left, int right) returns int {\n return left + right\n}\n\ntest add {\n when addition {\n it adds_two_integers {\n assert(add(left=2, right=3) == 5)\n }\n }\n}\n');
278
451
  writeFileSync(join(directory, 'README.md'), `# ${name}\n\nAugust ${compilerVersion()} source library. Public exports live in src/export.aug.\n`);
@@ -281,11 +454,13 @@ export function initPackage(directory, name) {
281
454
  /** Synchronize transport metadata; August's manifest owns dependency aliases. */
282
455
  export function preparePackage(root) {
283
456
  const manifest = json(join(root, 'aug-package.json'));
284
- const transport = json(join(root, 'package.json'));
457
+ const transport = existsSync(join(root, 'package.json')) ? json(join(root, 'package.json')) : {};
285
458
  transport.name = manifest.name;
286
459
  transport.version = manifest.version;
287
460
  transport.dependencies = manifest.dependencies ?? {};
288
461
  transport.files = [...new Set([...(Array.isArray(transport.files) ? transport.files : ['README.md', 'LICENSE']), manifest.source, '.aug-spec', 'aug-package.json'])];
462
+ if (manifest.native)
463
+ transport.files.push('native.abi.json', 'THIRD_PARTY_NOTICES.md');
289
464
  writeJson(join(root, 'package.json'), transport);
290
465
  readPackage(root);
291
466
  }
@@ -297,3 +472,27 @@ export function packPackage(root) {
297
472
  throw new Error('npm pack returned no archive');
298
473
  return join(destination, basename(result.filename));
299
474
  }
475
+ /** Give a source package a short import name and install its verified dependency graph. */
476
+ export function addPackage(root, request, alias, offline = false) {
477
+ const loaded = loadConfig(root);
478
+ if (loaded.diagnostics.length)
479
+ throw new Error(loaded.diagnostics.map(issue => issue.message).join('\n'));
480
+ assertAlias(isLibrary(root) ? readPackage(root).sourceRoot : root, alias);
481
+ normalizeSpecifier(request, root);
482
+ const path = join(root, 'main.yaml'), existed = existsSync(path), before = existed ? readFileSync(path, 'utf8') : '';
483
+ const dependencies = { ...loaded.config.packages, [alias]: request };
484
+ const block = 'packages:\n' + Object.entries(ordered(dependencies)).map(([name, value]) => ' ' + name + ': ' + JSON.stringify(value)).join('\n') + '\n';
485
+ const expression = /^packages:[^\n]*(?:\n|$)(?:[ \t][^\n]*(?:\n|$)|\n)*/m;
486
+ const after = expression.test(before) ? before.replace(expression, block) : before.trimEnd() + (before.trim() ? '\n\n' : '') + block;
487
+ writeFileSync(path, after);
488
+ try {
489
+ return installPackages(root, false, offline);
490
+ }
491
+ catch (error) {
492
+ if (existed)
493
+ writeFileSync(path, before);
494
+ else
495
+ rmSync(path, { force: true });
496
+ throw error;
497
+ }
498
+ }
package/src/parser.js CHANGED
@@ -218,8 +218,14 @@ class Parser {
218
218
  return { kind: 'composition', name, typeParams: [], bindings, span: this.span(start) };
219
219
  }
220
220
  if (this.at('extern')) {
221
- this.take();
221
+ const start = this.take().span;
222
222
  this.expect('C');
223
+ if (this.current().value === 'resource') {
224
+ this.take();
225
+ const name = this.expect('identifier').value;
226
+ this.endStatement();
227
+ return { kind: 'resource', name, typeParams: [], span: this.span(start) };
228
+ }
223
229
  return this.parseFunction(true);
224
230
  }
225
231
  if (this.looksLikeBareClass())
@@ -395,6 +401,11 @@ class Parser {
395
401
  this.parseTypeParams();
396
402
  if (this.at('('))
397
403
  this.parseParams(true);
404
+ if (this.match('unless')) {
405
+ this.parseType();
406
+ while (this.match('and') || this.match(','))
407
+ this.parseType();
408
+ }
398
409
  if (this.match('=>')) {
399
410
  return true;
400
411
  }
@@ -416,7 +427,9 @@ class Parser {
416
427
  while (!everything && this.match('and'))
417
428
  names.push(this.expect('identifier').value);
418
429
  this.expect('from');
419
- const from = [this.expect('identifier').value];
430
+ const from = [this.at('string') ? this.take().value : this.expect('identifier').value];
431
+ if (!/^(?:https:\/\/|git\+(?:https|file):\/\/)/.test(from[0]) && this.tokens[this.position - 1].kind === 'string')
432
+ throw new ParseFailure({ ...start, code: 'IMPORT', message: 'A quoted import source must be a public repository URL' });
420
433
  while (this.match('.'))
421
434
  from.push(this.expect('identifier').value);
422
435
  this.endStatement();
@@ -462,11 +475,13 @@ class Parser {
462
475
  const header = this.parseTypeParams();
463
476
  const fields = this.parseParams(true);
464
477
  const validationErrors = [];
465
- if (this.match('unless')) {
478
+ const validationDeclared = !!this.match('unless');
479
+ if (validationDeclared) {
466
480
  validationErrors.push(this.parseType());
467
481
  while (this.match('and') || this.match(','))
468
482
  validationErrors.push(this.parseType());
469
483
  }
484
+ const headerEnd = this.current().span.start;
470
485
  let constructorBody = this.match('=>') ? this.parseBlock(start) : undefined;
471
486
  let hasBody = !!constructorBody;
472
487
  if (!constructorBody && (this.at('{') || this.at(':'))) {
@@ -486,13 +501,20 @@ class Parser {
486
501
  if (!hasBody)
487
502
  this.endStatement();
488
503
  return { kind: 'class', record: true, name, ...header, fields, constructorBody,
489
- validationErrors, implements: [], methods: [], span: this.span(start) };
504
+ validationErrors, validationDeclared, headerEnd, implements: [], methods: [], span: this.span(start) };
490
505
  }
491
506
  parseClass() {
492
507
  const start = this.current().span;
493
508
  const name = this.expect('identifier').value;
494
509
  const { typeParams, typeConstraints, typeVariance } = this.parseTypeParams();
495
510
  const fields = this.at('(') ? this.parseParams(true) : [];
511
+ const validationErrors = [];
512
+ const validationDeclared = !!this.match('unless');
513
+ if (validationDeclared) {
514
+ validationErrors.push(this.parseType());
515
+ while (this.match('and') || this.match(','))
516
+ validationErrors.push(this.parseType());
517
+ }
496
518
  let constructorBody = this.match('=>') ? this.parseBlock(start) : undefined;
497
519
  const implemented = [];
498
520
  if (!this.at('implements'))
@@ -502,6 +524,7 @@ class Parser {
502
524
  implemented.push(this.parseType());
503
525
  while (this.match(','))
504
526
  implemented.push(this.parseType());
527
+ const headerEnd = this.current().span.start;
505
528
  this.openBlock(start);
506
529
  const methods = [];
507
530
  const stateFields = [];
@@ -537,7 +560,7 @@ class Parser {
537
560
  }
538
561
  this.closeBrace();
539
562
  return { kind: 'class', name, typeParams, typeConstraints, typeVariance, fields, stateFields, constructorBody,
540
- implements: implemented, methods, span: this.span(start) };
563
+ validationErrors, validationDeclared, implements: implemented, methods, headerEnd, span: this.span(start) };
541
564
  }
542
565
  parseInterface() {
543
566
  const keyword = this.take();
@@ -638,13 +661,16 @@ class Parser {
638
661
  } while (this.match(',') || this.match('and'));
639
662
  }
640
663
  }
664
+ const headerEnd = this.current().span.start;
641
665
  const body = this.at('{') || this.at(':') ? this.parseBlock(start) : (this.endStatement(), undefined);
642
666
  if (externC && body) {
643
667
  throw new ParseFailure({ file: start.file, line: start.line, column: start.column,
644
668
  message: 'extern C functions cannot have a body', code: 'PARSE' });
645
669
  }
646
670
  return { kind: 'function', name, typeParams, typeConstraints, typeVariance, params, returns, returnOwnership,
647
- throws, changes, uses, body, externC, valueAbi, nativePure, endpoint, annotations, span: this.span(start) };
671
+ throws, changes, uses, body, externC, valueAbi, nativePure, endpoint, annotations,
672
+ declared: { returns: clauses.has('returns') || clauses.has('streams'), errors: clauses.has('unless'),
673
+ changes: clauses.has('changes'), uses: clauses.has('uses') }, headerEnd, span: this.span(start) };
648
674
  }
649
675
  parseTypeParams() {
650
676
  if (!this.match('<'))