@brianli/kimaki 0.4.72-brianli.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/bin.js +2 -0
- package/dist/ai-tool-to-genai.js +233 -0
- package/dist/ai-tool-to-genai.test.js +267 -0
- package/dist/ai-tool.js +6 -0
- package/dist/bin.js +87 -0
- package/dist/bot-token.js +121 -0
- package/dist/bot-token.test.js +134 -0
- package/dist/channel-management.js +101 -0
- package/dist/cli-parsing.test.js +89 -0
- package/dist/cli.js +2529 -0
- package/dist/commands/abort.js +82 -0
- package/dist/commands/action-buttons.js +257 -0
- package/dist/commands/add-project.js +114 -0
- package/dist/commands/agent.js +291 -0
- package/dist/commands/ask-question.js +223 -0
- package/dist/commands/compact.js +120 -0
- package/dist/commands/context-usage.js +140 -0
- package/dist/commands/create-new-project.js +118 -0
- package/dist/commands/diff.js +128 -0
- package/dist/commands/file-upload.js +275 -0
- package/dist/commands/fork.js +217 -0
- package/dist/commands/gemini-apikey.js +70 -0
- package/dist/commands/login.js +490 -0
- package/dist/commands/mention-mode.js +51 -0
- package/dist/commands/merge-worktree.js +124 -0
- package/dist/commands/model.js +694 -0
- package/dist/commands/permissions.js +163 -0
- package/dist/commands/queue.js +217 -0
- package/dist/commands/remove-project.js +115 -0
- package/dist/commands/restart-opencode-server.js +116 -0
- package/dist/commands/resume.js +159 -0
- package/dist/commands/run-command.js +79 -0
- package/dist/commands/session-id.js +78 -0
- package/dist/commands/session.js +192 -0
- package/dist/commands/share.js +80 -0
- package/dist/commands/types.js +2 -0
- package/dist/commands/undo-redo.js +159 -0
- package/dist/commands/unset-model.js +152 -0
- package/dist/commands/upgrade.js +42 -0
- package/dist/commands/user-command.js +148 -0
- package/dist/commands/verbosity.js +60 -0
- package/dist/commands/worktree-settings.js +50 -0
- package/dist/commands/worktree.js +299 -0
- package/dist/condense-memory.js +33 -0
- package/dist/config.js +110 -0
- package/dist/database.js +1050 -0
- package/dist/db.js +159 -0
- package/dist/db.test.js +49 -0
- package/dist/discord-api.js +28 -0
- package/dist/discord-auth.js +231 -0
- package/dist/discord-auth.test.js +80 -0
- package/dist/discord-bot.js +997 -0
- package/dist/discord-utils.js +560 -0
- package/dist/discord-utils.test.js +115 -0
- package/dist/errors.js +167 -0
- package/dist/escape-backticks.test.js +429 -0
- package/dist/format-tables.js +122 -0
- package/dist/format-tables.test.js +199 -0
- package/dist/forum-sync/config.js +79 -0
- package/dist/forum-sync/discord-operations.js +154 -0
- package/dist/forum-sync/index.js +5 -0
- package/dist/forum-sync/markdown.js +117 -0
- package/dist/forum-sync/sync-to-discord.js +417 -0
- package/dist/forum-sync/sync-to-files.js +190 -0
- package/dist/forum-sync/types.js +53 -0
- package/dist/forum-sync/watchers.js +307 -0
- package/dist/gateway-consumer.js +232 -0
- package/dist/gateway-consumer.test.js +18 -0
- package/dist/genai-worker-wrapper.js +111 -0
- package/dist/genai-worker.js +311 -0
- package/dist/genai.js +232 -0
- package/dist/generated/browser.js +17 -0
- package/dist/generated/client.js +35 -0
- package/dist/generated/commonInputTypes.js +10 -0
- package/dist/generated/enums.js +30 -0
- package/dist/generated/internal/class.js +41 -0
- package/dist/generated/internal/prismaNamespace.js +239 -0
- package/dist/generated/internal/prismaNamespaceBrowser.js +209 -0
- package/dist/generated/models/bot_api_keys.js +1 -0
- package/dist/generated/models/bot_tokens.js +1 -0
- package/dist/generated/models/channel_agents.js +1 -0
- package/dist/generated/models/channel_directories.js +1 -0
- package/dist/generated/models/channel_mention_mode.js +1 -0
- package/dist/generated/models/channel_models.js +1 -0
- package/dist/generated/models/channel_verbosity.js +1 -0
- package/dist/generated/models/channel_worktrees.js +1 -0
- package/dist/generated/models/forum_sync_configs.js +1 -0
- package/dist/generated/models/global_models.js +1 -0
- package/dist/generated/models/ipc_requests.js +1 -0
- package/dist/generated/models/part_messages.js +1 -0
- package/dist/generated/models/scheduled_tasks.js +1 -0
- package/dist/generated/models/session_agents.js +1 -0
- package/dist/generated/models/session_models.js +1 -0
- package/dist/generated/models/session_start_sources.js +1 -0
- package/dist/generated/models/thread_sessions.js +1 -0
- package/dist/generated/models/thread_worktrees.js +1 -0
- package/dist/generated/models.js +1 -0
- package/dist/heap-monitor.js +95 -0
- package/dist/hrana-server.js +416 -0
- package/dist/hrana-server.test.js +368 -0
- package/dist/image-utils.js +112 -0
- package/dist/interaction-handler.js +327 -0
- package/dist/ipc-polling.js +251 -0
- package/dist/kimaki-digital-twin.e2e.test.js +165 -0
- package/dist/limit-heading-depth.js +25 -0
- package/dist/limit-heading-depth.test.js +105 -0
- package/dist/logger.js +160 -0
- package/dist/markdown.js +342 -0
- package/dist/markdown.test.js +253 -0
- package/dist/message-formatting.js +433 -0
- package/dist/message-formatting.test.js +73 -0
- package/dist/openai-realtime.js +228 -0
- package/dist/opencode-plugin-loading.e2e.test.js +91 -0
- package/dist/opencode-plugin.js +536 -0
- package/dist/opencode-plugin.test.js +98 -0
- package/dist/opencode.js +409 -0
- package/dist/privacy-sanitizer.js +105 -0
- package/dist/runtime-mode.js +51 -0
- package/dist/runtime-mode.test.js +115 -0
- package/dist/sentry.js +127 -0
- package/dist/session-handler/state.js +151 -0
- package/dist/session-handler.js +1874 -0
- package/dist/session-search.js +100 -0
- package/dist/session-search.test.js +40 -0
- package/dist/startup-service.js +153 -0
- package/dist/system-message.js +499 -0
- package/dist/task-runner.js +282 -0
- package/dist/task-schedule.js +191 -0
- package/dist/task-schedule.test.js +71 -0
- package/dist/thinking-utils.js +35 -0
- package/dist/thread-message-queue.e2e.test.js +781 -0
- package/dist/tools.js +359 -0
- package/dist/unnest-code-blocks.js +136 -0
- package/dist/unnest-code-blocks.test.js +641 -0
- package/dist/upgrade.js +114 -0
- package/dist/utils.js +109 -0
- package/dist/voice-handler.js +606 -0
- package/dist/voice.js +304 -0
- package/dist/voice.test.js +187 -0
- package/dist/wait-session.js +94 -0
- package/dist/worker-types.js +4 -0
- package/dist/worktree-utils.js +727 -0
- package/dist/xml.js +92 -0
- package/dist/xml.test.js +32 -0
- package/package.json +82 -0
- package/schema.prisma +246 -0
- package/skills/batch/SKILL.md +87 -0
- package/skills/critique/SKILL.md +129 -0
- package/skills/errore/SKILL.md +589 -0
- package/skills/goke/.prettierrc +5 -0
- package/skills/goke/CHANGELOG.md +40 -0
- package/skills/goke/LICENSE +21 -0
- package/skills/goke/README.md +666 -0
- package/skills/goke/SKILL.md +458 -0
- package/skills/goke/package.json +43 -0
- package/skills/goke/src/__test__/coerce.test.ts +411 -0
- package/skills/goke/src/__test__/index.test.ts +1798 -0
- package/skills/goke/src/__test__/types.test-d.ts +111 -0
- package/skills/goke/src/coerce.ts +547 -0
- package/skills/goke/src/goke.ts +1362 -0
- package/skills/goke/src/index.ts +16 -0
- package/skills/goke/src/mri.ts +164 -0
- package/skills/goke/tsconfig.json +15 -0
- package/skills/jitter/EDITOR.md +219 -0
- package/skills/jitter/EXPORT-INTERNALS.md +309 -0
- package/skills/jitter/SKILL.md +158 -0
- package/skills/jitter/jitter-clipboard.json +1042 -0
- package/skills/jitter/package.json +14 -0
- package/skills/jitter/tsconfig.json +15 -0
- package/skills/jitter/utils/actions.ts +212 -0
- package/skills/jitter/utils/export.ts +114 -0
- package/skills/jitter/utils/index.ts +141 -0
- package/skills/jitter/utils/snapshot.ts +154 -0
- package/skills/jitter/utils/traverse.ts +246 -0
- package/skills/jitter/utils/types.ts +279 -0
- package/skills/jitter/utils/wait.ts +133 -0
- package/skills/playwriter/SKILL.md +31 -0
- package/skills/security-review/SKILL.md +208 -0
- package/skills/simplify/SKILL.md +58 -0
- package/skills/termcast/SKILL.md +945 -0
- package/skills/tuistory/SKILL.md +250 -0
- package/skills/zustand-centralized-state/SKILL.md +582 -0
- package/src/__snapshots__/compact-session-context-no-system.md +35 -0
- package/src/__snapshots__/compact-session-context.md +41 -0
- package/src/__snapshots__/first-session-no-info.md +17 -0
- package/src/__snapshots__/first-session-with-info.md +23 -0
- package/src/__snapshots__/session-1.md +17 -0
- package/src/__snapshots__/session-2.md +5871 -0
- package/src/__snapshots__/session-3.md +17 -0
- package/src/__snapshots__/session-with-tools.md +5871 -0
- package/src/ai-tool-to-genai.test.ts +296 -0
- package/src/ai-tool-to-genai.ts +282 -0
- package/src/ai-tool.ts +39 -0
- package/src/bin.ts +108 -0
- package/src/bot-token.test.ts +171 -0
- package/src/bot-token.ts +159 -0
- package/src/channel-management.ts +172 -0
- package/src/cli-parsing.test.ts +132 -0
- package/src/cli.ts +3605 -0
- package/src/commands/abort.ts +112 -0
- package/src/commands/action-buttons.ts +376 -0
- package/src/commands/add-project.ts +152 -0
- package/src/commands/agent.ts +404 -0
- package/src/commands/ask-question.ts +330 -0
- package/src/commands/compact.ts +157 -0
- package/src/commands/context-usage.ts +199 -0
- package/src/commands/create-new-project.ts +179 -0
- package/src/commands/diff.ts +165 -0
- package/src/commands/file-upload.ts +389 -0
- package/src/commands/fork.ts +320 -0
- package/src/commands/gemini-apikey.ts +104 -0
- package/src/commands/login.ts +634 -0
- package/src/commands/mention-mode.ts +77 -0
- package/src/commands/merge-worktree.ts +177 -0
- package/src/commands/model.ts +961 -0
- package/src/commands/permissions.ts +261 -0
- package/src/commands/queue.ts +296 -0
- package/src/commands/remove-project.ts +155 -0
- package/src/commands/restart-opencode-server.ts +162 -0
- package/src/commands/resume.ts +242 -0
- package/src/commands/run-command.ts +123 -0
- package/src/commands/session-id.ts +109 -0
- package/src/commands/session.ts +250 -0
- package/src/commands/share.ts +106 -0
- package/src/commands/types.ts +25 -0
- package/src/commands/undo-redo.ts +221 -0
- package/src/commands/unset-model.ts +189 -0
- package/src/commands/upgrade.ts +52 -0
- package/src/commands/user-command.ts +193 -0
- package/src/commands/verbosity.ts +88 -0
- package/src/commands/worktree-settings.ts +79 -0
- package/src/commands/worktree.ts +431 -0
- package/src/condense-memory.ts +36 -0
- package/src/config.ts +148 -0
- package/src/database.ts +1530 -0
- package/src/db.test.ts +60 -0
- package/src/db.ts +190 -0
- package/src/discord-api.ts +35 -0
- package/src/discord-bot.ts +1316 -0
- package/src/discord-utils.test.ts +132 -0
- package/src/discord-utils.ts +767 -0
- package/src/errors.ts +213 -0
- package/src/escape-backticks.test.ts +469 -0
- package/src/format-tables.test.ts +223 -0
- package/src/format-tables.ts +145 -0
- package/src/forum-sync/config.ts +92 -0
- package/src/forum-sync/discord-operations.ts +241 -0
- package/src/forum-sync/index.ts +9 -0
- package/src/forum-sync/markdown.ts +176 -0
- package/src/forum-sync/sync-to-discord.ts +595 -0
- package/src/forum-sync/sync-to-files.ts +294 -0
- package/src/forum-sync/types.ts +175 -0
- package/src/forum-sync/watchers.ts +454 -0
- package/src/genai-worker-wrapper.ts +164 -0
- package/src/genai-worker.ts +386 -0
- package/src/genai.ts +321 -0
- package/src/generated/browser.ts +109 -0
- package/src/generated/client.ts +131 -0
- package/src/generated/commonInputTypes.ts +512 -0
- package/src/generated/enums.ts +46 -0
- package/src/generated/internal/class.ts +362 -0
- package/src/generated/internal/prismaNamespace.ts +2251 -0
- package/src/generated/internal/prismaNamespaceBrowser.ts +308 -0
- package/src/generated/models/bot_api_keys.ts +1288 -0
- package/src/generated/models/bot_tokens.ts +1577 -0
- package/src/generated/models/channel_agents.ts +1256 -0
- package/src/generated/models/channel_directories.ts +2104 -0
- package/src/generated/models/channel_mention_mode.ts +1300 -0
- package/src/generated/models/channel_models.ts +1288 -0
- package/src/generated/models/channel_verbosity.ts +1224 -0
- package/src/generated/models/channel_worktrees.ts +1308 -0
- package/src/generated/models/forum_sync_configs.ts +1452 -0
- package/src/generated/models/global_models.ts +1288 -0
- package/src/generated/models/ipc_requests.ts +1485 -0
- package/src/generated/models/part_messages.ts +1302 -0
- package/src/generated/models/scheduled_tasks.ts +2320 -0
- package/src/generated/models/session_agents.ts +1086 -0
- package/src/generated/models/session_models.ts +1114 -0
- package/src/generated/models/session_start_sources.ts +1408 -0
- package/src/generated/models/thread_sessions.ts +1599 -0
- package/src/generated/models/thread_worktrees.ts +1352 -0
- package/src/generated/models.ts +29 -0
- package/src/heap-monitor.ts +121 -0
- package/src/hrana-server.test.ts +428 -0
- package/src/hrana-server.ts +547 -0
- package/src/image-utils.ts +149 -0
- package/src/interaction-handler.ts +461 -0
- package/src/ipc-polling.ts +325 -0
- package/src/kimaki-digital-twin.e2e.test.ts +201 -0
- package/src/limit-heading-depth.test.ts +116 -0
- package/src/limit-heading-depth.ts +26 -0
- package/src/logger.ts +203 -0
- package/src/markdown.test.ts +360 -0
- package/src/markdown.ts +410 -0
- package/src/message-formatting.test.ts +81 -0
- package/src/message-formatting.ts +549 -0
- package/src/openai-realtime.ts +362 -0
- package/src/opencode-plugin-loading.e2e.test.ts +112 -0
- package/src/opencode-plugin.test.ts +108 -0
- package/src/opencode-plugin.ts +652 -0
- package/src/opencode.ts +554 -0
- package/src/privacy-sanitizer.ts +142 -0
- package/src/schema.sql +158 -0
- package/src/sentry.ts +137 -0
- package/src/session-handler/state.ts +232 -0
- package/src/session-handler.ts +2668 -0
- package/src/session-search.test.ts +50 -0
- package/src/session-search.ts +148 -0
- package/src/startup-service.ts +200 -0
- package/src/system-message.ts +568 -0
- package/src/task-runner.ts +425 -0
- package/src/task-schedule.test.ts +84 -0
- package/src/task-schedule.ts +287 -0
- package/src/thinking-utils.ts +61 -0
- package/src/thread-message-queue.e2e.test.ts +997 -0
- package/src/tools.ts +432 -0
- package/src/unnest-code-blocks.test.ts +679 -0
- package/src/unnest-code-blocks.ts +168 -0
- package/src/upgrade.ts +127 -0
- package/src/utils.ts +145 -0
- package/src/voice-handler.ts +852 -0
- package/src/voice.test.ts +219 -0
- package/src/voice.ts +444 -0
- package/src/wait-session.ts +147 -0
- package/src/worker-types.ts +64 -0
- package/src/worktree-utils.ts +988 -0
- package/src/xml.test.ts +38 -0
- package/src/xml.ts +121 -0
|
@@ -0,0 +1,666 @@
|
|
|
1
|
+
<div align='center'>
|
|
2
|
+
<br/>
|
|
3
|
+
<br/>
|
|
4
|
+
<h3>goke</h3>
|
|
5
|
+
<p>simple, type safe, elegant command line framework. CAC replacement</p>
|
|
6
|
+
<br/>
|
|
7
|
+
<br/>
|
|
8
|
+
</div>
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
## Features
|
|
12
|
+
|
|
13
|
+
- **Super light-weight**: No dependency, just a single file.
|
|
14
|
+
- **Easy to learn**. There are only 4 APIs you need to learn for building simple CLIs: `cli.option` `cli.version` `cli.help` `cli.parse`.
|
|
15
|
+
- **Yet so powerful**. Enable features like default command, git-like subcommands, validation for required arguments and options, variadic arguments, dot-nested options, automated help message generation and so on.
|
|
16
|
+
- **Space-separated subcommands**: Support multi-word commands like `mcp login`, `git remote add`.
|
|
17
|
+
- **Schema-based type coercion**: Use Zod, Valibot, ArkType, or plain JSON Schema for automatic type coercion and TypeScript type inference. Description and default values are extracted from the schema automatically.
|
|
18
|
+
- **Developer friendly**. Written in TypeScript.
|
|
19
|
+
|
|
20
|
+
## Install
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
npm install goke
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Usage
|
|
27
|
+
|
|
28
|
+
### Simple Parsing
|
|
29
|
+
|
|
30
|
+
Use goke as simple argument parser:
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
```ts
|
|
34
|
+
import { goke } from 'goke'
|
|
35
|
+
import { z } from 'zod'
|
|
36
|
+
|
|
37
|
+
const cli = goke()
|
|
38
|
+
|
|
39
|
+
cli.option(
|
|
40
|
+
'--type [type]',
|
|
41
|
+
z.string().default('node').describe('Choose a project type'),
|
|
42
|
+
)
|
|
43
|
+
cli.option('--name <name>', 'Provide your name')
|
|
44
|
+
|
|
45
|
+
cli.command('lint [...files]', 'Lint files').action((files, options) => {
|
|
46
|
+
console.log(files, options)
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
cli
|
|
50
|
+
.command('build [entry]', 'Build your app')
|
|
51
|
+
.option('--minify', 'Minify output')
|
|
52
|
+
.example('build src/index.ts')
|
|
53
|
+
.example('build src/index.ts --minify')
|
|
54
|
+
.action(async (entry, options) => { // options is type safe! no need to type it
|
|
55
|
+
console.log(entry, options)
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
cli.example((bin) => `${bin} lint src/**/*.ts`)
|
|
59
|
+
|
|
60
|
+
// Display help message when `-h` or `--help` appears
|
|
61
|
+
cli.help()
|
|
62
|
+
// Display version number when `-v` or `--version` appears
|
|
63
|
+
cli.version('0.0.0')
|
|
64
|
+
|
|
65
|
+
cli.parse()
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
When examples are defined, help output includes an **Examples** section.
|
|
69
|
+
|
|
70
|
+
### Command Examples in Help
|
|
71
|
+
|
|
72
|
+
Use `.example(...)` on a command (or on `cli`) to show usage snippets in help:
|
|
73
|
+
|
|
74
|
+
```ts
|
|
75
|
+
import { goke } from 'goke'
|
|
76
|
+
|
|
77
|
+
const cli = goke('mycli')
|
|
78
|
+
|
|
79
|
+
cli
|
|
80
|
+
.command('deploy', 'Deploy current app')
|
|
81
|
+
.option('--env <env>', 'Target environment')
|
|
82
|
+
.example('mycli deploy --env production')
|
|
83
|
+
.example('mycli deploy --env staging')
|
|
84
|
+
.action(() => {})
|
|
85
|
+
|
|
86
|
+
cli.example((bin) => `${bin} deploy --env production`)
|
|
87
|
+
|
|
88
|
+
cli.help()
|
|
89
|
+
cli.parse()
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Rich Multi-line Command Descriptions (`string-dedent`)
|
|
93
|
+
|
|
94
|
+
When a command needs a long description (with bullets, quotes, inline code, and
|
|
95
|
+
multiple examples), use [`string-dedent`](https://www.npmjs.com/package/string-dedent)
|
|
96
|
+
to keep the source readable while preserving clean help output.
|
|
97
|
+
|
|
98
|
+
Install:
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
npm install string-dedent
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Example with detailed command descriptions:
|
|
105
|
+
|
|
106
|
+
```ts
|
|
107
|
+
import { goke } from 'goke'
|
|
108
|
+
import dedent from 'string-dedent'
|
|
109
|
+
|
|
110
|
+
const cli = goke('acme')
|
|
111
|
+
|
|
112
|
+
cli
|
|
113
|
+
.command(
|
|
114
|
+
'release <version>',
|
|
115
|
+
dedent`
|
|
116
|
+
Publish a versioned release to your distribution channels.
|
|
117
|
+
|
|
118
|
+
- **Validates** release metadata and changelog before publishing.
|
|
119
|
+
- **Builds** production artifacts with reproducible settings.
|
|
120
|
+
- **Tags** git history using semantic version format.
|
|
121
|
+
- **Publishes** to npm and creates release notes.
|
|
122
|
+
|
|
123
|
+
> Recommended flow: run with \`--dry-run\` first in CI to verify output.
|
|
124
|
+
|
|
125
|
+
Examples:
|
|
126
|
+
- \`acme release 2.4.0 --channel stable\`
|
|
127
|
+
- \`acme release 2.5.0-rc.1 --channel beta --dry-run\`
|
|
128
|
+
- \`acme release 3.0.0 --notes-file ./docs/releases/3.0.0.md\`
|
|
129
|
+
`,
|
|
130
|
+
)
|
|
131
|
+
.option('--channel <name>', 'Target channel: stable, beta, alpha')
|
|
132
|
+
.option('--notes-file <path>', 'Markdown file used as release notes')
|
|
133
|
+
.option('--dry-run', 'Preview every step without publishing')
|
|
134
|
+
.action((version, options) => {
|
|
135
|
+
console.log('release', version, options)
|
|
136
|
+
})
|
|
137
|
+
|
|
138
|
+
cli
|
|
139
|
+
.command(
|
|
140
|
+
'db migrate',
|
|
141
|
+
dedent`
|
|
142
|
+
Apply pending database migrations in a controlled sequence.
|
|
143
|
+
|
|
144
|
+
- Runs migrations in timestamp order.
|
|
145
|
+
- Stops immediately on first failure.
|
|
146
|
+
- Prints SQL statements when \`--verbose\` is enabled.
|
|
147
|
+
- Supports smoke-testing with \`--dry-run\`.
|
|
148
|
+
|
|
149
|
+
> Safety: always run this command against staging before production.
|
|
150
|
+
|
|
151
|
+
Examples:
|
|
152
|
+
- \`acme db migrate\`
|
|
153
|
+
- \`acme db migrate --target 20260210120000_add_users\`
|
|
154
|
+
- \`acme db migrate --dry-run --verbose\`
|
|
155
|
+
`,
|
|
156
|
+
)
|
|
157
|
+
.option('--target <migration>', 'Apply up to a specific migration id')
|
|
158
|
+
.option('--dry-run', 'Print plan only, do not execute SQL')
|
|
159
|
+
.option('--verbose', 'Show each executed statement')
|
|
160
|
+
.action((options) => {
|
|
161
|
+
console.log('migrate', options)
|
|
162
|
+
})
|
|
163
|
+
|
|
164
|
+
cli.help()
|
|
165
|
+
cli.parse()
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
Why this pattern works well:
|
|
169
|
+
|
|
170
|
+
- `dedent` keeps template literals readable in source files.
|
|
171
|
+
- Help text stays aligned without extra leading whitespace.
|
|
172
|
+
- You can include rich formatting patterns users already recognize:
|
|
173
|
+
lists, quotes, and inline command snippets.
|
|
174
|
+
- Long descriptions remain maintainable as your CLI grows.
|
|
175
|
+
|
|
176
|
+
### Rich `.example(...)` Blocks with `dedent`
|
|
177
|
+
|
|
178
|
+
You can also use `dedent` in `.example(...)` so examples stay readable in code and
|
|
179
|
+
render nicely in help output. A useful pattern is to make the **first line a `#`
|
|
180
|
+
comment** that explains the scenario.
|
|
181
|
+
|
|
182
|
+
```ts
|
|
183
|
+
import { goke } from 'goke'
|
|
184
|
+
import dedent from 'string-dedent'
|
|
185
|
+
|
|
186
|
+
const cli = goke('tuistory')
|
|
187
|
+
|
|
188
|
+
cli
|
|
189
|
+
.command('start', 'Start an interactive session')
|
|
190
|
+
.example(dedent`
|
|
191
|
+
# Launch and immediately check what the app shows
|
|
192
|
+
tuistory launch "claude" -s ai && tuistory -s ai snapshot --trim
|
|
193
|
+
`)
|
|
194
|
+
.example(dedent`
|
|
195
|
+
# Start a focused coding session with explicit context
|
|
196
|
+
tuistory start --agent code --context "Fix OAuth callback timeout"
|
|
197
|
+
`)
|
|
198
|
+
.example(dedent`
|
|
199
|
+
# Recover recent activity and inspect the latest run details
|
|
200
|
+
tuistory runs list --limit 5 && tuistory runs show --latest
|
|
201
|
+
`)
|
|
202
|
+
.action(() => {
|
|
203
|
+
// command implementation
|
|
204
|
+
})
|
|
205
|
+
|
|
206
|
+
cli
|
|
207
|
+
.command('deploy', 'Deploy current workspace')
|
|
208
|
+
.example(dedent`
|
|
209
|
+
# Dry-run deployment first to validate plan
|
|
210
|
+
tuistory deploy --env staging --dry-run
|
|
211
|
+
`)
|
|
212
|
+
.example(dedent`
|
|
213
|
+
# Deploy production with release notes attached
|
|
214
|
+
tuistory deploy --env production --notes ./docs/release.md
|
|
215
|
+
`)
|
|
216
|
+
.action(() => {
|
|
217
|
+
// command implementation
|
|
218
|
+
})
|
|
219
|
+
|
|
220
|
+
cli.help()
|
|
221
|
+
cli.parse()
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
Notes:
|
|
225
|
+
|
|
226
|
+
- Keep each example focused on one workflow.
|
|
227
|
+
- Use the first `#` line as a human-readable intent label.
|
|
228
|
+
- Keep command lines copy-pastable (avoid placeholder-heavy examples).
|
|
229
|
+
|
|
230
|
+
Where examples are rendered today:
|
|
231
|
+
|
|
232
|
+
- For root help (`deploy --help`), examples from the root/default command appear in an **Examples** section at the end.
|
|
233
|
+
- For subcommand help (`deploy logs --help`), examples from that specific subcommand appear in its own **Examples** section at the end.
|
|
234
|
+
|
|
235
|
+
Inline snapshot-style output (many commands):
|
|
236
|
+
|
|
237
|
+
```txt
|
|
238
|
+
deploy
|
|
239
|
+
|
|
240
|
+
Usage:
|
|
241
|
+
$ deploy [options]
|
|
242
|
+
|
|
243
|
+
Commands:
|
|
244
|
+
deploy Deploy the current project
|
|
245
|
+
init Initialize a new project
|
|
246
|
+
login Authenticate with the server
|
|
247
|
+
logout Clear saved credentials
|
|
248
|
+
status Show deployment status
|
|
249
|
+
logs <deploymentId> Stream logs for a deployment
|
|
250
|
+
|
|
251
|
+
Options:
|
|
252
|
+
--env <env> Target environment
|
|
253
|
+
--dry-run Preview without deploying
|
|
254
|
+
-h, --help Display this message
|
|
255
|
+
|
|
256
|
+
Examples:
|
|
257
|
+
# Deploy to staging first
|
|
258
|
+
deploy --env staging --dry-run
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
```txt
|
|
262
|
+
deploy
|
|
263
|
+
|
|
264
|
+
Usage:
|
|
265
|
+
$ deploy logs <deploymentId>
|
|
266
|
+
|
|
267
|
+
Options:
|
|
268
|
+
--follow Follow log output
|
|
269
|
+
--lines <n> Number of lines (default: 100)
|
|
270
|
+
-h, --help Display this message
|
|
271
|
+
|
|
272
|
+
Description:
|
|
273
|
+
Stream logs for a deployment
|
|
274
|
+
|
|
275
|
+
Examples:
|
|
276
|
+
# Stream last 200 lines for a deployment
|
|
277
|
+
deploy logs dep_123 --lines 200
|
|
278
|
+
# Keep following new log lines
|
|
279
|
+
deploy logs dep_123 --follow
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
### Many Commands with a Root Command
|
|
283
|
+
|
|
284
|
+
Use `''` as the command name to define a root command that runs when no subcommand is given. This is useful for CLIs that have a primary action alongside several subcommands:
|
|
285
|
+
|
|
286
|
+
```ts
|
|
287
|
+
import { goke } from 'goke'
|
|
288
|
+
import { z } from 'zod'
|
|
289
|
+
|
|
290
|
+
const cli = goke('deploy')
|
|
291
|
+
|
|
292
|
+
// Root command — runs when user types just `deploy`
|
|
293
|
+
cli
|
|
294
|
+
.command('', 'Deploy the current project')
|
|
295
|
+
.option(
|
|
296
|
+
'--env <env>',
|
|
297
|
+
z.string().default('production').describe('Target environment'),
|
|
298
|
+
)
|
|
299
|
+
.option('--dry-run', 'Preview without deploying')
|
|
300
|
+
.action((options) => {
|
|
301
|
+
console.log(`Deploying to ${options.env}...`)
|
|
302
|
+
})
|
|
303
|
+
|
|
304
|
+
// Subcommands
|
|
305
|
+
cli
|
|
306
|
+
.command('init', 'Initialize a new project')
|
|
307
|
+
.option('--template <template>', 'Project template')
|
|
308
|
+
.action((options) => {
|
|
309
|
+
console.log('Initializing project...')
|
|
310
|
+
})
|
|
311
|
+
|
|
312
|
+
cli.command('login', 'Authenticate with the server').action(() => {
|
|
313
|
+
console.log('Opening browser for login...')
|
|
314
|
+
})
|
|
315
|
+
|
|
316
|
+
cli.command('logout', 'Clear saved credentials').action(() => {
|
|
317
|
+
console.log('Logged out')
|
|
318
|
+
})
|
|
319
|
+
|
|
320
|
+
cli
|
|
321
|
+
.command('status', 'Show deployment status')
|
|
322
|
+
.option('--json', 'Output as JSON')
|
|
323
|
+
.action((options) => {
|
|
324
|
+
console.log('Fetching status...')
|
|
325
|
+
})
|
|
326
|
+
|
|
327
|
+
cli
|
|
328
|
+
.command('logs <deploymentId>', 'Stream logs for a deployment')
|
|
329
|
+
.option('--follow', 'Follow log output')
|
|
330
|
+
.option('--lines <n>', z.number().default(100).describe('Number of lines'))
|
|
331
|
+
.action((deploymentId, options) => {
|
|
332
|
+
console.log(`Streaming logs for ${deploymentId}...`)
|
|
333
|
+
})
|
|
334
|
+
|
|
335
|
+
cli.help()
|
|
336
|
+
cli.version('1.0.0')
|
|
337
|
+
cli.parse()
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
```bash
|
|
341
|
+
deploy # runs root command (deploy to production)
|
|
342
|
+
deploy --env staging --dry-run # root command with options
|
|
343
|
+
deploy init --template react # subcommand
|
|
344
|
+
deploy login # subcommand
|
|
345
|
+
deploy logs abc123 --follow # subcommand with args + options
|
|
346
|
+
deploy --help # shows all commands
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
### Command-specific Options
|
|
350
|
+
|
|
351
|
+
You can attach options to a command.
|
|
352
|
+
|
|
353
|
+
```ts
|
|
354
|
+
import { goke } from 'goke'
|
|
355
|
+
|
|
356
|
+
const cli = goke()
|
|
357
|
+
|
|
358
|
+
cli
|
|
359
|
+
.command('rm <dir>', 'Remove a dir')
|
|
360
|
+
.option('-r, --recursive', 'Remove recursively')
|
|
361
|
+
.action((dir, options) => {
|
|
362
|
+
console.log('remove ' + dir + (options.recursive ? ' recursively' : ''))
|
|
363
|
+
})
|
|
364
|
+
|
|
365
|
+
cli.help()
|
|
366
|
+
|
|
367
|
+
cli.parse()
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
### Space-separated Subcommands
|
|
371
|
+
|
|
372
|
+
goke supports multi-word command names for git-like nested subcommands:
|
|
373
|
+
|
|
374
|
+
```ts
|
|
375
|
+
import { goke } from 'goke'
|
|
376
|
+
|
|
377
|
+
const cli = goke('mycli')
|
|
378
|
+
|
|
379
|
+
cli.command('mcp login <url>', 'Login to MCP server').action((url) => {
|
|
380
|
+
console.log('Logging in to', url)
|
|
381
|
+
})
|
|
382
|
+
|
|
383
|
+
cli.command('mcp logout', 'Logout from MCP server').action(() => {
|
|
384
|
+
console.log('Logged out')
|
|
385
|
+
})
|
|
386
|
+
|
|
387
|
+
cli
|
|
388
|
+
.command('git remote add <name> <url>', 'Add a git remote')
|
|
389
|
+
.action((name, url) => {
|
|
390
|
+
console.log('Adding remote', name, url)
|
|
391
|
+
})
|
|
392
|
+
|
|
393
|
+
cli.help()
|
|
394
|
+
cli.parse()
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
### Schema-based Type Coercion
|
|
398
|
+
|
|
399
|
+
Pass a Standard Schema (like Zod) as the second argument to `.option()` for automatic type coercion. Description and default values are extracted from the schema:
|
|
400
|
+
|
|
401
|
+
```ts
|
|
402
|
+
import { goke } from 'goke'
|
|
403
|
+
import { z } from 'zod'
|
|
404
|
+
|
|
405
|
+
const cli = goke()
|
|
406
|
+
|
|
407
|
+
cli
|
|
408
|
+
.command('serve', 'Start server')
|
|
409
|
+
.option('--port <port>', z.number().describe('Port number'))
|
|
410
|
+
.option('--host [host]', z.string().default('localhost').describe('Hostname'))
|
|
411
|
+
.option('--workers <workers>', z.int().describe('Worker count'))
|
|
412
|
+
.option('--tags <tag>', z.array(z.string()).describe('Tags (repeatable)'))
|
|
413
|
+
.option('--verbose', 'Verbose output')
|
|
414
|
+
.action((options) => {
|
|
415
|
+
// options.port is number, options.host is string, etc.
|
|
416
|
+
console.log(options)
|
|
417
|
+
})
|
|
418
|
+
|
|
419
|
+
cli.parse()
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
**Important:** When using a schema with `.default()`, do **not** repeat the default in the description string. The framework automatically appends `(default: <value>)` to help output from the schema default. Writing `.default(100).describe('Number of lines (default: 100)')` would display the default twice.
|
|
423
|
+
|
|
424
|
+
The second argument accepts any object implementing [Standard Schema](https://github.com/standard-schema/standard-schema), including:
|
|
425
|
+
|
|
426
|
+
- **Zod** v4.2+ (e.g. `z.number()`, `z.string()`, `z.array(z.number())`)
|
|
427
|
+
- **Valibot**, **ArkType**, and other Standard Schema-compatible libraries
|
|
428
|
+
|
|
429
|
+
### Hiding Deprecated Options
|
|
430
|
+
|
|
431
|
+
Mark options as deprecated using Zod's `.meta({ deprecated: true })`. Deprecated options are hidden from help output but still work for parsing — useful for backward compatibility.
|
|
432
|
+
|
|
433
|
+
```ts
|
|
434
|
+
import { goke } from 'goke'
|
|
435
|
+
import { z } from 'zod'
|
|
436
|
+
|
|
437
|
+
const cli = goke()
|
|
438
|
+
|
|
439
|
+
cli
|
|
440
|
+
.command('serve', 'Start server')
|
|
441
|
+
// Deprecated option: hidden from --help, still parses
|
|
442
|
+
.option('--old-port <port>', z.number().meta({ deprecated: true, description: 'Use --port instead' }))
|
|
443
|
+
// Current option: visible in help
|
|
444
|
+
.option('--port <port>', z.number().describe('Port number'))
|
|
445
|
+
.action((options) => {
|
|
446
|
+
const port = options.port ?? options.oldPort
|
|
447
|
+
console.log('Starting on port', port)
|
|
448
|
+
})
|
|
449
|
+
|
|
450
|
+
cli.help()
|
|
451
|
+
cli.parse()
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
When users run `--help`, deprecated options won't appear, but `--old-port 3000` still works.
|
|
455
|
+
|
|
456
|
+
### Brackets
|
|
457
|
+
|
|
458
|
+
When using brackets in command name, angled brackets indicate required command arguments, while square brackets indicate optional arguments.
|
|
459
|
+
|
|
460
|
+
When using brackets in option name, angled brackets indicate that a string / number value is required, while square brackets indicate that the value can also be `true`.
|
|
461
|
+
|
|
462
|
+
### Negated Options
|
|
463
|
+
|
|
464
|
+
To allow an option whose value is `false`, you need to manually specify a negated option:
|
|
465
|
+
|
|
466
|
+
```ts
|
|
467
|
+
cli
|
|
468
|
+
.command('build [project]', 'Build a project')
|
|
469
|
+
.option('--no-config', 'Disable config file')
|
|
470
|
+
.option('--config <path>', 'Use a custom config file')
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
### Variadic Arguments
|
|
474
|
+
|
|
475
|
+
The last argument of a command can be variadic. To make an argument variadic you have to add `...` to the start of argument name:
|
|
476
|
+
|
|
477
|
+
```ts
|
|
478
|
+
cli
|
|
479
|
+
.command('build <entry> [...otherFiles]', 'Build your app')
|
|
480
|
+
.option('--foo', 'Foo option')
|
|
481
|
+
.action((entry, otherFiles, options) => {
|
|
482
|
+
console.log(entry)
|
|
483
|
+
console.log(otherFiles)
|
|
484
|
+
console.log(options)
|
|
485
|
+
})
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
### Dot-nested Options
|
|
489
|
+
|
|
490
|
+
Dot-nested options will be merged into a single option.
|
|
491
|
+
|
|
492
|
+
```ts
|
|
493
|
+
cli
|
|
494
|
+
.command('build', 'desc')
|
|
495
|
+
.option('--env <env>', 'Set envs')
|
|
496
|
+
.example('--env.API_SECRET xxx')
|
|
497
|
+
.action((options) => {
|
|
498
|
+
console.log(options)
|
|
499
|
+
})
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
### Default Command
|
|
503
|
+
|
|
504
|
+
Register a command that will be used when no other command is matched.
|
|
505
|
+
|
|
506
|
+
```ts
|
|
507
|
+
cli
|
|
508
|
+
.command('[...files]', 'Build files')
|
|
509
|
+
.option('--minimize', 'Minimize output')
|
|
510
|
+
.action((files, options) => {
|
|
511
|
+
console.log(files)
|
|
512
|
+
console.log(options.minimize)
|
|
513
|
+
})
|
|
514
|
+
```
|
|
515
|
+
|
|
516
|
+
### Error Handling
|
|
517
|
+
|
|
518
|
+
To handle command errors globally:
|
|
519
|
+
|
|
520
|
+
```ts
|
|
521
|
+
try {
|
|
522
|
+
cli.parse(process.argv, { run: false })
|
|
523
|
+
await cli.runMatchedCommand()
|
|
524
|
+
} catch (error) {
|
|
525
|
+
console.error(error.stack)
|
|
526
|
+
process.exit(1)
|
|
527
|
+
}
|
|
528
|
+
```
|
|
529
|
+
|
|
530
|
+
### With TypeScript
|
|
531
|
+
|
|
532
|
+
```ts
|
|
533
|
+
import { goke } from 'goke'
|
|
534
|
+
|
|
535
|
+
const cli = goke('my-program')
|
|
536
|
+
```
|
|
537
|
+
|
|
538
|
+
Do not manually type `action` callback arguments. goke infers argument and option types automatically from the command signature and option schemas.
|
|
539
|
+
|
|
540
|
+
```ts
|
|
541
|
+
import { goke } from 'goke'
|
|
542
|
+
import { z } from 'zod'
|
|
543
|
+
|
|
544
|
+
const cli = goke('my-program')
|
|
545
|
+
|
|
546
|
+
cli
|
|
547
|
+
.command('serve <entry>', 'Start the app')
|
|
548
|
+
.option('--port <port>', z.number().default(3000).describe('Port number'))
|
|
549
|
+
.option('--watch', 'Watch files')
|
|
550
|
+
.action((entry, options) => {
|
|
551
|
+
// entry: string
|
|
552
|
+
// options.port: number
|
|
553
|
+
// options.watch: boolean
|
|
554
|
+
console.log(entry, options.port, options.watch)
|
|
555
|
+
})
|
|
556
|
+
```
|
|
557
|
+
|
|
558
|
+
## References
|
|
559
|
+
|
|
560
|
+
### CLI Instance
|
|
561
|
+
|
|
562
|
+
CLI instance is created by invoking the `goke` function:
|
|
563
|
+
|
|
564
|
+
```ts
|
|
565
|
+
import { goke } from 'goke'
|
|
566
|
+
const cli = goke()
|
|
567
|
+
```
|
|
568
|
+
|
|
569
|
+
#### goke(name?)
|
|
570
|
+
|
|
571
|
+
Create a CLI instance, optionally specify the program name which will be used to display in help and version message. When not set we use the basename of `argv[1]`.
|
|
572
|
+
|
|
573
|
+
#### cli.command(name, description, config?)
|
|
574
|
+
|
|
575
|
+
- Type: `(name: string, description: string) => Command`
|
|
576
|
+
|
|
577
|
+
Create a command instance. Supports space-separated subcommands like `mcp login`.
|
|
578
|
+
|
|
579
|
+
- `config.allowUnknownOptions`: `boolean` Allow unknown options in this command.
|
|
580
|
+
- `config.ignoreOptionDefaultValue`: `boolean` Don't use the options's default value in parsed options, only display them in help message.
|
|
581
|
+
|
|
582
|
+
#### cli.option(name, descriptionOrSchema?)
|
|
583
|
+
|
|
584
|
+
- Type: `(name: string, descriptionOrSchema?: string | StandardJSONSchemaV1) => CLI`
|
|
585
|
+
|
|
586
|
+
Add a global option. The second argument is either:
|
|
587
|
+
|
|
588
|
+
- A **string** used as the description text
|
|
589
|
+
- A **Standard Schema** (e.g. `z.number().describe('Port')`) — description and default are extracted from the schema automatically
|
|
590
|
+
|
|
591
|
+
#### cli.parse(argv?)
|
|
592
|
+
|
|
593
|
+
- Type: `(argv = process.argv) => ParsedArgv`
|
|
594
|
+
|
|
595
|
+
#### cli.version(version, customFlags?)
|
|
596
|
+
|
|
597
|
+
- Type: `(version: string, customFlags = '-v, --version') => CLI`
|
|
598
|
+
|
|
599
|
+
#### cli.help(callback?)
|
|
600
|
+
|
|
601
|
+
- Type: `(callback?: HelpCallback) => CLI`
|
|
602
|
+
|
|
603
|
+
#### cli.outputHelp()
|
|
604
|
+
|
|
605
|
+
- Type: `() => CLI`
|
|
606
|
+
|
|
607
|
+
#### cli.usage(text)
|
|
608
|
+
|
|
609
|
+
- Type: `(text: string) => CLI`
|
|
610
|
+
|
|
611
|
+
#### cli.example(example)
|
|
612
|
+
|
|
613
|
+
- Type: `(example: CommandExample) => CLI`
|
|
614
|
+
|
|
615
|
+
### Command Instance
|
|
616
|
+
|
|
617
|
+
#### command.option()
|
|
618
|
+
|
|
619
|
+
Basically the same as `cli.option` but this adds the option to specific command.
|
|
620
|
+
|
|
621
|
+
#### command.action(callback)
|
|
622
|
+
|
|
623
|
+
- Type: `(callback: ActionCallback) => Command`
|
|
624
|
+
|
|
625
|
+
#### command.alias(name)
|
|
626
|
+
|
|
627
|
+
- Type: `(name: string) => Command`
|
|
628
|
+
|
|
629
|
+
#### command.allowUnknownOptions()
|
|
630
|
+
|
|
631
|
+
- Type: `() => Command`
|
|
632
|
+
|
|
633
|
+
#### command.example(example)
|
|
634
|
+
|
|
635
|
+
- Type: `(example: CommandExample) => Command`
|
|
636
|
+
|
|
637
|
+
#### command.usage(text)
|
|
638
|
+
|
|
639
|
+
- Type: `(text: string) => Command`
|
|
640
|
+
|
|
641
|
+
### Events
|
|
642
|
+
|
|
643
|
+
Listen to commands:
|
|
644
|
+
|
|
645
|
+
```js
|
|
646
|
+
cli.on('command:foo', () => {
|
|
647
|
+
// Do something
|
|
648
|
+
})
|
|
649
|
+
|
|
650
|
+
cli.on('command:!', () => {
|
|
651
|
+
// Default command
|
|
652
|
+
})
|
|
653
|
+
|
|
654
|
+
cli.on('command:*', () => {
|
|
655
|
+
console.error('Invalid command: %s', cli.args.join(' '))
|
|
656
|
+
process.exit(1)
|
|
657
|
+
})
|
|
658
|
+
```
|
|
659
|
+
|
|
660
|
+
## Credits
|
|
661
|
+
|
|
662
|
+
goke is inspired by [cac](https://github.com/cacjs/cac) (Command And Conquer) by [EGOIST](https://github.com/egoist).
|
|
663
|
+
|
|
664
|
+
## License
|
|
665
|
+
|
|
666
|
+
MIT
|