@guiho/runx 0.4.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -15,6 +15,18 @@ owner: runx
15
15
 
16
16
  # Changelog
17
17
 
18
+ ## 0.4.1 - 2026-07-18
19
+
20
+ ### Fixed
21
+
22
+ - Fixed `runx upgrade` so its required `--version`, `--arch`, `--variant`,
23
+ `--dry-run`, and `--format` flags route to the upgrade action instead of
24
+ being hidden by the command group or intercepted as the root version flag.
25
+ - Fixed no-argument startup so a decoded cached update notice is printed before
26
+ the exact RunX banner without waiting for network work.
27
+ - Fixed `runx agent prompt list --names` text output so it prints raw prompt
28
+ names, one per line, while JSON mode remains structured.
29
+
18
30
  ## 0.4.0 - 2026-07-18
19
31
 
20
32
  ### Added
@@ -7,12 +7,12 @@ files:
7
7
  citty-cli-migration-review.md: Reviews the implemented Citty command tree, compatibility adapter, tests, documentation, packaging, and release readiness.
8
8
  interactive-init-manifest-review.md: Reviews the implemented RunX initializer, strict manifest contract, tests, documentation, and delivery readiness.
9
9
  windows-self-upgrade-review.md: Reviews synchronous Windows replacement, rollback, cleanup, tests, CI coverage, and release readiness.
10
- rfc-0034-cli-compliance-migration-review.md: Accepts the complete RFC 0034 runtime, CLI, agent, installer, packaging, documentation, and release migration.
10
+ rfc-0034-cli-compliance-migration-review.md: Accepts the RFC 0034 migration after independent upgrade-routing, cached-notice, prompt-output, asset, and release-readiness corrections.
11
11
  documents:
12
12
  citty-cli-migration-review.md: Accepted implementation review for the full Citty CLI migration.
13
13
  interactive-init-manifest-review.md: Accepted implementation review for the RunX interactive init manifest feature.
14
14
  windows-self-upgrade-review.md: Accepted implementation review for the Windows native self-upgrade fix.
15
- rfc-0034-cli-compliance-migration-review.md: Accepted implementation review for RX-01 through RX-16.
15
+ rfc-0034-cli-compliance-migration-review.md: Accepted implementation and independent correction review for RX-01 through RX-16.
16
16
  tags:
17
17
  - reviews
18
18
  - implementation
@@ -31,6 +31,15 @@ JSON output, directory existence checking initially rejected valid command
31
31
  working directories, and legacy Windows cleanup tests waited indefinitely.
32
32
  Focused tests now cover each corrected behavior.
33
33
 
34
+ An independent post-release audit then found and corrected three additional
35
+ contract defects: the public upgrade flags were unreachable through the Citty
36
+ group and root `--version` intercepted the nested version selector;
37
+ no-argument startup skipped the decoded cached update notice; and text-mode
38
+ prompt names rendered as a JSON array. The corrected CLI routes all upgrade
39
+ flags through `runx upgrade`, prints a cached notice before the banner without
40
+ network work, and prints raw names one per line. Live-routing regression tests
41
+ cover each path.
42
+
34
43
  ## Acceptance Criteria Check
35
44
 
36
45
  - Mandatory Bun, TypeScript, Citty, and TypeBox stack: accepted.
@@ -48,9 +57,10 @@ Focused tests now cover each corrected behavior.
48
57
 
49
58
  ## Residual Risk
50
59
 
51
- Publishing and GitHub Release creation are intentionally outside this delivery.
52
- The workflows are validated locally and will execute only on a protected
53
- Mirror-managed version tag.
60
+ Package publication and GitHub Release creation remain tag-triggered workflow
61
+ effects rather than direct local actions. The patch release validates the
62
+ workflow inputs and exact asset set locally; the protected production workflow
63
+ still owns publication.
54
64
 
55
65
  ## References
56
66
 
@@ -49,7 +49,26 @@ npm bootstrap, and the exact fourteen release assets.
49
49
  The original unbounded suite hung in legacy process-oriented tests. The
50
50
  individual CLI baseline passed 10/10, proving the CLI was not persistently
51
51
  stuck. The obsolete tests were replaced or bounded; the final complete suite
52
- runs 38 tests and exits normally in about 28 seconds.
52
+ runs 40 tests and exits normally in about 30 seconds.
53
+
54
+ ## Independent Audit Corrections
55
+
56
+ The final independent RFC audit found three public-surface defects that the
57
+ first validation suite did not exercise:
58
+
59
+ - the `upgrade` group hid its apply flags and allowed root `--version` handling
60
+ to intercept `runx upgrade --version <version>`;
61
+ - no-argument startup skipped the cached update notice;
62
+ - text-mode `agent prompt list --names` rendered a JSON array instead of raw
63
+ names.
64
+
65
+ The correction keeps `upgrade check` and `upgrade list`, makes the public
66
+ `upgrade` command own and execute all RFC flags directly, gates root version
67
+ handling to a one-token root invocation, reads the local cache before the
68
+ no-argument banner, and emits one raw prompt name per line. Focused tests invoke
69
+ the real Citty routing and output paths. The ignored `bin/runx.exe` left by a
70
+ single-binary build was removed before exact-asset verification; the strict
71
+ fourteen-name comparison remains unchanged.
53
72
 
54
73
  ## References
55
74
 
@@ -69,7 +69,8 @@ RFC-named binaries plus `guiho-s-runx` and `guiho-i-runx`.
69
69
  ## Acceptance Signals
70
70
 
71
71
  - No prohibited Node built-ins exist in core CLI source.
72
- - No arguments prints exactly `Hello Windows - runx v<version>`.
72
+ - No arguments prints a decoded cached update notice first when one is
73
+ available, followed by exactly `Hello Windows - runx v<version>`.
73
74
  - `runx.yaml` resolves only by `--config`, effective cwd, then the standardized
74
75
  global path, and prints its absolute loaded path.
75
76
  - TypeBox decodes configuration, cache, remote releases, structured flags, and
@@ -6,11 +6,11 @@ children: []
6
6
  files:
7
7
  protect-branches-and-tag-creation.md: Records the verified active GitHub branch and release-tag rulesets for RunX.
8
8
  rfc-0034-cli-compliance-migration.md: Defines the required breaking migration outcome, scope, constraints, and completion signals for full RFC 0034 compliance.
9
- rfc-0034-cli-compliance-migration-implementation.md: Records the delivered RX units, implementation map, and test-hang diagnosis.
9
+ rfc-0034-cli-compliance-migration-implementation.md: Records the delivered RX units, implementation map, test-hang diagnosis, and independent audit corrections.
10
10
  documents:
11
11
  protect-branches-and-tag-creation.md: Completed task specification with active RunX ruleset IDs, protected patterns, and verification evidence.
12
12
  rfc-0034-cli-compliance-migration.md: Task specification linked from TODO task 1 for the full RunX CLI contract migration.
13
- rfc-0034-cli-compliance-migration-implementation.md: Completed implementation and validation handoff for TODO task 1.
13
+ rfc-0034-cli-compliance-migration-implementation.md: Completed implementation, independent correction, and validation handoff for TODO task 1.
14
14
  tags:
15
15
  - todo
16
16
  keywords:
@@ -10,7 +10,7 @@ tags:
10
10
  - cli
11
11
  keywords:
12
12
  - RFC 0034
13
- - 38 tests
13
+ - 40 tests
14
14
  - 14 assets
15
15
  - RunX
16
16
  owner: runx-validation
@@ -20,14 +20,16 @@ owner: runx-validation
20
20
 
21
21
  ## Summary
22
22
 
23
- All local RFC completion gates passed. No validation blocker remains.
23
+ All local RFC completion gates passed after independent audit corrections for
24
+ upgrade routing, no-argument cached notices, and names-only prompt output. No
25
+ validation blocker remains.
24
26
 
25
27
  ## Commands Run
26
28
 
27
29
  | Command or check | Result |
28
30
  | --- | --- |
29
31
  | `bun run typecheck` | Passed |
30
- | `bun test --timeout 30000` | Passed: 38 tests, 262 assertions |
32
+ | `bun test --timeout 30000` | Passed: 40 tests, 272 assertions |
31
33
  | `bun run build` | Passed |
32
34
  | `bun run binary` | Passed |
33
35
  | `bun run binaries` | Passed: twelve native targets |
@@ -36,10 +38,24 @@ All local RFC completion gates passed. No validation blocker remains.
36
38
  | packed npm bootstrap local-server smoke | Passed with Node and Bun removed from PATH |
37
39
  | prohibited core Node-import scan | Passed: zero matches |
38
40
  | CLI banner/help/config/agent/output/exit smoke tests | Passed in CLI suite |
41
+ | live `upgrade --help`, prompt names, source banner, and compiled version smokes | Passed |
39
42
  | PowerShell and POSIX installer contract tests | Passed |
40
43
  | `xdocs doctor --warnings-as-errors` | Passed: zero errors and zero warnings |
41
44
  | `git diff --check` | Passed |
42
45
 
46
+ ## Independent Audit Regression Evidence
47
+
48
+ - `runx upgrade` now exposes and executes `--version`, `--arch`, `--variant`,
49
+ `--dry-run`, and `--format` without root-version interception while retaining
50
+ `upgrade check` and `upgrade list`.
51
+ - A valid `newVersionAvailable: true` cache produces the required notice before
52
+ the no-argument banner with the update worker disabled.
53
+ - `agent prompt list --names` prints `guiho-i-runx` as a raw text line; JSON
54
+ mode still returns a parseable names array.
55
+ - The stale ignored `bin/runx.exe` created by the single-target build was
56
+ removed before matrix verification. The verifier itself remains strict and
57
+ observed only the twelve RFC binaries plus the two named agent assets.
58
+
43
59
  ## Exact Release Asset Evidence
44
60
 
45
61
  The verifier observed twelve `runx-*` assets using Linux, Darwin, and Windows
@@ -57,9 +73,9 @@ These are release mutations rather than local validation requirements.
57
73
 
58
74
  ## Readiness
59
75
 
60
- Ready for the authorized Mirror minor version application, one-file commits,
76
+ Ready for the authorized Mirror patch application to `0.4.1`, one-file commits,
61
77
  main push, and Mirror-managed tag/ref push. Package publication and GitHub
62
- Release creation remain intentionally unperformed.
78
+ Release creation remain intentionally unperformed as direct local actions.
63
79
 
64
80
  ## References
65
81
 
@@ -9,7 +9,7 @@ files:
9
9
  interactive-init-manifest.md: Records validation evidence for the interactive initializer and strict manifest contract.
10
10
  windows-self-upgrade.md: Records Windows replacement, rollback, cleanup, native build, CI, and XDocs validation evidence.
11
11
  upgrade-reliability.md: Tracks the superseded first pass and required revalidation after independent upgrade reliability review corrections.
12
- rfc-0034-cli-compliance-migration.md: Records passing RFC tests, builds, bootstrap, installer, import, and fourteen-asset evidence.
12
+ rfc-0034-cli-compliance-migration.md: Records passing RFC tests, live upgrade/startup/prompt regressions, builds, bootstrap, installers, import scan, and fourteen-asset evidence.
13
13
  documents:
14
14
  alpha-implementation-summary.md: Validation summary for the first RunX implementation.
15
15
  citty-cli-migration.md: Validation evidence for TypeScript, tests, native assets, npm packaging, CLI behavior, and XDocs.
@@ -17,7 +17,7 @@ documents:
17
17
  npm-trusted-publishing-0.2.2.md: Validation evidence for the blocked 0.2.2 npm trusted-publishing retry.
18
18
  windows-self-upgrade.md: Validation evidence for GitHub issues #9 and #1 and the Windows self-upgrade patch.
19
19
  upgrade-reliability.md: Revalidation record for GitHub issues 12 and 13; currently marked needs-revalidation.
20
- rfc-0034-cli-compliance-migration.md: Complete RFC 0034 validation and readiness report.
20
+ rfc-0034-cli-compliance-migration.md: Complete RFC 0034 correction validation and patch-release readiness report.
21
21
  tags:
22
22
  - validation
23
23
  keywords:
@@ -27,7 +27,8 @@ declare function applyAgentInstructions(cwd: string): Promise<string[]>;
27
27
  declare function updateAgentInstructions(cwd: string): Promise<string[]>;
28
28
  declare function removeAgentInstructions(cwd: string): Promise<string[]>;
29
29
  declare function showAgentInstructions(): Promise<string>;
30
- declare function listAgentPrompts(namesOnly?: boolean): string[] | Array<{
30
+ declare function listAgentPrompts(namesOnly: true): string[];
31
+ declare function listAgentPrompts(namesOnly?: false): Array<{
31
32
  id: string;
32
33
  description: string;
33
34
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../source/agents.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,uBAAuB,EACvB,qBAAqB,EACrB,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,uBAAuB,EACvB,gBAAgB,GACjB,CAAA;AAED,KAAK,iBAAiB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAAA;AAEtE,OAAO,CAAC,MAAM,CAAC;IACb,IAAI,2BAA2B,EAAE,iBAAiB,CAAA;CACnD;AAOD,iBAAe,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAElF;AAED,iBAAe,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAEjF;AAED,iBAAe,mBAAmB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAIpF;AAED,iBAAS,eAAe,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CAIpF;AAED,iBAAe,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAC,CAQtI;AAED,iBAAe,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAEpE;AAED,iBAAe,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAErE;AAED,iBAAe,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAYrE;AAED,iBAAe,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC,CAEtD;AAED,iBAAS,gBAAgB,CAAC,SAAS,UAAQ,GAAG,MAAM,EAAE,GAAG,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CAIlG;AAED,iBAAe,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAG1D"}
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../source/agents.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,uBAAuB,EACvB,qBAAqB,EACrB,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,uBAAuB,EACvB,gBAAgB,GACjB,CAAA;AAED,KAAK,iBAAiB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAAA;AAEtE,OAAO,CAAC,MAAM,CAAC;IACb,IAAI,2BAA2B,EAAE,iBAAiB,CAAA;CACnD;AAOD,iBAAe,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAElF;AAED,iBAAe,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAEjF;AAED,iBAAe,mBAAmB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAIpF;AAED,iBAAS,eAAe,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CAIpF;AAED,iBAAe,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAC,CAQtI;AAED,iBAAe,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAEpE;AAED,iBAAe,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAErE;AAED,iBAAe,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAYrE;AAED,iBAAe,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC,CAEtD;AAED,iBAAS,gBAAgB,CAAC,SAAS,EAAE,IAAI,GAAG,MAAM,EAAE,CAAA;AACpD,iBAAS,gBAAgB,CAAC,SAAS,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CAAA;AAOxF,iBAAe,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAG1D"}
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../source/cli.ts"],"names":[],"mappings":"AAAA;;GAEG;AA8BH,OAAO,KAAK,EAAkB,UAAU,EAAkB,MAAM,OAAO,CAAA;AAIvE,OAAO,EACL,MAAM,EACN,uBAAuB,EACvB,WAAW,GACZ,CAAA;AAuOD,QAAA,MAAiB,WAAW,iBAAwB,CAAA;AAEpD,iBAAe,MAAM,CAAC,OAAO,GAAE,MAAM,EAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CAoB9E;AAED,iBAAe,uBAAuB,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAexE"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../source/cli.ts"],"names":[],"mappings":"AAAA;;GAEG;AA8BH,OAAO,KAAK,EAAkB,UAAU,EAAkB,MAAM,OAAO,CAAA;AAIvE,OAAO,EACL,MAAM,EACN,uBAAuB,EACvB,WAAW,GACZ,CAAA;AAsPD,QAAA,MAAiB,WAAW,iBAAwB,CAAA;AAEpD,iBAAe,MAAM,CAAC,OAAO,GAAE,MAAM,EAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CAuB9E;AAED,iBAAe,uBAAuB,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAexE"}
package/library/cli.js CHANGED
@@ -102,7 +102,14 @@ function createCommandTree() {
102
102
  const instruction = group('runx agent instruction', 'Manage RunX instruction blocks.', { apply: instructionApply, remove: instructionRemove, update: instructionUpdate, show: instructionShow }, state);
103
103
  const promptList = leaf('runx agent prompt list', 'List bundled RunX prompts.', {
104
104
  names: { type: 'boolean', description: 'Print prompt names only.' }, format: catalogArgs.format,
105
- }, () => writeFormatted(listAgentPrompts(Boolean(state.args.names)), state.args));
105
+ }, () => {
106
+ if (state.args.names) {
107
+ const names = listAgentPrompts(true);
108
+ write(options(state.args).format === 'json' ? renderJson(names) : `${names.join('\n')}\n`);
109
+ return;
110
+ }
111
+ writeFormatted(listAgentPrompts(false), state.args);
112
+ });
106
113
  const promptShow = leaf('runx agent prompt show', 'Print one raw bundled prompt.', {
107
114
  id: { type: 'positional', description: 'Bundled prompt ID.' },
108
115
  }, async ({ args }) => {
@@ -112,14 +119,13 @@ function createCommandTree() {
112
119
  });
113
120
  const prompt = group('runx agent prompt', 'Inspect bundled agent prompts.', { list: promptList, show: promptShow }, state);
114
121
  const agent = group('runx agent', 'Manage RunX agent integration.', { skill, instruction, prompt }, state);
115
- const upgradeApply = leaf('runx upgrade', 'Upgrade the canonical native RunX executable.', {
122
+ const upgradeArgs = {
116
123
  version: { type: 'string', valueHint: 'version', description: 'Select an exact release version.' },
117
124
  arch: { type: 'string', valueHint: 'x64|arm64', description: 'Select target architecture.' },
118
125
  variant: { type: 'string', valueHint: 'baseline|default|modern', description: 'Select x64 binary variant.' },
119
126
  'dry-run': { type: 'boolean', description: 'Plan without mutation.' },
120
127
  format: catalogArgs.format,
121
- }, async () => runUpgrade(options(state.args), state.args));
122
- upgradeApply.meta = { ...upgradeApply.meta, hidden: true };
128
+ };
123
129
  const upgradeCheck = leaf('runx upgrade check', 'Check whether a newer stable release exists.', {
124
130
  format: catalogArgs.format,
125
131
  }, async () => {
@@ -134,7 +140,14 @@ function createCommandTree() {
134
140
  variant: { type: 'string', valueHint: 'baseline|default|modern', description: 'Select x64 variant.' },
135
141
  format: catalogArgs.format,
136
142
  }, async () => runUpgradeList(state.args));
137
- const upgrade = group('runx upgrade', 'Inspect or upgrade a native RunX executable.', { _apply: upgradeApply, check: upgradeCheck, list: upgradeList }, state, '_apply');
143
+ const upgrade = defineCommand({
144
+ meta: { name: 'runx upgrade', description: 'Inspect or upgrade a native RunX executable.' },
145
+ args: { ...upgradeArgs, ...helpArgs },
146
+ subCommands: { check: upgradeCheck, list: upgradeList },
147
+ setup: helpSetup(state),
148
+ run: async () => runUpgrade(options(state.args), state.args),
149
+ });
150
+ state.commands.set('upgrade', upgrade);
138
151
  const uninstall = leaf('runx uninstall', 'Uninstall the native RunX executable.', {
139
152
  'dry-run': { type: 'boolean', description: 'Print the target without deleting it.' }, format: catalogArgs.format,
140
153
  }, async () => {
@@ -149,8 +162,9 @@ function createCommandTree() {
149
162
  state.args = context.args;
150
163
  state.command = resolveHelpCommand(state);
151
164
  await validateInvocation(state);
152
- if (state.args.v || state.args.version === true)
165
+ if (context.rawArgs.length === 1 && ['-v', '--version'].includes(context.rawArgs[0] ?? '')) {
153
166
  return handled(`${readVersion()}\n`);
167
+ }
154
168
  await handleHelp(state);
155
169
  },
156
170
  run: ({ args }) => {
@@ -217,10 +231,14 @@ async function runCli(rawArgs = process.argv.slice(2)) {
217
231
  }
218
232
  const { command, state } = createCommandTree();
219
233
  const cleanOutput = rawArgs.some((arg) => ['-h', '--help', '-v', '--version', '--help-tree', '--help-docs'].includes(arg) || arg.startsWith('--help-tree-depth'));
220
- if (!cleanOutput && rawArgs.length > 0) {
234
+ if (!cleanOutput) {
221
235
  const notice = await readCachedUpdateNotice(rawArgs.includes('--verbose'));
222
- if (notice)
223
- process.stderr.write(`${notice}\n`);
236
+ if (notice) {
237
+ if (rawArgs.length === 0)
238
+ write(`${notice}\n`);
239
+ else
240
+ process.stderr.write(`${notice}\n`);
241
+ }
224
242
  }
225
243
  spawnUpdateWorker();
226
244
  try {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@guiho/runx",
3
3
  "description": "A language-agnostic, documented command catalog and local CLI executor.",
4
- "version": "0.4.0",
4
+ "version": "0.4.1",
5
5
  "type": "module",
6
6
  "main": "./library/guiho-runx.js",
7
7
  "types": "./library/guiho-runx.d.ts",