From aeeec6a743b16fac8a61f4c667888153e545ca8b Mon Sep 17 00:00:00 2001 From: IMXEren Date: Wed, 30 Sep 2026 09:56:06 +0530 Subject: [PATCH 1/8] fix: upgrade Usage dependencies to v6.12.0 --- Cargo.lock | 12 +++++++++--- bin/cuc/Cargo.toml | 4 ++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3c861a6..d23007b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -128,7 +128,7 @@ checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" [[package]] name = "clap_usage" version = "5.0.0" -source = "git+https://github.com/jdx/usage?tag=v6.9.0#9e65ac0362edc2d4265667367316d3ab630f5ebb" +source = "git+https://github.com/jdx/usage?tag=v6.12.0#197b82b617e748b5c3c9a7f961af72edf1dd5db0" dependencies = [ "clap", "usage-lib", @@ -472,10 +472,15 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" +[[package]] +name = "usage-argv" +version = "6.12.0" +source = "git+https://github.com/jdx/usage?tag=v6.12.0#197b82b617e748b5c3c9a7f961af72edf1dd5db0" + [[package]] name = "usage-lib" -version = "6.9.0" -source = "git+https://github.com/jdx/usage?tag=v6.9.0#9e65ac0362edc2d4265667367316d3ab630f5ebb" +version = "6.12.0" +source = "git+https://github.com/jdx/usage?tag=v6.12.0#197b82b617e748b5c3c9a7f961af72edf1dd5db0" dependencies = [ "clap", "indexmap", @@ -487,6 +492,7 @@ dependencies = [ "serde", "thiserror 2.0.12", "unicode-width 0.2.2", + "usage-argv", "winnow 1.0.4", ] diff --git a/bin/cuc/Cargo.toml b/bin/cuc/Cargo.toml index 86694b5..7522bf8 100644 --- a/bin/cuc/Cargo.toml +++ b/bin/cuc/Cargo.toml @@ -19,8 +19,8 @@ anyhow = "1.0.104" base64 = "0.23.1" clap = { version = "4.6.6", features = ["derive"] } cuc-lib = { workspace = true } -clap_usage = { git = "https://github.com/jdx/usage", tag = "v6.9.0" } -usage = { package = "usage-lib", git = "https://github.com/jdx/usage", tag = "v6.9.0", default-features = false } +clap_usage = { git = "https://github.com/jdx/usage", tag = "v6.12.0" } +usage = { package = "usage-lib", git = "https://github.com/jdx/usage", tag = "v6.12.0", default-features = false } kdl = "6" indexmap = "2.13.0" tera = "2" From 3811b57c6ffb9352588fcd0679671018202dd0d2 Mon Sep 17 00:00:00 2001 From: IMXEren Date: Wed, 30 Sep 2026 09:56:22 +0530 Subject: [PATCH 2/8] fix: report Usage parse error details and source locations --- bin/cuc/src/spec.rs | 123 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 121 insertions(+), 2 deletions(-) diff --git a/bin/cuc/src/spec.rs b/bin/cuc/src/spec.rs index 74da4e7..00436b9 100644 --- a/bin/cuc/src/spec.rs +++ b/bin/cuc/src/spec.rs @@ -10,6 +10,7 @@ use cuc::{ Alias, Arg, Cmd, Complete, CompleteKind, DoubleDash, Flag, GlobalFlag, Info, PendingMount, }, }; +use usage::error::UsageErr; use usage::{Spec, SpecArg, SpecClause, SpecCommand, SpecComplete, SpecFlag}; pub trait UsageSpecExt @@ -23,7 +24,7 @@ where impl UsageSpecExt for cuc::usage::UsageSpec { fn load(file: Option<&PathBuf>) -> anyhow::Result { let spec = if let Some(path) = file { - Spec::parse_file(path)? + parse_spec("", Some(path))? } else { let mut input = std::io::stdin(); if input.is_terminal() { @@ -31,7 +32,7 @@ impl UsageSpecExt for cuc::usage::UsageSpec { } let mut source = String::new(); input.read_to_string(&mut source)?; - source.parse::()? + parse_spec(&source, None)? }; let mut pending = PendingMounts::default(); @@ -45,6 +46,37 @@ impl UsageSpecExt for cuc::usage::UsageSpec { } } +fn parse_spec(source: &str, file: Option<&PathBuf>) -> anyhow::Result { + match file { + Some(path) => Spec::parse_file(path), + None => source.parse::(), + } + .map_err(spec_parse_error) +} + +// InvalidInput's Display omits the detail and source location stored in its fields. +fn spec_parse_error(err: UsageErr) -> anyhow::Error { + match err { + UsageErr::InvalidInput(detail, span, source) => { + let text = source.inner(); + let offset = span.offset().min(text.len()); + let line = text + .bytes() + .take(offset) + .filter(|byte| *byte == b'\n') + .count() + + 1; + let name = if source.name().is_empty() { + "stdin" + } else { + source.name() + }; + anyhow::anyhow!("Invalid usage config at {name}:{line}: {detail}") + } + other => other.into(), + } +} + /// A mount's commands, keyed by the namespace of the command that declares it. /// /// They are kept out of the spec because a mount is not resolved while generating: @@ -832,4 +864,91 @@ mod tests { assert!(spec.cmds[0].pending_mounts.is_empty()); assert_eq!(spec.cmds[0].cmds[0].pending_mounts[0].run, "discover"); } + + fn load(source: &str) -> anyhow::Result { + parse_spec(source, None).map(|spec| convert_spec(spec, &PendingMounts::default())) + } + + #[test] + fn accepts_a_logo_with_a_style() { + let spec = load( + r#" + name "demo" + bin "demo" + logo "art" style="green" + "#, + ) + .unwrap(); + assert_eq!(spec.info.bin, "demo"); + } + + #[test] + fn accepts_a_newer_or_invalid_minimum_version_when_syntax_is_supported() { + for version in ["99.0", "not-a-version"] { + let spec = load(&format!( + "name \"demo\"\nbin \"demo\"\nmin_usage_version \"{version}\"\n" + )) + .unwrap(); + assert_eq!(spec.info.name, "demo"); + } + } + + #[test] + fn accepts_an_abbreviated_or_older_minimum_version() { + for version in [ + "6", + "6.1", + "6.9", + "6.12", + "6.12.0", + "6.12.0+build", + "6.12.0-rc.1", + ] { + let spec = load(&format!( + "name \"demo\"\nbin \"demo\"\nmin_usage_version \"{version}\"\n" + )) + .unwrap_or_else(|err| panic!("min_usage_version {version} was refused: {err:#}")); + assert_eq!(spec.info.name, "demo"); + } + } + + #[test] + fn reports_the_detail_and_position_of_a_rejected_spec() { + let err = load("name \"demo\"\nbin \"demo\"\nlogo \"art\" nonsense=#true\n").unwrap_err(); + let message = format!("{err:#}"); + assert!( + message.contains("unsupported logo key nonsense"), + "{message}" + ); + assert!(message.contains("stdin:3"), "{message}"); + } + + #[test] + fn reports_a_file_spec_with_its_path() { + let path = std::env::temp_dir().join(format!("cuc-usage-{}.kdl", std::process::id())); + let source = "name \"demo\"\nbin \"demo\"\nlogo \"art\" nonsense=#true\n"; + std::fs::write(&path, source).unwrap(); + + let err = parse_spec(source, Some(&path)).unwrap_err(); + std::fs::remove_file(&path).ok(); + + let message = format!("{err:#}"); + assert!( + message.contains(path.file_name().unwrap().to_str().unwrap()), + "{message}" + ); + assert!(message.contains(":3:"), "{message}"); + } + + #[test] + fn accepts_a_newer_minimum_version_in_a_file_too() { + let path = std::env::temp_dir().join(format!("cuc-usage-file-{}.kdl", std::process::id())); + let source = "name \"demo\"\nbin \"demo\"\nmin_usage_version \"99.0\"\n"; + std::fs::write(&path, source).unwrap(); + + let spec = parse_spec(source, Some(&path)).unwrap(); + std::fs::remove_file(&path).ok(); + + assert_eq!(spec.min_usage_version.as_deref(), Some("99.0")); + } } From 81fe32ad3497c44d2f87e70072999ab1a4d1820d Mon Sep 17 00:00:00 2001 From: IMXEren Date: Wed, 30 Sep 2026 09:56:23 +0530 Subject: [PATCH 3/8] fix: emit generated Lua functions in deterministic order --- bin/cuc/src/cli/generate/generator.rs | 110 +++++++++++++++++++++++++- 1 file changed, 107 insertions(+), 3 deletions(-) diff --git a/bin/cuc/src/cli/generate/generator.rs b/bin/cuc/src/cli/generate/generator.rs index 491088b..2e11b8e 100644 --- a/bin/cuc/src/cli/generate/generator.rs +++ b/bin/cuc/src/cli/generate/generator.rs @@ -470,14 +470,20 @@ end script_body += &arg_match_register_completion; } - for func in self.cached_functions.values() { - script_start += func; - } + Self::append_cached_functions(self.cached_functions, &mut script_start); script_start += &script_body; script_start } + fn append_cached_functions(cached_functions: &HashMap, out: &mut String) { + let mut functions: Vec<_> = cached_functions.iter().collect(); + functions.sort_by_key(|(name, _)| *name); + for (_, function) in functions { + out.push_str(function); + } + } + fn function_ref(name: impl AsRef) -> String { format!("{GENERATED_FUNCTION_TABLE}.{}", name.as_ref()) } @@ -1999,6 +2005,104 @@ mod tests { .generate() } + #[test] + fn cached_functions_emit_in_name_order_regardless_of_insertion() { + let mut forward = HashMap::new(); + forward.insert("_cuc.b".to_string(), "function _cuc.b() end\n".to_string()); + forward.insert("_cuc.a".to_string(), "function _cuc.a() end\n".to_string()); + forward.insert("_cuc.c".to_string(), "function _cuc.c() end\n".to_string()); + + let mut backward = HashMap::new(); + backward.insert("_cuc.c".to_string(), "function _cuc.c() end\n".to_string()); + backward.insert("_cuc.a".to_string(), "function _cuc.a() end\n".to_string()); + backward.insert("_cuc.b".to_string(), "function _cuc.b() end\n".to_string()); + + let mut forward_out = String::new(); + GeneratorView::append_cached_functions(&forward, &mut forward_out); + let mut backward_out = String::new(); + GeneratorView::append_cached_functions(&backward, &mut backward_out); + + assert_eq!(forward_out, backward_out); + assert_eq!( + forward_out, + "function _cuc.a() end\nfunction _cuc.b() end\nfunction _cuc.c() end\n" + ); + } + + #[test] + fn identical_specs_generate_identical_lua() { + let spec = UsageSpec { + info: Info { + name: "demo".into(), + bin: "demo".into(), + }, + flags: vec![ + Flag { + name: "verbose".into(), + names: vec!["--verbose".into()], + ..Default::default() + }, + Flag { + name: "output".into(), + names: vec!["--output".into()], + arg: Some(Arg { + name: "output".into(), + repr: "".into(), + ..Default::default() + }), + ..Default::default() + }, + ], + cmds: vec![ + Cmd { + name: "add".into(), + args: vec![Arg { + name: "task".into(), + repr: "".into(), + ..Default::default() + }], + ..Default::default() + }, + Cmd { + name: "remove".into(), + args: vec![Arg { + name: "name".into(), + repr: "".into(), + ..Default::default() + }], + ..Default::default() + }, + Cmd { + name: "list".into(), + args: vec![Arg { + name: "filter".into(), + repr: "".into(), + ..Default::default() + }], + ..Default::default() + }, + ], + ..Default::default() + }; + + let first = generate(spec.clone()); + let second = generate(spec); + + assert_eq!(first, second); + + // The emitted `_cuc` fields are in name order, not hash order. + let names = first + .lines() + .filter_map(|line| line.strip_prefix("function ")) + .filter_map(|line| line.split('(').next()) + .filter(|name| name.starts_with("_cuc.")) + .collect::>(); + assert!(names.len() > 1); + let mut sorted = names.clone(); + sorted.sort_unstable(); + assert_eq!(names, sorted); + } + #[test] fn links_unknown_first_word_to_default_subcommand() { let spec = UsageSpec { From b77778b2987aaf1283f17d320193983ee4ee6ef5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 30 Sep 2026 09:58:30 +0530 Subject: [PATCH 4/8] chore(deps): bump clap from 4.6.6 to 4.6.7 (#15) Bumps [clap](https://github.com/clap-rs/clap) from 4.6.6 to 4.6.7. - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/main/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.6.6...clap_complete-v4.6.7) --- updated-dependencies: - dependency-name: clap dependency-version: 4.6.7 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d23007b..2cdf0fe 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -87,9 +87,9 @@ checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" [[package]] name = "clap" -version = "4.6.6" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "473c7e07f409a8d772161724aa8db6a765a2532a70f9667eeb7b49d3d02fbdca" +checksum = "aa8876b300ab35ba921adea3dfd70157a46249b33f95c9084ae5709785478946" dependencies = [ "clap_builder", "clap_derive", @@ -97,9 +97,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.6.6" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b48fea5a88e9ae728a2dcbedbfc0e730f7d60da42e1cb049a83c9fb8b789889" +checksum = "ec0797fb7aeb1406c84efac526901f7ec3ead2124f946b494e72879d4b54704d" dependencies = [ "anstream", "anstyle", @@ -109,9 +109,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.6.4" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061" +checksum = "f9c751b79415d4e559e3d1fcf128e09e720eb673a06d26cf6f392d37d75b66e0" dependencies = [ "heck", "proc-macro2", From f3012700ca63b128c43c42aa993ce86595232b08 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 30 Sep 2026 09:59:19 +0530 Subject: [PATCH 5/8] chore(deps-dev): bump @semantic-release/github from 12.0.9 to 12.0.10 (#17) Bumps [@semantic-release/github](https://github.com/semantic-release/github) from 12.0.9 to 12.0.10. - [Release notes](https://github.com/semantic-release/github/releases) - [Commits](https://github.com/semantic-release/github/compare/v12.0.9...v12.0.10) --- updated-dependencies: - dependency-name: "@semantic-release/github" dependency-version: 12.0.10 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 35 +++++++++-------------------------- package.json | 2 +- 2 files changed, 10 insertions(+), 27 deletions(-) diff --git a/package-lock.json b/package-lock.json index c879038..c9c9e0f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "@semantic-release/changelog": "^7.0.0", "@semantic-release/exec": "^7.1.0", "@semantic-release/git": "^11.0.1", - "@semantic-release/github": "^12.0.9", + "@semantic-release/github": "^12.0.10", "conventional-changelog-conventionalcommits": "^9.3.1", "semantic-release": "^25.0.9" } @@ -186,13 +186,13 @@ "license": "MIT" }, "node_modules/@octokit/plugin-paginate-rest": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-14.0.0.tgz", - "integrity": "sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw==", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-15.0.0.tgz", + "integrity": "sha512-lw9A9YL5s4VPj+VEx8uMxaxQm2YTgrPDkrLEuZuu18R8TK3oPcXF4K6t52nx6xn1RcogZC9i188sAr/4XYJaQQ==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/types": "^16.0.0" + "@octokit/types": "^17.0.0" }, "engines": { "node": ">= 20" @@ -201,23 +201,6 @@ "@octokit/core": ">=6" } }, - "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": { - "version": "27.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-27.0.0.tgz", - "integrity": "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-16.0.0.tgz", - "integrity": "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^27.0.0" - } - }, "node_modules/@octokit/plugin-retry": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-8.1.1.tgz", @@ -523,14 +506,14 @@ } }, "node_modules/@semantic-release/github": { - "version": "12.0.9", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-12.0.9.tgz", - "integrity": "sha512-ODIqb0V3QqndipryEEiaBxUQCFjvv7Oese5Dt4omMGa60YRNEW0Sx3K+zri0uac2Y6S9nOlMehciWIzvvRCTGQ==", + "version": "12.0.10", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-12.0.10.tgz", + "integrity": "sha512-QskygvpX8hFx9UEbqJ+C46OIhaJjsysNQ8PYJPuRDc/ek5+dh8WYGD1ofUahCcGLAOmnnwZTcmCJCEXM8XxhRw==", "dev": true, "license": "MIT", "dependencies": { "@octokit/core": "^7.0.0", - "@octokit/plugin-paginate-rest": "^14.0.0", + "@octokit/plugin-paginate-rest": "^15.0.0", "@octokit/plugin-retry": "^8.0.0", "@octokit/plugin-throttling": "^11.0.0", "@semantic-release/error": "^4.0.0", diff --git a/package.json b/package.json index c93e439..2fac21e 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "@semantic-release/changelog": "^7.0.0", "@semantic-release/exec": "^7.1.0", "@semantic-release/git": "^11.0.1", - "@semantic-release/github": "^12.0.9", + "@semantic-release/github": "^12.0.10", "conventional-changelog-conventionalcommits": "^9.3.1", "semantic-release": "^25.0.9" } From 2dda198f28bb2a419d016405e77a805cf7dae991 Mon Sep 17 00:00:00 2001 From: IMXEren Date: Wed, 30 Sep 2026 10:08:07 +0530 Subject: [PATCH 6/8] fix: serialize release workflow runs --- .github/workflows/release.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f8fa9a4..851b6ff 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -7,6 +7,10 @@ on: permissions: contents: write +concurrency: + group: release + cancel-in-progress: false + jobs: release: name: Release From 3d51c86aed903f88b67bc38adf7ccf56d19bc43b Mon Sep 17 00:00:00 2001 From: IMXEren Date: Wed, 30 Sep 2026 10:08:14 +0530 Subject: [PATCH 7/8] ci: cancel superseded test runs per ref --- .github/workflows/test.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 56c6e8d..58e17e4 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -9,6 +9,10 @@ on: workflow_dispatch: workflow_call: +concurrency: + group: test-${{ github.ref }} + cancel-in-progress: true + jobs: test: runs-on: windows-latest From 9291672daa7111358fcb4d1a4912b2bb4d73d966 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Wed, 30 Sep 2026 04:43:02 +0000 Subject: [PATCH 8/8] chore: Release v0.4.1-dev.1 [skip ci] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## [0.4.1-dev.1](https://github.com/IMXEren/cuc/compare/v0.4.0...v0.4.1-dev.1) (2026-09-30) ### 🐛 Bug Fixes * emit generated Lua functions in deterministic order ([81fe32a](https://github.com/IMXEren/cuc/commit/81fe32ad3497c44d2f87e70072999ab1a4d1820d)) * report Usage parse error details and source locations ([3811b57](https://github.com/IMXEren/cuc/commit/3811b57c6ffb9352588fcd0679671018202dd0d2)) * serialize release workflow runs ([2dda198](https://github.com/IMXEren/cuc/commit/2dda198f28bb2a419d016405e77a805cf7dae991)) * upgrade Usage dependencies to v6.12.0 ([aeeec6a](https://github.com/IMXEren/cuc/commit/aeeec6a743b16fac8a61f4c667888153e545ca8b)) --- CHANGELOG.md | 9 +++++++++ Cargo.lock | 2 +- bin/cuc/Cargo.toml | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 78a0ee2..21de7c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +## [0.4.1-dev.1](https://github.com/IMXEren/cuc/compare/v0.4.0...v0.4.1-dev.1) (2026-09-30) + +### 🐛 Bug Fixes + +* emit generated Lua functions in deterministic order ([81fe32a](https://github.com/IMXEren/cuc/commit/81fe32ad3497c44d2f87e70072999ab1a4d1820d)) +* report Usage parse error details and source locations ([3811b57](https://github.com/IMXEren/cuc/commit/3811b57c6ffb9352588fcd0679671018202dd0d2)) +* serialize release workflow runs ([2dda198](https://github.com/IMXEren/cuc/commit/2dda198f28bb2a419d016405e77a805cf7dae991)) +* upgrade Usage dependencies to v6.12.0 ([aeeec6a](https://github.com/IMXEren/cuc/commit/aeeec6a743b16fac8a61f4c667888153e545ca8b)) + ## [0.4.0](https://github.com/IMXEren/cuc/compare/v0.3.0...v0.4.0) (2026-09-16) ### ✨ New Features diff --git a/Cargo.lock b/Cargo.lock index 2cdf0fe..8943221 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -142,7 +142,7 @@ checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" [[package]] name = "cuc-cli" -version = "0.4.0" +version = "0.4.1-dev.1" dependencies = [ "anyhow", "base64", diff --git a/bin/cuc/Cargo.toml b/bin/cuc/Cargo.toml index 7522bf8..e55a4c2 100644 --- a/bin/cuc/Cargo.toml +++ b/bin/cuc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cuc-cli" -version = "0.4.0" +version = "0.4.1-dev.1" edition = "2024" description = "A CLI tool to generate clink argmatcher completions from the usage spec." authors = { workspace = true }