claudeup 6.2.1 → 6.3.0

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 (150) hide show
  1. package/README.md +22 -0
  2. package/bin/claudeup.js +6 -1
  3. package/package.json +6 -6
  4. package/src/__tests__/alias-adopt.test.ts +331 -329
  5. package/src/__tests__/alias-parser.test.ts +384 -376
  6. package/src/__tests__/alias-shell-writer.test.ts +638 -625
  7. package/src/__tests__/alias-store.test.ts +143 -143
  8. package/src/__tests__/catalog-cache-store.test.ts +265 -265
  9. package/src/__tests__/catalog-notice.test.ts +123 -123
  10. package/src/__tests__/cli-apply-seams.test.ts +12 -8
  11. package/src/__tests__/cli-router.test.ts +132 -3
  12. package/src/__tests__/cli-update-view.test.ts +27 -8
  13. package/src/__tests__/community-staleness.test.ts +0 -2
  14. package/src/__tests__/component-badge.test.ts +4 -4
  15. package/src/__tests__/content-drift.test.ts +5 -1
  16. package/src/__tests__/conventions-integration.test.ts +774 -689
  17. package/src/__tests__/conventions-manager.test.ts +1216 -1152
  18. package/src/__tests__/doctor-bins.test.ts +14 -6
  19. package/src/__tests__/doctor.test.ts +438 -425
  20. package/src/__tests__/dual-write-prevention.test.ts +277 -282
  21. package/src/__tests__/enabled-not-installed.test.ts +71 -63
  22. package/src/__tests__/file-locking.test.ts +196 -196
  23. package/src/__tests__/gap-fill-versions.test.ts +318 -311
  24. package/src/__tests__/github-budget.test.ts +170 -164
  25. package/src/__tests__/gitignore-detector.test.ts +160 -152
  26. package/src/__tests__/gitignore-fixer.test.ts +285 -247
  27. package/src/__tests__/gitignore-prerun.test.ts +57 -57
  28. package/src/__tests__/gitignore-resolver.test.ts +173 -146
  29. package/src/__tests__/gitignore-service.test.ts +121 -119
  30. package/src/__tests__/install-command.test.ts +3 -3
  31. package/src/__tests__/install-plan.test.ts +13 -7
  32. package/src/__tests__/manifest.test.ts +16 -5
  33. package/src/__tests__/markdown-renderer.test.ts +0 -1
  34. package/src/__tests__/marketplace-badge.test.ts +111 -90
  35. package/src/__tests__/marketplace-version.test.ts +64 -61
  36. package/src/__tests__/plugin-manager-fallback.test.ts +249 -239
  37. package/src/__tests__/plugin-requires.test.ts +18 -4
  38. package/src/__tests__/plugin-setup.test.ts +12 -12
  39. package/src/__tests__/profile-command.test.ts +1 -7
  40. package/src/__tests__/profile-materializer.test.ts +31 -8
  41. package/src/__tests__/profile-sync.test.ts +23 -5
  42. package/src/__tests__/registry-version-resolution.test.ts +61 -47
  43. package/src/__tests__/resolve-executable.test.ts +1 -1
  44. package/src/__tests__/resolver.test.ts +38 -13
  45. package/src/__tests__/scope-action.test.ts +52 -50
  46. package/src/__tests__/scope-squares.test.tsx +4 -5
  47. package/src/__tests__/skill-install-files.test.ts +111 -103
  48. package/src/__tests__/symlink-manager.test.ts +27 -10
  49. package/src/__tests__/theme-env.test.ts +281 -0
  50. package/src/__tests__/theme-resolve.test.ts +380 -0
  51. package/src/__tests__/update-apply.test.ts +1 -3
  52. package/src/__tests__/useGitignoreModal.test.ts +69 -61
  53. package/src/__tests__/version-snapshot.test.ts +183 -165
  54. package/src/cli/ansi.ts +23 -15
  55. package/src/cli/doctor.ts +10 -9
  56. package/src/cli/install.ts +3 -3
  57. package/src/cli/profile.ts +5 -4
  58. package/src/cli/prompt.ts +0 -1
  59. package/src/cli/router.ts +69 -2
  60. package/src/cli/update-view.ts +11 -6
  61. package/src/cli/update.ts +9 -4
  62. package/src/cli/upgrade.ts +6 -4
  63. package/src/data/alias-flags.ts +260 -260
  64. package/src/data/gitignore-defaults.ts +20 -20
  65. package/src/data/gitignore-reasons.ts +86 -92
  66. package/src/data/gitignore-templates.ts +14 -14
  67. package/src/data/predefined-profiles.ts +1 -2
  68. package/src/data/skill-repos.ts +43 -35
  69. package/src/main.tsx +29 -6
  70. package/src/opentui.d.ts +1 -3
  71. package/src/prerunner/index.ts +7 -8
  72. package/src/services/alias-settings.ts +20 -23
  73. package/src/services/alias-shell-writer.ts +800 -803
  74. package/src/services/alias-store.ts +77 -77
  75. package/src/services/claude-settings.ts +27 -18
  76. package/src/services/content-drift.ts +13 -3
  77. package/src/services/conventions-manager.ts +692 -617
  78. package/src/services/doctor.ts +464 -403
  79. package/src/services/gitignore-detector.ts +113 -103
  80. package/src/services/gitignore-fixer.ts +204 -189
  81. package/src/services/gitignore-prerun.ts +26 -26
  82. package/src/services/gitignore-resolver.ts +162 -144
  83. package/src/services/gitignore-service.ts +120 -117
  84. package/src/services/install-plan.ts +4 -4
  85. package/src/services/manifest.ts +1 -1
  86. package/src/services/marketplace-catalog-git.ts +5 -2
  87. package/src/services/marketplace-fetcher.ts +241 -235
  88. package/src/services/plugin-manager.ts +17 -20
  89. package/src/services/plugin-mcp-config.ts +2 -2
  90. package/src/services/plugin-requires.ts +9 -6
  91. package/src/services/plugin-setup.ts +7 -9
  92. package/src/services/plugin-version-check.ts +4 -4
  93. package/src/services/profile-materializer.ts +9 -5
  94. package/src/services/profile-sync.ts +12 -4
  95. package/src/services/profiles.ts +3 -3
  96. package/src/services/resolver.ts +10 -6
  97. package/src/services/settings-manager.ts +82 -46
  98. package/src/services/skills-manager.ts +11 -9
  99. package/src/services/symlink-manager.ts +2 -5
  100. package/src/services/toolchain.ts +3 -3
  101. package/src/services/update-cache.ts +1 -1
  102. package/src/services/update-engine.ts +4 -4
  103. package/src/services/update-plan.ts +9 -11
  104. package/src/services/version-snapshot.ts +88 -88
  105. package/src/types/gitignore.ts +28 -28
  106. package/src/ui/App.tsx +36 -36
  107. package/src/ui/adapters/settingsAdapter.ts +2 -2
  108. package/src/ui/components/CategoryHeader.tsx +1 -1
  109. package/src/ui/components/FlagDetailEditor.tsx +0 -0
  110. package/src/ui/components/ScopeIndicator.tsx +3 -1
  111. package/src/ui/components/ScrollableList.tsx +2 -1
  112. package/src/ui/components/StyledText.tsx +1 -1
  113. package/src/ui/components/layout/FooterHints.tsx +5 -3
  114. package/src/ui/components/layout/Panel.tsx +2 -2
  115. package/src/ui/components/layout/ScreenLayout.tsx +5 -4
  116. package/src/ui/components/modals/InputModal.tsx +7 -1
  117. package/src/ui/components/modals/ModalContainer.tsx +3 -3
  118. package/src/ui/components/modals/SelectModal.tsx +1 -1
  119. package/src/ui/components/primitives/DetailSection.tsx +1 -1
  120. package/src/ui/components/primitives/KeyValueLine.tsx +1 -1
  121. package/src/ui/components/primitives/ScopeSquares.tsx +2 -2
  122. package/src/ui/hooks/index.ts +0 -1
  123. package/src/ui/hooks/useGitignoreModal.ts +1 -5
  124. package/src/ui/hooks/useMismatchModal.ts +4 -10
  125. package/src/ui/renderers/cliToolRenderers.tsx +2 -2
  126. package/src/ui/renderers/gitignoreRenderers.tsx +2 -2
  127. package/src/ui/renderers/mcpRenderers.tsx +1 -1
  128. package/src/ui/renderers/pluginRenderers.tsx +3 -9
  129. package/src/ui/renderers/profileRenderers.tsx +9 -8
  130. package/src/ui/renderers/settingsRenderers.tsx +4 -4
  131. package/src/ui/renderers/skillRenderers.tsx +14 -14
  132. package/src/ui/screens/AliasScreen.tsx +31 -34
  133. package/src/ui/screens/CliToolsScreen.tsx +14 -13
  134. package/src/ui/screens/EnvVarsScreen.tsx +8 -8
  135. package/src/ui/screens/GitignoreScreen.tsx +15 -14
  136. package/src/ui/screens/McpRegistryScreen.tsx +10 -7
  137. package/src/ui/screens/McpScreen.tsx +10 -10
  138. package/src/ui/screens/PluginsScreen.tsx +17 -21
  139. package/src/ui/screens/ProfilesScreen.tsx +25 -24
  140. package/src/ui/screens/SkillsScreen.tsx +16 -14
  141. package/src/ui/state/AppContext.tsx +4 -8
  142. package/src/ui/state/DimensionsContext.tsx +3 -2
  143. package/src/ui/theme-mode.ts +20 -38
  144. package/src/ui/theme-resolve.ts +148 -0
  145. package/src/utils/clipboard.ts +5 -5
  146. package/src/utils/command-utils.ts +2 -2
  147. package/src/utils/config-dir.ts +1 -3
  148. package/src/utils/file-locking.ts +88 -86
  149. package/src/ui/hooks/useAsyncData.ts +0 -127
  150. package/src/ui/state/AnimationContext.tsx +0 -76
@@ -8,72 +8,72 @@
8
8
  */
9
9
 
10
10
  export type FlagKind =
11
- /** On/off. AliasFlagState: { enabled: boolean } */
12
- | "boolean"
13
- /** Three states: unset / on / off. Used for `--chrome` vs `--no-chrome`. */
14
- | "tri-state"
15
- /** Single value from a fixed list. AliasFlagState: { enabled, value }. */
16
- | "select"
17
- /** Free-form string. AliasFlagState: { enabled, value }. */
18
- | "text"
19
- /** Optional free-form string (flag works with or without a value). */
20
- | "optional-text"
21
- /** Repeatable list of strings. AliasFlagState: { enabled, values }. */
22
- | "text-list"
23
- /**
24
- * Picklist of common tokens + free-form custom tokens, joined with commas.
25
- * AliasFlagState: { enabled, picked: string[], custom: string[] }.
26
- * Used for `--debug` because Claude Code's category set is dynamic.
27
- */
28
- | "multi-with-custom";
11
+ /** On/off. AliasFlagState: { enabled: boolean } */
12
+ | "boolean"
13
+ /** Three states: unset / on / off. Used for `--chrome` vs `--no-chrome`. */
14
+ | "tri-state"
15
+ /** Single value from a fixed list. AliasFlagState: { enabled, value }. */
16
+ | "select"
17
+ /** Free-form string. AliasFlagState: { enabled, value }. */
18
+ | "text"
19
+ /** Optional free-form string (flag works with or without a value). */
20
+ | "optional-text"
21
+ /** Repeatable list of strings. AliasFlagState: { enabled, values }. */
22
+ | "text-list"
23
+ /**
24
+ * Picklist of common tokens + free-form custom tokens, joined with commas.
25
+ * AliasFlagState: { enabled, picked: string[], custom: string[] }.
26
+ * Used for `--debug` because Claude Code's category set is dynamic.
27
+ */
28
+ | "multi-with-custom";
29
29
 
30
30
  export interface FlagSelectOption {
31
- label: string;
32
- value: string;
31
+ label: string;
32
+ value: string;
33
33
  }
34
34
 
35
35
  export interface AliasFlag {
36
- /** Stable identifier; used as JSON key in `~/.claude/claudeup-alias.json`. */
37
- id: string;
38
- /** Human label shown in the UI list. */
39
- label: string;
40
- /**
41
- * The CLI flag as it appears on the command line. For tri-state, this is the
42
- * "on" form (e.g. `--chrome`); the "off" form is in `triStateOff`.
43
- */
44
- flag: string;
45
- /** Optional short flag (e.g. `-d` for `--debug`). Not currently rendered. */
46
- shortFlag?: string;
47
- kind: FlagKind;
48
- /** One-line description shown in the detail panel. */
49
- description: string;
50
- /** Allowed values for `kind: "select"`. */
51
- options?: FlagSelectOption[];
52
- /** "Off" form for tri-state flags (e.g. `--no-chrome`). */
53
- triStateOff?: string;
54
- /** Picklist tokens for `kind: "multi-with-custom"`. */
55
- picklist?: string[];
56
- /** Default seed values for `text-list` and `multi-with-custom`. */
57
- defaultValues?: string[];
58
- /**
59
- * Validation key. The renderer / UI consult this to grey out conflicting
60
- * fields. Two flags with the same `xorGroup` are mutually exclusive.
61
- */
62
- xorGroup?: string;
63
- /**
64
- * The flag is only valid when another flag (by id) is enabled.
65
- * UI greys out and shows "requires --xxx".
66
- */
67
- requires?: string;
68
- /**
69
- * If true, the value supports `{token}` placeholders that expand at shell
70
- * eval time (not at write time). The renderer emits the value as a mix of
71
- * literal segments and shell substitution segments instead of one quoted
72
- * token. See `TEMPLATE_TOKENS` for the supported placeholder set.
73
- */
74
- templated?: boolean;
75
- /** UI grouping; rendered as section headers in the list. */
76
- group: FlagGroup;
36
+ /** Stable identifier; used as JSON key in `~/.claude/claudeup-alias.json`. */
37
+ id: string;
38
+ /** Human label shown in the UI list. */
39
+ label: string;
40
+ /**
41
+ * The CLI flag as it appears on the command line. For tri-state, this is the
42
+ * "on" form (e.g. `--chrome`); the "off" form is in `triStateOff`.
43
+ */
44
+ flag: string;
45
+ /** Optional short flag (e.g. `-d` for `--debug`). Not currently rendered. */
46
+ shortFlag?: string;
47
+ kind: FlagKind;
48
+ /** One-line description shown in the detail panel. */
49
+ description: string;
50
+ /** Allowed values for `kind: "select"`. */
51
+ options?: FlagSelectOption[];
52
+ /** "Off" form for tri-state flags (e.g. `--no-chrome`). */
53
+ triStateOff?: string;
54
+ /** Picklist tokens for `kind: "multi-with-custom"`. */
55
+ picklist?: string[];
56
+ /** Default seed values for `text-list` and `multi-with-custom`. */
57
+ defaultValues?: string[];
58
+ /**
59
+ * Validation key. The renderer / UI consult this to grey out conflicting
60
+ * fields. Two flags with the same `xorGroup` are mutually exclusive.
61
+ */
62
+ xorGroup?: string;
63
+ /**
64
+ * The flag is only valid when another flag (by id) is enabled.
65
+ * UI greys out and shows "requires --xxx".
66
+ */
67
+ requires?: string;
68
+ /**
69
+ * If true, the value supports `{token}` placeholders that expand at shell
70
+ * eval time (not at write time). The renderer emits the value as a mix of
71
+ * literal segments and shell substitution segments instead of one quoted
72
+ * token. See `TEMPLATE_TOKENS` for the supported placeholder set.
73
+ */
74
+ templated?: boolean;
75
+ /** UI grouping; rendered as section headers in the list. */
76
+ group: FlagGroup;
77
77
  }
78
78
 
79
79
  /**
@@ -87,215 +87,215 @@ export interface AliasFlag {
87
87
  * `--remote-control` (which already auto-generates a unique suffix).
88
88
  */
89
89
  export const TEMPLATE_TOKENS: Array<{ token: string; description: string }> = [
90
- { token: "{folder}", description: "current directory's basename" },
91
- { token: "{day}", description: "day of month, zero-padded (01-31)" },
92
- { token: "{month}", description: "month, zero-padded (01-12)" },
93
- { token: "{year}", description: "4-digit year" },
90
+ { token: "{folder}", description: "current directory's basename" },
91
+ { token: "{day}", description: "day of month, zero-padded (01-31)" },
92
+ { token: "{month}", description: "month, zero-padded (01-12)" },
93
+ { token: "{year}", description: "4-digit year" },
94
94
  ];
95
95
 
96
96
  export type FlagGroup =
97
- | "danger"
98
- | "session"
99
- | "context"
100
- | "channels"
101
- | "debug"
102
- | "integration"
103
- | "worktree";
97
+ | "danger"
98
+ | "session"
99
+ | "context"
100
+ | "channels"
101
+ | "debug"
102
+ | "integration"
103
+ | "worktree";
104
104
 
105
105
  export const FLAG_GROUPS: Array<{ id: FlagGroup; label: string }> = [
106
- { id: "danger", label: "Permissions" },
107
- { id: "session", label: "Session" },
108
- { id: "context", label: "Context" },
109
- { id: "channels", label: "Development channels" },
110
- { id: "debug", label: "Debug" },
111
- { id: "integration", label: "Integrations" },
112
- { id: "worktree", label: "Worktree" },
106
+ { id: "danger", label: "Permissions" },
107
+ { id: "session", label: "Session" },
108
+ { id: "context", label: "Context" },
109
+ { id: "channels", label: "Development channels" },
110
+ { id: "debug", label: "Debug" },
111
+ { id: "integration", label: "Integrations" },
112
+ { id: "worktree", label: "Worktree" },
113
113
  ];
114
114
 
115
115
  export const ALIAS_FLAGS: AliasFlag[] = [
116
- {
117
- id: "dangerously-skip-permissions",
118
- label: "Skip permission checks",
119
- flag: "--dangerously-skip-permissions",
120
- kind: "boolean",
121
- group: "danger",
122
- description:
123
- "Bypass all permission checks. Recommended only for sandboxes with no internet access.",
124
- },
125
- {
126
- id: "allow-dangerously-skip-permissions",
127
- label: "Allow skip-permissions opt-in",
128
- flag: "--allow-dangerously-skip-permissions",
129
- kind: "boolean",
130
- group: "danger",
131
- description:
132
- "Enable the skip-permissions option without making it the default.",
133
- },
134
- {
135
- id: "remote-control",
136
- label: "Remote control",
137
- flag: "--remote-control",
138
- kind: "boolean",
139
- group: "session",
140
- description:
141
- "Start an interactive session with Remote Control enabled. Claude Code auto-generates a unique session name; use --remote-control-session-name-prefix to customize it.",
142
- },
143
- {
144
- id: "remote-control-session-name-prefix",
145
- label: "Remote control name prefix",
146
- flag: "--remote-control-session-name-prefix",
147
- kind: "text",
148
- templated: true,
149
- group: "session",
150
- description:
151
- "Prefix for auto-generated Remote Control session names. Default: hostname. Supports template tokens that expand on each shell invocation: {folder} (basename of $PWD), {day}, {month}, {year}. Example: dev-{folder}-{day} → dev-myproject-15.",
152
- },
153
- {
154
- id: "ide",
155
- label: "Auto-connect to IDE",
156
- flag: "--ide",
157
- kind: "boolean",
158
- group: "integration",
159
- description:
160
- "Automatically connect to IDE on startup if exactly one valid IDE is available.",
161
- },
162
- {
163
- id: "chrome",
164
- label: "Chrome integration",
165
- flag: "--chrome",
166
- triStateOff: "--no-chrome",
167
- kind: "tri-state",
168
- group: "integration",
169
- description:
170
- "Enable or disable Claude in Chrome integration. Unset leaves the project default in place.",
171
- },
172
- {
173
- id: "effort",
174
- label: "Effort level",
175
- flag: "--effort",
176
- kind: "select",
177
- group: "session",
178
- description: "Effort level for the current session.",
179
- options: [
180
- { label: "low", value: "low" },
181
- { label: "medium", value: "medium" },
182
- { label: "high", value: "high" },
183
- { label: "xhigh", value: "xhigh" },
184
- { label: "max", value: "max" },
185
- ],
186
- },
187
- {
188
- id: "system-prompt",
189
- label: "System prompt",
190
- flag: "--system-prompt",
191
- kind: "text",
192
- group: "context",
193
- xorGroup: "system-prompt",
194
- description:
195
- "System prompt text to use for the session. Mutually exclusive with --system-prompt-file.",
196
- },
197
- {
198
- id: "system-prompt-file",
199
- label: "System prompt file",
200
- flag: "--system-prompt-file",
201
- kind: "text",
202
- group: "context",
203
- xorGroup: "system-prompt",
204
- description:
205
- "Path to a file whose contents replace the default system prompt. Mutually exclusive with --system-prompt.",
206
- },
207
- {
208
- id: "append-system-prompt",
209
- label: "Append system prompt",
210
- flag: "--append-system-prompt",
211
- kind: "text",
212
- group: "context",
213
- description:
214
- "Text appended to the default system prompt. Composes with --system-prompt.",
215
- },
216
- {
217
- id: "append-system-prompt-file",
218
- label: "Append system prompt file",
219
- flag: "--append-system-prompt-file",
220
- kind: "text",
221
- group: "context",
222
- description:
223
- "Path to a file whose contents are appended to the default system prompt.",
224
- },
225
- {
226
- id: "channels",
227
- label: "Channels (approved)",
228
- flag: "--channels",
229
- kind: "text-list",
230
- group: "channels",
231
- description:
232
- "Approved channel plugins/MCP servers to run this session (the allowlist). Channels derived from --dangerously-load appear in a separate section here and are unioned in on write; add your own approved channels on top.",
233
- defaultValues: [],
234
- },
235
- {
236
- id: "dangerously-load-development-channels",
237
- label: "Load development channels",
238
- flag: "--dangerously-load-development-channels",
239
- kind: "text-list",
240
- group: "channels",
241
- description:
242
- "Sideload development channels not on the approved allowlist (local dev only). Also shown under --channels and unioned into it on write. Default seed: claudish (the only magus plugin currently shipping channels).",
243
- defaultValues: ["plugin:claudish@magus"],
244
- },
245
- {
246
- id: "debug",
247
- label: "Debug categories",
248
- flag: "--debug",
249
- shortFlag: "-d",
250
- kind: "multi-with-custom",
251
- group: "debug",
252
- description:
253
- "Enable debug mode with optional category filter. Pick from common categories or add custom tokens (including negations like !file).",
254
- picklist: [
255
- "api",
256
- "hooks",
257
- "mcp",
258
- "tools",
259
- "plugins",
260
- "skills",
261
- "settings",
262
- "permissions",
263
- "auth",
264
- "cache",
265
- "statsig",
266
- "file",
267
- "1p",
268
- ],
269
- defaultValues: [],
270
- },
271
- {
272
- id: "worktree",
273
- label: "Use worktree",
274
- flag: "--worktree",
275
- kind: "boolean",
276
- group: "worktree",
277
- description:
278
- "Create a git worktree for the session. Prerequisite for --tmux.",
279
- },
280
- {
281
- id: "tmux",
282
- label: "tmux session",
283
- flag: "--tmux",
284
- kind: "select",
285
- group: "worktree",
286
- requires: "worktree",
287
- description:
288
- "Create a tmux session for the worktree. Requires --worktree. iTerm2 native panes when available; classic for traditional tmux.",
289
- options: [
290
- { label: "auto (iTerm2 native)", value: "" },
291
- { label: "classic", value: "classic" },
292
- ],
293
- },
116
+ {
117
+ id: "dangerously-skip-permissions",
118
+ label: "Skip permission checks",
119
+ flag: "--dangerously-skip-permissions",
120
+ kind: "boolean",
121
+ group: "danger",
122
+ description:
123
+ "Bypass all permission checks. Recommended only for sandboxes with no internet access.",
124
+ },
125
+ {
126
+ id: "allow-dangerously-skip-permissions",
127
+ label: "Allow skip-permissions opt-in",
128
+ flag: "--allow-dangerously-skip-permissions",
129
+ kind: "boolean",
130
+ group: "danger",
131
+ description:
132
+ "Enable the skip-permissions option without making it the default.",
133
+ },
134
+ {
135
+ id: "remote-control",
136
+ label: "Remote control",
137
+ flag: "--remote-control",
138
+ kind: "boolean",
139
+ group: "session",
140
+ description:
141
+ "Start an interactive session with Remote Control enabled. Claude Code auto-generates a unique session name; use --remote-control-session-name-prefix to customize it.",
142
+ },
143
+ {
144
+ id: "remote-control-session-name-prefix",
145
+ label: "Remote control name prefix",
146
+ flag: "--remote-control-session-name-prefix",
147
+ kind: "text",
148
+ templated: true,
149
+ group: "session",
150
+ description:
151
+ "Prefix for auto-generated Remote Control session names. Default: hostname. Supports template tokens that expand on each shell invocation: {folder} (basename of $PWD), {day}, {month}, {year}. Example: dev-{folder}-{day} → dev-myproject-15.",
152
+ },
153
+ {
154
+ id: "ide",
155
+ label: "Auto-connect to IDE",
156
+ flag: "--ide",
157
+ kind: "boolean",
158
+ group: "integration",
159
+ description:
160
+ "Automatically connect to IDE on startup if exactly one valid IDE is available.",
161
+ },
162
+ {
163
+ id: "chrome",
164
+ label: "Chrome integration",
165
+ flag: "--chrome",
166
+ triStateOff: "--no-chrome",
167
+ kind: "tri-state",
168
+ group: "integration",
169
+ description:
170
+ "Enable or disable Claude in Chrome integration. Unset leaves the project default in place.",
171
+ },
172
+ {
173
+ id: "effort",
174
+ label: "Effort level",
175
+ flag: "--effort",
176
+ kind: "select",
177
+ group: "session",
178
+ description: "Effort level for the current session.",
179
+ options: [
180
+ { label: "low", value: "low" },
181
+ { label: "medium", value: "medium" },
182
+ { label: "high", value: "high" },
183
+ { label: "xhigh", value: "xhigh" },
184
+ { label: "max", value: "max" },
185
+ ],
186
+ },
187
+ {
188
+ id: "system-prompt",
189
+ label: "System prompt",
190
+ flag: "--system-prompt",
191
+ kind: "text",
192
+ group: "context",
193
+ xorGroup: "system-prompt",
194
+ description:
195
+ "System prompt text to use for the session. Mutually exclusive with --system-prompt-file.",
196
+ },
197
+ {
198
+ id: "system-prompt-file",
199
+ label: "System prompt file",
200
+ flag: "--system-prompt-file",
201
+ kind: "text",
202
+ group: "context",
203
+ xorGroup: "system-prompt",
204
+ description:
205
+ "Path to a file whose contents replace the default system prompt. Mutually exclusive with --system-prompt.",
206
+ },
207
+ {
208
+ id: "append-system-prompt",
209
+ label: "Append system prompt",
210
+ flag: "--append-system-prompt",
211
+ kind: "text",
212
+ group: "context",
213
+ description:
214
+ "Text appended to the default system prompt. Composes with --system-prompt.",
215
+ },
216
+ {
217
+ id: "append-system-prompt-file",
218
+ label: "Append system prompt file",
219
+ flag: "--append-system-prompt-file",
220
+ kind: "text",
221
+ group: "context",
222
+ description:
223
+ "Path to a file whose contents are appended to the default system prompt.",
224
+ },
225
+ {
226
+ id: "channels",
227
+ label: "Channels (approved)",
228
+ flag: "--channels",
229
+ kind: "text-list",
230
+ group: "channels",
231
+ description:
232
+ "Approved channel plugins/MCP servers to run this session (the allowlist). Channels derived from --dangerously-load appear in a separate section here and are unioned in on write; add your own approved channels on top.",
233
+ defaultValues: [],
234
+ },
235
+ {
236
+ id: "dangerously-load-development-channels",
237
+ label: "Load development channels",
238
+ flag: "--dangerously-load-development-channels",
239
+ kind: "text-list",
240
+ group: "channels",
241
+ description:
242
+ "Sideload development channels not on the approved allowlist (local dev only). Also shown under --channels and unioned into it on write. Default seed: claudish (the only magus plugin currently shipping channels).",
243
+ defaultValues: ["plugin:claudish@magus"],
244
+ },
245
+ {
246
+ id: "debug",
247
+ label: "Debug categories",
248
+ flag: "--debug",
249
+ shortFlag: "-d",
250
+ kind: "multi-with-custom",
251
+ group: "debug",
252
+ description:
253
+ "Enable debug mode with optional category filter. Pick from common categories or add custom tokens (including negations like !file).",
254
+ picklist: [
255
+ "api",
256
+ "hooks",
257
+ "mcp",
258
+ "tools",
259
+ "plugins",
260
+ "skills",
261
+ "settings",
262
+ "permissions",
263
+ "auth",
264
+ "cache",
265
+ "statsig",
266
+ "file",
267
+ "1p",
268
+ ],
269
+ defaultValues: [],
270
+ },
271
+ {
272
+ id: "worktree",
273
+ label: "Use worktree",
274
+ flag: "--worktree",
275
+ kind: "boolean",
276
+ group: "worktree",
277
+ description:
278
+ "Create a git worktree for the session. Prerequisite for --tmux.",
279
+ },
280
+ {
281
+ id: "tmux",
282
+ label: "tmux session",
283
+ flag: "--tmux",
284
+ kind: "select",
285
+ group: "worktree",
286
+ requires: "worktree",
287
+ description:
288
+ "Create a tmux session for the worktree. Requires --worktree. iTerm2 native panes when available; classic for traditional tmux.",
289
+ options: [
290
+ { label: "auto (iTerm2 native)", value: "" },
291
+ { label: "classic", value: "classic" },
292
+ ],
293
+ },
294
294
  ];
295
295
 
296
296
  /** Look up a flag by id. Throws if missing — keeps callers honest. */
297
297
  export function getFlagById(id: string): AliasFlag {
298
- const f = ALIAS_FLAGS.find((flag) => flag.id === id);
299
- if (!f) throw new Error(`Unknown alias flag id: ${id}`);
300
- return f;
298
+ const f = ALIAS_FLAGS.find((flag) => flag.id === id);
299
+ if (!f) throw new Error(`Unknown alias flag id: ${id}`);
300
+ return f;
301
301
  }
@@ -7,24 +7,24 @@ import type { GitignoreManifest } from "../types/gitignore.js";
7
7
  * "common-dev" template which users opt into via `extends`.
8
8
  */
9
9
  export const BUILTIN_DEFAULTS: GitignoreManifest = {
10
- ignore: [
11
- ".claude/settings.local.json",
12
- ".claude/scheduled_tasks.lock",
13
- ".claude/cache/",
14
- ".claude/.statusline-worktree-*",
15
- // Generated, per-developer profile build output (like node_modules).
16
- ".claude/_profiles/",
17
- "ai-docs/sessions/",
18
- ".mnemex/",
19
- ".claudemem/",
20
- "gtd/sessions/",
21
- ".agents/",
22
- ],
23
- track: [
24
- // The committed team source of truth when using profiles.
25
- ".claude/profiles.json",
26
- ".claude/settings.json",
27
- ".mcp.json",
28
- "plugin.json",
29
- ],
10
+ ignore: [
11
+ ".claude/settings.local.json",
12
+ ".claude/scheduled_tasks.lock",
13
+ ".claude/cache/",
14
+ ".claude/.statusline-worktree-*",
15
+ // Generated, per-developer profile build output (like node_modules).
16
+ ".claude/_profiles/",
17
+ "ai-docs/sessions/",
18
+ ".mnemex/",
19
+ ".claudemem/",
20
+ "gtd/sessions/",
21
+ ".agents/",
22
+ ],
23
+ track: [
24
+ // The committed team source of truth when using profiles.
25
+ ".claude/profiles.json",
26
+ ".claude/settings.json",
27
+ ".mcp.json",
28
+ "plugin.json",
29
+ ],
30
30
  };