DependencyControl
Dependency manager and automatic script updater for Aegisub macros and modules.
Module l0.DependencyControl in feed DependencyControl 7973b7b by line0.
Channels:
alpha:
Version: 0.8.1
Release Date: 2026-07-24
Required Modules:
- l0.dkjson@0.7.0
Files:
- .moon:
87CDA007933A971BAEFC91A044CF7FC941535D0D✅ - /Constants.moon:
E3FE6C143BA1B268C0B9F7A2840D729DBF7E1C35✅ - /ConfigHandler.moon:
6C8ACA7DD2BBA8AD22AB7E488F918297B820EDF9✅ - /ConfigView.moon:
BCCB1B7E7A85245BCDD87CE0CCCC1955CB161827✅ - /hash.moon:
452C471ADC2C3BD916B706637E412BB97D27C8DA✅ - /Downloader.moon:
153B19D16BD2CB2CCFB33C52470598F1BF2CCA7B✅ - /Enum.moon:
DD441AAF08C883F550061F8D8845D36969A2D629✅ - /EventEmitter.moon:
F7B363DC9D131BA8FA92751394206AFC90CA8BB8✅ - /FileCache.moon:
600F604B26D4C74D7FDC1F5BEA37512A49AF983F✅ - /FeedInventory.moon:
4EB32746AE7D048F15355350827C9A470CB5C384✅ - /FeedManager.moon:
9058C2FB8F273E6F0D72876BDADA029BAA8327D6✅ - /FeedTrust.moon:
D0BA0089596E30601BA70DD537855320CFC311B0✅ - /FileLock.moon:
28F79DB790CF4746441B6127A8953708D1A52501✅ - /file-ops.moon:
2FB92DBDC1AA861B7D5A859B165CE71C39E8FBD0✅ - /GitRepository.moon:
87138B0F382B1748DEE326EB1BAC471BD12E5CDA✅ - /Host.moon:
3A05ABCE9F229CDA731DD0F83A93AC2E58BEA3AD✅ - /JsonSchema.moon:
2707158CB66573CEA10465C21E3AB42708E482F7✅ - /Lock.moon:
CD9D4B1022CB943ACC004D692D58B3996A770B34✅ - /Logger.moon:
CBFC4B9C5699D3606D7AEE92137DA91DEC1B4EBD✅ - /ModuleLoader.moon:
F1ACB8570A361F9006A6E6BA74FFF84D1F058F3A✅ - /ModuleProvider.moon:
C740B9D7BC6C6651F25BA170215988644037B291✅ - /NamedSemaphore.moon:
E86D0C92DAC01797DA4A043814CDE252244657D3✅ - /PackageRecord.moon:
8BF956EEF2223D75B42FEBAE3BE21E2FC2A1CDA7✅ - /ScriptTargetFilter.moon:
4AD5EA4A952D81AFA4AF5200378444A7D129BB2B✅ - /ScriptUpdateRecord.moon:
9553BD9771DFEF0E35BA04814E2EAFFA0E27C51A✅ - /SemanticVersion.moon:
663BB4263B99C01E69AD897DAD7CF6420E17A666✅ - /Stub.moon:
879B162D749DE53788152A6C36DFAB7B0A5E8B9B✅ - /Timer.moon:
A3D4FA244AC2685285EFB297E94C24F070A17201✅ - /UnitTestSuite.moon:
526D4F50834FADBBC70C4A9D93E28FFD1F952B34✅ - /UpdateFeed.moon:
521AD8915BF09A02167ACDF73CE4C39E928F504A✅ - /UpdateTask.moon:
D7296244D4B9DAEAD0463CF6FE699AAF5CDF39A8✅ - /Updater.moon:
C4BAFF29F7FBE58EBF91C687B34D204B9AF49927✅ - /ZipArchiver.moon:
CC7A19E78B8B87DB70177A4A47CB10497232DF26✅ - /helpers/ffi-posix.moon:
43C4F016D231AB2EA08B00D12BB4629BACCBA02F✅ - /helpers/ffi-windows.moon:
C7A8C868F2F5A49A8A50754492C934DE12086AD8✅ - /helpers/open-url.moon:
9D06DA8BFE952C79FE5C2872CB4ABB5278A1A03F✅ - /helpers/resolve-host.moon:
B39C90E66A4869BF1561A2C2842906087D31F5D0✅ - /shims/BadMutex.moon:
4B8E87AEC8AEB772EE593D07AA063960EBD6DA98✅ - /shims/DownloadManager.moon:
6C76A29DBAE8EA947439C5CC13FD380A6179E2E8✅ - /shims/PreciseTimer.moon:
DC13468D9A31DC5E3DF4E1C20641C1F5853B1777✅ - /Accessors.moon:
F953283D5405C668090C7939C7C1E2D7D980FF63✅ - /FeedLoader.moon:
D0B097BF0C5BFCD60DF0E04B0D42F723A01997CF✅ - /config-schema.moon:
CC74ACBE7A7CD8761AD714564F3805AC96F68067✅ - /Finalizer.moon:
9C04FED8500BCB662505F16411FC522BD0A69AAF✅ - /release-notes.moon:
2B04AD21DDC44A8A1280900141BE4A5AD508495F✅ - /domain.moon:
C5D9BC686DFA4A85A28EE6E2E392B1E012A83909✅ - /environment.moon:
5D383C75F2E97A53B2343D554E9E2FC26C613FFF✅ - /utils.moon:
FA8307BC15AD2FEC1535F9B862E1D92C2A3A1AB9✅ - .moon: Test
1FE9D211C256E84F4C0F95BBA10659A1F7B9A0C7✅ - /BadMutex.moon: Test
36D24DA8FEB591C18C0A8020A8062D5B19A72C24✅ - /ConfigHandler.moon: Test
D0F735761CAC12540F7841DCF8A80AB6C20ECCE5✅ - /ConfigView.moon: Test
A0E00272169CA1FFAADF0A672C468A975D9B9F82✅ - /hash.moon: Test
B1C6AC7433296675E6A686F16D977510D922BF26✅ - /Downloader.moon: Test
93C779DAC6F05150CFE92A733F9C33B6A6856286✅ - /Enum.moon: Test
1BF9FF97C5668EB5046EE80B24F52F9C53F54A02✅ - /FileCache.moon: Test
633106FDCDD0AB81CFC2BB85725B9A7B0077AF83✅ - /FeedInventory.moon: Test
5D820751E60E8609CD65427ED01DD312E869001B✅ - /FeedManager.moon: Test
5859561F6CAA7E1B3178A14E281BAFD87E7CD42D✅ - /FeedTrust.moon: Test
FF605ACEC47E863CE5DACFB80760119F15608931✅ - /ffi-posix.moon: Test
5CCE5A5C81C20D76CA461377765DF5D99EE03FA3✅ - /FileLock.moon: Test
BDDBF39514737134726E90D5DDA6AD2798A861E6✅ - /file-ops.moon: Test
AB2BBDDFEDBB158963CFDFAE196C584E105598CC✅ - /GitRepository.moon: Test
85FBCB85878CFE6FC9107CE6716072C681C897EC✅ - /Host.moon: Test
26C02949F93D08F199D45B13D9B86B579C68593B✅ - /JsonSchema.moon: Test
125E4930956E7DCA578C2F88EDB4B56C14A031C6✅ - /Lock.moon: Test
26B3D5CA9E6D91C6F4D9411F093C26B3AE58FA96✅ - /Logger.moon: Test
8D16E1C97C53D33E4250F4BEA8A988BBD02D9417✅ - /ModuleLoader.moon: Test
8FE0E4ED90D3ED719F7DE80877591EF2F30014AA✅ - /ModuleProvider.moon: Test
410D1F611788DFF50775F00E77EDEAD1CA929C76✅ - /NamedSemaphore.moon: Test
0FB8F5A84507F9CDAB3C02A882B149DC3C885442✅ - /open-url.moon: Test
A6ADC29FF30AB670AB2D0D8ED2A18740B591CD66✅ - /PackageRecord.moon: Test
9AB3488762804B65BF48CE33C44BA99628DF3F9D✅ - /ScriptTargetFilter.moon: Test
C731DA153C97FD92AF4F8465CC2B3865C086691E✅ - /ScriptUpdateRecord.moon: Test
287B0C04CC3A4BA92FE30E2258D7EFEA922AFE58✅ - /SemanticVersion.moon: Test
E242FE3C0332C60468E4B3F76DCFDE1D631172F9✅ - /Timer.moon: Test
8194244E95E508CBAAED66120C25CBC0F47ABD50✅ - /UnitTestSuite.moon: Test
CCDC45CAF499A14773BF59D5E80C7AA963A89BFF✅ - /UpdateFeed.moon: Test
4A3CE78253A52C70D6C28394BF724F9D0552DB0E✅ - /UpdateTask.moon: Test
5CA6FC899341677F702788F543373C8F3EDCFAA0✅ - /Updater.moon: Test
7945FCE5A2DC11257301DE5A2B2423E56A0AC4CB✅ - /ZipArchiver.moon: Test
508996E6E08DFDA179327AFD70219344E21BD66E✅ - /integration/Downloader.moon: Test
30B80FCF880C7139A0C86E26CD04F6DB41162698✅ - /integration/ZipArchiver.moon: Test
B96331C544F464FCC8B804837F9FD83B31E410A4✅ - /helpers/mock-http-server.moon: Test
FD34253C875C7DC0AE52DC18BDAEFE0534BBD10F✅ - /helpers/MockHttpServerController.moon: Test
F4F84B3E954CB41DF6157ECF623B36DA3FF8EEBD✅ - /Accessors.moon: Test
4DF5070BE92B4F61F53A75F01CEC93E36BC4D51C✅ - /FeedLoader.moon: Test
D24848390EC92F0FCD088ECFDA62C67D12700F8F✅ - /config-schema.moon: Test
C65BC75E4ACF11F2CA174255CB6792C3C4FAD7A7✅ - /Finalizer.moon: Test
10A76A5FC556B3283F1677AD93457C60632A9CD6✅ - /helpers/stub-helpers.moon: Test
ED12F95454B98E86A207D02EEDD42F84B19E2E3C✅ - /release-notes.moon: Test
A6E2F4FAC1EE2ED44D90CEC38D45D87691618FB4✅ - /domain.moon: Test
2406064A5B8F234ECB69E9C60F5FC1A5E9B7657A✅ - /utils.moon: Test
F78238492CB05F9F1568C14DE363A83CE1CAB6D8✅ - /environment.moon: Test
1889EFB487A85EF9CD9838312B36CAB97D332119✅
stable (Default):
Version: 0.8.1
Release Date: 2026-07-24
Required Modules:
- l0.dkjson@0.7.0
Files:
- .moon:
87CDA007933A971BAEFC91A044CF7FC941535D0D✅ - /Constants.moon:
E3FE6C143BA1B268C0B9F7A2840D729DBF7E1C35✅ - /ConfigHandler.moon:
6C8ACA7DD2BBA8AD22AB7E488F918297B820EDF9✅ - /ConfigView.moon:
BCCB1B7E7A85245BCDD87CE0CCCC1955CB161827✅ - /hash.moon:
452C471ADC2C3BD916B706637E412BB97D27C8DA✅ - /Downloader.moon:
153B19D16BD2CB2CCFB33C52470598F1BF2CCA7B✅ - /Enum.moon:
DD441AAF08C883F550061F8D8845D36969A2D629✅ - /EventEmitter.moon:
F7B363DC9D131BA8FA92751394206AFC90CA8BB8✅ - /FileCache.moon:
600F604B26D4C74D7FDC1F5BEA37512A49AF983F✅ - /FeedInventory.moon:
4EB32746AE7D048F15355350827C9A470CB5C384✅ - /FeedManager.moon:
9058C2FB8F273E6F0D72876BDADA029BAA8327D6✅ - /FeedTrust.moon:
D0BA0089596E30601BA70DD537855320CFC311B0✅ - /FileLock.moon:
28F79DB790CF4746441B6127A8953708D1A52501✅ - /file-ops.moon:
2FB92DBDC1AA861B7D5A859B165CE71C39E8FBD0✅ - /GitRepository.moon:
87138B0F382B1748DEE326EB1BAC471BD12E5CDA✅ - /Host.moon:
3A05ABCE9F229CDA731DD0F83A93AC2E58BEA3AD✅ - /JsonSchema.moon:
2707158CB66573CEA10465C21E3AB42708E482F7✅ - /Lock.moon:
CD9D4B1022CB943ACC004D692D58B3996A770B34✅ - /Logger.moon:
CBFC4B9C5699D3606D7AEE92137DA91DEC1B4EBD✅ - /ModuleLoader.moon:
F1ACB8570A361F9006A6E6BA74FFF84D1F058F3A✅ - /ModuleProvider.moon:
C740B9D7BC6C6651F25BA170215988644037B291✅ - /NamedSemaphore.moon:
E86D0C92DAC01797DA4A043814CDE252244657D3✅ - /PackageRecord.moon:
8BF956EEF2223D75B42FEBAE3BE21E2FC2A1CDA7✅ - /ScriptTargetFilter.moon:
4AD5EA4A952D81AFA4AF5200378444A7D129BB2B✅ - /ScriptUpdateRecord.moon:
9553BD9771DFEF0E35BA04814E2EAFFA0E27C51A✅ - /SemanticVersion.moon:
663BB4263B99C01E69AD897DAD7CF6420E17A666✅ - /Stub.moon:
879B162D749DE53788152A6C36DFAB7B0A5E8B9B✅ - /Timer.moon:
A3D4FA244AC2685285EFB297E94C24F070A17201✅ - /UnitTestSuite.moon:
526D4F50834FADBBC70C4A9D93E28FFD1F952B34✅ - /UpdateFeed.moon:
521AD8915BF09A02167ACDF73CE4C39E928F504A✅ - /UpdateTask.moon:
D7296244D4B9DAEAD0463CF6FE699AAF5CDF39A8✅ - /Updater.moon:
C4BAFF29F7FBE58EBF91C687B34D204B9AF49927✅ - /ZipArchiver.moon:
CC7A19E78B8B87DB70177A4A47CB10497232DF26✅ - /helpers/ffi-posix.moon:
43C4F016D231AB2EA08B00D12BB4629BACCBA02F✅ - /helpers/ffi-windows.moon:
C7A8C868F2F5A49A8A50754492C934DE12086AD8✅ - /helpers/open-url.moon:
9D06DA8BFE952C79FE5C2872CB4ABB5278A1A03F✅ - /helpers/resolve-host.moon:
B39C90E66A4869BF1561A2C2842906087D31F5D0✅ - /shims/BadMutex.moon:
4B8E87AEC8AEB772EE593D07AA063960EBD6DA98✅ - /shims/DownloadManager.moon:
6C76A29DBAE8EA947439C5CC13FD380A6179E2E8✅ - /shims/PreciseTimer.moon:
DC13468D9A31DC5E3DF4E1C20641C1F5853B1777✅ - /Accessors.moon:
F953283D5405C668090C7939C7C1E2D7D980FF63✅ - /FeedLoader.moon:
D0B097BF0C5BFCD60DF0E04B0D42F723A01997CF✅ - /config-schema.moon:
CC74ACBE7A7CD8761AD714564F3805AC96F68067✅ - /Finalizer.moon:
9C04FED8500BCB662505F16411FC522BD0A69AAF✅ - /release-notes.moon:
2B04AD21DDC44A8A1280900141BE4A5AD508495F✅ - /domain.moon:
C5D9BC686DFA4A85A28EE6E2E392B1E012A83909✅ - /environment.moon:
5D383C75F2E97A53B2343D554E9E2FC26C613FFF✅ - /utils.moon:
FA8307BC15AD2FEC1535F9B862E1D92C2A3A1AB9✅ - .moon: Test
1FE9D211C256E84F4C0F95BBA10659A1F7B9A0C7✅ - /BadMutex.moon: Test
36D24DA8FEB591C18C0A8020A8062D5B19A72C24✅ - /ConfigHandler.moon: Test
D0F735761CAC12540F7841DCF8A80AB6C20ECCE5✅ - /ConfigView.moon: Test
A0E00272169CA1FFAADF0A672C468A975D9B9F82✅ - /hash.moon: Test
B1C6AC7433296675E6A686F16D977510D922BF26✅ - /Downloader.moon: Test
93C779DAC6F05150CFE92A733F9C33B6A6856286✅ - /Enum.moon: Test
1BF9FF97C5668EB5046EE80B24F52F9C53F54A02✅ - /FileCache.moon: Test
633106FDCDD0AB81CFC2BB85725B9A7B0077AF83✅ - /FeedInventory.moon: Test
5D820751E60E8609CD65427ED01DD312E869001B✅ - /FeedManager.moon: Test
5859561F6CAA7E1B3178A14E281BAFD87E7CD42D✅ - /FeedTrust.moon: Test
FF605ACEC47E863CE5DACFB80760119F15608931✅ - /ffi-posix.moon: Test
5CCE5A5C81C20D76CA461377765DF5D99EE03FA3✅ - /FileLock.moon: Test
BDDBF39514737134726E90D5DDA6AD2798A861E6✅ - /file-ops.moon: Test
AB2BBDDFEDBB158963CFDFAE196C584E105598CC✅ - /GitRepository.moon: Test
85FBCB85878CFE6FC9107CE6716072C681C897EC✅ - /Host.moon: Test
26C02949F93D08F199D45B13D9B86B579C68593B✅ - /JsonSchema.moon: Test
125E4930956E7DCA578C2F88EDB4B56C14A031C6✅ - /Lock.moon: Test
26B3D5CA9E6D91C6F4D9411F093C26B3AE58FA96✅ - /Logger.moon: Test
8D16E1C97C53D33E4250F4BEA8A988BBD02D9417✅ - /ModuleLoader.moon: Test
8FE0E4ED90D3ED719F7DE80877591EF2F30014AA✅ - /ModuleProvider.moon: Test
410D1F611788DFF50775F00E77EDEAD1CA929C76✅ - /NamedSemaphore.moon: Test
0FB8F5A84507F9CDAB3C02A882B149DC3C885442✅ - /open-url.moon: Test
A6ADC29FF30AB670AB2D0D8ED2A18740B591CD66✅ - /PackageRecord.moon: Test
9AB3488762804B65BF48CE33C44BA99628DF3F9D✅ - /ScriptTargetFilter.moon: Test
C731DA153C97FD92AF4F8465CC2B3865C086691E✅ - /ScriptUpdateRecord.moon: Test
287B0C04CC3A4BA92FE30E2258D7EFEA922AFE58✅ - /SemanticVersion.moon: Test
E242FE3C0332C60468E4B3F76DCFDE1D631172F9✅ - /Timer.moon: Test
8194244E95E508CBAAED66120C25CBC0F47ABD50✅ - /UnitTestSuite.moon: Test
CCDC45CAF499A14773BF59D5E80C7AA963A89BFF✅ - /UpdateFeed.moon: Test
4A3CE78253A52C70D6C28394BF724F9D0552DB0E✅ - /UpdateTask.moon: Test
5CA6FC899341677F702788F543373C8F3EDCFAA0✅ - /Updater.moon: Test
7945FCE5A2DC11257301DE5A2B2423E56A0AC4CB✅ - /ZipArchiver.moon: Test
508996E6E08DFDA179327AFD70219344E21BD66E✅ - /integration/Downloader.moon: Test
30B80FCF880C7139A0C86E26CD04F6DB41162698✅ - /integration/ZipArchiver.moon: Test
B96331C544F464FCC8B804837F9FD83B31E410A4✅ - /helpers/mock-http-server.moon: Test
FD34253C875C7DC0AE52DC18BDAEFE0534BBD10F✅ - /helpers/MockHttpServerController.moon: Test
F4F84B3E954CB41DF6157ECF623B36DA3FF8EEBD✅ - /Accessors.moon: Test
4DF5070BE92B4F61F53A75F01CEC93E36BC4D51C✅ - /FeedLoader.moon: Test
D24848390EC92F0FCD088ECFDA62C67D12700F8F✅ - /config-schema.moon: Test
C65BC75E4ACF11F2CA174255CB6792C3C4FAD7A7✅ - /Finalizer.moon: Test
10A76A5FC556B3283F1677AD93457C60632A9CD6✅ - /helpers/stub-helpers.moon: Test
ED12F95454B98E86A207D02EEDD42F84B19E2E3C✅ - /release-notes.moon: Test
A6E2F4FAC1EE2ED44D90CEC38D45D87691618FB4✅ - /domain.moon: Test
2406064A5B8F234ECB69E9C60F5FC1A5E9B7657A✅ - /utils.moon: Test
F78238492CB05F9F1568C14DE363A83CE1CAB6D8✅ - /environment.moon: Test
1889EFB487A85EF9CD9838312B36CAB97D332119✅
Changelog:
0.8.1:
- fix: Reading the channel list of a package that declares no channels returns an empty list instead of throwing an error.
0.8.0:
- feat: New
get-versionandget-current-versionsCLI commands report a feed channel's highest version or its distinct package versions.
0.7.0:
- change(Updater)!: Package sources are now chosen by trust, not just version, to harden against supply-chain attacks. Feeds are consulted closest-first, starting with the feed a script declares for a dependency, then the feeds DependencyControl trusts, then any others. The trusted set is DependencyControl's own feed plus your
extraFeeds, and an install is refused when a requirement can only be met from an untrusted feed. YourtrustedFeedsgrant trust without being searched for updates, while a newblockedFeedsconfig and an official block list reject compromised feeds outright. The obsoletetryAllFeedssetting and its exhaustive update mode were removed. - feat(Updater): DependencyControl can now prompt on trust decisions. When an install can only come from an untrusted feed, it asks whether to use the feed once, trust it, or block it, and when several equally-ranked sources qualify, it asks you to pick one. The new
feedTrustPromptThresholdandpackageChoicePromptThresholdsettings control how freely it prompts. Your pick can stick in different ways, from a single use up to a pin that never switches silently, and it follows a source across feed-URL changes. The newofferAllSourcessetting offers every eligible source so you can override the ranking. - feat(Updater): Feed and package downloads now refuse hosts that resolve to a private, loopback, or link-local address, an SSRF safeguard controlled by the new
blockPrivateHostssetting. It is on by default, so turn it off to use feeds on your local network. Each feed fetch is also capped in size and time through the newmaxFeedSizeandfeedFetchTimeoutsettings. - feat(Updater): A required module that no feed offers directly can now be satisfied by a module that declares it in
provides. For example, a script that requiresjsoncan be satisfied by installingdkjson. A directly-named module is always preferred over a provider, and once a provider is chosen it keeps being used and updated. Feeds advertiseprovidesper release, and a provider can pin an npm-style version range such as~1.2that it satisfies, so it need not be re-published for every patch release. - change(Updater): The updater's on/off switch became an update mode. The new
updates.modetakes 'off', 'user-requested', 'dependency-resolution', or 'auto-update' to control which contexts may install and update, so you can allow manual installs while disabling background checks. An existingupdaterEnabledsetting migrates automatically, and the two prompt-threshold settings now take the same context values. - change(Updater): Automatic update scheduling is now centralized. One Aegisub environment at startup covers every installed script, including modules that no automation script loads, instead of each script redundantly scheduling checks for the modules it uses.
- change(Updater): Scripts installed in Aegisub's data automation directory, such as modules from a system package manager, are no longer auto-updated. Scheduled checks skip them, and manual installs or updates report a clear error. Portable setups where the user and data directories are the same are unaffected.
- change(Updater): Concurrent updates across Aegisub instances are now coordinated by a cross-process lock that releases automatically if an updater crashes, so a stale in-progress flag can no longer get stuck in the config. The new
Updater.isRunning()reports whether an update is in flight and which script it is for. - fix(Updater): Disabling updates now also prevents on-demand installs and dependency resolution, not just scheduled background checks.
- feat: Fetched feeds are now cached to disk as timestamped snapshots. A recently fetched feed is served from the cache instead of being re-downloaded, and a failed fetch falls back to the last cached copy for offline resilience. The freshness window is the new
cacheMaxAgesetting, and the location is the sharedpaths.cache, which replaces the formerdumpFeedsdebug dump. - feat: Feed discovery can now follow feeds' advertised
knownFeedsto surface feeds beyond the ones you configured. Untrusted expansion is bounded by the newfetchUntrustedFeedsandcrawlLimitssettings, so a hostile feed cannot drive unbounded fetches. - feat: Added
FeedInventoryandFeedManager, building blocks that list the feeds DependencyControl knows about with their provenance and trust status and apply trust actions. They back the Toolbox's new Manage Feeds macro and are available to other tooling. - change: DependencyControl's settings file is now organized into
updates,feeds,logging, andpathssections, and an existing config is migrated into the new layout automatically on first load. Several settings were renamed in the process, for exampleupdaterEnabledtoupdates.modeandfeedCacheMaxAgetofeeds.cacheMaxAge. The separate feed-cache directory gave way to a singlepaths.cachelocation that DependencyControl organizes by namespace. - change: The config file is now easier to read and maintain by hand. Each installed script's version is stored as a semantic-version string such as "1.2.3" rather than a packed integer, only the values you have actually changed are written, and the file is saved as indented, pretty-printed JSON. Existing configs are migrated automatically on first load.
- change: DependencyControl now refuses to load on an Aegisub build it can't run on, showing an error that directs you to update. It needs a MoonScript at or above its minimum version, and a LuaJIT built with Lua 5.2 compatibility, which its computed properties and cross-type version comparisons rely on.
- feat: Feed format v0.4.0 reduces repetition for feed authors. Per-file-type URL and path templates can be set once at the feed root or on a macros/modules section container and roll down to every package, while the single-string
fileBaseUrlandlocalFileBasePathkeep working as the fallback. Feeds can also define their own template variables, including lookup tables indexed by a computed key such as a per-channel tag suffix, and the newscriptTypeandscriptTypeSectionvariables expose each package's type and feed section. - feat(SemanticVersion): SemanticVersion is now a value object. You can construct it from a version string or from major, minor, and patch components, compare instances with the standard operators, read and bump the individual parts, and test it against a version range. A record's version is backed by one and exposed as
record.semanticVersion, whilerecord.versionstill returns the packed integer as before. - feat: Added the Accessors module for declaring metatable-backed computed properties through one standardized transform, instead of hand-rolled metatable code. Each declared property is recorded on the class for inspection tooling.
- change: The monolithic
DependencyControl.moonwas split into focused sub-modules as groundwork for a future registry backend.PackageRecord,ModuleLoader,SemanticVersion, and thedomain,environment, andutilstables now own version records, module loading, version handling, and the shared enums and helpers. Script and record types are represented by proper enums,ScriptTypeandRecordType, rather than bare booleans. - feat(Tests): Automation scripts can now ship a DependencyControl unit-test suite, just as modules can.
registerMacrosaccepts an optional table of test exports and passes it, together with the script's registered macros, to the suite. Modules with a test suite also have their test menus registered automatically by the Toolbox. - feat(Tests): Added
ut\skip(reason)to skip a single test from within its body, reported as skipped rather than passed or failed. A test class's_ordernow sets only the run and report order, so a test left out of it still runs and is appended after the listed ones. - fix(Tests): Fixed a cluster of long-broken assertions and behaviors.
assertContainsnow honors its case-insensitive option,assertItemsEqual,assertContinuous,assertNotAlmostEquals, andassertErrorreport correct results and messages,ut\stubworks inside a class_setup, a failing setup is reported as a failure instead of aborting the whole run, and the CTRF report records accurate timings. - feat(FileOps): Added
getAttributes(), which returns a file or directory's attributes together with the parsed components of its path, keeping a genuine lookup failure out of the returned value. The previousattributes()remains as a deprecated wrapper. A hard attribute-lookup failure is no longer mistaken for a missing or wrong-typed file, sowriteFile,listDir,rmdir, andremovesurface the real error. - fix(FileOps): Uninstalling a package no longer deletes files belonging to a sibling package whose name shares a prefix, and namespaces containing hyphens now match only their own files.
- fix(PackageRecord): registerMacro now fails at registration with a clear message when its process callback is missing or not a function, instead of an opaque "attempt to call a nil value" when the macro is run.
- fix: Installs and updates inside Aegisub no longer fail with a spurious "failed to create temporary download directory" error, which came from Aegisub's bundled lfs reporting directory creation differently from stock LuaFileSystem.
- feat(Timer): Exposed a shared monotonic
Timer.getTime()clock, added stopwatchstart(),stop(), andreset()methods and anelapsedproperty in milliseconds, and routed PreciseTimer through the same bundled-provider mechanism as BadMutex and DownloadManager. - feat(Hash): Added
getObjectHash(), which reduces an arbitrary, possibly nested Lua value to a stable, order-independent SHA-1 signature. - feat(utils): Added the
makeSet,addDefaults,trim, andescapePatternhelpers, shared with the Functional module. - feat(utils): Added
seedRandomandgetRandomSeedfor seeding Lua's random number generator with a value unique to the current script's Lua state. A script can callseedRandomto reseed the generator itself rather than depend on DependencyControl's load-time seeding. - change(Lock): Locks are now per-resource, so distinct resources no longer contend over a single global mutex. An optional
Globalscope enforces mutual exclusion across separate Aegisub instances, used when reading and writing shared config files. A Global lock is backed by an OS advisory lock that the system releases if the holder crashes, so a config file can never stay permanently locked. A held lock records its holder for troubleshooting, warns when it waits on a lapsed lease, and adds arenew()method and aLock.guardhelper that always releases the lock. - change: Scripts using DependencyControl no longer pause about half a second while loading. The wait that spread the random seed across simultaneously loading scripts is gone. Each script's Lua state now seeds from its own identity together with the monotonic clock and process id, so states loading at the same instant still get distinct log file names and temp paths.
- fix: Many updater and installer messages and error reports were corrected. Among them, "Couldn't installation module" and "Starting nil of ..." are fixed, dependency-resolution errors no longer print "of nil Module" or drop the failing sub-requirement, and a failing optional dependency or module initializer now surfaces with its name and the real error instead of being mislabeled or dropped.
- fix(Logger): Progress bars now fill incrementally instead of jumping from empty to full, the log window no longer repeats the indentation prefix inside incrementally written output, and the
usePrefixoption applies to both the log file and the window. - fix: Several smaller correctness fixes.
mkdirno longer reports success when creation failed, the temporary download directory is removed after a successful install, andSemanticVersion.toStringrenders nil as "0.0.0" instead of erroring. - change: DependencyControl and its Toolbox now update from a
stablechannel by default, with thealphachannel kept for pre-release builds. An installation pinned toalphais moved tostableautomatically the first time v0.7.0 loads. - feat: The CLI gained documentation and maintenance tooling.
generate-typesextracts LuaCATS annotations into LuaLS type-definition files, andgenerate-docsrenders browsable API docs from a feed's module sources. Both are powered by the newl0.MoonCatsmodule. A newupdate-feed --add-filesoption discovers on-disk files missing from a feed and adds complete entries for them. - feat: Releases now version feed packages in lockstep, advancing only the packages that changed to a single shared repo-level version. New
bump-version,merge-feed, andrelease-notesCLI tasks and anupdate-feed --mark-releasedoption drive the release workflow. Changelog entries can also carry conventional-commit markers that the generated release notes group by category and use to flag breaking changes. - change: A short-form required-module dependency that names more than one module (such as
{"ffi", "json"}) is now detected and reported with a warning. Only the first name is honored, as before. - fix: When several scripts install modules at the same time, a dependency that isn't installed yet is no longer mistaken for an installed one while waiting for another update to finish.
- refactor: Reinstalling a managed module that exposes a plain version string instead of its DependencyControl record no longer demotes it to unmanaged, so it keeps receiving scheduled update checks.
- feat: New
resolve-feedCLI command expands a feed's templates into a static, template-free feed compatible with the legacy v0.3.0 feed format. - fix: Reloading a freshly updated module also evicts its cached submodules, so a multi-file module no longer reloads into a mix of new and stale code.
0.6.4:
- Logger: Fixed a crash when
logEx()is called without format arguments ΓÇömsg:format(...)is now skipped when no varargs are supplied. - Logger:
fileBaseNamenow falls back to"UNKNOWN"whenscript_namespaceis nil, preventing errors during Logger initialization in contexts where no namespace is available. - Logger/UpdateFeed: Fixed chained method calls on file handles (
handle:write():flush()andhandle:write():close()) that could silently swallow errors
0.6.3:
- Fixed a v0.6.2 regression that caused DependencyControl to fail loading the first time after a scheduled self-update.
0.6.2:
- An issue was fixed that would cause DepCtrl initializer code in modules previously loaded with regular Lua loading mechanisms to be skipped when requested in a DependencyControl- context. This kept the requireffi DependencyControl record from being established, preventing any updates from taking place.
- UnitTestSuite: Fixed several broken assertions and related error messages, among them the
assertMatchesandassertErrorMatchesassertions always returningtrue. Please make sure to rerun your tests after upgrading to confirm your tested actually return values whatever they were supposed to match. - Updater: Identical or duplicate feeds from different sources (user configuration, feeds and API use) are no longer being checked for updates multiple times.
- Updater / FileOps: Fixed several broken error messages and return values.
0.6.1:
- The Updater component now supports the DownloadManager v0.4.0 API changes.
- Updater: A regression introduced in v0.6.0 was fixed that caused update or installation processes to fail when the feed contained deletion records.
- FileOps.mkdir() no longer falsely returns an error state when a path to an existing file is passed with the
isFileflag set.
0.6.0:
- The UnitTestSuite framework for automatically testing automation scripts and modules has been added.
- Macros can now be registered with custom submenu name.
- Logger:logEx() now takes an additional optional
indentparameter to specify a custom indentation level. - FileOps.move() no longer overwrites existing files by default.
- FileOps.mkdir() can now take paths relative to the current working directory as input and returns
trueon success,falsewhen the directory already exists ornilif the operation failed. - FileOps.remove() now returns detailed results for every path specified in addition to overall success information.
- FileOps.move() no longer fails to move files across file systems on *nix operating systems and properly cleans up after itself if files could not be overwritten and were renamed instead.
- FileOps: path validation is no longer broken on non-windows systems
0.5.3:
- ConfigHandler: A host of longstanding issues related to config file corruption and concurrent access to config files from multiple DepCtrl-hosting automation scripts have been fixed.
- Error Reports of required modules loaded by DependencyControl now actually provide semi-useful stack traces.
- A bug was fixed that could cause DepCtrl to rerun the __depCtrlInit method on modules even though a prior DependencyControl record had already been initialized.
- The DependencyControl self-update now runs through properly without throwing an error at the end of the process.
0.5.2:
- Updates and installations no longer fail when no suitable version of a module marked as an optional dependency can be found.
- ConfigHandlers now recover gracefully when a corrupted config is encountered.
- Fixed a bug that may have caused updates of unmanaged modules to throw an error after completion.
- DependencyControl initialization functions in modules with optional DepCtrl support are now expected to use the predefined name __depCtrlInit. This lifts the unreasonable requirement of having to specify the name of the function in the dependency tables of the loading scripts. By extension, this also fixes errors when trying to update the binary modules required by DependencyControl (such as DownloadManager).
- The Updater now checks for an active internet connection before going ahead with downloading feeds and packages.
- FileOps: added a copy function for files.
0.5.1:
- Macros registered using DependencyControl now get passed the previously missing 'active_line' parameter.
- Fixed a bug that would cause an unrelated error to be thrown in place of the real error message when an updated module failed to load.
0.5.0:
- DependencyControl does now auto-update itself and its dependencies.
- Provided Sub-Modules (Logger, ConfigHandler, ...) can now easily be accessed as class properties of the main DependencyControl module.
- A bug was fixed that caused macros always being registered with the overall script description, ignoring specific descriptions for the macro menu entries.
- The \getConfigHandler() method no longer ignores the defaults parameter.
- Fixed a FileOps bug that would cause path validation to fail on paths relative to the working directory.
- ConfigHandler: writes to the configuration table are no longer accidentally routed to the defaults table when a value is updated that only exists in the Defaults.
- ConfigHandler: Looping over the configuration table is now completely transparent wrt which fields are user configuration or defaults.
- ConfigHandler: fixed a bug that prevented a global lock on the config file from being released on certain error conditions.
- The update feed format has been updated to v0.2.0 and introduces a new template variable to reference knownFeeds specified at the top level.
Reverse Dependencies:
- l0.DependencyControl.Toolbox