Changelog¶
All notable changes to Asgard are documented here.
The format follows Keep a Changelog. Asgard adheres to Semantic Versioning.
Unreleased¶
Removed¶
varDSL method — replaced by native Ruby class variables. Use@@name ||= "value".freezein the class body. Class variables are visible in all task instance methods and in subcommand subclasses, making them the correct tool for shared configuration in a Thor-based task runner. See Variables.
0.2.0 — 2026-05-29¶
Changed¶
*.lokifiles are no longer auto-loaded by default. Pass--auto-loadtoasgardto load all*.lokifiles from the project root alphabetically before.loki. This is a breaking change for projects using the multi-file layout.- Added
--auto-loadas a built-in CLI flag inTasks, visible inasgard help
0.1.2 — 2026-05-29¶
Added¶
--versionbuilt-in CLI flag — printsAsgard::VERSIONand exits; implemented as a_-prefixed method inTasksper the gem-owned naming convention--debugand--verbosebuilt-inclass_optiondeclarations onTasks— set$DEBUG/$VERBOSEbefore any task runs via theinvoke_commandhook inAsgard::Basedebug?andverbose?private predicate helpers onTasks— thin wrappers around$DEBUGand$VERBOSEfor use inside task bodies_prefix convention for gem-owned methods inTasks— built-in methods use_prefix to distinguish them from user-defined tasksrun!guards against direct invocation of_-prefixed commands with a clean error message and exit 1examples/directory with working.lokifiles:kitchen_sink.loki— demonstrates the full Thor DSL (all option types,long_desc,class_option,default_task,map,depends_on,var,no_commands,private)server_subcommands.loki— subcommand group for server managementdb_subcommands.loki— subcommand group for database management withdepends_onchainingconcurrent.loki— demonstrates parallel task execution with interleaved thread output- README sections: Helper methods, Subcommands, Thor wrapper callout
Fixed¶
- Replaced
warn/exit 1withabortthroughoutrun!—Kernel#warnis silenced when$VERBOSE = nil, which is the default in Ruby 4.0;abortwrites to$stderrregardless
Changed¶
--debugand--verbosepromoted from mapped tasks toclass_option— they now work as modifiers alongside other commands (e.g.asgard build --debug) rather than as standalone commands- Removed all references to
justtask runner andrecipeterminology; Asgard uses "task" throughout depends_onparameter renamed from*recipesto*tasksfor consistency
0.1.1 — 2026-05-28¶
Added¶
- Parallel dependency execution — wrap deps in an array to run them concurrently:
depends_on [:build, :lint]ordepends_on :setup, [:build, :lint], :deploy Asgard.run!(argv)— single entry point encapsulating find, load, validate, and startAsgard.load_loki(dir)— auto-loads all*.lokifiles in a directory alphabeticallyTasksclass pre-defined by the gem (class Tasks < Asgard::Base) — task files reopen it without restating the superclasslib/asgard/tasks.rb— ships the pre-definedTasksclass
Changed¶
- Replaced
SimpleFlowdependency withDagwood— purpose-built DAG library with no extra dependencies and no Ruby 4 compatibility issues bin/asgardsimplified to two lines:require "asgard"+Asgard.run!(ARGV)- Task file convention:
.lokiis the project root marker and entry point;*.lokifiles each reopenclass Tasksand are auto-loaded before.loki Asgard.find_task_filesrenamed toAsgard.find_task_file(singular — only.lokiis the entry point)depends_onnow accepts mixed sequential/parallel stages; bare symbols run sequentially, arrays within the splat run in parallelrun!handles its own errors — missing.lokiand circular dependencies produce a clean one-line message and exit 1 rather than a backtrace- Thread-safe dep deduplication via class-level
_ran_tasksSet + Mutex replaces Thor's@_invocations - Removed
importmacro — task files use Ruby class reopening instead of modules
Removed¶
SimpleFlowdependency (replaced byDagwood)loggergem workaround (was only needed for SimpleFlow on Ruby 4)*.lokiglob fallback infind_task_file— only.lokiis the auto-discovered entry point
0.1.0 — 2026-05-28¶
Added¶
Asgard::Base— Thor subclass providing the task DSLdepends_on— declare task dependencies; dependencies run at most once per invocationvar— declare static or lazy-evaluated variables available to all tasksimport— flat-merge a task module into the current classdotenv— load a.envfile into the environmentsh— run a shell command or multiline heredoc script; exits with the command's status on failureshebang— write a script body to a tempfile and execute it with a given interpreter (:python3,:node,:ruby,:perl,:bash,:sh, or any custom interpreter)Asgard.find_task_files— search current directory and ancestors for task files- Task file resolution:
.lokitakes priority; falls back to all*.lokifiles sorted alphabetically asgardexecutable — finds task files, validates dependency graph, dispatches via Thor- Circular dependency detection via
SimpleFlow::DependencyGraphat startup - 100% test coverage enforced via SimpleCov (95% minimum threshold)
- Quality task in
.lokiruns flog after tests