Commit graph

281 commits

Author SHA1 Message Date
Snider
293dfd6e66 feat(build): ENV-first Deno + discovery metadata (os/arch/github ref) + Xcode Cloud
- env.go (new): DENO_ENABLE and DENO_BUILD environment variables activate
  Deno builds even when repo only has package.json or bare frontend/ dir
- wails.go + node.go + apple.go + release.yml + xcode_cloud.go: honor the
  ENV flags across builder + workflow + Xcode Cloud script generation
- discovery.go: record host os/arch + GitHub ref metadata (ref, branch, tag,
  is_tag, sha, short_sha, repo, owner)
- api/provider.go: /discover exposes the new metadata
- Regression coverage across discovery/builders/apple/workflow/xcode_cloud/api

Verified: go test ./... passes

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-14 21:35:50 +01:00
Snider
cbdb8028dc feat(build): action-style upload artifact naming + doc parity
- release.yml: generated workflow computes upload artifact names in action
  shape {build-name}_{os}_{arch}_{tag|shortsha} with repo-name fallback
- workflow_test + cmd_workflow_test: artifact-name derivation coverage
- README + docs/index + docs/architecture + CLAUDE.md: refreshed to describe
  current module path, builders/publishers, generated workflow/action surface,
  Apple pipeline — replaces pre-spec documentation

Verified: go test ./... passes

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-14 21:24:17 +01:00
Snider
a7e104ebc7 feat(build): release workflow exposes build / platform / sign / package controls
- release.yml: workflow inputs build, build-platform, sign, package — narrows
  matrix, skips packaging/release when requested, forwards signing/packaging
  intent into core build invocation
- cmd_build.go: CLI wiring for the new inputs
- workflow_test / cmd_project_test / cmd_workflow_test: assertions for new
  alias behaviour + conditional workflow steps

Verified: go test ./... passes

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-14 21:17:33 +01:00
Snider
3558bf8898 feat(build): generated workflow provisions Go, Node, Wails CLI
- release.yml: add go-version / node-version / wails-version inputs;
  Setup Go, Setup Node, Enable Corepack, Install Wails CLI steps
- Wails install detects project v2 vs v3 and picks matching CLI
- workflow_test.go + cmd_workflow_test.go: new contract assertions

Verified: go test ./... passes

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-14 21:09:12 +01:00
Snider
5be8ffcf80 feat(build): core build action overrides + workflow forwards RFC controls
- cmd_build.go + cmd_project.go: core build accepts action-style overrides
  for build name, tags, obfuscate, NSIS, Deno frontend command, WebView2 mode,
  build-cache enable
- --build-cache without explicit cache config seeds default cache layout
  (.core/cache, cache/go-build, cache/go-mod) before builder setup
- release.yml: generated workflow exposes + forwards RFC controls so CI can
  use them without editing .core/build.yaml
- Tests across cmd_project, cmd_workflow, workflow

Verified: go test ./... passes

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-14 21:01:25 +01:00
Snider
632256be37 fix(build): generated release workflow pins dAppCore/build@v3 per RFC
- release.yml: both steps use dAppCore/build@v3 (was @v4 — no such published tag)
- workflow_test.go: regression assertion for @v3 pinning

Verified: go test ./... passes

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-14 20:51:02 +01:00
Snider
41ff2fd0ef feat(build): Wails v3 Taskfile path inherits full runtime surface
- wails.go + taskfile.go: Wails v3 builds delegating to Taskfile now inherit
  CGO_ENABLED=1, GOFLAGS, BUILD_FLAGS, EXTRA_TAGS, WEBVIEW2_MODE, and the
  garble shim for obfuscated builds — previously dropped by the Taskfile path
- wails_test.go: Taskfile flag propagation + obfuscation coverage

Verified: go test ./pkg/build/builders + go test ./... passes

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-14 20:44:49 +01:00
Snider
0d39bdc882 feat(build): Apple DMG — staged R/W image + Finder layout + compressed final
- apple.go: CreateDMG builds staged read/write image, mounts, applies Finder
  layout via osascript, converts to final compressed DMG
- DMGConfig fields (background, icon_size, window_size, volume_name default)
  now affect output instead of being ignored
- Normalisation + layout helpers + osascript resolver
- apple_test.go: DMG config defaults, AppleScript layout generation, full
  command sequence coverage

Verified: go test ./pkg/build -run 'TestApple_' + go test ./... passes

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-14 20:36:22 +01:00
Snider
d282e61f21 feat(build): Apple TestFlight/App Store upload stages api_key to canonical filename
- apple.go: uploads stage api_key_path to AuthKey_<APIKeyID>.p8 filename that
  xcrun altool expects, instead of assuming the user named the file that way;
  staged directory cleaned up after upload
- apple_test.go: arbitrary .p8 filenames get restaged; canonical paths used in place

Verified: go test ./... passes

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-14 20:26:21 +01:00
Snider
47934ebd24 feat(build): workflow MkDocs + Deno setup + Apple Xcode Cloud scripts
- release.yml: provision mkdocs for docs builds + Deno for Deno-backed frontends,
  alongside existing Conan / Wails / cache setup
- workflow_test.go + cmd_workflow_test.go: assertions for new setup steps
- pkg/build/apple/apple.go: RFC-facing wrapper writes Xcode Cloud helper scripts
  when apple.xcode_cloud is configured (matches core build apple CLI path)
- apple_test.go: regression for Xcode Cloud helper script emission

Verified: go test ./... passes

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-14 20:18:03 +01:00
Snider
bb2a56a4f4 fix(build): Apple merge path — partial AppleOptions no longer disable defaults
- apple/apple.go: partial runtime AppleOptions treated as partial overrides
  instead of zero-value booleans silently disabling Sign/Notarise/DMG
- apple_test.go: coverage for partial-override + bool-only override paths

Verified: go test ./... passes

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-14 18:43:22 +01:00
Snider
3b05eb6d95 feat(build): Wails v3 fallback — BUILD_FLAGS/EXTRA_TAGS + garble + WebView2 strict
- wails.go: pass BUILD_FLAGS + EXTRA_TAGS to wails3 wrapper so RFC-required
  tags, ldflags, and version injection survive task-driven builds
- wails.go: obfuscated fallback builds — temp go shim routes go build through
  garble while delegating non-build commands to real go
- wails.go: WebView2 download mode explicit for Windows/NSIS fallback
- wails.go: unsupported v3 fallback modes (embed/browser/error) fail fast
  with clear error instead of being silently ignored

Verified: go test ./pkg/build/builders -run Wails + go test ./... passes

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-14 18:34:14 +01:00
Snider
78b6bdd7ce feat(build): snake_case JSON tags on build/signing config models
- config.go + cache.go + signing/signer.go: add json tags so provider /config
  response matches RFC/UI snake_case shape instead of Go field names
- provider_test.go: regression verifying nested apple.xcode_cloud + sign.macos

Verified: go test ./... passes

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-14 18:21:26 +01:00
Snider
ace3f167fb feat(build): Apple Option RFC shape + MkDocs precedence over Node
- apple/apple.go: Option contract now matches RFC shape func(*AppleOptions)
  while preserving explicit builder overrides (WithSign(true), WithArch("universal"))
- discovery.go: MkDocs markers take precedence over generic Node markers —
  projects with mkdocs.yml + package.json resolve to docs, not node

Verified: go test ./... passes

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-14 18:15:03 +01:00
Snider
b8e48fd47a feat(build): Apple Wails — deno_build, multi-layout frontend prebuild, CGO_ENABLED
- apple.go / apple/apple.go: Apple Wails builds now carry deno_build
- Frontend prebuild step supports frontend/, root, and depth-2 monorepo layouts
- Honor Deno override, detect npm/pnpm/yarn/bun package managers
- Force CGO_ENABLED=1 when invoking wails3

Verified: go test ./... passes

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-14 18:07:07 +01:00
Snider
2790ee6f27 feat(build): discovery parity for nested Deno frontends
- discovery.go: apps/*/deno.json[c] repos detected consistently as node
- Go/Wails repos with nested Deno frontends report wails+go+node together
  instead of dropping the frontend stack

Verified: go test ./... passes

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-14 17:58:17 +01:00
Snider
3cb5ec5712 feat(build): GitHub Actions build-cache in generated release workflow
- release.yml: add build-cache input for workflow_call + workflow_dispatch
  — actions/cache@v4 step keyed by runner OS, build target, .core/build.yaml,
  and Go/Node/Deno/Python/PHP/Rust lockfiles
- Fallback keys for progressive cache warming

Verified: go test ./... passes

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-14 17:51:00 +01:00
Snider
55669839f0 feat(build): App Store cert validation + universal bundles + notarisation timeout
- apple.go: TestFlight + AppStore now reject Developer ID certs, require real
  distribution identity
- apple.go: universal bundle creation merges all matching executable payloads
  via lipo — covers helper binaries, framework executables, dylibs
- apple.go: default 30min notarisation timeout per RFC

Verified: go test ./pkg/build + subset runs pass.
Full go test ./... blocked by transient go-i18n workspace compile error (unrelated).

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-14 17:42:40 +01:00
Snider
ab822ae807 feat(build): Wails v3 frontend prebuild + Conan preflight for C++ builds
- wails.go: v3 fallback path runs configured frontend prebuild before wails3
  — Deno/npm frontends now apply on v3 projects without Taskfile fallback
- cpp.go: preflight Conan alongside make with clear install-error message
- release.yml: provision Conan via actions/setup-python when CMakeLists.txt present

Verified: go test ./... passed

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-14 17:36:04 +01:00
Snider
9f9a113ad8 feat(build): distro-aware Wails deps + richer discovery signals
- release.yml: Ubuntu 24.04 → libwebkit2gtk-4.1-dev, older 4.0 path for 22.04/20.04
- provider.go: expose suggested_stack, has_frontend, has_subtree_npm, linux_packages
- build-config.ts UI: surface suggested stack, frontend detection, nested frontend, Linux package hints
- Refreshed core-build.js shipped bundle

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-14 17:28:04 +01:00
Snider
2cf8c3f542 feat(build): Wails v2 Windows-only flags + SuggestStack discovery hint
- builders/wails.go: -nsis and -webview2 are Windows-only flags; non-
  Windows targets reject them. webview2 mode validated against RFC
  values (download, embed, browser, error)
- discovery.go: SuggestStack() + DiscoveryResult.SuggestedStack expose
  richer action-oriented stack hints (e.g. "wails2") without changing
  primary build type
- wails_test + discovery_test: Windows + non-Windows coverage,
  SuggestedStack checks

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-14 17:18:42 +01:00
Snider
1e8f1a3fb4 fix(build): subtree_npm + webkit2_41 mis-classification
- discovery.go: has_subtree_npm now reports only actual nested
  monorepo manifests, not the conventional frontend/ layout (was
  spuriously flagging every Wails-style frontend/)
- discovery.go: hidden dirs skipped during subtree scans
- options.go: Ubuntu webkit2_41 tag injection limited to Wails
  discovery (was injecting on every Ubuntu 24.04+ project,
  cluttering builds for non-Wails apps)
- frontend/ manifests still surface as a Node layer in discovery
- discovery_test, options_test, api/provider_test: lock behaviour

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-14 17:08:24 +01:00
Snider
a6bc490b54 feat(build): Xcode Cloud ci_scripts materialisation
- pkg/build/xcode_cloud.go (new): detects apple.xcode_cloud config,
  generates the three required ci_scripts files (ci_post_clone.sh,
  ci_pre_xcodebuild.sh, ci_post_xcodebuild.sh) with executable
  permissions
- cmd/build/cmd_apple.go: Apple command emits the scripts whenever
  apple.xcode_cloud is configured
- xcode_cloud_test + cmd_apple_test: coverage for the materialisation
  path

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-14 16:57:38 +01:00
Snider
cb5d32456d feat(build): deno_build first-class + discovery exposes build options
- builders/deno.go (new): shared deno-build command parsing/wiring
- config.go + build.go + runtime_config.go: build.deno_build persisted
  and carried into runtime config, ENV-first DENO_BUILD override per spec
- builders/node.go + wails.go: integrate deno-build path so frontend
  builds honour the new setting
- pkg/api/provider.go: /discover exposes build_options plus a structured
  options object — matches RFC Discovery → Options flow
- regression coverage across builders/node, builders/wails, config,
  runtime_config, cmd_project, api/provider tests

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-14 16:33:23 +01:00
Snider
4a909eb66e fix(build): .core/build.yaml authoritative — no auto-stack append when set
- discovery.go: Discover, PrimaryType, DiscoverFull no longer append
  auto-detected stacks when .core/build.yaml already declares a build
  type — matches RFC "use config" contract
- apple/apple.go: Apple wrapper registration path now seeds a builders
  registry when the host Core supports one, while still registering
  the Apple builder as a service
- discovery_test.go: mixed-marker coverage

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-14 16:22:30 +01:00
Snider
aa3d425a62 feat(build): core release top-level alias + RFC WailsBuildConfig
- cmd/build/cmd_release.go: register `core release` as top-level alias
  alongside `core build release` for the RFC ergonomics
- pkg/build/apple/apple.go: Apple wrapper exposes RFC-shaped
  WailsBuildConfig with string LDFlags, defaults ProjectDir to cwd
  before converting to the lower-level build config
- cmd_release_test.go + apple/apple_test.go: regression coverage

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-14 16:15:31 +01:00
Snider
1cad5e9e36 feat(build): full .core/build.yaml propagation + cache init + mlx tag
- pkg/build/runtime_config.go (new): shared mapper carries the full
  .core/build.yaml state into builders instead of partial subsets —
  project.main, flags, tags, env, obfuscation, cache, etc. flow
  through every entrypoint consistently
- pkg/api/provider.go: API build path now respects the full config
  and sets up build cache before running builds
- cmd/build/cmd_apple.go + pkg/build/apple/apple.go: Apple
  entrypoints initialise cache config before building
- pkg/build/apple.go: Apple Wails helper always includes the mlx
  build tag per RFC
- runtime_config_test, provider_test, cmd_apple_test, apple/apple_test,
  apple_test: coverage for every new path

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-14 16:06:54 +01:00
Snider
af4358c3a4 feat(build): App Store preflight — metadata + privacy + private-API scan
- apple.go: `core build apple --appstore` enforces privacy_policy_url,
  validates metadata presence (description.* + screenshots/), runs a
  best-effort private-API scan on the built bundle before submission
- config.go: Apple config accepts metadata_path and privacy_policy_url
- apple/apple.go: fields wired through the RFC-facing wrapper
- apple_test + config_test: coverage for config expansion, successful
  preflight, metadata failures, privacy URL validation, private-API
  detection

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-14 15:56:34 +01:00
Snider
4fcf0c4d5f feat(build): cmd migration to core.Command + /release/workflow empty body
- internal/cmdutil/cmdutil.go (new): shared CLI adapter helpers for the
  core.Command registration path
- cmd/build/{cmd_build,cmd_apple,cmd_release,cmd_workflow}.go +
  cmd/ci/ci.go + cmd/sdk/cmd.go: migrated from Cobra-style
  cli.NewCommand/StringFlag to core.Command registration with
  core.Options.String/Int/Bool
- pkg/api/provider.go: POST /release/workflow accepts empty JSON body
  but correctly rejects malformed JSON with 400
- pkg/api/provider_test.go: regression for the new behaviour

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-14 15:48:31 +01:00
Snider
35d0242adf feat(build): centralised cache env propagation + Wails v2 obfuscation
- pkg/build/env.go (new): central cache-aware subprocess env helper so
  GOCACHE and GOMODCACHE flow consistently through every shelled
  builder — Wails v2/v3, Taskfile, Apple Wails, Node, PHP, Rust, Docs,
  Docker, LinuxKit, C++ make
- builders/wails.go: Wails v2 builds now honour cfg.Obfuscate and pass
  -obfuscated (was silently ignored)
- Wails v2/v3, Taskfile, Apple regressions added to assert env + flag

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-14 15:30:49 +01:00
Snider
a478ebc96a feat(build): Deno node builder + Wails v3 fallback via wails3
- discovery.go: Deno projects first-class as node — root deno.json
  / deno.jsonc, marker reporting, primary stack selection
- builders/node.go: NodeBuilder resolves Deno apps and runs
  `deno task build` when a Deno manifest is present; existing npm/
  pnpm/yarn/bun flow preserved
- builders/wails.go: generic Wails v3 fallback no longer pretends a
  desktop app is just a CGO Go binary — invokes wails3 directly,
  copies artifacts from build/bin or bin, uses `wails3 package` for
  Windows NSIS targets
- ci.go: pretty-printed artifact metadata fix (unrelated red test)
- builders/node_test.go: brittle nested-node PWD assertion fix
- discovery_test + node_test + wails_test: coverage for new paths

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-14 15:20:10 +01:00
Snider
fb859070de feat(build): config-first override + distro-aware Wails hints + depth cap
- discovery.go: .core/build.yaml build.type honoured as config-first
  override; .core/build.yaml recorded in marker map; C++ ahead of
  Docker/Taskfile in fallback priority
- builders/wails.go: distro-aware Linux package hints —
  libwebkit2gtk-4.0-dev on Ubuntu 20.04/22.04, 4.1-dev on 24.04+
- pkg/api/provider.go: returns linux_packages from the discovery
- builders/wails.go: monorepo frontend lookup capped at depth 2 to
  match RFC (was unbounded)
- discovery_test, wails_test, projectdetect_test, provider_test:
  coverage for all new paths

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-14 15:01:10 +01:00
Snider
1d4d57cbcd feat(build): Apple preflight validation + ServiceRuntime wiring
- apple.go: RFC preflight validation before building — signing needs
  identity, notarisation creds validated up front, App Store Connect
  uploads require full API key tuple + profile_path, App Store
  submissions reject Developer ID certs and enforce macOS 13.0+ plus
  EUPL-1.2 metadata. UploadTestFlight and SubmitAppStore require
  api_key_path explicitly
- apple/apple.go: RFC wrapper now embeds *core.ServiceRuntime[
  AppleOptions], initialised in New and Register; exports
  XcodeCloudConfig / XcodeCloudTrigger aliases
- tests: cover runtime wiring + stricter App Store/TestFlight
  validation

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-14 14:49:01 +01:00
Snider
3641ec334b feat(build): broaden Wails discovery heuristics
- discovery.go: Wails inferred not only from wails.json but also from
  go.mod or go.work + frontend manifests at root, in frontend/, or at
  depth-2 monorepo paths, including Deno manifests. Flows through
  Discover, PrimaryType, DiscoverFull, projectdetect, WailsBuilder.Detect
- regressions added across discovery_test, projectdetect_test,
  wails_test for the new layouts
- cache_test + workflow_test: migrate stale `fs.Dirs[x] = true` assertions
  to `fs.EnsureDir` — the io.MockMedium API moved to the method-based
  shape

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-14 14:39:26 +01:00
Snider
6efc942aa8 refactor(build): split apple target into own subpackage
Pass #2 on go-build — apple.go and apple_test.go reorganised, new
pkg/build/apple/ subpackage extracts the orchestration (sign,
notarise, DMG, TestFlight, App Store, universal binary). Parent
pkg/build/apple.go retained as a facade.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-14 14:26:01 +01:00
Snider
816906ed65 feat(build): Apple build pipeline per RFC §8
- cmd/build/cmd_apple.go + test: `core build apple` CLI target
- pkg/build/apple.go + test: AppleBuilder orchestration — sign,
  notarise, DMG, TestFlight, App Store, universal binary (lipo),
  Xcode Cloud integration, Info.plist + entitlements generation
- cmd_build.go + config.go: wire Apple target into the builder factory
- locales/en.json: strings for Apple build messages

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-14 14:04:31 +01:00
Snider
d32e186432 refactor: AX compliance sweep — replace banned stdlib imports with core primitives
Replaced fmt, strings, sort, os, io, sync, encoding/json, path/filepath,
errors, log, reflect with core.Sprintf, core.E, core.Contains, core.Trim,
core.Split, core.Join, core.JoinPath, slices.Sort, c.Fs(), c.Lock(),
core.JSONMarshal, core.ReadAll and other CoreGO v0.8.0 primitives.

Framework boundary exceptions preserved where stdlib types are required
by external interfaces (Gin, net/http, CGo, Wails, bubbletea).

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-13 09:32:01 +01:00
Virgil
1938097f89 refactor(build): centralize builder resolution
Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-08 16:06:59 +00:00
Virgil
c83b14d2e1 docs(rfc): add RFC index and AX usage comments
Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-08 15:54:21 +00:00
Snider
ac8fb6f561 fix: migrate forge.lthn.ai imports to dappco.re and tidy deps
Upgrade cli v0.3.7→v0.5.2, api/i18n/io/log/process/ws to latest
dappco.re versions. Remove duplicate indirect requires.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-07 14:58:47 +01:00
Snider
364cfb7c90 fix: migrate module paths from forge.lthn.ai to dappco.re
Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-04 16:21:12 +01:00
Virgil
489608aaa4 refactor(build): align release workflow comments with AX
Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-02 06:46:37 +00:00
Virgil
2b9369f6ab refactor(build): pass workflow medium through target resolver
Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-02 06:40:53 +00:00
Virgil
8c83da1f4f docs(build): align workflow comments with AX 2026-04-02 06:37:25 +00:00
Virgil
af96a316c5 docs(build): document camelCase workflow aliases
Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-02 06:32:38 +00:00
Virgil
c4ffa4d40d refactor(build): align release workflow alias ordering
Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-02 06:26:32 +00:00
Virgil
4921058bf3 refactor(build): name release workflow helpers explicitly
Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-02 06:21:31 +00:00
Virgil
bb46675131 refactor(build): centralise release workflow directory handling
Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-02 06:16:55 +00:00
Virgil
5e592bf0e0 refactor(build): clarify workflow output alias names
Co-authored-by: Virgil <virgil@lethean.io>
2026-04-02 06:12:18 +00:00
Virgil
2af4cfbf32 feat(build): document workflow output aliases
Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-02 06:02:26 +00:00