goatchain-cli 0.0.9-beta.21 → 0.0.9-beta.23

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/bin/goatchain.mjs CHANGED
@@ -26,16 +26,83 @@ const wrapperPm
26
26
  : 'npm'
27
27
 
28
28
  const args = process.argv.slice(2)
29
- const useOpentui = args[0] === 'opentui'
30
- const forwardArgs = useOpentui ? args.slice(1) : args
29
+ const routing = resolveRouting(args)
31
30
 
32
- if (useOpentui) {
33
- runOpentui(forwardArgs)
31
+ if (routing.target === 'opentui') {
32
+ runOpentui(routing.forwardArgs)
34
33
  }
35
34
  else {
36
35
  await runInk()
37
36
  }
38
37
 
38
+ function resolveRouting(argv) {
39
+ // Explicit `goatchain ink ...` forces the Ink TUI.
40
+ if (argv[0] === 'ink')
41
+ return { target: 'ink', forwardArgs: argv.slice(1) }
42
+ // Explicit `goatchain opentui ...` forces the opentui binary.
43
+ if (argv[0] === 'opentui')
44
+ return { target: 'opentui', forwardArgs: argv.slice(1) }
45
+
46
+ // Known subcommands handled only by the opentui binary.
47
+ const first = String(argv[0] ?? '').trim().toLowerCase()
48
+ const opentuiSubcommands = new Set([
49
+ 'version',
50
+ '--version',
51
+ '-v',
52
+ 'upgrade',
53
+ 'update',
54
+ 'acp',
55
+ 'auth',
56
+ 'exec',
57
+ 'e',
58
+ '--help',
59
+ '-h',
60
+ ])
61
+ if (opentuiSubcommands.has(first))
62
+ return { target: 'opentui', forwardArgs: argv }
63
+
64
+ // One-shot prompt (non-flag first positional, e.g. `goatchain hi`) or
65
+ // one-shot flags (`--cwd`, `--session`, `--no-interaction`) go to opentui.
66
+ if (isOneShotPromptArgv(argv))
67
+ return { target: 'opentui', forwardArgs: argv }
68
+
69
+ // Bare invocation (no args) or flag-only invocation: default to Ink.
70
+ return { target: 'ink', forwardArgs: argv }
71
+ }
72
+
73
+ function isOneShotPromptArgv(argv) {
74
+ const oneShotFlags = new Set([
75
+ '-c',
76
+ '-cwd',
77
+ '--cwd',
78
+ '--chdir',
79
+ '-s',
80
+ '--session',
81
+ '--no-interaction',
82
+ ])
83
+ let sawOneShotFlag = false
84
+ for (let i = 0; i < argv.length; i++) {
85
+ const arg = String(argv[i] ?? '').trim()
86
+ if (!arg)
87
+ continue
88
+ if (arg === '--')
89
+ return true
90
+ if (arg.startsWith('-cwd=')) {
91
+ sawOneShotFlag = true
92
+ continue
93
+ }
94
+ if (oneShotFlags.has(arg)) {
95
+ sawOneShotFlag = true
96
+ i += 1
97
+ continue
98
+ }
99
+ if (arg.startsWith('-'))
100
+ return false
101
+ return true
102
+ }
103
+ return sawOneShotFlag
104
+ }
105
+
39
106
  async function runInk() {
40
107
  const inkEntry = path.join(__dirname, '..', 'dist', 'ink.mjs')
41
108
  if (!fs.existsSync(inkEntry)) {