claudekit-cli 3.41.4-dev.42 → 3.41.4-dev.44

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.
Files changed (3) hide show
  1. package/cli-manifest.json +2128 -0
  2. package/dist/index.js +1641 -673
  3. package/package.json +11 -4
package/dist/index.js CHANGED
@@ -60755,7 +60755,7 @@ var package_default;
60755
60755
  var init_package = __esm(() => {
60756
60756
  package_default = {
60757
60757
  name: "claudekit-cli",
60758
- version: "3.41.4-dev.42",
60758
+ version: "3.41.4-dev.44",
60759
60759
  description: "CLI tool for bootstrapping and updating ClaudeKit projects",
60760
60760
  type: "module",
60761
60761
  repository: {
@@ -60772,13 +60772,16 @@ var init_package = __esm(() => {
60772
60772
  files: [
60773
60773
  "bin/ck.js",
60774
60774
  "dist/index.js",
60775
- "dist/ui/"
60775
+ "dist/ui/",
60776
+ "cli-manifest.json"
60776
60777
  ],
60777
60778
  scripts: {
60778
60779
  tauri: "tauri",
60779
60780
  "tauri:dev": "tauri dev",
60780
60781
  "tauri:build": "tauri build",
60781
60782
  "desktop:validate-config": "bun scripts/validate-desktop-bundle-config.ts",
60783
+ "desktop:sync-version": "bun scripts/sync-desktop-bundle-config.ts",
60784
+ "desktop:check-sync": "bun scripts/sync-desktop-bundle-config.ts --check",
60782
60785
  "desktop:validate-icons": "bun scripts/validate-desktop-icon-source.ts",
60783
60786
  "icons:regen": "./scripts/regen-desktop-icons.sh",
60784
60787
  dev: "bun run src/index.ts",
@@ -60803,9 +60806,13 @@ var init_package = __esm(() => {
60803
60806
  "dev:quick": "./scripts/dev-quick-start.sh",
60804
60807
  "dev:all": "./scripts/dev-quick-start.sh all",
60805
60808
  metrics: "bun run scripts/workflow-metrics.ts",
60806
- validate: "bun run typecheck && bun run lint && bun run desktop:validate-config && bun run desktop:validate-icons && bun test && bun run ui:test && bun run build",
60809
+ validate: "bun run typecheck && bun run lint && bun run desktop:check-sync && bun run desktop:validate-config && bun run desktop:validate-icons && bun test && bun run ui:test && bun run build",
60807
60810
  "install:hooks": "./.githooks/install.sh",
60808
- prepare: `node -e "try{require('child_process').execSync('git rev-parse --git-dir',{stdio:'ignore'});require('child_process').execSync('bash .githooks/install.sh',{stdio:'inherit'})}catch(e){console.warn('[i] Hook install skipped:',e.message)}"`
60811
+ prepare: `node -e "try{require('child_process').execSync('git rev-parse --git-dir',{stdio:'ignore'});require('child_process').execSync('bash .githooks/install.sh',{stdio:'inherit'})}catch(e){console.warn('[i] Hook install skipped:',e.message)}"`,
60812
+ "help:check-parity": "bun run scripts/check-help-parity.ts",
60813
+ "manifest:generate": "bun run scripts/generate-cli-manifest.ts",
60814
+ "docs:generate": "bun run scripts/generate-cli-reference.ts",
60815
+ prepublishOnly: "bun run help:check-parity && bun run manifest:generate && bun run docs:generate"
60809
60816
  },
60810
60817
  keywords: [
60811
60818
  "cli",
@@ -74701,231 +74708,1062 @@ var init_content = __esm(() => {
74701
74708
  init_content_subcommands();
74702
74709
  });
74703
74710
 
74704
- // src/domains/help/commands/common-options.ts
74705
- var filterOptionsGroup, folderOptionsGroup;
74706
- var init_common_options = __esm(() => {
74707
- filterOptionsGroup = {
74708
- title: "Filter Options",
74709
- options: [
74711
+ // src/domains/help/commands/agents-command-help.ts
74712
+ var agentsCommandHelp;
74713
+ var init_agents_command_help = __esm(() => {
74714
+ agentsCommandHelp = {
74715
+ name: "agents",
74716
+ description: "Install, uninstall, and manage Claude Code agents across providers",
74717
+ usage: "ck agents [options]",
74718
+ examples: [
74710
74719
  {
74711
- flags: "--exclude <pattern>",
74712
- description: "Exclude files matching glob pattern (can be used multiple times)"
74720
+ command: "ck agents --name maintainer --agent codex",
74721
+ description: "Install one agent to Codex"
74713
74722
  },
74714
74723
  {
74715
- flags: "--beta",
74716
- description: "Show beta versions in selection prompt"
74724
+ command: "ck agents --list --installed",
74725
+ description: "Show installed agents and locations"
74726
+ }
74727
+ ],
74728
+ optionGroups: [
74729
+ {
74730
+ title: "Mode Options",
74731
+ options: [
74732
+ {
74733
+ flags: "-l, --list",
74734
+ description: "List available agents from source"
74735
+ },
74736
+ {
74737
+ flags: "--installed",
74738
+ description: "When used with --list, show installed agents instead"
74739
+ },
74740
+ {
74741
+ flags: "-u, --uninstall",
74742
+ description: "Uninstall agent(s) from providers"
74743
+ },
74744
+ {
74745
+ flags: "--sync",
74746
+ description: "Sync registry with filesystem (clean orphaned entries)"
74747
+ }
74748
+ ]
74749
+ },
74750
+ {
74751
+ title: "Installation Options",
74752
+ options: [
74753
+ {
74754
+ flags: "-n, --name <agent>",
74755
+ description: "Agent name to install or uninstall"
74756
+ },
74757
+ {
74758
+ flags: "-a, --agent <provider>",
74759
+ description: "Target provider(s), can be specified multiple times"
74760
+ },
74761
+ {
74762
+ flags: "-g, --global",
74763
+ description: "Install globally instead of project-level"
74764
+ },
74765
+ {
74766
+ flags: "--all",
74767
+ description: "Install to all supported providers"
74768
+ },
74769
+ {
74770
+ flags: "-y, --yes",
74771
+ description: "Skip confirmation prompts"
74772
+ }
74773
+ ]
74774
+ },
74775
+ {
74776
+ title: "Uninstall Options",
74777
+ options: [
74778
+ {
74779
+ flags: "--force",
74780
+ description: "Force uninstall even if not tracked in registry"
74781
+ }
74782
+ ]
74783
+ }
74784
+ ]
74785
+ };
74786
+ });
74787
+
74788
+ // src/domains/help/commands/api-command-help.ts
74789
+ var apiCommandHelp;
74790
+ var init_api_command_help = __esm(() => {
74791
+ apiCommandHelp = {
74792
+ name: "api",
74793
+ description: "Interact with ClaudeKit API and proxy services",
74794
+ usage: "ck api [action] [service] [path] [options]",
74795
+ examples: [
74796
+ {
74797
+ command: "ck api status",
74798
+ description: "Validate your API key and check rate limit status"
74799
+ },
74800
+ {
74801
+ command: "ck api vidcap summary https://youtu.be/abc123",
74802
+ description: "Generate an AI summary of a YouTube video"
74803
+ }
74804
+ ],
74805
+ optionGroups: [
74806
+ {
74807
+ title: "Output Options",
74808
+ options: [{ flags: "--json", description: "Output raw JSON instead of formatted display" }]
74809
+ }
74810
+ ],
74811
+ subcommands: [
74812
+ {
74813
+ name: "status",
74814
+ description: "Validate API key and check rate limit",
74815
+ usage: "ck api status [--json]",
74816
+ examples: [],
74817
+ optionGroups: [
74818
+ {
74819
+ title: "Output Options",
74820
+ options: [
74821
+ { flags: "--json", description: "Output raw JSON instead of formatted display" }
74822
+ ]
74823
+ }
74824
+ ]
74825
+ },
74826
+ {
74827
+ name: "services",
74828
+ description: "List available proxy services",
74829
+ usage: "ck api services [--json]",
74830
+ examples: [],
74831
+ optionGroups: [
74832
+ {
74833
+ title: "Output Options",
74834
+ options: [
74835
+ { flags: "--json", description: "Output raw JSON instead of formatted display" }
74836
+ ]
74837
+ }
74838
+ ]
74839
+ },
74840
+ {
74841
+ name: "setup",
74842
+ description: "Configure and store your ClaudeKit API key",
74843
+ usage: "ck api setup [--key <key>] [--force] [--json]",
74844
+ examples: [],
74845
+ optionGroups: [
74846
+ {
74847
+ title: "Setup Options",
74848
+ options: [
74849
+ { flags: "--key <key>", description: "API key to store" },
74850
+ { flags: "--force", description: "Force re-setup even if key already exists" }
74851
+ ]
74852
+ },
74853
+ {
74854
+ title: "Output Options",
74855
+ options: [
74856
+ { flags: "--json", description: "Output raw JSON instead of formatted display" }
74857
+ ]
74858
+ }
74859
+ ]
74860
+ },
74861
+ {
74862
+ name: "proxy",
74863
+ description: "Generic HTTP proxy to any ClaudeKit-backed service",
74864
+ usage: "ck api proxy <service> <path> [options]",
74865
+ examples: [],
74866
+ optionGroups: [
74867
+ {
74868
+ title: "Proxy Options",
74869
+ options: [
74870
+ {
74871
+ flags: "--method <method>",
74872
+ description: "HTTP method for the request",
74873
+ defaultValue: "GET"
74874
+ },
74875
+ { flags: "--body <json>", description: "Request body as JSON string" },
74876
+ { flags: "--query <json>", description: "Query params as JSON string" }
74877
+ ]
74878
+ },
74879
+ {
74880
+ title: "Output Options",
74881
+ options: [
74882
+ { flags: "--json", description: "Output raw JSON instead of formatted display" }
74883
+ ]
74884
+ }
74885
+ ]
74886
+ },
74887
+ {
74888
+ name: "vidcap",
74889
+ description: "Video metadata and AI processing via YouTube",
74890
+ usage: "ck api vidcap <action> <url|query>",
74891
+ examples: [],
74892
+ optionGroups: [
74893
+ {
74894
+ title: "Vidcap Options",
74895
+ options: [
74896
+ {
74897
+ flags: "--locale <locale>",
74898
+ description: "Locale for summary/caption output",
74899
+ defaultValue: "en"
74900
+ },
74901
+ { flags: "--max-results <n>", description: "Max results for search action" },
74902
+ {
74903
+ flags: "--second <s>",
74904
+ description: "Timestamp in seconds for screenshot action"
74905
+ },
74906
+ {
74907
+ flags: "--order <order>",
74908
+ description: "Sort order for comments (time/relevance)"
74909
+ }
74910
+ ]
74911
+ },
74912
+ {
74913
+ title: "Output Options",
74914
+ options: [
74915
+ { flags: "--json", description: "Output raw JSON instead of formatted display" }
74916
+ ]
74917
+ }
74918
+ ],
74919
+ subcommands: [
74920
+ {
74921
+ name: "info",
74922
+ description: "Fetch video metadata (title, duration, channel)",
74923
+ usage: "ck api vidcap info <url>",
74924
+ examples: [],
74925
+ optionGroups: [
74926
+ {
74927
+ title: "Output Options",
74928
+ options: [{ flags: "--json", description: "Output raw JSON" }]
74929
+ }
74930
+ ]
74931
+ },
74932
+ {
74933
+ name: "search",
74934
+ description: "Search YouTube for videos matching a query",
74935
+ usage: "ck api vidcap search <query>",
74936
+ examples: [],
74937
+ optionGroups: [
74938
+ {
74939
+ title: "Search Options",
74940
+ options: [{ flags: "--max-results <n>", description: "Maximum number of results" }]
74941
+ }
74942
+ ]
74943
+ },
74944
+ {
74945
+ name: "summary",
74946
+ description: "Generate an AI summary of a video",
74947
+ usage: "ck api vidcap summary <url>",
74948
+ examples: [],
74949
+ optionGroups: [
74950
+ {
74951
+ title: "Summary Options",
74952
+ options: [
74953
+ {
74954
+ flags: "--locale <locale>",
74955
+ description: "Locale for summary text",
74956
+ defaultValue: "en"
74957
+ }
74958
+ ]
74959
+ }
74960
+ ]
74961
+ },
74962
+ {
74963
+ name: "caption",
74964
+ description: "Extract captions/transcript from a video",
74965
+ usage: "ck api vidcap caption <url>",
74966
+ examples: [],
74967
+ optionGroups: [
74968
+ {
74969
+ title: "Caption Options",
74970
+ options: [
74971
+ {
74972
+ flags: "--locale <locale>",
74973
+ description: "Locale for caption text",
74974
+ defaultValue: "en"
74975
+ }
74976
+ ]
74977
+ }
74978
+ ]
74979
+ },
74980
+ {
74981
+ name: "screenshot",
74982
+ description: "Capture a frame from a video at a specific timestamp",
74983
+ usage: "ck api vidcap screenshot <url>",
74984
+ examples: [],
74985
+ optionGroups: [
74986
+ {
74987
+ title: "Screenshot Options",
74988
+ options: [{ flags: "--second <s>", description: "Timestamp in seconds" }]
74989
+ }
74990
+ ]
74991
+ },
74992
+ {
74993
+ name: "comments",
74994
+ description: "Fetch comments for a video",
74995
+ usage: "ck api vidcap comments <url>",
74996
+ examples: [],
74997
+ optionGroups: [
74998
+ {
74999
+ title: "Comment Options",
75000
+ options: [
75001
+ {
75002
+ flags: "--order <order>",
75003
+ description: "Sort order: time or relevance"
75004
+ },
75005
+ { flags: "--max-results <n>", description: "Maximum number of comments" }
75006
+ ]
75007
+ }
75008
+ ]
75009
+ },
75010
+ {
75011
+ name: "media",
75012
+ description: "Download media or extract media URLs from a video",
75013
+ usage: "ck api vidcap media <url>",
75014
+ examples: [],
75015
+ optionGroups: [
75016
+ {
75017
+ title: "Output Options",
75018
+ options: [{ flags: "--json", description: "Output raw JSON" }]
75019
+ }
75020
+ ]
75021
+ }
75022
+ ]
75023
+ },
75024
+ {
75025
+ name: "reviewweb",
75026
+ description: "Web scraping and SEO analysis via the ClaudeKit proxy",
75027
+ usage: "ck api reviewweb <action> <url|domain|keyword>",
75028
+ examples: [],
75029
+ optionGroups: [
75030
+ {
75031
+ title: "Review Options",
75032
+ options: [
75033
+ {
75034
+ flags: "--format <fmt>",
75035
+ description: "Summary format: bullet or paragraph"
75036
+ },
75037
+ { flags: "--max-length <n>", description: "Maximum summary length in characters" },
75038
+ {
75039
+ flags: "--instructions <text>",
75040
+ description: "Extraction instructions (extract action)"
75041
+ },
75042
+ { flags: "--template <json>", description: "JSON template for structured extraction" },
75043
+ {
75044
+ flags: "--type <type>",
75045
+ description: "Link type filter: web/image/file/all"
75046
+ },
75047
+ { flags: "--country <code>", description: "Country code for SEO commands" }
75048
+ ]
75049
+ },
75050
+ {
75051
+ title: "Output Options",
75052
+ options: [
75053
+ { flags: "--json", description: "Output raw JSON instead of formatted display" }
75054
+ ]
75055
+ }
75056
+ ],
75057
+ subcommands: [
75058
+ {
75059
+ name: "scrape",
75060
+ description: "Scrape raw HTML content from a URL",
75061
+ usage: "ck api reviewweb scrape <url>",
75062
+ examples: [],
75063
+ optionGroups: [
75064
+ {
75065
+ title: "Output Options",
75066
+ options: [{ flags: "--json", description: "Output raw JSON" }]
75067
+ }
75068
+ ]
75069
+ },
75070
+ {
75071
+ name: "summarize",
75072
+ description: "AI-generated summary of a web page",
75073
+ usage: "ck api reviewweb summarize <url>",
75074
+ examples: [],
75075
+ optionGroups: [
75076
+ {
75077
+ title: "Summary Options",
75078
+ options: [
75079
+ { flags: "--format <fmt>", description: "Output format: bullet or paragraph" },
75080
+ { flags: "--max-length <n>", description: "Maximum length in characters" }
75081
+ ]
75082
+ }
75083
+ ]
75084
+ },
75085
+ {
75086
+ name: "markdown",
75087
+ description: "Convert a web page to clean Markdown",
75088
+ usage: "ck api reviewweb markdown <url>",
75089
+ examples: [],
75090
+ optionGroups: [
75091
+ {
75092
+ title: "Output Options",
75093
+ options: [{ flags: "--json", description: "Output raw JSON" }]
75094
+ }
75095
+ ]
75096
+ },
75097
+ {
75098
+ name: "extract",
75099
+ description: "Extract structured data from a web page",
75100
+ usage: "ck api reviewweb extract <url>",
75101
+ examples: [],
75102
+ optionGroups: [
75103
+ {
75104
+ title: "Extraction Options",
75105
+ options: [
75106
+ { flags: "--instructions <text>", description: "Extraction instructions" },
75107
+ { flags: "--template <json>", description: "JSON template for output shape" }
75108
+ ]
75109
+ }
75110
+ ]
75111
+ },
75112
+ {
75113
+ name: "links",
75114
+ description: "Extract all links from a web page",
75115
+ usage: "ck api reviewweb links <url>",
75116
+ examples: [],
75117
+ optionGroups: [
75118
+ {
75119
+ title: "Filter Options",
75120
+ options: [
75121
+ {
75122
+ flags: "--type <type>",
75123
+ description: "Link type: web/image/file/all",
75124
+ defaultValue: "all"
75125
+ }
75126
+ ]
75127
+ }
75128
+ ]
75129
+ },
75130
+ {
75131
+ name: "screenshot",
75132
+ description: "Capture a screenshot of a web page",
75133
+ usage: "ck api reviewweb screenshot <url>",
75134
+ examples: [],
75135
+ optionGroups: [
75136
+ {
75137
+ title: "Output Options",
75138
+ options: [{ flags: "--json", description: "Output raw JSON" }]
75139
+ }
75140
+ ]
75141
+ },
75142
+ {
75143
+ name: "seo-traffic",
75144
+ description: "Fetch estimated organic traffic data for a domain",
75145
+ usage: "ck api reviewweb seo-traffic <domain>",
75146
+ examples: [],
75147
+ optionGroups: [
75148
+ {
75149
+ title: "SEO Options",
75150
+ options: [
75151
+ { flags: "--country <code>", description: "Country code for traffic data" }
75152
+ ]
75153
+ }
75154
+ ]
75155
+ },
75156
+ {
75157
+ name: "seo-keywords",
75158
+ description: "Fetch top SEO keywords for a domain or keyword",
75159
+ usage: "ck api reviewweb seo-keywords <domain|keyword>",
75160
+ examples: [],
75161
+ optionGroups: [
75162
+ {
75163
+ title: "SEO Options",
75164
+ options: [
75165
+ { flags: "--country <code>", description: "Country code for keyword data" }
75166
+ ]
75167
+ }
75168
+ ]
75169
+ },
75170
+ {
75171
+ name: "seo-backlinks",
75172
+ description: "Fetch backlink profile for a domain",
75173
+ usage: "ck api reviewweb seo-backlinks <domain>",
75174
+ examples: [],
75175
+ optionGroups: [
75176
+ {
75177
+ title: "SEO Options",
75178
+ options: [
75179
+ { flags: "--country <code>", description: "Country code for backlink data" }
75180
+ ]
75181
+ }
75182
+ ]
75183
+ }
75184
+ ]
75185
+ }
75186
+ ]
75187
+ };
75188
+ });
75189
+
75190
+ // src/domains/help/commands/app-command-help.ts
75191
+ var appCommandHelp;
75192
+ var init_app_command_help = __esm(() => {
75193
+ appCommandHelp = {
75194
+ name: "app",
75195
+ description: "Launch the ClaudeKit Control Center desktop app",
75196
+ usage: "ck app [options]",
75197
+ examples: [
75198
+ {
75199
+ command: "ck app",
75200
+ description: "Launch the native desktop app, downloading it on first run"
75201
+ },
75202
+ {
75203
+ command: "ck app --web",
75204
+ description: "Open the existing web dashboard instead of the desktop app"
75205
+ }
75206
+ ],
75207
+ optionGroups: [
75208
+ {
75209
+ title: "Desktop Actions",
75210
+ options: [
75211
+ {
75212
+ flags: "--web",
75213
+ description: "Open the browser dashboard instead of launching the desktop app"
75214
+ },
75215
+ {
75216
+ flags: "--update",
75217
+ description: "Install a newer desktop build before launch when one is available"
75218
+ },
75219
+ {
75220
+ flags: "--path",
75221
+ description: "Print the installed path, or the target install path if absent"
75222
+ },
75223
+ {
75224
+ flags: "--uninstall",
75225
+ description: "Remove the installed desktop app and exit"
75226
+ },
75227
+ {
75228
+ flags: "--dev",
75229
+ description: "Force dev channel for this invocation"
75230
+ },
75231
+ {
75232
+ flags: "--stable",
75233
+ description: "Force stable channel for this invocation"
75234
+ }
75235
+ ]
75236
+ }
75237
+ ],
75238
+ sections: [
75239
+ {
75240
+ title: "Notes",
75241
+ content: "`ck app` downloads the desktop app build for your platform when needed, then launches it. Use `ck config` when you need web-only dashboard flags such as `--host` or `--port`."
75242
+ }
75243
+ ]
75244
+ };
75245
+ });
75246
+
75247
+ // src/domains/help/commands/backups-command-help.ts
75248
+ var backupsCommandHelp;
75249
+ var init_backups_command_help = __esm(() => {
75250
+ backupsCommandHelp = {
75251
+ name: "backups",
75252
+ description: "List, restore, and prune ClaudeKit recovery backups",
75253
+ usage: "ck backups <list|restore|prune> [options]",
75254
+ examples: [
75255
+ {
75256
+ command: "ck backups list --limit 5",
75257
+ description: "Show the newest five recovery backups"
75258
+ },
75259
+ {
75260
+ command: "ck backups restore 2026-04-06T21-53-01-706-byrf --yes",
75261
+ description: "Restore a specific recovery backup without prompting"
75262
+ }
75263
+ ],
75264
+ optionGroups: [
75265
+ {
75266
+ title: "Subcommands",
75267
+ options: [
75268
+ {
75269
+ flags: "list [--limit <n>] [--json]",
75270
+ description: "List recovery backups under ~/.claudekit/backups/"
75271
+ },
75272
+ {
75273
+ flags: "restore <id> [--yes] [--json]",
75274
+ description: "Restore a specific recovery backup to its original source root"
75275
+ },
75276
+ {
75277
+ flags: "prune [id] [--keep <n> | --all] [--yes] [--json]",
75278
+ description: "Delete one, many, or old recovery backups"
75279
+ }
75280
+ ]
75281
+ },
75282
+ {
75283
+ title: "Shared Options",
75284
+ options: [
75285
+ { flags: "--limit <n>", description: "Show only the newest N backups" },
75286
+ { flags: "--keep <n>", description: "Keep the newest N backups when pruning" },
75287
+ { flags: "--all", description: "Delete all recovery backups" },
75288
+ { flags: "-y, --yes", description: "Skip confirmation prompts" },
75289
+ { flags: "--json", description: "Output machine-readable JSON" }
75290
+ ]
75291
+ }
75292
+ ],
75293
+ subcommands: [
75294
+ {
75295
+ name: "list",
75296
+ description: "List recovery backups under ~/.claudekit/backups/",
75297
+ usage: "ck backups list [--limit <n>] [--json]",
75298
+ examples: [],
75299
+ optionGroups: []
75300
+ },
75301
+ {
75302
+ name: "restore",
75303
+ description: "Restore a specific recovery backup to its original source root",
75304
+ usage: "ck backups restore <id> [--yes] [--json]",
75305
+ examples: [],
75306
+ optionGroups: []
75307
+ },
75308
+ {
75309
+ name: "prune",
75310
+ description: "Delete one, many, or old recovery backups",
75311
+ usage: "ck backups prune [id] [--keep <n> | --all] [--yes] [--json]",
75312
+ examples: [],
75313
+ optionGroups: []
75314
+ }
75315
+ ],
75316
+ sections: [
75317
+ {
75318
+ title: "Backup Scope",
75319
+ content: "These backups contain only the ClaudeKit-managed files targeted by destructive operations, not the full ~/.claude/ directory."
75320
+ },
75321
+ {
75322
+ title: "Automatic Retention",
75323
+ content: "ClaudeKit keeps the newest recovery backups automatically and prunes older ones after successful destructive operations."
75324
+ }
75325
+ ]
75326
+ };
75327
+ });
75328
+
75329
+ // src/domains/help/commands/commands-command-help.ts
75330
+ var commandsCommandHelp;
75331
+ var init_commands_command_help = __esm(() => {
75332
+ commandsCommandHelp = {
75333
+ name: "commands",
75334
+ description: "Install, uninstall, and manage Claude commands across providers",
75335
+ usage: "ck commands [options]",
75336
+ examples: [
75337
+ {
75338
+ command: "ck commands --name plan --agent codex",
75339
+ description: "Install one slash command to Codex"
75340
+ },
75341
+ {
75342
+ command: "ck commands --list",
75343
+ description: "List available commands from source"
75344
+ }
75345
+ ],
75346
+ optionGroups: [
75347
+ {
75348
+ title: "Mode Options",
75349
+ options: [
75350
+ {
75351
+ flags: "-l, --list",
75352
+ description: "List available commands from source"
75353
+ },
75354
+ {
75355
+ flags: "--installed",
75356
+ description: "When used with --list, show installed commands instead"
75357
+ },
75358
+ {
75359
+ flags: "-u, --uninstall",
75360
+ description: "Uninstall command(s) from providers"
75361
+ },
75362
+ {
75363
+ flags: "--sync",
75364
+ description: "Sync registry with filesystem (clean orphaned entries)"
75365
+ }
75366
+ ]
74717
75367
  },
74718
75368
  {
74719
- flags: "--refresh",
74720
- description: "Bypass release cache to fetch latest versions from GitHub"
74721
- }
74722
- ]
74723
- };
74724
- folderOptionsGroup = {
74725
- title: "Folder Options",
74726
- options: [
74727
- {
74728
- flags: "--docs-dir <name>",
74729
- description: "Custom docs folder name to avoid conflicts with existing folders",
74730
- defaultValue: "docs"
75369
+ title: "Installation Options",
75370
+ options: [
75371
+ {
75372
+ flags: "-n, --name <command>",
75373
+ description: "Command name to install or uninstall"
75374
+ },
75375
+ {
75376
+ flags: "-a, --agent <provider>",
75377
+ description: "Target provider(s), can be specified multiple times"
75378
+ },
75379
+ {
75380
+ flags: "-g, --global",
75381
+ description: "Install globally instead of project-level"
75382
+ },
75383
+ {
75384
+ flags: "--all",
75385
+ description: "Install to all supported providers"
75386
+ },
75387
+ {
75388
+ flags: "-y, --yes",
75389
+ description: "Skip confirmation prompts"
75390
+ }
75391
+ ]
74731
75392
  },
74732
75393
  {
74733
- flags: "--plans-dir <name>",
74734
- description: "Custom plans folder name to avoid conflicts with existing folders",
74735
- defaultValue: "plans"
75394
+ title: "Uninstall Options",
75395
+ options: [
75396
+ {
75397
+ flags: "--force",
75398
+ description: "Force uninstall even if not tracked in registry"
75399
+ }
75400
+ ]
74736
75401
  }
74737
75402
  ]
74738
75403
  };
74739
75404
  });
74740
75405
 
74741
- // src/domains/help/commands/new-command-help.ts
74742
- var newCommandHelp;
74743
- var init_new_command_help = __esm(() => {
74744
- init_common_options();
74745
- newCommandHelp = {
74746
- name: "new",
74747
- description: "Bootstrap a new ClaudeKit project (with interactive version selection)",
74748
- usage: "ck new [options]",
75406
+ // src/domains/help/commands/config-command-help.ts
75407
+ var configCommandHelp;
75408
+ var init_config_command_help = __esm(() => {
75409
+ configCommandHelp = {
75410
+ name: "config",
75411
+ description: "Manage ClaudeKit configuration and launch the config dashboard",
75412
+ usage: "ck config [action] [key] [value] [options]",
74749
75413
  examples: [
74750
75414
  {
74751
- command: "ck new --kit engineer --dir ./my-project",
74752
- description: "Create engineer kit project in specific directory"
75415
+ command: "ck config",
75416
+ description: "Launch the web dashboard (same as 'ck config ui')"
74753
75417
  },
74754
75418
  {
74755
- command: "ck new -y --use-git --release v2.1.0",
74756
- description: "Non-interactive with git clone (no GitHub API needed)"
75419
+ command: "ck config --host 0.0.0.0 --no-open",
75420
+ description: "Expose the dashboard to your network intentionally"
75421
+ },
75422
+ {
75423
+ command: "ck config set defaults.kit engineer",
75424
+ description: "Set a config value from the CLI"
74757
75425
  }
74758
75426
  ],
74759
75427
  optionGroups: [
74760
75428
  {
74761
- title: "Mode Options",
75429
+ title: "Actions",
74762
75430
  options: [
74763
75431
  {
74764
- flags: "-y, --yes",
74765
- description: "Non-interactive mode (skip all prompts)"
75432
+ flags: "ui",
75433
+ description: "Launch config dashboard (default action when omitted)"
74766
75434
  },
74767
75435
  {
74768
- flags: "--use-git",
74769
- description: "Use git clone instead of GitHub API (uses SSH/HTTPS credentials)"
75436
+ flags: "get <key>",
75437
+ description: "Read a config value"
75438
+ },
75439
+ {
75440
+ flags: "set <key> <value>",
75441
+ description: "Write a config value"
75442
+ },
75443
+ {
75444
+ flags: "show",
75445
+ description: "Print merged config"
74770
75446
  }
74771
75447
  ]
74772
75448
  },
74773
75449
  {
74774
- title: "Project Options",
75450
+ title: "Scope Options",
74775
75451
  options: [
74776
75452
  {
74777
- flags: "--dir <directory>",
74778
- description: "Target directory for the new project",
74779
- defaultValue: "."
74780
- },
74781
- {
74782
- flags: "--kit <kit>",
74783
- description: "Kit to use (engineer, marketing)"
74784
- },
74785
- {
74786
- flags: "-r, --release <version>",
74787
- description: "Skip version selection, use specific version (e.g., latest, v1.0.0)"
75453
+ flags: "-g, --global",
75454
+ description: "Use global config (~/.claudekit/config.json)"
74788
75455
  },
74789
75456
  {
74790
- flags: "--force",
74791
- description: "Overwrite existing files without confirmation"
75457
+ flags: "-l, --local",
75458
+ description: "Use local config (.claude/.ck.json)"
74792
75459
  }
74793
75460
  ]
74794
75461
  },
74795
- filterOptionsGroup,
74796
75462
  {
74797
- title: "Installation Options",
75463
+ title: "Dashboard Options",
74798
75464
  options: [
74799
75465
  {
74800
- flags: "--opencode",
74801
- description: "Install OpenCode CLI package (non-interactive mode)"
75466
+ flags: "--port <port>",
75467
+ description: "Port for dashboard server"
74802
75468
  },
74803
75469
  {
74804
- flags: "--gemini",
74805
- description: "Install Google Gemini CLI package (non-interactive mode)"
75470
+ flags: "--host <host>",
75471
+ description: "Bind dashboard host (default: 127.0.0.1)"
74806
75472
  },
74807
75473
  {
74808
- flags: "--install-skills",
74809
- description: "Install skills dependencies (non-interactive mode)"
75474
+ flags: "--no-open",
75475
+ description: "Do not auto-open browser when launching dashboard"
74810
75476
  },
74811
75477
  {
74812
- flags: "--with-sudo",
74813
- description: "Include system packages requiring sudo (Linux: ffmpeg, imagemagick)"
74814
- },
75478
+ flags: "--dev",
75479
+ description: "Run dashboard in development mode with HMR"
75480
+ }
75481
+ ]
75482
+ },
75483
+ {
75484
+ title: "Output Options",
75485
+ options: [
74815
75486
  {
74816
- flags: "--prefix",
74817
- description: "Add /ck: prefix to all slash commands"
75487
+ flags: "--json",
75488
+ description: "Output machine-readable JSON for CLI actions"
74818
75489
  }
74819
75490
  ]
75491
+ }
75492
+ ],
75493
+ subcommands: [
75494
+ {
75495
+ name: "ui",
75496
+ description: "Launch config dashboard (default action when omitted)",
75497
+ usage: "ck config ui [--port <port>] [--host <host>] [--no-open] [--dev]",
75498
+ examples: [],
75499
+ optionGroups: []
74820
75500
  },
74821
- folderOptionsGroup
75501
+ {
75502
+ name: "get",
75503
+ description: "Read a config value",
75504
+ usage: "ck config get <key> [-g | -l] [--json]",
75505
+ examples: [],
75506
+ optionGroups: []
75507
+ },
75508
+ {
75509
+ name: "set",
75510
+ description: "Write a config value",
75511
+ usage: "ck config set <key> <value> [-g | -l]",
75512
+ examples: [],
75513
+ optionGroups: []
75514
+ },
75515
+ {
75516
+ name: "show",
75517
+ description: "Print merged config",
75518
+ usage: "ck config show [-g | -l] [--json]",
75519
+ examples: [],
75520
+ optionGroups: []
75521
+ }
75522
+ ],
75523
+ sections: [
75524
+ {
75525
+ title: "Notes",
75526
+ content: "Run 'ck config --help' to see both CLI actions and dashboard flags. Running bare 'ck config' opens the dashboard directly. Use '--host' to expose the dashboard intentionally beyond localhost."
75527
+ }
74822
75528
  ]
74823
75529
  };
74824
75530
  });
74825
75531
 
74826
- // src/domains/help/commands/backups-command-help.ts
74827
- var backupsCommandHelp;
74828
- var init_backups_command_help = __esm(() => {
74829
- backupsCommandHelp = {
74830
- name: "backups",
74831
- description: "List, restore, and prune ClaudeKit recovery backups",
74832
- usage: "ck backups <list|restore|prune> [options]",
75532
+ // src/domains/help/commands/content-command-help.ts
75533
+ var contentCommandHelp;
75534
+ var init_content_command_help = __esm(() => {
75535
+ contentCommandHelp = {
75536
+ name: "content",
75537
+ description: "Multi-channel content automation engine",
75538
+ usage: "ck content [action] [id] [options]",
74833
75539
  examples: [
74834
75540
  {
74835
- command: "ck backups list --limit 5",
74836
- description: "Show the newest five recovery backups"
75541
+ command: "ck content start",
75542
+ description: "Start the content daemon (default action)"
74837
75543
  },
74838
75544
  {
74839
- command: "ck backups restore 2026-04-06T21-53-01-706-byrf --yes",
74840
- description: "Restore a specific recovery backup without prompting"
75545
+ command: "ck content setup",
75546
+ description: "Interactive configuration wizard"
75547
+ },
75548
+ {
75549
+ command: "ck content queue",
75550
+ description: "List pending content items for review"
74841
75551
  }
74842
75552
  ],
74843
75553
  optionGroups: [
74844
75554
  {
74845
- title: "Subcommands",
75555
+ title: "Actions",
74846
75556
  options: [
74847
75557
  {
74848
- flags: "list [--limit <n>] [--json]",
74849
- description: "List recovery backups under ~/.claudekit/backups/"
75558
+ flags: "start",
75559
+ description: "Start the content daemon (default when no action specified)"
74850
75560
  },
74851
75561
  {
74852
- flags: "restore <id> [--yes] [--json]",
74853
- description: "Restore a specific recovery backup to its original source root"
75562
+ flags: "stop",
75563
+ description: "Stop the running content daemon"
74854
75564
  },
74855
75565
  {
74856
- flags: "prune [id] [--keep <n> | --all] [--yes] [--json]",
74857
- description: "Delete one, many, or old recovery backups"
75566
+ flags: "status",
75567
+ description: "Show daemon status and recent activity"
75568
+ },
75569
+ {
75570
+ flags: "logs",
75571
+ description: "View content daemon logs"
75572
+ },
75573
+ {
75574
+ flags: "setup",
75575
+ description: "Interactive configuration wizard"
75576
+ },
75577
+ {
75578
+ flags: "queue",
75579
+ description: "List pending content items"
75580
+ },
75581
+ {
75582
+ flags: "approve <id>",
75583
+ description: "Approve a content item for publishing"
75584
+ },
75585
+ {
75586
+ flags: "reject <id>",
75587
+ description: "Reject a content item"
75588
+ }
75589
+ ]
75590
+ },
75591
+ {
75592
+ title: "Options",
75593
+ options: [
75594
+ {
75595
+ flags: "--dry-run",
75596
+ description: "Generate content without publishing"
75597
+ },
75598
+ {
75599
+ flags: "--verbose",
75600
+ description: "Enable verbose logging"
75601
+ },
75602
+ {
75603
+ flags: "--force",
75604
+ description: "Kill existing process and start fresh"
75605
+ },
75606
+ {
75607
+ flags: "--tail",
75608
+ description: "Follow log output in real-time (for logs action)"
75609
+ },
75610
+ {
75611
+ flags: "--reason <reason>",
75612
+ description: "Rejection reason (for reject action)"
74858
75613
  }
74859
75614
  ]
75615
+ }
75616
+ ],
75617
+ subcommands: [
75618
+ {
75619
+ name: "start",
75620
+ description: "Start the content daemon (default when no action specified)",
75621
+ usage: "ck content start",
75622
+ examples: [],
75623
+ optionGroups: []
75624
+ },
75625
+ {
75626
+ name: "stop",
75627
+ description: "Stop the running content daemon",
75628
+ usage: "ck content stop",
75629
+ examples: [],
75630
+ optionGroups: []
75631
+ },
75632
+ {
75633
+ name: "status",
75634
+ description: "Show daemon status and recent activity",
75635
+ usage: "ck content status",
75636
+ examples: [],
75637
+ optionGroups: []
75638
+ },
75639
+ {
75640
+ name: "logs",
75641
+ description: "View content daemon logs",
75642
+ usage: "ck content logs [--tail]",
75643
+ examples: [],
75644
+ optionGroups: []
75645
+ },
75646
+ {
75647
+ name: "setup",
75648
+ description: "Interactive configuration wizard",
75649
+ usage: "ck content setup",
75650
+ examples: [],
75651
+ optionGroups: []
75652
+ },
75653
+ {
75654
+ name: "queue",
75655
+ description: "List pending content items",
75656
+ usage: "ck content queue",
75657
+ examples: [],
75658
+ optionGroups: []
75659
+ },
75660
+ {
75661
+ name: "approve",
75662
+ description: "Approve a content item for publishing",
75663
+ usage: "ck content approve <id>",
75664
+ examples: [],
75665
+ optionGroups: []
74860
75666
  },
74861
75667
  {
74862
- title: "Shared Options",
74863
- options: [
74864
- { flags: "--limit <n>", description: "Show only the newest N backups" },
74865
- { flags: "--keep <n>", description: "Keep the newest N backups when pruning" },
74866
- { flags: "--all", description: "Delete all recovery backups" },
74867
- { flags: "-y, --yes", description: "Skip confirmation prompts" },
74868
- { flags: "--json", description: "Output machine-readable JSON" }
74869
- ]
75668
+ name: "reject",
75669
+ description: "Reject a content item",
75670
+ usage: "ck content reject <id> [--reason <reason>]",
75671
+ examples: [],
75672
+ optionGroups: []
74870
75673
  }
74871
75674
  ],
74872
75675
  sections: [
74873
75676
  {
74874
- title: "Backup Scope",
74875
- content: "These backups contain only the ClaudeKit-managed files targeted by destructive operations, not the full ~/.claude/ directory."
74876
- },
74877
- {
74878
- title: "Automatic Retention",
74879
- content: "ClaudeKit keeps the newest recovery backups automatically and prunes older ones after successful destructive operations."
75677
+ title: "Notes",
75678
+ content: "Requires content config in .ck.json. Run 'ck content setup' for guided configuration. Review mode can be 'auto' or 'manual' (default: manual)."
74880
75679
  }
74881
75680
  ]
74882
75681
  };
74883
75682
  });
74884
75683
 
74885
- // src/domains/help/commands/app-command-help.ts
74886
- var appCommandHelp;
74887
- var init_app_command_help = __esm(() => {
74888
- appCommandHelp = {
74889
- name: "app",
74890
- description: "Launch the ClaudeKit Control Center desktop app",
74891
- usage: "ck app [options]",
75684
+ // src/domains/help/commands/doctor-command-help.ts
75685
+ var doctorCommandHelp;
75686
+ var init_doctor_command_help = __esm(() => {
75687
+ doctorCommandHelp = {
75688
+ name: "doctor",
75689
+ description: "Comprehensive health check for ClaudeKit",
75690
+ usage: "ck doctor [options]",
74892
75691
  examples: [
74893
75692
  {
74894
- command: "ck app",
74895
- description: "Launch the native desktop app, downloading it on first run"
75693
+ command: "ck doctor",
75694
+ description: "Run full health check interactively"
74896
75695
  },
74897
75696
  {
74898
- command: "ck app --web",
74899
- description: "Open the existing web dashboard instead of the desktop app"
75697
+ command: "ck doctor --fix",
75698
+ description: "Auto-fix all fixable issues"
75699
+ },
75700
+ {
75701
+ command: "ck doctor --check-only",
75702
+ description: "CI mode: exit 1 on failures, no prompts"
74900
75703
  }
74901
75704
  ],
74902
75705
  optionGroups: [
74903
75706
  {
74904
- title: "Desktop Actions",
75707
+ title: "Options",
74905
75708
  options: [
74906
75709
  {
74907
- flags: "--web",
74908
- description: "Open the browser dashboard instead of launching the desktop app"
75710
+ flags: "--report",
75711
+ description: "Generate shareable diagnostic report"
74909
75712
  },
74910
75713
  {
74911
- flags: "--update",
74912
- description: "Install a newer desktop build before launch when one is available"
75714
+ flags: "--fix",
75715
+ description: "Auto-fix all fixable issues"
74913
75716
  },
74914
75717
  {
74915
- flags: "--path",
74916
- description: "Print the installed path, or the target install path if absent"
75718
+ flags: "--check-only",
75719
+ description: "CI mode: no prompts, exit 1 on failures"
74917
75720
  },
74918
75721
  {
74919
- flags: "--uninstall",
74920
- description: "Remove the installed desktop app and exit"
75722
+ flags: "--full",
75723
+ description: "Include extended priority checks (slower but more thorough)"
75724
+ },
75725
+ {
75726
+ flags: "--json",
75727
+ description: "Output JSON format"
74921
75728
  }
74922
75729
  ]
74923
75730
  }
74924
- ],
74925
- sections: [
75731
+ ]
75732
+ };
75733
+ });
75734
+
75735
+ // src/domains/help/commands/common-options.ts
75736
+ var filterOptionsGroup, folderOptionsGroup;
75737
+ var init_common_options = __esm(() => {
75738
+ filterOptionsGroup = {
75739
+ title: "Filter Options",
75740
+ options: [
74926
75741
  {
74927
- title: "Notes",
74928
- content: "`ck app` downloads the desktop app build for your platform when needed, then launches it. Use `ck config` when you need web-only dashboard flags such as `--host` or `--port`."
75742
+ flags: "--exclude <pattern>",
75743
+ description: "Exclude files matching glob pattern (can be used multiple times)"
75744
+ },
75745
+ {
75746
+ flags: "--beta",
75747
+ description: "Show beta versions in selection prompt"
75748
+ },
75749
+ {
75750
+ flags: "--refresh",
75751
+ description: "Bypass release cache to fetch latest versions from GitHub"
75752
+ }
75753
+ ]
75754
+ };
75755
+ folderOptionsGroup = {
75756
+ title: "Folder Options",
75757
+ options: [
75758
+ {
75759
+ flags: "--docs-dir <name>",
75760
+ description: "Custom docs folder name to avoid conflicts with existing folders",
75761
+ defaultValue: "docs"
75762
+ },
75763
+ {
75764
+ flags: "--plans-dir <name>",
75765
+ description: "Custom plans folder name to avoid conflicts with existing folders",
75766
+ defaultValue: "plans"
74929
75767
  }
74930
75768
  ]
74931
75769
  };
@@ -74964,6 +75802,14 @@ var init_init_command_help = __esm(() => {
74964
75802
  {
74965
75803
  flags: "--sync",
74966
75804
  description: "Sync config files from upstream with interactive hunk-by-hunk merge"
75805
+ },
75806
+ {
75807
+ flags: "--archive <path>",
75808
+ description: "Use local archive file instead of downloading (zip/tar.gz)"
75809
+ },
75810
+ {
75811
+ flags: "--kit-path <path>",
75812
+ description: "Use local kit directory instead of downloading"
74967
75813
  }
74968
75814
  ]
74969
75815
  },
@@ -75056,432 +75902,359 @@ var init_init_command_help = __esm(() => {
75056
75902
  };
75057
75903
  });
75058
75904
 
75059
- // src/domains/help/commands/doctor-command-help.ts
75060
- var doctorCommandHelp;
75061
- var init_doctor_command_help = __esm(() => {
75062
- doctorCommandHelp = {
75063
- name: "doctor",
75064
- description: "Comprehensive health check for ClaudeKit",
75065
- usage: "ck doctor [options]",
75905
+ // src/domains/help/commands/migrate-command-help.ts
75906
+ var migrateCommandHelp;
75907
+ var init_migrate_command_help = __esm(() => {
75908
+ migrateCommandHelp = {
75909
+ name: "migrate",
75910
+ description: "Migrate Claude Code agents, commands, skills, config, rules, and hooks to other providers",
75911
+ usage: "ck migrate [options]",
75066
75912
  examples: [
75067
75913
  {
75068
- command: "ck doctor",
75069
- description: "Run full health check interactively"
75914
+ command: "ck migrate --agent codex --dry-run",
75915
+ description: "Preview the destination-aware migration plan before writing files"
75070
75916
  },
75071
75917
  {
75072
- command: "ck doctor --fix",
75073
- description: "Auto-fix all fixable issues"
75918
+ command: "ck migrate --agent codex -g",
75919
+ description: "Write to Codex global paths such as ~/.codex/ and ~/.agents/skills"
75074
75920
  },
75075
75921
  {
75076
- command: "ck doctor --check-only",
75077
- description: "CI mode: exit 1 on failures, no prompts"
75922
+ command: "CK_FORCE_ASCII=1 ck migrate --agent codex",
75923
+ description: "Force ASCII borders on legacy Windows terminals (cmd.exe, older PowerShell)"
75078
75924
  }
75079
75925
  ],
75080
75926
  optionGroups: [
75081
75927
  {
75082
- title: "Options",
75928
+ title: "Target Options",
75083
75929
  options: [
75084
75930
  {
75085
- flags: "--report",
75086
- description: "Generate shareable diagnostic report"
75087
- },
75088
- {
75089
- flags: "--fix",
75090
- description: "Auto-fix all fixable issues"
75091
- },
75092
- {
75093
- flags: "--check-only",
75094
- description: "CI mode: no prompts, exit 1 on failures"
75931
+ flags: "-a, --agent <provider>",
75932
+ description: "Target provider(s), can be specified multiple times"
75095
75933
  },
75096
75934
  {
75097
- flags: "--full",
75098
- description: "Include extended priority checks (slower but more thorough)"
75935
+ flags: "--all",
75936
+ description: "Migrate to all supported providers"
75099
75937
  },
75100
75938
  {
75101
- flags: "--json",
75102
- description: "Output JSON format"
75103
- }
75104
- ]
75105
- }
75106
- ]
75107
- };
75108
- });
75109
-
75110
- // src/domains/help/commands/uninstall-command-help.ts
75111
- var uninstallCommandHelp;
75112
- var init_uninstall_command_help = __esm(() => {
75113
- uninstallCommandHelp = {
75114
- name: "uninstall",
75115
- description: "Remove ClaudeKit installations (ownership-aware)",
75116
- usage: "ck uninstall [options]",
75117
- examples: [
75118
- {
75119
- command: "ck uninstall --local --yes",
75120
- description: "Remove local installation without confirmation"
75121
- },
75122
- {
75123
- command: "ck uninstall --dry-run",
75124
- description: "Preview what would be removed without deleting"
75125
- }
75126
- ],
75127
- optionGroups: [
75128
- {
75129
- title: "Scope Options",
75130
- options: [
75131
- {
75132
- flags: "-l, --local",
75133
- description: "Uninstall only local installation (current project)"
75939
+ flags: "-g, --global",
75940
+ description: "Install globally instead of the default project-level scope"
75134
75941
  },
75135
75942
  {
75136
- flags: "-g, --global",
75137
- description: "Uninstall only global installation (~/.claude/)"
75943
+ flags: "-y, --yes",
75944
+ description: "Skip confirmation prompts after the pre-flight summary"
75138
75945
  },
75139
75946
  {
75140
- flags: "-A, --all",
75141
- description: "Uninstall from both local and global locations"
75947
+ flags: "-f, --force",
75948
+ description: "Force reinstall deleted or edited managed items"
75142
75949
  },
75143
75950
  {
75144
- flags: "-k, --kit <type>",
75145
- description: "Uninstall specific kit only (engineer, marketing)"
75951
+ flags: "--dry-run",
75952
+ description: "Preview plan, destinations, and next steps without writing files"
75146
75953
  }
75147
75954
  ]
75148
75955
  },
75149
75956
  {
75150
- title: "Safety Options",
75957
+ title: "Content Selection",
75151
75958
  options: [
75152
75959
  {
75153
- flags: "--dry-run",
75154
- description: "Preview what would be removed without deleting"
75155
- },
75156
- {
75157
- flags: "--force-overwrite",
75158
- description: "Delete even user-modified files (requires confirmation)"
75960
+ flags: "--config",
75961
+ description: "Migrate CLAUDE.md config only"
75159
75962
  },
75160
75963
  {
75161
- flags: "-y, --yes",
75162
- description: "Skip confirmation prompt"
75163
- }
75164
- ]
75165
- }
75166
- ],
75167
- sections: [
75168
- {
75169
- title: "Ownership-Aware Uninstall",
75170
- content: "Uninstall preserves user customizations by default. Only CK-installed files that haven't been modified are removed. User-created files and modified files are preserved unless --force-overwrite is used."
75171
- }
75172
- ]
75173
- };
75174
- });
75175
-
75176
- // src/domains/help/commands/update-command-help.ts
75177
- var updateCommandHelp;
75178
- var init_update_command_help = __esm(() => {
75179
- updateCommandHelp = {
75180
- name: "update",
75181
- description: "Update ClaudeKit CLI tool only (not kit content)",
75182
- usage: "ck update [options]",
75183
- examples: [
75184
- {
75185
- command: "ck update --check",
75186
- description: "Check for CLI updates without installing"
75187
- },
75188
- {
75189
- command: "ck update --beta --yes",
75190
- description: "Update to latest beta version without confirmation"
75191
- }
75192
- ],
75193
- optionGroups: [
75194
- {
75195
- title: "Update Options",
75196
- options: [
75197
- {
75198
- flags: "-r, --release <version>",
75199
- description: "Update to a specific version"
75964
+ flags: "--rules",
75965
+ description: "Migrate .claude/rules only"
75200
75966
  },
75201
75967
  {
75202
- flags: "--check",
75203
- description: "Check for updates without installing"
75968
+ flags: "--hooks",
75969
+ description: "Migrate .claude/hooks only"
75204
75970
  },
75205
75971
  {
75206
- flags: "-y, --yes",
75207
- description: "Skip all confirmation prompts (CLI and kit content update)"
75972
+ flags: "--skip-config",
75973
+ description: "Skip config migration"
75208
75974
  },
75209
75975
  {
75210
- flags: "--beta",
75211
- description: "Update to the latest beta version"
75976
+ flags: "--skip-rules",
75977
+ description: "Skip rules migration"
75212
75978
  },
75213
75979
  {
75214
- flags: "--registry <url>",
75215
- description: "Custom npm registry URL"
75216
- }
75217
- ]
75218
- },
75219
- {
75220
- title: "Deprecated Options",
75221
- options: [
75222
- {
75223
- flags: "--kit <kit>",
75224
- description: "This option is no longer supported with 'ck update'",
75225
- deprecated: {
75226
- message: "Use 'ck init --kit <kit>' to update kit installations",
75227
- alternative: "ck init --kit <kit>"
75228
- }
75980
+ flags: "--skip-hooks",
75981
+ description: "Skip hooks migration"
75229
75982
  },
75230
75983
  {
75231
- flags: "-g, --global",
75232
- description: "This option is no longer supported with 'ck update'",
75233
- deprecated: {
75234
- message: "Use 'ck init --global' to update global kit",
75235
- alternative: "ck init --global"
75236
- }
75984
+ flags: "--source <path>",
75985
+ description: "Custom CLAUDE.md source path"
75237
75986
  }
75238
75987
  ]
75239
75988
  }
75240
- ],
75241
- sections: [
75242
- {
75243
- title: "Note",
75244
- content: "'ck update' updates the CLI tool only and defaults to the latest stable release. Use '--beta' to opt into prerelease CLI builds. To update kit content (skills, commands, rules), use 'ck init' for local or 'ck init -g' for global. Use --yes to skip all prompts (both CLI and kit content update) for non-interactive/CI usage."
75245
- }
75246
75989
  ]
75247
75990
  };
75248
75991
  });
75249
75992
 
75250
- // src/domains/help/commands/versions-command-help.ts
75251
- var versionsCommandHelp;
75252
- var init_versions_command_help = __esm(() => {
75253
- versionsCommandHelp = {
75254
- name: "versions",
75255
- description: "List available versions of ClaudeKit repositories",
75256
- usage: "ck versions [options]",
75993
+ // src/domains/help/commands/new-command-help.ts
75994
+ var newCommandHelp;
75995
+ var init_new_command_help = __esm(() => {
75996
+ init_common_options();
75997
+ newCommandHelp = {
75998
+ name: "new",
75999
+ description: "Bootstrap a new ClaudeKit project (with interactive version selection)",
76000
+ usage: "ck new [options]",
75257
76001
  examples: [
75258
76002
  {
75259
- command: "ck versions --kit engineer --limit 10",
75260
- description: "Show latest 10 versions of engineer kit"
76003
+ command: "ck new --kit engineer --dir ./my-project",
76004
+ description: "Create engineer kit project in specific directory"
75261
76005
  },
75262
76006
  {
75263
- command: "ck versions --all",
75264
- description: "Show all releases including prereleases"
76007
+ command: "ck new -y --use-git --release v2.1.0",
76008
+ description: "Non-interactive with git clone (no GitHub API needed)"
75265
76009
  }
75266
76010
  ],
75267
76011
  optionGroups: [
75268
76012
  {
75269
- title: "Filter Options",
76013
+ title: "Mode Options",
75270
76014
  options: [
75271
76015
  {
75272
- flags: "--kit <kit>",
75273
- description: "Filter by specific kit (engineer, marketing)"
76016
+ flags: "-y, --yes",
76017
+ description: "Non-interactive mode (skip all prompts)"
75274
76018
  },
75275
76019
  {
75276
- flags: "--limit <number>",
75277
- description: "Number of releases to show",
75278
- defaultValue: "30"
76020
+ flags: "--use-git",
76021
+ description: "Use git clone instead of GitHub API (uses SSH/HTTPS credentials)"
75279
76022
  },
75280
76023
  {
75281
- flags: "--all",
75282
- description: "Show all releases including prereleases"
76024
+ flags: "--archive <path>",
76025
+ description: "Use local archive file instead of downloading (zip/tar.gz)"
76026
+ },
76027
+ {
76028
+ flags: "--kit-path <path>",
76029
+ description: "Use local kit directory instead of downloading"
75283
76030
  }
75284
76031
  ]
75285
- }
75286
- ]
75287
- };
75288
- });
75289
-
75290
- // src/domains/help/commands/skills-command-help.ts
75291
- var skillsCommandHelp;
75292
- var init_skills_command_help = __esm(() => {
75293
- skillsCommandHelp = {
75294
- name: "skills",
75295
- description: "Install, uninstall, and manage ClaudeKit skills across coding agents",
75296
- usage: "ck skills [options]",
75297
- examples: [
75298
- {
75299
- command: "ck skills --name frontend-design --agent claude-code -g",
75300
- description: "Install skill to Claude Code globally"
75301
76032
  },
75302
76033
  {
75303
- command: "ck skills --list --installed",
75304
- description: "Show all installed skills with their locations"
75305
- }
75306
- ],
75307
- optionGroups: [
75308
- {
75309
- title: "Mode Options",
76034
+ title: "Project Options",
75310
76035
  options: [
75311
76036
  {
75312
- flags: "-l, --list",
75313
- description: "List available skills from ClaudeKit source"
76037
+ flags: "--dir <directory>",
76038
+ description: "Target directory for the new project",
76039
+ defaultValue: "."
75314
76040
  },
75315
76041
  {
75316
- flags: "--installed",
75317
- description: "When used with --list, show installed skills instead"
76042
+ flags: "--kit <kit>",
76043
+ description: "Kit to use (engineer, marketing)"
75318
76044
  },
75319
76045
  {
75320
- flags: "-u, --uninstall",
75321
- description: "Uninstall skill(s) from agent(s)"
76046
+ flags: "-r, --release <version>",
76047
+ description: "Skip version selection, use specific version (e.g., latest, v1.0.0)"
75322
76048
  },
75323
76049
  {
75324
- flags: "--sync",
75325
- description: "Sync registry with filesystem (clean orphaned entries)"
76050
+ flags: "--force",
76051
+ description: "Overwrite existing files without confirmation"
75326
76052
  }
75327
76053
  ]
75328
76054
  },
76055
+ filterOptionsGroup,
75329
76056
  {
75330
76057
  title: "Installation Options",
75331
76058
  options: [
75332
76059
  {
75333
- flags: "-n, --name <skill>",
75334
- description: "Skill name to install or uninstall"
76060
+ flags: "--opencode",
76061
+ description: "Install OpenCode CLI package (non-interactive mode)"
75335
76062
  },
75336
76063
  {
75337
- flags: "-a, --agent <agent>",
75338
- description: "Target agent(s) - can be specified multiple times. Valid: claude-code, cursor, codex, opencode, goose, gemini-cli, antigravity, github-copilot, amp, kilo, roo, windsurf, cline, openhands"
76064
+ flags: "--gemini",
76065
+ description: "Install Google Gemini CLI package (non-interactive mode)"
75339
76066
  },
75340
76067
  {
75341
- flags: "-g, --global",
75342
- description: "Install to user's home directory (available across projects)"
76068
+ flags: "--install-skills",
76069
+ description: "Install skills dependencies (non-interactive mode)"
75343
76070
  },
75344
76071
  {
75345
- flags: "--all",
75346
- description: "Install to all supported agents"
76072
+ flags: "--with-sudo",
76073
+ description: "Include system packages requiring sudo (Linux: ffmpeg, imagemagick)"
75347
76074
  },
75348
76075
  {
75349
- flags: "-y, --yes",
75350
- description: "Non-interactive mode (skip confirmations)"
75351
- }
75352
- ]
75353
- },
75354
- {
75355
- title: "Uninstall Options",
75356
- options: [
75357
- {
75358
- flags: "-f, --force",
75359
- description: "Force uninstall even if skill not in registry (requires --agent)"
76076
+ flags: "--prefix",
76077
+ description: "Add /ck: prefix to all slash commands"
75360
76078
  }
75361
76079
  ]
75362
- }
75363
- ],
75364
- sections: [
75365
- {
75366
- title: "Supported Agents",
75367
- content: ` claude-code Claude Code CLI
75368
- cursor Cursor IDE
75369
- codex Codex CLI
75370
- opencode OpenCode
75371
- goose Goose AI
75372
- gemini-cli Gemini CLI
75373
- antigravity Antigravity Agent
75374
- github-copilot GitHub Copilot
75375
- amp Amp
75376
- kilo Kilo Code
75377
- roo Roo Code
75378
- windsurf Windsurf IDE
75379
- cline Cline
75380
- openhands OpenHands`
75381
76080
  },
75382
- {
75383
- title: "Notes",
75384
- content: ` • Skills are installed from ~/.claude/skills (ClaudeKit Engineer source)
75385
- • OpenCode reuses Claude-compatible skill roots (.claude/skills, ~/.claude/skills), so installs may be a no-op
75386
- • Registry stored at ~/.claudekit/skill-registry.json
75387
- • Target paths vary by agent; some agents intentionally share a common skills directory`
75388
- }
76081
+ folderOptionsGroup
75389
76082
  ]
75390
76083
  };
75391
76084
  });
75392
76085
 
75393
- // src/domains/help/commands/config-command-help.ts
75394
- var configCommandHelp;
75395
- var init_config_command_help = __esm(() => {
75396
- configCommandHelp = {
75397
- name: "config",
75398
- description: "Manage ClaudeKit configuration and launch the config dashboard",
75399
- usage: "ck config [action] [key] [value] [options]",
76086
+ // src/domains/help/commands/plan-command-help.ts
76087
+ var planCommandHelp;
76088
+ var init_plan_command_help = __esm(() => {
76089
+ planCommandHelp = {
76090
+ name: "plan",
76091
+ description: "Plan management: parse, validate, status, kanban, create, check, uncheck, add-phase",
76092
+ usage: "ck plan [action] [target] [options]",
75400
76093
  examples: [
75401
76094
  {
75402
- command: "ck config",
75403
- description: "Launch the web dashboard (same as 'ck config ui')"
75404
- },
75405
- {
75406
- command: "ck config --host 0.0.0.0 --no-open",
75407
- description: "Expose the dashboard to your network intentionally"
76095
+ command: "ck plan status",
76096
+ description: "Show progress summary for all plans in the current project"
75408
76097
  },
75409
76098
  {
75410
- command: "ck config set defaults.kit engineer",
75411
- description: "Set a config value from the CLI"
76099
+ command: "ck plan create --title 'Auth feature' --phases setup,api,ui",
76100
+ description: "Scaffold a new plan directory with three phases"
75412
76101
  }
75413
76102
  ],
75414
76103
  optionGroups: [
75415
76104
  {
75416
- title: "Actions",
76105
+ title: "Output Options",
76106
+ options: [
76107
+ { flags: "--json", description: "Output in JSON format" },
76108
+ { flags: "--strict", description: "Strict validation mode (validate action)" }
76109
+ ]
76110
+ },
76111
+ {
76112
+ title: "Scope Options",
75417
76113
  options: [
75418
76114
  {
75419
- flags: "ui",
75420
- description: "Launch config dashboard (default action when omitted)"
75421
- },
75422
- {
75423
- flags: "get <key>",
75424
- description: "Read a config value"
75425
- },
76115
+ flags: "-g, --global",
76116
+ description: "Use global plans scope (~/.claude/plans or configured global root)"
76117
+ }
76118
+ ]
76119
+ }
76120
+ ],
76121
+ subcommands: [
76122
+ {
76123
+ name: "parse",
76124
+ description: "Parse a plan.md and output an ASCII table or JSON of all phases",
76125
+ usage: "ck plan parse [target] [--json]",
76126
+ examples: [],
76127
+ optionGroups: [
75426
76128
  {
75427
- flags: "set <key> <value>",
75428
- description: "Write a config value"
75429
- },
76129
+ title: "Output Options",
76130
+ options: [{ flags: "--json", description: "Output machine-readable JSON" }]
76131
+ }
76132
+ ]
76133
+ },
76134
+ {
76135
+ name: "validate",
76136
+ description: "Validate plan.md syntax and structure",
76137
+ usage: "ck plan validate [target] [--strict] [--json]",
76138
+ examples: [],
76139
+ optionGroups: [
75430
76140
  {
75431
- flags: "show",
75432
- description: "Print merged config"
76141
+ title: "Validation Options",
76142
+ options: [
76143
+ { flags: "--strict", description: "Fail on warnings in addition to errors" },
76144
+ { flags: "--json", description: "Output results as JSON" }
76145
+ ]
75433
76146
  }
75434
76147
  ]
75435
76148
  },
75436
76149
  {
75437
- title: "Scope Options",
75438
- options: [
76150
+ name: "status",
76151
+ description: "Show progress for plans in scope",
76152
+ usage: "ck plan status [--json] [-g]",
76153
+ examples: [],
76154
+ optionGroups: [
75439
76155
  {
75440
- flags: "-g, --global",
75441
- description: "Use global config (~/.claudekit/config.json)"
76156
+ title: "Output Options",
76157
+ options: [{ flags: "--json", description: "Output in JSON format" }]
75442
76158
  },
75443
76159
  {
75444
- flags: "-l, --local",
75445
- description: "Use local config (.claude/.ck.json)"
76160
+ title: "Scope Options",
76161
+ options: [{ flags: "-g, --global", description: "Show status for global plans scope" }]
75446
76162
  }
75447
76163
  ]
75448
76164
  },
75449
76165
  {
75450
- title: "Dashboard Options",
75451
- options: [
76166
+ name: "kanban",
76167
+ description: "Launch interactive Kanban dashboard in the browser",
76168
+ usage: "ck plan kanban [--port <port>] [--no-open] [--dev]",
76169
+ examples: [],
76170
+ optionGroups: [
75452
76171
  {
75453
- flags: "--port <port>",
75454
- description: "Port for dashboard server"
75455
- },
76172
+ title: "Dashboard Options",
76173
+ options: [
76174
+ { flags: "--port <port>", description: "Port to serve the Kanban dashboard on" },
76175
+ { flags: "--no-open", description: "Do not auto-open the browser" },
76176
+ { flags: "--dev", description: "Start dashboard in development mode" }
76177
+ ]
76178
+ }
76179
+ ]
76180
+ },
76181
+ {
76182
+ name: "create",
76183
+ description: "Scaffold a new plan directory with phase files",
76184
+ usage: "ck plan create [--title <title>] [--phases <phases>] [options]",
76185
+ examples: [],
76186
+ optionGroups: [
75456
76187
  {
75457
- flags: "--host <host>",
75458
- description: "Bind dashboard host (default: 127.0.0.1)"
76188
+ title: "Create Options",
76189
+ options: [
76190
+ { flags: "--title <title>", description: "Plan title" },
76191
+ {
76192
+ flags: "--phases <phases>",
76193
+ description: "Comma-separated list of phase names"
76194
+ },
76195
+ { flags: "--dir <dir>", description: "Plan output directory" },
76196
+ {
76197
+ flags: "--priority <priority>",
76198
+ description: "Priority level: P1, P2, or P3"
76199
+ },
76200
+ { flags: "--issue <issue>", description: "GitHub issue number to link" },
76201
+ {
76202
+ flags: "--source <source>",
76203
+ description: "Creation source: skill | cli | dashboard"
76204
+ },
76205
+ {
76206
+ flags: "--session-id <id>",
76207
+ description: "Claude session ID for tracking"
76208
+ }
76209
+ ]
75459
76210
  },
75460
76211
  {
75461
- flags: "--no-open",
75462
- description: "Do not auto-open browser when launching dashboard"
75463
- },
76212
+ title: "Scope Options",
76213
+ options: [{ flags: "-g, --global", description: "Create plan in global plans scope" }]
76214
+ }
76215
+ ]
76216
+ },
76217
+ {
76218
+ name: "check",
76219
+ description: "Mark a phase as completed (or in-progress with --start)",
76220
+ usage: "ck plan check <id> [--start]",
76221
+ examples: [],
76222
+ optionGroups: [
75464
76223
  {
75465
- flags: "--dev",
75466
- description: "Run dashboard in development mode with HMR"
76224
+ title: "Check Options",
76225
+ options: [
76226
+ {
76227
+ flags: "--start",
76228
+ description: "Mark phase as in-progress instead of completed"
76229
+ }
76230
+ ]
75467
76231
  }
75468
76232
  ]
75469
76233
  },
75470
76234
  {
75471
- title: "Output Options",
75472
- options: [
76235
+ name: "uncheck",
76236
+ description: "Reset a phase back to pending status",
76237
+ usage: "ck plan uncheck <id>",
76238
+ examples: [],
76239
+ optionGroups: []
76240
+ },
76241
+ {
76242
+ name: "add-phase",
76243
+ description: "Append a new phase to an existing plan",
76244
+ usage: "ck plan add-phase [target] [--after <id>]",
76245
+ examples: [],
76246
+ optionGroups: [
75473
76247
  {
75474
- flags: "--json",
75475
- description: "Output machine-readable JSON for CLI actions"
76248
+ title: "Phase Options",
76249
+ options: [
76250
+ {
76251
+ flags: "--after <after>",
76252
+ description: "Insert the new phase after this phase ID"
76253
+ }
76254
+ ]
75476
76255
  }
75477
76256
  ]
75478
76257
  }
75479
- ],
75480
- sections: [
75481
- {
75482
- title: "Notes",
75483
- content: "Run 'ck config --help' to see both CLI actions and dashboard flags. Running bare 'ck config' opens the dashboard directly. Use '--host' to expose the dashboard intentionally beyond localhost."
75484
- }
75485
76258
  ]
75486
76259
  };
75487
76260
  });
@@ -75541,6 +76314,10 @@ var init_projects_command_help = __esm(() => {
75541
76314
  flags: "--alias <alias>",
75542
76315
  description: "Custom alias for project (add)"
75543
76316
  },
76317
+ {
76318
+ flags: "--pinned",
76319
+ description: "Pin this project (add)"
76320
+ },
75544
76321
  {
75545
76322
  flags: "--tags <tags>",
75546
76323
  description: "Comma-separated tags (add)"
@@ -75551,6 +76328,31 @@ var init_projects_command_help = __esm(() => {
75551
76328
  }
75552
76329
  ]
75553
76330
  }
76331
+ ],
76332
+ subcommands: [
76333
+ {
76334
+ name: "list",
76335
+ description: "List projects in registry",
76336
+ usage: "ck projects list [--json] [--pinned]",
76337
+ examples: [],
76338
+ optionGroups: [],
76339
+ aliases: ["ls"]
76340
+ },
76341
+ {
76342
+ name: "add",
76343
+ description: "Add project path to registry",
76344
+ usage: "ck projects add <path> [--alias <alias>] [--pinned] [--tags <tags>]",
76345
+ examples: [],
76346
+ optionGroups: []
76347
+ },
76348
+ {
76349
+ name: "remove",
76350
+ description: "Remove project by alias or ID",
76351
+ usage: "ck projects remove [alias] [--id <id>]",
76352
+ examples: [],
76353
+ optionGroups: [],
76354
+ aliases: ["rm"]
76355
+ }
75554
76356
  ]
75555
76357
  };
75556
76358
  });
@@ -75599,21 +76401,21 @@ var init_setup_command_help = __esm(() => {
75599
76401
  };
75600
76402
  });
75601
76403
 
75602
- // src/domains/help/commands/agents-command-help.ts
75603
- var agentsCommandHelp;
75604
- var init_agents_command_help = __esm(() => {
75605
- agentsCommandHelp = {
75606
- name: "agents",
75607
- description: "Install, uninstall, and manage Claude Code agents across providers",
75608
- usage: "ck agents [options]",
76404
+ // src/domains/help/commands/skills-command-help.ts
76405
+ var skillsCommandHelp;
76406
+ var init_skills_command_help = __esm(() => {
76407
+ skillsCommandHelp = {
76408
+ name: "skills",
76409
+ description: "Install, uninstall, and manage ClaudeKit skills across coding agents",
76410
+ usage: "ck skills [options]",
75609
76411
  examples: [
75610
76412
  {
75611
- command: "ck agents --name maintainer --agent codex",
75612
- description: "Install one agent to Codex"
76413
+ command: "ck skills --name frontend-design --agent claude-code -g",
76414
+ description: "Install skill to Claude Code globally"
75613
76415
  },
75614
76416
  {
75615
- command: "ck agents --list --installed",
75616
- description: "Show installed agents and locations"
76417
+ command: "ck skills --list --installed",
76418
+ description: "Show all installed skills with their locations"
75617
76419
  }
75618
76420
  ],
75619
76421
  optionGroups: [
@@ -75622,15 +76424,15 @@ var init_agents_command_help = __esm(() => {
75622
76424
  options: [
75623
76425
  {
75624
76426
  flags: "-l, --list",
75625
- description: "List available agents from source"
76427
+ description: "List available skills from ClaudeKit source"
75626
76428
  },
75627
76429
  {
75628
76430
  flags: "--installed",
75629
- description: "When used with --list, show installed agents instead"
76431
+ description: "When used with --list, show installed skills instead"
75630
76432
  },
75631
76433
  {
75632
76434
  flags: "-u, --uninstall",
75633
- description: "Uninstall agent(s) from providers"
76435
+ description: "Uninstall skill(s) from agent(s)"
75634
76436
  },
75635
76437
  {
75636
76438
  flags: "--sync",
@@ -75642,101 +76444,53 @@ var init_agents_command_help = __esm(() => {
75642
76444
  title: "Installation Options",
75643
76445
  options: [
75644
76446
  {
75645
- flags: "-n, --name <agent>",
75646
- description: "Agent name to install or uninstall"
76447
+ flags: "-n, --name <skill>",
76448
+ description: "Skill name to install or uninstall"
75647
76449
  },
75648
76450
  {
75649
- flags: "-a, --agent <provider>",
75650
- description: "Target provider(s), can be specified multiple times"
76451
+ flags: "-a, --agent <agent>",
76452
+ description: "Target agent(s) - can be specified multiple times. Valid: claude-code, cursor, codex, opencode, goose, gemini-cli, antigravity, github-copilot, amp, kilo, roo, windsurf, cline, openhands"
75651
76453
  },
75652
76454
  {
75653
76455
  flags: "-g, --global",
75654
- description: "Install globally instead of project-level"
76456
+ description: "Install to user's home directory (available across projects)"
75655
76457
  },
75656
76458
  {
75657
76459
  flags: "--all",
75658
- description: "Install to all supported providers"
76460
+ description: "Install to all supported agents"
75659
76461
  },
75660
76462
  {
75661
76463
  flags: "-y, --yes",
75662
- description: "Skip confirmation prompts"
75663
- }
75664
- ]
75665
- },
75666
- {
75667
- title: "Uninstall Options",
75668
- options: [
75669
- {
75670
- flags: "--force",
75671
- description: "Force uninstall even if not tracked in registry"
76464
+ description: "Non-interactive mode (skip confirmations)"
75672
76465
  }
75673
76466
  ]
75674
- }
75675
- ]
75676
- };
75677
- });
75678
-
75679
- // src/domains/help/commands/commands-command-help.ts
75680
- var commandsCommandHelp;
75681
- var init_commands_command_help = __esm(() => {
75682
- commandsCommandHelp = {
75683
- name: "commands",
75684
- description: "Install, uninstall, and manage Claude commands across providers",
75685
- usage: "ck commands [options]",
75686
- examples: [
75687
- {
75688
- command: "ck commands --name plan --agent codex",
75689
- description: "Install one slash command to Codex"
75690
76467
  },
75691
76468
  {
75692
- command: "ck commands --list",
75693
- description: "List available commands from source"
75694
- }
75695
- ],
75696
- optionGroups: [
75697
- {
75698
- title: "Mode Options",
76469
+ title: "Catalog Options",
75699
76470
  options: [
75700
76471
  {
75701
- flags: "-l, --list",
75702
- description: "List available commands from source"
75703
- },
75704
- {
75705
- flags: "--installed",
75706
- description: "When used with --list, show installed commands instead"
75707
- },
75708
- {
75709
- flags: "-u, --uninstall",
75710
- description: "Uninstall command(s) from providers"
76472
+ flags: "--catalog",
76473
+ description: "Show skill catalog stats and metadata"
75711
76474
  },
75712
76475
  {
75713
- flags: "--sync",
75714
- description: "Sync registry with filesystem (clean orphaned entries)"
75715
- }
75716
- ]
75717
- },
75718
- {
75719
- title: "Installation Options",
75720
- options: [
75721
- {
75722
- flags: "-n, --name <command>",
75723
- description: "Command name to install or uninstall"
76476
+ flags: "--regenerate",
76477
+ description: "Force regenerate catalog (use with --catalog)"
75724
76478
  },
75725
76479
  {
75726
- flags: "-a, --agent <provider>",
75727
- description: "Target provider(s), can be specified multiple times"
76480
+ flags: "--search <query>",
76481
+ description: "BM25 full-text search over skill catalog"
75728
76482
  },
75729
76483
  {
75730
- flags: "-g, --global",
75731
- description: "Install globally instead of project-level"
76484
+ flags: "--json",
76485
+ description: "Output search results as JSON (use with --search)"
75732
76486
  },
75733
76487
  {
75734
- flags: "--all",
75735
- description: "Install to all supported providers"
76488
+ flags: "--limit <n>",
76489
+ description: "Max search results, default 10 (use with --search)"
75736
76490
  },
75737
76491
  {
75738
- flags: "-y, --yes",
75739
- description: "Skip confirmation prompts"
76492
+ flags: "--validate",
76493
+ description: "Validate SKILL.md frontmatter fields"
75740
76494
  }
75741
76495
  ]
75742
76496
  },
@@ -75744,190 +76498,222 @@ var init_commands_command_help = __esm(() => {
75744
76498
  title: "Uninstall Options",
75745
76499
  options: [
75746
76500
  {
75747
- flags: "--force",
75748
- description: "Force uninstall even if not tracked in registry"
76501
+ flags: "-f, --force",
76502
+ description: "Force uninstall even if skill not in registry (requires --agent)"
75749
76503
  }
75750
76504
  ]
75751
76505
  }
76506
+ ],
76507
+ sections: [
76508
+ {
76509
+ title: "Supported Agents",
76510
+ content: ` claude-code Claude Code CLI
76511
+ cursor Cursor IDE
76512
+ codex Codex CLI
76513
+ opencode OpenCode
76514
+ goose Goose AI
76515
+ gemini-cli Gemini CLI
76516
+ antigravity Antigravity Agent
76517
+ github-copilot GitHub Copilot
76518
+ amp Amp
76519
+ kilo Kilo Code
76520
+ roo Roo Code
76521
+ windsurf Windsurf IDE
76522
+ cline Cline
76523
+ openhands OpenHands`
76524
+ },
76525
+ {
76526
+ title: "Notes",
76527
+ content: ` • Skills are installed from ~/.claude/skills (ClaudeKit Engineer source)
76528
+ • OpenCode reuses Claude-compatible skill roots (.claude/skills, ~/.claude/skills), so installs may be a no-op
76529
+ • Registry stored at ~/.claudekit/skill-registry.json
76530
+ • Target paths vary by agent; some agents intentionally share a common skills directory`
76531
+ }
75752
76532
  ]
75753
76533
  };
75754
76534
  });
75755
76535
 
75756
- // src/domains/help/commands/content-command-help.ts
75757
- var contentCommandHelp;
75758
- var init_content_command_help = __esm(() => {
75759
- contentCommandHelp = {
75760
- name: "content",
75761
- description: "Multi-channel content automation engine",
75762
- usage: "ck content [action] [id] [options]",
76536
+ // src/domains/help/commands/uninstall-command-help.ts
76537
+ var uninstallCommandHelp;
76538
+ var init_uninstall_command_help = __esm(() => {
76539
+ uninstallCommandHelp = {
76540
+ name: "uninstall",
76541
+ description: "Remove ClaudeKit installations (ownership-aware)",
76542
+ usage: "ck uninstall [options]",
75763
76543
  examples: [
75764
76544
  {
75765
- command: "ck content start",
75766
- description: "Start the content daemon (default action)"
75767
- },
75768
- {
75769
- command: "ck content setup",
75770
- description: "Interactive configuration wizard"
76545
+ command: "ck uninstall --local --yes",
76546
+ description: "Remove local installation without confirmation"
75771
76547
  },
75772
76548
  {
75773
- command: "ck content queue",
75774
- description: "List pending content items for review"
76549
+ command: "ck uninstall --dry-run",
76550
+ description: "Preview what would be removed without deleting"
75775
76551
  }
75776
76552
  ],
75777
76553
  optionGroups: [
75778
76554
  {
75779
- title: "Actions",
76555
+ title: "Scope Options",
75780
76556
  options: [
75781
76557
  {
75782
- flags: "start",
75783
- description: "Start the content daemon (default when no action specified)"
75784
- },
75785
- {
75786
- flags: "stop",
75787
- description: "Stop the running content daemon"
75788
- },
75789
- {
75790
- flags: "status",
75791
- description: "Show daemon status and recent activity"
75792
- },
75793
- {
75794
- flags: "logs",
75795
- description: "View content daemon logs"
75796
- },
75797
- {
75798
- flags: "setup",
75799
- description: "Interactive configuration wizard"
76558
+ flags: "-l, --local",
76559
+ description: "Uninstall only local installation (current project)"
75800
76560
  },
75801
76561
  {
75802
- flags: "queue",
75803
- description: "List pending content items"
76562
+ flags: "-g, --global",
76563
+ description: "Uninstall only global installation (~/.claude/)"
75804
76564
  },
75805
76565
  {
75806
- flags: "approve <id>",
75807
- description: "Approve a content item for publishing"
76566
+ flags: "-A, --all",
76567
+ description: "Uninstall from both local and global locations"
75808
76568
  },
75809
76569
  {
75810
- flags: "reject <id>",
75811
- description: "Reject a content item"
76570
+ flags: "-k, --kit <type>",
76571
+ description: "Uninstall specific kit only (engineer, marketing)"
75812
76572
  }
75813
76573
  ]
75814
76574
  },
75815
76575
  {
75816
- title: "Options",
76576
+ title: "Safety Options",
75817
76577
  options: [
75818
76578
  {
75819
76579
  flags: "--dry-run",
75820
- description: "Generate content without publishing"
75821
- },
75822
- {
75823
- flags: "--verbose",
75824
- description: "Enable verbose logging"
75825
- },
75826
- {
75827
- flags: "--force",
75828
- description: "Kill existing process and start fresh"
76580
+ description: "Preview what would be removed without deleting"
75829
76581
  },
75830
76582
  {
75831
- flags: "--tail",
75832
- description: "Follow log output in real-time (for logs action)"
76583
+ flags: "--force-overwrite",
76584
+ description: "Delete even user-modified files (requires confirmation)"
75833
76585
  },
75834
76586
  {
75835
- flags: "--reason <reason>",
75836
- description: "Rejection reason (for reject action)"
76587
+ flags: "-y, --yes",
76588
+ description: "Skip confirmation prompt"
75837
76589
  }
75838
76590
  ]
75839
76591
  }
75840
76592
  ],
75841
76593
  sections: [
75842
76594
  {
75843
- title: "Notes",
75844
- content: "Requires content config in .ck.json. Run 'ck content setup' for guided configuration. Review mode can be 'auto' or 'manual' (default: manual)."
76595
+ title: "Ownership-Aware Uninstall",
76596
+ content: "Uninstall preserves user customizations by default. Only CK-installed files that haven't been modified are removed. User-created files and modified files are preserved unless --force-overwrite is used."
75845
76597
  }
75846
76598
  ]
75847
76599
  };
75848
76600
  });
75849
76601
 
75850
- // src/domains/help/commands/migrate-command-help.ts
75851
- var migrateCommandHelp;
75852
- var init_migrate_command_help = __esm(() => {
75853
- migrateCommandHelp = {
75854
- name: "migrate",
75855
- description: "Migrate Claude Code agents, commands, skills, config, rules, and hooks to other providers",
75856
- usage: "ck migrate [options]",
76602
+ // src/domains/help/commands/update-command-help.ts
76603
+ var updateCommandHelp;
76604
+ var init_update_command_help = __esm(() => {
76605
+ updateCommandHelp = {
76606
+ name: "update",
76607
+ description: "Update ClaudeKit CLI tool only (not kit content)",
76608
+ usage: "ck update [options]",
75857
76609
  examples: [
75858
76610
  {
75859
- command: "ck migrate --agent codex --dry-run",
75860
- description: "Preview the destination-aware migration plan before writing files"
75861
- },
75862
- {
75863
- command: "ck migrate --agent codex -g",
75864
- description: "Write to Codex global paths such as ~/.codex/ and ~/.agents/skills"
76611
+ command: "ck update --check",
76612
+ description: "Check for CLI updates without installing"
75865
76613
  },
75866
76614
  {
75867
- command: "CK_FORCE_ASCII=1 ck migrate --agent codex",
75868
- description: "Force ASCII borders on legacy Windows terminals (cmd.exe, older PowerShell)"
76615
+ command: "ck update --dev --yes",
76616
+ description: "Update to latest dev version without confirmation"
75869
76617
  }
75870
76618
  ],
75871
76619
  optionGroups: [
75872
76620
  {
75873
- title: "Target Options",
76621
+ title: "Update Options",
75874
76622
  options: [
75875
76623
  {
75876
- flags: "-a, --agent <provider>",
75877
- description: "Target provider(s), can be specified multiple times"
75878
- },
75879
- {
75880
- flags: "--all",
75881
- description: "Migrate to all supported providers"
76624
+ flags: "-r, --release <version>",
76625
+ description: "Update to a specific version"
75882
76626
  },
75883
76627
  {
75884
- flags: "-g, --global",
75885
- description: "Install globally instead of the default project-level scope"
76628
+ flags: "--check",
76629
+ description: "Check for updates without installing"
75886
76630
  },
75887
76631
  {
75888
76632
  flags: "-y, --yes",
75889
- description: "Skip confirmation prompts after the pre-flight summary"
76633
+ description: "Skip all confirmation prompts (CLI and kit content update)"
75890
76634
  },
75891
76635
  {
75892
- flags: "-f, --force",
75893
- description: "Force reinstall deleted or edited managed items"
76636
+ flags: "-d, --dev",
76637
+ description: "Update to the latest dev version"
75894
76638
  },
75895
76639
  {
75896
- flags: "--dry-run",
75897
- description: "Preview plan, destinations, and next steps without writing files"
76640
+ flags: "--registry <url>",
76641
+ description: "Custom npm registry URL"
75898
76642
  }
75899
76643
  ]
75900
76644
  },
75901
76645
  {
75902
- title: "Content Selection",
76646
+ title: "Deprecated Options",
75903
76647
  options: [
75904
76648
  {
75905
- flags: "--config",
75906
- description: "Migrate CLAUDE.md config only"
75907
- },
75908
- {
75909
- flags: "--rules",
75910
- description: "Migrate .claude/rules only"
76649
+ flags: "--beta",
76650
+ description: "(deprecated) Alias for --dev; use -d, --dev instead",
76651
+ deprecated: {
76652
+ message: "Use '-d, --dev' to update to the latest dev version",
76653
+ alternative: "-d, --dev"
76654
+ }
75911
76655
  },
75912
76656
  {
75913
- flags: "--hooks",
75914
- description: "Migrate .claude/hooks only"
76657
+ flags: "--kit <kit>",
76658
+ description: "This option is no longer supported with 'ck update'",
76659
+ deprecated: {
76660
+ message: "Use 'ck init --kit <kit>' to update kit installations",
76661
+ alternative: "ck init --kit <kit>"
76662
+ }
75915
76663
  },
75916
76664
  {
75917
- flags: "--skip-config",
75918
- description: "Skip config migration"
75919
- },
76665
+ flags: "-g, --global",
76666
+ description: "This option is no longer supported with 'ck update'",
76667
+ deprecated: {
76668
+ message: "Use 'ck init --global' to update global kit",
76669
+ alternative: "ck init --global"
76670
+ }
76671
+ }
76672
+ ]
76673
+ }
76674
+ ],
76675
+ sections: [
76676
+ {
76677
+ title: "Note",
76678
+ content: "'ck update' updates the CLI tool only and defaults to the latest stable release. Use '--beta' to opt into prerelease CLI builds. To update kit content (skills, commands, rules), use 'ck init' for local or 'ck init -g' for global. Use --yes to skip all prompts (both CLI and kit content update) for non-interactive/CI usage."
76679
+ }
76680
+ ]
76681
+ };
76682
+ });
76683
+
76684
+ // src/domains/help/commands/versions-command-help.ts
76685
+ var versionsCommandHelp;
76686
+ var init_versions_command_help = __esm(() => {
76687
+ versionsCommandHelp = {
76688
+ name: "versions",
76689
+ description: "List available versions of ClaudeKit repositories",
76690
+ usage: "ck versions [options]",
76691
+ examples: [
76692
+ {
76693
+ command: "ck versions --kit engineer --limit 10",
76694
+ description: "Show latest 10 versions of engineer kit"
76695
+ },
76696
+ {
76697
+ command: "ck versions --all",
76698
+ description: "Show all releases including prereleases"
76699
+ }
76700
+ ],
76701
+ optionGroups: [
76702
+ {
76703
+ title: "Filter Options",
76704
+ options: [
75920
76705
  {
75921
- flags: "--skip-rules",
75922
- description: "Skip rules migration"
76706
+ flags: "--kit <kit>",
76707
+ description: "Filter by specific kit (engineer, marketing)"
75923
76708
  },
75924
76709
  {
75925
- flags: "--skip-hooks",
75926
- description: "Skip hooks migration"
76710
+ flags: "--limit <number>",
76711
+ description: "Number of releases to show",
76712
+ defaultValue: "30"
75927
76713
  },
75928
76714
  {
75929
- flags: "--source <path>",
75930
- description: "Custom CLAUDE.md source path"
76715
+ flags: "--all",
76716
+ description: "Show all releases including prereleases"
75931
76717
  }
75932
76718
  ]
75933
76719
  }
@@ -75968,6 +76754,10 @@ var init_watch_command_help = __esm(() => {
75968
76754
  {
75969
76755
  flags: "--force",
75970
76756
  description: "Kill existing watch process and start fresh"
76757
+ },
76758
+ {
76759
+ flags: "--verbose",
76760
+ description: "Enable verbose logging"
75971
76761
  }
75972
76762
  ]
75973
76763
  }
@@ -75977,22 +76767,24 @@ var init_watch_command_help = __esm(() => {
75977
76767
 
75978
76768
  // src/domains/help/commands/index.ts
75979
76769
  var init_commands2 = __esm(() => {
75980
- init_new_command_help();
75981
- init_backups_command_help();
76770
+ init_agents_command_help();
76771
+ init_api_command_help();
75982
76772
  init_app_command_help();
75983
- init_init_command_help();
76773
+ init_backups_command_help();
76774
+ init_commands_command_help();
76775
+ init_config_command_help();
76776
+ init_content_command_help();
75984
76777
  init_doctor_command_help();
76778
+ init_init_command_help();
76779
+ init_migrate_command_help();
76780
+ init_new_command_help();
76781
+ init_plan_command_help();
76782
+ init_projects_command_help();
76783
+ init_setup_command_help();
76784
+ init_skills_command_help();
75985
76785
  init_uninstall_command_help();
75986
76786
  init_update_command_help();
75987
76787
  init_versions_command_help();
75988
- init_skills_command_help();
75989
- init_config_command_help();
75990
- init_projects_command_help();
75991
- init_setup_command_help();
75992
- init_agents_command_help();
75993
- init_commands_command_help();
75994
- init_content_command_help();
75995
- init_migrate_command_help();
75996
76788
  init_watch_command_help();
75997
76789
  init_common_options();
75998
76790
  });
@@ -76006,22 +76798,24 @@ var init_help_commands = __esm(() => {
76006
76798
  init_commands2();
76007
76799
  init_commands2();
76008
76800
  HELP_REGISTRY = {
76009
- new: newCommandHelp,
76801
+ agents: agentsCommandHelp,
76802
+ api: apiCommandHelp,
76010
76803
  app: appCommandHelp,
76011
76804
  backups: backupsCommandHelp,
76012
- init: initCommandHelp,
76805
+ commands: commandsCommandHelp,
76013
76806
  config: configCommandHelp,
76014
76807
  content: contentCommandHelp,
76808
+ doctor: doctorCommandHelp,
76809
+ init: initCommandHelp,
76810
+ migrate: migrateCommandHelp,
76811
+ new: newCommandHelp,
76812
+ plan: planCommandHelp,
76015
76813
  projects: projectsCommandHelp,
76016
76814
  setup: setupCommandHelp,
76815
+ skills: skillsCommandHelp,
76816
+ uninstall: uninstallCommandHelp,
76017
76817
  update: updateCommandHelp,
76018
76818
  versions: versionsCommandHelp,
76019
- doctor: doctorCommandHelp,
76020
- uninstall: uninstallCommandHelp,
76021
- skills: skillsCommandHelp,
76022
- agents: agentsCommandHelp,
76023
- commands: commandsCommandHelp,
76024
- migrate: migrateCommandHelp,
76025
76819
  watch: watchCommandHelp
76026
76820
  };
76027
76821
  });
@@ -76219,10 +77013,23 @@ function renderCommandHeader(help, theme) {
76219
77013
  }
76220
77014
  return parts.join(" ");
76221
77015
  }
76222
- function renderUsage(help, theme) {
77016
+ function renderUsage(help, theme, _parentName) {
76223
77017
  return [theme.heading("Usage:"), ` ${theme.example(help.usage)}`, ""].join(`
76224
77018
  `);
76225
77019
  }
77020
+ function renderSubcommandList(subcommands, theme) {
77021
+ if (subcommands.length === 0)
77022
+ return "";
77023
+ const maxNameWidth = Math.max(...subcommands.map((s) => s.name.length));
77024
+ const lines = [theme.heading("Subcommands:")];
77025
+ for (const sub of subcommands) {
77026
+ const namePart = ` ${padEnd(theme.command(sub.name), maxNameWidth + 4)}`;
77027
+ lines.push(`${namePart}${theme.description(sub.description)}`);
77028
+ }
77029
+ lines.push("");
77030
+ return lines.join(`
77031
+ `);
77032
+ }
76226
77033
  function renderExamples(help, options2) {
76227
77034
  if (!options2.showExamples || help.examples.length === 0)
76228
77035
  return "";
@@ -76297,13 +77104,15 @@ function renderDeprecationWarning(help, theme) {
76297
77104
  function renderHelp(help, context = { globalHelp: false, options: DEFAULT_HELP_OPTIONS }) {
76298
77105
  const options2 = { ...DEFAULT_HELP_OPTIONS, ...context.options };
76299
77106
  const theme = options2.theme;
77107
+ const { parentName } = context;
76300
77108
  const sections = [
76301
77109
  renderBanner(options2),
76302
77110
  renderDeprecationWarning(help, theme),
76303
77111
  renderCommandHeader(help, theme),
76304
77112
  "",
76305
- renderUsage(help, theme),
77113
+ renderUsage(help, theme, parentName),
76306
77114
  renderExamples(help, options2),
77115
+ help.subcommands?.length ? renderSubcommandList(help.subcommands, theme) : "",
76307
77116
  renderOptionGroups(help, theme),
76308
77117
  renderSections(help, theme)
76309
77118
  ];
@@ -76368,7 +77177,8 @@ var init_help_renderer = __esm(() => {
76368
77177
  var exports_help_interceptor = {};
76369
77178
  __export(exports_help_interceptor, {
76370
77179
  isHelpRequested: () => isHelpRequested,
76371
- handleHelp: () => handleHelp
77180
+ handleHelp: () => handleHelp,
77181
+ getCommandChainFromArgv: () => getCommandChainFromArgv
76372
77182
  });
76373
77183
  function getHelpOptions() {
76374
77184
  const isTTY2 = process.stdout.isTTY ?? false;
@@ -76384,30 +77194,45 @@ function getHelpOptions() {
76384
77194
  noColor
76385
77195
  };
76386
77196
  }
76387
- function getCommandFromArgv() {
77197
+ function getCommandChainFromArgv() {
76388
77198
  const argv = process.argv.slice(2);
76389
- for (const arg of argv) {
76390
- if (arg.startsWith("-")) {
76391
- continue;
76392
- }
76393
- if (hasCommand(arg)) {
76394
- return arg;
76395
- }
76396
- return null;
77199
+ const tokens = argv.filter((arg) => !arg.startsWith("-"));
77200
+ const [first, second] = tokens;
77201
+ if (!first || !hasCommand(first)) {
77202
+ return [];
76397
77203
  }
76398
- return null;
77204
+ const chain = [first];
77205
+ if (second) {
77206
+ chain.push(second);
77207
+ }
77208
+ return chain;
76399
77209
  }
76400
77210
  async function handleHelp(_args) {
76401
77211
  try {
76402
77212
  const options2 = getHelpOptions();
76403
- const command = getCommandFromArgv();
77213
+ const chain = getCommandChainFromArgv();
76404
77214
  let output3;
76405
- if (command === null) {
77215
+ if (chain.length === 0) {
76406
77216
  output3 = renderGlobalHelp(HELP_REGISTRY, options2);
76407
77217
  } else {
76408
- const help = HELP_REGISTRY[command];
76409
- output3 = renderHelp(help, {
76410
- command,
77218
+ const [parentCmd, subCmd] = chain;
77219
+ const parentHelp = HELP_REGISTRY[parentCmd];
77220
+ if (subCmd && parentHelp.subcommands) {
77221
+ const subHelp = parentHelp.subcommands.find((s) => s.name === subCmd);
77222
+ if (subHelp) {
77223
+ output3 = renderHelp(subHelp, {
77224
+ command: subCmd,
77225
+ globalHelp: false,
77226
+ options: options2,
77227
+ parentName: parentCmd
77228
+ });
77229
+ await displayHelp(output3, options2);
77230
+ process.exitCode = 0;
77231
+ return;
77232
+ }
77233
+ }
77234
+ output3 = renderHelp(parentHelp, {
77235
+ command: parentCmd,
76411
77236
  globalHelp: false,
76412
77237
  options: options2
76413
77238
  });
@@ -79262,6 +80087,20 @@ import { join as join66 } from "node:path";
79262
80087
  function escapeRegExp2(value) {
79263
80088
  return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
79264
80089
  }
80090
+ var MAC_BUNDLE_VERSION_PATTERN = /<key>\s*CFBundleShortVersionString\s*<\/key>\s*<string>([^<]+)<\/string>/;
80091
+ async function readInstalledDesktopArtifactVersion(binaryPath, options2 = {}) {
80092
+ const platform7 = options2.platform || process.platform;
80093
+ if (platform7 !== "darwin") {
80094
+ return null;
80095
+ }
80096
+ const readFileFn = options2.readFileFn || readFile37;
80097
+ try {
80098
+ const infoPlist = await readFileFn(join66(binaryPath, "Contents", "Info.plist"), "utf8");
80099
+ return infoPlist.match(MAC_BUNDLE_VERSION_PATTERN)?.[1] ?? null;
80100
+ } catch {
80101
+ return null;
80102
+ }
80103
+ }
79265
80104
  async function validateInstalledDesktopArtifact(binaryPath, metadata, options2 = {}) {
79266
80105
  const platform7 = options2.platform || process.platform;
79267
80106
  const readFileFn = options2.readFileFn || readFile37;
@@ -79272,9 +80111,15 @@ async function validateInstalledDesktopArtifact(binaryPath, metadata, options2 =
79272
80111
  return fileStat.isFile() && fileStat.size === metadata.assetSize;
79273
80112
  }
79274
80113
  if (platform7 === "darwin") {
79275
- const infoPlist = await readFileFn(join66(binaryPath, "Contents", "Info.plist"), "utf8");
79276
- const versionPattern = new RegExp(`<key>\\s*CFBundleShortVersionString\\s*</key>\\s*<string>${escapeRegExp2(metadata.version)}</string>`);
79277
- return versionPattern.test(infoPlist);
80114
+ const installedVersion = await readInstalledDesktopArtifactVersion(binaryPath, {
80115
+ platform: platform7,
80116
+ readFileFn
80117
+ });
80118
+ if (!installedVersion) {
80119
+ return false;
80120
+ }
80121
+ const versionPattern = new RegExp(`^${escapeRegExp2(metadata.version)}$`);
80122
+ return versionPattern.test(installedVersion);
79278
80123
  }
79279
80124
  } catch {
79280
80125
  return false;
@@ -79291,16 +80136,28 @@ import { promisify as promisify9 } from "node:util";
79291
80136
  init_logger();
79292
80137
  var import_fs_extra7 = __toESM(require_lib3(), 1);
79293
80138
  var execFileAsync5 = promisify9(execFile8);
79294
- async function persistInstallMetadataAfterSuccess(downloadPath, readDownloadedMetadataFn, persistInstallMetadataFn) {
80139
+ async function persistInstallMetadataAfterSuccess(downloadPath, targetPath, platform7, readDownloadedMetadataFn, validateInstalledArtifactFn, persistInstallMetadataFn) {
80140
+ const metadata = await readDownloadedMetadataFn(downloadPath);
80141
+ if (!metadata) {
80142
+ return;
80143
+ }
80144
+ const isValid2 = await validateInstalledArtifactFn(targetPath, metadata, { platform: platform7 });
80145
+ if (!isValid2) {
80146
+ throw new Error(`Installed desktop artifact at ${targetPath} failed validation for release ${metadata.version}`);
80147
+ }
79295
80148
  try {
79296
- const metadata = await readDownloadedMetadataFn(downloadPath);
79297
- if (metadata) {
79298
- await persistInstallMetadataFn(metadata);
79299
- }
80149
+ await persistInstallMetadataFn(metadata);
79300
80150
  } catch (error) {
79301
80151
  logger.warning(`Desktop install succeeded, but failed to persist install metadata: ${error instanceof Error ? error.message : String(error)}`);
79302
80152
  }
79303
80153
  }
80154
+ async function removeBackupInstallPathAfterSuccess(backupInstallPath) {
80155
+ try {
80156
+ await import_fs_extra7.remove(backupInstallPath);
80157
+ } catch (error) {
80158
+ logger.warning(`Desktop install succeeded, but failed to remove backup install at ${backupInstallPath}: ${error instanceof Error ? error.message : String(error)}`);
80159
+ }
80160
+ }
79304
80161
  async function findAppBundle(rootDir) {
79305
80162
  const entries = await readdir16(rootDir, { withFileTypes: true });
79306
80163
  for (const entry of entries) {
@@ -79320,6 +80177,7 @@ async function installDesktopBinary(downloadPath, options2 = {}) {
79320
80177
  const platform7 = options2.platform || process.platform;
79321
80178
  const targetPath = getDesktopInstallPath({ platform: platform7 });
79322
80179
  const readDownloadedMetadataFn = options2.readDownloadedMetadataFn || readDownloadedDesktopMetadata;
80180
+ const validateInstalledArtifactFn = options2.validateInstalledArtifactFn || validateInstalledDesktopArtifact;
79323
80181
  const persistInstallMetadataFn = options2.persistInstallMetadataFn || ((metadata) => writeDesktopInstallMetadata(metadata, { platform: platform7 }));
79324
80182
  await import_fs_extra7.ensureDir(getDesktopInstallDirectory({ platform: platform7 }));
79325
80183
  if (platform7 === "darwin") {
@@ -79333,6 +80191,7 @@ async function installDesktopBinary(downloadPath, options2 = {}) {
79333
80191
  const stagingDir = await mkdtemp(join67(tmpdir(), "ck-desktop-app-"));
79334
80192
  const stagedInstallPath = join67(dirname24(targetPath), `${basename19(targetPath)}.new`);
79335
80193
  const backupInstallPath = join67(dirname24(targetPath), `${basename19(targetPath)}.backup`);
80194
+ let swappedInstall = false;
79336
80195
  try {
79337
80196
  await extractZipFn(downloadPath, { dir: stagingDir });
79338
80197
  const appBundlePath = await findAppBundle(stagingDir);
@@ -79344,28 +80203,70 @@ async function installDesktopBinary(downloadPath, options2 = {}) {
79344
80203
  await rename7(targetPath, backupInstallPath);
79345
80204
  }
79346
80205
  await rename7(stagedInstallPath, targetPath);
79347
- await import_fs_extra7.remove(backupInstallPath);
80206
+ swappedInstall = true;
80207
+ await persistInstallMetadataAfterSuccess(downloadPath, targetPath, platform7, readDownloadedMetadataFn, validateInstalledArtifactFn, persistInstallMetadataFn);
80208
+ await removeBackupInstallPathAfterSuccess(backupInstallPath);
79348
80209
  } catch (error) {
79349
- if (await import_fs_extra7.pathExists(backupInstallPath) && !await import_fs_extra7.pathExists(targetPath)) {
80210
+ if (await import_fs_extra7.pathExists(backupInstallPath)) {
80211
+ if (await import_fs_extra7.pathExists(targetPath)) {
80212
+ await import_fs_extra7.remove(targetPath);
80213
+ }
79350
80214
  await rename7(backupInstallPath, targetPath);
80215
+ } else if (swappedInstall && await import_fs_extra7.pathExists(targetPath)) {
80216
+ await import_fs_extra7.remove(targetPath);
79351
80217
  }
79352
80218
  throw error;
79353
80219
  } finally {
79354
80220
  await import_fs_extra7.remove(stagingDir);
79355
80221
  await import_fs_extra7.remove(stagedInstallPath);
79356
80222
  }
79357
- await persistInstallMetadataAfterSuccess(downloadPath, readDownloadedMetadataFn, persistInstallMetadataFn);
79358
80223
  return targetPath;
79359
80224
  }
79360
80225
  if (platform7 === "linux") {
79361
- await import_fs_extra7.copyFile(downloadPath, targetPath);
79362
- await chmod3(targetPath, 493);
79363
- await persistInstallMetadataAfterSuccess(downloadPath, readDownloadedMetadataFn, persistInstallMetadataFn);
80226
+ const backupInstallPath = join67(dirname24(targetPath), `${basename19(targetPath)}.backup`);
80227
+ try {
80228
+ await import_fs_extra7.remove(backupInstallPath);
80229
+ if (await import_fs_extra7.pathExists(targetPath)) {
80230
+ await rename7(targetPath, backupInstallPath);
80231
+ }
80232
+ await import_fs_extra7.copyFile(downloadPath, targetPath);
80233
+ await chmod3(targetPath, 493);
80234
+ await persistInstallMetadataAfterSuccess(downloadPath, targetPath, platform7, readDownloadedMetadataFn, validateInstalledArtifactFn, persistInstallMetadataFn);
80235
+ await removeBackupInstallPathAfterSuccess(backupInstallPath);
80236
+ } catch (error) {
80237
+ if (await import_fs_extra7.pathExists(backupInstallPath)) {
80238
+ if (await import_fs_extra7.pathExists(targetPath)) {
80239
+ await import_fs_extra7.remove(targetPath);
80240
+ }
80241
+ await rename7(backupInstallPath, targetPath);
80242
+ } else if (await import_fs_extra7.pathExists(targetPath)) {
80243
+ await import_fs_extra7.remove(targetPath);
80244
+ }
80245
+ throw error;
80246
+ }
79364
80247
  return targetPath;
79365
80248
  }
79366
80249
  if (platform7 === "win32") {
79367
- await import_fs_extra7.copyFile(downloadPath, targetPath);
79368
- await persistInstallMetadataAfterSuccess(downloadPath, readDownloadedMetadataFn, persistInstallMetadataFn);
80250
+ const backupInstallPath = join67(dirname24(targetPath), `${basename19(targetPath)}.backup`);
80251
+ try {
80252
+ await import_fs_extra7.remove(backupInstallPath);
80253
+ if (await import_fs_extra7.pathExists(targetPath)) {
80254
+ await rename7(targetPath, backupInstallPath);
80255
+ }
80256
+ await import_fs_extra7.copyFile(downloadPath, targetPath);
80257
+ await persistInstallMetadataAfterSuccess(downloadPath, targetPath, platform7, readDownloadedMetadataFn, validateInstalledArtifactFn, persistInstallMetadataFn);
80258
+ await removeBackupInstallPathAfterSuccess(backupInstallPath);
80259
+ } catch (error) {
80260
+ if (await import_fs_extra7.pathExists(backupInstallPath)) {
80261
+ if (await import_fs_extra7.pathExists(targetPath)) {
80262
+ await import_fs_extra7.remove(targetPath);
80263
+ }
80264
+ await rename7(backupInstallPath, targetPath);
80265
+ } else if (await import_fs_extra7.pathExists(targetPath)) {
80266
+ await import_fs_extra7.remove(targetPath);
80267
+ }
80268
+ throw error;
80269
+ }
79369
80270
  return targetPath;
79370
80271
  }
79371
80272
  throw new Error(`Unsupported install platform: ${platform7}`);
@@ -79784,11 +80685,48 @@ async function resolveDesktopReleaseAsset(version, options2) {
79784
80685
  platformKey
79785
80686
  };
79786
80687
  }
80688
+ async function getDesktopInstallHealth(options2 = {}) {
80689
+ const readInstallMetadata = options2.readInstallMetadata || readDesktopInstallMetadata;
80690
+ const validateInstalledArtifact = options2.validateInstalledArtifact || validateInstalledDesktopArtifact;
80691
+ const readInstalledArtifactVersion = options2.readInstalledArtifactVersion || readInstalledDesktopArtifactVersion;
80692
+ const installed = await readInstallMetadata({ platform: options2.platform });
80693
+ if (!installed) {
80694
+ return {
80695
+ currentVersion: null,
80696
+ healthy: false,
80697
+ reason: "missing-metadata"
80698
+ };
80699
+ }
80700
+ const binaryPath = options2.binaryPath || getDesktopBinaryPath({ platform: options2.platform });
80701
+ if (!binaryPath) {
80702
+ return {
80703
+ currentVersion: installed.version,
80704
+ healthy: false,
80705
+ reason: "missing-binary"
80706
+ };
80707
+ }
80708
+ if (!await validateInstalledArtifact(binaryPath, installed, { platform: options2.platform })) {
80709
+ const installedArtifactVersion = await readInstalledArtifactVersion(binaryPath, {
80710
+ platform: options2.platform
80711
+ });
80712
+ return {
80713
+ currentVersion: installedArtifactVersion || installed.version,
80714
+ healthy: false,
80715
+ reason: "artifact-invalid"
80716
+ };
80717
+ }
80718
+ return {
80719
+ currentVersion: installed.version,
80720
+ healthy: true,
80721
+ reason: "healthy"
80722
+ };
80723
+ }
79787
80724
  async function getDesktopUpdateStatus(options2 = {}) {
79788
80725
  const { manifest, entry, platformKey } = await resolveDesktopReleaseAsset(undefined, options2);
79789
80726
  const latestVersion = normalizeVersion(manifest.version);
79790
80727
  const readInstallMetadata = options2.readInstallMetadata || readDesktopInstallMetadata;
79791
80728
  const validateInstalledArtifact = options2.validateInstalledArtifact || validateInstalledDesktopArtifact;
80729
+ const readInstalledArtifactVersion = options2.readInstalledArtifactVersion || readInstalledDesktopArtifactVersion;
79792
80730
  const installed = await readInstallMetadata({ platform: options2.platform });
79793
80731
  const requestedChannel = options2.channel ?? "stable";
79794
80732
  if (!installed) {
@@ -79805,19 +80743,32 @@ async function getDesktopUpdateStatus(options2 = {}) {
79805
80743
  currentVersion: installed.version,
79806
80744
  latestVersion,
79807
80745
  updateAvailable: true,
79808
- reason: "unknown-installed-version"
80746
+ reason: "missing-binary"
79809
80747
  };
79810
80748
  }
80749
+ const sameChannel = installed.channel === requestedChannel;
80750
+ const samePlatform = installed.platformKey === platformKey;
79811
80751
  if (!await validateInstalledArtifact(binaryPath, installed, { platform: options2.platform })) {
80752
+ const installedArtifactVersion = await readInstalledArtifactVersion(binaryPath, {
80753
+ platform: options2.platform
80754
+ });
80755
+ const currentVersion = installedArtifactVersion || installed.version;
80756
+ const installedArtifactIsNewer = sameChannel && samePlatform && isNewerVersion(latestVersion, currentVersion);
80757
+ if (installedArtifactIsNewer) {
80758
+ return {
80759
+ currentVersion,
80760
+ latestVersion,
80761
+ updateAvailable: false,
80762
+ reason: "installed-newer"
80763
+ };
80764
+ }
79812
80765
  return {
79813
- currentVersion: installed.version,
80766
+ currentVersion,
79814
80767
  latestVersion,
79815
80768
  updateAvailable: true,
79816
80769
  reason: "update-available"
79817
80770
  };
79818
80771
  }
79819
- const sameChannel = installed.channel === requestedChannel;
79820
- const samePlatform = installed.platformKey === platformKey;
79821
80772
  const metadataMatchesRelease = sameChannel && installed.platformKey === platformKey && installed.assetName === entry.name && installed.assetSize === entry.size && installed.manifestDate === manifest.date;
79822
80773
  const installedIsNewer = sameChannel && samePlatform && isNewerVersion(latestVersion, installed.version);
79823
80774
  if (installedIsNewer) {
@@ -79910,6 +80861,7 @@ async function appCommand(options2 = {}, deps = {}) {
79910
80861
  const launchWeb = deps.launchWeb || configUICommand;
79911
80862
  const getBinaryPath = deps.getBinaryPath || getDesktopBinaryPath;
79912
80863
  const getInstallPath2 = deps.getInstallPath || getDesktopInstallPath;
80864
+ const getInstallHealth = deps.getInstallHealth || getDesktopInstallHealth;
79913
80865
  const getUpdateStatus = deps.getUpdateStatus || getDesktopUpdateStatus;
79914
80866
  const downloadBinary = deps.downloadBinary || ((opts) => downloadDesktopBinary(undefined, { channel: opts?.channel }));
79915
80867
  const installBinary = deps.installBinary || installDesktopBinary;
@@ -79918,6 +80870,7 @@ async function appCommand(options2 = {}, deps = {}) {
79918
80870
  const info = deps.info || output.info.bind(output);
79919
80871
  const success = deps.success || output.success.bind(output);
79920
80872
  const printLine = deps.printLine || console.log;
80873
+ let repairingInstall = false;
79921
80874
  if (options2.web) {
79922
80875
  info("Opening ClaudeKit web dashboard...");
79923
80876
  await launchWeb();
@@ -79942,9 +80895,20 @@ async function appCommand(options2 = {}, deps = {}) {
79942
80895
  }
79943
80896
  const existingBinary = getBinaryPath();
79944
80897
  if (existingBinary && !options2.update) {
79945
- success("Launching ClaudeKit Control Center...");
79946
- launchBinary(existingBinary);
79947
- return;
80898
+ try {
80899
+ const installHealth = await getInstallHealth({ binaryPath: existingBinary });
80900
+ if (installHealth.healthy || installHealth.reason === "missing-metadata") {
80901
+ success("Launching ClaudeKit Control Center...");
80902
+ launchBinary(existingBinary);
80903
+ return;
80904
+ }
80905
+ info(installHealth.currentVersion ? `Installed ClaudeKit Control Center build (${installHealth.currentVersion}) needs repair. Downloading the latest build...` : "Installed ClaudeKit Control Center needs repair. Downloading the latest build...");
80906
+ repairingInstall = true;
80907
+ } catch {
80908
+ success("Launching ClaudeKit Control Center...");
80909
+ launchBinary(existingBinary);
80910
+ return;
80911
+ }
79948
80912
  }
79949
80913
  if (options2.update && existingBinary) {
79950
80914
  const updateStatus = await getUpdateStatus({ channel, binaryPath: existingBinary });
@@ -79955,7 +80919,11 @@ async function appCommand(options2 = {}, deps = {}) {
79955
80919
  return;
79956
80920
  }
79957
80921
  }
79958
- info(options2.update ? "Downloading and installing the latest ClaudeKit Control Center build..." : "ClaudeKit Control Center not found. Downloading...");
80922
+ if (options2.update) {
80923
+ info("Downloading and installing the latest ClaudeKit Control Center build...");
80924
+ } else if (!repairingInstall) {
80925
+ info("ClaudeKit Control Center not found. Downloading...");
80926
+ }
79959
80927
  const downloadedBinary = await downloadBinary({ channel });
79960
80928
  const installedBinary = await installBinary(downloadedBinary);
79961
80929
  success(`Installed ClaudeKit Control Center to ${installedBinary}`);