@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.
- package/README.md +9 -6
- package/THIRD_PARTY_NOTICES.md +4 -0
- package/bin/aug.mjs +12 -2
- package/docs/about.md +27 -0
- package/docs/api/crypto.md +103 -69
- package/docs/api/io.md +35 -33
- package/docs/api/json.md +3 -3
- package/docs/api/memory.md +23 -19
- package/docs/api/time.md +10 -9
- package/docs/api/web.md +33 -38
- package/docs/assets/benchmarks/execution.svg +774 -637
- package/docs/assets/benchmarks/http.svg +278 -249
- package/docs/assets/benchmarks/improvements.svg +66 -66
- package/docs/assets/benchmarks/kernels-mobile.svg +1 -0
- package/docs/assets/benchmarks/kernels.svg +1 -0
- package/docs/assets/benchmarks/memory.svg +153 -153
- package/docs/benchmark-results.json +227089 -90363
- package/docs/compatibility.md +8 -8
- package/docs/contributing-benchmarks.md +68 -0
- package/docs/dev-containers.md +88 -0
- package/docs/dgx-consumers.json +122 -0
- package/docs/dgx-gyms.json +784 -0
- package/docs/dgx-kernels.json +1170 -0
- package/docs/dgx-performance.json +227849 -0
- package/docs/dgx-spark.md +64 -0
- package/docs/diagnostics.md +15 -5
- package/docs/docker.md +173 -12
- package/docs/editor.md +35 -0
- package/docs/example-projects.json +238 -24
- package/docs/examples/approved-design/counters.md +34 -126
- package/docs/examples/approved-design/dependencies/august/0.21.0/io/contracts.md +178 -0
- package/docs/examples/approved-design/domain/app.md +13 -77
- package/docs/examples/approved-design/domain/export.md +5 -19
- package/docs/examples/approved-design/domain/models.md +4 -23
- package/docs/examples/approved-design/domain/numbers.md +24 -114
- package/docs/examples/approved-design/index.md +16 -7
- package/docs/examples/approved-design/main.md +19 -96
- package/docs/examples/benchmark/index.md +6 -5
- package/docs/examples/benchmark/main.md +7 -35
- package/docs/examples/calls-benchmark/index.md +36 -0
- package/docs/examples/calls-benchmark/main.md +78 -0
- package/docs/examples/calls-benchmark/operations.md +60 -0
- package/docs/examples/cli-args/index.md +6 -5
- package/docs/examples/cli-args/main.md +6 -31
- package/docs/examples/collections/index.md +6 -5
- package/docs/examples/collections/main.md +7 -35
- package/docs/examples/collections-benchmark/index.md +6 -5
- package/docs/examples/collections-benchmark/main.md +7 -35
- package/docs/examples/cpu-benchmark/index.md +6 -5
- package/docs/examples/cpu-benchmark/main.md +5 -24
- package/docs/examples/developer-workflow/calculator.md +39 -186
- package/docs/examples/developer-workflow/dependencies/august/0.21.0/io/contracts.md +178 -0
- package/docs/examples/developer-workflow/index.md +16 -7
- package/docs/examples/developer-workflow/logging/console.md +10 -56
- package/docs/examples/developer-workflow/logging/export.md +4 -14
- package/docs/examples/developer-workflow/logging/logger.md +7 -43
- package/docs/examples/developer-workflow/main.md +17 -69
- package/docs/examples/drop/index.md +6 -5
- package/docs/examples/drop/main.md +7 -27
- package/docs/examples/drop/resource.md +7 -30
- package/docs/examples/errors/errors.md +7 -27
- package/docs/examples/errors/index.md +6 -5
- package/docs/examples/errors/main.md +7 -28
- package/docs/examples/errors-benchmark/index.md +36 -0
- package/docs/examples/errors-benchmark/main.md +92 -0
- package/docs/examples/errors-benchmark/operations.md +65 -0
- package/docs/examples/ffi/index.md +6 -5
- package/docs/examples/ffi/main.md +6 -20
- package/docs/examples/ffi/native.md +8 -34
- package/docs/examples/float-benchmark/index.md +35 -0
- package/docs/examples/float-benchmark/main.md +75 -0
- package/docs/examples/generic-di/dependencies/august/0.21.0/io/contracts.md +178 -0
- package/docs/examples/generic-di/index.md +6 -5
- package/docs/examples/generic-di/main.md +9 -39
- package/docs/examples/generic-di/types.md +23 -92
- package/docs/examples/generics/index.md +6 -5
- package/docs/examples/generics/main.md +10 -47
- package/docs/examples/generics/types.md +25 -100
- package/docs/examples/hello/app/export.md +4 -12
- package/docs/examples/hello/app/greeter.md +13 -91
- package/docs/examples/hello/dependencies/august/0.21.0/io/contracts.md +178 -0
- package/docs/examples/hello/index.md +17 -6
- package/docs/examples/hello/logging/console.md +10 -54
- package/docs/examples/hello/logging/export.md +4 -14
- package/docs/examples/hello/logging/logger.md +7 -45
- package/docs/examples/hello/main.md +9 -39
- package/docs/examples/http-benchmark/index.md +6 -5
- package/docs/examples/http-benchmark/main.md +6 -20
- package/docs/examples/http-benchmark/routes.md +9 -31
- package/docs/examples/index.md +63 -29
- package/docs/examples/interceptors/app.md +20 -139
- package/docs/examples/interceptors/dependencies/august/0.21.0/io/contracts.md +178 -0
- package/docs/examples/interceptors/index.md +6 -5
- package/docs/examples/interceptors/interceptors.md +24 -148
- package/docs/examples/interceptors/logging.md +13 -76
- package/docs/examples/interceptors/main.md +10 -65
- package/docs/examples/json-benchmark/data.md +4 -20
- package/docs/examples/json-benchmark/dependencies/packages/@git/url_2d3c37c690c0fa115be1/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.md +67 -0
- package/docs/examples/json-benchmark/index.md +7 -5
- package/docs/examples/json-benchmark/main-yaml.md +20 -0
- package/docs/examples/json-benchmark/main.md +10 -49
- package/docs/examples/list-benchmark/index.md +35 -0
- package/docs/examples/list-benchmark/main.md +78 -0
- package/docs/examples/map-churn-benchmark/index.md +35 -0
- package/docs/examples/map-churn-benchmark/main.md +106 -0
- package/docs/examples/native-blake3/dependencies/packages/@greenpandastudios/aug-blake3/0.1.3/api.md +104 -0
- package/docs/examples/native-blake3/dependencies/packages/@greenpandastudios/aug-blake3/0.1.3/contracts.md +54 -0
- package/docs/examples/native-blake3/dependencies/packages/@greenpandastudios/aug-blake3/0.1.3/native.abi-json.md +48 -0
- package/docs/examples/native-blake3/hashing.md +93 -0
- package/docs/examples/native-blake3/index.md +38 -0
- package/docs/examples/native-blake3/main.md +73 -0
- package/docs/examples/native-pytorch/dependencies/packages/@greenpandastudios/aug-pytorch/0.1.4/api.md +406 -0
- package/docs/examples/native-pytorch/dependencies/packages/@greenpandastudios/aug-pytorch/0.1.4/bindings.md +51 -0
- package/docs/examples/native-pytorch/dependencies/packages/@greenpandastudios/aug-pytorch/0.1.4/contracts.md +63 -0
- package/docs/examples/native-pytorch/dependencies/packages/@greenpandastudios/aug-pytorch/0.1.4/native.abi-json.md +161 -0
- package/docs/examples/native-pytorch/index.md +38 -0
- package/docs/examples/native-pytorch/main.md +73 -0
- package/docs/examples/native-pytorch/tensors.md +123 -0
- package/docs/examples/native-sqlite/database.md +116 -0
- package/docs/examples/native-sqlite/dependencies/packages/@greenpandastudios/aug-sqlite/0.1.3/api.md +284 -0
- package/docs/examples/native-sqlite/dependencies/packages/@greenpandastudios/aug-sqlite/0.1.3/bindings.md +51 -0
- package/docs/examples/native-sqlite/dependencies/packages/@greenpandastudios/aug-sqlite/0.1.3/contracts.md +75 -0
- package/docs/examples/native-sqlite/dependencies/packages/@greenpandastudios/aug-sqlite/0.1.3/native.abi-json.md +119 -0
- package/docs/examples/native-sqlite/index.md +38 -0
- package/docs/examples/native-sqlite/main.md +73 -0
- package/docs/examples/native-zlib/compression.md +99 -0
- package/docs/examples/native-zlib/dependencies/packages/@greenpandastudios/aug-zlib/0.1.3/api.md +153 -0
- package/docs/examples/native-zlib/dependencies/packages/@greenpandastudios/aug-zlib/0.1.3/contracts.md +54 -0
- package/docs/examples/native-zlib/dependencies/packages/@greenpandastudios/aug-zlib/0.1.3/native.abi-json.md +76 -0
- package/docs/examples/native-zlib/index.md +38 -0
- package/docs/examples/native-zlib/main.md +78 -0
- package/docs/examples/new-syntax/console.md +10 -52
- package/docs/examples/new-syntax/dependencies/august/0.21.0/io/contracts.md +178 -0
- package/docs/examples/new-syntax/greeter.md +13 -71
- package/docs/examples/new-syntax/index.md +6 -5
- package/docs/examples/new-syntax/logger.md +7 -43
- package/docs/examples/new-syntax/main.md +10 -53
- package/docs/examples/new-syntax/math.md +6 -24
- package/docs/examples/oidc-login/client/contracts.md +10 -61
- package/docs/examples/oidc-login/client/endpoints.md +32 -154
- package/docs/examples/oidc-login/client/export.md +5 -23
- package/docs/examples/oidc-login/client/login.md +234 -344
- package/docs/examples/oidc-login/client/logout.md +38 -143
- package/docs/examples/oidc-login/client/protocol.md +183 -304
- package/docs/examples/oidc-login/client/session.md +41 -149
- package/docs/examples/oidc-login/client/views.md +13 -58
- package/docs/examples/oidc-login/common/export.md +6 -26
- package/docs/examples/oidc-login/common/headers.md +42 -72
- package/docs/examples/oidc-login/common/keys.md +40 -164
- package/docs/examples/oidc-login/common/settings.md +24 -40
- package/docs/examples/oidc-login/common/views.md +7 -28
- package/docs/examples/oidc-login/dependencies/packages/@git/url_0eb7c89453c87681ed15/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/store.md +205 -0
- package/docs/examples/oidc-login/dependencies/packages/@git/url_2d3c37c690c0fa115be1/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.md +67 -0
- package/docs/examples/oidc-login/dependencies/packages/@git/url_897efafd565158fc4908/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.md +267 -0
- package/docs/examples/oidc-login/dependencies/packages/@git/url_9ef654c66d34ab8f5527/0.0.0-git.b14a0f9aa41f1ce58bd51133bcdc424033e40d40/contracts.md +415 -0
- package/docs/examples/oidc-login/dependencies/packages/@git/url_9ef654c66d34ab8f5527/0.0.0-git.b14a0f9aa41f1ce58bd51133bcdc424033e40d40/jose.md +271 -0
- package/docs/examples/oidc-login/dependencies/packages/@git/url_c092cd151499c4e1d8a1/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.md +89 -0
- package/docs/examples/oidc-login/index.md +8 -7
- package/docs/examples/oidc-login/main-yaml.md +7 -0
- package/docs/examples/oidc-login/main.md +26 -153
- package/docs/examples/oidc-login/provider/authorization.md +232 -275
- package/docs/examples/oidc-login/provider/contracts.md +24 -146
- package/docs/examples/oidc-login/provider/credentials.md +24 -57
- package/docs/examples/oidc-login/provider/discovery.md +48 -122
- package/docs/examples/oidc-login/provider/export.md +11 -37
- package/docs/examples/oidc-login/provider/token.md +159 -237
- package/docs/examples/oidc-login/provider/userinfo.md +47 -102
- package/docs/examples/oidc-login/provider/views.md +13 -53
- package/docs/examples/ownership/counter.md +17 -63
- package/docs/examples/ownership/index.md +6 -5
- package/docs/examples/ownership/main.md +7 -30
- package/docs/examples/ownership-transfer/dependencies/august/0.21.0/io/contracts.md +178 -0
- package/docs/examples/ownership-transfer/index.md +6 -5
- package/docs/examples/ownership-transfer/main.md +10 -52
- package/docs/examples/ownership-transfer/resource.md +15 -67
- package/docs/examples/packages-app/dependencies/packages/@example/aug-math/0.1.0/arithmetic.md +12 -50
- package/docs/examples/packages-app/index.md +7 -6
- package/docs/examples/packages-app/main.md +7 -25
- package/docs/examples/packages-math/aug-package-json.md +1 -1
- package/docs/examples/packages-math/index.md +7 -6
- package/docs/examples/packages-math/src/arithmetic.md +12 -50
- package/docs/examples/packages-math/src/export.md +4 -12
- package/docs/examples/records-benchmark/data.md +55 -0
- package/docs/examples/records-benchmark/index.md +36 -0
- package/docs/examples/records-benchmark/main.md +85 -0
- package/docs/examples/startup-benchmark/index.md +6 -5
- package/docs/examples/startup-benchmark/main.md +5 -17
- package/docs/examples/strings-benchmark/index.md +35 -0
- package/docs/examples/strings-benchmark/main.md +76 -0
- package/docs/examples/tasks-benchmark/index.md +36 -0
- package/docs/examples/tasks-benchmark/main.md +89 -0
- package/docs/examples/tasks-benchmark/operations.md +58 -0
- package/docs/examples/visibility/counter.md +19 -67
- package/docs/examples/visibility/index.md +6 -5
- package/docs/examples/visibility/main.md +7 -31
- package/docs/examples/weather-api/forecasts.md +168 -0
- package/docs/examples/weather-api/index.md +42 -0
- package/docs/examples/weather-api/main-yaml.md +21 -0
- package/docs/examples/weather-api/main.md +65 -0
- package/docs/examples.json +10 -0
- package/docs/getting-started.md +105 -2
- package/docs/grammar.md +7 -5
- package/docs/guides/change-a-module.md +64 -0
- package/docs/guides/index.md +27 -0
- package/docs/gym-results.json +784 -0
- package/docs/implementation-map.md +6 -0
- package/docs/index.md +51 -29
- package/docs/kernel-results.json +1170 -0
- package/docs/language-conformance.md +7 -1
- package/docs/language-constructs.md +30 -22
- package/docs/language-design-audit.md +1 -1
- package/docs/learn/data-and-errors.md +77 -0
- package/docs/learn/index.md +30 -0
- package/docs/learn/modules-and-dependencies.md +73 -0
- package/docs/learn/state-and-tests.md +71 -0
- package/docs/learn/values-and-functions.md +62 -0
- package/docs/lesson-failures.json +8 -0
- package/docs/maintaining-docs.md +16 -4
- package/docs/native-implementation.md +276 -0
- package/docs/native-interop-llvm-plan.md +342 -0
- package/docs/native-package-examples.md +684 -0
- package/docs/native-packages.md +179 -0
- package/docs/packages.md +72 -126
- package/docs/performance.md +61 -68
- package/docs/production-readiness.md +16 -5
- package/docs/public/downloads/approved-design.zip +0 -0
- package/docs/public/downloads/benchmark.zip +0 -0
- package/docs/public/downloads/calls-benchmark.zip +0 -0
- package/docs/public/downloads/cli-args.zip +0 -0
- package/docs/public/downloads/collections-benchmark.zip +0 -0
- package/docs/public/downloads/collections.zip +0 -0
- package/docs/public/downloads/cpu-benchmark.zip +0 -0
- package/docs/public/downloads/developer-workflow.zip +0 -0
- package/docs/public/downloads/drop.zip +0 -0
- package/docs/public/downloads/errors-benchmark.zip +0 -0
- package/docs/public/downloads/errors.zip +0 -0
- package/docs/public/downloads/ffi.zip +0 -0
- package/docs/public/downloads/float-benchmark.zip +0 -0
- package/docs/public/downloads/generic-di.zip +0 -0
- package/docs/public/downloads/generics.zip +0 -0
- package/docs/public/downloads/hello.zip +0 -0
- package/docs/public/downloads/http-benchmark.zip +0 -0
- package/docs/public/downloads/interceptors.zip +0 -0
- package/docs/public/downloads/json-benchmark.zip +0 -0
- package/docs/public/downloads/list-benchmark.zip +0 -0
- package/docs/public/downloads/map-churn-benchmark.zip +0 -0
- package/docs/public/downloads/native-blake3.zip +0 -0
- package/docs/public/downloads/native-pytorch.zip +0 -0
- package/docs/public/downloads/native-sqlite.zip +0 -0
- package/docs/public/downloads/native-zlib.zip +0 -0
- package/docs/public/downloads/new-syntax.zip +0 -0
- package/docs/public/downloads/oidc-login.zip +0 -0
- package/docs/public/downloads/ownership-transfer.zip +0 -0
- package/docs/public/downloads/ownership.zip +0 -0
- package/docs/public/downloads/packages-app.zip +0 -0
- package/docs/public/downloads/packages-math.zip +0 -0
- package/docs/public/downloads/records-benchmark.zip +0 -0
- package/docs/public/downloads/startup-benchmark.zip +0 -0
- package/docs/public/downloads/strings-benchmark.zip +0 -0
- package/docs/public/downloads/tasks-benchmark.zip +0 -0
- package/docs/public/downloads/visibility.zip +0 -0
- package/docs/public/downloads/weather-api.zip +0 -0
- package/docs/qualification-results.md +66 -0
- package/docs/reference.md +47 -17
- package/docs/releasing.md +105 -16
- package/docs/research/code-to-natural-language.md +108 -0
- package/docs/research/ecosystem-workflow.md +41 -0
- package/docs/research/libtorch-native-qualification.md +115 -0
- package/docs/research/native-interop-llvm.md +197 -0
- package/docs/research/qualification-methods.md +15 -0
- package/docs/research/wiki-editorial-design.md +71 -0
- package/docs/roadmap.md +2 -1
- package/docs/safety-gyms.md +41 -0
- package/docs/specifications.md +27 -11
- package/docs/testing.md +19 -5
- package/docs/tooling.md +36 -22
- package/docs/weather-api.md +65 -0
- package/docs/web-library-gaps.md +1 -1
- package/docs/web.md +54 -18
- package/docs/writing-docs.md +49 -0
- package/examples/{hello/.aug-spec/august/0.19.0 → approved-design/.aug-spec/august/0.21.0}/io/contracts.aug +4 -3
- package/examples/approved-design/.aug-spec/august/0.21.0/io/contracts.aug.md +82 -0
- package/examples/approved-design/.aug-spec/manifest.json +3 -3
- package/examples/approved-design/counters.aug +5 -4
- package/examples/approved-design/counters.aug.md +25 -132
- package/examples/approved-design/domain/app.aug +2 -1
- package/examples/approved-design/domain/app.aug.md +10 -80
- package/examples/approved-design/domain/export.aug +1 -0
- package/examples/approved-design/domain/export.aug.md +4 -20
- package/examples/approved-design/domain/models.aug +1 -0
- package/examples/approved-design/domain/models.aug.md +3 -25
- package/examples/approved-design/domain/numbers.aug +3 -2
- package/examples/approved-design/domain/numbers.aug.md +19 -116
- package/examples/approved-design/main.aug +1 -0
- package/examples/approved-design/main.aug.md +12 -95
- package/examples/benchmark/.aug-spec/manifest.json +1 -1
- package/examples/benchmark/main.aug +1 -0
- package/examples/benchmark/main.aug.md +6 -36
- package/examples/cli-args/.aug-spec/manifest.json +1 -1
- package/examples/cli-args/main.aug +1 -0
- package/examples/cli-args/main.aug.md +5 -32
- package/examples/collections/.aug-spec/manifest.json +1 -1
- package/examples/collections/main.aug +1 -0
- package/examples/collections/main.aug.md +6 -36
- package/examples/{generic-di/.aug-spec/august/0.19.0 → developer-workflow/.aug-spec/august/0.21.0}/io/contracts.aug +4 -3
- package/examples/developer-workflow/.aug-spec/august/0.21.0/io/contracts.aug.md +82 -0
- package/examples/developer-workflow/.aug-spec/manifest.json +3 -3
- package/examples/developer-workflow/calculator.aug +3 -2
- package/examples/developer-workflow/calculator.aug.md +28 -189
- package/examples/developer-workflow/logging/console.aug +2 -1
- package/examples/developer-workflow/logging/console.aug.md +7 -57
- package/examples/developer-workflow/logging/export.aug +1 -0
- package/examples/developer-workflow/logging/export.aug.md +3 -15
- package/examples/developer-workflow/logging/logger.aug +1 -0
- package/examples/developer-workflow/logging/logger.aug.md +6 -46
- package/examples/developer-workflow/main.aug +1 -0
- package/examples/developer-workflow/main.aug.md +10 -68
- package/examples/drop/.aug-spec/manifest.json +1 -1
- package/examples/drop/main.aug +1 -0
- package/examples/drop/main.aug.md +6 -28
- package/examples/drop/resource.aug +1 -0
- package/examples/drop/resource.aug.md +6 -34
- package/examples/errors/.aug-spec/manifest.json +1 -1
- package/examples/errors/errors.aug +2 -1
- package/examples/errors/errors.aug.md +4 -27
- package/examples/errors/main.aug +1 -0
- package/examples/errors/main.aug.md +6 -29
- package/examples/ffi/.aug-spec/manifest.json +1 -1
- package/examples/ffi/main.aug +1 -0
- package/examples/ffi/main.aug.md +5 -21
- package/examples/ffi/native.aug +2 -1
- package/examples/ffi/native.aug.md +5 -35
- package/examples/{approved-design/.aug-spec/august/0.19.0 → generic-di/.aug-spec/august/0.21.0}/io/contracts.aug +4 -3
- package/examples/generic-di/.aug-spec/august/0.21.0/io/contracts.aug.md +82 -0
- package/examples/generic-di/.aug-spec/manifest.json +3 -3
- package/examples/generic-di/main.aug +1 -0
- package/examples/generic-di/main.aug.md +8 -40
- package/examples/generic-di/types.aug +3 -2
- package/examples/generic-di/types.aug.md +18 -97
- package/examples/generics/.aug-spec/manifest.json +1 -1
- package/examples/generics/main.aug +1 -0
- package/examples/generics/main.aug.md +9 -48
- package/examples/generics/types.aug +4 -3
- package/examples/generics/types.aug.md +18 -104
- package/examples/{developer-workflow/.aug-spec/august/0.19.0 → hello/.aug-spec/august/0.21.0}/io/contracts.aug +4 -3
- package/examples/hello/.aug-spec/august/0.21.0/io/contracts.aug.md +82 -0
- package/examples/hello/.aug-spec/manifest.json +3 -3
- package/examples/hello/app/export.aug +1 -0
- package/examples/hello/app/export.aug.md +3 -13
- package/examples/hello/app/greeter.aug +2 -1
- package/examples/hello/app/greeter.aug.md +10 -94
- package/examples/hello/logging/console.aug +2 -1
- package/examples/hello/logging/console.aug.md +7 -55
- package/examples/hello/logging/export.aug +1 -0
- package/examples/hello/logging/export.aug.md +3 -15
- package/examples/hello/logging/logger.aug +1 -0
- package/examples/hello/logging/logger.aug.md +6 -48
- package/examples/hello/main.aug +1 -0
- package/examples/hello/main.aug.md +8 -40
- package/examples/interceptors/.aug-spec/august/0.21.0/io/contracts.aug +37 -0
- package/examples/interceptors/.aug-spec/august/0.21.0/io/contracts.aug.md +82 -0
- package/examples/interceptors/.aug-spec/manifest.json +3 -3
- package/examples/interceptors/app.aug +3 -2
- package/examples/interceptors/app.aug.md +15 -141
- package/examples/interceptors/interceptors.aug +3 -2
- package/examples/interceptors/interceptors.aug.md +19 -152
- package/examples/interceptors/logging.aug +2 -1
- package/examples/interceptors/logging.aug.md +10 -79
- package/examples/interceptors/main.aug +1 -0
- package/examples/interceptors/main.aug.md +9 -66
- package/examples/native-blake3/.aug-spec/manifest.json +16 -0
- package/examples/native-blake3/.aug-spec/packages/@greenpandastudios/aug-blake3/0.1.1/native.abi.json +29 -0
- package/examples/native-blake3/.aug-spec/packages/@greenpandastudios/aug-blake3/0.1.3/api.aug +14 -0
- package/examples/native-blake3/.aug-spec/packages/@greenpandastudios/aug-blake3/0.1.3/api.aug.md +34 -0
- package/examples/native-blake3/.aug-spec/packages/@greenpandastudios/aug-blake3/0.1.3/contracts.aug +4 -0
- package/examples/native-blake3/.aug-spec/packages/@greenpandastudios/aug-blake3/0.1.3/contracts.aug.md +8 -0
- package/examples/native-blake3/.aug-spec/packages/@greenpandastudios/aug-blake3/0.1.3/native.abi.json +29 -0
- package/examples/native-blake3/AGENTS.md +5 -0
- package/examples/native-blake3/aug.lock.json +253 -0
- package/examples/native-blake3/hashing.aug +11 -0
- package/examples/native-blake3/hashing.aug.md +25 -0
- package/examples/native-blake3/main.aug +8 -0
- package/examples/native-blake3/main.aug.md +13 -0
- package/examples/native-pytorch/.aug-spec/manifest.json +18 -0
- package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.1/native.abi.json +142 -0
- package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.3/native.abi.json +142 -0
- package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.4/api.aug +101 -0
- package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.4/api.aug.md +160 -0
- package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.4/bindings.aug +3 -0
- package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.4/bindings.aug.md +8 -0
- package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.4/contracts.aug +6 -0
- package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.4/contracts.aug.md +13 -0
- package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.4/native.abi.json +142 -0
- package/examples/native-pytorch/AGENTS.md +5 -0
- package/examples/native-pytorch/aug.lock.json +309 -0
- package/examples/native-pytorch/main.aug +8 -0
- package/examples/native-pytorch/main.aug.md +13 -0
- package/examples/native-pytorch/tensors.aug +23 -0
- package/examples/native-pytorch/tensors.aug.md +35 -0
- package/examples/native-sqlite/.aug-spec/manifest.json +18 -0
- package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.2/native.abi.json +100 -0
- package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.3/api.aug +48 -0
- package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.3/api.aug.md +91 -0
- package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.3/bindings.aug +3 -0
- package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.3/bindings.aug.md +8 -0
- package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.3/contracts.aug +8 -0
- package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.3/contracts.aug.md +22 -0
- package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.3/native.abi.json +100 -0
- package/examples/native-sqlite/AGENTS.md +5 -0
- package/examples/native-sqlite/aug.lock.json +236 -0
- package/examples/native-sqlite/database.aug +15 -0
- package/examples/native-sqlite/database.aug.md +27 -0
- package/examples/native-sqlite/main.aug +8 -0
- package/examples/native-sqlite/main.aug.md +13 -0
- package/examples/native-zlib/.aug-spec/manifest.json +16 -0
- package/examples/native-zlib/.aug-spec/packages/@greenpandastudios/aug-zlib/0.1.1/native.abi.json +57 -0
- package/examples/native-zlib/.aug-spec/packages/@greenpandastudios/aug-zlib/0.1.3/api.aug +29 -0
- package/examples/native-zlib/.aug-spec/packages/@greenpandastudios/aug-zlib/0.1.3/api.aug.md +54 -0
- package/examples/native-zlib/.aug-spec/packages/@greenpandastudios/aug-zlib/0.1.3/contracts.aug +4 -0
- package/examples/native-zlib/.aug-spec/packages/@greenpandastudios/aug-zlib/0.1.3/contracts.aug.md +8 -0
- package/examples/native-zlib/.aug-spec/packages/@greenpandastudios/aug-zlib/0.1.3/native.abi.json +57 -0
- package/examples/native-zlib/AGENTS.md +5 -0
- package/examples/native-zlib/aug.lock.json +236 -0
- package/examples/native-zlib/compression.aug +15 -0
- package/examples/native-zlib/compression.aug.md +27 -0
- package/examples/native-zlib/main.aug +10 -0
- package/examples/native-zlib/main.aug.md +13 -0
- package/examples/new-syntax/.aug-spec/august/0.21.0/io/contracts.aug +37 -0
- package/examples/new-syntax/.aug-spec/august/0.21.0/io/contracts.aug.md +82 -0
- package/examples/new-syntax/.aug-spec/manifest.json +3 -3
- package/examples/new-syntax/console.aug +2 -1
- package/examples/new-syntax/console.aug.md +7 -53
- package/examples/new-syntax/greeter.aug +2 -1
- package/examples/new-syntax/greeter.aug.md +10 -74
- package/examples/new-syntax/logger.aug +1 -0
- package/examples/new-syntax/logger.aug.md +6 -46
- package/examples/new-syntax/main.aug +1 -0
- package/examples/new-syntax/main.aug.md +9 -54
- package/examples/new-syntax/math.aug +2 -1
- package/examples/new-syntax/math.aug.md +3 -24
- package/examples/oidc-login/.aug-spec/manifest.json +13 -13
- package/examples/oidc-login/.aug-spec/packages/@git/url_0eb7c89453c87681ed15/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/store.aug.md +71 -0
- package/examples/oidc-login/.aug-spec/packages/@git/url_2d3c37c690c0fa115be1/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.aug.md +17 -0
- package/examples/oidc-login/.aug-spec/packages/@git/url_897efafd565158fc4908/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.aug.md +125 -0
- package/examples/oidc-login/.aug-spec/{august/0.19.0/crypto → packages/@git/url_9ef654c66d34ab8f5527/0.0.0-git.b14a0f9aa41f1ce58bd51133bcdc424033e40d40}/contracts.aug +12 -11
- package/examples/oidc-login/.aug-spec/packages/@git/url_9ef654c66d34ab8f5527/0.0.0-git.b14a0f9aa41f1ce58bd51133bcdc424033e40d40/contracts.aug.md +244 -0
- package/examples/oidc-login/.aug-spec/{august/0.19.0/crypto → packages/@git/url_9ef654c66d34ab8f5527/0.0.0-git.b14a0f9aa41f1ce58bd51133bcdc424033e40d40}/jose.aug +6 -5
- package/examples/oidc-login/.aug-spec/packages/@git/url_9ef654c66d34ab8f5527/0.0.0-git.b14a0f9aa41f1ce58bd51133bcdc424033e40d40/jose.aug.md +71 -0
- package/examples/oidc-login/.aug-spec/packages/@git/url_c092cd151499c4e1d8a1/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.aug.md +30 -0
- package/examples/oidc-login/aug.lock.json +100 -0
- package/examples/oidc-login/client/contracts.aug +1 -0
- package/examples/oidc-login/client/contracts.aug.md +9 -66
- package/examples/oidc-login/client/endpoints.aug +6 -5
- package/examples/oidc-login/client/endpoints.aug.md +13 -145
- package/examples/oidc-login/client/export.aug +1 -0
- package/examples/oidc-login/client/export.aug.md +4 -24
- package/examples/oidc-login/client/login.aug +7 -6
- package/examples/oidc-login/client/login.aug.md +25 -303
- package/examples/oidc-login/client/logout.aug +5 -4
- package/examples/oidc-login/client/logout.aug.md +13 -135
- package/examples/oidc-login/client/protocol.aug +7 -6
- package/examples/oidc-login/client/protocol.aug.md +36 -283
- package/examples/oidc-login/client/session.aug +5 -4
- package/examples/oidc-login/client/session.aug.md +12 -139
- package/examples/oidc-login/client/views.aug +3 -2
- package/examples/oidc-login/client/views.aug.md +8 -57
- package/examples/oidc-login/common/export.aug +1 -0
- package/examples/oidc-login/common/export.aug.md +5 -27
- package/examples/oidc-login/common/headers.aug +4 -3
- package/examples/oidc-login/common/headers.aug.md +9 -67
- package/examples/oidc-login/common/keys.aug +6 -5
- package/examples/oidc-login/common/keys.aug.md +29 -165
- package/examples/oidc-login/common/settings.aug +2 -1
- package/examples/oidc-login/common/settings.aug.md +5 -39
- package/examples/oidc-login/common/views.aug +2 -1
- package/examples/oidc-login/common/views.aug.md +4 -28
- package/examples/oidc-login/main.aug +6 -16
- package/examples/oidc-login/main.aug.md +17 -146
- package/examples/oidc-login/main.yaml +7 -0
- package/examples/oidc-login/provider/authorization.aug +7 -6
- package/examples/oidc-login/provider/authorization.aug.md +23 -238
- package/examples/oidc-login/provider/contracts.aug +1 -0
- package/examples/oidc-login/provider/contracts.aug.md +23 -158
- package/examples/oidc-login/provider/credentials.aug +3 -2
- package/examples/oidc-login/provider/credentials.aug.md +9 -53
- package/examples/oidc-login/provider/discovery.aug +4 -3
- package/examples/oidc-login/provider/discovery.aug.md +11 -118
- package/examples/oidc-login/provider/export.aug +1 -0
- package/examples/oidc-login/provider/export.aug.md +6 -34
- package/examples/oidc-login/provider/token.aug +6 -5
- package/examples/oidc-login/provider/token.aug.md +16 -204
- package/examples/oidc-login/provider/userinfo.aug +4 -3
- package/examples/oidc-login/provider/userinfo.aug.md +10 -92
- package/examples/oidc-login/provider/views.aug +3 -2
- package/examples/oidc-login/provider/views.aug.md +8 -52
- package/examples/ownership/.aug-spec/manifest.json +1 -1
- package/examples/ownership/counter.aug +3 -2
- package/examples/ownership/counter.aug.md +12 -66
- package/examples/ownership/main.aug +1 -0
- package/examples/ownership/main.aug.md +6 -31
- package/examples/ownership-transfer/.aug-spec/august/0.21.0/io/contracts.aug +37 -0
- package/examples/ownership-transfer/.aug-spec/august/0.21.0/io/contracts.aug.md +82 -0
- package/examples/ownership-transfer/.aug-spec/manifest.json +3 -3
- package/examples/ownership-transfer/main.aug +1 -0
- package/examples/ownership-transfer/main.aug.md +9 -53
- package/examples/ownership-transfer/resource.aug +2 -1
- package/examples/ownership-transfer/resource.aug.md +12 -71
- package/examples/packages/app/.aug-spec/manifest.json +1 -1
- package/examples/packages/app/.aug-spec/packages/@example/aug-math/0.1.0/arithmetic.aug +2 -1
- package/examples/packages/app/.aug-spec/packages/@example/aug-math/0.1.0/arithmetic.aug.md +9 -51
- package/examples/packages/app/main.aug +1 -0
- package/examples/packages/app/main.aug.md +6 -26
- package/examples/packages/math/.aug-spec/manifest.json +1 -1
- package/examples/packages/math/aug-package.json +1 -1
- package/examples/packages/math/src/arithmetic.aug +2 -1
- package/examples/packages/math/src/arithmetic.aug.md +9 -51
- package/examples/packages/math/src/export.aug +1 -0
- package/examples/packages/math/src/export.aug.md +3 -13
- package/examples/visibility/.aug-spec/manifest.json +1 -1
- package/examples/visibility/counter.aug +4 -3
- package/examples/visibility/counter.aug.md +12 -68
- package/examples/visibility/main.aug +1 -0
- package/examples/visibility/main.aug.md +6 -32
- package/examples/weather-api/.aug-spec/manifest.json +8 -0
- package/examples/weather-api/AGENTS.md +17 -0
- package/examples/weather-api/README.md +19 -0
- package/examples/weather-api/forecasts.aug +47 -0
- package/examples/weather-api/forecasts.aug.md +32 -0
- package/examples/weather-api/main.aug +4 -0
- package/examples/weather-api/main.aug.md +15 -0
- package/examples/weather-api/main.yaml +5 -0
- package/examples/weather-api/weather.http +5 -0
- package/native/compiler-packs.json +43 -0
- package/package.json +4 -4
- package/runtime/aug_http.c +48 -21
- package/runtime/aug_http_ir.c +30 -0
- package/runtime/aug_http_ir.h +18 -0
- package/runtime/aug_ir.c +209 -0
- package/runtime/aug_ir.h +89 -0
- package/runtime/aug_json.c +6 -1
- package/runtime/aug_runtime.c +82 -16
- package/runtime/aug_runtime.h +16 -2
- package/runtime/aug_tasks.c +38 -7
- package/runtime/aug_values.c +12 -6
- package/scripts/bootstrap-native.mjs +184 -106
- package/scripts/native-setup.mjs +98 -0
- package/scripts/native-toolchain.mjs +28 -0
- package/src/ast.js +1 -1
- package/src/builtins.js +1 -1
- package/src/checker.js +369 -100
- package/src/cli.js +198 -26
- package/src/codegen.js +32 -7
- package/src/compiler-packs.js +66 -0
- package/src/config.js +3 -3
- package/src/contracts.js +10 -0
- package/src/editor.js +86 -22
- package/src/fixes.js +90 -2
- package/src/formatter.js +23 -10
- package/src/git-http.js +137 -0
- package/src/git-packages.js +118 -0
- package/src/help.js +33 -24
- package/src/http-contracts.js +14 -0
- package/src/http-policies.js +5 -5
- package/src/ir-types.js +5 -0
- package/src/ir-verify.js +277 -0
- package/src/ir.js +962 -0
- package/src/libraries.js +1 -1
- package/src/llvm-debug.js +101 -0
- package/src/llvm-native.js +152 -0
- package/src/llvm-platform.js +20 -0
- package/src/llvm.js +781 -0
- package/src/lsp.js +14 -5
- package/src/native-artifacts.js +207 -0
- package/src/native-bindings.js +189 -0
- package/src/native-contracts.js +295 -0
- package/src/native-declarations.js +68 -0
- package/src/native-facts.js +63 -0
- package/src/native.js +19 -13
- package/src/navigation.js +4 -2
- package/src/openapi.js +5 -4
- package/src/package-locking.js +88 -0
- package/src/package-manager.js +267 -68
- package/src/parser.js +32 -6
- package/src/policies.js +3 -3
- package/src/project-init.js +78 -4
- package/src/project.js +11 -9
- package/src/runtime-abi.js +23 -0
- package/src/runtime-adapters.js +18 -0
- package/src/schemas.js +24 -17
- package/src/semantic.js +54 -5
- package/src/snippets.js +60 -0
- package/src/spec-hints.js +56 -0
- package/src/spec-tree.js +241 -0
- package/src/spec.js +669 -305
- package/docs/examples/approved-design/dependencies/august/0.19.0/io/contracts.md +0 -395
- package/docs/examples/developer-workflow/dependencies/august/0.19.0/io/contracts.md +0 -395
- package/docs/examples/generic-di/dependencies/august/0.19.0/io/contracts.md +0 -395
- package/docs/examples/hello/dependencies/august/0.19.0/io/contracts.md +0 -395
- package/docs/examples/interceptors/dependencies/august/0.19.0/io/contracts.md +0 -395
- package/docs/examples/json-benchmark/dependencies/august/0.19.0/json/contracts.md +0 -103
- package/docs/examples/new-syntax/dependencies/august/0.19.0/io/contracts.md +0 -395
- package/docs/examples/oidc-login/dependencies/august/0.19.0/crypto/contracts.md +0 -925
- package/docs/examples/oidc-login/dependencies/august/0.19.0/crypto/jose.md +0 -434
- package/docs/examples/oidc-login/dependencies/august/0.19.0/json/contracts.md +0 -103
- package/docs/examples/oidc-login/dependencies/august/0.19.0/memory/store.md +0 -374
- package/docs/examples/oidc-login/dependencies/august/0.19.0/time/contracts.md +0 -150
- package/docs/examples/oidc-login/dependencies/august/0.19.0/web/contracts.md +0 -532
- package/docs/examples/ownership-transfer/dependencies/august/0.19.0/io/contracts.md +0 -395
- package/examples/approved-design/.aug-spec/august/0.19.0/io/contracts.aug.md +0 -316
- package/examples/developer-workflow/.aug-spec/august/0.19.0/io/contracts.aug.md +0 -316
- package/examples/generic-di/.aug-spec/august/0.19.0/io/contracts.aug.md +0 -316
- package/examples/hello/.aug-spec/august/0.19.0/io/contracts.aug.md +0 -316
- package/examples/interceptors/.aug-spec/august/0.19.0/io/contracts.aug +0 -36
- package/examples/interceptors/.aug-spec/august/0.19.0/io/contracts.aug.md +0 -316
- package/examples/new-syntax/.aug-spec/august/0.19.0/io/contracts.aug +0 -36
- package/examples/new-syntax/.aug-spec/august/0.19.0/io/contracts.aug.md +0 -316
- package/examples/oidc-login/.aug-spec/august/0.19.0/crypto/contracts.aug.md +0 -791
- package/examples/oidc-login/.aug-spec/august/0.19.0/crypto/jose.aug.md +0 -266
- package/examples/oidc-login/.aug-spec/august/0.19.0/json/contracts.aug.md +0 -55
- package/examples/oidc-login/.aug-spec/august/0.19.0/memory/store.aug.md +0 -250
- package/examples/oidc-login/.aug-spec/august/0.19.0/time/contracts.aug.md +0 -96
- package/examples/oidc-login/.aug-spec/august/0.19.0/web/contracts.aug.md +0 -420
- package/examples/ownership-transfer/.aug-spec/august/0.19.0/io/contracts.aug +0 -36
- package/examples/ownership-transfer/.aug-spec/august/0.19.0/io/contracts.aug.md +0 -316
- /package/examples/oidc-login/.aug-spec/{august/0.19.0/memory → packages/@git/url_0eb7c89453c87681ed15/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301}/store.aug +0 -0
- /package/examples/oidc-login/.aug-spec/{august/0.19.0/json → packages/@git/url_2d3c37c690c0fa115be1/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301}/contracts.aug +0 -0
- /package/examples/oidc-login/.aug-spec/{august/0.19.0/web → packages/@git/url_897efafd565158fc4908/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301}/contracts.aug +0 -0
- /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)
|
|
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 =
|
|
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
|
}
|
package/src/project-init.js
CHANGED
|
@@ -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)
|
|
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
|
|
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, ...
|
|
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
|
|
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
|
-
/**
|
|
25
|
-
export class
|
|
24
|
+
/** Backend-neutral, resolved schema graph shared by HTTP and JSON decoding. */
|
|
25
|
+
export class DataSchemas {
|
|
26
26
|
names = new Map();
|
|
27
|
-
|
|
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
|
-
|
|
43
|
-
|
|
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 = '
|
|
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 =>
|
|
48
|
-
labels = node.fields.map(field =>
|
|
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 =>
|
|
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
|
-
|
|
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 ' : ''}${
|
|
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([...
|
|
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) {
|
package/src/snippets.js
ADDED
|
@@ -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
|
+
}
|