Showing preview only (5,033K chars total). Download the full file or copy to clipboard to get everything.
Repository: VirtusLab/scala-cli
Branch: main
Commit: fbc634d33242
Files: 1105
Total size: 4.5 MB
Directory structure:
gitextract_updn7qcx/
├── .dockerignore
├── .git-blame-ignore-revs
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ ├── feature_request.md
│ │ ├── new_release.md
│ │ └── other.md
│ ├── actions/
│ │ └── windows-reg-import/
│ │ └── action.yml
│ ├── ci/
│ │ └── windows/
│ │ └── custom.reg
│ ├── dependabot.yml
│ ├── pull_request_template.md
│ ├── release/
│ │ ├── release-notes-regexes.md
│ │ ├── release-procedure.md
│ │ └── windows-antimalware-analysis.md
│ ├── scripts/
│ │ ├── build-website.sh
│ │ ├── check-cross-version-deps.sc
│ │ ├── check-override-keywords.sh
│ │ ├── choco/
│ │ │ ├── scala-cli.nuspec
│ │ │ └── tools/
│ │ │ └── chocolateyinstall.ps1
│ │ ├── classify-changes.sh
│ │ ├── docker/
│ │ │ ├── ScalaCliDockerFile
│ │ │ └── ScalaCliSlimDockerFile
│ │ ├── generate-docker-image.sh
│ │ ├── generate-junit-reports.sc
│ │ ├── generate-native-image.sh
│ │ ├── generate-os-packages.sh
│ │ ├── generate-slim-docker-image.sh
│ │ ├── get-latest-cs.sh
│ │ ├── gpg-setup.sh
│ │ ├── process_release_notes.sc
│ │ ├── publish-docker-images.sh
│ │ ├── publish-sdkman.sh
│ │ ├── publish-slim-docker-images.sh
│ │ ├── scala-cli.rb.template
│ │ ├── scala.rb.template
│ │ ├── update-website.sh
│ │ └── verify_old_cpus.sh
│ └── workflows/
│ ├── ci.yml
│ ├── publish-docker.yml
│ ├── test-report.yml
│ └── website.yaml
├── .gitignore
├── .mill-jvm-opts
├── .mill-version
├── .scala-steward.conf
├── .scalafix.conf
├── .scalafix3.conf
├── .scalafmt.conf
├── AGENTS.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── DEV.md
├── Dockerfile
├── INTERNALS.md
├── LICENSE
├── LLM_POLICY.md
├── README.md
├── agentskills/
│ ├── README.md
│ ├── adding-directives/
│ │ └── SKILL.md
│ └── integration-tests/
│ └── SKILL.md
├── build.mill
├── gcbenchmark/
│ ├── .gitignore
│ ├── README.md
│ └── gcbenchmark.scala
├── gifs/
│ ├── Dockerfile
│ ├── README.md
│ ├── create_missing.sc
│ ├── demo-magic.sh
│ ├── demo-no-magic.sh
│ ├── example.sh
│ ├── run_scenario.sh
│ ├── scenarios/
│ │ ├── complete-install.sh
│ │ ├── defaults.sh
│ │ ├── demo.sh
│ │ ├── education.sh
│ │ ├── embeddable_scripts.sh
│ │ ├── fast-scripts.sh
│ │ ├── learning_curve.sh
│ │ ├── powerful_scripts.sh
│ │ ├── projects.sh
│ │ ├── prototyping.sh
│ │ ├── scripting.sh
│ │ ├── self-contained-examples.sh
│ │ ├── todo.sh
│ │ ├── universal_tool.sh
│ │ └── versions.sh
│ └── svg_render/
│ ├── Dockerfile
│ └── README.md
├── mill
├── mill.bat
├── millw
├── modules/
│ ├── build/
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── scala/
│ │ │ │ └── build/
│ │ │ │ └── internal/
│ │ │ │ ├── Chdir.java
│ │ │ │ ├── ChdirGraalvm.java
│ │ │ │ ├── GraalvmUnistdExtras.java
│ │ │ │ └── JavaParserProxyMakerSubst.java
│ │ │ └── scala/
│ │ │ └── scala/
│ │ │ └── build/
│ │ │ ├── Bloop.scala
│ │ │ ├── BloopBuildClient.scala
│ │ │ ├── Build.scala
│ │ │ ├── BuildThreads.scala
│ │ │ ├── Builds.scala
│ │ │ ├── CollectionOps.scala
│ │ │ ├── ConsoleBloopBuildClient.scala
│ │ │ ├── CrossBuildParams.scala
│ │ │ ├── CrossKey.scala
│ │ │ ├── CrossSources.scala
│ │ │ ├── Directories.scala
│ │ │ ├── GeneratedSource.scala
│ │ │ ├── LocalRepo.scala
│ │ │ ├── PersistentDiagnosticLogger.scala
│ │ │ ├── Project.scala
│ │ │ ├── ReplArtifacts.scala
│ │ │ ├── ScalaCompilerParams.scala
│ │ │ ├── ScalafixArtifacts.scala
│ │ │ ├── ScopedSources.scala
│ │ │ ├── Sources.scala
│ │ │ ├── bsp/
│ │ │ │ ├── BloopSession.scala
│ │ │ │ ├── Bsp.scala
│ │ │ │ ├── BspClient.scala
│ │ │ │ ├── BspImpl.scala
│ │ │ │ ├── BspReloadableOptions.scala
│ │ │ │ ├── BspServer.scala
│ │ │ │ ├── BspThreads.scala
│ │ │ │ ├── BuildClientForwardStubs.scala
│ │ │ │ ├── BuildServerForwardStubs.scala
│ │ │ │ ├── BuildServerProxy.scala
│ │ │ │ ├── HasGeneratedSources.scala
│ │ │ │ ├── HasGeneratedSourcesImpl.scala
│ │ │ │ ├── IdeInputs.scala
│ │ │ │ ├── JavaBuildServerForwardStubs.scala
│ │ │ │ ├── JsonRpcErrorCodes.scala
│ │ │ │ ├── JvmBuildServerForwardStubs.scala
│ │ │ │ ├── LoggingBuildClient.scala
│ │ │ │ ├── LoggingBuildServer.scala
│ │ │ │ ├── LoggingBuildServerAll.scala
│ │ │ │ ├── LoggingJavaBuildServer.scala
│ │ │ │ ├── LoggingJvmBuildServer.scala
│ │ │ │ ├── LoggingScalaBuildServer.scala
│ │ │ │ ├── ScalaBuildServerForwardStubs.scala
│ │ │ │ ├── package.scala
│ │ │ │ └── protocol/
│ │ │ │ └── TextEdit.scala
│ │ │ ├── compiler/
│ │ │ │ ├── BloopCompiler.scala
│ │ │ │ ├── BloopCompilerMaker.scala
│ │ │ │ ├── ScalaCompiler.scala
│ │ │ │ ├── ScalaCompilerMaker.scala
│ │ │ │ ├── SimpleJavaCompiler.scala
│ │ │ │ ├── SimpleScalaCompiler.scala
│ │ │ │ └── SimpleScalaCompilerMaker.scala
│ │ │ ├── input/
│ │ │ │ ├── Element.scala
│ │ │ │ ├── ElementsUtils.scala
│ │ │ │ ├── Inputs.scala
│ │ │ │ ├── ScalaCliInvokeData.scala
│ │ │ │ └── WorkspaceOrigin.scala
│ │ │ ├── internal/
│ │ │ │ ├── AmmUtil.scala
│ │ │ │ ├── AppCodeWrapper.scala
│ │ │ │ ├── ClassCodeWrapper.scala
│ │ │ │ ├── JavaParserProxy.scala
│ │ │ │ ├── JavaParserProxyBinary.scala
│ │ │ │ ├── JavaParserProxyJvm.scala
│ │ │ │ ├── JavaParserProxyMaker.scala
│ │ │ │ ├── MainClass.scala
│ │ │ │ ├── ManifestJar.scala
│ │ │ │ ├── ObjectCodeWrapper.scala
│ │ │ │ ├── Runner.scala
│ │ │ │ ├── WrapperUtils.scala
│ │ │ │ ├── markdown/
│ │ │ │ │ ├── MarkdownCodeBlock.scala
│ │ │ │ │ ├── MarkdownCodeWrapper.scala
│ │ │ │ │ └── MarkdownOpenFence.scala
│ │ │ │ ├── resource/
│ │ │ │ │ ├── NativeResourceMapper.scala
│ │ │ │ │ └── ResourceMapper.scala
│ │ │ │ ├── util/
│ │ │ │ │ ├── RegexUtils.scala
│ │ │ │ │ └── WarningMessages.scala
│ │ │ │ └── zip/
│ │ │ │ └── WrappedZipInputStream.scala
│ │ │ ├── package.scala
│ │ │ ├── postprocessing/
│ │ │ │ ├── AsmPositionUpdater.scala
│ │ │ │ ├── ByteCodePostProcessor.scala
│ │ │ │ ├── LineConversion.scala
│ │ │ │ ├── PostProcessor.scala
│ │ │ │ ├── SemanticDbPostProcessor.scala
│ │ │ │ ├── SemanticdbProcessor.scala
│ │ │ │ └── TastyPostProcessor.scala
│ │ │ └── preprocessing/
│ │ │ ├── CustomDirectivesReporter.scala
│ │ │ ├── DataPreprocessor.scala
│ │ │ ├── DeprecatedDirectives.scala
│ │ │ ├── DirectivesPreprocessor.scala
│ │ │ ├── ExtractedDirectives.scala
│ │ │ ├── JarPreprocessor.scala
│ │ │ ├── JavaPreprocessor.scala
│ │ │ ├── MarkdownCodeBlockProcessor.scala
│ │ │ ├── MarkdownPreprocessor.scala
│ │ │ ├── PreprocessedMarkdown.scala
│ │ │ ├── PreprocessedSource.scala
│ │ │ ├── PreprocessingUtil.scala
│ │ │ ├── Preprocessor.scala
│ │ │ ├── ScalaPreprocessor.scala
│ │ │ ├── ScriptPreprocessor.scala
│ │ │ ├── SheBang.scala
│ │ │ ├── UsingDirectivesOps.scala
│ │ │ └── directives/
│ │ │ ├── DirectivesPreprocessingUtils.scala
│ │ │ ├── PartiallyProcessedDirectives.scala
│ │ │ └── PreprocessedDirectives.scala
│ │ └── test/
│ │ └── scala/
│ │ └── scala/
│ │ └── build/
│ │ ├── options/
│ │ │ └── publish/
│ │ │ ├── ComputeVersionTests.scala
│ │ │ └── VcsParseTest.scala
│ │ └── tests/
│ │ ├── ActionableDiagnosticTests.scala
│ │ ├── BspServerTests.scala
│ │ ├── BuildOptionsTests.scala
│ │ ├── BuildProjectTests.scala
│ │ ├── BuildTests.scala
│ │ ├── BuildTestsBloop.scala
│ │ ├── BuildTestsScalac.scala
│ │ ├── DirectiveTests.scala
│ │ ├── DistinctByTests.scala
│ │ ├── ExcludeTests.scala
│ │ ├── FrameworkDiscoveryTests.scala
│ │ ├── InputsTests.scala
│ │ ├── JavaTestRunnerTests.scala
│ │ ├── OfflineTests.scala
│ │ ├── PackagingUsingDirectiveTests.scala
│ │ ├── PreprocessingTests.scala
│ │ ├── ReplArtifactsTests.scala
│ │ ├── ScalaNativeUsingDirectiveTests.scala
│ │ ├── ScalaPreprocessorTests.scala
│ │ ├── ScriptWrapperTests.scala
│ │ ├── SourceGeneratorTests.scala
│ │ ├── SourcesTests.scala
│ │ ├── TestInputs.scala
│ │ ├── TestLogger.scala
│ │ ├── TestUtil.scala
│ │ ├── markdown/
│ │ │ ├── MarkdownCodeBlockTests.scala
│ │ │ ├── MarkdownCodeWrapperTests.scala
│ │ │ └── MarkdownTestUtil.scala
│ │ └── util/
│ │ └── BloopServer.scala
│ ├── build-macros/
│ │ └── src/
│ │ ├── main/
│ │ │ └── scala/
│ │ │ └── scala/
│ │ │ └── build/
│ │ │ ├── EitherCps.scala
│ │ │ ├── EitherSequence.scala
│ │ │ └── Ops.scala
│ │ ├── negative-tests/
│ │ │ └── MismatchedLeft.scala
│ │ └── test/
│ │ └── scala/
│ │ └── scala/
│ │ └── build/
│ │ └── CPSTest.scala
│ ├── cli/
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── scala/
│ │ │ │ └── cli/
│ │ │ │ ├── commands/
│ │ │ │ │ ├── pgp/
│ │ │ │ │ │ └── PgpCommandsSubst.java
│ │ │ │ │ └── publish/
│ │ │ │ │ └── PgpProxyMakerSubst.java
│ │ │ │ └── internal/
│ │ │ │ ├── Argv0Subst.java
│ │ │ │ ├── Argv0SubstWindows.java
│ │ │ │ ├── BouncycastleSignerMakerSubst.java
│ │ │ │ ├── CsJniUtilsFeature.java
│ │ │ │ ├── LibsodiumjniFeature.java
│ │ │ │ ├── PPrintStringPrefixSubst.java
│ │ │ │ └── PidSubst.java
│ │ │ ├── resources/
│ │ │ │ └── META-INF/
│ │ │ │ └── native-image/
│ │ │ │ ├── extras/
│ │ │ │ │ ├── coursier/
│ │ │ │ │ │ └── reflect-config.json
│ │ │ │ │ └── pprint/
│ │ │ │ │ └── reflect-config.json
│ │ │ │ └── org.virtuslab/
│ │ │ │ └── scala-cli-core/
│ │ │ │ ├── jni-config.json
│ │ │ │ ├── native-image.properties
│ │ │ │ ├── proxy-config.json
│ │ │ │ ├── reflect-config.json
│ │ │ │ └── resource-config.json
│ │ │ └── scala/
│ │ │ ├── coursier/
│ │ │ │ └── CoursierUtil.scala
│ │ │ └── scala/
│ │ │ └── cli/
│ │ │ ├── CurrentParams.scala
│ │ │ ├── ScalaCli.scala
│ │ │ ├── ScalaCliCommands.scala
│ │ │ ├── commands/
│ │ │ │ ├── CommandUtils.scala
│ │ │ │ ├── CustomWindowsEnvVarUpdater.scala
│ │ │ │ ├── HelpCmd.scala
│ │ │ │ ├── NeedsArgvCommand.scala
│ │ │ │ ├── OptionsHelper.scala
│ │ │ │ ├── RestrictableCommand.scala
│ │ │ │ ├── RestrictedCommandsParser.scala
│ │ │ │ ├── ScalaCommand.scala
│ │ │ │ ├── ScalaCommandWithCustomHelp.scala
│ │ │ │ ├── ScalaVersions.scala
│ │ │ │ ├── WatchUtil.scala
│ │ │ │ ├── addpath/
│ │ │ │ │ ├── AddPath.scala
│ │ │ │ │ └── AddPathOptions.scala
│ │ │ │ ├── bloop/
│ │ │ │ │ ├── Bloop.scala
│ │ │ │ │ ├── BloopExit.scala
│ │ │ │ │ ├── BloopExitOptions.scala
│ │ │ │ │ ├── BloopJson.scala
│ │ │ │ │ ├── BloopOptions.scala
│ │ │ │ │ ├── BloopOutput.scala
│ │ │ │ │ ├── BloopOutputOptions.scala
│ │ │ │ │ ├── BloopStart.scala
│ │ │ │ │ └── BloopStartOptions.scala
│ │ │ │ ├── bsp/
│ │ │ │ │ ├── Bsp.scala
│ │ │ │ │ └── BspOptions.scala
│ │ │ │ ├── clean/
│ │ │ │ │ ├── Clean.scala
│ │ │ │ │ └── CleanOptions.scala
│ │ │ │ ├── compile/
│ │ │ │ │ ├── Compile.scala
│ │ │ │ │ └── CompileOptions.scala
│ │ │ │ ├── config/
│ │ │ │ │ ├── Config.scala
│ │ │ │ │ ├── ConfigOptions.scala
│ │ │ │ │ └── ThrowawayPgpSecret.scala
│ │ │ │ ├── default/
│ │ │ │ │ ├── Default.scala
│ │ │ │ │ ├── DefaultFile.scala
│ │ │ │ │ ├── DefaultFileOptions.scala
│ │ │ │ │ ├── DefaultOptions.scala
│ │ │ │ │ └── LegacyScalaOptions.scala
│ │ │ │ ├── dependencyupdate/
│ │ │ │ │ ├── DependencyUpdate.scala
│ │ │ │ │ └── DependencyUpdateOptions.scala
│ │ │ │ ├── directories/
│ │ │ │ │ ├── Directories.scala
│ │ │ │ │ └── DirectoriesOptions.scala
│ │ │ │ ├── doc/
│ │ │ │ │ ├── Doc.scala
│ │ │ │ │ └── DocOptions.scala
│ │ │ │ ├── export0/
│ │ │ │ │ ├── Export.scala
│ │ │ │ │ └── ExportOptions.scala
│ │ │ │ ├── fix/
│ │ │ │ │ ├── BuiltInRules.scala
│ │ │ │ │ ├── Fix.scala
│ │ │ │ │ ├── FixOptions.scala
│ │ │ │ │ ├── ScalafixOptions.scala
│ │ │ │ │ └── ScalafixRules.scala
│ │ │ │ ├── fmt/
│ │ │ │ │ ├── Fmt.scala
│ │ │ │ │ ├── FmtOptions.scala
│ │ │ │ │ └── FmtUtil.scala
│ │ │ │ ├── github/
│ │ │ │ │ ├── GitHubApi.scala
│ │ │ │ │ ├── HasSharedSecretOptions.scala
│ │ │ │ │ ├── LibSodiumJni.scala
│ │ │ │ │ ├── SecretCreate.scala
│ │ │ │ │ ├── SecretCreateOptions.scala
│ │ │ │ │ ├── SecretList.scala
│ │ │ │ │ ├── SecretListOptions.scala
│ │ │ │ │ └── SharedSecretOptions.scala
│ │ │ │ ├── installcompletions/
│ │ │ │ │ ├── InstallCompletions.scala
│ │ │ │ │ └── InstallCompletionsOptions.scala
│ │ │ │ ├── installhome/
│ │ │ │ │ ├── InstallHome.scala
│ │ │ │ │ └── InstallHomeOptions.scala
│ │ │ │ ├── new/
│ │ │ │ │ ├── New.scala
│ │ │ │ │ └── NewOptions.scala
│ │ │ │ ├── package0/
│ │ │ │ │ ├── Package.scala
│ │ │ │ │ ├── PackageOptions.scala
│ │ │ │ │ └── PackagerOptions.scala
│ │ │ │ ├── packaging/
│ │ │ │ │ └── Spark.scala
│ │ │ │ ├── pgp/
│ │ │ │ │ ├── DummyOptions.scala
│ │ │ │ │ ├── ExternalCommand.scala
│ │ │ │ │ ├── KeyServer.scala
│ │ │ │ │ ├── PgpCommand.scala
│ │ │ │ │ ├── PgpCommandNames.scala
│ │ │ │ │ ├── PgpCommands.scala
│ │ │ │ │ ├── PgpCreate.scala
│ │ │ │ │ ├── PgpCreateExternal.scala
│ │ │ │ │ ├── PgpExternalCommand.scala
│ │ │ │ │ ├── PgpExternalOptions.scala
│ │ │ │ │ ├── PgpKeyId.scala
│ │ │ │ │ ├── PgpKeyIdExternal.scala
│ │ │ │ │ ├── PgpProxy.scala
│ │ │ │ │ ├── PgpProxyJvm.scala
│ │ │ │ │ ├── PgpProxyMaker.scala
│ │ │ │ │ ├── PgpPull.scala
│ │ │ │ │ ├── PgpPullOptions.scala
│ │ │ │ │ ├── PgpPush.scala
│ │ │ │ │ ├── PgpPushOptions.scala
│ │ │ │ │ ├── PgpScalaSigningOptions.scala
│ │ │ │ │ ├── PgpSign.scala
│ │ │ │ │ ├── PgpSignExternal.scala
│ │ │ │ │ ├── PgpVerify.scala
│ │ │ │ │ ├── PgpVerifyExternal.scala
│ │ │ │ │ └── SharedPgpPushPullOptions.scala
│ │ │ │ ├── publish/
│ │ │ │ │ ├── ConfigUtil.scala
│ │ │ │ │ ├── GitRepo.scala
│ │ │ │ │ ├── GitRepoError.scala
│ │ │ │ │ ├── Ivy.scala
│ │ │ │ │ ├── OptionCheck.scala
│ │ │ │ │ ├── OptionChecks.scala
│ │ │ │ │ ├── Publish.scala
│ │ │ │ │ ├── PublishConnectionOptions.scala
│ │ │ │ │ ├── PublishLocal.scala
│ │ │ │ │ ├── PublishLocalOptions.scala
│ │ │ │ │ ├── PublishOptions.scala
│ │ │ │ │ ├── PublishParamsOptions.scala
│ │ │ │ │ ├── PublishRepositoryOptions.scala
│ │ │ │ │ ├── PublishSetup.scala
│ │ │ │ │ ├── PublishSetupOptions.scala
│ │ │ │ │ ├── PublishUtils.scala
│ │ │ │ │ ├── RepoParams.scala
│ │ │ │ │ ├── RepositoryParser.scala
│ │ │ │ │ ├── SetSecret.scala
│ │ │ │ │ ├── SharedPublishOptions.scala
│ │ │ │ │ └── checks/
│ │ │ │ │ ├── CheckUtils.scala
│ │ │ │ │ ├── ComputeVersionCheck.scala
│ │ │ │ │ ├── DeveloperCheck.scala
│ │ │ │ │ ├── LicenseCheck.scala
│ │ │ │ │ ├── NameCheck.scala
│ │ │ │ │ ├── OrganizationCheck.scala
│ │ │ │ │ ├── PasswordCheck.scala
│ │ │ │ │ ├── PgpSecretKeyCheck.scala
│ │ │ │ │ ├── RepositoryCheck.scala
│ │ │ │ │ ├── ScmCheck.scala
│ │ │ │ │ ├── UrlCheck.scala
│ │ │ │ │ └── UserCheck.scala
│ │ │ │ ├── repl/
│ │ │ │ │ ├── Repl.scala
│ │ │ │ │ ├── ReplOptions.scala
│ │ │ │ │ └── SharedReplOptions.scala
│ │ │ │ ├── run/
│ │ │ │ │ ├── Run.scala
│ │ │ │ │ ├── RunMode.scala
│ │ │ │ │ ├── RunOptions.scala
│ │ │ │ │ └── SharedRunOptions.scala
│ │ │ │ ├── setupide/
│ │ │ │ │ ├── SetupIde.scala
│ │ │ │ │ └── SetupIdeOptions.scala
│ │ │ │ ├── shared/
│ │ │ │ │ ├── AllExternalHelpOptions.scala
│ │ │ │ │ ├── ArgSplitter.scala
│ │ │ │ │ ├── BenchmarkingOptions.scala
│ │ │ │ │ ├── CoursierOptions.scala
│ │ │ │ │ ├── CrossOptions.scala
│ │ │ │ │ ├── GlobalOptions.scala
│ │ │ │ │ ├── GlobalSuppressWarningOptions.scala
│ │ │ │ │ ├── HasGlobalOptions.scala
│ │ │ │ │ ├── HasSharedOptions.scala
│ │ │ │ │ ├── HasSharedWatchOptions.scala
│ │ │ │ │ ├── HelpGroupOptions.scala
│ │ │ │ │ ├── HelpGroups.scala
│ │ │ │ │ ├── HelpMessages.scala
│ │ │ │ │ ├── HelpOptions.scala
│ │ │ │ │ ├── JavaPropOptions.scala
│ │ │ │ │ ├── LoggingOptions.scala
│ │ │ │ │ ├── MainClassOptions.scala
│ │ │ │ │ ├── MarkdownOptions.scala
│ │ │ │ │ ├── ScalaCliHelp.scala
│ │ │ │ │ ├── ScalaJsOptions.scala
│ │ │ │ │ ├── ScalaNativeOptions.scala
│ │ │ │ │ ├── ScalacExtraOptions.scala
│ │ │ │ │ ├── ScalacOptions.scala
│ │ │ │ │ ├── ScopeOptions.scala
│ │ │ │ │ ├── SemanticDbOptions.scala
│ │ │ │ │ ├── SharedBspFileOptions.scala
│ │ │ │ │ ├── SharedCompilationServerOptions.scala
│ │ │ │ │ ├── SharedDebugOptions.scala
│ │ │ │ │ ├── SharedDependencyOptions.scala
│ │ │ │ │ ├── SharedInputOptions.scala
│ │ │ │ │ ├── SharedJavaOptions.scala
│ │ │ │ │ ├── SharedJvmOptions.scala
│ │ │ │ │ ├── SharedOptions.scala
│ │ │ │ │ ├── SharedPythonOptions.scala
│ │ │ │ │ ├── SharedVersionOptions.scala
│ │ │ │ │ ├── SharedWatchOptions.scala
│ │ │ │ │ ├── SharedWorkspaceOptions.scala
│ │ │ │ │ ├── SnippetOptions.scala
│ │ │ │ │ ├── SourceGeneratorOptions.scala
│ │ │ │ │ ├── SuppressWarningOptions.scala
│ │ │ │ │ └── VerbosityOptions.scala
│ │ │ │ ├── shebang/
│ │ │ │ │ ├── Shebang.scala
│ │ │ │ │ └── ShebangOptions.scala
│ │ │ │ ├── test/
│ │ │ │ │ ├── Test.scala
│ │ │ │ │ └── TestOptions.scala
│ │ │ │ ├── uninstall/
│ │ │ │ │ ├── Uninstall.scala
│ │ │ │ │ └── UninstallOptions.scala
│ │ │ │ ├── uninstallcompletions/
│ │ │ │ │ ├── SharedUninstallCompletionsOptions.scala
│ │ │ │ │ ├── UninstallCompletions.scala
│ │ │ │ │ └── UninstallCompletionsOptions.scala
│ │ │ │ ├── update/
│ │ │ │ │ ├── Update.scala
│ │ │ │ │ └── UpdateOptions.scala
│ │ │ │ ├── util/
│ │ │ │ │ ├── BuildCommandHelpers.scala
│ │ │ │ │ ├── CommandHelpers.scala
│ │ │ │ │ ├── HelpUtils.scala
│ │ │ │ │ ├── JvmUtils.scala
│ │ │ │ │ ├── RunHadoop.scala
│ │ │ │ │ ├── RunSpark.scala
│ │ │ │ │ ├── ScalaCliSttpBackend.scala
│ │ │ │ │ └── ScalacOptionsUtil.scala
│ │ │ │ └── version/
│ │ │ │ ├── Version.scala
│ │ │ │ └── VersionOptions.scala
│ │ │ ├── errors/
│ │ │ │ ├── FailedToSignFileError.scala
│ │ │ │ ├── FoundVirtualInputsError.scala
│ │ │ │ ├── GitHubApiError.scala
│ │ │ │ ├── GraalVMNativeImageError.scala
│ │ │ │ ├── InvalidSonatypePublishCredentials.scala
│ │ │ │ ├── MalformedChecksumsError.scala
│ │ │ │ ├── MalformedOptionError.scala
│ │ │ │ ├── MissingConfigEntryError.scala
│ │ │ │ ├── MissingPublishOptionError.scala
│ │ │ │ ├── PgpError.scala
│ │ │ │ ├── ScalaJsLinkingError.scala
│ │ │ │ ├── ScaladocGenerationFailedError.scala
│ │ │ │ ├── UploadError.scala
│ │ │ │ └── WrongSonatypeServerError.scala
│ │ │ ├── exportCmd/
│ │ │ │ ├── JsonProject.scala
│ │ │ │ ├── JsonProjectDescriptor.scala
│ │ │ │ ├── MavenProject.scala
│ │ │ │ ├── MavenProjectDescriptor.scala
│ │ │ │ ├── MillProject.scala
│ │ │ │ ├── MillProjectDescriptor.scala
│ │ │ │ ├── Project.scala
│ │ │ │ ├── ProjectDescriptor.scala
│ │ │ │ ├── SbtProject.scala
│ │ │ │ └── SbtProjectDescriptor.scala
│ │ │ ├── internal/
│ │ │ │ ├── Argv0.scala
│ │ │ │ ├── CachedBinary.scala
│ │ │ │ ├── CliLogger.scala
│ │ │ │ ├── PPrintStringPrefixHelper.scala
│ │ │ │ ├── Pid.scala
│ │ │ │ ├── ProcUtil.scala
│ │ │ │ ├── ProfileFileUpdater.scala
│ │ │ │ └── ScalaJsLinker.scala
│ │ │ ├── javaLauncher/
│ │ │ │ └── JavaLauncherCli.scala
│ │ │ ├── launcher/
│ │ │ │ ├── LauncherCli.scala
│ │ │ │ ├── LauncherOptions.scala
│ │ │ │ ├── PowerOptions.scala
│ │ │ │ └── ScalaRunnerLauncherOptions.scala
│ │ │ ├── packaging/
│ │ │ │ ├── Library.scala
│ │ │ │ └── NativeImage.scala
│ │ │ ├── publish/
│ │ │ │ ├── BouncycastleExternalSigner.scala
│ │ │ │ └── BouncycastleSignerMaker.scala
│ │ │ └── util/
│ │ │ ├── ArgHelpers.scala
│ │ │ ├── ArgParsers.scala
│ │ │ ├── ConfigDbUtils.scala
│ │ │ ├── ConfigPasswordOptionHelpers.scala
│ │ │ ├── MaybeConfigPasswordOption.scala
│ │ │ └── SeqHelpers.scala
│ │ └── test/
│ │ └── scala/
│ │ ├── cli/
│ │ │ ├── commands/
│ │ │ │ └── tests/
│ │ │ │ ├── DocTests.scala
│ │ │ │ ├── ReplOptionsTests.scala
│ │ │ │ └── RunOptionsTests.scala
│ │ │ └── tests/
│ │ │ ├── ArgSplitterTest.scala
│ │ │ ├── CachedBinaryTests.scala
│ │ │ ├── HelpCheck.scala
│ │ │ ├── LauncherCliTest.scala
│ │ │ ├── OptionsCheck.scala
│ │ │ ├── PackageTests.scala
│ │ │ ├── ScalafmtTests.scala
│ │ │ ├── SetupScalaCLITests.scala
│ │ │ └── TestUtil.scala
│ │ └── scala/
│ │ └── cli/
│ │ ├── commands/
│ │ │ └── publish/
│ │ │ └── IvyTests.scala
│ │ └── tests/
│ │ └── ScalacOptionsPrintTest.scala
│ ├── config/
│ │ └── src/
│ │ └── main/
│ │ └── scala/
│ │ └── scala/
│ │ └── cli/
│ │ └── config/
│ │ ├── ConfigDb.scala
│ │ ├── CredentialsValue.scala
│ │ ├── ErrorMessages.scala
│ │ ├── Key.scala
│ │ ├── Keys.scala
│ │ ├── PasswordOption.scala
│ │ ├── PublishCredentials.scala
│ │ ├── RawJson.scala
│ │ ├── RepositoryCredentials.scala
│ │ ├── Secret.scala
│ │ └── internal/
│ │ └── JavaHelper.scala
│ ├── core/
│ │ └── src/
│ │ └── main/
│ │ └── scala/
│ │ └── scala/
│ │ └── build/
│ │ ├── CsUtils.scala
│ │ ├── Logger.scala
│ │ ├── Os.scala
│ │ ├── Position.scala
│ │ ├── RepositoryUtils.scala
│ │ ├── errors/
│ │ │ ├── AmbiguousPlatformError.scala
│ │ │ ├── BuildException.scala
│ │ │ ├── BuildInfoGenerationError.scala
│ │ │ ├── CantDownloadAmmoniteError.scala
│ │ │ ├── CheckScalaCliVersionError.scala
│ │ │ ├── CompositeBuildException.scala
│ │ │ ├── ConfigDbException.scala
│ │ │ ├── CoursierDependencyError.scala
│ │ │ ├── DependencyFormatError.scala
│ │ │ ├── Diagnostic.scala
│ │ │ ├── DirectiveErrors.scala
│ │ │ ├── ExcludeDefinitionError.scala
│ │ │ ├── FetchingDependenciesError.scala
│ │ │ ├── FileNotFoundException.scala
│ │ │ ├── ForbiddenPathReferenceError.scala
│ │ │ ├── InputsException.scala
│ │ │ ├── InvalidBinaryScalaVersionError.scala
│ │ │ ├── JmhBuildFailedError.scala
│ │ │ ├── JvmDownloadError.scala
│ │ │ ├── MainClassError.scala
│ │ │ ├── MalformedCliInputError.scala
│ │ │ ├── MalformedDirectiveError.scala
│ │ │ ├── MalformedInputError.scala
│ │ │ ├── MalformedPlatformError.scala
│ │ │ ├── MarkdownUnclosedBackticksError.scala
│ │ │ ├── ModuleFormatError.scala
│ │ │ ├── MultipleScalaVersionsError.scala
│ │ │ ├── NoDocBuildError.scala
│ │ │ ├── NoFrameworkFoundByBridgeError.scala
│ │ │ ├── NoFrameworkFoundByNativeBridgeError.scala
│ │ │ ├── NoMainClassFoundError.scala
│ │ │ ├── NoScalaVersionProvidedError.scala
│ │ │ ├── NoTestFrameworkFoundError.scala
│ │ │ ├── NoTestFrameworkValueProvidedError.scala
│ │ │ ├── NoTestsRun.scala
│ │ │ ├── NoValidScalaVersionFoundError.scala
│ │ │ ├── NoValueProvidedError.scala
│ │ │ ├── NodeNotFoundError.scala
│ │ │ ├── ParsingInputsException.scala
│ │ │ ├── RepositoryFormatError.scala
│ │ │ ├── ScalaNativeBuildError.scala
│ │ │ ├── ScalaNativeCompatibilityError.scala
│ │ │ ├── ScalaVersionError.scala
│ │ │ ├── ScalafixPropertiesError.scala
│ │ │ ├── SeveralMainClassesFoundError.scala
│ │ │ ├── Severity.scala
│ │ │ ├── TestError.scala
│ │ │ ├── TooManyFrameworksFoundByBridgeError.scala
│ │ │ ├── ToolkitVersionError.scala
│ │ │ ├── UnexpectedDirectiveError.scala
│ │ │ ├── UnexpectedJvmPlatformVersionError.scala
│ │ │ ├── UnrecognizedDebugModeError.scala
│ │ │ ├── UnrecognizedJsOptModeError.scala
│ │ │ ├── UnsupportedFeatureError.scala
│ │ │ ├── UnsupportedGradleModuleVariantError.scala
│ │ │ ├── UnsupportedScalaVersionError.scala
│ │ │ ├── UnusedDirectiveError.scala
│ │ │ └── WorkspaceError.scala
│ │ ├── internals/
│ │ │ ├── CodeWrapper.scala
│ │ │ ├── ConsoleUtils.scala
│ │ │ ├── CsLoggerUtil.scala
│ │ │ ├── CustomProgressBarRefreshDisplay.scala
│ │ │ ├── EnvVar.scala
│ │ │ ├── FeatureType.scala
│ │ │ ├── License.scala
│ │ │ ├── Licenses.scala
│ │ │ ├── Name.scala
│ │ │ ├── NativeWrapper.scala
│ │ │ ├── OsLibc.scala
│ │ │ ├── Regexes.scala
│ │ │ └── StableScalaVersion.scala
│ │ └── warnings/
│ │ └── DeprecatedWarning.scala
│ ├── directives/
│ │ └── src/
│ │ └── main/
│ │ └── scala/
│ │ └── scala/
│ │ └── build/
│ │ ├── directives/
│ │ │ ├── DirectiveDescription.scala
│ │ │ ├── DirectiveExamples.scala
│ │ │ ├── DirectiveGroupDetails.scala
│ │ │ ├── DirectiveGroupName.scala
│ │ │ ├── DirectiveLevel.scala
│ │ │ ├── DirectiveName.scala
│ │ │ ├── DirectiveSpecialSyntax.scala
│ │ │ ├── DirectiveUsage.scala
│ │ │ ├── DirectiveValueParser.scala
│ │ │ ├── HasBuildOptions.scala
│ │ │ ├── HasBuildOptionsWithRequirements.scala
│ │ │ ├── HasBuildRequirements.scala
│ │ │ └── ScopedValue.scala
│ │ ├── errors/
│ │ │ ├── ScalaJsLinkingError.scala
│ │ │ ├── SingleValueExpectedError.scala
│ │ │ ├── UsingDirectiveExpectationError.scala
│ │ │ ├── UsingFileFromUriError.scala
│ │ │ ├── WrongDirectoryPathError.scala
│ │ │ ├── WrongJarPathError.scala
│ │ │ ├── WrongJavaHomePathError.scala
│ │ │ └── WrongSourcePathError.scala
│ │ └── preprocessing/
│ │ ├── ScopePath.scala
│ │ ├── Scoped.scala
│ │ └── directives/
│ │ ├── Benchmarking.scala
│ │ ├── BuildInfo.scala
│ │ ├── ClasspathUtils.scala
│ │ ├── ComputeVersion.scala
│ │ ├── CustomJar.scala
│ │ ├── Dependency.scala
│ │ ├── Directive.scala
│ │ ├── DirectiveHandler.scala
│ │ ├── DirectivePrefix.scala
│ │ ├── DirectiveUtil.scala
│ │ ├── Exclude.scala
│ │ ├── JavaHome.scala
│ │ ├── JavaOptions.scala
│ │ ├── JavaProps.scala
│ │ ├── JavacOptions.scala
│ │ ├── Jvm.scala
│ │ ├── MainClass.scala
│ │ ├── ObjectWrapper.scala
│ │ ├── Packaging.scala
│ │ ├── Platform.scala
│ │ ├── Plugin.scala
│ │ ├── ProcessedDirective.scala
│ │ ├── Publish.scala
│ │ ├── PublishContextual.scala
│ │ ├── Python.scala
│ │ ├── Repository.scala
│ │ ├── RequirePlatform.scala
│ │ ├── RequireScalaVersion.scala
│ │ ├── RequireScalaVersionBounds.scala
│ │ ├── RequireScope.scala
│ │ ├── Resources.scala
│ │ ├── ScalaJs.scala
│ │ ├── ScalaNative.scala
│ │ ├── ScalaVersion.scala
│ │ ├── ScalacOptions.scala
│ │ ├── ScopedDirective.scala
│ │ ├── Sources.scala
│ │ ├── StrictDirective.scala
│ │ ├── Tests.scala
│ │ ├── Toolkit.scala
│ │ └── Watching.scala
│ ├── docs-tests/
│ │ ├── README.md
│ │ └── src/
│ │ ├── main/
│ │ │ └── scala/
│ │ │ └── sclicheck/
│ │ │ └── sclicheck.scala
│ │ └── test/
│ │ ├── resources/
│ │ │ └── test.md
│ │ └── scala/
│ │ └── sclicheck/
│ │ ├── DocTests.scala
│ │ ├── GifTests.scala
│ │ ├── MarkdownLinkTests.scala
│ │ ├── SclicheckTests.scala
│ │ └── TestUtil.scala
│ ├── dummy/
│ │ ├── amm/
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── scala/
│ │ │ └── AmmDummy.scala
│ │ └── scalafmt/
│ │ └── src/
│ │ └── main/
│ │ └── scala/
│ │ └── ScalafmtDummy.scala
│ ├── generate-reference-doc/
│ │ └── src/
│ │ └── main/
│ │ └── scala/
│ │ └── scala/
│ │ └── cli/
│ │ └── doc/
│ │ ├── GenerateReferenceDoc.scala
│ │ ├── InternalDocOptions.scala
│ │ └── ReferenceDocUtils.scala
│ ├── integration/
│ │ ├── docker/
│ │ │ └── src/
│ │ │ └── test/
│ │ │ └── scala/
│ │ │ └── scala/
│ │ │ └── cli/
│ │ │ └── integration/
│ │ │ └── RunDockerTests.scala
│ │ └── src/
│ │ ├── main/
│ │ │ └── scala/
│ │ │ └── scala/
│ │ │ └── cli/
│ │ │ └── integration/
│ │ │ └── TestInputs.scala
│ │ └── test/
│ │ ├── java/
│ │ │ └── scala/
│ │ │ └── cli/
│ │ │ └── integration/
│ │ │ └── bsp/
│ │ │ ├── WrappedSourceItem.java
│ │ │ ├── WrappedSourcesItem.java
│ │ │ └── WrappedSourcesResult.java
│ │ ├── resources/
│ │ │ └── test-keys/
│ │ │ ├── key.asc
│ │ │ └── key.skr
│ │ └── scala/
│ │ └── scala/
│ │ └── cli/
│ │ └── integration/
│ │ ├── ArgsFileTests.scala
│ │ ├── BloopTests.scala
│ │ ├── BspSuite.scala
│ │ ├── BspTestDefinitions.scala
│ │ ├── BspTests212.scala
│ │ ├── BspTests213.scala
│ │ ├── BspTests2Definitions.scala
│ │ ├── BspTests3Definitions.scala
│ │ ├── BspTests3Lts.scala
│ │ ├── BspTests3NextRc.scala
│ │ ├── BspTestsDefault.scala
│ │ ├── CleanTests.scala
│ │ ├── CompileScalacCompatTestDefinitions.scala
│ │ ├── CompileTestDefinitions.scala
│ │ ├── CompileTests212.scala
│ │ ├── CompileTests213.scala
│ │ ├── CompileTests3Lts.scala
│ │ ├── CompileTests3NextRc.scala
│ │ ├── CompileTests3StableDefinitions.scala
│ │ ├── CompileTestsDefault.scala
│ │ ├── CompilerPluginTestDefinitions.scala
│ │ ├── CompleteTests.scala
│ │ ├── ConfigTests.scala
│ │ ├── CoursierScalaInstallationTestHelper.scala
│ │ ├── DefaultFileTests.scala
│ │ ├── DefaultTests.scala
│ │ ├── DependencyUpdateTests.scala
│ │ ├── DirectoriesTests.scala
│ │ ├── DocTestDefinitions.scala
│ │ ├── DocTests212.scala
│ │ ├── DocTests213.scala
│ │ ├── DocTests3Lts.scala
│ │ ├── DocTests3NextRc.scala
│ │ ├── DocTestsDefault.scala
│ │ ├── ExportCommonTestDefinitions.scala
│ │ ├── ExportJsonTestDefinitions.scala
│ │ ├── ExportJsonTestsDefault.scala
│ │ ├── ExportMavenTest3NextRc.scala
│ │ ├── ExportMavenTestDefinitions.scala
│ │ ├── ExportMavenTestJava.scala
│ │ ├── ExportMavenTests212.scala
│ │ ├── ExportMavenTests213.scala
│ │ ├── ExportMavenTests3Lts.scala
│ │ ├── ExportMill012Tests212.scala
│ │ ├── ExportMill012Tests213.scala
│ │ ├── ExportMill012Tests3Lts.scala
│ │ ├── ExportMill012Tests3NextRc.scala
│ │ ├── ExportMill012TestsDefault.scala
│ │ ├── ExportMill1Tests212.scala
│ │ ├── ExportMill1Tests213.scala
│ │ ├── ExportMill1Tests3Lts.scala
│ │ ├── ExportMill1Tests3NextRc.scala
│ │ ├── ExportMill1TestsDefault.scala
│ │ ├── ExportMillTestDefinitions.scala
│ │ ├── ExportSbtTestDefinitions.scala
│ │ ├── ExportSbtTests212.scala
│ │ ├── ExportSbtTests213.scala
│ │ ├── ExportSbtTests3Lts.scala
│ │ ├── ExportSbtTests3NextRc.scala
│ │ ├── ExportSbtTestsDefault.scala
│ │ ├── ExportScalaOrientedBuildToolsTestDefinitions.scala
│ │ ├── ExportTestProjects.scala
│ │ ├── FixBuiltInRulesTestDefinitions.scala
│ │ ├── FixScalafixRulesTestDefinitions.scala
│ │ ├── FixTestDefinitions.scala
│ │ ├── FixTests212.scala
│ │ ├── FixTests213.scala
│ │ ├── FixTests3Lts.scala
│ │ ├── FixTests3NextRc.scala
│ │ ├── FixTestsDefault.scala
│ │ ├── FmtTests.scala
│ │ ├── GitHubTests.scala
│ │ ├── HadoopTests.scala
│ │ ├── HelpTests.scala
│ │ ├── InstallAndUninstallCompletionsTests.scala
│ │ ├── InstallHomeTests.scala
│ │ ├── JmhSuite.scala
│ │ ├── JmhTests.scala
│ │ ├── LegacyScalaRunnerTestDefinitions.scala
│ │ ├── LoggingTests.scala
│ │ ├── MarkdownTests.scala
│ │ ├── MavenTestHelper.scala
│ │ ├── MetaCheck.scala
│ │ ├── MillTestHelper.scala
│ │ ├── NativePackagerTests.scala
│ │ ├── NewTests.scala
│ │ ├── PackageTestDefinitions.scala
│ │ ├── PackageTests212.scala
│ │ ├── PackageTests213.scala
│ │ ├── PackageTests3Lts.scala
│ │ ├── PackageTests3NextRc.scala
│ │ ├── PackageTestsDefault.scala
│ │ ├── PgpTests.scala
│ │ ├── PublishLocalTestDefinitions.scala
│ │ ├── PublishLocalTests212.scala
│ │ ├── PublishLocalTests213.scala
│ │ ├── PublishLocalTests3Lts.scala
│ │ ├── PublishLocalTests3NextRc.scala
│ │ ├── PublishLocalTestsDefault.scala
│ │ ├── PublishSetupTests.scala
│ │ ├── PublishTestDefinitions.scala
│ │ ├── PublishTests212.scala
│ │ ├── PublishTests213.scala
│ │ ├── PublishTests3Lts.scala
│ │ ├── PublishTests3NextRc.scala
│ │ ├── PublishTestsDefault.scala
│ │ ├── ReplAmmoniteTestDefinitions.scala
│ │ ├── ReplAmmoniteTests3StableDefinitions.scala
│ │ ├── ReplTestDefinitions.scala
│ │ ├── ReplTests212.scala
│ │ ├── ReplTests213.scala
│ │ ├── ReplTests3Lts.scala
│ │ ├── ReplTests3NextRc.scala
│ │ ├── ReplTestsDefault.scala
│ │ ├── RunGistTestDefinitions.scala
│ │ ├── RunJdkTestDefinitions.scala
│ │ ├── RunPipedSourcesTestDefinitions.scala
│ │ ├── RunScalaJsTestDefinitions.scala
│ │ ├── RunScalaNativeTestDefinitions.scala
│ │ ├── RunScalaPyTestDefinitions.scala
│ │ ├── RunScalacCompatTestDefinitions.scala
│ │ ├── RunScriptTestDefinitions.scala
│ │ ├── RunSnippetTestDefinitions.scala
│ │ ├── RunTestDefinitions.scala
│ │ ├── RunTests212.scala
│ │ ├── RunTests213.scala
│ │ ├── RunTests3Lts.scala
│ │ ├── RunTests3NextRc.scala
│ │ ├── RunTestsDefault.scala
│ │ ├── RunWithWatchTestDefinitions.scala
│ │ ├── RunZipTestDefinitions.scala
│ │ ├── SbtTestHelper.scala
│ │ ├── ScalaCliSuite.scala
│ │ ├── ScriptWrapperTestDefinitions.scala
│ │ ├── SemanticDbTestDefinitions.scala
│ │ ├── SharedRunTests.scala
│ │ ├── SipScalaTests.scala
│ │ ├── SparkTestDefinitions.scala
│ │ ├── SparkTests212.scala
│ │ ├── SparkTests213.scala
│ │ ├── TestBspClient.scala
│ │ ├── TestNativeImageOnScala3.scala
│ │ ├── TestScalaVersionArgs.scala
│ │ ├── TestTestDefinitions.scala
│ │ ├── TestTests212.scala
│ │ ├── TestTests213.scala
│ │ ├── TestTests3Lts.scala
│ │ ├── TestTests3NextRc.scala
│ │ ├── TestTestsDefault.scala
│ │ ├── TestUtil.scala
│ │ ├── UpdateTests.scala
│ │ ├── VersionTests.scala
│ │ ├── WithWarmUpScalaCliSuite.scala
│ │ ├── package.scala
│ │ └── util/
│ │ ├── BloopUtil.scala
│ │ ├── CompilerPluginUtil.scala
│ │ └── DockerServer.scala
│ ├── java-test-runner/
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── scala/
│ │ └── build/
│ │ └── testrunner/
│ │ ├── JavaAsmTestRunner.java
│ │ ├── JavaDynamicTestRunner.java
│ │ ├── JavaFrameworkUtils.java
│ │ ├── JavaTestLogger.java
│ │ └── JavaTestRunner.java
│ ├── options/
│ │ └── src/
│ │ ├── main/
│ │ │ └── scala/
│ │ │ └── scala/
│ │ │ └── build/
│ │ │ ├── Artifacts.scala
│ │ │ ├── CoursierUtils.scala
│ │ │ ├── Positioned.scala
│ │ │ ├── ScalaArtifacts.scala
│ │ │ ├── TemporaryInMemoryRepository.scala
│ │ │ ├── actionable/
│ │ │ │ ├── ActionableDependencyHandler.scala
│ │ │ │ ├── ActionableDiagnostic.scala
│ │ │ │ ├── ActionableHandler.scala
│ │ │ │ ├── ActionablePreprocessor.scala
│ │ │ │ └── errors/
│ │ │ │ └── ActionableHandlerError.scala
│ │ │ ├── info/
│ │ │ │ ├── BuildInfo.scala
│ │ │ │ └── ScopedBuildInfo.scala
│ │ │ ├── interactive/
│ │ │ │ ├── Interactive.scala
│ │ │ │ └── InteractiveFileOps.scala
│ │ │ ├── internal/
│ │ │ │ ├── ExternalBinary.scala
│ │ │ │ ├── ExternalBinaryParams.scala
│ │ │ │ ├── FetchExternalBinary.scala
│ │ │ │ ├── ScalaJsLinkerConfig.scala
│ │ │ │ └── StdInConcurrentReader.scala
│ │ │ ├── internals/
│ │ │ │ └── Util.scala
│ │ │ └── options/
│ │ │ ├── BuildOptions.scala
│ │ │ ├── BuildRequirements.scala
│ │ │ ├── ClassPathOptions.scala
│ │ │ ├── ComputeVersion.scala
│ │ │ ├── ConfigMonoid.scala
│ │ │ ├── HasHashData.scala
│ │ │ ├── HasScope.scala
│ │ │ ├── HashedType.scala
│ │ │ ├── InternalDependenciesOptions.scala
│ │ │ ├── InternalOptions.scala
│ │ │ ├── JavaOpt.scala
│ │ │ ├── JavaOptions.scala
│ │ │ ├── JmhOptions.scala
│ │ │ ├── MaybeScalaVersion.scala
│ │ │ ├── PackageOptions.scala
│ │ │ ├── PackageType.scala
│ │ │ ├── Platform.scala
│ │ │ ├── PostBuildOptions.scala
│ │ │ ├── PublishContextualOptions.scala
│ │ │ ├── PublishOptions.scala
│ │ │ ├── ReplOptions.scala
│ │ │ ├── SNNumeralVersion.scala
│ │ │ ├── ScalaJsOptions.scala
│ │ │ ├── ScalaNativeOptions.scala
│ │ │ ├── ScalaOptions.scala
│ │ │ ├── ScalaSigningCliOptions.scala
│ │ │ ├── ScalaVersionUtil.scala
│ │ │ ├── ScalacOpt.scala
│ │ │ ├── Scope.scala
│ │ │ ├── ScriptOptions.scala
│ │ │ ├── SemanticDbOptions.scala
│ │ │ ├── ShadowingSeq.scala
│ │ │ ├── SourceGeneratorOptions.scala
│ │ │ ├── SuppressWarningOptions.scala
│ │ │ ├── TestOptions.scala
│ │ │ ├── WatchOptions.scala
│ │ │ ├── WithBuildRequirements.scala
│ │ │ ├── packaging/
│ │ │ │ ├── DebianOptions.scala
│ │ │ │ ├── DockerOptions.scala
│ │ │ │ ├── NativeImageOptions.scala
│ │ │ │ ├── RedHatOptions.scala
│ │ │ │ └── WindowsOptions.scala
│ │ │ ├── publish/
│ │ │ │ ├── ConfigPasswordOption.scala
│ │ │ │ ├── Developer.scala
│ │ │ │ ├── License.scala
│ │ │ │ ├── Signer.scala
│ │ │ │ └── Vcs.scala
│ │ │ ├── scalajs/
│ │ │ │ └── ScalaJsLinkerOptions.scala
│ │ │ └── validation/
│ │ │ └── BuildOptionsRule.scala
│ │ └── test/
│ │ └── scala/
│ │ └── scala/
│ │ └── build/
│ │ └── options/
│ │ └── ConfigMonoidTest.scala
│ ├── runner/
│ │ └── src/
│ │ └── main/
│ │ └── scala/
│ │ └── scala/
│ │ └── cli/
│ │ └── runner/
│ │ ├── Runner.scala
│ │ └── StackTracePrinter.scala
│ ├── scala-cli-bsp/
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── scala/
│ │ └── build/
│ │ └── bsp/
│ │ ├── ScalaScriptBuildServer.java
│ │ ├── WrappedSourceItem.java
│ │ ├── WrappedSourcesItem.java
│ │ ├── WrappedSourcesParams.java
│ │ └── WrappedSourcesResult.java
│ ├── scalaparse/
│ │ └── src/
│ │ └── main/
│ │ └── scala/
│ │ └── build/
│ │ └── internal/
│ │ ├── ImportTree.scala
│ │ └── ScalaParse.scala
│ ├── specification-level/
│ │ └── src/
│ │ └── main/
│ │ └── scala/
│ │ └── scala/
│ │ └── cli/
│ │ └── commands/
│ │ └── SpecificationLevel.scala
│ ├── tasty-lib/
│ │ └── src/
│ │ └── main/
│ │ └── scala/
│ │ └── scala/
│ │ └── build/
│ │ └── tastylib/
│ │ ├── TastyBuffer.scala
│ │ ├── TastyData.scala
│ │ ├── TastyFormat.scala
│ │ ├── TastyHeaderUnpickler.scala
│ │ ├── TastyName.scala
│ │ ├── TastyReader.scala
│ │ ├── TastyUnpickler.scala
│ │ ├── TastyVersions.scala
│ │ └── UnpickleException.scala
│ └── test-runner/
│ └── src/
│ └── main/
│ └── scala/
│ └── scala/
│ └── build/
│ └── testrunner/
│ ├── AsmTestRunner.scala
│ ├── DynamicTestRunner.scala
│ ├── FrameworkUtils.scala
│ ├── Logger.scala
│ └── TestRunner.scala
├── project/
│ ├── deps/
│ │ └── package.mill
│ ├── musl-image/
│ │ ├── Dockerfile
│ │ └── setup.sh
│ ├── package.mill
│ ├── publish/
│ │ └── package.mill
│ ├── settings/
│ │ └── package.mill
│ ├── utils/
│ │ └── package.mill
│ └── website/
│ └── package.mill
├── scala-cli
├── scala-cli-src
├── scala-cli.bat
├── scala-cli.sh
└── website/
├── .gitignore
├── README.md
├── babel.config.js
├── docs/
│ ├── _advanced_install.mdx
│ ├── _misc/
│ │ ├── _category_.json
│ │ ├── benchmarking.md
│ │ └── browse.md
│ ├── _scala-ecosystem.md
│ ├── commands/
│ │ ├── _category_.json
│ │ ├── basics.md
│ │ ├── clean.md
│ │ ├── compile.md
│ │ ├── completions.md
│ │ ├── config.md
│ │ ├── doc.md
│ │ ├── export.md
│ │ ├── fix.md
│ │ ├── fmt.md
│ │ ├── misc/
│ │ │ ├── _category_.json
│ │ │ ├── bloop.md
│ │ │ ├── default-file.md
│ │ │ └── pgp.md
│ │ ├── package.md
│ │ ├── publishing/
│ │ │ ├── _category_.json
│ │ │ ├── publish-local.md
│ │ │ ├── publish-setup.md
│ │ │ └── publish.md
│ │ ├── repl.md
│ │ ├── run.md
│ │ ├── setup-ide.md
│ │ ├── shebang.md
│ │ ├── test.md
│ │ └── version.md
│ ├── cookbooks/
│ │ ├── _category_.json
│ │ ├── ide/
│ │ │ ├── _category_.json
│ │ │ ├── emacs.md
│ │ │ ├── intellij-multi-bsp.md
│ │ │ ├── intellij-sbt-with-bsp.md
│ │ │ ├── intellij.md
│ │ │ └── vscode.md
│ │ ├── intro.md
│ │ ├── introduction/
│ │ │ ├── _category_.json
│ │ │ ├── debugging.md
│ │ │ ├── formatting.md
│ │ │ ├── gh-action.md
│ │ │ ├── gists.md
│ │ │ ├── instant-startup-scala-scripts.md
│ │ │ ├── scala-jvm.md
│ │ │ ├── scala-scripts.md
│ │ │ ├── scala-versions.md
│ │ │ ├── show-sources.md
│ │ │ └── test-only.md
│ │ └── package/
│ │ ├── _category_.json
│ │ ├── native-images.md
│ │ ├── scala-docker.md
│ │ └── scala-package.md
│ ├── getting_started.md
│ ├── guides/
│ │ ├── _category_.json
│ │ ├── advanced/
│ │ │ ├── _category_.json
│ │ │ ├── custom-toolkit.md
│ │ │ ├── internals.md
│ │ │ ├── java-properties.md
│ │ │ ├── piping.md
│ │ │ ├── scala-js.md
│ │ │ ├── scala-native.md
│ │ │ ├── snippets.md
│ │ │ └── verbosity.md
│ │ ├── intro.md
│ │ ├── introduction/
│ │ │ ├── _category_.json
│ │ │ ├── configuration.md
│ │ │ ├── dependencies.md
│ │ │ ├── ide.md
│ │ │ ├── old-runner-migration.md
│ │ │ ├── toolkit.md
│ │ │ ├── update-dependencies.md
│ │ │ └── using-directives.md
│ │ ├── power/
│ │ │ ├── _category_.json
│ │ │ ├── markdown.md
│ │ │ ├── offline.md
│ │ │ ├── proxy.md
│ │ │ ├── python.md
│ │ │ ├── repositories.md
│ │ │ └── sbt-mill.md
│ │ └── scripting/
│ │ ├── _category_.json
│ │ ├── scripts.md
│ │ └── shebang.md
│ ├── overview.md
│ ├── reference/
│ │ ├── _category_.json
│ │ ├── build-info.md
│ │ ├── cli-options.md
│ │ ├── commands.md
│ │ ├── dependency.md
│ │ ├── directives.md
│ │ ├── env-vars.md
│ │ ├── password-options.md
│ │ ├── root-dir.md
│ │ ├── scala-command/
│ │ │ ├── cli-options.md
│ │ │ ├── commands.md
│ │ │ ├── directives.md
│ │ │ ├── env-vars.md
│ │ │ ├── index.md
│ │ │ └── runner-specification.md
│ │ └── scala-versions.md
│ ├── release_notes.md
│ └── under-the-hood.md
├── docusaurus.config.js
├── package.json
├── safe-yarn.sh
├── sidebars.js
├── src/
│ ├── components/
│ │ ├── BasicInstall.js
│ │ ├── BigHeader.js
│ │ ├── DownloadButton.js
│ │ ├── IconBox.js
│ │ ├── ImageBox.js
│ │ ├── Layouts.js
│ │ ├── MarkdownComponents.js
│ │ ├── Section.js
│ │ ├── SectionAbout.js
│ │ ├── SectionImageBox.js
│ │ ├── SmallHeader.js
│ │ ├── TitleSection.js
│ │ ├── UseCase.js
│ │ ├── UseCaseTile.js
│ │ ├── YellowBanner.js
│ │ ├── features.js
│ │ └── osUtils.js
│ ├── css/
│ │ ├── custom copy.css
│ │ └── custom.css
│ ├── pages/
│ │ ├── education.js
│ │ ├── index.js
│ │ ├── index.module.css
│ │ ├── install.js
│ │ ├── markdown-page.md
│ │ ├── projects.js
│ │ ├── prototyping.js
│ │ ├── scripting.js
│ │ └── spark.md
│ ├── scss/
│ │ ├── _variables.scss
│ │ ├── components/
│ │ │ ├── runnable-sample.scss
│ │ │ ├── section-about.scss
│ │ │ ├── section-base.scss
│ │ │ ├── section-features.scss
│ │ │ ├── section-image-box.scss
│ │ │ ├── section-install-cli.scss
│ │ │ ├── section-use-tiles.scss
│ │ │ ├── section-yellow-banner.scss
│ │ │ └── tooltip.scss
│ │ └── style.scss
│ └── theme/
│ └── Root.js
└── static/
├── .nojekyll
└── CNAME
================================================
FILE CONTENTS
================================================
================================================
FILE: .dockerignore
================================================
./out
.bloop
.bsp
.metals
.scala-build
.scala
gifs
website
.github
Dockerfile
================================================
FILE: .git-blame-ignore-revs
================================================
# Scala Steward: Reformat with scalafmt 3.7.3
34ae72e8cf5878dccb44ac3f864cbf4892f18354
# Scala Steward: Reformat with scalafmt 3.8.2
6d2639650f6e0b941840b995cc30b7de7afff5a0
# Scala Steward: Reformat with scalafmt 3.8.3
52b913a12d8abdff1b340db668ebe38c59b423e4
# Scala Steward: Reformat with scalafmt 3.8.5
74f069ccdaa91872cb77dc1f902752221d588db1
# Scala Steward: Reformat with scalafmt 3.10.7
f45699aa27d21bfe09e087a6d355ab6abf1ff0e6
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: bug
assignees: ''
---
**Version(s)**
Please provide the version(s) of Scala CLI that is affected by this bug
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Please provide us with steps on how to reproduce the bug. Code snippets (or link to the used codebase) and used commands are especially useful.
**Expected behaviour**
A clear and concise description of what you expected to happen.
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: enhancement
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.
================================================
FILE: .github/ISSUE_TEMPLATE/new_release.md
================================================
---
name: Plan a release
about: Plan releasing a new version
title: "Release v[VERSION]"
labels: internal
assignees: ''
---
**What version number is to be released?**
v[VERSION]
**What is the estimated date for this release?**
[RELEASE DATE]
**Release procedure**
Please refer to the [Release Procedure doc](https://github.com/VirtusLab/scala-cli/blob/main/.github/release/release-procedure.md).
**Release notes**
Please remember to create a pull request with a draft of the release notes in the [Release Notes History doc](https://github.com/VirtusLab/scala-cli/blob/main/website/docs/release_notes.md).
Please make sure the notes render correctly on [the website](https://scala-cli.virtuslab.org/docs/release_notes).
That includes swapping out GitHub-idiomatic @mentions of users, links to PRs, issues, etc.
You can do that using the [regexes provided in this doc](https://github.com/VirtusLab/scala-cli/blob/main/.github/release/release-notes-regexes.md)
================================================
FILE: .github/ISSUE_TEMPLATE/other.md
================================================
---
name: Other
about: Request a change that is neither a new feature nor related to a bug.
title: ''
labels: ''
assignees: ''
---
**Version(s)**
Please provide the version(s) of Scala CLI for which the proposed change is necessary (if at all relevant).
**Describe what needs to be done and why**
A clear and concise description of what you want to happen - and why.
**Is your feature request related to a past ticket or discussion?**
Please mention any other issues or discussions relevant to this one.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions you've considered.
**Additional context**
Add any other context or screenshots that might be relevant in this section.
================================================
FILE: .github/actions/windows-reg-import/action.yml
================================================
name: windows-reg-import
description: Import a .reg file and verify those registry values (best-effort)
inputs:
reg-file:
description: "Path to the .reg file"
required: true
runs:
using: "composite"
steps:
- name: Attempt to import custom registry (best-effort)
shell: pwsh
run: |
try {
$regFile = Join-Path $env:GITHUB_WORKSPACE "${{ inputs.reg-file }}"
if (-not (Test-Path $regFile)) {
Write-Warning "Registry file not found (skipping): $regFile"
} else {
Write-Host "Importing registry from $regFile (attempting, non-fatal)"
reg import $regFile 2>&1 | ForEach-Object { Write-Host $_ }
}
} catch {
Write-Warning "Registry import failed (ignored): $_"
}
- name: Attempt to verify registry values (best-effort)
shell: pwsh
run: |
try {
$acp = (Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Nls\CodePage' -Name ACP -ErrorAction Stop).ACP
Write-Host "ACP = $acp"
} catch {
Write-Warning "Failed to read ACP (ignored): $_"
}
try {
$eb = (Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Nls\MUILanguagePreferences' -Name EnableBetaUnicode -ErrorAction Stop).EnableBetaUnicode
Write-Host "EnableBetaUnicode = $eb"
} catch {
Write-Warning "Failed to read EnableBetaUnicode (ignored): $_"
}
================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
groups:
github-actions:
patterns:
- "*"
- package-ecosystem: "npm"
directory: "/website"
schedule:
interval: "weekly"
groups:
npm-dependencies:
patterns:
- "*"
================================================
FILE: .github/pull_request_template.md
================================================
<!-- Fixes #XYZ (where XYZ is the issue number from the issue tracker) -->
<!-- TODO description of the change -->
<!-- if the PR is still a WIP, create it as a draft PR (or convert it into one) -->
## Checklist
- [ ] tested the solution locally and it works
- [ ] ran the code formatter (`scala-cli fmt .`)
- [ ] ran `scalafix` (`./mill -i __.fix`)
- [ ] ran reference docs auto-generation (`./mill -i 'generate-reference-doc[]'.run`)
## How much have your relied on LLM-based tools in this contribution?
<!--
State clearly in the pull request description,
whether LLM-based tools were used and to what extent
(extensively/moderately/minimally/not at all)
-->
<!--
Refer to our [LLM usage policy](https://github.com/scala/scala3/blob/main/LLM_POLICY.md) for rules and guidelines
regarding usage of LLM-based tools in contributions.
-->
## How was the solution tested?
<!--
If automated tests are included, mention it.
If they are not, explain why and how the solution was tested.
-->
## Additional notes
<!-- Placeholder for any extra context regarding this contribution. -->
<!-- When in doubt, check[our contribution guide](https://github.com/VirtusLab/scala-cli/blob/main/CONTRIBUTING.md) -->
================================================
FILE: .github/release/release-notes-regexes.md
================================================
# Regexes for preparing Scala CLI release notes
When auto-generating release notes from the GitHub UI, the notes will contain GitHub-idiomatic @mentions of users,
links to PRs, issues, etc. Those have to then be swapped out for the corresponding Markdown syntax to be rendered
correctly on our documentation website.
What's worse, the GitHub syntax has to be preserved in the GitHub release description, as using the full Markdown
syntax required by our website breaks the GitHub mouse hover magic.
This has since been automated in the [process_release_notes.sc](../scripts/process_release_notes.sc) script.
```bash
# Check if the release notes need processing
.github/scripts/process_release_notes.sc check website/docs/release_notes.md
# Error: File ~/scala-cli/website/docs/release_notes.md contains patterns that need transformation
# The following patterns were found that should be transformed:
# - Pattern: by @(.*?) in(?!.*\]\()
# - Pattern: (?<!\[)@(.*?) made(?!.*\]\()
# Run: .github/scripts/process_release_notes.sc apply <file>
# Apply the regexes to fix the release notes
.github/scripts/process_release_notes.sc apply website/docs/release_notes.md
# Applied regexes to: ~/scala-cli/website/docs/release_notes.md
# Verify that the release notes are now properly formatted
# This is the check we run on the CI, as well
.github/scripts/process_release_notes.sc verify website/docs/release_notes.md
# File /~/scala-cli/website/docs/release_notes.md is properly formatted
```
If you ever need to manually fix the release notes, you can use the old regexes below.
Do keep in mind that IDEA IntelliJ allows to automatically apply regexes when replacing text, so you can use that to
fix the release notes on the fly.

## PR link
Find: `in https\:\/\/github\.com\/VirtusLab\/scala\-cli\/pull\/(.*?)$` </br>
Replace: `in [#$1](https://github.com/VirtusLab/scala-cli/pull/$1)`
## Contributor link
Find: `by @(.*?) in` </br>
Replace: `by [@$1](https://github.com/$1) in`
## New contributor link
Find: `@(.*?) made` </br>
Replace: `[@$1](https://github.com/$1) made`
## No GH contributor link
Find: `by \[@(.*?).\(.*\) in` </br>
Replace: `by @$1 in`
================================================
FILE: .github/release/release-procedure.md
================================================
# Release procedure reference
- [ ] Draft release notes using the `Draft new release` button in the `Releases` section of `scala-cli` GitHub page.
- [ ] Create a tag for the new release.
- [ ] Use the `Auto-generate release notes` feature to pre-populate the document with pull requests included in the
release.
- [ ] Fill in the remaining sections, as in previous releases (features worth mentioning, notable changes, etc).
- [ ] Don't publish, save as draft instead
- [ ] Add the release notes on top
of [the release notes doc](https://github.com/VirtusLab/scala-cli/blob/main/website/docs/release_notes.md) and
create a PR.
- [ ] Make sure the notes render correctly on [the website](https://scala-cli.virtuslab.org/docs/release_notes) - that
includes swapping out GitHub-idiomatic @mentions of users, links to PRs, issues, etc.
- This is automated with the [process_release_notes.sc](../scripts/process_release_notes.sc) script.
- When using IntelliJ you can do that using the regexes in [release-notes-regexes.md](release-notes-regexes.md).
- [ ] Copy any fixes over to the draft after getting the PR reviewed and merged.
- [ ] Mark the release draft as `pre-release` and then `Publish Release`
- [ ] Wait for a green release CI build with all the updated versions.
- [ ] Double check if none of the steps failed, including individual distribution channels in
the `update-packages` and `windows-packages` jobs.
- [ ] ScalaCLI Setup
- [ ] Merge pull request with updated Scala CLI version
in [scala-cli-setup](https://github.com/VirtusLab/scala-cli-setup) repository. Pull request should be opened
automatically after release.
- [ ] Wait for the `Update dist` PR to be automatically created after the previous one has been merged, and then
proceed to merge it.
- [ ] Make a release with the updated Scala CLI version.
- [ ] Update the `v1` & `v1.12` tags to the latest release commit.
```bash
git fetch --all
git checkout origin v1.12.x
git tag -d v1.12
git tag v1.12
git push origin v1.12 -f
git tag -d v1
git tag v1
git push origin v1 -f
```
- [ ] Submit Scala CLI MSI installer `scala-cli-x86_64-pc-win32.msi` for malware analysis. The Msi file must be uploaded
using this [service](https://www.microsoft.com/en-us/wdsi/filesubmission). For more information on this process, refer
[here](windows-antimalware-analysis.md).
- [ ] Unmark release as `pre-release`.
- [ ] Announce the new release
- [ ] announce on Twitter
- [ ] announce on Discord
- [ ] announce on Reddit if the release contains any noteworthy changes
- [ ] Create a ticket for the next release using the `Plan a release` template and assign it to the person responsible.
================================================
FILE: .github/release/windows-antimalware-analysis.md
================================================
# Microsoft anti-malware analysis
As new Scala CLI are (wrongly) assumed to be PUA (potentially unwanted applications) by Microsoft Defender SmartScreen
on Windows, we need to submit them for analysis to Microsoft after release.
Note: the analysis may take time, and the results may not be immediately available.
Sometimes it's days, sometimes it's weeks.
It may even occur that the new release gets analysed while the previous one is still in the pipeline
due to reasons unknown to us.
As those eventually do pull through, we can't do much about it.
## Submitting a file for analysis
After going through the [release procedure](release-procedure.md), we need to submit the MSI installer
and the EXE launcher for analysis:
- [ ] Download the `scala-cli-x86_64-pc-win32.msi` and upload it using [this service](https://www.microsoft.com/en-us/wdsi/filesubmission).
- [ ] Download the `scala-cli-x86_64-pc-win32.zip`, extract it and upload `scala-cli.exe` using [the same service](https://www.microsoft.com/en-us/wdsi/filesubmission).
You will need to log in using your company account authorised by the VirtusLab IT division.
If you don't have one or if the one you do have doesn't have the right permissions
(even though you are a maintainer of the Scala CLI repository), be sure to reach out to IT.
## Submission form
When reaching https://www.microsoft.com/en-us/wdsi/filesubmission, you will be presented with a form to fill out.

Submit file as a `Software Developer` and click continue.

Make sure to grant your team members access to the submission by adding their emails
in the `Give additional user s access to the submission` section.
You can find the current Scala CLI team listed in the [Scala CLI publish module definition](../../project/publish.sc)
You might also want to add the `scala-cli@virtuslab.com` group email address.
Select `Windows Server Antimalware` as the security product used to scan the file.
Fill in `VirtusLab` as the `Company Name`.

#### What do you believe this file is?
Select `Incorrectly detected as PUA (potentially unwanted application)`.
#### Detection name
Microsoft Defender SmartScreen prevented an unrecognised app from starting.
#### Definition version
The version number for the Scala CLI release.
#### Additional information
When uploading the installer (`*.msi`), paste the following, fixing swapping out the version number and release link accordingly.
```text
This is the Scala CLI v<version number> installer for Microsoft Windows.
Scala CLI is the official runner of the Scala programming language.
For more information check https://github.com/VirtusLab/scala-cli/releases/tag/v<version number>
```
For the launcher (`*.exe`), use the (almost identical) following text:
```text
This is the Scala CLI v<version number> launcher for Microsoft Windows.
Scala CLI is the official runner of the Scala programming language.
For more information check https://github.com/VirtusLab/scala-cli/releases/tag/v<version number>
```
Click continue.

You might have to verify that you're a human, after which the submission should proceed.

Double-check the submission details are correct, ending the process.
================================================
FILE: .github/scripts/build-website.sh
================================================
#!/usr/bin/env bash
set -e
yarn --cwd website install
yarn --cwd website build
================================================
FILE: .github/scripts/check-cross-version-deps.sc
================================================
#!/usr/bin/env -S scala-cli shebang
//> using scala 3
//> using toolkit default
//> using options -Werror -Wunused:all
val modules =
os.proc(os.pwd / "mill", "-i", "resolve", "__[]")
.call(cwd = os.pwd)
.out
.lines()
for { module <- modules } {
println(s"Checking for $module...")
val depRegex = "[│└├─\\S\\s]+\\s([\\w.-]+):([\\w.-]+):([\\w\\s\\S.-]+)".r
val scalaDepSuffixRegex = "^(.+?)(_[23](?:\\.\\d{2})?)?$".r
val deps = os.proc(os.pwd / "mill", "-i", s"$module.showMvnDepsTree")
.call(cwd = os.pwd)
.out
.lines()
.filter(_.count(_ == ':') == 2)
.map { case depRegex(org, name, depVersion) => (org, name, depVersion) }
val invalidOrgAndName = "invalid:invalid"
val scalaVersionsByOrgAndName = deps
.groupBy {
case (org, scalaDepSuffixRegex(nameWithoutSuffix, _), _) => s"$org:$nameWithoutSuffix"
case _ => invalidOrgAndName
}
.collect {
case (key, entries) if key != invalidOrgAndName =>
key ->
entries
.collect { case (_, scalaDepSuffixRegex(_, scalaVersion), _) => scalaVersion }
.distinct
}
.filter { case (_, scalaVersions) => scalaVersions.head != null } // filter out non-Scala deps
println("Checking for clashing dependency Scala versions...")
val conflictEntries: Map[String, Vector[String]] =
scalaVersionsByOrgAndName
.filter { case (key, scalaVersions) =>
if scalaVersions.length == 1 then
println(s"[info] $key${scalaVersions.head} (OK)")
false
else
println(
s"[${Console.RED}error${Console.RESET}] $key: multiple conflicting Scala versions: ${scalaVersions.mkString(", ")}"
)
true
}
if conflictEntries.nonEmpty then
println(s"${Console.RED}ERROR: Found ${conflictEntries.size} conflicting entries for $module:")
conflictEntries.foreach {
case (key, scalaVersions) =>
println(s" $key: multiple conflicting Scala versions: ${scalaVersions.mkString(", ")}")
}
println(Console.RESET)
sys.exit(1)
else println(s"[info] $module OK")
}
println("Checks completed for:")
modules.foreach(m => println(s" $m"))
println("No conflicts detected.")
sys.exit(0)
================================================
FILE: .github/scripts/check-override-keywords.sh
================================================
#!/usr/bin/env bash
set -euo pipefail
# Checks the PR body for [test_*] override keywords.
# Inputs (env vars): EVENT_NAME, PR_BODY
# Outputs: writes override=true/false pairs to $GITHUB_OUTPUT and a summary table to $GITHUB_STEP_SUMMARY
if [[ "$EVENT_NAME" != "pull_request" ]]; then
echo "Non-PR event, setting all overrides to true"
for override in test_all test_native test_integration test_docs test_format; do
echo "$override=true" >> "$GITHUB_OUTPUT"
done
exit 0
fi
TEST_ALL=false; TEST_NATIVE=false; TEST_INTEGRATION=false; TEST_DOCS=false; TEST_FORMAT=false
check_override() {
local keyword="$1"
local var_name="$2"
if printf '%s' "$PR_BODY" | grep -qF "$keyword"; then
eval "$var_name=true"
echo "Override $keyword found"
fi
}
check_override "[test_all]" "TEST_ALL"
check_override "[test_native]" "TEST_NATIVE"
check_override "[test_integration]" "TEST_INTEGRATION"
check_override "[test_docs]" "TEST_DOCS"
check_override "[test_format]" "TEST_FORMAT"
echo "Override keywords:"
echo " test_all=$TEST_ALL"
echo " test_native=$TEST_NATIVE"
echo " test_integration=$TEST_INTEGRATION"
echo " test_docs=$TEST_DOCS"
echo " test_format=$TEST_FORMAT"
echo "test_all=$TEST_ALL" >> "$GITHUB_OUTPUT"
echo "test_native=$TEST_NATIVE" >> "$GITHUB_OUTPUT"
echo "test_integration=$TEST_INTEGRATION" >> "$GITHUB_OUTPUT"
echo "test_docs=$TEST_DOCS" >> "$GITHUB_OUTPUT"
echo "test_format=$TEST_FORMAT" >> "$GITHUB_OUTPUT"
echo "## Override keywords" >> "$GITHUB_STEP_SUMMARY"
echo "| Keyword | Active |" >> "$GITHUB_STEP_SUMMARY"
echo "|---------|--------|" >> "$GITHUB_STEP_SUMMARY"
echo "| [test_all] | $TEST_ALL |" >> "$GITHUB_STEP_SUMMARY"
echo "| [test_native] | $TEST_NATIVE |" >> "$GITHUB_STEP_SUMMARY"
echo "| [test_integration] | $TEST_INTEGRATION |" >> "$GITHUB_STEP_SUMMARY"
echo "| [test_docs] | $TEST_DOCS |" >> "$GITHUB_STEP_SUMMARY"
echo "| [test_format] | $TEST_FORMAT |" >> "$GITHUB_STEP_SUMMARY"
================================================
FILE: .github/scripts/choco/scala-cli.nuspec
================================================
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2015/06/nuspec.xsd">
<metadata>
<id>scala-cli</id>
<version>@LAUNCHER_VERSION@</version>
<title>Scala CLI</title>
<authors>virtuslab-chocolatey</authors>
<owners>virtuslab-chocolatey</owners>
<tags>scala-cli</tags>
<summary>Scala CLI</summary>
<description>Scala CLI is a command-line tool to interact with the Scala language. It lets you compile, run, test, and package your Scala code (and more!)</description>
<packageSourceUrl>https://github.com/VirtusLab/scala-cli/tree/main/.github/scripts/choco</packageSourceUrl>
<projectSourceUrl>https://github.com/VirtusLab/scala-cli</projectSourceUrl>
<projectUrl>https://scala-cli.virtuslab.org/</projectUrl>
<bugTrackerUrl>https://github.com/VirtusLab/scala-cli/issues</bugTrackerUrl>
<copyright>© 2021-2022 VirtusLab Sp. z. o. o.</copyright>
<iconUrl>https://cdn.jsdelivr.net/gh/VirtusLab/scala-cli@e4c0eb72276ae77e689c61a83230ec16324791e8/.github/scripts/choco/logo.ico</iconUrl>
<licenseUrl>https://github.com/VirtusLab/scala-cli/blob/main/LICENSE</licenseUrl>
<requireLicenseAcceptance>true</requireLicenseAcceptance>
<releaseNotes>https://github.com/VirtusLab/scala-cli/releases</releaseNotes>
</metadata>
<files>
<file src="tools\**" target="tools" />
</files>
</package>
================================================
FILE: .github/scripts/choco/tools/chocolateyinstall.ps1
================================================
$ErrorActionPreference = 'Stop';
$url64 = '@LAUNCHER_URL@'
$packageArgs = @{
packageName = 'scala-cli'
fileType = 'MSI'
url64bit = $url64
softwareName = 'Scala CLI'
checksum64 = '@LAUNCHER_SHA256@'
checksumType64= 'sha256'
silentArgs = "/qn /norestart"
validExitCodes= @(0)
}
Install-ChocolateyPackage @packageArgs
================================================
FILE: .github/scripts/classify-changes.sh
================================================
#!/usr/bin/env bash
set -euo pipefail
# Classifies changed files into categories for CI job filtering.
# Inputs (env vars): EVENT_NAME, BASE_REF
# Outputs: writes category=true/false pairs to $GITHUB_OUTPUT and a summary table to $GITHUB_STEP_SUMMARY
if [[ "$EVENT_NAME" != "pull_request" ]]; then
echo "Non-PR event ($EVENT_NAME), setting all categories to true"
for cat in code docs ci format_config benchmark gifs mill_wrapper; do
echo "$cat=true" >> "$GITHUB_OUTPUT"
done
exit 0
fi
CHANGED_FILES=$(git diff --name-only "origin/$BASE_REF...HEAD" || echo "DIFF_FAILED")
if [[ "$CHANGED_FILES" == "DIFF_FAILED" ]]; then
echo "::warning::Failed to compute diff, running all jobs"
for cat in code docs ci format_config benchmark gifs mill_wrapper; do
echo "$cat=true" >> "$GITHUB_OUTPUT"
done
exit 0
fi
CODE=false; DOCS=false; CI=false; FORMAT_CONFIG=false; BENCHMARK=false; GIFS=false; MILL_WRAPPER=false
while IFS= read -r file; do
case "$file" in
modules/*|build.mill|project/*) CODE=true ;;
website/*) DOCS=true ;;
.github/*) CI=true ;;
.scalafmt.conf|.scalafix.conf) FORMAT_CONFIG=true ;;
gcbenchmark/*) BENCHMARK=true ;;
gifs/*) GIFS=true ;;
mill|mill.bat) MILL_WRAPPER=true ;;
esac
done <<< "$CHANGED_FILES"
echo "Change categories:"
echo " code=$CODE"
echo " docs=$DOCS"
echo " ci=$CI"
echo " format_config=$FORMAT_CONFIG"
echo " benchmark=$BENCHMARK"
echo " gifs=$GIFS"
echo " mill_wrapper=$MILL_WRAPPER"
echo "code=$CODE" >> "$GITHUB_OUTPUT"
echo "docs=$DOCS" >> "$GITHUB_OUTPUT"
echo "ci=$CI" >> "$GITHUB_OUTPUT"
echo "format_config=$FORMAT_CONFIG" >> "$GITHUB_OUTPUT"
echo "benchmark=$BENCHMARK" >> "$GITHUB_OUTPUT"
echo "gifs=$GIFS" >> "$GITHUB_OUTPUT"
echo "mill_wrapper=$MILL_WRAPPER" >> "$GITHUB_OUTPUT"
echo "## Change categories" >> "$GITHUB_STEP_SUMMARY"
echo "| Category | Changed |" >> "$GITHUB_STEP_SUMMARY"
echo "|----------|---------|" >> "$GITHUB_STEP_SUMMARY"
for cat in code docs ci format_config benchmark gifs mill_wrapper; do
val=$(eval echo \$$( echo $cat | tr 'a-z' 'A-Z'))
echo "| $cat | $val |" >> "$GITHUB_STEP_SUMMARY"
done
================================================
FILE: .github/scripts/docker/ScalaCliDockerFile
================================================
FROM debian:stable-slim
RUN apt update && apt install build-essential libz-dev clang procps -y
ADD scala-cli /usr/bin/
RUN \
echo "println(1)" | scala-cli -S 3 - -v -v -v && \
echo "println(1)" | scala-cli -S 2.13 - -v -v -v && \
echo "println(1)" | scala-cli -S 2.12 - -v -v -v
RUN \
echo "println(1)" | scala-cli --power package --native _.sc --force && \
echo "println(1)" | scala-cli --power package --native-image _.sc --force
ENTRYPOINT ["scala-cli"]
================================================
FILE: .github/scripts/docker/ScalaCliSlimDockerFile
================================================
FROM debian:stable-slim AS build-env
FROM gcr.io/distroless/base-debian12
ADD scala-cli /usr/local/bin/scala-cli
COPY --from=build-env /lib/x86_64-linux-gnu/libz.so.1 /lib/x86_64-linux-gnu/libz.so.1
ENTRYPOINT ["/usr/local/bin/scala-cli"]
================================================
FILE: .github/scripts/generate-docker-image.sh
================================================
#!/usr/bin/env bash
set -eu
ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
WORKDIR="$ROOT/out/docker-workdir"
mkdir -p "$WORKDIR"
./mill -i copyTo --task 'cli[]'.nativeImageStatic --dest "$WORKDIR/scala-cli" 1>&2
cd "$WORKDIR"
docker build -t scala-cli -f "$ROOT/.github/scripts/docker/ScalaCliDockerFile" .
================================================
FILE: .github/scripts/generate-junit-reports.sc
================================================
#!/usr/bin/env -S scala-cli shebang
//> using scala 3
//> using toolkit default
//> using dep org.scala-lang.modules::scala-xml:2.4.0
//> using options -Werror -Wunused:all
// adapted from https://github.com/vic/mill-test-junit-report
import java.io.File
import scala.collection.mutable.ArrayBuffer
import scala.annotation.tailrec
import java.nio.file.Paths
import scala.util.Try
case class Trace(declaringClass: String, methodName: String, fileName: String, lineNumber: Int) {
override def toString: String = s"$declaringClass.$methodName($fileName:$lineNumber)"
}
case class Failure(name: String, message: String, trace: Seq[Trace])
case class Test(
fullyQualifiedName: String,
selector: String,
duration: Double,
failure: Option[Failure]
)
@tailrec
def findFiles(paths: Seq[os.Path], result: Seq[os.Path] = Nil): Seq[os.Path] =
paths match
case Nil => result
case head :: tail =>
val newFiles =
if head.segments.contains("test") && head.last.endsWith(".dest") && os.isDir(head) then
os.list(head).filter(f => f.last == "out.json").toList
else Seq.empty
val newDirs = os.list(head).filter(p => os.isDir(p)).toList
findFiles(tail ++ newDirs, result ++ newFiles)
extension (s: String)
def toNormalisedPath: os.Path = if Paths.get(s).isAbsolute then os.Path(s) else os.Path(s, os.pwd)
def printUsageMessage(): Unit = println("Usage: generate-junit-reports <id> <name> <into> <path>")
if args.length != 4 then {
println(s"Error: provided too few arguments: ${args.length}")
printUsageMessage()
System.exit(1)
}
val id: String = args(0)
val name: String = args(1)
if new File(args(2)).exists() then {
println(s"Error: specified output path already exists: ${args(2)}")
System.exit(1)
}
val into = args(2).toNormalisedPath
val pathArg = args(3)
val rootPath: os.Path =
if Paths.get(pathArg).isAbsolute then os.Path(pathArg) else os.Path(pathArg, os.pwd)
if !os.isDir(rootPath) then {
println(s"The path provided is not a directory: $pathArg")
System.exit(1)
}
val reports: Seq[os.Path] = findFiles(Seq(rootPath))
println(s"Found ${reports.length} mill json reports:")
println(reports.mkString("\n"))
if reports.isEmpty then println("Warn: no reports found!")
println("Reading reports...")
val tests: Seq[Test] = reports.map(x => ujson.read(x.toNIO)).flatMap { json =>
json(1).value.asInstanceOf[ArrayBuffer[ujson.Obj]].map { test =>
Test(
fullyQualifiedName = test("fullyQualifiedName").str,
selector = test("selector").str,
duration = test("duration").num / 1000.0,
failure = test("status").str match {
case "Failure" => Some(Failure(
name = test("exceptionName")(0).str,
message = test("exceptionMsg")(0).str,
trace = test("exceptionTrace")(0).arr.map { st =>
val declaringClass = st("declaringClass").str
val methodName = st("methodName").str
val fileName = st("fileName")(0).str
val lineNumber = st("lineNumber").num.toInt
Trace(declaringClass, methodName, fileName, lineNumber)
}.toList
))
case _ => None
}
)
}
}
println(s"Found ${tests.length} tests.")
if tests.isEmpty then println("Warn: no tests found!")
println("Generating JUnit XML report...")
val suites = tests.groupBy(_.fullyQualifiedName).map { case (suit, tests) =>
val testcases = tests.map { test =>
<testcase id={test.selector} classname={test.fullyQualifiedName} name={
test.selector.substring(test.fullyQualifiedName.length)
} time={test.duration.toString}>
{
test.failure.map { failure =>
val maybeTrace = Try(failure.trace(1)).toOption
val fileName = maybeTrace.map(_.fileName).getOrElse("unknown")
val lineNumber = maybeTrace.map(_.lineNumber).getOrElse(-1)
<failure message={failure.message} type="ERROR">
ERROR: {failure.message}
Category: {failure.name}
File: {fileName}
Line: {lineNumber}
</failure>
}.orNull
}
{
test.failure.map { failure =>
<system-err>{
failure.trace.mkString(s"${failure.name}: ${failure.message}", "\n at ", "")
}</system-err>
}.orNull
}
</testcase>
}
<testsuite id={suit} name={suit} tests={tests.length.toString} failures={
tests.count(_.failure.isDefined).toString
} time={tests.map(_.duration).sum.toString}>
{testcases}
</testsuite>
}
val n = <testsuites id={id} name={name} tests={tests.length.toString} failures={
tests.count(_.failure.isDefined).toString
} time={tests.map(_.duration).sum.toString}>
{suites}
</testsuites>
val prettyXmlPrinter = new scala.xml.PrettyPrinter(80, 2)
val xmlToSave = scala.xml.XML.loadString(prettyXmlPrinter.format(n))
scala.xml.XML.save(filename = into.toString(), node = xmlToSave, xmlDecl = true)
println(s"Generated report at: $into")
================================================
FILE: .github/scripts/generate-native-image.sh
================================================
#!/usr/bin/env bash
set -e
COMMAND="cli[].base-image.writeDefaultNativeImageScript"
# temporary, until we pass JPMS options to native-image,
# see https://www.graalvm.org/release-notes/22_2/#native-image
export USE_NATIVE_IMAGE_JAVA_PLATFORM_MODULE_SYSTEM=false
# Using 'mill -i' so that the Mill process doesn't outlive this invocation
if [[ "$OSTYPE" == "msys" || "$OSTYPE" == "cygwin" ]]; then
./mill.bat -i ci.copyJvm --dest jvm
export JAVA_HOME="$(pwd -W | sed 's,/,\\,g')\\jvm"
export GRAALVM_HOME="$JAVA_HOME"
export PATH="$(pwd)/bin:$PATH"
echo "PATH=$PATH"
# this part runs into connection problems on Windows, so we retry up to 5 times
MAX_RETRIES=5
RETRY_COUNT=0
while (( RETRY_COUNT < MAX_RETRIES )); do
./mill.bat -i "$COMMAND" --scriptDest generate-native-image.bat
if [[ $? -ne 0 ]]; then
echo "Error occurred during 'mill.bat -i $COMMAND generate-native-image.bat' command. Retrying... ($((RETRY_COUNT + 1))/$MAX_RETRIES)"
(( RETRY_COUNT++ ))
sleep 2
else
./generate-native-image.bat
if [[ $? -ne 0 ]]; then
echo "Error occurred during 'generate-native-image.bat'. Retrying... ($((RETRY_COUNT + 1))/$MAX_RETRIES)"
(( RETRY_COUNT++ ))
sleep 2
else
echo "'generate-native-image.bat' succeeded with $RETRY_COUNT retries."
break
fi
fi
done
if (( RETRY_COUNT == MAX_RETRIES )); then
echo "Exceeded maximum retry attempts. Exiting with error."
exit 1
fi
else
if [ $# == "0" ]; then
if [[ "$OSTYPE" == "linux-gnu" ]]; then
if [[ "$(uname -m)" == "aarch64" ]]; then
COMMAND="cli[].base-image.writeDefaultNativeImageScript"
CLEANUP=("true")
else
COMMAND="cli[].linux-docker-image.writeDefaultNativeImageScript"
CLEANUP=("sudo" "rm" "-rf" "out/cli/linux-docker-image/nativeImageDockerWorkingDir")
fi
else
CLEANUP=("true")
fi
else
case "$1" in
"static")
COMMAND="cli[].static-image.writeDefaultNativeImageScript"
CLEANUP=("sudo" "rm" "-rf" "out/cli/static-image/nativeImageDockerWorkingDir")
;;
"mostly-static")
COMMAND="cli[].mostly-static-image.writeDefaultNativeImageScript"
CLEANUP=("sudo" "rm" "-rf" "out/cli/mostly-static-image/nativeImageDockerWorkingDir")
;;
*)
echo "Invalid image name: $1" 1>&2
exit 1
;;
esac
fi
./mill -i "$COMMAND" --scriptDest generate-native-image.sh
bash ./generate-native-image.sh
"${CLEANUP[@]}"
fi
================================================
FILE: .github/scripts/generate-os-packages.sh
================================================
#!/usr/bin/env bash
set -eu
ARCHITECTURE="x86_64" # Set the default architecture
if [[ "$OSTYPE" == "linux-gnu"* ]] || [[ "$OSTYPE" == "darwin"* ]]; then
# When running on macOS and Linux lets determine the architecture
ARCHITECTURE=$(uname -m)
fi
if [[ $# -eq 1 ]]; then
# architecture gets overridden by command line param
ARCHITECTURE=$1
fi
ARTIFACTS_DIR="artifacts/"
mkdir -p "$ARTIFACTS_DIR"
if [[ -z "$OSTYPE" ]]; then
mill="./mill.bat"
else
mill="./mill"
fi
packager() {
"$mill" -i packager.run "$@"
}
launcher() {
local launcherMillCommand="cli[].nativeImage"
local launcherName
if [[ "${OS-}" == "Windows_NT" ]]; then
launcherName="scala.exe"
else
launcherName="scala"
fi
"$mill" -i copyTo --task "$launcherMillCommand" --dest "$launcherName" 1>&2
echo "$launcherName"
}
version() {
"$mill" -i writePackageVersionTo --dest scala-cli-version 1>&2
cat scala-cli-version
}
shortVersion() {
"$mill" -i writeShortPackageVersionTo --dest scala-cli-short-version 1>&2
cat scala-cli-short-version
}
generate_deb() {
packager \
--deb \
--version "$(version)" \
--source-app-path "$(launcher)" \
--output "$ARTIFACTS_DIR/scala-cli.deb" \
--description "Scala CLI" \
--maintainer "scala-cli@virtuslab.com" \
--launcher-app "scala-cli" \
--priority "optional" \
--section "devel"
mv "$ARTIFACTS_DIR/scala-cli.deb" "$ARTIFACTS_DIR/scala-cli-x86_64-pc-linux.deb"
}
generate_rpm() {
packager \
--rpm \
--version "$(shortVersion)" \
--source-app-path "$(launcher)" \
--output "$ARTIFACTS_DIR/scala-cli-x86_64-pc-linux.rpm" \
--description "Scala CLI" \
--maintainer "scala-cli@virtuslab.com" \
--license "ASL 2.0" \
--launcher-app "scala-cli"
}
generate_pkg() {
arch=$1
packager \
--pkg \
--version "$(version)" \
--source-app-path "$(launcher)" \
--output "$ARTIFACTS_DIR/scala-cli-$arch-apple-darwin.pkg" \
--identifier "scala-cli" \
--launcher-app "scala-cli"
}
generate_msi() {
# Having the MSI automatically install Visual C++ redistributable when needed,
# see https://wixtoolset.org/documentation/manual/v3/howtos/redistributables_and_install_checks/install_vcredist.html
"$mill" -i ci.writeWixConfigExtra --dest wix-visual-cpp-redist.xml
packager \
--msi \
--version "$(shortVersion)" \
--source-app-path "$(launcher)" \
--output "$ARTIFACTS_DIR/scala-cli-x86_64-pc-win32.msi" \
--product-name "Scala CLI" \
--maintainer "scala-cli@virtuslab.com" \
--launcher-app "scala-cli" \
--license-path "./LICENSE" \
--exit-dialog "To run Scala CLI, open a Command window, and type scala-cli + Enter. If scala-cli cannot be found, ensure that the Command window was opened after Scala CLI was installed." \
--logo-path "./logo.png" \
--suppress-validation \
--extra-configs wix-visual-cpp-redist.xml \
--wix-upgrade-code-guid "C74FC9A1-9381-40A6-882F-9044C603ABD9"
rm -f "$ARTIFACTS_DIR/"*.wixpdb || true
}
generate_sdk() {
local sdkDirectory
local binName
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
if [[ "$ARCHITECTURE" == "aarch64" ]] || [[ "$ARCHITECTURE" == "x86_64" ]]; then
sdkDirectory="scala-cli-$ARCHITECTURE-pc-linux-static-sdk"
else
echo "scala-cli is not supported on $ARCHITECTURE"
exit 2
fi
binName="scala-cli"
elif [[ "$OSTYPE" == "darwin"* ]]; then
if [[ "$ARCHITECTURE" == "arm64" ]]; then
sdkDirectory="scala-cli-aarch64-apple-darwin-sdk"
else
sdkDirectory="scala-cli-x86_64-apple-darwin-sdk"
fi
binName="scala-cli"
elif [[ "$OSTYPE" == "msys" || "$OSTYPE" == "cygwin" ]]; then
sdkDirectory="scala-cli-x86_64-pc-win32-sdk"
binName="scala-cli.exe"
else
echo "Unrecognized operating system: $OSTYPE" 1>&2
exit 1
fi
mkdir -p "$sdkDirectory"/bin
cp "$(launcher)" "$sdkDirectory"/bin/"$binName"
if [[ "$OSTYPE" == "msys" || "$OSTYPE" == "cygwin" ]]; then
7z a "$sdkDirectory".zip "$sdkDirectory"
else
zip -r "$sdkDirectory".zip "$sdkDirectory"
fi
mv "$sdkDirectory".zip "$ARTIFACTS_DIR/"/"$sdkDirectory".zip
}
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
if [ "$ARCHITECTURE" == "x86_64" ]; then
generate_deb
generate_rpm
fi
generate_sdk
elif [[ "$OSTYPE" == "darwin"* ]]; then
if [ "$ARCHITECTURE" == "arm64" ]; then
generate_pkg "aarch64"
else
generate_pkg "x86_64"
fi
generate_sdk
elif [[ "$OSTYPE" == "msys" || "$OSTYPE" == "cygwin" ]]; then
generate_msi
generate_sdk
else
echo "Unrecognized operating system: $OSTYPE" 1>&2
exit 1
fi
================================================
FILE: .github/scripts/generate-slim-docker-image.sh
================================================
#!/usr/bin/env bash
set -eu
ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
WORKDIR="$ROOT/out/docker-slim-workdir"
mkdir -p "$WORKDIR"
./mill -i copyTo --task 'cli[]'.nativeImageMostlyStatic --dest "$WORKDIR/scala-cli" 1>&2
cd "$WORKDIR"
docker build -t scala-cli-slim -f "$ROOT/.github/scripts/docker/ScalaCliSlimDockerFile" .
================================================
FILE: .github/scripts/get-latest-cs.sh
================================================
#!/usr/bin/env bash
set -e
CS_VERSION="2.1.25-M24"
DIR="$(cs get --archive "https://github.com/coursier/coursier/releases/download/v$CS_VERSION/cs-x86_64-pc-win32.zip")"
cp "$DIR/"*.exe cs.exe
================================================
FILE: .github/scripts/gpg-setup.sh
================================================
#!/usr/bin/env sh
# from https://github.com/coursier/apps/blob/f1d2bf568bf466a98569a85c3f23c5f3a8eb5360/.github/scripts/gpg-setup.sh
echo "$PGP_SECRET" | base64 --decode | gpg --import --no-tty --batch --yes
echo "allow-loopback-pinentry" >>~/.gnupg/gpg-agent.conf
echo "pinentry-mode loopback" >>~/.gnupg/gpg.conf
gpg-connect-agent reloadagent /bye
================================================
FILE: .github/scripts/process_release_notes.sc
================================================
#!/usr/bin/env -S scala-cli shebang
//> using scala 3
//> using toolkit default
//> using options -Werror -Wunused:all
case class Replacement(find: String, replace: String)
// Hardcoded regex replacements for processing release notes
// These transform GitHub-idiomatic syntax to website-compatible Markdown
val replacements: Seq[Replacement] = Seq(
// 1. Contributor link: Transform "by @user in" to "by [@user](https://github.com/user) in"
// Excludes bots: dependabot, github-actions, scala-steward
// Only matches if not already a link (negative lookahead to avoid matching already-formatted entries)
// Must come BEFORE PR link pattern to avoid interference
// The pattern stops at the first " in" and doesn't match if there's a formatted link before it
Replacement(
find =
"by @(?!dependabot\\[bot\\]|github-actions\\[bot\\]|scala-steward)([^\\[\\]]+?) in(?!.*\\[@.*?\\]\\()",
replace = "by [@$1](https://github.com/$1) in"
),
// 2. New contributor link: Transform "@user made" to "[@user](https://github.com/user) made"
// Excludes bots: dependabot, github-actions, scala-steward
// Only matches if not already a link (negative lookbehind and lookahead to avoid matching already-formatted entries)
Replacement(
find =
"(?<!\\[)@(?!dependabot\\[bot\\]|github-actions\\[bot\\]|scala-steward)(.*?) made(?!.*\\]\\()",
replace = "[@$1](https://github.com/$1) made"
),
// 3. PR link: Transform "in https://github.com/VirtusLab/scala-cli/pull/123" to "in [#123](https://github.com/VirtusLab/scala-cli/pull/123)"
// Only matches if not already formatted as a markdown link
Replacement(
find = "in https://github\\.com/VirtusLab/scala-cli/pull/(.*?)$(?!.*\\]\\()",
replace = "in [#$1](https://github.com/VirtusLab/scala-cli/pull/$1)"
)
)
def applyReplacements(text: String, replacements: Seq[Replacement]): String = {
// Process line by line to handle $ end-of-line anchors correctly
val lines = text.linesIterator.toSeq
val processedLines = lines.map { line =>
replacements.foldLeft(line) { (current, replacement) =>
try
val regex = replacement.find.r
// Manually handle replacement to avoid issues with $ in replacement strings
var result = current
val matches =
regex.findAllMatchIn(current).toSeq.reverse // Process from end to avoid offset issues
for matchData <- matches do
// Build replacement string by substituting $1, $2, etc. with actual group values
var replacementText = replacement.replace
// Replace $1, $2, etc. with actual group values (in reverse order to avoid replacing $11 when we mean $1)
for i <- matchData.groupCount to 1 by -1 do
val groupValue = if matchData.group(i) != null then matchData.group(i) else ""
replacementText = replacementText.replace(s"$$$i", groupValue)
// Replace the matched portion
result = result.substring(0, matchData.start) + replacementText +
result.substring(matchData.end)
result
catch
case e: Exception =>
System.err.println(
s"Warning: Failed to apply regex '${replacement.find}': ${e.getMessage}"
)
if System.getenv("DEBUG") == "true" then e.printStackTrace()
current
}
}
// Rejoin lines with newlines, preserving original line endings
val lineEnding = if text.contains("\r\n") then "\r\n"
else if text.contains("\n") then "\n" else System.lineSeparator()
processedLines.mkString(lineEnding) +
(if text.endsWith("\n") || text.endsWith("\r\n") then lineEnding else "")
}
def printUsageMessage(): Unit = {
println("Usage: process_release_notes.sc <command> <file>")
println("Commands:")
println(" apply - Apply regexes to the file (modifies in place)")
println(" check - Check if file needs regexes applied (exits with error if needed)")
println(" verify - Verify file has regexes applied (exits with error if not)")
}
if args.length < 2 then
println(s"Error: too few arguments: ${args.length}")
printUsageMessage()
sys.exit(1)
val command = args(0)
val filePath = os.Path(args(1), os.pwd)
if !os.exists(filePath) then
println(s"Error: file does not exist: $filePath")
sys.exit(1)
if System.getenv("DEBUG") == "true" then
println(s"Loaded ${replacements.length} replacement patterns")
replacements.zipWithIndex.foreach { case (r, i) =>
println(s" Pattern ${i + 1}: Find='${r.find}', Replace='${r.replace}'")
}
val originalContent = os.read(filePath)
val transformedContent = applyReplacements(originalContent, replacements)
command match
case "apply" =>
os.write.over(filePath, transformedContent)
println(s"Applied regexes to: $filePath")
case "check" =>
if originalContent != transformedContent then
println(s"Error: File $filePath needs regexes applied")
println("Run: .github/scripts/process_release_notes.sc apply <file>")
sys.exit(1)
else
println(s"File $filePath is already processed correctly")
sys.exit(0)
case "verify" =>
// Check for patterns that should have been transformed
// All patterns have negative lookaheads to avoid matching already-formatted entries
val patternsToCheck = replacements
val needsTransformation =
patternsToCheck.exists { replacement =>
try
val regex = replacement.find.r
regex.findFirstIn(originalContent).isDefined
catch
case _: Exception => false
}
if needsTransformation then
println(s"Error: File $filePath contains patterns that need transformation")
println("The following patterns were found that should be transformed:")
patternsToCheck.foreach { replacement =>
try
val regex = replacement.find.r
if regex.findFirstIn(originalContent).isDefined then
println(s" - Pattern: ${replacement.find}")
catch
case _: Exception => ()
}
println("Run: .github/scripts/process_release_notes.sc apply <file>")
sys.exit(1)
else
println(s"File $filePath is properly formatted")
sys.exit(0)
case _ =>
println(s"Error: unknown command: $command")
printUsageMessage()
sys.exit(1)
================================================
FILE: .github/scripts/publish-docker-images.sh
================================================
#!/usr/bin/env bash
set -eu
RAW_VERSION="$(./mill -i ci.publishVersion)"
SCALA_CLI_VERSION="${RAW_VERSION##* }"
docker tag scala-cli virtuslab/scala-cli:latest
docker tag scala-cli virtuslab/scala-cli:"$SCALA_CLI_VERSION"
docker push virtuslab/scala-cli:latest
docker push virtuslab/scala-cli:"$SCALA_CLI_VERSION"
================================================
FILE: .github/scripts/publish-sdkman.sh
================================================
#!/usr/bin/env bash
# from https://github.com/lampepfl/dotty/blob/37e997abc2bf4d42321492acaf7f7832ee7ce146/.github/workflows/scripts/publish-sdkman.sh
# This is script for publishing Scala CLI on SDKMAN.
# It's releasing and announcing the release of Scala CLI on SDKMAN.
#
# Requirement:
# - the latest stable version of Scala CLI should be available in github artifacts
set -eu
version() {
"./mill" -i writePackageVersionTo --dest scala-cli-version 1>&2
cat scala-cli-version
}
SCALA_CLI_VERSION="$(version)"
ARCHS=("x86_64" "aarch64" "x86_64" "aarch64" "x86_64")
UNAMES=("pc-linux-static-sdk" "pc-linux-static-sdk" "apple-darwin-sdk" "apple-darwin-sdk" "pc-win32-sdk")
PLATFORMS=("LINUX_64" "LINUX_ARM64" "MAC_OSX" "MAC_ARM64" "WINDOWS_64")
for i in "${!PLATFORMS[@]}"; do
SCALA_CLI_URL="https://github.com/VirtusLab/scala-cli/releases/download/v$SCALA_CLI_VERSION/scala-cli-${ARCHS[i]}-${UNAMES[i]}.zip"
# Release a new Candidate Version
curl --silent --show-error --fail \
-X POST \
-H "Consumer-Key: $SDKMAN_KEY" \
-H "Consumer-Token: $SDKMAN_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"candidate": "scalacli", "version": "'"$SCALA_CLI_VERSION"'", "url": "'"$SCALA_CLI_URL"'", "platform": "'"${PLATFORMS[i]}"'" }' \
https://vendors.sdkman.io/release
if [[ $? -ne 0 ]]; then
echo "Fail sending POST request to releasing Scala CLI on SDKMAN on platform: ${PLATFORMS[i]}."
exit 1
fi
done
# Set SCALA_CLI_VERSION as Default for Candidate
curl --silent --show-error --fail \
-X PUT \
-H "Consumer-Key: $SDKMAN_KEY" \
-H "Consumer-Token: $SDKMAN_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"candidate": "scalacli", "version": "'"$SCALA_CLI_VERSION"'" }' \
https://vendors.sdkman.io/default
if [[ $? -ne 0 ]]; then
echo "Fail sending PUT request to announcing the release of Scala CLI on SDKMAN."
exit 1
fi
================================================
FILE: .github/scripts/publish-slim-docker-images.sh
================================================
#!/usr/bin/env bash
set -eu
RAW_VERSION="$(./mill -i ci.publishVersion)"
SCALA_CLI_VERSION="${RAW_VERSION##* }"
docker tag scala-cli-slim virtuslab/scala-cli-slim:latest
docker tag scala-cli-slim virtuslab/scala-cli-slim:"$SCALA_CLI_VERSION"
docker push virtuslab/scala-cli-slim:latest
docker push virtuslab/scala-cli-slim:"$SCALA_CLI_VERSION"
================================================
FILE: .github/scripts/scala-cli.rb.template
================================================
# typed: false
# frozen_string_literal: true
# ScalaCli Formula
class ScalaCli < Formula
desc "Launcher for ScalaCli"
homepage "https://virtuslab.github.io/scala-cli/"
url (RUBY_PLATFORM.include? "arm64") ?
"@ARM64_LAUNCHER_URL@" :
"@X86_LAUNCHER_URL@"
version "@LAUNCHER_VERSION@"
sha256 (RUBY_PLATFORM.include? "arm64") ?
"@ARM64_LAUNCHER_SHA256@" :
"@X86_LAUNCHER_SHA256@"
license "Apache-2.0"
def install
if (RUBY_PLATFORM.include? "arm64")
bin.install "scala-cli-aarch64-apple-darwin" => "scala-cli"
else
bin.install "scala-cli-x86_64-apple-darwin" => "scala-cli"
end
end
test do
(testpath / "Hello.scala").write "object Hello {
def main(args: Array[String]): Unit =
println(\"Hello from Scala\")
}"
output = shell_output("#{bin}/scala-cli Hello.scala")
assert_equal ["Hello from Scala\n"], output.lines
end
end
================================================
FILE: .github/scripts/scala.rb.template
================================================
# typed: false
# frozen_string_literal: true
# Experimental Scala Formula
class Scala < Formula
desc "Experimental launcher for Scala"
homepage "https://virtuslab.github.io/scala-cli/"
url (RUBY_PLATFORM.include? "arm64") ?
"@ARM64_LAUNCHER_URL@" :
"@X86_LAUNCHER_URL@"
version "@LAUNCHER_VERSION@"
sha256 (RUBY_PLATFORM.include? "arm64") ?
"@ARM64_LAUNCHER_SHA256@" :
"@X86_LAUNCHER_SHA256@"
license "Apache-2.0"
def install
if (RUBY_PLATFORM.include? "arm64")
bin.install "scala-cli-aarch64-apple-darwin" => "scala-cli"
else
bin.install "scala-cli-x86_64-apple-darwin" => "scala-cli"
end
bin.install_symlink "scala-cli" => "scala"
end
test do
(testpath / "Hello.scala").write "object Hello {
def main(args: Array[String]): Unit =
println(\"Hello from Scala\")
}"
output = shell_output("#{bin}/scala-cli Hello.scala")
assert_equal ["Hello from Scala\n"], output.lines
end
end
================================================
FILE: .github/scripts/update-website.sh
================================================
#!/usr/bin/env bash
set -e
git config --global user.name "gh-actions"
git config --global user.email "actions@github.com"
cd website
yarn install
yarn build
yarn deploy
================================================
FILE: .github/scripts/verify_old_cpus.sh
================================================
#!/usr/bin/env bash
set -e
# Verifies that the native launcher runs on older x86_64 CPUs (without AVX/AVX2/FMA).
# Uses QEMU user-mode emulation with a Westmere CPU model (2010, SSE4.2 but no AVX).
LAUNCHER_GZ="${1:?Usage: $0 <launcher.gz>}"
sudo apt-get update -qq && sudo apt-get install -y -qq qemu-user > /dev/null
LAUNCHER="/tmp/scala-cli-compat-test"
gunzip -c "$LAUNCHER_GZ" > "$LAUNCHER"
chmod +x "$LAUNCHER"
echo "Running native launcher under QEMU with Westmere CPU (no AVX/AVX2/FMA)..."
qemu-x86_64 -cpu Westmere "$LAUNCHER" version
echo "CPU compatibility check passed."
================================================
FILE: .github/workflows/ci.yml
================================================
name: CI
on:
push:
branches:
- main
tags:
- "v*"
pull_request:
workflow_dispatch:
concurrency:
group: ${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
jobs:
changes:
runs-on: ubuntu-24.04
timeout-minutes: 5
outputs:
code: ${{ steps.classify.outputs.code }}
docs: ${{ steps.classify.outputs.docs }}
ci: ${{ steps.classify.outputs.ci }}
format_config: ${{ steps.classify.outputs.format_config }}
benchmark: ${{ steps.classify.outputs.benchmark }}
gifs: ${{ steps.classify.outputs.gifs }}
mill_wrapper: ${{ steps.classify.outputs.mill_wrapper }}
test_all: ${{ steps.overrides.outputs.test_all }}
test_native: ${{ steps.overrides.outputs.test_native }}
test_integration: ${{ steps.overrides.outputs.test_integration }}
test_docs: ${{ steps.overrides.outputs.test_docs }}
test_format: ${{ steps.overrides.outputs.test_format }}
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Classify changes
id: classify
env:
EVENT_NAME: ${{ github.event_name }}
BASE_REF: ${{ github.event.pull_request.base.ref }}
run: .github/scripts/classify-changes.sh
- name: Check override keywords
id: overrides
env:
EVENT_NAME: ${{ github.event_name }}
PR_BODY: ${{ github.event.pull_request.body }}
run: .github/scripts/check-override-keywords.sh
unit-tests:
needs: [changes]
timeout-minutes: 120
runs-on: ubuntu-24.04
env:
SHOULD_RUN: ${{ needs.changes.outputs.code == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.mill_wrapper == 'true' || needs.changes.outputs.test_all == 'true' }}
steps:
- name: Log skip reason
if: env.SHOULD_RUN != 'true'
run: echo "Skipping unit tests -- changes do not affect compiled code, CI, or mill wrapper."
- uses: actions/checkout@v6
if: env.SHOULD_RUN == 'true'
with:
fetch-depth: 0
submodules: true
- uses: coursier/cache-action@v8
if: env.SHOULD_RUN == 'true'
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
if: env.SHOULD_RUN == 'true'
with:
jvm: "temurin:17"
- name: Copy launcher
run: ./mill -i copyJvmLauncher --directory artifacts/
if: runner.os == 'Linux' && env.SHOULD_RUN == 'true'
- name: Copy bootstrapped launcher
run: ./mill -i copyJvmBootstrappedLauncher --directory artifacts/
if: runner.os == 'Linux' && env.SHOULD_RUN == 'true'
- uses: actions/upload-artifact@v7
if: runner.os == 'Linux' && env.SHOULD_RUN == 'true'
with:
name: jvm-launchers
path: artifacts/
if-no-files-found: error
retention-days: 2
- name: Cross compile everything
if: env.SHOULD_RUN == 'true'
run: ./mill -i '__[_].compile'
- name: Build macros negative compilation tests
if: env.SHOULD_RUN == 'true'
run: ./mill -i build-macros[_].test.testNegativeCompilation
- name: Unit tests
if: env.SHOULD_RUN == 'true'
run: ./mill -i unitTests
- name: Convert Mill test reports to JUnit XML format
if: (success() || failure()) && env.SHOULD_RUN == 'true'
run: .github/scripts/generate-junit-reports.sc unit-tests 'Scala CLI Unit Tests' test-report.xml out/
- name: Upload test report
uses: actions/upload-artifact@v7
if: (success() || failure()) && env.SHOULD_RUN == 'true'
with:
name: test-results-unit-tests
path: test-report.xml
test-fish-shell:
needs: [changes]
timeout-minutes: 120
runs-on: ubuntu-24.04
env:
SHOULD_RUN: ${{ needs.changes.outputs.code == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.mill_wrapper == 'true' || needs.changes.outputs.test_all == 'true' }}
steps:
- name: Log skip reason
if: env.SHOULD_RUN != 'true'
run: echo "Skipping fish shell test -- changes do not affect compiled code, CI, or mill wrapper."
- uses: actions/checkout@v6
if: env.SHOULD_RUN == 'true'
with:
fetch-depth: 0
submodules: true
- uses: coursier/cache-action@v8
if: env.SHOULD_RUN == 'true'
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
if: env.SHOULD_RUN == 'true'
with:
jvm: "temurin:17"
- name: Install fish
if: env.SHOULD_RUN == 'true'
run: |
sudo apt-add-repository ppa:fish-shell/release-3
sudo apt update
sudo apt install fish
- name: Test mill script in fish shell
if: env.SHOULD_RUN == 'true'
run: |
fish -c './mill __.compile'
jvm-bootstrapped-tests-default:
needs: [changes]
timeout-minutes: 150
runs-on: ubuntu-24.04
env:
SHOULD_RUN: ${{ needs.changes.outputs.code == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.test_all == 'true' || needs.changes.outputs.test_integration == 'true' }}
steps:
- name: Log skip reason
if: env.SHOULD_RUN != 'true'
run: echo "Skipping JVM bootstrapped integration tests -- changes do not affect compiled code or CI."
- uses: actions/checkout@v6
if: env.SHOULD_RUN == 'true'
with:
fetch-depth: 0
submodules: true
- uses: coursier/cache-action@v8
if: env.SHOULD_RUN == 'true'
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
if: env.SHOULD_RUN == 'true'
with:
jvm: "temurin:17"
- name: JVM integration tests
if: env.SHOULD_RUN == 'true'
run: ./mill -i integration.test.jvmBootstrapped
env:
SCALA_CLI_IT_GROUP: 1
- name: Convert Mill test reports to JUnit XML format
if: (success() || failure()) && env.SHOULD_RUN == 'true'
run: .github/scripts/generate-junit-reports.sc jvm-bootstrapped-tests-default 'Scala CLI JVM Bootstrapped Tests' test-report.xml out/
- name: Upload test report
uses: actions/upload-artifact@v7
if: (success() || failure()) && env.SHOULD_RUN == 'true'
with:
name: test-results-jvm-bootstrapped-tests-default
path: test-report.xml
jvm-tests-default:
needs: [changes]
timeout-minutes: 150
runs-on: ubuntu-24.04
env:
SHOULD_RUN: ${{ needs.changes.outputs.code == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.test_all == 'true' || needs.changes.outputs.test_integration == 'true' }}
steps:
- name: Log skip reason
if: env.SHOULD_RUN != 'true'
run: echo "Skipping JVM integration tests (default) -- changes do not affect compiled code or CI."
- uses: actions/checkout@v6
if: env.SHOULD_RUN == 'true'
with:
fetch-depth: 0
submodules: true
- uses: coursier/cache-action@v8
if: env.SHOULD_RUN == 'true'
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
if: env.SHOULD_RUN == 'true'
with:
jvm: "temurin:17"
- name: JVM integration tests
if: env.SHOULD_RUN == 'true'
run: ./mill -i integration.test.jvm
env:
SCALA_CLI_IT_GROUP: 1
- name: Convert Mill test reports to JUnit XML format
if: (success() || failure()) && env.SHOULD_RUN == 'true'
run: .github/scripts/generate-junit-reports.sc jvm-tests-default 'Scala CLI JVM Tests (default)' test-report.xml out/
- name: Upload test report
uses: actions/upload-artifact@v7
if: (success() || failure()) && env.SHOULD_RUN == 'true'
with:
name: test-results-jvm-tests-default
path: test-report.xml
jvm-tests-scala-2-13:
needs: [changes]
timeout-minutes: 150
runs-on: ubuntu-24.04
env:
SHOULD_RUN: ${{ needs.changes.outputs.code == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.test_all == 'true' || needs.changes.outputs.test_integration == 'true' }}
steps:
- name: Log skip reason
if: env.SHOULD_RUN != 'true'
run: echo "Skipping JVM integration tests (Scala 2.13) -- changes do not affect compiled code or CI."
- uses: actions/checkout@v6
if: env.SHOULD_RUN == 'true'
with:
fetch-depth: 0
submodules: true
- uses: coursier/cache-action@v8
if: env.SHOULD_RUN == 'true'
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
if: env.SHOULD_RUN == 'true'
with:
jvm: "temurin:17"
- name: JVM integration tests
if: env.SHOULD_RUN == 'true'
run: ./mill -i integration.test.jvm
env:
SCALA_CLI_IT_GROUP: 2
- name: Convert Mill test reports to JUnit XML format
if: (success() || failure()) && env.SHOULD_RUN == 'true'
run: .github/scripts/generate-junit-reports.sc jvm-tests-scala-2-13 'Scala CLI JVM Tests (Scala 2.13)' test-report.xml out/
- name: Upload test report
uses: actions/upload-artifact@v7
if: (success() || failure()) && env.SHOULD_RUN == 'true'
with:
name: test-results-jvm-tests-scala-2-13
path: test-report.xml
jvm-tests-scala-2-12:
needs: [changes]
timeout-minutes: 150
runs-on: ubuntu-24.04
env:
SHOULD_RUN: ${{ needs.changes.outputs.code == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.test_all == 'true' || needs.changes.outputs.test_integration == 'true' }}
steps:
- name: Log skip reason
if: env.SHOULD_RUN != 'true'
run: echo "Skipping JVM integration tests (Scala 2.12) -- changes do not affect compiled code or CI."
- uses: actions/checkout@v6
if: env.SHOULD_RUN == 'true'
with:
fetch-depth: 0
submodules: true
- uses: coursier/cache-action@v8
if: env.SHOULD_RUN == 'true'
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
if: env.SHOULD_RUN == 'true'
with:
jvm: "temurin:17"
- name: JVM integration tests
if: env.SHOULD_RUN == 'true'
run: ./mill -i integration.test.jvm
env:
SCALA_CLI_IT_GROUP: 3
- name: Convert Mill test reports to JUnit XML format
if: (success() || failure()) && env.SHOULD_RUN == 'true'
run: .github/scripts/generate-junit-reports.sc jvm-tests-scala-2-12 'Scala CLI JVM Tests (Scala 2.12)' test-report.xml out/
- name: Upload test report
uses: actions/upload-artifact@v7
if: (success() || failure()) && env.SHOULD_RUN == 'true'
with:
name: test-results-jvm-tests-scala-2-12
path: test-report.xml
jvm-tests-lts:
needs: [changes]
timeout-minutes: 150
runs-on: ubuntu-24.04
env:
SHOULD_RUN: ${{ needs.changes.outputs.code == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.test_all == 'true' || needs.changes.outputs.test_integration == 'true' }}
steps:
- name: Log skip reason
if: env.SHOULD_RUN != 'true'
run: echo "Skipping JVM integration tests (Scala 3 LTS) -- changes do not affect compiled code or CI."
- uses: actions/checkout@v6
if: env.SHOULD_RUN == 'true'
with:
fetch-depth: 0
submodules: true
- uses: coursier/cache-action@v8
if: env.SHOULD_RUN == 'true'
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
if: env.SHOULD_RUN == 'true'
with:
jvm: "temurin:17"
- name: JVM integration tests
if: env.SHOULD_RUN == 'true'
run: ./mill -i integration.test.jvm
env:
SCALA_CLI_IT_GROUP: 4
- name: Convert Mill test reports to JUnit XML format
if: (success() || failure()) && env.SHOULD_RUN == 'true'
run: .github/scripts/generate-junit-reports.sc jvm-tests-lts 'Scala CLI JVM Tests (Scala 3 LTS)' test-report.xml out/
- name: Upload test report
uses: actions/upload-artifact@v7
if: (success() || failure()) && env.SHOULD_RUN == 'true'
with:
name: test-results-jvm-tests-lts
path: test-report.xml
jvm-tests-rc:
needs: [changes]
timeout-minutes: 150
runs-on: ubuntu-24.04
env:
SHOULD_RUN: ${{ needs.changes.outputs.code == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.test_all == 'true' || needs.changes.outputs.test_integration == 'true' }}
steps:
- name: Log skip reason
if: env.SHOULD_RUN != 'true'
run: echo "Skipping JVM integration tests (RC) -- changes do not affect compiled code or CI."
- uses: actions/checkout@v6
if: env.SHOULD_RUN == 'true'
with:
fetch-depth: 0
submodules: true
- uses: coursier/cache-action@v8
if: env.SHOULD_RUN == 'true'
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
if: env.SHOULD_RUN == 'true'
with:
jvm: "temurin:17"
- name: JVM integration tests
if: env.SHOULD_RUN == 'true'
run: ./mill -i integration.test.jvm
env:
SCALA_CLI_IT_GROUP: 5
- name: Convert Mill test reports to JUnit XML format
if: (success() || failure()) && env.SHOULD_RUN == 'true'
run: .github/scripts/generate-junit-reports.sc jvm-tests-rc 'Scala CLI JVM Tests (5)' test-report.xml out/
- name: Upload test report
uses: actions/upload-artifact@v7
if: (success() || failure()) && env.SHOULD_RUN == 'true'
with:
name: test-results-jvm-tests-rc
path: test-report.xml
generate-linux-launcher:
needs: [changes]
timeout-minutes: 120
runs-on: ubuntu-24.04
env:
SHOULD_RUN: ${{ needs.changes.outputs.code == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.test_all == 'true' || needs.changes.outputs.test_native == 'true' }}
steps:
- name: Log skip reason
if: env.SHOULD_RUN != 'true'
run: echo "Skipping Linux native launcher generation -- changes do not affect compiled code or CI."
- uses: actions/checkout@v6
if: env.SHOULD_RUN == 'true'
with:
fetch-depth: 0
submodules: true
- uses: coursier/cache-action@v8
if: env.SHOULD_RUN == 'true'
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
if: env.SHOULD_RUN == 'true'
with:
jvm: "temurin:17"
- name: Generate native launcher
if: env.SHOULD_RUN == 'true'
run: .github/scripts/generate-native-image.sh
- run: ./mill -i ci.setShouldPublish
if: env.SHOULD_RUN == 'true'
- name: Build OS packages
if: env.SHOULD_PUBLISH == 'true' && env.SHOULD_RUN == 'true'
run: .github/scripts/generate-os-packages.sh
- name: Copy artifacts
if: env.SHOULD_RUN == 'true'
run: ./mill -i copyDefaultLauncher --directory artifacts/
- name: Verify native launcher CPU compatibility
if: env.SHOULD_RUN == 'true'
run: .github/scripts/verify_old_cpus.sh artifacts/scala-cli-x86_64-pc-linux.gz
- uses: actions/upload-artifact@v7
if: env.SHOULD_RUN == 'true'
with:
name: linux-launchers
path: artifacts/
if-no-files-found: error
retention-days: 2
native-linux-tests-default:
needs: [changes, generate-linux-launcher]
timeout-minutes: 150
runs-on: ubuntu-24.04
env:
SHOULD_RUN: ${{ needs.changes.outputs.code == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.test_all == 'true' || needs.changes.outputs.test_native == 'true' }}
steps:
- name: Log skip reason
if: env.SHOULD_RUN != 'true'
run: echo "Skipping native Linux integration tests (default) -- changes do not affect compiled code or CI."
- uses: actions/checkout@v6
if: env.SHOULD_RUN == 'true'
with:
fetch-depth: 0
submodules: true
- uses: coursier/cache-action@v8
if: env.SHOULD_RUN == 'true'
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
if: env.SHOULD_RUN == 'true'
with:
jvm: "temurin:17"
- uses: actions/download-artifact@v8
if: env.SHOULD_RUN == 'true'
with:
name: linux-launchers
path: artifacts/
- name: Native integration tests
if: env.SHOULD_RUN == 'true'
run: ./mill -i nativeIntegrationTests
env:
UPDATE_GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SCALA_CLI_IT_FORCED_LAUNCHER_DIRECTORY: artifacts/
SCALA_CLI_IT_GROUP: 1
SCALA_CLI_SODIUM_JNI_ALLOW: false
- name: Convert Mill test reports to JUnit XML format
if: (success() || failure()) && env.SHOULD_RUN == 'true'
run: .github/scripts/generate-junit-reports.sc linux-tests-default 'Scala CLI Linux Tests (default)' test-report.xml out/
- name: Upload test report
uses: actions/upload-artifact@v7
if: (success() || failure()) && env.SHOULD_RUN == 'true'
with:
name: test-results-linux-tests-default
path: test-report.xml
native-linux-tests-scala-2-13:
needs: [changes, generate-linux-launcher]
timeout-minutes: 150
runs-on: ubuntu-24.04
env:
SHOULD_RUN: ${{ needs.changes.outputs.code == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.test_all == 'true' || needs.changes.outputs.test_native == 'true' }}
steps:
- name: Log skip reason
if: env.SHOULD_RUN != 'true'
run: echo "Skipping native Linux integration tests (Scala 2.13) -- changes do not affect compiled code or CI."
- uses: actions/checkout@v6
if: env.SHOULD_RUN == 'true'
with:
fetch-depth: 0
submodules: true
- uses: coursier/cache-action@v8
if: env.SHOULD_RUN == 'true'
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
if: env.SHOULD_RUN == 'true'
with:
jvm: "temurin:17"
- uses: actions/download-artifact@v8
if: env.SHOULD_RUN == 'true'
with:
name: linux-launchers
path: artifacts/
- name: Native integration tests
if: env.SHOULD_RUN == 'true'
run: ./mill -i nativeIntegrationTests
env:
UPDATE_GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SCALA_CLI_IT_FORCED_LAUNCHER_DIRECTORY: artifacts/
SCALA_CLI_IT_GROUP: 2
SCALA_CLI_SODIUM_JNI_ALLOW: false
- name: Convert Mill test reports to JUnit XML format
if: (success() || failure()) && env.SHOULD_RUN == 'true'
run: .github/scripts/generate-junit-reports.sc linux-tests-scala-2-13 'Scala CLI Linux Tests (Scala 2.13)' test-report.xml out/
- name: Upload test report
uses: actions/upload-artifact@v7
if: (success() || failure()) && env.SHOULD_RUN == 'true'
with:
name: test-results-linux-tests-scala-2-13
path: test-report.xml
native-linux-tests-scala-2-12:
needs: [changes, generate-linux-launcher]
timeout-minutes: 150
runs-on: ubuntu-24.04
env:
SHOULD_RUN: ${{ needs.changes.outputs.code == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.test_all == 'true' || needs.changes.outputs.test_native == 'true' }}
steps:
- name: Log skip reason
if: env.SHOULD_RUN != 'true'
run: echo "Skipping native Linux integration tests (Scala 2.12) -- changes do not affect compiled code or CI."
- uses: actions/checkout@v6
if: env.SHOULD_RUN == 'true'
with:
fetch-depth: 0
submodules: true
- uses: coursier/cache-action@v8
if: env.SHOULD_RUN == 'true'
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
if: env.SHOULD_RUN == 'true'
with:
jvm: "temurin:17"
- uses: actions/download-artifact@v8
if: env.SHOULD_RUN == 'true'
with:
name: linux-launchers
path: artifacts/
- name: Native integration tests
if: env.SHOULD_RUN == 'true'
run: ./mill -i nativeIntegrationTests
env:
UPDATE_GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SCALA_CLI_IT_FORCED_LAUNCHER_DIRECTORY: artifacts/
SCALA_CLI_IT_GROUP: 3
SCALA_CLI_SODIUM_JNI_ALLOW: false
- name: Convert Mill test reports to JUnit XML format
if: (success() || failure()) && env.SHOULD_RUN == 'true'
run: .github/scripts/generate-junit-reports.sc linux-tests-scala-2-12 'Scala CLI Linux Tests (Scala 2.12)' test-report.xml out/
- name: Upload test report
uses: actions/upload-artifact@v7
if: (success() || failure()) && env.SHOULD_RUN == 'true'
with:
name: test-results-linux-tests-scala-2-12
path: test-report.xml
native-linux-tests-lts:
needs: [changes, generate-linux-launcher]
timeout-minutes: 150
runs-on: ubuntu-24.04
env:
SHOULD_RUN: ${{ needs.changes.outputs.code == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.test_all == 'true' || needs.changes.outputs.test_native == 'true' }}
steps:
- name: Log skip reason
if: env.SHOULD_RUN != 'true'
run: echo "Skipping native Linux integration tests (Scala 3 LTS) -- changes do not affect compiled code or CI."
- uses: actions/checkout@v6
if: env.SHOULD_RUN == 'true'
with:
fetch-depth: 0
submodules: true
- uses: coursier/cache-action@v8
if: env.SHOULD_RUN == 'true'
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
if: env.SHOULD_RUN == 'true'
with:
jvm: "temurin:17"
- uses: actions/download-artifact@v8
if: env.SHOULD_RUN == 'true'
with:
name: linux-launchers
path: artifacts/
- name: Native integration tests
if: env.SHOULD_RUN == 'true'
run: ./mill -i nativeIntegrationTests
env:
UPDATE_GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SCALA_CLI_IT_FORCED_LAUNCHER_DIRECTORY: artifacts/
SCALA_CLI_IT_GROUP: 4
SCALA_CLI_SODIUM_JNI_ALLOW: false
- name: Convert Mill test reports to JUnit XML format
if: (success() || failure()) && env.SHOULD_RUN == 'true'
run: .github/scripts/generate-junit-reports.sc linux-tests-lts 'Scala CLI Linux Tests (Scala 3 LTS)' test-report.xml out/
- name: Upload test report
uses: actions/upload-artifact@v7
if: (success() || failure()) && env.SHOULD_RUN == 'true'
with:
name: test-results-linux-tests-lts
path: test-report.xml
native-linux-tests-rc:
needs: [changes, generate-linux-launcher]
timeout-minutes: 150
runs-on: ubuntu-24.04
env:
SHOULD_RUN: ${{ needs.changes.outputs.code == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.test_all == 'true' || needs.changes.outputs.test_native == 'true' }}
steps:
- name: Log skip reason
if: env.SHOULD_RUN != 'true'
run: echo "Skipping native Linux integration tests (RC) -- changes do not affect compiled code or CI."
- uses: actions/checkout@v6
if: env.SHOULD_RUN == 'true'
with:
fetch-depth: 0
submodules: true
- uses: coursier/cache-action@v8
if: env.SHOULD_RUN == 'true'
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
if: env.SHOULD_RUN == 'true'
with:
jvm: "temurin:17"
- uses: actions/download-artifact@v8
if: env.SHOULD_RUN == 'true'
with:
name: linux-launchers
path: artifacts/
- name: Native integration tests
if: env.SHOULD_RUN == 'true'
run: ./mill -i nativeIntegrationTests
env:
UPDATE_GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SCALA_CLI_IT_FORCED_LAUNCHER_DIRECTORY: artifacts/
SCALA_CLI_IT_GROUP: 5
SCALA_CLI_SODIUM_JNI_ALLOW: false
- name: Convert Mill test reports to JUnit XML format
if: (success() || failure()) && env.SHOULD_RUN == 'true'
run: .github/scripts/generate-junit-reports.sc linux-tests-rc 'Scala CLI Linux Tests (5)' test-report.xml out/
- name: Upload test report
uses: actions/upload-artifact@v7
if: (success() || failure()) && env.SHOULD_RUN == 'true'
with:
name: test-results-linux-tests-rc
path: test-report.xml
generate-linux-arm64-native-launcher:
needs: [changes]
timeout-minutes: 120
runs-on: ubuntu-24.04-arm
env:
SHOULD_RUN: ${{ needs.changes.outputs.code == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.test_all == 'true' || needs.changes.outputs.test_native == 'true' }}
steps:
- name: Log skip reason
if: env.SHOULD_RUN != 'true'
run: echo "Skipping Linux ARM64 native launcher generation -- changes do not affect compiled code or CI."
- uses: actions/checkout@v6
if: env.SHOULD_RUN == 'true'
with:
fetch-depth: 0
submodules: true
- uses: coursier/cache-action@v8
if: env.SHOULD_RUN == 'true'
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
if: env.SHOULD_RUN == 'true'
with:
jvm: "temurin:17"
- name: Install build dependencies
if: env.SHOULD_RUN == 'true'
run: |
sudo apt-get update -q -y
sudo apt-get install -q -y build-essential libz-dev zlib1g-dev python3-pip
- name: Generate native launcher
if: env.SHOULD_RUN == 'true'
run: .github/scripts/generate-native-image.sh
- run: ./mill -i ci.setShouldPublish
if: env.SHOULD_RUN == 'true'
- name: Build OS packages
if: env.SHOULD_PUBLISH == 'true' && env.SHOULD_RUN == 'true'
run: .github/scripts/generate-os-packages.sh
- name: Copy artifacts
if: env.SHOULD_RUN == 'true'
run: ./mill -i copyDefaultLauncher --directory artifacts/
- uses: actions/upload-artifact@v7
if: env.SHOULD_RUN == 'true'
with:
name: linux-aarch64-launchers
path: artifacts/
if-no-files-found: error
retention-days: 2
native-linux-arm64-tests-default:
needs: [changes, generate-linux-arm64-native-launcher]
timeout-minutes: 150
runs-on: ubuntu-24.04-arm
env:
SHOULD_RUN: ${{ needs.changes.outputs.code == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.test_all == 'true' || needs.changes.outputs.test_native == 'true' }}
steps:
- name: Log skip reason
if: env.SHOULD_RUN != 'true'
run: echo "Skipping native Linux ARM64 integration tests (default) -- changes do not affect compiled code or CI."
- uses: actions/checkout@v6
if: env.SHOULD_RUN == 'true'
with:
fetch-depth: 0
submodules: true
- uses: coursier/cache-action@v8
if: env.SHOULD_RUN == 'true'
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
if: env.SHOULD_RUN == 'true'
with:
jvm: "temurin:17"
- uses: actions/download-artifact@v8
if: env.SHOULD_RUN == 'true'
with:
name: linux-aarch64-launchers
path: artifacts/
- name: Native integration tests
if: env.SHOULD_RUN == 'true'
run: ./mill -i nativeIntegrationTests
env:
UPDATE_GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SCALA_CLI_IT_FORCED_LAUNCHER_DIRECTORY: artifacts/
SCALA_CLI_IT_GROUP: 1
SCALA_CLI_SODIUM_JNI_ALLOW: false
- name: Convert Mill test reports to JUnit XML format
if: (success() || failure()) && env.SHOULD_RUN == 'true'
run: .github/scripts/generate-junit-reports.sc linux-tests-default 'Scala CLI Linux ARM 64 Tests (default)' test-report.xml out/
- name: Upload test report
uses: actions/upload-artifact@v7
if: (success() || failure()) && env.SHOULD_RUN == 'true'
with:
name: test-results-linux-arm64-tests-default
path: test-report.xml
native-linux-arm64-tests-rc:
needs: [changes, generate-linux-arm64-native-launcher]
timeout-minutes: 150
runs-on: ubuntu-24.04-arm
env:
SHOULD_RUN: ${{ needs.changes.outputs.code == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.test_all == 'true' || needs.changes.outputs.test_native == 'true' }}
steps:
- name: Log skip reason
if: env.SHOULD_RUN != 'true'
run: echo "Skipping native Linux ARM64 integration tests (RC) -- changes do not affect compiled code or CI."
- uses: actions/checkout@v6
if: env.SHOULD_RUN == 'true'
with:
fetch-depth: 0
submodules: true
- uses: coursier/cache-action@v8
if: env.SHOULD_RUN == 'true'
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
if: env.SHOULD_RUN == 'true'
with:
jvm: "temurin:17"
- uses: actions/download-artifact@v8
if: env.SHOULD_RUN == 'true'
with:
name: linux-aarch64-launchers
path: artifacts/
- name: Native integration tests
if: env.SHOULD_RUN == 'true'
run: ./mill -i nativeIntegrationTests
env:
UPDATE_GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SCALA_CLI_IT_FORCED_LAUNCHER_DIRECTORY: artifacts/
SCALA_CLI_IT_GROUP: 5
SCALA_CLI_SODIUM_JNI_ALLOW: false
- name: Convert Mill test reports to JUnit XML format
if: (success() || failure()) && env.SHOULD_RUN == 'true'
run: .github/scripts/generate-junit-reports.sc linux-tests-rc 'Scala CLI Linux ARM64 Tests (5)' test-report.xml out/
- name: Upload test report
uses: actions/upload-artifact@v7
if: (success() || failure()) && env.SHOULD_RUN == 'true'
with:
name: test-results-linux-arm64-tests-rc
path: test-report.xml
generate-macos-launcher:
needs: [changes]
timeout-minutes: 120
runs-on: "macOS-15-intel"
env:
SHOULD_RUN: ${{ needs.changes.outputs.code == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.test_all == 'true' || needs.changes.outputs.test_native == 'true' }}
steps:
- name: Log skip reason
if: env.SHOULD_RUN != 'true'
run: echo "Skipping macOS native launcher generation -- changes do not affect compiled code or CI."
- uses: actions/checkout@v6
if: env.SHOULD_RUN == 'true'
with:
fetch-depth: 0
submodules: true
- uses: coursier/cache-action@v8
if: env.SHOULD_RUN == 'true'
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
if: env.SHOULD_RUN == 'true'
with:
jvm: "temurin:17"
- name: Ensure it's not running on aarch64
if: env.SHOULD_RUN == 'true'
run: scala-cli -e 'assert(System.getProperty("os.arch") != "aarch64")'
- name: Generate native launcher
if: env.SHOULD_RUN == 'true'
run: .github/scripts/generate-native-image.sh
- run: ./mill -i ci.setShouldPublish
if: env.SHOULD_RUN == 'true'
- name: Build OS packages
if: env.SHOULD_PUBLISH == 'true' && env.SHOULD_RUN == 'true'
run: .github/scripts/generate-os-packages.sh
- name: Copy artifacts
if: env.SHOULD_RUN == 'true'
run: ./mill -i copyDefaultLauncher --directory artifacts/
- uses: actions/upload-artifact@v7
if: env.SHOULD_RUN == 'true'
with:
name: macos-launchers
path: artifacts/
if-no-files-found: error
retention-days: 2
native-macos-tests-default:
needs: [changes, generate-macos-launcher]
timeout-minutes: 150
runs-on: "macOS-15-intel"
env:
SHOULD_RUN: ${{ needs.changes.outputs.code == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.test_all == 'true' || needs.changes.outputs.test_native == 'true' }}
steps:
- name: Log skip reason
if: env.SHOULD_RUN != 'true'
run: echo "Skipping native macOS integration tests (default) -- changes do not affect compiled code or CI."
- uses: actions/checkout@v6
if: env.SHOULD_RUN == 'true'
with:
fetch-depth: 0
submodules: true
- uses: coursier/cache-action@v8
if: env.SHOULD_RUN == 'true'
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
if: env.SHOULD_RUN == 'true'
with:
jvm: "temurin:17"
- name: Ensure it's not running on aarch64
if: env.SHOULD_RUN == 'true'
run: scala-cli -e 'assert(System.getProperty("os.arch") != "aarch64")'
- uses: actions/download-artifact@v8
if: env.SHOULD_RUN == 'true'
with:
name: macos-launchers
path: artifacts/
- name: Native integration tests
if: env.SHOULD_RUN == 'true'
run: ./mill -i nativeIntegrationTests
env:
UPDATE_GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SCALA_CLI_IT_FORCED_LAUNCHER_DIRECTORY: artifacts/
SCALA_CLI_IT_GROUP: 1
SCALA_CLI_SODIUM_JNI_ALLOW: false
- name: Convert Mill test reports to JUnit XML format
if: (success() || failure()) && env.SHOULD_RUN == 'true'
run: .github/scripts/generate-junit-reports.sc macos-tests-default 'Scala CLI MacOS Tests (default)' test-report.xml out/
- name: Upload test report
uses: actions/upload-artifact@v7
if: (success() || failure()) && env.SHOULD_RUN == 'true'
with:
name: test-results-macos-tests-default
path: test-report.xml
native-macos-tests-rc:
needs: [changes, generate-macos-launcher]
timeout-minutes: 150
runs-on: "macOS-15-intel"
env:
SHOULD_RUN: ${{ needs.changes.outputs.code == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.test_all == 'true' || needs.changes.outputs.test_native == 'true' }}
steps:
- name: Log skip reason
if: env.SHOULD_RUN != 'true'
run: echo "Skipping native macOS integration tests (RC) -- changes do not affect compiled code or CI."
- uses: actions/checkout@v6
if: env.SHOULD_RUN == 'true'
with:
fetch-depth: 0
submodules: true
- uses: coursier/cache-action@v8
if: env.SHOULD_RUN == 'true'
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
if: env.SHOULD_RUN == 'true'
with:
jvm: "temurin:17"
- name: Ensure it's not running on aarch64
if: env.SHOULD_RUN == 'true'
run: scala-cli -e 'assert(System.getProperty("os.arch") != "aarch64")'
- uses: actions/download-artifact@v8
if: env.SHOULD_RUN == 'true'
with:
name: macos-launchers
path: artifacts/
- name: Native integration tests
if: env.SHOULD_RUN == 'true'
run: ./mill -i nativeIntegrationTests
env:
UPDATE_GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SCALA_CLI_IT_FORCED_LAUNCHER_DIRECTORY: artifacts/
SCALA_CLI_IT_GROUP: 5
SCALA_CLI_SODIUM_JNI_ALLOW: false
- name: Convert Mill test reports to JUnit XML format
if: (success() || failure()) && env.SHOULD_RUN == 'true'
run: .github/scripts/generate-junit-reports.sc macos-tests-rc 'Scala CLI MacOS Tests (5)' test-report.xml out/
- name: Upload test report
uses: actions/upload-artifact@v7
if: (success() || failure()) && env.SHOULD_RUN == 'true'
with:
name: test-results-macos-tests-rc
path: test-report.xml
generate-macos-arm64-launcher:
needs: [changes]
timeout-minutes: 120
runs-on: "macOS-15"
env:
SHOULD_RUN: ${{ needs.changes.outputs.code == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.test_all == 'true' || needs.changes.outputs.test_native == 'true' }}
steps:
- name: Log skip reason
if: env.SHOULD_RUN != 'true'
run: echo "Skipping macOS ARM64 native launcher generation -- changes do not affect compiled code or CI."
- uses: actions/checkout@v6
if: env.SHOULD_RUN == 'true'
with:
fetch-depth: 0
submodules: true
- uses: coursier/cache-action@v8
if: env.SHOULD_RUN == 'true'
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
if: env.SHOULD_RUN == 'true'
with:
jvm: "https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.2.0/graalvm-ce-java17-darwin-aarch64-22.2.0.tar.gz"
- name: Ensure it's running on aarch64
if: env.SHOULD_RUN == 'true'
run: scala-cli -e 'assert(System.getProperty("os.arch") == "aarch64")'
- name: Generate native launcher
if: env.SHOULD_RUN == 'true'
run: .github/scripts/generate-native-image.sh
- run: ./mill -i ci.setShouldPublish
if: env.SHOULD_RUN == 'true'
- name: Build OS packages
if: env.SHOULD_PUBLISH == 'true' && env.SHOULD_RUN == 'true'
run: .github/scripts/generate-os-packages.sh
- name: Copy artifacts
if: env.SHOULD_RUN == 'true'
run: ./mill -i copyDefaultLauncher --directory artifacts/
- uses: actions/upload-artifact@v7
if: env.SHOULD_RUN == 'true'
with:
name: macos-arm64-launchers
path: artifacts/
if-no-files-found: error
retention-days: 2
native-macos-arm64-tests-default:
needs: [changes, generate-macos-arm64-launcher]
timeout-minutes: 150
runs-on: "macOS-15"
env:
SHOULD_RUN: ${{ needs.changes.outputs.code == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.test_all == 'true' || needs.changes.outputs.test_native == 'true' }}
steps:
- name: Log skip reason
if: env.SHOULD_RUN != 'true'
run: echo "Skipping native macOS ARM64 integration tests (default) -- changes do not affect compiled code or CI."
- uses: actions/checkout@v6
if: env.SHOULD_RUN == 'true'
with:
fetch-depth: 0
submodules: true
- uses: coursier/cache-action@v8
if: env.SHOULD_RUN == 'true'
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
if: env.SHOULD_RUN == 'true'
with:
jvm: "https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.2.0/graalvm-ce-java17-darwin-aarch64-22.2.0.tar.gz"
- name: Ensure it's running on aarch64
if: env.SHOULD_RUN == 'true'
run: scala-cli -e 'assert(System.getProperty("os.arch") == "aarch64")'
- uses: actions/download-artifact@v8
if: env.SHOULD_RUN == 'true'
with:
name: macos-arm64-launchers
path: artifacts/
- name: Native integration tests
if: env.SHOULD_RUN == 'true'
run: ./mill -i nativeIntegrationTests
env:
UPDATE_GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SCALA_CLI_IT_FORCED_LAUNCHER_DIRECTORY: artifacts/
SCALA_CLI_IT_GROUP: 1
SCALA_CLI_SODIUM_JNI_ALLOW: false
- name: Convert Mill test reports to JUnit XML format
if: (success() || failure()) && env.SHOULD_RUN == 'true'
run: .github/scripts/generate-junit-reports.sc macos-arm64-tests-default 'Scala CLI MacOS ARM64 Tests (default)' test-report.xml out/
- name: Upload test report
uses: actions/upload-artifact@v7
if: (success() || failure()) && env.SHOULD_RUN == 'true'
with:
name: test-results-macos-arm64-tests-default
path: test-report.xml
native-macos-arm64-tests-lts:
needs: [changes, generate-macos-arm64-launcher]
timeout-minutes: 150
runs-on: "macOS-15"
env:
SHOULD_RUN: ${{ needs.changes.outputs.code == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.test_all == 'true' || needs.changes.outputs.test_native == 'true' }}
steps:
- name: Log skip reason
if: env.SHOULD_RUN != 'true'
run: echo "Skipping native macOS ARM64 integration tests (Scala 3 LTS) -- changes do not affect compiled code or CI."
- uses: actions/checkout@v6
if: env.SHOULD_RUN == 'true'
with:
fetch-depth: 0
submodules: true
- uses: coursier/cache-action@v8
if: env.SHOULD_RUN == 'true'
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
if: env.SHOULD_RUN == 'true'
with:
jvm: "https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.2.0/graalvm-ce-java17-darwin-aarch64-22.2.0.tar.gz"
- name: Ensure it's running on aarch64
if: env.SHOULD_RUN == 'true'
run: scala-cli -e 'assert(System.getProperty("os.arch") == "aarch64")'
- uses: actions/download-artifact@v8
if: env.SHOULD_RUN == 'true'
with:
name: macos-arm64-launchers
path: artifacts/
- name: Native integration tests
if: env.SHOULD_RUN == 'true'
run: ./mill -i nativeIntegrationTests
env:
UPDATE_GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SCALA_CLI_IT_FORCED_LAUNCHER_DIRECTORY: artifacts/
SCALA_CLI_IT_GROUP: 4
SCALA_CLI_SODIUM_JNI_ALLOW: false
- name: Convert Mill test reports to JUnit XML format
if: (success() || failure()) && env.SHOULD_RUN == 'true'
run: .github/scripts/generate-junit-reports.sc macos-arm64-tests-lts 'Scala CLI MacOS ARM64 Tests (Scala 3 LTS)' test-report.xml out/
- name: Upload test report
uses: actions/upload-artifact@v7
if: (success() || failure()) && env.SHOULD_RUN == 'true'
with:
name: test-results-macos-arm64-tests-lts
path: test-report.xml
native-macos-arm64-tests-rc:
needs: [changes, generate-macos-arm64-launcher]
timeout-minutes: 150
runs-on: "macOS-15"
env:
SHOULD_RUN: ${{ needs.changes.outputs.code == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.test_all == 'true' || needs.changes.outputs.test_native == 'true' }}
steps:
- name: Log skip reason
if: env.SHOULD_RUN != 'true'
run: echo "Skipping native macOS ARM64 integration tests (RC) -- changes do not affect compiled code or CI."
- uses: actions/checkout@v6
if: env.SHOULD_RUN == 'true'
with:
fetch-depth: 0
submodules: true
- uses: coursier/cache-action@v8
if: env.SHOULD_RUN == 'true'
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
if: env.SHOULD_RUN == 'true'
with:
jvm: "https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.2.0/graalvm-ce-java17-darwin-aarch64-22.2.0.tar.gz"
- name: Ensure it's running on aarch64
if: env.SHOULD_RUN == 'true'
run: scala-cli -e 'assert(System.getProperty("os.arch") == "aarch64")'
- uses: actions/download-artifact@v8
if: env.SHOULD_RUN == 'true'
with:
name: macos-arm64-launchers
path: artifacts/
- name: Native integration tests
if: env.SHOULD_RUN == 'true'
run: ./mill -i nativeIntegrationTests
env:
UPDATE_GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SCALA_CLI_IT_FORCED_LAUNCHER_DIRECTORY: artifacts/
SCALA_CLI_IT_GROUP: 5
SCALA_CLI_SODIUM_JNI_ALLOW: false
- name: Convert Mill test reports to JUnit XML format
if: (success() || failure()) && env.SHOULD_RUN == 'true'
run: .github/scripts/generate-junit-reports.sc macos-arm64-tests-rc 'Scala CLI MacOS ARM64 Tests (5)' test-report.xml out/
- name: Upload test report
uses: actions/upload-artifact@v7
if: (success() || failure()) && env.SHOULD_RUN == 'true'
with:
name: test-results-macos-arm64-tests-rc
path: test-report.xml
generate-windows-launcher:
needs: [changes]
timeout-minutes: 120
runs-on: "windows-2025"
env:
SHOULD_RUN: ${{ needs.changes.outputs.code == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.test_all == 'true' || needs.changes.outputs.test_native == 'true' }}
steps:
- name: Log skip reason
if: env.SHOULD_RUN != 'true'
run: echo "Skipping Windows native launcher generation -- changes do not affect compiled code or CI."
- uses: actions/checkout@v6
if: env.SHOULD_RUN == 'true'
with:
fetch-depth: 0
submodules: true
- name: Import custom registry and verify
if: env.SHOULD_RUN == 'true'
uses: ./.github/actions/windows-reg-import
with:
reg-file: .github/ci/windows/custom.reg
- uses: coursier/cache-action@v8
if: env.SHOULD_RUN == 'true'
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
if: env.SHOULD_RUN == 'true'
with:
jvm: "temurin:17"
- name: Get latest coursier launcher
if: env.SHOULD_RUN == 'true'
run: .github/scripts/get-latest-cs.sh
shell: bash
- name: Generate native launcher
if: env.SHOULD_RUN == 'true'
run: .github/scripts/generate-native-image.sh
shell: bash
- run: ./mill -i ci.setShouldPublish
if: env.SHOULD_RUN == 'true'
- name: Build OS packages
if: env.SHOULD_PUBLISH == 'true' && env.SHOULD_RUN == 'true'
run: .github/scripts/generate-os-packages.sh
shell: bash
- name: Copy artifacts
if: env.SHOULD_RUN == 'true'
run: ./mill -i copyDefaultLauncher --directory artifacts/
- uses: actions/upload-artifact@v7
if: env.SHOULD_RUN == 'true'
with:
name: windows-launchers
path: artifacts/
if-no-files-found: error
retention-days: 2
native-windows-tests-default:
needs: [changes, generate-windows-launcher]
timeout-minutes: 150
runs-on: "windows-2025"
env:
SHOULD_RUN: ${{ needs.changes.outputs.code == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.test_all == 'true' || needs.changes.outputs.test_native == 'true' }}
steps:
- name: Log skip reason
if: env.SHOULD_RUN != 'true'
run: echo "Skipping native Windows integration tests (default) -- changes do not affect compiled code or CI."
- uses: actions/checkout@v6
if: env.SHOULD_RUN == 'true'
with:
fetch-depth: 0
submodules: true
- name: Import custom registry and verify
if: env.SHOULD_RUN == 'true'
uses: ./.github/actions/windows-reg-import
with:
reg-file: .github/ci/windows/custom.reg
- name: Set up Python
if: env.SHOULD_RUN == 'true'
uses: actions/setup-python@v6
with:
python-version: "3.10"
- uses: coursier/cache-action@v8
if: env.SHOULD_RUN == 'true'
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
if: env.SHOULD_RUN == 'true'
with:
jvm: "temurin:17"
- name: Get latest coursier launcher
if: env.SHOULD_RUN == 'true'
run: .github/scripts/get-latest-cs.sh
shell: bash
- uses: actions/download-artifact@v8
if: env.SHOULD_RUN == 'true'
with:
name: windows-launchers
path: artifacts/
- name: Native integration tests
if: env.SHOULD_RUN == 'true'
run: ./mill -i nativeIntegrationTests
env:
COURSIER_JNI: force
UPDATE_GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SCALA_CLI_IT_FORCED_LAUNCHER_DIRECTORY: artifacts/
SCALA_CLI_IT_GROUP: 1
SCALA_CLI_SODIUM_JNI_ALLOW: false
- name: Convert Mill test reports to JUnit XML format
if: (success() || failure()) && env.SHOULD_RUN == 'true'
run: scala-cli shebang .github/scripts/generate-junit-reports.sc windows-tests-default 'Scala CLI Windows Tests (default)' test-report.xml out/
- name: Upload test report
uses: actions/upload-artifact@v7
if: (success() || failure()) && env.SHOULD_RUN == 'true'
with:
name: test-results-windows-tests-default
path: test-report.xml
native-windows-tests-lts:
needs: [changes, generate-windows-launcher]
timeout-minutes: 150
runs-on: "windows-2025"
env:
SHOULD_RUN: ${{ needs.changes.outputs.code == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.test_all == 'true' || needs.changes.outputs.test_native == 'true' }}
steps:
- name: Log skip reason
if: env.SHOULD_RUN != 'true'
run: echo "Skipping native Windows integration tests (Scala 3 LTS) -- changes do not affect compiled code or CI."
- uses: actions/checkout@v6
if: env.SHOULD_RUN == 'true'
with:
fetch-depth: 0
submodules: true
- name: Import custom registry and verify
if: env.SHOULD_RUN == 'true'
uses: ./.github/actions/windows-reg-import
with:
reg-file: .github/ci/windows/custom.reg
- name: Set up Python
if: env.SHOULD_RUN == 'true'
uses: actions/setup-python@v6
with:
python-version: "3.10"
- uses: coursier/cache-action@v8
if: env.SHOULD_RUN == 'true'
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
if: env.SHOULD_RUN == 'true'
with:
jvm: "temurin:17"
- name: Get latest coursier launcher
if: env.SHOULD_RUN == 'true'
run: .github/scripts/get-latest-cs.sh
shell: bash
- uses: actions/download-artifact@v8
if: env.SHOULD_RUN == 'true'
with:
name: windows-launchers
path: artifacts/
- name: Native integration tests
if: env.SHOULD_RUN == 'true'
run: ./mill -i nativeIntegrationTests
env:
COURSIER_JNI: force
UPDATE_GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SCALA_CLI_IT_FORCED_LAUNCHER_DIRECTORY: artifacts/
SCALA_CLI_IT_GROUP: 4
SCALA_CLI_SODIUM_JNI_ALLOW: false
- name: Convert Mill test reports to JUnit XML format
if: (success() || failure()) && env.SHOULD_RUN == 'true'
run: scala-cli shebang .github/scripts/generate-junit-reports.sc windows-tests-lts 'Scala CLI Windows Tests (Scala 3 LTS)' test-report.xml out/
- name: Upload test report
uses: actions/upload-artifact@v7
if: (success() || failure()) && env.SHOULD_RUN == 'true'
with:
name: test-results-windows-tests-lts
path: test-report.xml
native-windows-tests-rc:
needs: [changes, generate-windows-launcher]
timeout-minutes: 150
runs-on: "windows-2025"
env:
SHOULD_RUN: ${{ needs.changes.outputs.code == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.test_all == 'true' || needs.changes.outputs.test_native == 'true' }}
steps:
- name: Log skip reason
if: env.SHOULD_RUN != 'true'
run: echo "Skipping native Windows integration tests (RC) -- changes do not affect compiled code or CI."
- uses: actions/checkout@v6
if: env.SHOULD_RUN == 'true'
with:
fetch-depth: 0
submodules: true
- name: Import custom registry and verify
if: env.SHOULD_RUN == 'true'
uses: ./.github/actions/windows-reg-import
with:
reg-file: .github/ci/windows/custom.reg
- name: Set up Python
if: env.SHOULD_RUN == 'true'
uses: actions/setup-python@v6
with:
python-version: "3.10"
- uses: coursier/cache-action@v8
if: env.SHOULD_RUN == 'true'
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
if: env.SHOULD_RUN == 'true'
with:
jvm: "temurin:17"
- name: Get latest coursier launcher
if: env.SHOULD_RUN == 'true'
run: .github/scripts/get-latest-cs.sh
shell: bash
- uses: actions/download-artifact@v8
if: env.SHOULD_RUN == 'true'
with:
name: windows-launchers
path: artifacts/
- name: Native integration tests
if: env.SHOULD_RUN == 'true'
run: ./mill -i nativeIntegrationTests
env:
COURSIER_JNI: force
UPDATE_GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SCALA_CLI_IT_FORCED_LAUNCHER_DIRECTORY: artifacts/
SCALA_CLI_IT_GROUP: 5
SCALA_CLI_SODIUM_JNI_ALLOW: false
- name: Convert Mill test reports to JUnit XML format
if: (success() || failure()) && env.SHOULD_RUN == 'true'
run: scala-cli shebang .github/scripts/generate-junit-reports.sc windows-tests-rc 'Scala CLI Windows Tests (5)' test-report.xml out/
- name: Upload test report
uses: actions/upload-artifact@v7
if: (success() || failure()) && env.SHOULD_RUN == 'true'
with:
name: test-results-windows-tests-rc
path: test-report.xml
generate-mostly-static-launcher:
needs: [changes]
timeout-minutes: 120
runs-on: ubuntu-24.04
env:
SHOULD_RUN: ${{ needs.changes.outputs.code == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.test_all == 'true' || needs.changes.outputs.test_native == 'true' }}
steps:
- name: Log skip reason
if: env.SHOULD_RUN != 'true'
run: echo "Skipping mostly-static native launcher generation -- changes do not affect compiled code or CI."
- uses: actions/checkout@v6
if: env.SHOULD_RUN == 'true'
with:
fetch-depth: 0
submodules: true
- uses: coursier/cache-action@v8
if: env.SHOULD_RUN == 'true'
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
if: env.SHOULD_RUN == 'true'
with:
jvm: "temurin:17"
- name: Generate native launcher
if: env.SHOULD_RUN == 'true'
run: .github/scripts/generate-native-image.sh mostly-static
shell: bash
- name: Copy artifacts
if: env.SHOULD_RUN == 'true'
run: ./mill -i copyMostlyStaticLauncher --directory artifacts/
- uses: actions/upload-artifact@v7
if: env.SHOULD_RUN == 'true'
with:
name: mostly-static-launchers
path: artifacts/
if-no-files-found: error
retention-days: 2
native-mostly-static-tests-default:
needs: [changes, generate-mostly-static-launcher]
timeout-minutes: 150
runs-on: ubuntu-24.04
env:
SHOULD_RUN: ${{ needs.changes.outputs.code == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.test_all == 'true' || needs.changes.outputs.test_native == 'true' }}
steps:
- name: Log skip reason
if: env.SHOULD_RUN != 'true'
run: echo "Skipping native mostly-static integration tests (default) -- changes do not affect compiled code or CI."
- uses: actions/checkout@v6
if: env.SHOULD_RUN == 'true'
with:
fetch-depth: 0
submodules: true
- uses: coursier/cache-action@v8
if: env.SHOULD_RUN == 'true'
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
if: env.SHOULD_RUN == 'true'
with:
jvm: "temurin:17"
- uses: actions/download-artifact@v8
if: env.SHOULD_RUN == 'true'
with:
name: mostly-static-launchers
path: artifacts/
- name: Build slim docker image
if: env.SHOULD_RUN == 'true'
run: .github/scripts/generate-slim-docker-image.sh
- name: Native integration tests
if: env.SHOULD_RUN == 'true'
run: ./mill -i integration.test.nativeMostlyStatic
env:
UPDATE_GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SCALA_CLI_IT_FORCED_LAUNCHER_DIRECTORY: artifacts/
SCALA_CLI_IT_GROUP: 1
SCALA_CLI_SODIUM_JNI_ALLOW: false
- name: Docker integration tests
if: (success() || failure()) && env.SHOULD_RUN == 'true'
run: ./mill integration.docker-slim.test
- name: Convert Mill test reports to JUnit XML format
if: (success() || failure()) && env.SHOULD_RUN == 'true'
run: .github/scripts/generate-junit-reports.sc native-mostly-static-tests-default 'Scala CLI Native Mostly Static Tests (default)' test-report.xml out/
- name: Upload test report
uses: actions/upload-artifact@v7
if: (success() || failure()) && env.SHOULD_RUN == 'true'
with:
name: test-results-native-mostly-static-tests-default
path: test-report.xml
- name: Login to GitHub Container Registry
if: startsWith(github.ref, 'refs/tags/v') && env.SHOULD_RUN == 'true'
uses: docker/login-action@v4
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Push slim scala-cli image to github container registry
if: startsWith(github.ref, 'refs/tags/v') && env.SHOULD_RUN == 'true'
run: .github/scripts/publish-slim-docker-images.sh
native-mostly-static-tests-rc:
needs: [changes, generate-mostly-static-launcher]
timeout-minutes: 150
runs-on: ubuntu-24.04
env:
SHOULD_RUN: ${{ needs.changes.outputs.code == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.test_all == 'true' || needs.changes.outputs.test_native == 'true' }}
steps:
- name: Log skip reason
if: env.SHOULD_RUN != 'true'
run: echo "Skipping native mostly-static integration tests (RC) -- changes do not affect compiled code or CI."
- uses: actions/checkout@v6
if: env.SHOULD_RUN == 'true'
with:
fetch-depth: 0
submodules: true
- uses: coursier/cache-action@v8
if: env.SHOULD_RUN == 'true'
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
if: env.SHOULD_RUN == 'true'
with:
jvm: "temurin:17"
- uses: actions/download-artifact@v8
if: env.SHOULD_RUN == 'true'
with:
name: mostly-static-launchers
path: artifacts/
- name: Native integration tests
if: env.SHOULD_RUN == 'true'
run: ./mill -i integration.test.nativeMostlyStatic
env:
UPDATE_GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SCALA_CLI_IT_FORCED_LAUNCHER_DIRECTORY: artifacts/
SCALA_CLI_IT_GROUP: 5
SCALA_CLI_SODIUM_JNI_ALLOW: false
- name: Convert Mill test reports to JUnit XML format
if: (success() || failure()) && env.SHOULD_RUN == 'true'
run: .github/scripts/generate-junit-reports.sc native-mostly-static-tests-rc 'Scala CLI Native Mostly Static Tests (5)' test-report.xml out/
- name: Upload test report
uses: actions/upload-artifact@v7
if: (success() || failure()) && env.SHOULD_RUN == 'true'
with:
name: test-results-native-mostly-static-tests-rc
path: test-report.xml
generate-static-launcher:
needs: [changes]
timeout-minutes: 120
runs-on: ubuntu-24.04
env:
SHOULD_RUN: ${{ needs.changes.outputs.code == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.test_all == 'true' || needs.changes.outputs.test_native == 'true' }}
steps:
- name: Log skip reason
if: env.SHOULD_RUN != 'true'
run: echo "Skipping static native launcher generation -- changes do not affect compiled code or CI."
- uses: actions/checkout@v6
if: env.SHOULD_RUN == 'true'
with:
fetch-depth: 0
submodules: true
- uses: coursier/cache-action@v8
if: env.SHOULD_RUN == 'true'
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
if: env.SHOULD_RUN == 'true'
with:
jvm: "temurin:17"
- name: Generate native launcher
if: env.SHOULD_RUN == 'true'
run: .github/scripts/generate-native-image.sh static
shell: bash
- name: Copy artifacts
if: env.SHOULD_RUN == 'true'
run: ./mill -i copyStaticLauncher --directory artifacts/
- uses: actions/upload-artifact@v7
if: env.SHOULD_RUN == 'true'
with:
name: static-launchers
path: artifacts/
if-no-files-found: error
retention-days: 2
native-static-tests-default:
needs: [changes, generate-static-launcher]
timeout-minutes: 150
runs-on: ubuntu-24.04
env:
SHOULD_RUN: ${{ needs.changes.outputs.code == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.test_all == 'true' || needs.changes.outputs.test_native == 'true' }}
steps:
- name: Log skip reason
if: env.SHOULD_RUN != 'true'
run: echo "Skipping native static integration tests (default) -- changes do not affect compiled code or CI."
- uses: actions/checkout@v6
if: env.SHOULD_RUN == 'true'
with:
fetch-depth: 0
submodules: true
- uses: coursier/cache-action@v8
if: env.SHOULD_RUN == 'true'
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
if: env.SHOULD_RUN == 'true'
with:
jvm: "temurin:17"
- uses: actions/download-artifact@v8
if: env.SHOULD_RUN == 'true'
with:
name: static-launchers
path: artifacts/
- name: Build docker image
if: env.SHOULD_RUN == 'true'
run: .github/scripts/generate-docker-image.sh
- name: Native integration tests
if: env.SHOULD_RUN == 'true'
run: ./mill -i integration.test.nativeStatic
env:
UPDATE_GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SCALA_CLI_IT_FORCED_LAUNCHER_DIRECTORY: artifacts/
SCALA_CLI_IT_GROUP: 1
SCALA_CLI_SODIUM_JNI_ALLOW: false
- name: Docker integration tests
if: (success() || failure()) && env.SHOULD_RUN == 'true'
run: ./mill integration.docker.test
- name: Convert Mill test reports to JUnit XML format
if: (success() || failure()) && env.SHOULD_RUN == 'true'
run: .github/scripts/generate-junit-reports.sc native-static-tests-default 'Scala CLI Native Static Tests (default)' test-report.xml out/
- name: Upload test report
uses: actions/upload-artifact@v7
if: (success() || failure()) && env.SHOULD_RUN == 'true'
with:
name: test-results-native-static-tests-default
path: test-report.xml
- name: Login to GitHub Container Registry
if: startsWith(github.ref, 'refs/tags/v') && env.SHOULD_RUN == 'true'
uses: docker/login-action@v4
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Push scala-cli to github container registry
if: startsWith(github.ref, 'refs/tags/v') && env.SHOULD_RUN == 'true'
run: .github/scripts/publish-docker-images.sh
native-static-tests-rc:
needs: [changes, generate-static-launcher]
timeout-minutes: 150
runs-on: ubuntu-24.04
env:
SHOULD_RUN: ${{ needs.changes.outputs.code == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.test_all == 'true' || needs.changes.outputs.test_native == 'true' }}
steps:
- name: Log skip reason
if: env.SHOULD_RUN != 'true'
run: echo "Skipping native static integration tests (RC) -- changes do not affect compiled code or CI."
- uses: actions/checkout@v6
if: env.SHOULD_RUN == 'true'
with:
fetch-depth: 0
submodules: true
- uses: coursier/cache-action@v8
if: env.SHOULD_RUN == 'true'
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
if: env.SHOULD_RUN == 'true'
with:
jvm: "temurin:17"
- uses: actions/download-artifact@v8
if: env.SHOULD_RUN == 'true'
with:
name: static-launchers
path: artifacts/
- name: Build docker image
if: env.SHOULD_RUN == 'true'
run: .github/scripts/generate-docker-image.sh
- name: Native integration tests
if: env.SHOULD_RUN == 'true'
run: ./mill -i integration.test.nativeStatic
env:
UPDATE_GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SCALA_CLI_IT_FORCED_LAUNCHER_DIRECTORY: artifacts/
SCALA_CLI_IT_GROUP: 5
SCALA_CLI_SODIUM_JNI_ALLOW: false
- name: Convert Mill test reports to JUnit XML format
if: (success() || failure()) && env.SHOULD_RUN == 'true'
run: .github/scripts/generate-junit-reports.sc native-static-tests-rc 'Scala CLI Native Static Tests (5)' test-report.xml out/
- name: Upload test report
uses: actions/upload-artifact@v7
if: (success() || failure()) && env.SHOULD_RUN == 'true'
with:
name: test-results-native-static-tests-rc
path: test-report.xml
docs-tests:
needs: [changes]
# for now, let's run those tests only on ubuntu
runs-on: ubuntu-24.04
env:
SHOULD_RUN: ${{ needs.changes.outputs.code == 'true' || needs.changes.outputs.docs == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.gifs == 'true' || needs.changes.outputs.test_all == 'true' || needs.changes.outputs.test_docs == 'true' }}
steps:
- name: Log skip reason
if: env.SHOULD_RUN != 'true'
run: echo "Skipping docs tests -- changes do not affect code, docs, CI, or gifs."
- uses: actions/checkout@v6
if: env.SHOULD_RUN == 'true'
with:
fetch-depth: 0
submodules: true
- uses: coursier/cache-action@v8
if: env.SHOULD_RUN == 'true'
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
if: env.SHOULD_RUN == 'true'
with:
jvm: "zulu:17"
- uses: actions/setup-node@v6
if: env.SHOULD_RUN == 'true'
with:
node-version: 24
- name: Build documentation
if: env.SHOULD_RUN == 'true'
run: .github/scripts/build-website.sh
- name: Verify release notes formatting
if: env.SHOULD_RUN == 'true'
run: .github/scripts/process_release_notes.sc verify website/docs/release_notes.md
- name: Test documentation
if: env.SHOULD_RUN == 'true'
run: ./mill -i 'docs-tests[]'.test
- name: Convert Mill test reports to JUnit XML format
if: (success() || failure()) && env.SHOULD_RUN == 'true'
run: .github/scripts/generate-junit-reports.sc docs-tests 'Scala CLI Docs Tests' test-report.xml out/
- name: Upload test report
uses: actions/upload-artifact@v7
if: (success() || failure()) && env.SHOULD_RUN == 'true'
with:
name: test-results-docs-tests
path: test-report.xml
checks:
needs: [changes]
timeout-minutes: 60
runs-on: ubuntu-24.04
env:
SHOULD_RUN: ${{ needs.changes.outputs.code == 'true' || needs.changes.outputs.docs == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.format_config == 'true' || needs.changes.outputs.test_all == 'true' }}
steps:
- name: Log skip reason
if: env.SHOULD_RUN != 'true'
run: echo "Skipping checks -- changes do not affect code, docs, CI, or format config."
- uses: actions/checkout@v6
if: env.SHOULD_RUN == 'true'
with:
fetch-depth: 0
submodules: true
- uses: coursier/cache-action@v8
if: env.SHOULD_RUN == 'true'
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
if: env.SHOULD_RUN == 'true'
with:
jvm: "temurin:17"
- name: Check Scala / Scala.js versions in doc
if: env.SHOULD_RUN == 'true'
run: ./mill -i ci.checkScalaVersions
- name: Check native-image config format
if: env.SHOULD_RUN == 'true'
run: ./mill -i __.checkNativeImageConfFormat
- name: Check Ammonite availability
if: env.SHOULD_RUN == 'true'
run: ./mill -i 'dummy.amm[_].resolvedRunMvnDeps'
- name: Check for cross Scala version conflicts
if: env.SHOULD_RUN == 'true'
run: .github/scripts/check-cross-version-deps.sc
- name: Scalafix check
if: env.SHOULD_RUN == 'true'
run: |
./mill -i __.fix --check || (
echo "To remove unused import run"
echo " ./mill -i __.fix"
exit 1
)
format:
needs: [changes]
timeout-minutes: 15
runs-on: ubuntu-24.04
env:
SHOULD_RUN: ${{ needs.changes.outputs.code == 'true' || needs.changes.outputs.docs == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.format_config == 'true' || needs.changes.outputs.test_all == 'true' || needs.changes.outputs.test_format == 'true' }}
steps:
- name: Log skip reason
if: env.SHOULD_RUN != 'true'
run: echo "Skipping format check -- changes do not affect code, docs, CI, or format config."
- uses: actions/checkout@v6
if: env.SHOULD_RUN == 'true'
with:
fetch-depth: 0
submodules: true
- uses: coursier/cache-action@v8
if: env.SHOULD_RUN == 'true'
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
if: env.SHOULD_RUN == 'true'
- run: scala-cli fmt . --check
if: env.SHOULD_RUN == 'true'
reference-doc:
needs: [changes]
timeout-minutes: 15
runs-on: ubuntu-24.04
env:
SHOULD_RUN: ${{ needs.changes.outputs.code == 'true' || needs.changes.outputs.docs == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.test_all == 'true' }}
steps:
- name: Log skip reason
if: env.SHOULD_RUN != 'true'
run: echo "Skipping reference doc check -- changes do not affect code, docs, or CI."
- uses: actions/checkout@v6
if: env.SHOULD_RUN == 'true'
with:
fetch-depth: 0
submodules: true
- uses: VirtusLab/scala-cli-setup@v1
if: env.SHOULD_RUN == 'true'
with:
jvm: "temurin:17"
- name: Check that reference doc is up-to-date
if: env.SHOULD_RUN == 'true'
run: |
./mill -i 'generate-reference-doc[]'.run --check || (
echo "Reference doc is not up-to-date. Run"
echo " ./mill -i 'generate-reference-doc[]'.run"
echo "to update it, then commit the result."
exit 1
)
bloop-memory-footprint:
needs: [changes]
timeout-minutes: 120
runs-on: ubuntu-24.04
env:
SHOULD_RUN: ${{ needs.changes.outputs.code == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.benchmark == 'true' || needs.changes.outputs.test_all == 'true' }}
steps:
- name: Log skip reason
if: env.SHOULD_RUN != 'true'
run: echo "Skipping bloop memory footprint benchmark -- changes do not affect code, CI, or benchmarks."
- uses: actions/checkout@v6
if: env.SHOULD_RUN == 'true'
with:
fetch-depth: 0
submodules: true
- uses: coursier/cache-action@v8
if: env.SHOULD_RUN == 'true'
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
if: env.SHOULD_RUN == 'true'
with:
jvm: "temurin:17"
- name: Java Version
if: env.SHOULD_RUN == 'true'
run: java -version
- name: Java Home
if: env.SHOULD_RUN == 'true'
run: echo "$JAVA_HOME"
- name: Build Scala CLI
if: env.SHOULD_RUN == 'true'
run: ./mill copyJvmLauncher --directory build
- name: Build Benchmark
if: env.SHOULD_RUN == 'true'
run: java -jar ./build/scala-cli --power package --standalone gcbenchmark/gcbenchmark.scala -o gc
- name: Run Benchmark
if: env.SHOULD_RUN == 'true'
run: ./gc $(realpath ./build/scala-cli)
test-hypothetical-sbt-export:
needs: [changes]
timeout-minutes: 120
runs-on: ubuntu-24.04
env:
SHOULD_RUN: ${{ needs.changes.outputs.code == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.test_all == 'true' }}
steps:
- name: Log skip reason
if: env.SHOULD_RUN != 'true'
run: echo "Skipping sbt export test -- changes do not affect compiled code or CI."
- uses: actions/checkout@v6
if: env.SHOULD_RUN == 'true'
with:
fetch-depth: 0
submodules: true
- uses: coursier/cache-action@v8
if: env.SHOULD_RUN == 'true'
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
if: env.SHOULD_RUN == 'true'
with:
jvm: "temurin:17"
- name: Try to export to SBT
if: env.SHOULD_RUN == 'true'
run: scala-cli --power export --sbt .
vc-redist:
needs: [changes]
timeout-minutes: 15
runs-on: "windows-2025"
if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name == 'Virtuslab/scala-cli'
env:
SHOULD_RUN: ${{ needs.changes.outputs.code == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.test_all == 'true' }}
steps:
- name: Log skip reason
if: env.SHOULD_RUN != 'true'
run: echo "Skipping vc-redist -- changes do not affect compiled code or CI."
- uses: actions/checkout@v6
if: env.SHOULD_RUN == 'true'
with:
fetch-depth: 0
submodules: true
- name: Import custom registry and verify
if: env.SHOULD_RUN == 'true'
uses: ./.github/actions/windows-reg-import
with:
reg-file: .github/ci/windows/custom.reg
- uses: coursier/cache-action@v8
if: env.SHOULD_RUN == 'true'
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
if: env.SHOULD_RUN == 'true'
with:
jvm: "temurin:17"
- run: ./mill -i ci.copyVcRedist
if: env.SHOULD_RUN == 'true'
- uses: actions/upload-artifact@v7
if: env.SHOULD_RUN == 'true'
with:
name: vc-redist-launchers
path: artifacts/
if-no-files-found: warn
retention-days: 2
publish:
needs:
- changes
- unit-tests
- jvm-bootstrapped-tests-default
- jvm-tests-default
- jvm-tests-scala-2-13
- jvm-tests-scala-2-12
- jvm-tests-lts
- jvm-tests-rc
- native-linux-tests-default
- native-linux-tests-scala-2-13
- native-linux-tests-scala-2-12
- native-linux-tests-lts
- native-linux-tests-rc
- native-linux-arm64-tests-default
- native-linux-arm64-tests-rc
- native-macos-tests-default
- native-macos-tests-rc
- native-macos-arm64-tests-default
- native-macos-arm64-tests-lts
- native-macos-arm64-tests-rc
- native-windows-tests-default
- native-windows-tests-lts
- native-windows-tests-rc
- native-mostly-static-tests-default
- native-mostly-static-tests-rc
- native-static-tests-default
- native-static-tests-rc
- vc-redist
- format
- checks
- test-fish-shell
- test-hypothetical-sbt-export
- bloop-memory-footprint
- reference-doc
- docs-tests
if: github.event_name == 'push' && github.repository == 'VirtusLab/scala-cli'
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
submodules: true
ssh-key: ${{ secrets.SSH_PRIVATE_KEY_SCALA_CLI }}
- uses: coursier/cache-action@v8
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
with:
jvm: "temurin:17"
- name: GPG setup
run: .github/scripts/gpg-setup.sh
env:
PGP_SECRET: ${{ secrets.PGP_SECRET }}
- name: Set publish flag
run: ./mill -i ci.setShouldPublish
- name: Print version
run: ./mill -i show project.publish.finalPublishVersion
- name: Publish to Sonatype Central
run: ./mill mill.scalalib.SonatypeCentralPublishModule/ --publishArtifacts '{__[],_}.publishArtifacts'
if: env.SHOULD_PUBLISH == 'true'
env:
MILL_PGP_SECRET_BASE64: ${{ secrets.PGP_SECRET }}
MILL_PGP_PASSPHRASE: ${{ secrets.PGP_PASSPHRASE }}
MILL_SONATYPE_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }}
MILL_SONATYPE_USERNAME: ${{ secrets.SONATYPE_USERNAME }}
- uses: webfactory/ssh-agent@e83874834305fe9a4a2997156cb26c5de65a8555
with:
ssh-private-key: |
${{ secrets.SSH_PRIVATE_KEY_SCALA_CLI }}
- name: Update stable branch
if: env.SHOULD_PUBLISH == 'true' && startsWith(github.ref, 'refs/tags/v')
run: |
git config user.name gh-actions
git config user.email actions@github.com
git checkout stable
git merge origin/main -m "Back port of documentation changes to stable"
git push origin stable
launchers:
timeout-minutes: 20
needs:
- changes
- unit-tests
- jvm-bootstrapped-tests-default
- jvm-tests-default
- jvm-tests-scala-2-13
- jvm-tests-scala-2-12
- jvm-tests-lts
- jvm-tests-rc
- native-linux-tests-default
- native-linux-tests-scala-2-13
- native-linux-tests-scala-2-12
- native-linux-tests-lts
- native-linux-tests-rc
- native-linux-arm64-tests-default
- native-linux-arm64-tests-rc
- native-macos-tests-default
- native-macos-tests-rc
- native-macos-arm64-tests-default
- native-macos-arm64-tests-lts
- native-macos-arm64-tests-rc
- native-windows-tests-default
- native-windows-tests-lts
- native-windows-tests-rc
- native-mostly-static-tests-default
- native-mostly-static-tests-rc
- native-static-tests-default
- native-static-tests-rc
- vc-redist
- format
- checks
- test-fish-shell
- test-hypothetical-sbt-export
- bloop-memory-footprint
- reference-doc
- generate-linux-arm64-native-launcher
- publish
if: github.event_name == 'push'
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
submodules: true
- uses: coursier/cache-action@v8
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
with:
jvm: "temurin:17"
- run: ./mill -i ci.setShouldPublish
- uses: actions/download-artifact@v8
if: env.SHOULD_PUBLISH == 'true'
with:
name: linux-launchers
path: artifacts/
- uses: actions/download-artifact@v8
if: env.SHOULD_PUBLISH == 'true'
with:
name: linux-aarch64-launchers
path: artifacts/
- uses: actions/download-artifact@v8
if: env.SHOULD_PUBLISH == 'true'
with:
name: macos-launchers
path: artifacts/
- uses: actions/download-artifact@v8
if: env.SHOULD_PUBLISH == 'true'
with:
name: macos-arm64-launchers
path: artifacts/
- uses: actions/download-artifact@v8
if: env.SHOULD_PUBLISH == 'true'
with:
name: windows-launchers
path: artifacts/
- uses: actions/download-artifact@v8
if: env.SHOULD_PUBLISH == 'true'
with:
name: mostly-static-launchers
path: artifacts/
- uses: actions/download-artifact@v8
if: env.SHOULD_PUBLISH == 'true'
with:
name: static-launchers
path: artifacts/
- uses: actions/download-artifact@v8
if: env.SHOULD_PUBLISH == 'true'
with:
name: jvm-launchers
path: artifacts/
- uses: actions/download-artifact@v8
if: env.SHOULD_PUBLISH == 'true'
with:
name: vc-redist-launchers
path: artifacts/
- run: ./mill -i uploadLaunchers --directory artifacts/
if: env.SHOULD_PUBLISH == 'true'
env:
UPLOAD_GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
update-packages:
name: Update packages
needs:
- changes
- launchers
- publish
runs-on: ubuntu-24.04
if: startsWith(github.ref, 'refs/tags/v') && github.repository == 'VirtusLab/scala-cli'
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
submodules: true
- uses: coursier/cache-action@v8
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
with:
jvm: "temurin:17"
- uses: actions/download-artifact@v8
with:
name: linux-launchers
path: artifacts/
- uses: actions/download-artifact@v8
with:
name: linux-aarch64-launchers
path: artifacts/
- uses: actions/download-artifact@v8
with:
name: macos-launchers
path: artifacts/
- uses: actions/download-artifact@v8
with:
name: macos-arm64-launchers
path: artifacts/
- uses: actions/download-artifact@v8
with:
name: windows-launchers
path: artifacts/
- uses: actions/download-artifact@v8
with:
name: mostly-static-launchers
path: artifacts/
- uses: actions/download-artifact@v8
with:
name: static-launchers
path: artifacts/
- uses: actions/download-artifact@v8
with:
name: jvm-launchers
path: artifacts/
- name: Display structure of downloaded files
run: ls -R
working-directory: artifacts/
- uses: webfactory/ssh-agent@e83874834305fe9a4a2997156cb26c5de65a8555
with:
ssh-private-key: |
${{ secrets.SCALA_CLI_PACKAGES_KEY }}
${{ secrets.HOMEBREW_SCALA_CLI_KEY }}
${{ secrets.HOMEBREW_SCALA_EXPERIMENTAL_KEY }}
${{ secrets.SCALA_CLI_SETUP_KEY }}
- run: ./mill -i ci.updateInstallationScript
continue-on-error: true
- run: ./mill -i ci.updateScalaCliBrewFormula
continue-on-error: true
- name: GPG setup
run: .github/scripts/gpg-setup.sh
env:
PGP_SECRET: ${{ secrets.PGP_SECRET }}
- run: ./mill -i ci.updateDebianPackages
continue-on-error: true
env:
PGP_PASSPHRASE: ${{ secrets.PGP_PASSPHRASE }}
GPG_EMAIL: ${{ secrets.GPG_EMAIL }}
- run: ./mill -i ci.updateCentOsPackages
continue-on-error: true
env:
PGP_PASSPHRASE: ${{ secrets.PGP_PASSPHRASE }}
KEYGRIP: ${{ secrets.KEYGRIP }}
PGP_SECRET: ${{ secrets.PGP_SECRET }}
GPG_EMAIL: ${{ secrets.GPG_EMAIL }}
- run: ./mill -i ci.updateStandaloneLauncher
continue-on-error: true
env:
UPLOAD_GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Publish to SDKMAN
continue-on-error: true
run: .github/scripts/publish-sdkman.sh
shell: bash
env:
SDKMAN_KEY: ${{ secrets.SDKMAN_KEY }}
SDKMAN_TOKEN: ${{ secrets.SDKMAN_TOKEN }}
- run: ./mill -i ci.updateScalaCliSetup
continue-on-error: true
- run: ./mill -i ci.updateScalaExperimentalBrewFormula
update-windows-packages:
name: Update Windows packages
needs:
- changes
- launchers
- publish
runs-on: "windows-2025"
if: startsWith(github.ref, 'refs/tags/v') && github.repository == 'VirtusLab/scala-cli'
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
submodules: true
- name: Import custom registry and verify
uses: ./.github/actions/windows-reg-import
with:
reg-file: .github/ci/windows/custom.reg
- uses: coursier/cache-action@v8
with:
ignoreJob: true
- uses: VirtusLab/scala-cli-setup@v1
with:
jvm: "temurin:17"
- uses: actions/download-artifact@v8
with:
name: windows-launchers
path: artifacts/
- name: Publish to chocolatey
run: ./mill -i ci.updateChocolateyPackage
continue-on-error: true
env:
CHOCO_SECRET: ${{ secrets.CHOCO_SECRET_KEY }}
- uses: vedantmgoyal9/winget-releaser@main
with:
identifier: VirtusLab.ScalaCLI
installers-regex: '\.msi$'
fork-user: scala-steward
token: ${{ secrets.STEWARD_WINGET_TOKEN }}
================================================
FILE: .github/workflows/publish-docker.yml
================================================
name: Create and publish a Docker image
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
on:
push:
branches: ["main"]
tags: ["v*"]
env:
REGISTRY: ghcr.io
IMAGE_NAME: virtuslab/scala-cli
DOCKERFILE: ./Dockerfile
REGISTRY_LOGIN: ${{ github.actor }}
REGISTRY_PASSWORD: ${{ secrets.GITHUB_TOKEN }}
jobs:
docker_build:
strategy:
fail-fast: true
matrix:
os: ["ubuntu-24.04", "ubuntu-24.04-arm"]
runs-on: ${{ matrix.os }}
# Sets the permissions granted to the `GITHUB_TOKEN` for the actions in this job.
permissions:
contents: read
packages: write
attestations: write
id-token: write
#
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Log in to the Container registry
uses: docker/login-action@v4
with:
registry: ${{ env.REGISTRY }}
username: ${{ env.REGISTRY_LOGIN }}
password: ${{ env.REGISTRY_PASSWORD }}
# This step uses [docker/metadata-action](https://github.com/docker/metadata-action#about) to extract tags and labels that will be applied to the specified image. The `id` "meta" allows the output of this step to be referenced in a subsequent step. The `images` value provides the base name for the tags and labels.
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@v6
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v4
# This step uses the `docker/build-push-action` action to build the image, based on your repository's `Dockerfile`. If the build succeeds, it pushes the image to GitHub Packages.
# It uses the `context` parameter to define the build's context as the set of files located in the specified path. For more information, see "[Usage](https://github.com/docker/build-push-action#usage)" in the README of the `docker/build-push-action` repository.
# It uses the `tags` and `labels` parameters to tag and label the image with the output from the "meta" step.
- name: Build and push Docker image
id: push
uses: docker/build-push-action@v7
with:
context: .
file: ${{ env.DOCKERFILE }}
cache-from: type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:buildcache-${{ matrix.os }}
cache-to: type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:buildcache-${{ matrix.os }},mode=max
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
# This step generates an artifact attestation for the image, which is an unforgeable statement about where and how it was built. It increases supply chain security for people who consume the image. For more information, see "[AUTOTITLE](/actions/security-guides/using-artifact-attestations-to-establish-provenance-for-builds)."
- name: Generate artifact attestation
uses: actions/attest-build-provenance@v4
with:
subject-name: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME}}
subject-digest: ${{ steps.push.outputs.digest }}
push-to-registry: true
- name: Export digest
run: |
mkdir -p /tmp/digests
digest="${{ steps.push.outputs.digest }}"
touch "/tmp/digests/${digest#sha256:}"
- name: Upload digest
uses: actions/upload-artifact@v7
with:
name: digests-${{ matrix.os }}
path: /tmp/digests/*
if-no-files-found: error
retention-days: 1
docker_release_merge:
runs-on: ubuntu-24.04
permissions:
contents: read
packages: write
attestations: write
id-token: write
needs: [docker_build]
if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main')
steps:
- name: Download digests
uses: actions/download-artifact@v8
with:
pattern: digests-*
path: /tmp/digests
merge-multiple: true
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v4
- name: Log in to the Container registry
uses: docker/login-action@v4
with:
registry: ${{ env.REGISTRY }}
username: ${{ env.REGISTRY_LOGIN }}
password: ${{ env.REGISTRY_PASSWORD }}
- name: Docker meta
id: meta
uses: docker/metadata-action@v6
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
- name: Create manifest list and push
working-directory: /tmp/digests
run: |
docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
$(printf '${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}@sha256:%s ' *)
- name: Inspect image
run: |
docker buildx imagetools inspect ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.meta.outputs.version }}
================================================
FILE: .github/workflows/test-report.yml
================================================
name: 'Test Report'
on:
workflow_run:
workflows: ['CI']
types:
- completed
permissions:
statuses: write
checks: write
contents: write
pull-requests: write
actions: write
jobs:
report:
runs-on: ubuntu-latest
steps:
- uses: dorny/test-reporter@v3
with:
artifact: /test-results-(.*)/
name: 'Test report $1'
path: '*.xml'
reporter: java-junit
================================================
FILE: .github/workflows/website.yaml
================================================
name: Website deploy
on:
push:
branches:
- stable
jobs:
update-website:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
submodules: true
- uses: actions/setup-node@v6
with:
node-version: 24
- run: .github/scripts/update-website.sh
env:
GIT_USER: Virtuslab
DEPLOYMENT_BRANCH: gh-pages
GIT_PASS: ${{ secrets.GITHUB_TOKEN }}
# after the release the PR should be empty
- name: Open PR with changes back to main
uses: repo-sync/pull-request@v2
with:
destination_branch: "main"
github_token: ${{ secrets.GITHUB_TOKEN }}
pr_title: "Back port of documentation changes to main"
name: Update stable branch
branch: backport/stable
================================================
FILE: .gitignore
================================================
out/
.bloop/
.metals/
.vscode/
.idea/
.cursor/
.bsp
.scala-build
dest/
target/
*/scoverage.coverage
# ignore vim backup files
*.sw[op]
.DS_Store
================================================
FILE: .mill-jvm-opts
================================================
-Xmx2048m
-Xms128m
-Xss8m
-Dxsbt.skip.cp.lookup=true
================================================
FILE: .mill-version
================================================
1.1.5
================================================
FILE: .scala-steward.conf
================================================
postUpdateHooks = [{
command = ["./mill", "-i", "generate-reference-doc[].run"],
commitMessage = "Generate the reference doc"
}]
================================================
FILE: .scalafix.conf
================================================
rules = [
DisableSyntax,
RemoveUnused,
OrganizeImports,
NoValInForComprehension,
ProcedureSyntax
]
DisableSyntax.noFinalize = true
DisableSyntax.noIsInstanceOf = true
DisableSyntax.noReturns = true
// `rules` on compilation
triggered.rules = [
DisableSyntax
]
OrganizeImports {
coalesceToWildcardImportThreshold = 6
expandRelative = true
groups = ["*", "re:javax?\\.", "scala."]
groupedImports = AggressiveMerge
}
================================================
FILE: .scalafix3.conf
================================================
rules = [
DisableSyntax,
RemoveUnused,
OrganizeImports,
NoValInForComprehension,
# ProcedureSyntax
]
DisableSyntax.noFinalize = true
DisableSyntax.noIsInstanceOf = true
DisableSyntax.noReturns = true
// `rules` on compilation
triggered.rules = [
DisableSyntax
]
OrganizeImports {
coalesceToWildcardImportThreshold = 6
expandRelative = true
groups = ["*", "re:javax?\\.", "scala."]
groupedImports = AggressiveMerge
targetDialect = Scala3
}
================================================
FILE: .scalafmt.conf
================================================
version = "3.10.7"
align.preset = more
maxColumn = 100
assumeStandardLibraryStripMargin = true
indent.defnSite = 2
indentOperator.topLevelOnly = false
align.preset = more
align.openParenCallSite = false
newlines.source = keep
newlines.beforeMultiline = keep
newlines.afterCurlyLambdaParams = keep
newlines.alwaysBeforeElseAfterCurlyIf = true
runner.dialect = scala3
rewrite.rules = [
RedundantBraces
RedundantParens
SortModifiers
]
rewrite.redundantBraces {
ifElseExpressions = true
includeUnitMethods = false
stringInterpolation = true
}
rewrite.sortModifiers.order = [
"private", "final", "override", "protected",
"implicit", "sealed", "abstract", "lazy"
]
project.excludeFilters = [
".bloop"
".metals"
".scala-build"
"examples" # Scala 3 scripts and using directives not supported yet
"out"
"scala-version.scala"
]
================================================
FILE: AGENTS.md
================================================
# AGENTS.md — Guidance for AI agents contributing to Scala CLI
Short reference for AI agents. For task-specific guidance (directives, integration tests), load skills from *
*[agentskills/](agentskills/)** when relevant.
> **LLM Policy**: All AI-assisted contributions must comply with the
> [LLM usage policy](https://github.com/scala/scala3/blob/HEAD/LLM_POLICY.md). The contributor (human) is responsible
> for every line. State LLM usage in the PR description. See [LLM_POLICY.md](LLM_POLICY.md).
## Human-facing docs
- **[DEV.md](DEV.md)** — Setup, run from source, tests, launchers, GraalVM.
- **[CONTRIBUTING.md](CONTRIBUTING.md)** — PR workflow, formatting, reference doc generation.
- **[INTERNALS.md](INTERNALS.md)** — Modules, `Inputs → Sources → Build`, preprocessing.
## Build system
The project uses [Mill](https://mill-build.org/). Mill launchers ship with the repo (`./mill`). JVM 17 required.
Cross-compilation: default `Scala.defaultInternal`; `[]` = default version, `[_]` = all.
### Key build files
| File | Purpose |
|---------------------------------|------------------------------------------------------------------------------------------|
| `build.mill` | Root build definition: all module declarations, CI helper tasks, integration test wiring |
| `project/deps/package.mill` | Dependency versions and definitions (`Deps`, `Scala`, `Java` objects) |
| `project/settings/package.mill` | Shared traits, utils (`HasTests`, `CliLaunchers`, `FormatNativeImageConf`, etc.) |
| `project/publish/package.mill` | Publishing settings |
| `project/website/package.mill` | Website-related build tasks |
### Essential commands
```bash
./mill -i clean # Clean Mill context
./mill -i scala …args… # Run Scala CLI from source
./mill -i __.compile # Compile everything
./mill -i unitTests # All unit tests
./mill -i 'build-module[].test' # Unit tests for a specific module
./mill -i 'build-module[].test' 'scala.build.tests.BuildTestsScalac.*' # Filter by suite
./mill -i 'build-module[].test' 'scala.build.tests.BuildTests.simple' # Single test by name
./mill -i integration.test.jvm # Integration tests (JVM launcher)
./mill -i integration.test.jvm 'scala.cli.integration.RunTestsDefault.*' # Integration: filter by suite
./mill -i 'generate-reference-doc[]'.run # Regenerate reference docs
./mill -i __.fix # Fix import ordering (scalafix)
scala-cli fmt . # Format all code (scalafmt)
```
## Project modules
Modules live under `modules/`. The dependency graph flows roughly as:
```
specification-level → config → core → options → directives → build-module → cli
```
### Module overview
The list below may not be exhaustive — check `modules/` and `build.mill` for the current set.
| Module | Purpose |
|-----------------------------------------------|------------------------------------------------------------------------------------------------------------------|
| `specification-level` | Defines `SpecificationLevel` (MUST / SHOULD / IMPLEMENTATION / RESTRICTED / EXPERIMENTAL) for SIP-46 compliance. |
| `config` | Scala CLI configuration keys and persistence. |
| `build-macros` | Compile-time macros (e.g. `EitherCps`). |
| `core` | Core types: `Inputs`, `Sources`, build constants, Bloop integration, JVM/JS/Native tooling. |
| `options` | `BuildOptions`, `SharedOptions`, and all option types. |
| `directives` | Using directive handlers — the bridge between `//> using` directives and `BuildOptions`. |
| `build-module` (aliased from `build` in mill) | The main build pipeline: preprocessing, compilation, post-processing. Most business logic lives here. |
| `cli` | Command definitions, argument parsing (CaseApp), the `ScalaCli` entry point. Packaged as the native image. |
| `runner` | Lightweight app that runs a main class and pretty-prints exceptions. Fetched at runtime. |
| `test-runner` | Discovers and runs test frameworks/suites. Fetched at runtime. |
| `tasty-lib` | Edits file names in `.tasty` files for source mapping. |
| `scala-cli-bsp` | BSP protocol types. |
| `integration` | Integration tests (see dedicated section below). |
| `docs-tests` | Tests that validate documentation (`Sclicheck`). |
| `generate-reference-doc` | Generates reference documentation from CLI option/directive metadata. |
## Specification levels
Every command, CLI option, and using directive has a `SpecificationLevel`. This is central to how features are exposed.
| Level | In the Scala Runner spec? | Available without `--power`? | Stability |
|------------------|---------------------------|------------------------------|---------------------------------|
| `MUST` | Yes | Yes | Stable |
| `SHOULD` | Yes | Yes | Stable |
| `IMPLEMENTATION` | No | Yes | Stable |
| `RESTRICTED` | No | No (requires `--power`) | Stable |
| `EXPERIMENTAL` | No | No (requires `--power`) | Unstable — may change/disappear |
**New features contributed by agents should generally be marked `EXPERIMENTAL`** unless the maintainers explicitly
request otherwise. This applies to new sub-commands, options, and directives alike.
The specification level is set via:
- **Directives**: `@DirectiveLevel(SpecificationLevel.EXPERIMENTAL)` annotation on the directive case class.
- **CLI options**: `@Tag(tags.experimental)` annotation on option fields.
- **Commands**: Override `scalaSpecificationLevel` in the command class.
## Using directives
Using directives are in-source configuration comments:
```scala
//> using scala 3
//> using dep com.lihaoyi::os-lib:0.11.4
//> using test.dep org.scalameta::munit::1.1.1
```
Directives are parsed by `using_directives`, then `ExtractedDirectives` → `DirectivesPreprocessor` → `BuildOptions`/
`BuildRequirements`. **CLI options override directive values.** To add a new directive,
see [agentskills/adding-directives/](agentskills/adding-directives/SKILL.md).
## Testing
> **Every contribution that changes logic must include automated tests.** A PR without tests for
> new or changed behavior will not be accepted. If testing is truly infeasible, explain why in the
> PR description — but this should be exceptional.
> **Unit tests are always preferred over integration tests.** Unit tests are faster, more reliable,
> easier to debug, and cheaper to run on CI. Only add integration tests when the behavior cannot be
> adequately verified at the unit level (e.g. end-to-end CLI invocation, launcher-specific behavior,
> cross-process interactions).
> **Always re-run and verify tests locally before submitting.** After any logic change, run the
> relevant test suites on your machine and confirm they pass. Do not rely on CI to catch failures —
> CI resources are shared, and broken PRs waste maintainer time.
**Unit tests**: munit, in each module’s `test` submodule. Run commands above; add tests in `modules/build/.../tests/` or
`modules/cli/src/test/scala/`. Prefer unit over integration.
**Integration tests**: `modules/integration/`; they run the CLI as a subprocess.
See [agentskills/integration-tests/](agentskills/integration-tests/SKILL.md) for structure and how to add tests.
## Pre-PR checklist
1. Code compiles: `./mill -i __.compile`
2. Tests added and passing locally (unit tests first, integration if needed)
3. Code formatted: `scala-cli fmt .`
4. Imports ordered: `./mill -i __.fix`
5. Reference docs regenerated (if options/directives changed): `./mill -i 'generate-reference-doc[]'.run`
6. PR template filled, LLM usage stated
## Code style
Code style is enforced.
**Scala 3**: Prefer `if … then … else`, `for … do`/`yield`, `enum`, `extension`, `given`/`using`, braceless blocks,
top-level defs. Use union/intersection types when they simplify signatures. Always favor Scala 3 idiomatic syntax.
**Functional**: Prefer `val`, immutable collections, `case class`.copy(). Prefer expressions over statements; prefer
`map`/`flatMap`/`fold`/`for`-comprehensions over loops. Use `@tailrec` for tail recursion. Avoid `null`; use `Option`/
`Either`/`EitherCps` (build-macros). Keep functions small; extract helpers.
**No duplication**: Extract repeated logic into shared traits or utils (`*Options` traits, companion helpers,
`CommandHelpers`, `TestUtil`). Check for existing abstractions before copying.
**Logging**: Use the project `Logger` only — never `System.err` or `System.out`. Logger respects verbosity (`-v`, `-q`).
Use `logger.message(msg)` (default), `logger.log(msg)` (verbose), `logger.debug(msg)` (debug), `logger.error(msg)` (
always). In commands: `options.shared.logging.logger`; in build code it is passed in; in tests use `TestLogger`.
**Mutability**: OK in hot paths or when a Java API requires it; keep scope minimal.
## Further reference
[DEV.md](DEV.md), [CONTRIBUTING.md](CONTRIBUTING.md), [INTERNALS.md](INTERNALS.md).
================================================
FILE: CODE_OF_CONDUCT.md
================================================
Scala CLI uses the [Scala Code of Conduct](https://scala-lang.org/conduct/) for all communication and discussion. This includes both GitHub, Discord and other more direct lines of communication such as email.
================================================
FILE: CONTRIBUTING.md
================================================
# Thanks for contributing to Scala CLI!
This doc is meant as a guide on how best to contribute to Scala CLI.
## Creating issues
Whenever you happen upon something that needs improvement, be sure to come back to us and create an issue. Please make
use of the available templates and answer all the included questions, so that the maintenance team can understand your
problem easier.
## Pull requests
### Fork-Pull
We accept external pull requests according to
the [standard GitHub fork-pull flow](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request-from-a-fork).
Create a fork of this repository, commit your changes there and create a pull request. We try to review those as often
as possible.
### Main & stable branches
#### `main`
All code changes should branch from [main](https://github.com/VirtusLab/scala-cli/tree/main) (which is also the default
branch).
#### `stable` and documentation changes
However, documentation changes which don't depend on any not-yet-released code changes should branch
from [stable](https://github.com/VirtusLab/scala-cli/tree/stable). This allows the CI to immediately update the website.
A subsequent PR from `stable` back to `main` is created automatically.
### Rules for a well-formed PR
Whenever reasonable, we try to follow the following set of rules when merging code to the repository. Following those
will save you from getting a load of comments and speed up the code review.
- If you are using LLM-based tools to assist you in your contribution, state that clearly in the PR description
and refer to our [LLM usage policy](LLM_POLICY.md) for rules and guidelines regarding usage of LLM-based tools
in contributions.
- If the PR is meant to be merged as a single commit (`squash & merge`), please make sure that you modify only one
thing.
- This means such a PR shouldn't include code clean-up, a secondary feature or bug fix, just the single thing
mentioned in the title.
- If it's not obvious, please mention it in the PR description or a comment.
- Otherwise, make sure you keep all the commits nice and tidy:
- all side-refactors, nitpick changes, formatting fixes and other side-changes should be extracted to separate
commits with the `NIT` prefix in the commit message;
- similarly, code review comments regarding such changes should be marked with the same prefix;
- ensure everything compiles at every commit (`./mill -i __.compile`);
- ensure everything is well formatted at every commit (`scala-cli fmt .` or `scalafmt`);
- ensure imports are well-ordered at every commit (`./mill -i __.fix`);
- ensure reference docs are up-to date at every commit (`./mill -i 'generate-reference-doc[]'.run`);
- ensure all tests pass at every commit (refer to the [dev docs](DEV.md) on how to run tests);
- nobody expects you to run all the unit and integration tests for all platforms locally, that'd take too long;
- just make sure the test suites relevant to your changes pass on your local machine.
Other notes:
- fill the pull request template;
- make sure to add tests wherever possible;
- favor unit tests over integration tests where applicable;
- try to add scaladocs for key classes and functions;
- try to add comments where your code isn't self-explanatory;
- if you're changing the app behaviour or adding a new feature, make sure to add docs on the website (or note in the PR
that you'll do it separately).
================================================
FILE: DEV.md
================================================
## Developer docs
### Requirements
Building Scala CLI requires JVM 17 to work properly.
In theory, our build is able to download and install for its own needs JVM 17 on some OSes however it may not work in
Intellij / Metals out of the box.
The Scala CLI sources ship with Mill launchers, so that Mill itself doesn't need to be installed on your system.
### Common commands
#### Running the CLI from sources
Run the `scala` target with Mill:
```bash
./mill -i scala …arguments…
```
This is the equivalent of running the `cli` task with the default Scala version:
```bash
./mill -i 'cli[]'.run …arguments…
```
#### Debugging the CLI from sources
```bash
./mill -i debug debug-port …arguments…
```
which is short for:
```bash
./mill -i 'cli[]'.debug debug-port …arguments…
```
E.g:
```bash
./mill -i 'cli[]'.debug 5050 ~/Main.scala -S 3.3.0
```
#### Run unit tests
This command runs the unit tests from the `build-module` module.
```bash
./mill 'build-module.test'
```
If you want to run unit tests for another module, set `module_name` to the name of the module from which you want to run
the unit tests:
```bash
./mill 'module_name.test'
```
To can filter unit test suites:
```bash
./mill 'build-module[].test' 'scala.build.tests.BuildTestsScalac.*'
./mill 'build-module[].test' 'scala.build.tests.BuildTestsScalac.simple'
```
#### Run integration tests with the JVM launcher
```bash
./mill integration.test.jvm
```
Filter test suites with
```bash
./mill integration.test.jvm 'scala.cli.integration.RunTestsDefault.*'
./mill integration.test.jvm 'scala.cli.integration.RunTestsDefault.Multiple scripts'
```
You can pass the `--debug` option to debug Scala CLI when running integration tests. Note that this allows to debug the
Scala CLI launcher (the app) and not the integration test code itself. The debugger is being run in the `attach` mode.
```bash
./mill integration.test.jvm 'scala.cli.integration.RunTestsDefault.*' --debug
```
The debug option uses 5005 port by default. It is possible to change it as follows:
```bash
./mill integration.test.jvm 'scala.cli.integration.RunTestsDefault.*' --debug:5006
```
#### Run integration tests with the native launcher
(generating the launcher can take several minutes)
```bash
./mill integration.test.native
./mill integration.test.native 'scala.cli.integration.RunTestsDefault.*'
```
#### Generate JUnit test reports
As running tests with mill generates output in a non-standard JSON format, we have a script for converting it to the
more well known JUnit XML test report format which we can then process and view on the CI.
In case you want to generate a test report locally, you can run the following command:
```bash
.github/scripts/generate-junit-reports.sc <test suite title> <test report title> <output-path out/
```
The test should fail when no test reports were found or if no tests were actually run.
#### Generate native packages
Build native packagers:
* `deb` for linux
* `msi` for windows
* `dmg` and `pkg` for macOS
(generating native packager for specified format)
```bash
./mill -i scala package ..arguments... --deb --output 'path.deb'
./mill -i scala package ..arguments... --dmg --output 'path.dmg'
./mill -i scala package ..arguments... --pkg --output 'path.pkg'
```
#### IDE Import
The Scala CLI repository should work when imported automatically from Mill to IDEA IntelliJ and Metals.
Please raise an issue if you run into any problems.
When working with IntelliJ make sure that the project's Java is set correctly.
To confirm, check under `File -> Project Structure` that:
- in `Project Settings/Project` `SDK` and `Language level` is set to **17**
- in `Project Settings/Modules` all the modules have `Language level` set to **17**
- in `Platform Settings/SDKs` only **Java 17** is visible
Otherwise, some IDE features may not work correctly, i.e. the debugger might crash upon connection.
#### Generate a native launcher
```bash
./mill -i show 'cli[]'.nativeImage
```
This prints the path to the generated native image.
The file named `scala` at the root of the project should also
be a link to it. (Note that the link is committed and is always there,
whether the files it points at exists or not.)
#### Generate a JVM launcher
```bash
./mill -i show 'cli[]'.launcher
```
This prints the path to the generated launcher. This launcher is a JAR,
that directly re-uses the class directories of the modules of the project
(so that cleaning up those classes will break the launcher). If this is a
problem (if you wish to run the launcher on another machine or from a
Docker image for example), use a native launcher (see above) or a standalone
JVM one (see below).
#### Generate a standalone JVM launcher
```bash
./mill -i show 'cli[]'.standaloneLauncher
```
This prints the path to the generated launcher. This launcher is a JAR,
that embeds JARs of the scala-cli modules, and downloads their dependencies
from Maven Central upon first launch (using the coursier cache, just like
a coursier bootstrap).
### Helper projects
A number of features of Scala CLI are managed from external projects, living under
the [`scala-cli`](https://github.com/scala-cli) and [`VirtusLab`](https://github.com/VirtusLab) organizations on GitHub. These
projects can be used by Scala CLI as libraries pulled before it's compiled, but also
as binaries. In the latter case, Scala CLI downloads on-the-fly binaries from these
repositories' GitHub release assets, and runs them as external processes.
Here's some of the more important external projects used by Scala CLI:
- [scala-js-cli-native-image](https://github.com/VirtusLab/scala-js-cli): provides a binary running the
Scala.js linker
- [scala-cli-signing](https://github.com/VirtusLab/scala-cli-signing): provides both libraries and binaries to handle
PGP concerns in Scala CLI
- [scala-packager](https://github.com/VirtusLab/scala-packager): provides a library to package applications
in native formats
- [libsodiumjni](https://github.com/VirtusLab/libsodiumjni): provides minimal JNI bindings for
[libsodium](https://github.com/jedisct1/libsodium), that is used by Scala CLI to encrypt secrets
uploaded as GitHub repository secrets in the `publish setup` sub-command
- [scala-cli-setup](https://github.com/VirtusLab/scala-cli-setup): a GitHub Action to install Scala CLI.
- [bloop-core](https://github.com/scala-cli/bloop-core): a fork of [bloop](https://github.com/scalacenter/bloop)
stripped up of its benchmark infrastructure and build integrations.
- [no-crc32-zip-input-stream](https://github.com/VirtusLab/no-crc32-zip-input-stream): A copy of `ZipInputStream`
from OpenJDK, with CRC32 calculations disabled.
- [lightweight-spark-distrib](https://github.com/VirtusLab/lightweight-spark-distrib): a small application allowing
to make Spark distributions more lightweight.
- [java-class-name](https://github.com/VirtusLab/java-class-name): a small library to extract class names
from Java sources.
Legacy projects:
- [scalafmt-native-image](https://github.com/VirtusLab/scalafmt-native-image): GraalVM native-image launchers
for `scalafmt` (used for `scalafmt` versions < 3.9.1, no longer maintained)
The use of external binaries allows to make the Scala CLI binary slimmer and faster
to generate, but also allow to lower memory requirements to generate it (allowing to
generate these binaries on the GitHub-provided GitHub actions hosts).
### Website
The Scala CLI website is built with [Docusaurus](https://v1.docusaurus.io/en/) and
uses [Infima](https://infima.dev/docs/layout/spacing) for styling.
Ensure you are using Node >= 16.14.2.
#### Generate the website once
```bash
cd website
yarn
yarn build
npm run serve
```
#### Generate the website continuously
```bash
cd website
yarn
yarn run start
```
### Verifying the documentation
We have a built-in tool to validate `.md` files called [Sclicheck](/sclicheck/Readme.md).
All `Sclicheck` tests can be run with `Mill` + `munit`: (and this is what we run on the CI, too)
```bash
./mill -i 'docs-tests[]'.test
```
The former also includes testing gifs and `Sclicheck` itself.
To just check the documents, run:
```bash
./mill -i 'docs-tests[]'.test 'sclicheck.DocTests.*'
```
You can also check all root docs, commands, reference docs, guides or cookbooks:
```bash
./mill -i 'docs-tests[]'.test 'sclicheck.DocTests.root*'
./mill -i 'docs-tests[]'.test 'sclicheck.DocTests.guide*'
./mill -i 'docs-tests[]'.test 'sclicheck.DocTests.command*'
./mill -i 'docs-tests[]'.test 'sclicheck.DocTests.cookbook*'
./mill -i 'docs-tests[]'.test 'sclicheck.DocTests.reference*'
```
Similarly, you can check single files:
```bash
./mill -i 'docs-tests[]'.test 'sclicheck.DocTests.<category> <doc-name>'
```
For example, to run the check on `compile.md`
```bash
./mill -i 'docs-tests[]'.test 'sclicheck.DocTests.command compile'
```
## Scala CLI logos
Package with various logos for scala-cli can be found
on [google drive](https://drive.google.com/drive/u/1/folders/1M6JeQXmO4DTBeRBKAFJ5HH2p_hbfQnqS)
## Launcher script
There is a script `scala-cli-src` in the repository root that is intended to work exactly like released scala-cli, but
using a binary compiled the worktree.
Just add it to your PATH to get the already-released-scala-cli experience.
## CI change detection
On pull requests, the CI workflow detects which files changed and skips jobs that are not relevant.
Pushes to `main`, `v*` tags, and manual dispatches always run everything.
### Override keywords
You can force specific job groups to run regardless of which files changed by including
these keywords anywhere in the PR body (description):
| Keyword | Effect |
|---------|--------|
| `[test_all]` | Run **all** CI jobs, no skipping |
| `[test_native]` | Force native launcher builds and native integration tests |
| `[test_integration]` | Force JVM integration tests |
| `[test_docs]` | Force documentation tests |
| `[test_format]` | Force format and scalafix checks |
For example, if your PR only touches documentation, but you want to verify native
launchers still build, add `[test_native]` to the PR description.
## Releases
Instructions on how to
release - [Release Procedure](https://github.com/VirtusLab/scala-cli/blob/main/.github/release/release-procedure.md)
## Debugging BSP server
The easiest way to debug BSP sever is using `scala-cli-src` script with `--bsp-debug-port 5050` flag (the port should be
unique to the workspace where BSP will be debugged). In such case BSP will be launched using local source and will run
on JVM. It will also expects a debugger running in the listen mode using provided port (so the initialization of the
connection can be debugged). In such case we recommend to have option to auto rerun debugging session off (so there is
always a debugger instance ready to be used).
## GraalVM reflection configuration
As Scala CLI is using GraalVM native image, it requires a configuration file for reflection.
The configuration for the `cli` module is located
in [the reflect-config.json](modules/cli/src/main/resources/META-INF/native-image/org.virtuslab/scala-cli-core/reflect-config.json)
file.
When adding new functionalities or updating dependencies, it might turn out the reflection configuration for some class
may be missing. The relevant error message when running `integration.test.native` may be misleading,
usually with a `ClassNotFoundException` or even with a functionality seemingly being skipped.
This is because logic referring to classes with missing reflection configuration may be skipped for the used native
image.
To generate the relevant configuration automatically, you can run:
```bash
./mill -i 'cli[]'.runWithAssistedConfig <scala-cli-sub-command> <args> <options>
```
Just make sure to run it exactly the same as the native image would have been run, as the configuration is generated for
a particular invocation path. The run has to succeed as well, as the configuration will only be fully generated after an
exit code 0.
```text
Config generated in out/cli/<scalaVersion>/runWithAssistedConfig.dest/config
```
As a result, you should get the path to the generated configuration file. It might contain some unnecessary entries, so
make sure to only copy what you truly need.
As the formatting of the `reflect-config.json` is verified on the CI, make sure to run the following command to adjust
it accordingly before committing:
```bash
./mill -i __.formatNativeImageConf
```
For more info about reflection configuration in GraalVM,
check [the relevant GraalVM Reflection docs](https://www.graalvm.org/latest/reference-manual/native-image/dynamic-features/Reflection/).
## Overriding Scala versions in Scala CLI builds
It's possible to override the internal Scala version used to build Scala CLI,
as well as the default version used by the CLI itself with Java props.
- `scala.version.internal` - overrides the internal Scala version used to build Scala CLI
- `scala.version.user` - overrides the default Scala version used by the CLI itself
NOTE: remember to run `./mill clean` to make sure the Scala versions aren't being cached anywhere.
```bash
./mill -i clean
./mill -i --define scala.version.internal=3.4.0-RC1-bin-20231012-242ba21-NIGHTLY --define scala.version.user=3.4.0-RC1-bin-20231012-242ba21-NIGHTLY scala version --offline
# Scala CLI version: 1.x.x-SNAPSHOT
# Scala version (default): 3.4.0-RC1-bin-20231012-242ba21-NIGHTLY
```
================================================
FILE: Dockerfile
================================================
FROM eclipse-temurin:17 as build
RUN apt update && apt install build-essential libz-dev clang procps git -y
WORKDIR /workdir
COPY . .
RUN ./mill -i copyTo --task 'cli[].base-image.nativeImage' --dest "./docker-out/scala-cli" 1>&2
FROM debian:stable-slim
RUN apt update && apt install build-essential libz-dev clang procps -y
COPY --from=build /workdir/docker-out/scala-cli /usr/bin/scala-cli
RUN \
echo "println(1)" | scala-cli -S 3 - -v -v -v && \
echo "println(1)" | scala-cli -S 2.13 - -v -v -v && \
echo "println(1)" | scala-cli -S 2.12 - -v -v -v
RUN \
echo "println(1)" | scala-cli --power package --native _.sc --force && \
echo "println(1)" | scala-cli --power package --native-image _.sc --force
ENTRYPOINT ["scala-cli"]
================================================
FILE: INTERNALS.md
================================================
# Internals overview
## Modules
Modules live under `modules/`. Each sub-directory there has a
corresponding mill module definition in `build.sc` (but for `integration`).
Most of the code currently lives in the `build` module.
The `cli` module depends on `build`, gets
packaged as a native-image executable, and distributed as `scala-cli` binary.
The other modules are either:
- integration tests
- utility modules, that `build` either:
- depends on
- fetches at run-time.
## Utility modules
These are:
- `runner`: simple app that starts a main class, catches any exception it throws and pretty-prints it.
- `test-runner`: finds test frameworks, test suites, and runs them
- `tasty-lib`: edits file names in `.tasty` files
## Tests
The tests live either in:
- `build`: unit tests
- `integration`: integration tests
Run unit tests with
```bash
./mill 'build[_].test'
```
Run integration tests with a JVM-based `scala-cli` with
```bash
./mill integration.test.jvm
```
Run integration tests with a native-image-based `scala-cli` with
```bash
./mill integration.test.native
```
## General workflow in most `scala-cli` commands
We roughly go from user inputs to byte code through 3 classes:
- `Inputs`: ADT for input files / directories.
- `Sources`: processed sources, ready to be passed to scalac
- `Build`: compilation result: success or failure.
Most commands
- take the arguments passed on the command-line: we have an `Array[String]`
- check whether each of them is a `.scala` file, an `.sc` file, a directory, …: we get an `Inputs` instance
- reads the directories, the `.scala` / `.sc` files: we get a `Sources` instance
- compile those sources: we get a `Build` instance
- do something with the build output (run it, run tests, package it, …)
In watch mode, we loop over the last 3 steps (`Inputs` is computed only once, the rest is re-computed upon file change).
## Source pre-processing
Some input files cannot be passed as is to scalac, if they are scripts (`.sc` files), which contain top-level statements
Scripts get wrapped. If the script `a/b/foo.sc` contains
```scala
val n = 2
```
we compile it as
```scala
package a.b
object foo {
val n = 2
def main(args: Array[String]): Unit = ()
}
```
Basically,
- its directory dictates its package
- we put its sources as is in an object
- we add a `main` method
## Build outputs post-processing
The source generation changes:
- file names, which now correspond to the directory where we write generated sources
- positions, when we wrap code (for `.sc` files)
As a consequence, some build outputs contains wrong paths or positions:
- diagnostics (warning and error messages) contain file paths and positions, used in reporting
- byte code contains file names and line numbers, that are used in stack traces
- semantic DBs contain relative file paths and positions, used by IDEs
- TASTy files contain relative file paths, used in pretty stack traces
We post-process those build outputs, to adjust positions and file paths of the generated sources:
various "mappings" are computed out of the generated sources list, and are used to adjust:
- diagnostics: done in memory, right before printing diagnostics
- byte code: done using the ASM library
- semantic DBs: we parse the semantic DBs, edit them in memory, and write them back on disk
- TASTy files: we partly parse them in memory, edit names that contain source file paths, and write them back on disk
## Publishing scalajs-cli
### Maven Publishing
- Version Synchronization: `scalajs-cli` will be published with the same version as Scala.js version, for
example `1.13.0`.
- Updates & Fixes: For any subsequent fixes or patches in `scalajs-cli`, we will append a numeric value to the end,
like `1.13.0.1`.
- GitHub Uploads
- Native Launchers: With the patch release of `scalajs-cli`, native launchers are automatically uploaded to both
versions, for
example `1.13.0.1` and `1.13.0` tags on GitHub.
- For instance: For release `1.13.0.2`, the launchers are uploaded to tags `1.13.0.2` and `1.13.0`.
- ScalaCli dependency to `scalajs-cli`:
- For Coursier to retrieve the most recent scalajs-cli for a specific Scala.js version, the version is set
as `org.virtuslab:scalajscli_2.13:{Scala.js version}+`. For example `org.virtuslab:scalajscli_2.13:1.13.0+`.
- Native Version Download:
- The native version is downloaded from the Scala.js version tag. If there are updates or fixes to the
native `scalajs-cli` launchers, the updated launchers are uploaded to the `1.13.0` tag during the `1.13.0.1`
publishing.
================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: LLM_POLICY.md
================================================
# Policy regarding LLM-generated code in contributions to Scala CLI
Scala CLI accepts contributions containing code produced with AI assistance. This means that using LLM-based
tooling aiding software development (like Cursor, Claude Code, Copilot or whatever else) is allowed.
All such contributions are regulated by the policy defined in the Scala 3 compiler repository, which can be found at:
https://github.com/scala/scala3/blob/main/LLM_POLICY.md
================================================
FILE: README.md
================================================
# scala-cli
[](https://github.com/VirtusLab/scala-ci/actions?query=workflow%3ACI)
[](https://maven-badges.herokuapp.com/maven-central/org.virtuslab.scala-cli/cli_3)
[](https://discord.gg/KzQdYkZZza)
Scala CLI is a command-line tool to interact with the Scala language. It lets you compile, run, test, and package your
Scala code. (and more!) It shares some similarities with build tools, but it doesn't aim at supporting multi-module
projects, nor to be extended via a task system.
As of Scala 3.5.0, Scala CLI has become the official `scala` runner of the language (for more information
refer to [SIP-46](https://github.com/scala/improvement-proposals/pull/46)). For more details on using Scala CLI
via the `scala` command, refer to [this doc](https://scala-cli.virtuslab.org/docs/reference/scala-command/).
## Docs
- user-facing documentation: [scala-cli.virtuslab.org](https://scala-cli.virtuslab.org/)
- [contributing guide](CONTRIBUTING.md)
- [developer docs](DEV.md)
- [app internals](INTERNALS.md)
- [docs website readme](website/README.md)
- [docs gifs readme](gifs/README.md)
- [sclicheck readme](modules/docs-tests/README.md)
- [gcbenchmark readme](gcbenchmark/README.md)
- [release procedure](.github/release/release-procedure.md)
- [code of conduct](CODE_OF_CONDUCT.md)
================================================
FILE: agentskills/README.md
================================================
# Agent skills (Scala CLI)
This directory holds **agent skills** — task-specific guidance loaded on demand by AI coding agents. The layout is tool-agnostic; Cursor, Claude Code, Codex, and other tools that support a standard skill directory can use this (e.g. by configuring or symlinking to `.agents/skills/` if required).
Each subdirectory contains a `SKILL.md` with frontmatter and instructions. See [agentskills/agentskills](https://github.com/agentskills/agentskills) for the open standard.
================================================
FILE: agentskills/adding-directives/SKILL.md
================================================
---
name: scala-cli-adding-directives
description: Add or change using directives in Scala CLI. Use when adding a new //> using directive, registering a directive handler, or editing directive preprocessing.
---
# Adding a new directive (Scala CLI)
1. **Create a case class** in `modules/directives/src/main/scala/scala/build/preprocessing/directives/` extending one of:
- `HasBuildOptions` — produces `BuildOptions` directly
- `HasBuildOptionsWithRequirements` — produces `BuildOptions` with scoped requirements (e.g. `test.dep`)
- `HasBuildRequirements` — produces `BuildRequirements` (for `//> require`)
2. **Annotate**: `@DirectiveLevel(SpecificationLevel.EXPERIMENTAL)`, `@DirectiveDescription("…")`, `@DirectiveUsage("…")`, `@DirectiveExamples("…")`, `@DirectiveName("key")` on fields.
3. **Companion**: `val handler: DirectiveHandler[YourDirective] = DirectiveHandler.derive`
4. **Register** in `modules/build/.../DirectivesPreprocessingUtils.scala` in the right list: `usingDirectiveHandlers`, `usingDirectiveWithReqsHandlers`, or `requireDirectiveHandlers`.
5. **Regenerate reference docs**: `./mill -i 'generate-reference-doc[]'.run`
CLI options always override directive values when both set the same thing.
================================================
FILE: agentskills/integration-tests/SKILL.md
================================================
---
name: scala-cli-integration-tests
description: Add or run Scala CLI integration tests. Use when adding integration tests, debugging RunTests/CompileTests/etc., or working in modules/integration.
---
# Integration tests (Scala CLI)
**Location**: `modules/integration/`. Tests invoke the CLI as an external process.
**Run**: `./mill -i integration.test.jvm` (all). Filter: `./mill -i integration.test.jvm 'scala.cli.integration.RunTestsDefault.*'` or by test name. Native: `./mill -i integration.test.native`.
**Structure**: `*TestDefinitions.scala` (abstract, holds test logic) → `*TestsDefault`, `*Tests213`, etc. (concrete, Scala version trait). Traits: `TestDefault`, `Test212`, `Test213`, `Test3Lts`, `Test3NextRc`.
**Adding a test**:
1. Open the right `*TestDefinitions` (e.g. `RunTestDefinitions` for `run`).
2. Add `test("description") { … }` using `TestInputs(os.rel / "Main.scala" -> "…").fromRoot { root => … }` and `os.proc(TestUtil.cli, "run", …).call(cwd = root)`.
3. Assert on stdout/stderr.
**Helpers**: `TestInputs(...).fromRoot`, `TestUtil.cli`. Test groups (CI): `SCALA_CLI_IT_GROUP=1..5`; see `modules/integration/` for group mapping.
================================================
FILE: build.mill
================================================
//| mill-jvm-version: system|17
//| mvnDeps:
//| - io.github.alexarchambault.mill::mill-native-image::0.2.4
//| - io.github.alexarchambault.mill::mill-native-image-upload:0.2.4
//| - com.goyeau::mill-scalafix::0.6.0
//| - com.lumidion::sonatype-central-client-requests:0.6.0
//| - io.get-coursier:coursier-launcher_2.13:2.1.25-M24
//| - org.eclipse.jgit:org.eclipse.jgit:7.5.0.202512021534-r
package build
import build.ci.publishVersion
import build.project.deps
import deps.{Cli, Deps, Docker, Java, Scala, TestDeps}
import build.project.publish
import publish.{ScalaCliPublishModule, finalPublishVersi
gitextract_updn7qcx/
├── .dockerignore
├── .git-blame-ignore-revs
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ ├── feature_request.md
│ │ ├── new_release.md
│ │ └── other.md
│ ├── actions/
│ │ └── windows-reg-import/
│ │ └── action.yml
│ ├── ci/
│ │ └── windows/
│ │ └── custom.reg
│ ├── dependabot.yml
│ ├── pull_request_template.md
│ ├── release/
│ │ ├── release-notes-regexes.md
│ │ ├── release-procedure.md
│ │ └── windows-antimalware-analysis.md
│ ├── scripts/
│ │ ├── build-website.sh
│ │ ├── check-cross-version-deps.sc
│ │ ├── check-override-keywords.sh
│ │ ├── choco/
│ │ │ ├── scala-cli.nuspec
│ │ │ └── tools/
│ │ │ └── chocolateyinstall.ps1
│ │ ├── classify-changes.sh
│ │ ├── docker/
│ │ │ ├── ScalaCliDockerFile
│ │ │ └── ScalaCliSlimDockerFile
│ │ ├── generate-docker-image.sh
│ │ ├── generate-junit-reports.sc
│ │ ├── generate-native-image.sh
│ │ ├── generate-os-packages.sh
│ │ ├── generate-slim-docker-image.sh
│ │ ├── get-latest-cs.sh
│ │ ├── gpg-setup.sh
│ │ ├── process_release_notes.sc
│ │ ├── publish-docker-images.sh
│ │ ├── publish-sdkman.sh
│ │ ├── publish-slim-docker-images.sh
│ │ ├── scala-cli.rb.template
│ │ ├── scala.rb.template
│ │ ├── update-website.sh
│ │ └── verify_old_cpus.sh
│ └── workflows/
│ ├── ci.yml
│ ├── publish-docker.yml
│ ├── test-report.yml
│ └── website.yaml
├── .gitignore
├── .mill-jvm-opts
├── .mill-version
├── .scala-steward.conf
├── .scalafix.conf
├── .scalafix3.conf
├── .scalafmt.conf
├── AGENTS.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── DEV.md
├── Dockerfile
├── INTERNALS.md
├── LICENSE
├── LLM_POLICY.md
├── README.md
├── agentskills/
│ ├── README.md
│ ├── adding-directives/
│ │ └── SKILL.md
│ └── integration-tests/
│ └── SKILL.md
├── build.mill
├── gcbenchmark/
│ ├── .gitignore
│ ├── README.md
│ └── gcbenchmark.scala
├── gifs/
│ ├── Dockerfile
│ ├── README.md
│ ├── create_missing.sc
│ ├── demo-magic.sh
│ ├── demo-no-magic.sh
│ ├── example.sh
│ ├── run_scenario.sh
│ ├── scenarios/
│ │ ├── complete-install.sh
│ │ ├── defaults.sh
│ │ ├── demo.sh
│ │ ├── education.sh
│ │ ├── embeddable_scripts.sh
│ │ ├── fast-scripts.sh
│ │ ├── learning_curve.sh
│ │ ├── powerful_scripts.sh
│ │ ├── projects.sh
│ │ ├── prototyping.sh
│ │ ├── scripting.sh
│ │ ├── self-contained-examples.sh
│ │ ├── todo.sh
│ │ ├── universal_tool.sh
│ │ └── versions.sh
│ └── svg_render/
│ ├── Dockerfile
│ └── README.md
├── mill
├── mill.bat
├── millw
├── modules/
│ ├── build/
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── scala/
│ │ │ │ └── build/
│ │ │ │ └── internal/
│ │ │ │ ├── Chdir.java
│ │ │ │ ├── ChdirGraalvm.java
│ │ │ │ ├── GraalvmUnistdExtras.java
│ │ │ │ └── JavaParserProxyMakerSubst.java
│ │ │ └── scala/
│ │ │ └── scala/
│ │ │ └── build/
│ │ │ ├── Bloop.scala
│ │ │ ├── BloopBuildClient.scala
│ │ │ ├── Build.scala
│ │ │ ├── BuildThreads.scala
│ │ │ ├── Builds.scala
│ │ │ ├── CollectionOps.scala
│ │ │ ├── ConsoleBloopBuildClient.scala
│ │ │ ├── CrossBuildParams.scala
│ │ │ ├── CrossKey.scala
│ │ │ ├── CrossSources.scala
│ │ │ ├── Directories.scala
│ │ │ ├── GeneratedSource.scala
│ │ │ ├── LocalRepo.scala
│ │ │ ├── PersistentDiagnosticLogger.scala
│ │ │ ├── Project.scala
│ │ │ ├── ReplArtifacts.scala
│ │ │ ├── ScalaCompilerParams.scala
│ │ │ ├── ScalafixArtifacts.scala
│ │ │ ├── ScopedSources.scala
│ │ │ ├── Sources.scala
│ │ │ ├── bsp/
│ │ │ │ ├── BloopSession.scala
│ │ │ │ ├── Bsp.scala
│ │ │ │ ├── BspClient.scala
│ │ │ │ ├── BspImpl.scala
│ │ │ │ ├── BspReloadableOptions.scala
│ │ │ │ ├── BspServer.scala
│ │ │ │ ├── BspThreads.scala
│ │ │ │ ├── BuildClientForwardStubs.scala
│ │ │ │ ├── BuildServerForwardStubs.scala
│ │ │ │ ├── BuildServerProxy.scala
│ │ │ │ ├── HasGeneratedSources.scala
│ │ │ │ ├── HasGeneratedSourcesImpl.scala
│ │ │ │ ├── IdeInputs.scala
│ │ │ │ ├── JavaBuildServerForwardStubs.scala
│ │ │ │ ├── JsonRpcErrorCodes.scala
│ │ │ │ ├── JvmBuildServerForwardStubs.scala
│ │ │ │ ├── LoggingBuildClient.scala
│ │ │ │ ├── LoggingBuildServer.scala
│ │ │ │ ├── LoggingBuildServerAll.scala
│ │ │ │ ├── LoggingJavaBuildServer.scala
│ │ │ │ ├── LoggingJvmBuildServer.scala
│ │ │ │ ├── LoggingScalaBuildServer.scala
│ │ │ │ ├── ScalaBuildServerForwardStubs.scala
│ │ │ │ ├── package.scala
│ │ │ │ └── protocol/
│ │ │ │ └── TextEdit.scala
│ │ │ ├── compiler/
│ │ │ │ ├── BloopCompiler.scala
│ │ │ │ ├── BloopCompilerMaker.scala
│ │ │ │ ├── ScalaCompiler.scala
│ │ │ │ ├── ScalaCompilerMaker.scala
│ │ │ │ ├── SimpleJavaCompiler.scala
│ │ │ │ ├── SimpleScalaCompiler.scala
│ │ │ │ └── SimpleScalaCompilerMaker.scala
│ │ │ ├── input/
│ │ │ │ ├── Element.scala
│ │ │ │ ├── ElementsUtils.scala
│ │ │ │ ├── Inputs.scala
│ │ │ │ ├── ScalaCliInvokeData.scala
│ │ │ │ └── WorkspaceOrigin.scala
│ │ │ ├── internal/
│ │ │ │ ├── AmmUtil.scala
│ │ │ │ ├── AppCodeWrapper.scala
│ │ │ │ ├── ClassCodeWrapper.scala
│ │ │ │ ├── JavaParserProxy.scala
│ │ │ │ ├── JavaParserProxyBinary.scala
│ │ │ │ ├── JavaParserProxyJvm.scala
│ │ │ │ ├── JavaParserProxyMaker.scala
│ │ │ │ ├── MainClass.scala
│ │ │ │ ├── ManifestJar.scala
│ │ │ │ ├── ObjectCodeWrapper.scala
│ │ │ │ ├── Runner.scala
│ │ │ │ ├── WrapperUtils.scala
│ │ │ │ ├── markdown/
│ │ │ │ │ ├── MarkdownCodeBlock.scala
│ │ │ │ │ ├── MarkdownCodeWrapper.scala
│ │ │ │ │ └── MarkdownOpenFence.scala
│ │ │ │ ├── resource/
│ │ │ │ │ ├── NativeResourceMapper.scala
│ │ │ │ │ └── ResourceMapper.scala
│ │ │ │ ├── util/
│ │ │ │ │ ├── RegexUtils.scala
│ │ │ │ │ └── WarningMessages.scala
│ │ │ │ └── zip/
│ │ │ │ └── WrappedZipInputStream.scala
│ │ │ ├── package.scala
│ │ │ ├── postprocessing/
│ │ │ │ ├── AsmPositionUpdater.scala
│ │ │ │ ├── ByteCodePostProcessor.scala
│ │ │ │ ├── LineConversion.scala
│ │ │ │ ├── PostProcessor.scala
│ │ │ │ ├── SemanticDbPostProcessor.scala
│ │ │ │ ├── SemanticdbProcessor.scala
│ │ │ │ └── TastyPostProcessor.scala
│ │ │ └── preprocessing/
│ │ │ ├── CustomDirectivesReporter.scala
│ │ │ ├── DataPreprocessor.scala
│ │ │ ├── DeprecatedDirectives.scala
│ │ │ ├── DirectivesPreprocessor.scala
│ │ │ ├── ExtractedDirectives.scala
│ │ │ ├── JarPreprocessor.scala
│ │ │ ├── JavaPreprocessor.scala
│ │ │ ├── MarkdownCodeBlockProcessor.scala
│ │ │ ├── MarkdownPreprocessor.scala
│ │ │ ├── PreprocessedMarkdown.scala
│ │ │ ├── PreprocessedSource.scala
│ │ │ ├── PreprocessingUtil.scala
│ │ │ ├── Preprocessor.scala
│ │ │ ├── ScalaPreprocessor.scala
│ │ │ ├── ScriptPreprocessor.scala
│ │ │ ├── SheBang.scala
│ │ │ ├── UsingDirectivesOps.scala
│ │ │ └── directives/
│ │ │ ├── DirectivesPreprocessingUtils.scala
│ │ │ ├── PartiallyProcessedDirectives.scala
│ │ │ └── PreprocessedDirectives.scala
│ │ └── test/
│ │ └── scala/
│ │ └── scala/
│ │ └── build/
│ │ ├── options/
│ │ │ └── publish/
│ │ │ ├── ComputeVersionTests.scala
│ │ │ └── VcsParseTest.scala
│ │ └── tests/
│ │ ├── ActionableDiagnosticTests.scala
│ │ ├── BspServerTests.scala
│ │ ├── BuildOptionsTests.scala
│ │ ├── BuildProjectTests.scala
│ │ ├── BuildTests.scala
│ │ ├── BuildTestsBloop.scala
│ │ ├── BuildTestsScalac.scala
│ │ ├── DirectiveTests.scala
│ │ ├── DistinctByTests.scala
│ │ ├── ExcludeTests.scala
│ │ ├── FrameworkDiscoveryTests.scala
│ │ ├── InputsTests.scala
│ │ ├── JavaTestRunnerTests.scala
│ │ ├── OfflineTests.scala
│ │ ├── PackagingUsingDirectiveTests.scala
│ │ ├── PreprocessingTests.scala
│ │ ├── ReplArtifactsTests.scala
│ │ ├── ScalaNativeUsingDirectiveTests.scala
│ │ ├── ScalaPreprocessorTests.scala
│ │ ├── ScriptWrapperTests.scala
│ │ ├── SourceGeneratorTests.scala
│ │ ├── SourcesTests.scala
│ │ ├── TestInputs.scala
│ │ ├── TestLogger.scala
│ │ ├── TestUtil.scala
│ │ ├── markdown/
│ │ │ ├── MarkdownCodeBlockTests.scala
│ │ │ ├── MarkdownCodeWrapperTests.scala
│ │ │ └── MarkdownTestUtil.scala
│ │ └── util/
│ │ └── BloopServer.scala
│ ├── build-macros/
│ │ └── src/
│ │ ├── main/
│ │ │ └── scala/
│ │ │ └── scala/
│ │ │ └── build/
│ │ │ ├── EitherCps.scala
│ │ │ ├── EitherSequence.scala
│ │ │ └── Ops.scala
│ │ ├── negative-tests/
│ │ │ └── MismatchedLeft.scala
│ │ └── test/
│ │ └── scala/
│ │ └── scala/
│ │ └── build/
│ │ └── CPSTest.scala
│ ├── cli/
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── scala/
│ │ │ │ └── cli/
│ │ │ │ ├── commands/
│ │ │ │ │ ├── pgp/
│ │ │ │ │ │ └── PgpCommandsSubst.java
│ │ │ │ │ └── publish/
│ │ │ │ │ └── PgpProxyMakerSubst.java
│ │ │ │ └── internal/
│ │ │ │ ├── Argv0Subst.java
│ │ │ │ ├── Argv0SubstWindows.java
│ │ │ │ ├── BouncycastleSignerMakerSubst.java
│ │ │ │ ├── CsJniUtilsFeature.java
│ │ │ │ ├── LibsodiumjniFeature.java
│ │ │ │ ├── PPrintStringPrefixSubst.java
│ │ │ │ └── PidSubst.java
│ │ │ ├── resources/
│ │ │ │ └── META-INF/
│ │ │ │ └── native-image/
│ │ │ │ ├── extras/
│ │ │ │ │ ├── coursier/
│ │ │ │ │ │ └── reflect-config.json
│ │ │ │ │ └── pprint/
│ │ │ │ │ └── reflect-config.json
│ │ │ │ └── org.virtuslab/
│ │ │ │ └── scala-cli-core/
│ │ │ │ ├── jni-config.json
│ │ │ │ ├── native-image.properties
│ │ │ │ ├── proxy-config.json
│ │ │ │ ├── reflect-config.json
│ │ │ │ └── resource-config.json
│ │ │ └── scala/
│ │ │ ├── coursier/
│ │ │ │ └── CoursierUtil.scala
│ │ │ └── scala/
│ │ │ └── cli/
│ │ │ ├── CurrentParams.scala
│ │ │ ├── ScalaCli.scala
│ │ │ ├── ScalaCliCommands.scala
│ │ │ ├── commands/
│ │ │ │ ├── CommandUtils.scala
│ │ │ │ ├── CustomWindowsEnvVarUpdater.scala
│ │ │ │ ├── HelpCmd.scala
│ │ │ │ ├── NeedsArgvCommand.scala
│ │ │ │ ├── OptionsHelper.scala
│ │ │ │ ├── RestrictableCommand.scala
│ │ │ │ ├── RestrictedCommandsParser.scala
│ │ │ │ ├── ScalaCommand.scala
│ │ │ │ ├── ScalaCommandWithCustomHelp.scala
│ │ │ │ ├── ScalaVersions.scala
│ │ │ │ ├── WatchUtil.scala
│ │ │ │ ├── addpath/
│ │ │ │ │ ├── AddPath.scala
│ │ │ │ │ └── AddPathOptions.scala
│ │ │ │ ├── bloop/
│ │ │ │ │ ├── Bloop.scala
│ │ │ │ │ ├── BloopExit.scala
│ │ │ │ │ ├── BloopExitOptions.scala
│ │ │ │ │ ├── BloopJson.scala
│ │ │ │ │ ├── BloopOptions.scala
│ │ │ │ │ ├── BloopOutput.scala
│ │ │ │ │ ├── BloopOutputOptions.scala
│ │ │ │ │ ├── BloopStart.scala
│ │ │ │ │ └── BloopStartOptions.scala
│ │ │ │ ├── bsp/
│ │ │ │ │ ├── Bsp.scala
│ │ │ │ │ └── BspOptions.scala
│ │ │ │ ├── clean/
│ │ │ │ │ ├── Clean.scala
│ │ │ │ │ └── CleanOptions.scala
│ │ │ │ ├── compile/
│ │ │ │ │ ├── Compile.scala
│ │ │ │ │ └── CompileOptions.scala
│ │ │ │ ├── config/
│ │ │ │ │ ├── Config.scala
│ │ │ │ │ ├── ConfigOptions.scala
│ │ │ │ │ └── ThrowawayPgpSecret.scala
│ │ │ │ ├── default/
│ │ │ │ │ ├── Default.scala
│ │ │ │ │ ├── DefaultFile.scala
│ │ │ │ │ ├── DefaultFileOptions.scala
│ │ │ │ │ ├── DefaultOptions.scala
│ │ │ │ │ └── LegacyScalaOptions.scala
│ │ │ │ ├── dependencyupdate/
│ │ │ │ │ ├── DependencyUpdate.scala
│ │ │ │ │ └── DependencyUpdateOptions.scala
│ │ │ │ ├── directories/
│ │ │ │ │ ├── Directories.scala
│ │ │ │ │ └── DirectoriesOptions.scala
│ │ │ │ ├── doc/
│ │ │ │ │ ├── Doc.scala
│ │ │ │ │ └── DocOptions.scala
│ │ │ │ ├── export0/
│ │ │ │ │ ├── Export.scala
│ │ │ │ │ └── ExportOptions.scala
│ │ │ │ ├── fix/
│ │ │ │ │ ├── BuiltInRules.scala
│ │ │ │ │ ├── Fix.scala
│ │ │ │ │ ├── FixOptions.scala
│ │ │ │ │ ├── ScalafixOptions.scala
│ │ │ │ │ └── ScalafixRules.scala
│ │ │ │ ├── fmt/
│ │ │ │ │ ├── Fmt.scala
│ │ │ │ │ ├── FmtOptions.scala
│ │ │ │ │ └── FmtUtil.scala
│ │ │ │ ├── github/
│ │ │ │ │ ├── GitHubApi.scala
│ │ │ │ │ ├── HasSharedSecretOptions.scala
│ │ │ │ │ ├── LibSodiumJni.scala
│ │ │ │ │ ├── SecretCreate.scala
│ │ │ │ │ ├── SecretCreateOptions.scala
│ │ │ │ │ ├── SecretList.scala
│ │ │ │ │ ├── SecretListOptions.scala
│ │ │ │ │ └── SharedSecretOptions.scala
│ │ │ │ ├── installcompletions/
│ │ │ │ │ ├── InstallCompletions.scala
│ │ │ │ │ └── InstallCompletionsOptions.scala
│ │ │ │ ├── installhome/
│ │ │ │ │ ├── InstallHome.scala
│ │ │ │ │ └── InstallHomeOptions.scala
│ │ │ │ ├── new/
│ │ │ │ │ ├── New.scala
│ │ │ │ │ └── NewOptions.scala
│ │ │ │ ├── package0/
│ │ │ │ │ ├── Package.scala
│ │ │ │ │ ├── PackageOptions.scala
│ │ │ │ │ └── PackagerOptions.scala
│ │ │ │ ├── packaging/
│ │ │ │ │ └── Spark.scala
│ │ │ │ ├── pgp/
│ │ │ │ │ ├── DummyOptions.scala
│ │ │ │ │ ├── ExternalCommand.scala
│ │ │ │ │ ├── KeyServer.scala
│ │ │ │ │ ├── PgpCommand.scala
│ │ │ │ │ ├── PgpCommandNames.scala
│ │ │ │ │ ├── PgpCommands.scala
│ │ │ │ │ ├── PgpCreate.scala
│ │ │ │ │ ├── PgpCreateExternal.scala
│ │ │ │ │ ├── PgpExternalCommand.scala
│ │ │ │ │ ├── PgpExternalOptions.scala
│ │ │ │ │ ├── PgpKeyId.scala
│ │ │ │ │ ├── PgpKeyIdExternal.scala
│ │ │ │ │ ├── PgpProxy.scala
│ │ │ │ │ ├── PgpProxyJvm.scala
│ │ │ │ │ ├── PgpProxyMaker.scala
│ │ │ │ │ ├── PgpPull.scala
│ │ │ │ │ ├── PgpPullOptions.scala
│ │ │ │ │ ├── PgpPush.scala
│ │ │ │ │ ├── PgpPushOptions.scala
│ │ │ │ │ ├── PgpScalaSigningOptions.scala
│ │ │ │ │ ├── PgpSign.scala
│ │ │ │ │ ├── PgpSignExternal.scala
│ │ │ │ │ ├── PgpVerify.scala
│ │ │ │ │ ├── PgpVerifyExternal.scala
│ │ │ │ │ └── SharedPgpPushPullOptions.scala
│ │ │ │ ├── publish/
│ │ │ │ │ ├── ConfigUtil.scala
│ │ │ │ │ ├── GitRepo.scala
│ │ │ │ │ ├── GitRepoError.scala
│ │ │ │ │ ├── Ivy.scala
│ │ │ │ │ ├── OptionCheck.scala
│ │ │ │ │ ├── OptionChecks.scala
│ │ │ │ │ ├── Publish.scala
│ │ │ │ │ ├── PublishConnectionOptions.scala
│ │ │ │ │ ├── PublishLocal.scala
│ │ │ │ │ ├── PublishLocalOptions.scala
│ │ │ │ │ ├── PublishOptions.scala
│ │ │ │ │ ├── PublishParamsOptions.scala
│ │ │ │ │ ├── PublishRepositoryOptions.scala
│ │ │ │ │ ├── PublishSetup.scala
│ │ │ │ │ ├── PublishSetupOptions.scala
│ │ │ │ │ ├── PublishUtils.scala
│ │ │ │ │ ├── RepoParams.scala
│ │ │ │ │ ├── RepositoryParser.scala
│ │ │ │ │ ├── SetSecret.scala
│ │ │ │ │ ├── SharedPublishOptions.scala
│ │ │ │ │ └── checks/
│ │ │ │ │ ├── CheckUtils.scala
│ │ │ │ │ ├── ComputeVersionCheck.scala
│ │ │ │ │ ├── DeveloperCheck.scala
│ │ │ │ │ ├── LicenseCheck.scala
│ │ │ │ │ ├── NameCheck.scala
│ │ │ │ │ ├── OrganizationCheck.scala
│ │ │ │ │ ├── PasswordCheck.scala
│ │ │ │ │ ├── PgpSecretKeyCheck.scala
│ │ │ │ │ ├── RepositoryCheck.scala
│ │ │ │ │ ├── ScmCheck.scala
│ │ │ │ │ ├── UrlCheck.scala
│ │ │ │ │ └── UserCheck.scala
│ │ │ │ ├── repl/
│ │ │ │ │ ├── Repl.scala
│ │ │ │ │ ├── ReplOptions.scala
│ │ │ │ │ └── SharedReplOptions.scala
│ │ │ │ ├── run/
│ │ │ │ │ ├── Run.scala
│ │ │ │ │ ├── RunMode.scala
│ │ │ │ │ ├── RunOptions.scala
│ │ │ │ │ └── SharedRunOptions.scala
│ │ │ │ ├── setupide/
│ │ │ │ │ ├── SetupIde.scala
│ │ │ │ │ └── SetupIdeOptions.scala
│ │ │ │ ├── shared/
│ │ │ │ │ ├── AllExternalHelpOptions.scala
│ │ │ │ │ ├── ArgSplitter.scala
│ │ │ │ │ ├── BenchmarkingOptions.scala
│ │ │ │ │ ├── CoursierOptions.scala
│ │ │ │ │ ├── CrossOptions.scala
│ │ │ │ │ ├── GlobalOptions.scala
│ │ │ │ │ ├── GlobalSuppressWarningOptions.scala
│ │ │ │ │ ├── HasGlobalOptions.scala
│ │ │ │ │ ├── HasSharedOptions.scala
│ │ │ │ │ ├── HasSharedWatchOptions.scala
│ │ │ │ │ ├── HelpGroupOptions.scala
│ │ │ │ │ ├── HelpGroups.scala
│ │ │ │ │ ├── HelpMessages.scala
│ │ │ │ │ ├── HelpOptions.scala
│ │ │ │ │ ├── JavaPropOptions.scala
│ │ │ │ │ ├── LoggingOptions.scala
│ │ │ │ │ ├── MainClassOptions.scala
│ │ │ │ │ ├── MarkdownOptions.scala
│ │ │ │ │ ├── ScalaCliHelp.scala
│ │ │ │ │ ├── ScalaJsOptions.scala
│ │ │ │ │ ├── ScalaNativeOptions.scala
│ │ │ │ │ ├── ScalacExtraOptions.scala
│ │ │ │ │ ├── ScalacOptions.scala
│ │ │ │ │ ├── ScopeOptions.scala
│ │ │ │ │ ├── SemanticDbOptions.scala
│ │ │ │ │ ├── SharedBspFileOptions.scala
│ │ │ │ │ ├── SharedCompilationServerOptions.scala
│ │ │ │ │ ├── SharedDebugOptions.scala
│ │ │ │ │ ├── SharedDependencyOptions.scala
│ │ │ │ │ ├── SharedInputOptions.scala
│ │ │ │ │ ├── SharedJavaOptions.scala
│ │ │ │ │ ├── SharedJvmOptions.scala
│ │ │ │ │ ├── SharedOptions.scala
│ │ │ │ │ ├── SharedPythonOptions.scala
│ │ │ │ │ ├── SharedVersionOptions.scala
│ │ │ │ │ ├── SharedWatchOptions.scala
│ │ │ │ │ ├── SharedWorkspaceOptions.scala
│ │ │ │ │ ├── SnippetOptions.scala
│ │ │ │ │ ├── SourceGeneratorOptions.scala
│ │ │ │ │ ├── SuppressWarningOptions.scala
│ │ │ │ │ └── VerbosityOptions.scala
│ │ │ │ ├── shebang/
│ │ │ │ │ ├── Shebang.scala
│ │ │ │ │ └── ShebangOptions.scala
│ │ │ │ ├── test/
│ │ │ │ │ ├── Test.scala
│ │ │ │ │ └── TestOptions.scala
│ │ │ │ ├── uninstall/
│ │ │ │ │ ├── Uninstall.scala
│ │ │ │ │ └── UninstallOptions.scala
│ │ │ │ ├── uninstallcompletions/
│ │ │ │ │ ├── SharedUninstallCompletionsOptions.scala
│ │ │ │ │ ├── UninstallCompletions.scala
│ │ │ │ │ └── UninstallCompletionsOptions.scala
│ │ │ │ ├── update/
│ │ │ │ │ ├── Update.scala
│ │ │ │ │ └── UpdateOptions.scala
│ │ │ │ ├── util/
│ │ │ │ │ ├── BuildCommandHelpers.scala
│ │ │ │ │ ├── CommandHelpers.scala
│ │ │ │ │ ├── HelpUtils.scala
│ │ │ │ │ ├── JvmUtils.scala
│ │ │ │ │ ├── RunHadoop.scala
│ │ │ │ │ ├── RunSpark.scala
│ │ │ │ │ ├── ScalaCliSttpBackend.scala
│ │ │ │ │ └── ScalacOptionsUtil.scala
│ │ │ │ └── version/
│ │ │ │ ├── Version.scala
│ │ │ │ └── VersionOptions.scala
│ │ │ ├── errors/
│ │ │ │ ├── FailedToSignFileError.scala
│ │ │ │ ├── FoundVirtualInputsError.scala
│ │ │ │ ├── GitHubApiError.scala
│ │ │ │ ├── GraalVMNativeImageError.scala
│ │ │ │ ├── InvalidSonatypePublishCredentials.scala
│ │ │ │ ├── MalformedChecksumsError.scala
│ │ │ │ ├── MalformedOptionError.scala
│ │ │ │ ├── MissingConfigEntryError.scala
│ │ │ │ ├── MissingPublishOptionError.scala
│ │ │ │ ├── PgpError.scala
│ │ │ │ ├── ScalaJsLinkingError.scala
│ │ │ │ ├── ScaladocGenerationFailedError.scala
│ │ │ │ ├── UploadError.scala
│ │ │ │ └── WrongSonatypeServerError.scala
│ │ │ ├── exportCmd/
│ │ │ │ ├── JsonProject.scala
│ │ │ │ ├── JsonProjectDescriptor.scala
│ │ │ │ ├── MavenProject.scala
│ │ │ │ ├── MavenProjectDescriptor.scala
│ │ │ │ ├── MillProject.scala
│ │ │ │ ├── MillProjectDescriptor.scala
│ │ │ │ ├── Project.scala
│ │ │ │ ├── ProjectDescriptor.scala
│ │ │ │ ├── SbtProject.scala
│ │ │ │ └── SbtProjectDescriptor.scala
│ │ │ ├── internal/
│ │ │ │ ├── Argv0.scala
│ │ │ │ ├── CachedBinary.scala
│ │ │ │ ├── CliLogger.scala
│ │ │ │ ├── PPrintStringPrefixHelper.scala
│ │ │ │ ├── Pid.scala
│ │ │ │ ├── ProcUtil.scala
│ │ │ │ ├── ProfileFileUpdater.scala
│ │ │ │ └── ScalaJsLinker.scala
│ │ │ ├── javaLauncher/
│ │ │ │ └── JavaLauncherCli.scala
│ │ │ ├── launcher/
│ │ │ │ ├── LauncherCli.scala
│ │ │ │ ├── LauncherOptions.scala
│ │ │ │ ├── PowerOptions.scala
│ │ │ │ └── ScalaRunnerLauncherOptions.scala
│ │ │ ├── packaging/
│ │ │ │ ├── Library.scala
│ │ │ │ └── NativeImage.scala
│ │ │ ├── publish/
│ │ │ │ ├── BouncycastleExternalSigner.scala
│ │ │ │ └── BouncycastleSignerMaker.scala
│ │ │ └── util/
│ │ │ ├── ArgHelpers.scala
│ │ │ ├── ArgParsers.scala
│ │ │ ├── ConfigDbUtils.scala
│ │ │ ├── ConfigPasswordOptionHelpers.scala
│ │ │ ├── MaybeConfigPasswordOption.scala
│ │ │ └── SeqHelpers.scala
│ │ └── test/
│ │ └── scala/
│ │ ├── cli/
│ │ │ ├── commands/
│ │ │ │ └── tests/
│ │ │ │ ├── DocTests.scala
│ │ │ │ ├── ReplOptionsTests.scala
│ │ │ │ └── RunOptionsTests.scala
│ │ │ └── tests/
│ │ │ ├── ArgSplitterTest.scala
│ │ │ ├── CachedBinaryTests.scala
│ │ │ ├── HelpCheck.scala
│ │ │ ├── LauncherCliTest.scala
│ │ │ ├── OptionsCheck.scala
│ │ │ ├── PackageTests.scala
│ │ │ ├── ScalafmtTests.scala
│ │ │ ├── SetupScalaCLITests.scala
│ │ │ └── TestUtil.scala
│ │ └── scala/
│ │ └── cli/
│ │ ├── commands/
│ │ │ └── publish/
│ │ │ └── IvyTests.scala
│ │ └── tests/
│ │ └── ScalacOptionsPrintTest.scala
│ ├── config/
│ │ └── src/
│ │ └── main/
│ │ └── scala/
│ │ └── scala/
│ │ └── cli/
│ │ └── config/
│ │ ├── ConfigDb.scala
│ │ ├── CredentialsValue.scala
│ │ ├── ErrorMessages.scala
│ │ ├── Key.scala
│ │ ├── Keys.scala
│ │ ├── PasswordOption.scala
│ │ ├── PublishCredentials.scala
│ │ ├── RawJson.scala
│ │ ├── RepositoryCredentials.scala
│ │ ├── Secret.scala
│ │ └── internal/
│ │ └── JavaHelper.scala
│ ├── core/
│ │ └── src/
│ │ └── main/
│ │ └── scala/
│ │ └── scala/
│ │ └── build/
│ │ ├── CsUtils.scala
│ │ ├── Logger.scala
│ │ ├── Os.scala
│ │ ├── Position.scala
│ │ ├── RepositoryUtils.scala
│ │ ├── errors/
│ │ │ ├── AmbiguousPlatformError.scala
│ │ │ ├── BuildException.scala
│ │ │ ├── BuildInfoGenerationError.scala
│ │ │ ├── CantDownloadAmmoniteError.scala
│ │ │ ├── CheckScalaCliVersionError.scala
│ │ │ ├── CompositeBuildException.scala
│ │ │ ├── ConfigDbException.scala
│ │ │ ├── CoursierDependencyError.scala
│ │ │ ├── DependencyFormatError.scala
│ │ │ ├── Diagnostic.scala
│ │ │ ├── DirectiveErrors.scala
│ │ │ ├── ExcludeDefinitionError.scala
│ │ │ ├── FetchingDependenciesError.scala
│ │ │ ├── FileNotFoundException.scala
│ │ │ ├── ForbiddenPathReferenceError.scala
│ │ │ ├── InputsException.scala
│ │ │ ├── InvalidBinaryScalaVersionError.scala
│ │ │ ├── JmhBuildFailedError.scala
│ │ │ ├── JvmDownloadError.scala
│ │ │ ├── MainClassError.scala
│ │ │ ├── MalformedCliInputError.scala
│ │ │ ├── MalformedDirectiveError.scala
│ │ │ ├── MalformedInputError.scala
│ │ │ ├── MalformedPlatformError.scala
│ │ │ ├── MarkdownUnclosedBackticksError.scala
│ │ │ ├── ModuleFormatError.scala
│ │ │ ├── MultipleScalaVersionsError.scala
│ │ │ ├── NoDocBuildError.scala
│ │ │ ├── NoFrameworkFoundByBridgeError.scala
│ │ │ ├── NoFrameworkFoundByNativeBridgeError.scala
│ │ │ ├── NoMainClassFoundError.scala
│ │ │ ├── NoScalaVersionProvidedError.scala
│ │ │ ├── NoTestFrameworkFoundError.scala
│ │ │ ├── NoTestFrameworkValueProvidedError.scala
│ │ │ ├── NoTestsRun.scala
│ │ │ ├── NoValidScalaVersionFoundError.scala
│ │ │ ├── NoValueProvidedError.scala
│ │ │ ├── NodeNotFoundError.scala
│ │ │ ├── ParsingInputsException.scala
│ │ │ ├── RepositoryFormatError.scala
│ │ │ ├── ScalaNativeBuildError.scala
│ │ │ ├── ScalaNativeCompatibilityError.scala
│ │ │ ├── ScalaVersionError.scala
│ │ │ ├── ScalafixPropertiesError.scala
│ │ │ ├── SeveralMainClassesFoundError.scala
│ │ │ ├── Severity.scala
│ │ │ ├── TestError.scala
│ │ │ ├── TooManyFrameworksFoundByBridgeError.scala
│ │ │ ├── ToolkitVersionError.scala
│ │ │ ├── UnexpectedDirectiveError.scala
│ │ │ ├── UnexpectedJvmPlatformVersionError.scala
│ │ │ ├── UnrecognizedDebugModeError.scala
│ │ │ ├── UnrecognizedJsOptModeError.scala
│ │ │ ├── UnsupportedFeatureError.scala
│ │ │ ├── UnsupportedGradleModuleVariantError.scala
│ │ │ ├── UnsupportedScalaVersionError.scala
│ │ │ ├── UnusedDirectiveError.scala
│ │ │ └── WorkspaceError.scala
│ │ ├── internals/
│ │ │ ├── CodeWrapper.scala
│ │ │ ├── ConsoleUtils.scala
│ │ │ ├── CsLoggerUtil.scala
│ │ │ ├── CustomProgressBarRefreshDisplay.scala
│ │ │ ├── EnvVar.scala
│ │ │ ├── FeatureType.scala
│ │ │ ├── License.scala
│ │ │ ├── Licenses.scala
│ │ │ ├── Name.scala
│ │ │ ├── NativeWrapper.scala
│ │ │ ├── OsLibc.scala
│ │ │ ├── Regexes.scala
│ │ │ └── StableScalaVersion.scala
│ │ └── warnings/
│ │ └── DeprecatedWarning.scala
│ ├── directives/
│ │ └── src/
│ │ └── main/
│ │ └── scala/
│ │ └── scala/
│ │ └── build/
│ │ ├── directives/
│ │ │ ├── DirectiveDescription.scala
│ │ │ ├── DirectiveExamples.scala
│ │ │ ├── DirectiveGroupDetails.scala
│ │ │ ├── DirectiveGroupName.scala
│ │ │ ├── DirectiveLevel.scala
│ │ │ ├── DirectiveName.scala
│ │ │ ├── DirectiveSpecialSyntax.scala
│ │ │ ├── DirectiveUsage.scala
│ │ │ ├── DirectiveValueParser.scala
│ │ │ ├── HasBuildOptions.scala
│ │ │ ├── HasBuildOptionsWithRequirements.scala
│ │ │ ├── HasBuildRequirements.scala
│ │ │ └── ScopedValue.scala
│ │ ├── errors/
│ │ │ ├── ScalaJsLinkingError.scala
│ │ │ ├── SingleValueExpectedError.scala
│ │ │ ├── UsingDirectiveExpectationError.scala
│ │ │ ├── UsingFileFromUriError.scala
│ │ │ ├── WrongDirectoryPathError.scala
│ │ │ ├── WrongJarPathError.scala
│ │ │ ├── WrongJavaHomePathError.scala
│ │ │ └── WrongSourcePathError.scala
│ │ └── preprocessing/
│ │ ├── ScopePath.scala
│ │ ├── Scoped.scala
│ │ └── directives/
│ │ ├── Benchmarking.scala
│ │ ├── BuildInfo.scala
│ │ ├── ClasspathUtils.scala
│ │ ├── ComputeVersion.scala
│ │ ├── CustomJar.scala
│ │ ├── Dependency.scala
│ │ ├── Directive.scala
│ │ ├── DirectiveHandler.scala
│ │ ├── DirectivePrefix.scala
│ │ ├── DirectiveUtil.scala
│ │ ├── Exclude.scala
│ │ ├── JavaHome.scala
│ │ ├── JavaOptions.scala
│ │ ├── JavaProps.scala
│ │ ├── JavacOptions.scala
│ │ ├── Jvm.scala
│ │ ├── MainClass.scala
│ │ ├── ObjectWrapper.scala
│ │ ├── Packaging.scala
│ │ ├── Platform.scala
│ │ ├── Plugin.scala
│ │ ├── ProcessedDirective.scala
│ │ ├── Publish.scala
│ │ ├── PublishContextual.scala
│ │ ├── Python.scala
│ │ ├── Repository.scala
│ │ ├── RequirePlatform.scala
│ │ ├── RequireScalaVersion.scala
│ │ ├── RequireScalaVersionBounds.scala
│ │ ├── RequireScope.scala
│ │ ├── Resources.scala
│ │ ├── ScalaJs.scala
│ │ ├── ScalaNative.scala
│ │ ├── ScalaVersion.scala
│ │ ├── ScalacOptions.scala
│ │ ├── ScopedDirective.scala
│ │ ├── Sources.scala
│ │ ├── StrictDirective.scala
│ │ ├── Tests.scala
│ │ ├── Toolkit.scala
│ │ └── Watching.scala
│ ├── docs-tests/
│ │ ├── README.md
│ │ └── src/
│ │ ├── main/
│ │ │ └── scala/
│ │ │ └── sclicheck/
│ │ │ └── sclicheck.scala
│ │ └── test/
│ │ ├── resources/
│ │ │ └── test.md
│ │ └── scala/
│ │ └── sclicheck/
│ │ ├── DocTests.scala
│ │ ├── GifTests.scala
│ │ ├── MarkdownLinkTests.scala
│ │ ├── SclicheckTests.scala
│ │ └── TestUtil.scala
│ ├── dummy/
│ │ ├── amm/
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── scala/
│ │ │ └── AmmDummy.scala
│ │ └── scalafmt/
│ │ └── src/
│ │ └── main/
│ │ └── scala/
│ │ └── ScalafmtDummy.scala
│ ├── generate-reference-doc/
│ │ └── src/
│ │ └── main/
│ │ └── scala/
│ │ └── scala/
│ │ └── cli/
│ │ └── doc/
│ │ ├── GenerateReferenceDoc.scala
│ │ ├── InternalDocOptions.scala
│ │ └── ReferenceDocUtils.scala
│ ├── integration/
│ │ ├── docker/
│ │ │ └── src/
│ │ │ └── test/
│ │ │ └── scala/
│ │ │ └── scala/
│ │ │ └── cli/
│ │ │ └── integration/
│ │ │ └── RunDockerTests.scala
│ │ └── src/
│ │ ├── main/
│ │ │ └── scala/
│ │ │ └── scala/
│ │ │ └── cli/
│ │ │ └── integration/
│ │ │ └── TestInputs.scala
│ │ └── test/
│ │ ├── java/
│ │ │ └── scala/
│ │ │ └── cli/
│ │ │ └── integration/
│ │ │ └── bsp/
│ │ │ ├── WrappedSourceItem.java
│ │ │ ├── WrappedSourcesItem.java
│ │ │ └── WrappedSourcesResult.java
│ │ ├── resources/
│ │ │ └── test-keys/
│ │ │ ├── key.asc
│ │ │ └── key.skr
│ │ └── scala/
│ │ └── scala/
│ │ └── cli/
│ │ └── integration/
│ │ ├── ArgsFileTests.scala
│ │ ├── BloopTests.scala
│ │ ├── BspSuite.scala
│ │ ├── BspTestDefinitions.scala
│ │ ├── BspTests212.scala
│ │ ├── BspTests213.scala
│ │ ├── BspTests2Definitions.scala
│ │ ├── BspTests3Definitions.scala
│ │ ├── BspTests3Lts.scala
│ │ ├── BspTests3NextRc.scala
│ │ ├── BspTestsDefault.scala
│ │ ├── CleanTests.scala
│ │ ├── CompileScalacCompatTestDefinitions.scala
│ │ ├── CompileTestDefinitions.scala
│ │ ├── CompileTests212.scala
│ │ ├── CompileTests213.scala
│ │ ├── CompileTests3Lts.scala
│ │ ├── CompileTests3NextRc.scala
│ │ ├── CompileTests3StableDefinitions.scala
│ │ ├── CompileTestsDefault.scala
│ │ ├── CompilerPluginTestDefinitions.scala
│ │ ├── CompleteTests.scala
│ │ ├── ConfigTests.scala
│ │ ├── CoursierScalaInstallationTestHelper.scala
│ │ ├── DefaultFileTests.scala
│ │ ├── DefaultTests.scala
│ │ ├── DependencyUpdateTests.scala
│ │ ├── DirectoriesTests.scala
│ │ ├── DocTestDefinitions.scala
│ │ ├── DocTests212.scala
│ │ ├── DocTests213.scala
│ │ ├── DocTests3Lts.scala
│ │ ├── DocTests3NextRc.scala
│ │ ├── DocTestsDefault.scala
│ │ ├── ExportCommonTestDefinitions.scala
│ │ ├── ExportJsonTestDefinitions.scala
│ │ ├── ExportJsonTestsDefault.scala
│ │ ├── ExportMavenTest3NextRc.scala
│ │ ├── ExportMavenTestDefinitions.scala
│ │ ├── ExportMavenTestJava.scala
│ │ ├── ExportMavenTests212.scala
│ │ ├── ExportMavenTests213.scala
│ │ ├── ExportMavenTests3Lts.scala
│ │ ├── ExportMill012Tests212.scala
│ │ ├── ExportMill012Tests213.scala
│ │ ├── ExportMill012Tests3Lts.scala
│ │ ├── ExportMill012Tests3NextRc.scala
│ │ ├── ExportMill012TestsDefault.scala
│ │ ├── ExportMill1Tests212.scala
│ │ ├── ExportMill1Tests213.scala
│ │ ├── ExportMill1Tests3Lts.scala
│ │ ├── ExportMill1Tests3NextRc.scala
│ │ ├── ExportMill1TestsDefault.scala
│ │ ├── ExportMillTestDefinitions.scala
│ │ ├── ExportSbtTestDefinitions.scala
│ │ ├── ExportSbtTests212.scala
│ │ ├── ExportSbtTests213.scala
│ │ ├── ExportSbtTests3Lts.scala
│ │ ├── ExportSbtTests3NextRc.scala
│ │ ├── ExportSbtTestsDefault.scala
│ │ ├── ExportScalaOrientedBuildToolsTestDefinitions.scala
│ │ ├── ExportTestProjects.scala
│ │ ├── FixBuiltInRulesTestDefinitions.scala
│ │ ├── FixScalafixRulesTestDefinitions.scala
│ │ ├── FixTestDefinitions.scala
│ │ ├── FixTests212.scala
│ │ ├── FixTests213.scala
│ │ ├── FixTests3Lts.scala
│ │ ├── FixTests3NextRc.scala
│ │ ├── FixTestsDefault.scala
│ │ ├── FmtTests.scala
│ │ ├── GitHubTests.scala
│ │ ├── HadoopTests.scala
│ │ ├── HelpTests.scala
│ │ ├── InstallAndUninstallCompletionsTests.scala
│ │ ├── InstallHomeTests.scala
│ │ ├── JmhSuite.scala
│ │ ├── JmhTests.scala
│ │ ├── LegacyScalaRunnerTestDefinitions.scala
│ │ ├── LoggingTests.scala
│ │ ├── MarkdownTests.scala
│ │ ├── MavenTestHelper.scala
│ │ ├── MetaCheck.scala
│ │ ├── MillTestHelper.scala
│ │ ├── NativePackagerTests.scala
│ │ ├── NewTests.scala
│ │ ├── PackageTestDefinitions.scala
│ │ ├── PackageTests212.scala
│ │ ├── PackageTests213.scala
│ │ ├── PackageTests3Lts.scala
│ │ ├── PackageTests3NextRc.scala
│ │ ├── PackageTestsDefault.scala
│ │ ├── PgpTests.scala
│ │ ├── PublishLocalTestDefinitions.scala
│ │ ├── PublishLocalTests212.scala
│ │ ├── PublishLocalTests213.scala
│ │ ├── PublishLocalTests3Lts.scala
│ │ ├── PublishLocalTests3NextRc.scala
│ │ ├── PublishLocalTestsDefault.scala
│ │ ├── PublishSetupTests.scala
│ │ ├── PublishTestDefinitions.scala
│ │ ├── PublishTests212.scala
│ │ ├── PublishTests213.scala
│ │ ├── PublishTests3Lts.scala
│ │ ├── PublishTests3NextRc.scala
│ │ ├── PublishTestsDefault.scala
│ │ ├── ReplAmmoniteTestDefinitions.scala
│ │ ├── ReplAmmoniteTests3StableDefinitions.scala
│ │ ├── ReplTestDefinitions.scala
│ │ ├── ReplTests212.scala
│ │ ├── ReplTests213.scala
│ │ ├── ReplTests3Lts.scala
│ │ ├── ReplTests3NextRc.scala
│ │ ├── ReplTestsDefault.scala
│ │ ├── RunGistTestDefinitions.scala
│ │ ├── RunJdkTestDefinitions.scala
│ │ ├── RunPipedSourcesTestDefinitions.scala
│ │ ├── RunScalaJsTestDefinitions.scala
│ │ ├── RunScalaNativeTestDefinitions.scala
│ │ ├── RunScalaPyTestDefinitions.scala
│ │ ├── RunScalacCompatTestDefinitions.scala
│ │ ├── RunScriptTestDefinitions.scala
│ │ ├── RunSnippetTestDefinitions.scala
│ │ ├── RunTestDefinitions.scala
│ │ ├── RunTests212.scala
│ │ ├── RunTests213.scala
│ │ ├── RunTests3Lts.scala
│ │ ├── RunTests3NextRc.scala
│ │ ├── RunTestsDefault.scala
│ │ ├── RunWithWatchTestDefinitions.scala
│ │ ├── RunZipTestDefinitions.scala
│ │ ├── SbtTestHelper.scala
│ │ ├── ScalaCliSuite.scala
│ │ ├── ScriptWrapperTestDefinitions.scala
│ │ ├── SemanticDbTestDefinitions.scala
│ │ ├── SharedRunTests.scala
│ │ ├── SipScalaTests.scala
│ │ ├── SparkTestDefinitions.scala
│ │ ├── SparkTests212.scala
│ │ ├── SparkTests213.scala
│ │ ├── TestBspClient.scala
│ │ ├── TestNativeImageOnScala3.scala
│ │ ├── TestScalaVersionArgs.scala
│ │ ├── TestTestDefinitions.scala
│ │ ├── TestTests212.scala
│ │ ├── TestTests213.scala
│ │ ├── TestTests3Lts.scala
│ │ ├── TestTests3NextRc.scala
│ │ ├── TestTestsDefault.scala
│ │ ├── TestUtil.scala
│ │ ├── UpdateTests.scala
│ │ ├── VersionTests.scala
│ │ ├── WithWarmUpScalaCliSuite.scala
│ │ ├── package.scala
│ │ └── util/
│ │ ├── BloopUtil.scala
│ │ ├── CompilerPluginUtil.scala
│ │ └── DockerServer.scala
│ ├── java-test-runner/
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── scala/
│ │ └── build/
│ │ └── testrunner/
│ │ ├── JavaAsmTestRunner.java
│ │ ├── JavaDynamicTestRunner.java
│ │ ├── JavaFrameworkUtils.java
│ │ ├── JavaTestLogger.java
│ │ └── JavaTestRunner.java
│ ├── options/
│ │ └── src/
│ │ ├── main/
│ │ │ └── scala/
│ │ │ └── scala/
│ │ │ └── build/
│ │ │ ├── Artifacts.scala
│ │ │ ├── CoursierUtils.scala
│ │ │ ├── Positioned.scala
│ │ │ ├── ScalaArtifacts.scala
│ │ │ ├── TemporaryInMemoryRepository.scala
│ │ │ ├── actionable/
│ │ │ │ ├── ActionableDependencyHandler.scala
│ │ │ │ ├── ActionableDiagnostic.scala
│ │ │ │ ├── ActionableHandler.scala
│ │ │ │ ├── ActionablePreprocessor.scala
│ │ │ │ └── errors/
│ │ │ │ └── ActionableHandlerError.scala
│ │ │ ├── info/
│ │ │ │ ├── BuildInfo.scala
│ │ │ │ └── ScopedBuildInfo.scala
│ │ │ ├── interactive/
│ │ │ │ ├── Interactive.scala
│ │ │ │ └── InteractiveFileOps.scala
│ │ │ ├── internal/
│ │ │ │ ├── ExternalBinary.scala
│ │ │ │ ├── ExternalBinaryParams.scala
│ │ │ │ ├── FetchExternalBinary.scala
│ │ │ │ ├── ScalaJsLinkerConfig.scala
│ │ │ │ └── StdInConcurrentReader.scala
│ │ │ ├── internals/
│ │ │ │ └── Util.scala
│ │ │ └── options/
│ │ │ ├── BuildOptions.scala
│ │ │ ├── BuildRequirements.scala
│ │ │ ├── ClassPathOptions.scala
│ │ │ ├── ComputeVersion.scala
│ │ │ ├── ConfigMonoid.scala
│ │ │ ├── HasHashData.scala
│ │ │ ├── HasScope.scala
│ │ │ ├── HashedType.scala
│ │ │ ├── InternalDependenciesOptions.scala
│ │ │ ├── InternalOptions.scala
│ │ │ ├── JavaOpt.scala
│ │ │ ├── JavaOptions.scala
│ │ │ ├── JmhOptions.scala
│ │ │ ├── MaybeScalaVersion.scala
│ │ │ ├── PackageOptions.scala
│ │ │ ├── PackageType.scala
│ │ │ ├── Platform.scala
│ │ │ ├── PostBuildOptions.scala
│ │ │ ├── PublishContextualOptions.scala
│ │ │ ├── PublishOptions.scala
│ │ │ ├── ReplOptions.scala
│ │ │ ├── SNNumeralVersion.scala
│ │ │ ├── ScalaJsOptions.scala
│ │ │ ├── ScalaNativeOptions.scala
│ │ │ ├── ScalaOptions.scala
│ │ │ ├── ScalaSigningCliOptions.scala
│ │ │ ├── ScalaVersionUtil.scala
│ │ │ ├── ScalacOpt.scala
│ │ │ ├── Scope.scala
│ │ │ ├── ScriptOptions.scala
│ │ │ ├── SemanticDbOptions.scala
│ │ │ ├── ShadowingSeq.scala
│ │ │ ├── SourceGeneratorOptions.scala
│ │ │ ├── SuppressWarningOptions.scala
│ │ │ ├── TestOptions.scala
│ │ │ ├── WatchOptions.scala
│ │ │ ├── WithBuildRequirements.scala
│ │ │ ├── packaging/
│ │ │ │ ├── DebianOptions.scala
│ │ │ │ ├── DockerOptions.scala
│ │ │ │ ├── NativeImageOptions.scala
│ │ │ │ ├── RedHatOptions.scala
│ │ │ │ └── WindowsOptions.scala
│ │ │ ├── publish/
│ │ │ │ ├── ConfigPasswordOption.scala
│ │ │ │ ├── Developer.scala
│ │ │ │ ├── License.scala
│ │ │ │ ├── Signer.scala
│ │ │ │ └── Vcs.scala
│ │ │ ├── scalajs/
│ │ │ │ └── ScalaJsLinkerOptions.scala
│ │ │ └── validation/
│ │ │ └── BuildOptionsRule.scala
│ │ └── test/
│ │ └── scala/
│ │ └── scala/
│ │ └── build/
│ │ └── options/
│ │ └── ConfigMonoidTest.scala
│ ├── runner/
│ │ └── src/
│ │ └── main/
│ │ └── scala/
│ │ └── scala/
│ │ └── cli/
│ │ └── runner/
│ │ ├── Runner.scala
│ │ └── StackTracePrinter.scala
│ ├── scala-cli-bsp/
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── scala/
│ │ └── build/
│ │ └── bsp/
│ │ ├── ScalaScriptBuildServer.java
│ │ ├── WrappedSourceItem.java
│ │ ├── WrappedSourcesItem.java
│ │ ├── WrappedSourcesParams.java
│ │ └── WrappedSourcesResult.java
│ ├── scalaparse/
│ │ └── src/
│ │ └── main/
│ │ └── scala/
│ │ └── build/
│ │ └── internal/
│ │ ├── ImportTree.scala
│ │ └── ScalaParse.scala
│ ├── specification-level/
│ │ └── src/
│ │ └── main/
│ │ └── scala/
│ │ └── scala/
│ │ └── cli/
│ │ └── commands/
│ │ └── SpecificationLevel.scala
│ ├── tasty-lib/
│ │ └── src/
│ │ └── main/
│ │ └── scala/
│ │ └── scala/
│ │ └── build/
│ │ └── tastylib/
│ │ ├── TastyBuffer.scala
│ │ ├── TastyData.scala
│ │ ├── TastyFormat.scala
│ │ ├── TastyHeaderUnpickler.scala
│ │ ├── TastyName.scala
│ │ ├── TastyReader.scala
│ │ ├── TastyUnpickler.scala
│ │ ├── TastyVersions.scala
│ │ └── UnpickleException.scala
│ └── test-runner/
│ └── src/
│ └── main/
│ └── scala/
│ └── scala/
│ └── build/
│ └── testrunner/
│ ├── AsmTestRunner.scala
│ ├── DynamicTestRunner.scala
│ ├── FrameworkUtils.scala
│ ├── Logger.scala
│ └── TestRunner.scala
├── project/
│ ├── deps/
│ │ └── package.mill
│ ├── musl-image/
│ │ ├── Dockerfile
│ │ └── setup.sh
│ ├── package.mill
│ ├── publish/
│ │ └── package.mill
│ ├── settings/
│ │ └── package.mill
│ ├── utils/
│ │ └── package.mill
│ └── website/
│ └── package.mill
├── scala-cli
├── scala-cli-src
├── scala-cli.bat
├── scala-cli.sh
└── website/
├── .gitignore
├── README.md
├── babel.config.js
├── docs/
│ ├── _advanced_install.mdx
│ ├── _misc/
│ │ ├── _category_.json
│ │ ├── benchmarking.md
│ │ └── browse.md
│ ├── _scala-ecosystem.md
│ ├── commands/
│ │ ├── _category_.json
│ │ ├── basics.md
│ │ ├── clean.md
│ │ ├── compile.md
│ │ ├── completions.md
│ │ ├── config.md
│ │ ├── doc.md
│ │ ├── export.md
│ │ ├── fix.md
│ │ ├── fmt.md
│ │ ├── misc/
│ │ │ ├── _category_.json
│ │ │ ├── bloop.md
│ │ │ ├── default-file.md
│ │ │ └── pgp.md
│ │ ├── package.md
│ │ ├── publishing/
│ │ │ ├── _category_.json
│ │ │ ├── publish-local.md
│ │ │ ├── publish-setup.md
│ │ │ └── publish.md
│ │ ├── repl.md
│ │ ├── run.md
│ │ ├── setup-ide.md
│ │ ├── shebang.md
│ │ ├── test.md
│ │ └── version.md
│ ├── cookbooks/
│ │ ├── _category_.json
│ │ ├── ide/
│ │ │ ├── _category_.json
│ │ │ ├── emacs.md
│ │ │ ├── intellij-multi-bsp.md
│ │ │ ├── intellij-sbt-with-bsp.md
│ │ │ ├── intellij.md
│ │ │ └── vscode.md
│ │ ├── intro.md
│ │ ├── introduction/
│ │ │ ├── _category_.json
│ │ │ ├── debugging.md
│ │ │ ├── formatting.md
│ │ │ ├── gh-action.md
│ │ │ ├── gists.md
│ │ │ ├── instant-startup-scala-scripts.md
│ │ │ ├── scala-jvm.md
│ │ │ ├── scala-scripts.md
│ │ │ ├── scala-versions.md
│ │ │ ├── show-sources.md
│ │ │ └── test-only.md
│ │ └── package/
│ │ ├── _category_.json
│ │ ├── native-images.md
│ │ ├── scala-docker.md
│ │ └── scala-package.md
│ ├── getting_started.md
│ ├── guides/
│ │ ├── _category_.json
│ │ ├── advanced/
│ │ │ ├── _category_.json
│ │ │ ├── custom-toolkit.md
│ │ │ ├── internals.md
│ │ │ ├── java-properties.md
│ │ │ ├── piping.md
│ │ │ ├── scala-js.md
│ │ │ ├── scala-native.md
│ │ │ ├── snippets.md
│ │ │ └── verbosity.md
│ │ ├── intro.md
│ │ ├── introduction/
│ │ │ ├── _category_.json
│ │ │ ├── configuration.md
│ │ │ ├── dependencies.md
│ │ │ ├── ide.md
│ │ │ ├── old-runner-migration.md
│ │ │ ├── toolkit.md
│ │ │ ├── update-dependencies.md
│ │ │ └── using-directives.md
│ │ ├── power/
│ │ │ ├── _category_.json
│ │ │ ├── markdown.md
│ │ │ ├── offline.md
│ │ │ ├── proxy.md
│ │ │ ├── python.md
│ │ │ ├── repositories.md
│ │ │ └── sbt-mill.md
│ │ └── scripting/
│ │ ├── _category_.json
│ │ ├── scripts.md
│ │ └── shebang.md
│ ├── overview.md
│ ├── reference/
│ │ ├── _category_.json
│ │ ├── build-info.md
│ │ ├── cli-options.md
│ │ ├── commands.md
│ │ ├── dependency.md
│ │ ├── directives.md
│ │ ├── env-vars.md
│ │ ├── password-options.md
│ │ ├── root-dir.md
│ │ ├── scala-command/
│ │ │ ├── cli-options.md
│ │ │ ├── commands.md
│ │ │ ├── directives.md
│ │ │ ├── env-vars.md
│ │ │ ├── index.md
│ │ │ └── runner-specification.md
│ │ └── scala-versions.md
│ ├── release_notes.md
│ └── under-the-hood.md
├── docusaurus.config.js
├── package.json
├── safe-yarn.sh
├── sidebars.js
├── src/
│ ├── components/
│ │ ├── BasicInstall.js
│ │ ├── BigHeader.js
│ │ ├── DownloadButton.js
│ │ ├── IconBox.js
│ │ ├── ImageBox.js
│ │ ├── Layouts.js
│ │ ├── MarkdownComponents.js
│ │ ├── Section.js
│ │ ├── SectionAbout.js
│ │ ├── SectionImageBox.js
│ │ ├── SmallHeader.js
│ │ ├── TitleSection.js
│ │ ├── UseCase.js
│ │ ├── UseCaseTile.js
│ │ ├── YellowBanner.js
│ │ ├── features.js
│ │ └── osUtils.js
│ ├── css/
│ │ ├── custom copy.css
│ │ └── custom.css
│ ├── pages/
│ │ ├── education.js
│ │ ├── index.js
│ │ ├── index.module.css
│ │ ├── install.js
│ │ ├── markdown-page.md
│ │ ├── projects.js
│ │ ├── prototyping.js
│ │ ├── scripting.js
│ │ └── spark.md
│ ├── scss/
│ │ ├── _variables.scss
│ │ ├── components/
│ │ │ ├── runnable-sample.scss
│ │ │ ├── section-about.scss
│ │ │ ├── section-base.scss
│ │ │ ├── section-features.scss
│ │ │ ├── section-image-box.scss
│ │ │ ├── section-install-cli.scss
│ │ │ ├── section-use-tiles.scss
│ │ │ ├── section-yellow-banner.scss
│ │ │ └── tooltip.scss
│ │ └── style.scss
│ └── theme/
│ └── Root.js
└── static/
├── .nojekyll
└── CNAME
SYMBOL INDEX (138 symbols across 43 files)
FILE: modules/build/src/main/java/scala/build/internal/Chdir.java
class Chdir (line 5) | public final class Chdir {
method available (line 7) | public static boolean available() {
method chdir (line 11) | public static void chdir(String path) throws ErrnoException {
FILE: modules/build/src/main/java/scala/build/internal/ChdirGraalvm.java
class ChdirGraalvm (line 14) | @TargetClass(className = "scala.build.internal.Chdir")
method available (line 18) | @Substitute
method chdir (line 23) | @Substitute
FILE: modules/build/src/main/java/scala/build/internal/GraalvmUnistdExtras.java
class GraalvmUnistdExtras (line 11) | @CContext(PosixDirectives.class)
method chdir (line 15) | @CFunction
FILE: modules/build/src/main/java/scala/build/internal/JavaParserProxyMakerSubst.java
class JavaParserProxyMakerSubst (line 14) | @TargetClass(className = "scala.build.internal.JavaParserProxyMaker")
method get (line 16) | @Substitute
FILE: modules/cli/src/main/java/scala/cli/commands/pgp/PgpCommandsSubst.java
class PgpCommandsSubst (line 8) | @TargetClass(className = "scala.cli.commands.pgp.PgpCommands")
method allScalaCommands (line 10) | @Substitute
method allExternalCommands (line 14) | @Substitute
FILE: modules/cli/src/main/java/scala/cli/commands/publish/PgpProxyMakerSubst.java
class PgpProxyMakerSubst (line 11) | @TargetClass(className = "scala.cli.commands.pgp.PgpProxyMaker")
method get (line 13) | @Substitute
FILE: modules/cli/src/main/java/scala/cli/internal/Argv0Subst.java
class Argv0Subst (line 10) | @TargetClass(className = "scala.cli.internal.Argv0")
method get (line 14) | @Substitute
FILE: modules/cli/src/main/java/scala/cli/internal/Argv0SubstWindows.java
class Argv0SubstWindows (line 10) | @TargetClass(className = "scala.cli.internal.Argv0")
method get (line 14) | @Substitute
FILE: modules/cli/src/main/java/scala/cli/internal/BouncycastleSignerMakerSubst.java
class BouncycastleSignerMakerSubst (line 18) | @TargetClass(className = "scala.cli.publish.BouncycastleSignerMaker")
method get (line 21) | @Substitute
method maybeInit (line 32) | @Substitute
FILE: modules/cli/src/main/java/scala/cli/internal/CsJniUtilsFeature.java
class CsJniUtilsFeature (line 12) | @AutomaticFeature
method beforeAnalysis (line 16) | @Override
FILE: modules/cli/src/main/java/scala/cli/internal/LibsodiumjniFeature.java
class LibsodiumjniFeature (line 13) | @AutomaticFeature
method beforeAnalysis (line 17) | @Override
FILE: modules/cli/src/main/java/scala/cli/internal/PPrintStringPrefixSubst.java
class PPrintStringPrefixSubst (line 8) | @TargetClass(className = "pprint.StringPrefix$")
method apply (line 11) | @Substitute
FILE: modules/cli/src/main/java/scala/cli/internal/PidSubst.java
class PidSubst (line 11) | @TargetClass(className = "scala.cli.internal.Pid")
method get (line 15) | @Substitute
FILE: modules/integration/src/test/java/scala/cli/integration/bsp/WrappedSourceItem.java
class WrappedSourceItem (line 3) | public class WrappedSourceItem {
FILE: modules/integration/src/test/java/scala/cli/integration/bsp/WrappedSourcesItem.java
class WrappedSourcesItem (line 6) | public class WrappedSourcesItem {
FILE: modules/integration/src/test/java/scala/cli/integration/bsp/WrappedSourcesResult.java
class WrappedSourcesResult (line 5) | public class WrappedSourcesResult {
FILE: modules/java-test-runner/src/main/java/scala/build/testrunner/JavaAsmTestRunner.java
class JavaAsmTestRunner (line 14) | public class JavaAsmTestRunner {
class ParentInspector (line 16) | public static class ParentInspector {
method ParentInspector (line 21) | public ParentInspector(List<Path> classPath, JavaTestLogger logger) {
method parents (line 26) | private List<String> parents(String className) {
method allParents (line 37) | public List<String> allParents(String className) {
method matchFingerprints (line 52) | public static Optional<Fingerprint> matchFingerprints(
method findFrameworkServices (line 105) | public static List<String> findFrameworkServices(List<Path> classPath,...
method parseServiceFileContent (line 114) | private static void parseServiceFileContent(String content, List<Strin...
method findFrameworks (line 123) | public static List<String> findFrameworks(
method taskDefs (line 162) | public static List<TaskDef> taskDefs(
method listClassesByteCode (line 195) | private static Map<String, byte[]> listClassesByteCode(
method listClassesByteCode (line 205) | private static Map<String, byte[]> listClassesByteCode(
method findInClassPath (line 249) | static byte[] findInClassPath(List<Path> classPath, String name, JavaT...
method findInClassPathEntry (line 257) | private static byte[] findInClassPathEntry(Path entry, String name, Ja...
class TestClassChecker (line 289) | public static class TestClassChecker extends ClassVisitor {
method TestClassChecker (line 296) | public TestClassChecker() {
method visit (line 300) | @Override
method visitMethod (line 314) | @Override
method getName (line 323) | public String getName() { return name; }
method getPublicConstructorCount (line 324) | public int getPublicConstructorCount() { return publicConstructorCou...
method isInterface (line 325) | public boolean isInterface() { return isInterface; }
method isAbstract (line 326) | public boolean isAbstract() { return isAbstract; }
method getImplements (line 327) | public List<String> getImplements() { return implementsList; }
FILE: modules/java-test-runner/src/main/java/scala/build/testrunner/JavaDynamicTestRunner.java
class JavaDynamicTestRunner (line 11) | public class JavaDynamicTestRunner {
method globPattern (line 19) | private static Pattern globPattern(String expr) {
method main (line 29) | public static void main(String[] args) {
FILE: modules/java-test-runner/src/main/java/scala/build/testrunner/JavaFrameworkUtils.java
class JavaFrameworkUtils (line 14) | public class JavaFrameworkUtils {
method findFrameworkServices (line 16) | public static List<Framework> findFrameworkServices(ClassLoader loader) {
method loadFramework (line 25) | public static Framework loadFramework(ClassLoader loader, String class...
method findFrameworks (line 30) | public static List<Framework> findFrameworks(
method matchFingerprints (line 74) | public static Optional<Fingerprint> matchFingerprints(
method getFrameworksToRun (line 126) | public static List<Framework> getFrameworksToRun(
method getFrameworksToRun (line 136) | public static List<Framework> getFrameworksToRun(
method listClasses (line 158) | public static List<String> listClasses(List<Path> classPath, boolean k...
method listClasses (line 166) | public static List<String> listClasses(Path entry, boolean keepJars, J...
FILE: modules/java-test-runner/src/main/java/scala/build/testrunner/JavaTestLogger.java
class JavaTestLogger (line 5) | public class JavaTestLogger {
method JavaTestLogger (line 9) | public JavaTestLogger(int verbosity, PrintStream out) {
method error (line 14) | public void error(String message) {
method message (line 18) | public void message(String message) {
method log (line 22) | public void log(String message) {
method debug (line 26) | public void debug(String message) {
FILE: modules/java-test-runner/src/main/java/scala/build/testrunner/JavaTestRunner.java
class JavaTestRunner (line 16) | public class JavaTestRunner {
method commonTestFrameworks (line 18) | public static List<String> commonTestFrameworks() {
method classPath (line 25) | public static List<Path> classPath(ClassLoader loader, JavaTestLogger ...
method collectClassPath (line 31) | private static void collectClassPath(ClassLoader loader, List<Path> re...
method runTasks (line 56) | public static List<Event> runTasks(List<Task> initialTasks, PrintStrea...
FILE: modules/scala-cli-bsp/src/main/java/scala/build/bsp/ScalaScriptBuildServer.java
type ScalaScriptBuildServer (line 7) | public interface ScalaScriptBuildServer {
method buildTargetWrappedSources (line 9) | @JsonRequest("buildTarget/wrappedSources")
FILE: modules/scala-cli-bsp/src/main/java/scala/build/bsp/WrappedSourceItem.java
class WrappedSourceItem (line 8) | public class WrappedSourceItem {
method WrappedSourceItem (line 17) | public WrappedSourceItem(@NonNull final String uri, @NonNull final Str...
method getUri (line 22) | @Pure
method setUri (line 28) | public void setUri(@NonNull final String uri) {
method getGeneratedUri (line 32) | @Pure
method setGeneratedUri (line 38) | public void setGeneratedUri(@NonNull final String generatedUri) {
method getTopWrapper (line 42) | @Pure
method setTopWrapper (line 47) | public void setTopWrapper(final String topWrapper) {
method getBottomWrapper (line 51) | @Pure
method setBottomWrapper (line 56) | public void setBottomWrapper(final String bottomWrapper) {
method toString (line 60) | @Override
method equals (line 71) | @Override
method hashCode (line 104) | @Override
FILE: modules/scala-cli-bsp/src/main/java/scala/build/bsp/WrappedSourcesItem.java
class WrappedSourcesItem (line 10) | public class WrappedSourcesItem {
method WrappedSourcesItem (line 17) | public WrappedSourcesItem(@NonNull final BuildTargetIdentifier target,...
method getTarget (line 22) | @Pure
method setTarget (line 28) | public void setTarget(@NonNull final BuildTargetIdentifier target) {
method getSources (line 32) | @Pure
method setSources (line 38) | public void setSources(@NonNull final List<WrappedSourceItem> sources) {
method toString (line 42) | @Override
method equals (line 51) | @Override
method hashCode (line 74) | @Override
FILE: modules/scala-cli-bsp/src/main/java/scala/build/bsp/WrappedSourcesParams.java
class WrappedSourcesParams (line 9) | public class WrappedSourcesParams {
method WrappedSourcesParams (line 13) | public WrappedSourcesParams(@NonNull final List<BuildTargetIdentifier>...
method getTargets (line 17) | @Pure
method toString (line 23) | @Override
method equals (line 31) | @Override
method hashCode (line 49) | @Override
FILE: modules/scala-cli-bsp/src/main/java/scala/build/bsp/WrappedSourcesResult.java
class WrappedSourcesResult (line 9) | @SuppressWarnings("all")
method WrappedSourcesResult (line 14) | public WrappedSourcesResult(@NonNull final List<WrappedSourcesItem> it...
method getItems (line 18) | @Pure
method setItems (line 24) | public void setItems(@NonNull final List<WrappedSourcesItem> items) {
method toString (line 28) | @Override
method equals (line 36) | @Override
method hashCode (line 54) | @Override
FILE: website/src/components/BasicInstall.js
function BasicInstall (line 7) | function BasicInstall(props){
FILE: website/src/components/BigHeader.js
function BigHeader (line 3) | function BigHeader(props){
FILE: website/src/components/DownloadButton.js
class DownloadButton (line 3) | class DownloadButton extends React.Component {
method constructor (line 5) | constructor(props) {
method handleClick (line 11) | handleClick(e) {
method render (line 15) | render() {
FILE: website/src/components/IconBox.js
function IconBox (line 3) | function IconBox(props){
FILE: website/src/components/ImageBox.js
function ImageBox (line 5) | function ImageBox(props){
FILE: website/src/components/Layouts.js
function HeaderSection (line 3) | function HeaderSection(props){
function TitledSection (line 14) | function TitledSection(props){
FILE: website/src/components/MarkdownComponents.js
function ChainedSnippets (line 4) | function ChainedSnippets({children}){
function GiflikeVideo (line 12) | function GiflikeVideo({url}){
FILE: website/src/components/Section.js
function Section (line 3) | function Section(props){
FILE: website/src/components/SectionAbout.js
function SectionAbout (line 3) | function SectionAbout(props){
FILE: website/src/components/SectionImageBox.js
function SectionImageBox (line 7) | function SectionImageBox(props){
FILE: website/src/components/SmallHeader.js
function SmallHeader (line 3) | function SmallHeader(props){
FILE: website/src/components/TitleSection.js
function TitleSection (line 3) | function TitleSection(props){
FILE: website/src/components/UseCase.js
function UseCase (line 8) | function UseCase(props){
FILE: website/src/components/UseCaseTile.js
function UseCaseTile (line 3) | function UseCaseTile(props) {
FILE: website/src/components/YellowBanner.js
function YellowBanner (line 5) | function YellowBanner(props){
FILE: website/src/components/features.js
function allImageBoxs (line 115) | function allImageBoxs() {
FILE: website/src/theme/Root.js
function Root (line 6) | function Root({children}) {
Condensed preview — 1105 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (5,051K chars).
[
{
"path": ".dockerignore",
"chars": 78,
"preview": "./out\n.bloop\n.bsp\n.metals\n.scala-build\n.scala\ngifs\nwebsite\n.github\nDockerfile\n"
},
{
"path": ".git-blame-ignore-revs",
"chars": 440,
"preview": "# Scala Steward: Reformat with scalafmt 3.7.3\n34ae72e8cf5878dccb44ac3f864cbf4892f18354\n\n# Scala Steward: Reformat with s"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.md",
"chars": 516,
"preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: bug\nassignees: ''\n\n---\n\n**Version(s)**\n"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.md",
"chars": 604,
"preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: enhancement\nassignees: ''\n\n---\n\n**Is"
},
{
"path": ".github/ISSUE_TEMPLATE/new_release.md",
"chars": 963,
"preview": "---\nname: Plan a release\nabout: Plan releasing a new version\ntitle: \"Release v[VERSION]\"\nlabels: internal\nassignees: ''\n"
},
{
"path": ".github/ISSUE_TEMPLATE/other.md",
"chars": 734,
"preview": "---\nname: Other\nabout: Request a change that is neither a new feature nor related to a bug.\ntitle: ''\nlabels: ''\nassigne"
},
{
"path": ".github/actions/windows-reg-import/action.yml",
"chars": 1481,
"preview": "name: windows-reg-import\ndescription: Import a .reg file and verify those registry values (best-effort)\ninputs:\n reg-fi"
},
{
"path": ".github/dependabot.yml",
"chars": 350,
"preview": "version: 2\nupdates:\n - package-ecosystem: \"github-actions\"\n directory: \"/\"\n schedule:\n interval: \"weekly\"\n "
},
{
"path": ".github/pull_request_template.md",
"chars": 1228,
"preview": "<!-- Fixes #XYZ (where XYZ is the issue number from the issue tracker) -->\n\n<!-- TODO description of the change -->\n\n<!-"
},
{
"path": ".github/release/release-notes-regexes.md",
"chars": 2248,
"preview": "# Regexes for preparing Scala CLI release notes\n\nWhen auto-generating release notes from the GitHub UI, the notes will c"
},
{
"path": ".github/release/release-procedure.md",
"chars": 2814,
"preview": "# Release procedure reference\n\n- [ ] Draft release notes using the `Draft new release` button in the `Releases` section "
},
{
"path": ".github/release/windows-antimalware-analysis.md",
"chars": 3419,
"preview": "# Microsoft anti-malware analysis\n\nAs new Scala CLI are (wrongly) assumed to be PUA (potentially unwanted applications) "
},
{
"path": ".github/scripts/build-website.sh",
"chars": 80,
"preview": "#!/usr/bin/env bash\nset -e\n\nyarn --cwd website install\nyarn --cwd website build\n"
},
{
"path": ".github/scripts/check-cross-version-deps.sc",
"chars": 2315,
"preview": "#!/usr/bin/env -S scala-cli shebang\n//> using scala 3\n//> using toolkit default\n//> using options -Werror -Wunused:all\n\n"
},
{
"path": ".github/scripts/check-override-keywords.sh",
"chars": 1946,
"preview": "#!/usr/bin/env bash\nset -euo pipefail\n\n# Checks the PR body for [test_*] override keywords.\n# Inputs (env vars): EVENT_N"
},
{
"path": ".github/scripts/choco/scala-cli.nuspec",
"chars": 1403,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<package xmlns=\"http://schemas.microsoft.com/packaging/2015/06/nuspec.xsd\">\n <me"
},
{
"path": ".github/scripts/choco/tools/chocolateyinstall.ps1",
"chars": 358,
"preview": "$ErrorActionPreference = 'Stop';\n$url64 = '@LAUNCHER_URL@'\n$packageArgs = @{\n packageName = 'scala-cli'\n fileTy"
},
{
"path": ".github/scripts/classify-changes.sh",
"chars": 2134,
"preview": "#!/usr/bin/env bash\nset -euo pipefail\n\n# Classifies changed files into categories for CI job filtering.\n# Inputs (env va"
},
{
"path": ".github/scripts/docker/ScalaCliDockerFile",
"chars": 462,
"preview": "FROM debian:stable-slim\nRUN apt update && apt install build-essential libz-dev clang procps -y\nADD scala-cli /usr/bin/\nR"
},
{
"path": ".github/scripts/docker/ScalaCliSlimDockerFile",
"chars": 240,
"preview": "FROM debian:stable-slim AS build-env\n\nFROM gcr.io/distroless/base-debian12\nADD scala-cli /usr/local/bin/scala-cli\nCOPY -"
},
{
"path": ".github/scripts/generate-docker-image.sh",
"chars": 308,
"preview": "#!/usr/bin/env bash\nset -eu\n\nROOT=\"$(cd \"$(dirname \"$0\")/../..\" && pwd)\"\nWORKDIR=\"$ROOT/out/docker-workdir\"\n\nmkdir -p \"$"
},
{
"path": ".github/scripts/generate-junit-reports.sc",
"chars": 5011,
"preview": "#!/usr/bin/env -S scala-cli shebang\n//> using scala 3\n//> using toolkit default\n//> using dep org.scala-lang.modules::sc"
},
{
"path": ".github/scripts/generate-native-image.sh",
"chars": 2623,
"preview": "#!/usr/bin/env bash\nset -e\n\nCOMMAND=\"cli[].base-image.writeDefaultNativeImageScript\"\n\n# temporary, until we pass JPMS op"
},
{
"path": ".github/scripts/generate-os-packages.sh",
"chars": 4616,
"preview": "#!/usr/bin/env bash\nset -eu\n\nARCHITECTURE=\"x86_64\" # Set the default architecture\nif [[ \"$OSTYPE\" == \"linux-gnu\"* ]] || "
},
{
"path": ".github/scripts/generate-slim-docker-image.sh",
"chars": 328,
"preview": "#!/usr/bin/env bash\nset -eu\n\nROOT=\"$(cd \"$(dirname \"$0\")/../..\" && pwd)\"\nWORKDIR=\"$ROOT/out/docker-slim-workdir\"\n\nmkdir "
},
{
"path": ".github/scripts/get-latest-cs.sh",
"chars": 196,
"preview": "#!/usr/bin/env bash\nset -e\n\nCS_VERSION=\"2.1.25-M24\"\n\nDIR=\"$(cs get --archive \"https://github.com/coursier/coursier/relea"
},
{
"path": ".github/scripts/gpg-setup.sh",
"chars": 354,
"preview": "#!/usr/bin/env sh\n\n# from https://github.com/coursier/apps/blob/f1d2bf568bf466a98569a85c3f23c5f3a8eb5360/.github/scripts"
},
{
"path": ".github/scripts/process_release_notes.sc",
"chars": 6310,
"preview": "#!/usr/bin/env -S scala-cli shebang\n//> using scala 3\n//> using toolkit default\n//> using options -Werror -Wunused:all\n\n"
},
{
"path": ".github/scripts/publish-docker-images.sh",
"chars": 316,
"preview": "#!/usr/bin/env bash\nset -eu\n\nRAW_VERSION=\"$(./mill -i ci.publishVersion)\"\nSCALA_CLI_VERSION=\"${RAW_VERSION##* }\"\n\ndocker"
},
{
"path": ".github/scripts/publish-sdkman.sh",
"chars": 2019,
"preview": "#!/usr/bin/env bash\n\n# from https://github.com/lampepfl/dotty/blob/37e997abc2bf4d42321492acaf7f7832ee7ce146/.github/work"
},
{
"path": ".github/scripts/publish-slim-docker-images.sh",
"chars": 346,
"preview": "#!/usr/bin/env bash\nset -eu\n\nRAW_VERSION=\"$(./mill -i ci.publishVersion)\"\nSCALA_CLI_VERSION=\"${RAW_VERSION##* }\"\n\ndocker"
},
{
"path": ".github/scripts/scala-cli.rb.template",
"chars": 988,
"preview": "# typed: false\n# frozen_string_literal: true\n\n# ScalaCli Formula\nclass ScalaCli < Formula\n desc \"Launcher for ScalaCli\""
},
{
"path": ".github/scripts/scala.rb.template",
"chars": 1052,
"preview": "# typed: false\n# frozen_string_literal: true\n\n# Experimental Scala Formula\nclass Scala < Formula\n desc \"Experimental la"
},
{
"path": ".github/scripts/update-website.sh",
"chars": 171,
"preview": "#!/usr/bin/env bash\nset -e\n\ngit config --global user.name \"gh-actions\"\ngit config --global user.email \"actions@github.co"
},
{
"path": ".github/scripts/verify_old_cpus.sh",
"chars": 588,
"preview": "#!/usr/bin/env bash\nset -e\n\n# Verifies that the native launcher runs on older x86_64 CPUs (without AVX/AVX2/FMA).\n# Uses"
},
{
"path": ".github/workflows/ci.yml",
"chars": 83896,
"preview": "name: CI\non:\n push:\n branches:\n - main\n tags:\n - \"v*\"\n pull_request:\n workflow_dispatch:\n\nconcurrency:\n "
},
{
"path": ".github/workflows/publish-docker.yml",
"chars": 5136,
"preview": "name: Create and publish a Docker image\n\nconcurrency:\n group: ${{ github.workflow }}-${{ github.ref }}\n cancel-in-prog"
},
{
"path": ".github/workflows/test-report.yml",
"chars": 428,
"preview": "name: 'Test Report'\non:\n workflow_run:\n workflows: ['CI']\n types:\n - completed\npermissions:\n statuses: writ"
},
{
"path": ".github/workflows/website.yaml",
"chars": 809,
"preview": "name: Website deploy\non:\n push:\n branches:\n - stable\n\njobs:\n update-website:\n runs-on: ubuntu-latest\n step"
},
{
"path": ".gitignore",
"chars": 149,
"preview": "out/\n.bloop/\n.metals/\n.vscode/\n.idea/\n.cursor/\n\n.bsp\n.scala-build\ndest/\ntarget/\n\n*/scoverage.coverage\n\n# ignore vim back"
},
{
"path": ".mill-jvm-opts",
"chars": 53,
"preview": "-Xmx2048m\n-Xms128m\n-Xss8m\n-Dxsbt.skip.cp.lookup=true\n"
},
{
"path": ".mill-version",
"chars": 6,
"preview": "1.1.5\n"
},
{
"path": ".scala-steward.conf",
"chars": 133,
"preview": "postUpdateHooks = [{\n command = [\"./mill\", \"-i\", \"generate-reference-doc[].run\"],\n commitMessage = \"Generate the refer"
},
{
"path": ".scalafix.conf",
"chars": 437,
"preview": "rules = [\n DisableSyntax,\n RemoveUnused,\n OrganizeImports,\n NoValInForComprehension,\n ProcedureSyntax\n]\nDisableSyn"
},
{
"path": ".scalafix3.conf",
"chars": 464,
"preview": "rules = [\n DisableSyntax,\n RemoveUnused,\n OrganizeImports,\n NoValInForComprehension,\n # ProcedureSyntax\n]\nDisableS"
},
{
"path": ".scalafmt.conf",
"chars": 852,
"preview": "version = \"3.10.7\"\n\nalign.preset = more\nmaxColumn = 100\nassumeStandardLibraryStripMargin = true\nindent.defnSite = 2\ninde"
},
{
"path": "AGENTS.md",
"chars": 11118,
"preview": "# AGENTS.md — Guidance for AI agents contributing to Scala CLI\n\nShort reference for AI agents. For task-specific guidanc"
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 209,
"preview": "Scala CLI uses the [Scala Code of Conduct](https://scala-lang.org/conduct/) for all communication and discussion. This i"
},
{
"path": "CONTRIBUTING.md",
"chars": 3552,
"preview": "# Thanks for contributing to Scala CLI!\n\nThis doc is meant as a guide on how best to contribute to Scala CLI.\n\n## Creati"
},
{
"path": "DEV.md",
"chars": 13452,
"preview": "## Developer docs\n\n### Requirements\n\nBuilding Scala CLI requires JVM 17 to work properly.\n\nIn theory, our build is able "
},
{
"path": "Dockerfile",
"chars": 737,
"preview": "FROM eclipse-temurin:17 as build\nRUN apt update && apt install build-essential libz-dev clang procps git -y\nWORKDIR /wor"
},
{
"path": "INTERNALS.md",
"chars": 4605,
"preview": "# Internals overview\n\n## Modules\n\nModules live under `modules/`. Each sub-directory there has a\ncorresponding mill modul"
},
{
"path": "LICENSE",
"chars": 11358,
"preview": "\n Apache License\n Version 2.0, January 2004\n "
},
{
"path": "LLM_POLICY.md",
"chars": 453,
"preview": "# Policy regarding LLM-generated code in contributions to Scala CLI\n\nScala CLI accepts contributions containing code pro"
},
{
"path": "README.md",
"chars": 1588,
"preview": "# scala-cli\n\n[](https://github.com/VirtusL"
},
{
"path": "agentskills/README.md",
"chars": 498,
"preview": "# Agent skills (Scala CLI)\n\nThis directory holds **agent skills** — task-specific guidance loaded on demand by AI coding"
},
{
"path": "agentskills/adding-directives/SKILL.md",
"chars": 1235,
"preview": "---\nname: scala-cli-adding-directives\ndescription: Add or change using directives in Scala CLI. Use when adding a new //"
},
{
"path": "agentskills/integration-tests/SKILL.md",
"chars": 1163,
"preview": "---\nname: scala-cli-integration-tests\ndescription: Add or run Scala CLI integration tests. Use when adding integration t"
},
{
"path": "build.mill",
"chars": 84866,
"preview": "//| mill-jvm-version: system|17\n//| mvnDeps:\n//| - io.github.alexarchambault.mill::mill-native-image::0.2.4\n//| - io.git"
},
{
"path": "gcbenchmark/.gitignore",
"chars": 6,
"preview": "tmp-*\n"
},
{
"path": "gcbenchmark/README.md",
"chars": 78,
"preview": "Simple tool to analyze memory usage of bloop running with certain JVM options\n"
},
{
"path": "gcbenchmark/gcbenchmark.scala",
"chars": 3758,
"preview": "//> using dep com.lihaoyi::os-lib:0.9.1\n//> using dep com.lihaoyi::pprint:0.9.6\n//> using scala 2.13\n\n// Usage: scala-cl"
},
{
"path": "gifs/Dockerfile",
"chars": 673,
"preview": "FROM ubuntu:24.04\n\nRUN curl -fsSL https://deb.nodesource.com/setup_12.x | bash -\nRUN apt-get update\nRUN apt-get install "
},
{
"path": "gifs/README.md",
"chars": 902,
"preview": "# Tooling to generate nice gifs used in documentation\n\nRecordings are possible using https://github.com/paxtonhare/demo-"
},
{
"path": "gifs/create_missing.sc",
"chars": 1642,
"preview": "#!/usr/bin/env scala-cli\n\n//> using lib com.lihaoyi::os-lib:0.7.8\n\n/** Small and handy script to generate stubs for .svg"
},
{
"path": "gifs/demo-magic.sh",
"chars": 4558,
"preview": "#!/usr/bin/env bash\n\n###############################################################################\n#\n# demo-magic.sh\n#"
},
{
"path": "gifs/demo-no-magic.sh",
"chars": 527,
"preview": "# Mock of demo magic, for running on CI\n\nfunction p() {\n echo \"running: $@\"\n}\n\nfunction pe() {\n p \"$@\"\n run_cmd \"$@\"\n"
},
{
"path": "gifs/example.sh",
"chars": 594,
"preview": "#!/bin/bash\n\n########################\n# include the magic\n########################\n\nSCRIPT_DIR=$(cd \"$(dirname \"${BASH_S"
},
{
"path": "gifs/run_scenario.sh",
"chars": 852,
"preview": "#!/usr/bin/env bash\n\nset -euxo pipefail\n\nSCRIPT_DIR=$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" &> /dev/null && pwd)\n\nif [ \"$#"
},
{
"path": "gifs/scenarios/complete-install.sh",
"chars": 789,
"preview": "#!/bin/bash\n\nset -e\n\n########################\n# include the magic\n########################\n\nSCRIPT_DIR=$(cd \"$(dirname \""
},
{
"path": "gifs/scenarios/defaults.sh",
"chars": 714,
"preview": "#!/bin/bash\n\nset -e\n\n########################\n# include the magic\n########################\n\nSCRIPT_DIR=$(cd \"$(dirname \""
},
{
"path": "gifs/scenarios/demo.sh",
"chars": 1574,
"preview": "#!/bin/bash\n\nset -e\n\n########################\n# include the magic\n########################\n\nSCRIPT_DIR=$(cd \"$(dirname \""
},
{
"path": "gifs/scenarios/education.sh",
"chars": 840,
"preview": "#!/bin/bash\n\nset -e\n\n########################\n# include the magic\n########################\n\nSCRIPT_DIR=$(cd \"$(dirname \""
},
{
"path": "gifs/scenarios/embeddable_scripts.sh",
"chars": 799,
"preview": "#!/bin/bash\n\n########################\n# include the magic\n########################\n\nSCRIPT_DIR=$(cd \"$(dirname \"${BASH_S"
},
{
"path": "gifs/scenarios/fast-scripts.sh",
"chars": 664,
"preview": "#!/bin/bash\n\nset -e\n\n########################\n# include the magic\n########################\n\nSCRIPT_DIR=$(cd \"$(dirname \""
},
{
"path": "gifs/scenarios/learning_curve.sh",
"chars": 843,
"preview": "#!/bin/bash\n\nset -e\n\n########################\n# include the magic\n########################\n\nSCRIPT_DIR=$(cd \"$(dirname \""
},
{
"path": "gifs/scenarios/powerful_scripts.sh",
"chars": 904,
"preview": "#!/bin/bash\n\nset -e\n\n########################\n# include the magic\n########################\n\nSCRIPT_DIR=$(cd \"$(dirname \""
},
{
"path": "gifs/scenarios/projects.sh",
"chars": 1130,
"preview": "#!/bin/bash\n\nset -e\n\n########################\n# include the magic\n########################\n\nSCRIPT_DIR=$(cd \"$(dirname \""
},
{
"path": "gifs/scenarios/prototyping.sh",
"chars": 830,
"preview": "#!/bin/bash\n\nset -e\n\n########################\n# include the magic\n########################\n\nSCRIPT_DIR=$(cd \"$(dirname \""
},
{
"path": "gifs/scenarios/scripting.sh",
"chars": 1174,
"preview": "#!/bin/bash\n\nset -e\n\n########################\n# include the magic\n########################\n\nSCRIPT_DIR=$(cd \"$(dirname \""
},
{
"path": "gifs/scenarios/self-contained-examples.sh",
"chars": 825,
"preview": "#!/bin/bash\n\nset -e\n\n########################\n# include the magic\n########################\n\nSCRIPT_DIR=$(cd \"$(dirname \""
},
{
"path": "gifs/scenarios/todo.sh",
"chars": 533,
"preview": "#!/bin/bash\n\nset -e\n\n########################\n# include the magic\n########################\n\nSCRIPT_DIR=$(cd \"$(dirname \""
},
{
"path": "gifs/scenarios/universal_tool.sh",
"chars": 944,
"preview": "#!/bin/bash\n\nset -e\n\n########################\n# include the magic\n########################\n\nSCRIPT_DIR=$(cd \"$(dirname \""
},
{
"path": "gifs/scenarios/versions.sh",
"chars": 2671,
"preview": "#!/bin/bash\n\nset -e\n\n########################\n# include the magic\n########################\n\nSCRIPT_DIR=$(cd \"$(dirname \""
},
{
"path": "gifs/svg_render/Dockerfile",
"chars": 460,
"preview": "FROM node:12.18.1\n\nRUN npm install -g svg-term-cli\n\nRUN mkdir /profiles\n\n# Terminal themes for light and dark mode of th"
},
{
"path": "gifs/svg_render/README.md",
"chars": 224,
"preview": "This is docker image that is used to generate our scripts.\n\nThe image is based on amazing svg-term-cli project by marion"
},
{
"path": "mill",
"chars": 3014,
"preview": "#!/usr/bin/env bash\n\n# Adapted from\n\ncoursier_version=\"2.1.25-M24\"\nCOMMAND=$@\n\n# necessary for Windows various shell env"
},
{
"path": "mill.bat",
"chars": 9898,
"preview": "@echo off\n\nsetlocal enabledelayedexpansion\n\nif [!DEFAULT_MILL_VERSION!]==[] ( set \"DEFAULT_MILL_VERSION=1.1.5\" )\n\nif [!M"
},
{
"path": "millw",
"chars": 6647,
"preview": "#!/usr/bin/env sh\n\nset -e\n\nif [ -z \"${DEFAULT_MILL_VERSION}\" ] ; then DEFAULT_MILL_VERSION=\"1.1.5\"; fi\n\nif [ -z \"${GITHU"
},
{
"path": "modules/build/src/main/java/scala/build/internal/Chdir.java",
"chars": 283,
"preview": "package scala.build.internal;\n\nimport coursier.exec.ErrnoException;\n\npublic final class Chdir {\n\n public static boolean"
},
{
"path": "modules/build/src/main/java/scala/build/internal/ChdirGraalvm.java",
"chars": 1115,
"preview": "package scala.build.internal;\n\nimport java.io.FileNotFoundException;\n\nimport com.oracle.svm.core.annotate.Substitute;\nim"
},
{
"path": "modules/build/src/main/java/scala/build/internal/GraalvmUnistdExtras.java",
"chars": 580,
"preview": "package scala.build.internal;\n\nimport com.oracle.svm.core.posix.headers.PosixDirectives;\nimport org.graalvm.nativeimage."
},
{
"path": "modules/build/src/main/java/scala/build/internal/JavaParserProxyMakerSubst.java",
"chars": 780,
"preview": "package scala.build.internal;\n\nimport com.oracle.svm.core.annotate.Substitute;\nimport com.oracle.svm.core.annotate.Targe"
},
{
"path": "modules/build/src/main/scala/scala/build/Bloop.scala",
"chars": 4032,
"preview": "package scala.build\n\nimport bloop.rifle.{BloopRifleConfig, BuildServer}\nimport ch.epfl.scala.bsp4j\nimport coursier.cache"
},
{
"path": "modules/build/src/main/scala/scala/build/BloopBuildClient.scala",
"chars": 565,
"preview": "package scala.build\n\nimport ch.epfl.scala.bsp4j\n\nimport scala.build.options.Scope\n\ntrait BloopBuildClient extends bsp4j."
},
{
"path": "modules/build/src/main/scala/scala/build/Build.scala",
"chars": 52441,
"preview": "package scala.build\n\nimport ch.epfl.scala.bsp4j\nimport com.swoval.files.FileTreeViews.Observer\nimport com.swoval.files.{"
},
{
"path": "modules/build/src/main/scala/scala/build/BuildThreads.scala",
"chars": 611,
"preview": "package scala.build\n\nimport java.util.concurrent.{Executors, ScheduledExecutorService}\n\nimport scala.build.internal.Util"
},
{
"path": "modules/build/src/main/scala/scala/build/Builds.scala",
"chars": 715,
"preview": "package scala.build\n\nimport scala.build.options.Scope\n\nfinal case class Builds(\n builds: Seq[Build],\n crossBuilds: Seq"
},
{
"path": "modules/build/src/main/scala/scala/build/CollectionOps.scala",
"chars": 890,
"preview": "package scala.build\nimport scala.collection.mutable\nobject CollectionOps {\n extension [T](items: Seq[T]) {\n\n /** Wor"
},
{
"path": "modules/build/src/main/scala/scala/build/ConsoleBloopBuildClient.scala",
"chars": 8731,
"preview": "package scala.build\n\nimport ch.epfl.scala.bsp4j\n\nimport java.io.File\nimport java.net.URI\nimport java.nio.file.{NoSuchFil"
},
{
"path": "modules/build/src/main/scala/scala/build/CrossBuildParams.scala",
"chars": 916,
"preview": "package scala.build\n\nimport dependency.ScalaParameters\n\nimport scala.build.internal.Constants\nimport scala.build.options"
},
{
"path": "modules/build/src/main/scala/scala/build/CrossKey.scala",
"chars": 406,
"preview": "package scala.build\n\nimport scala.build.options.{BuildOptions, MaybeScalaVersion, Platform, Scope}\n\nfinal case class Cro"
},
{
"path": "modules/build/src/main/scala/scala/build/CrossSources.scala",
"chars": 20827,
"preview": "package scala.build\n\nimport scala.build.EitherCps.{either, value}\nimport scala.build.Ops.*\nimport scala.build.errors.{\n "
},
{
"path": "modules/build/src/main/scala/scala/build/Directories.scala",
"chars": 3459,
"preview": "package scala.build\n\nimport coursier.paths.shaded.dirs.ProjectDirectories\nimport coursier.paths.shaded.dirs.impl.Windows"
},
{
"path": "modules/build/src/main/scala/scala/build/GeneratedSource.scala",
"chars": 864,
"preview": "package scala.build\n\nimport scala.build.internal.WrapperParams\n\n/** Represents a source that's not originally in the use"
},
{
"path": "modules/build/src/main/scala/scala/build/LocalRepo.scala",
"chars": 3689,
"preview": "package scala.build\nimport coursier.paths.Util\n\nimport java.io.{BufferedInputStream, Closeable}\nimport java.nio.channels"
},
{
"path": "modules/build/src/main/scala/scala/build/PersistentDiagnosticLogger.scala",
"chars": 2019,
"preview": "package scala.build\n\nimport bloop.rifle.BloopRifleLogger\nimport org.scalajs.logging.Logger as ScalaJsLogger\n\nimport java"
},
{
"path": "modules/build/src/main/scala/scala/build/Project.scala",
"chars": 7917,
"preview": "package scala.build\n\nimport _root_.bloop.config.{Config as BloopConfig, ConfigCodecs as BloopCodecs}\nimport _root_.cours"
},
{
"path": "modules/build/src/main/scala/scala/build/ReplArtifacts.scala",
"chars": 6591,
"preview": "package scala.build\n\nimport coursier.cache.FileCache\nimport coursier.core.Repository\nimport coursier.util.Task\nimport de"
},
{
"path": "modules/build/src/main/scala/scala/build/ScalaCompilerParams.scala",
"chars": 218,
"preview": "package scala.build\n\nfinal case class ScalaCompilerParams(\n scalaVersion: String,\n scalaBinaryVersion: String,\n scala"
},
{
"path": "modules/build/src/main/scala/scala/build/ScalafixArtifacts.scala",
"chars": 5228,
"preview": "package scala.build\n\nimport coursier.cache.FileCache\nimport coursier.core.Repository\nimport coursier.util.Task\nimport de"
},
{
"path": "modules/build/src/main/scala/scala/build/ScopedSources.scala",
"chars": 5610,
"preview": "package scala.build\n\nimport java.nio.charset.StandardCharsets\n\nimport scala.build.EitherCps.{either, value}\nimport scala"
},
{
"path": "modules/build/src/main/scala/scala/build/Sources.scala",
"chars": 3816,
"preview": "package scala.build\n\nimport coursier.cache.ArchiveCache\nimport coursier.util.Task\n\nimport java.nio.charset.StandardChars"
},
{
"path": "modules/build/src/main/scala/scala/build/bsp/BloopSession.scala",
"chars": 2555,
"preview": "package scala.build.bsp\n\nimport com.swoval.files.PathWatchers\n\nimport java.util.concurrent.atomic.AtomicReference\n\nimpor"
},
{
"path": "modules/build/src/main/scala/scala/build/bsp/Bsp.scala",
"chars": 776,
"preview": "package scala.build.bsp\n\nimport java.io.{InputStream, OutputStream}\n\nimport scala.build.errors.BuildException\nimport sca"
},
{
"path": "modules/build/src/main/scala/scala/build/bsp/BspClient.scala",
"chars": 9220,
"preview": "package scala.build.bsp\n\nimport ch.epfl.scala.bsp4j as b\nimport ch.epfl.scala.bsp4j.{ScalaAction, ScalaDiagnostic, Scala"
},
{
"path": "modules/build/src/main/scala/scala/build/bsp/BspImpl.scala",
"chars": 27213,
"preview": "package scala.build.bsp\n\nimport bloop.rifle.BloopServer\nimport ch.epfl.scala.bsp4j as b\nimport com.github.plokhotnyuk.js"
},
{
"path": "modules/build/src/main/scala/scala/build/bsp/BspReloadableOptions.scala",
"chars": 876,
"preview": "package scala.build.bsp\n\nimport bloop.rifle.BloopRifleConfig\n\nimport scala.build.Logger\nimport scala.build.options.Build"
},
{
"path": "modules/build/src/main/scala/scala/build/bsp/BspServer.scala",
"chars": 12988,
"preview": "package scala.build.bsp\n\nimport ch.epfl.scala.bsp4j as b\nimport ch.epfl.scala.bsp4j.{BuildClient, LogMessageParams, Mess"
},
{
"path": "modules/build/src/main/scala/scala/build/bsp/BspThreads.scala",
"chars": 769,
"preview": "package scala.build.bsp\n\nimport java.util.concurrent.{ExecutorService, Executors}\n\nimport scala.build.BuildThreads\nimpor"
},
{
"path": "modules/build/src/main/scala/scala/build/bsp/BuildClientForwardStubs.scala",
"chars": 1071,
"preview": "package scala.build.bsp\n\nimport ch.epfl.scala.bsp4j as b\n\ntrait BuildClientForwardStubs extends b.BuildClient {\n protec"
},
{
"path": "modules/build/src/main/scala/scala/build/bsp/BuildServerForwardStubs.scala",
"chars": 3956,
"preview": "package scala.build.bsp\n\nimport ch.epfl.scala.bsp4j as b\nimport ch.epfl.scala.bsp4j.{DependencyModulesParams, Dependency"
},
{
"path": "modules/build/src/main/scala/scala/build/bsp/BuildServerProxy.scala",
"chars": 5046,
"preview": "package scala.build.bsp\n\nimport ch.epfl.scala.bsp4j as b\n\nimport java.util.concurrent.CompletableFuture\n\nimport scala.bu"
},
{
"path": "modules/build/src/main/scala/scala/build/bsp/HasGeneratedSources.scala",
"chars": 1291,
"preview": "package scala.build.bsp\n\nimport ch.epfl.scala.bsp4j as b\n\nimport scala.build.GeneratedSource\nimport scala.build.input.In"
},
{
"path": "modules/build/src/main/scala/scala/build/bsp/HasGeneratedSourcesImpl.scala",
"chars": 2052,
"preview": "package scala.build.bsp\n\nimport ch.epfl.scala.bsp4j as b\n\nimport scala.build.GeneratedSource\nimport scala.build.input.In"
},
{
"path": "modules/build/src/main/scala/scala/build/bsp/IdeInputs.scala",
"chars": 301,
"preview": "package scala.build.bsp\n\nimport com.github.plokhotnyuk.jsoniter_scala.core.JsonValueCodec\nimport com.github.plokhotnyuk."
},
{
"path": "modules/build/src/main/scala/scala/build/bsp/JavaBuildServerForwardStubs.scala",
"chars": 445,
"preview": "package scala.build.bsp\n\nimport ch.epfl.scala.bsp4j as b\nimport ch.epfl.scala.bsp4j.{JavacOptionsParams, JavacOptionsRes"
},
{
"path": "modules/build/src/main/scala/scala/build/bsp/JsonRpcErrorCodes.scala",
"chars": 543,
"preview": "package scala.build.bsp\n\n/** Response error codes as defined in JSON RPC.\n * [[https://www.jsonrpc.org/specification#er"
},
{
"path": "modules/build/src/main/scala/scala/build/bsp/JvmBuildServerForwardStubs.scala",
"chars": 583,
"preview": "package scala.build.bsp\n\nimport ch.epfl.scala.bsp4j as b\n\nimport java.util.concurrent.CompletableFuture\n\ntrait JvmBuildS"
},
{
"path": "modules/build/src/main/scala/scala/build/bsp/LoggingBuildClient.scala",
"chars": 1077,
"preview": "package scala.build.bsp\n\nimport ch.epfl.scala.bsp4j as b\n\ntrait LoggingBuildClient extends b.BuildClient {\n protected d"
},
{
"path": "modules/build/src/main/scala/scala/build/bsp/LoggingBuildServer.scala",
"chars": 2678,
"preview": "package scala.build.bsp\n\nimport ch.epfl.scala.bsp4j as b\nimport ch.epfl.scala.bsp4j.{DependencyModulesParams, Dependency"
},
{
"path": "modules/build/src/main/scala/scala/build/bsp/LoggingBuildServerAll.scala",
"chars": 772,
"preview": "package scala.build.bsp\n\nimport ch.epfl.scala.bsp4j as b\n\nimport java.util.concurrent.CompletableFuture\n\nclass LoggingBu"
},
{
"path": "modules/build/src/main/scala/scala/build/bsp/LoggingJavaBuildServer.scala",
"chars": 398,
"preview": "package scala.build.bsp\n\nimport ch.epfl.scala.bsp4j as b\n\nimport java.util.concurrent.CompletableFuture\n\ntrait LoggingJa"
},
{
"path": "modules/build/src/main/scala/scala/build/bsp/LoggingJvmBuildServer.scala",
"chars": 623,
"preview": "package scala.build.bsp\n\nimport ch.epfl.scala.bsp4j as b\n\nimport java.util.concurrent.CompletableFuture\n\ntrait LoggingJv"
},
{
"path": "modules/build/src/main/scala/scala/build/bsp/LoggingScalaBuildServer.scala",
"chars": 841,
"preview": "package scala.build.bsp\n\nimport ch.epfl.scala.bsp4j as b\n\nimport java.util.concurrent.CompletableFuture\n\ntrait LoggingSc"
},
{
"path": "modules/build/src/main/scala/scala/build/bsp/ScalaBuildServerForwardStubs.scala",
"chars": 780,
"preview": "package scala.build.bsp\n\nimport ch.epfl.scala.bsp4j as b\n\nimport java.util.concurrent.CompletableFuture\n\ntrait ScalaBuil"
},
{
"path": "modules/build/src/main/scala/scala/build/bsp/package.scala",
"chars": 5129,
"preview": "package scala.build\n\nimport ch.epfl.scala.bsp4j as b\nimport ch.epfl.scala.bsp4j.SourcesItem\n\nimport java.util.concurrent"
},
{
"path": "modules/build/src/main/scala/scala/build/bsp/protocol/TextEdit.scala",
"chars": 201,
"preview": "package scala.build.bsp.protocol\n\nimport ch.epfl.scala.bsp4j as b\nimport com.google.gson.Gson\n\ncase class TextEdit(range"
},
{
"path": "modules/build/src/main/scala/scala/build/compiler/BloopCompiler.scala",
"chars": 1584,
"preview": "package scala.build.compiler\nimport scala.annotation.tailrec\nimport scala.build.{Bloop, Logger, Position, Positioned, Pr"
},
{
"path": "modules/build/src/main/scala/scala/build/compiler/BloopCompilerMaker.scala",
"chars": 2959,
"preview": "package scala.build.compiler\n\nimport bloop.rifle.{BloopRifleConfig, BloopServer, BloopThreads}\nimport ch.epfl.scala.bsp4"
},
{
"path": "modules/build/src/main/scala/scala/build/compiler/ScalaCompiler.scala",
"chars": 1314,
"preview": "package scala.build.compiler\n\nimport scala.build.{Logger, Positioned, Project}\n\ntrait ScalaCompiler {\n def jvmVersion: "
},
{
"path": "modules/build/src/main/scala/scala/build/compiler/ScalaCompilerMaker.scala",
"chars": 1504,
"preview": "package scala.build.compiler\n\nimport ch.epfl.scala.bsp4j.BuildClient\n\nimport scala.build.Logger\nimport scala.build.error"
},
{
"path": "modules/build/src/main/scala/scala/build/compiler/SimpleJavaCompiler.scala",
"chars": 1577,
"preview": "package scala.build.compiler\n\nimport java.io.File\n\nimport scala.build.internal.Runner\nimport scala.build.{Logger, Projec"
},
{
"path": "modules/build/src/main/scala/scala/build/compiler/SimpleScalaCompiler.scala",
"chars": 7102,
"preview": "package scala.build.compiler\n\nimport java.io.File\n\nimport scala.build.internal.{Constants, Runner}\nimport scala.build.{L"
},
{
"path": "modules/build/src/main/scala/scala/build/compiler/SimpleScalaCompilerMaker.scala",
"chars": 617,
"preview": "package scala.build.compiler\n\nimport ch.epfl.scala.bsp4j.BuildClient\n\nimport scala.build.Logger\nimport scala.build.error"
},
{
"path": "modules/build/src/main/scala/scala/build/input/Element.scala",
"chars": 4430,
"preview": "package scala.build.input\n\nimport scala.build.preprocessing.ScopePath\nimport scala.util.matching.Regex\n\nsealed abstract "
},
{
"path": "modules/build/src/main/scala/scala/build/input/ElementsUtils.scala",
"chars": 3507,
"preview": "package scala.build.input\n\nimport java.math.BigInteger\nimport java.nio.charset.StandardCharsets\nimport java.security.Mes"
},
{
"path": "modules/build/src/main/scala/scala/build/input/Inputs.scala",
"chars": 19832,
"preview": "package scala.build.input\n\nimport java.io.{ByteArrayInputStream, File}\nimport java.math.BigInteger\nimport java.nio.chars"
},
{
"path": "modules/build/src/main/scala/scala/build/input/ScalaCliInvokeData.scala",
"chars": 1012,
"preview": "package scala.build.input\n\n/** Stores information about how the program has been evoked\n *\n * @param progName\n * th"
},
{
"path": "modules/build/src/main/scala/scala/build/input/WorkspaceOrigin.scala",
"chars": 381,
"preview": "package scala.build.input\n\nsealed abstract class WorkspaceOrigin extends Product with Serializable\n\nobject WorkspaceOrig"
},
{
"path": "modules/build/src/main/scala/scala/build/internal/AmmUtil.scala",
"chars": 810,
"preview": "package scala.build.internal\n\n// adapted from https://github.com/com-lihaoyi/Ammonite/blob/9be39debc367abad5f5541ef58f4b"
},
{
"path": "modules/build/src/main/scala/scala/build/internal/AppCodeWrapper.scala",
"chars": 1175,
"preview": "package scala.build.internal\n\ncase class AppCodeWrapper(scalaVersion: String, log: String => Unit) extends CodeWrapper {"
},
{
"path": "modules/build/src/main/scala/scala/build/internal/ClassCodeWrapper.scala",
"chars": 3152,
"preview": "package scala.build.internal\n\n/** Script code wrapper that solves problem of deadlocks when using threads. The code is p"
},
{
"path": "modules/build/src/main/scala/scala/build/internal/JavaParserProxy.scala",
"chars": 758,
"preview": "package scala.build.internal\n\nimport scala.build.errors.BuildException\n\n/** Helper to get class names from Java sources\n"
},
{
"path": "modules/build/src/main/scala/scala/build/internal/JavaParserProxyBinary.scala",
"chars": 2380,
"preview": "package scala.build.internal\n\nimport coursier.cache.ArchiveCache\nimport coursier.util.Task\nimport dependency.*\n\nimport j"
},
{
"path": "modules/build/src/main/scala/scala/build/internal/JavaParserProxyJvm.scala",
"chars": 526,
"preview": "package scala.build.internal\n\nimport scala.build.errors.BuildException\nimport scala.cli.javaclassname.JavaParser\n\n/** A "
},
{
"path": "modules/build/src/main/scala/scala/build/internal/JavaParserProxyMaker.scala",
"chars": 1040,
"preview": "package scala.build.internal\n\nimport java.util.function.Supplier\n\nimport scala.annotation.unused\nimport scala.build.Logg"
},
{
"path": "modules/build/src/main/scala/scala/build/internal/MainClass.scala",
"chars": 4333,
"preview": "package scala.build.internal\n\nimport org.objectweb.asm\nimport org.objectweb.asm.ClassReader\n\nimport java.io.{ByteArrayIn"
},
{
"path": "modules/build/src/main/scala/scala/build/internal/ManifestJar.scala",
"chars": 2602,
"preview": "package scala.build.internal\n\nimport java.io.OutputStream\n\nobject ManifestJar {\n\n /** Creates a manifest JAR, in a temp"
},
{
"path": "modules/build/src/main/scala/scala/build/internal/ObjectCodeWrapper.scala",
"chars": 3181,
"preview": "package scala.build.internal\n\n/** Script code wrapper compatible with Scala 2 and JS native members <br> <br> When using"
},
{
"path": "modules/build/src/main/scala/scala/build/internal/Runner.scala",
"chars": 17602,
"preview": "package scala.build.internal\n\nimport coursier.jvm.Execve\nimport org.scalajs.jsenv.jsdomnodejs.JSDOMNodeJSEnv\nimport org."
},
{
"path": "modules/build/src/main/scala/scala/build/internal/WrapperUtils.scala",
"chars": 3021,
"preview": "package scala.build.internal\n\nimport scala.build.internal.util.WarningMessages\n\nobject WrapperUtils {\n\n enum ScriptMain"
},
{
"path": "modules/build/src/main/scala/scala/build/internal/markdown/MarkdownCodeBlock.scala",
"chars": 3100,
"preview": "package scala.build.internal.markdown\n\nimport scala.annotation.tailrec\nimport scala.build.errors.BuildException\nimport s"
},
{
"path": "modules/build/src/main/scala/scala/build/internal/markdown/MarkdownCodeWrapper.scala",
"chars": 5871,
"preview": "package scala.build.internal.markdown\n\nimport scala.annotation.tailrec\nimport scala.build.internal.{AmmUtil, Name}\nimpor"
},
{
"path": "modules/build/src/main/scala/scala/build/internal/markdown/MarkdownOpenFence.scala",
"chars": 2630,
"preview": "package scala.build.internal.markdown\n\nimport scala.build.Position\nimport scala.build.errors.MarkdownUnclosedBackticksEr"
},
{
"path": "modules/build/src/main/scala/scala/build/internal/resource/NativeResourceMapper.scala",
"chars": 1168,
"preview": "package scala.build.internal.resource\n\nimport scala.build.Build\nimport scala.build.input.CFile\n\nobject NativeResourceMap"
},
{
"path": "modules/build/src/main/scala/scala/build/internal/resource/ResourceMapper.scala",
"chars": 2094,
"preview": "package scala.build.internal.resource\n\nimport scala.build.Build\nimport scala.build.internal.Constants\n\nobject ResourceMa"
},
{
"path": "modules/build/src/main/scala/scala/build/internal/util/RegexUtils.scala",
"chars": 737,
"preview": "package scala.build.internal.util\n\nimport java.util.regex.Pattern\n\nobject RegexUtils {\n\n /** Based on junit-interface ["
},
{
"path": "modules/build/src/main/scala/scala/build/internal/util/WarningMessages.scala",
"chars": 6094,
"preview": "package scala.build.internal.util\n\nimport scala.build.input.ScalaCliInvokeData\nimport scala.build.internal.Constants\nimp"
},
{
"path": "modules/build/src/main/scala/scala/build/internal/zip/WrappedZipInputStream.scala",
"chars": 1604,
"preview": "package scala.build.internal.zip\n\nimport java.io.{Closeable, InputStream}\nimport java.util.zip.ZipEntry\n\nimport scala.bu"
},
{
"path": "modules/build/src/main/scala/scala/build/package.scala",
"chars": 820,
"preview": "package scala.build\n\nimport scala.annotation.tailrec\nimport scala.concurrent.duration.{DurationInt, FiniteDuration}\nimpo"
},
{
"path": "modules/build/src/main/scala/scala/build/postprocessing/AsmPositionUpdater.scala",
"chars": 3286,
"preview": "package scala.build.postprocessing\n\nimport org.objectweb.asm\n\nimport java.nio.file.{FileAlreadyExistsException, NoSuchFi"
},
{
"path": "modules/build/src/main/scala/scala/build/postprocessing/ByteCodePostProcessor.scala",
"chars": 539,
"preview": "package scala.build.postprocessing\n\nimport scala.build.options.BuildOptions\nimport scala.build.{GeneratedSource, Logger}"
},
{
"path": "modules/build/src/main/scala/scala/build/postprocessing/LineConversion.scala",
"chars": 673,
"preview": "package scala.build.postprocessing\n\nimport scala.build.internal.WrapperParams\n\nobject LineConversion {\n def scalaLineTo"
},
{
"path": "modules/build/src/main/scala/scala/build/postprocessing/PostProcessor.scala",
"chars": 399,
"preview": "package scala.build.postprocessing\n\nimport scala.build.options.BuildOptions\nimport scala.build.{GeneratedSource, Logger}"
},
{
"path": "modules/build/src/main/scala/scala/build/postprocessing/SemanticDbPostProcessor.scala",
"chars": 2807,
"preview": "package scala.build.postprocessing\n\nimport java.nio.file.FileSystemException\n\nimport scala.annotation.tailrec\nimport sca"
},
{
"path": "modules/build/src/main/scala/scala/build/postprocessing/SemanticdbProcessor.scala",
"chars": 3953,
"preview": "// adapted from https://github.com/com-lihaoyi/Ammonite/blob/2da846d2313f1e12e812802babf9c69005f5d44a/amm/interp/src/mai"
},
{
"path": "modules/build/src/main/scala/scala/build/postprocessing/TastyPostProcessor.scala",
"chars": 2983,
"preview": "package scala.build.postprocessing\n\nimport java.nio.file.{FileAlreadyExistsException, NoSuchFileException}\n\nimport scala"
},
{
"path": "modules/build/src/main/scala/scala/build/preprocessing/CustomDirectivesReporter.scala",
"chars": 1640,
"preview": "package scala.build.preprocessing\n\nimport com.virtuslab.using_directives.custom.utils.Position as DirectivePosition\nimpo"
},
{
"path": "modules/build/src/main/scala/scala/build/preprocessing/DataPreprocessor.scala",
"chars": 1375,
"preview": "package scala.build.preprocessing\nimport scala.build.EitherCps.either\nimport scala.build.Logger\nimport scala.build.error"
},
{
"path": "modules/build/src/main/scala/scala/build/preprocessing/DeprecatedDirectives.scala",
"chars": 4076,
"preview": "package scala.build.preprocessing\n\nimport scala.build.Logger\nimport scala.build.errors.Diagnostic.TextEdit\nimport scala."
},
{
"path": "modules/build/src/main/scala/scala/build/preprocessing/DirectivesPreprocessor.scala",
"chars": 5776,
"preview": "package scala.build.preprocessing\nimport scala.build.EitherCps.{either, value}\nimport scala.build.Logger\nimport scala.bu"
},
{
"path": "modules/build/src/main/scala/scala/build/preprocessing/ExtractedDirectives.scala",
"chars": 3887,
"preview": "package scala.build.preprocessing\n\nimport com.virtuslab.using_directives.UsingDirectivesProcessor\nimport com.virtuslab.u"
},
{
"path": "modules/build/src/main/scala/scala/build/preprocessing/JarPreprocessor.scala",
"chars": 1318,
"preview": "package scala.build.preprocessing\nimport scala.build.EitherCps.either\nimport scala.build.Logger\nimport scala.build.error"
},
{
"path": "modules/build/src/main/scala/scala/build/preprocessing/JavaPreprocessor.scala",
"chars": 4365,
"preview": "package scala.build.preprocessing\n\nimport coursier.cache.ArchiveCache\nimport coursier.util.Task\n\nimport java.nio.charset"
},
{
"path": "modules/build/src/main/scala/scala/build/preprocessing/MarkdownCodeBlockProcessor.scala",
"chars": 1602,
"preview": "package scala.build.preprocessing\n\nimport scala.build.EitherCps.{either, value}\nimport scala.build.Logger\nimport scala.b"
},
{
"path": "modules/build/src/main/scala/scala/build/preprocessing/MarkdownPreprocessor.scala",
"chars": 4963,
"preview": "package scala.build.preprocessing\n\nimport java.nio.charset.StandardCharsets\n\nimport scala.build.EitherCps.{either, value"
},
{
"path": "modules/build/src/main/scala/scala/build/preprocessing/PreprocessedMarkdown.scala",
"chars": 802,
"preview": "package scala.build.preprocessing\n\nimport scala.build.internal.markdown.MarkdownCodeBlock\n\ncase class PreprocessedMarkdo"
},
{
"path": "modules/build/src/main/scala/scala/build/preprocessing/PreprocessedSource.scala",
"chars": 3056,
"preview": "package scala.build.preprocessing\n\nimport scala.build.Position\nimport scala.build.internal.{CodeWrapper, WrapperParams}\n"
},
{
"path": "modules/build/src/main/scala/scala/build/preprocessing/PreprocessingUtil.scala",
"chars": 420,
"preview": "package scala.build.preprocessing\n\nimport java.nio.charset.StandardCharsets\n\nimport scala.build.errors.{BuildException, "
},
{
"path": "modules/build/src/main/scala/scala/build/preprocessing/Preprocessor.scala",
"chars": 559,
"preview": "package scala.build.preprocessing\n\nimport scala.build.Logger\nimport scala.build.errors.BuildException\nimport scala.build"
},
{
"path": "modules/build/src/main/scala/scala/build/preprocessing/ScalaPreprocessor.scala",
"chars": 8682,
"preview": "package scala.build.preprocessing\nimport java.nio.charset.StandardCharsets\n\nimport scala.build.EitherCps.{either, value}"
},
{
"path": "modules/build/src/main/scala/scala/build/preprocessing/ScriptPreprocessor.scala",
"chars": 6511,
"preview": "package scala.build.preprocessing\n\nimport java.nio.charset.StandardCharsets\n\nimport scala.build.EitherCps.{either, value"
},
{
"path": "modules/build/src/main/scala/scala/build/preprocessing/SheBang.scala",
"chars": 1570,
"preview": "package scala.build.preprocessing\n\nobject SheBang {\n def isShebangScript(content: String): Boolean = content.startsWith"
},
{
"path": "modules/build/src/main/scala/scala/build/preprocessing/UsingDirectivesOps.scala",
"chars": 2000,
"preview": "package scala.build.preprocessing\n\nimport com.virtuslab.using_directives.custom.model.UsingDirectives\nimport com.virtusl"
},
{
"path": "modules/build/src/main/scala/scala/build/preprocessing/directives/DirectivesPreprocessingUtils.scala",
"chars": 2152,
"preview": "package scala.build.preprocessing.directives\n\nimport scala.build.directives.{\n HasBuildOptions,\n HasBuildOptionsWithRe"
},
{
"path": "modules/build/src/main/scala/scala/build/preprocessing/directives/PartiallyProcessedDirectives.scala",
"chars": 203,
"preview": "package scala.build.preprocessing.directives\n\nimport scala.build.preprocessing.Scoped\n\ncase class PartiallyProcessedDire"
},
{
"path": "modules/build/src/main/scala/scala/build/preprocessing/directives/PreprocessedDirectives.scala",
"chars": 1013,
"preview": "package scala.build.preprocessing.directives\n\nimport scala.build.Position\nimport scala.build.options.{BuildOptions, Buil"
},
{
"path": "modules/build/src/test/scala/scala/build/options/publish/ComputeVersionTests.scala",
"chars": 1849,
"preview": "package scala.build.options.publish\n\nimport com.eed3si9n.expecty.Expecty.expect\nimport org.eclipse.jgit.api.Git\nimport o"
},
{
"path": "modules/build/src/test/scala/scala/build/options/publish/VcsParseTest.scala",
"chars": 3708,
"preview": "package scala.build.options.publish\n\nimport scala.build.Positioned\nimport scala.build.errors.{BuildException, MalformedI"
}
]
// ... and 905 more files (download for full content)
About this extraction
This page contains the full source code of the VirtusLab/scala-cli GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1105 files (4.5 MB), approximately 1.3M tokens, and a symbol index with 138 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.