@uniswap/ai-toolkit-nx-claude 0.5.23 → 0.5.24-next.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.
@@ -35,7 +35,7 @@ Language-agnostic slash command definitions for Claude Code. Each markdown file
35
35
  - `work-through-pr-comments.md` - Methodically work through PR comments
36
36
  - `generate-commit-message.md` - Generate structured commit messages
37
37
  - `split-stack.md` - Split Graphite PR stacks
38
- - `git-worktree-orchestrator.md` - Create and manage git worktrees with spec-workflow and Linear integration
38
+ - `git-worktree-orchestrator.md` - Create and manage git worktrees with spec-workflow, Graphite, setup scripts, and Linear integration
39
39
 
40
40
  ### Documentation
41
41
 
@@ -118,6 +118,7 @@ Commands that manage larger processes:
118
118
  - `/implement-spec` - Spec task implementation
119
119
  - `/execute-plan` - Plan execution
120
120
  - `/work-through-pr-comments` - Comment resolution workflow
121
+ - `/git-worktree-orchestrator` - Worktree creation with Graphite, setup scripts, and Linear automation
121
122
 
122
123
  ## Development
123
124
 
@@ -1,13 +1,15 @@
1
1
  ---
2
2
  name: git-worktree-orchestrator
3
- description: Create and manage a git worktree based on the current directory and a branch name, with optional spec-workflow setup and Linear task automation.
4
- argument-hint: <branch-name> [linear-task-id]
3
+ description: Create and manage a git worktree based on the current directory and a branch name, with optional spec-workflow setup, Graphite integration, and Linear task automation.
4
+ argument-hint: <branch-name> [--graphite [--trunk <branch>]] [--setup <script-or-command>] [linear-task-id]
5
5
  ---
6
6
 
7
7
  # Git Worktree Orchestrator
8
8
 
9
9
  Create and manage a git worktree based on the current directory and a branch name. After creating the worktree, it copies the .spec-workflow directory, adds the spec-workflow MCP, and can optionally commit/push, open a PR, and clean up the worktree. It also copies other files from the root git worktree into the newly created worktree.
10
10
 
11
+ Supports Graphite integration to track the new branch on top of a trunk branch, and can run a setup script immediately after creating the worktree.
12
+
11
13
  Optionally accepts a Linear task ID to automatically spawn a new Claude Code instance that will complete the task autonomously.
12
14
 
13
15
  ## Usage
@@ -16,13 +18,28 @@ Optionally accepts a Linear task ID to automatically spawn a new Claude Code ins
16
18
  # Create worktree for a new branch
17
19
  /git-worktree-orchestrator add-new-color
18
20
 
19
- # Create worktree and attach a Linear task for autonomous completion
20
- /git-worktree-orchestrator feature/auth-system DEV-1234
21
+ # Create worktree with Graphite tracking (will prompt for trunk branch)
22
+ /git-worktree-orchestrator feature/new-ui --graphite
23
+
24
+ # Create worktree with Graphite tracking on specific trunk
25
+ /git-worktree-orchestrator feature/new-ui --graphite --trunk main
26
+
27
+ # Create worktree and run a setup script
28
+ /git-worktree-orchestrator feature/setup-test --setup "./scripts/setup-dev.sh"
29
+
30
+ # Create worktree and run an inline setup command
31
+ /git-worktree-orchestrator feature/npm-setup --setup "npm install && npm run build"
32
+
33
+ # Full example with all options
34
+ /git-worktree-orchestrator feature/auth-system --graphite --trunk main --setup "npm ci" DEV-1234
21
35
  ```
22
36
 
23
37
  ## Arguments
24
38
 
25
39
  - **branch** (required): Branch name to create/use for the worktree
40
+ - **--graphite, -g** (optional): Enable Graphite integration to track the branch
41
+ - **--trunk <branch>** (optional): Trunk branch name for Graphite tracking (defaults to prompting user, or 'main' if not specified)
42
+ - **--setup <script-or-command>** (optional): Setup script file path or inline command to run after creating the worktree
26
43
  - **linear_task_id** (optional): Linear task ID (e.g., DEV-1234) to complete autonomously in the new worktree
27
44
 
28
45
  ## Prerequisites
@@ -30,6 +47,7 @@ Optionally accepts a Linear task ID to automatically spawn a new Claude Code ins
30
47
  - git (2.5+ for worktree support)
31
48
  - claude CLI (for MCP registration and spawning new instances)
32
49
  - gh (optional, for PR creation)
50
+ - gt (optional, for Graphite integration)
33
51
 
34
52
  ## Workflow Steps
35
53
 
@@ -64,7 +82,36 @@ Registers the spec-workflow MCP with Claude for the new worktree directory:
64
82
  claude mcp add spec-workflow "npx @uniswap/spec-workflow-mcp@latest" "$NEW_DIR"
65
83
  ```
66
84
 
67
- ### Step 6: Optional Operations
85
+ ### Step 6: Graphite Integration (Optional)
86
+
87
+ If Graphite is enabled (via `--graphite` flag or user prompt):
88
+
89
+ 1. Prompts for trunk branch if not provided via `--trunk`
90
+ 2. Runs `gt track` in the new worktree to track the branch on top of the trunk branch
91
+
92
+ ```bash
93
+ gt track --trunk "$TRUNK_BRANCH"
94
+ ```
95
+
96
+ ### Step 7: Setup Script Execution (Optional)
97
+
98
+ If a setup script is provided (via `--setup` flag or user prompt):
99
+
100
+ 1. Detects whether the input is a file path or inline command
101
+ 2. If file: validates existence and executes it
102
+ 3. If inline command: executes directly in the worktree directory
103
+
104
+ ```bash
105
+ # File execution
106
+ if [[ -f "$SETUP_SCRIPT" ]]; then
107
+ bash "$SETUP_SCRIPT"
108
+ else
109
+ # Inline command execution
110
+ eval "$SETUP_SCRIPT"
111
+ fi
112
+ ```
113
+
114
+ ### Step 8: Optional Operations
68
115
 
69
116
  Interactive prompts for:
70
117
 
@@ -73,7 +120,7 @@ Interactive prompts for:
73
120
  - **Create PR**: Create a pull request via `gh` or provide URL for manual creation
74
121
  - **Cleanup**: Remove the worktree after work is complete
75
122
 
76
- ### Step 7: Linear Task Automation
123
+ ### Step 9: Linear Task Automation
77
124
 
78
125
  If a Linear task ID is provided, optionally spawns a new Claude Code instance to:
79
126
 
@@ -91,13 +138,68 @@ If a Linear task ID is provided, optionally spawns a new Claude Code instance to
91
138
  #!/usr/bin/env bash
92
139
  set -euo pipefail
93
140
 
94
- # Accept arguments from positional or env-provided variables (depending on Claude Code runtime)
95
- BRANCH="${1:-${branch:-}}"
96
- LINEAR_TASK_ID="${2:-${linear_task_id:-}}"
141
+ # Initialize variables
142
+ BRANCH=""
143
+ LINEAR_TASK_ID=""
144
+ USE_GRAPHITE=""
145
+ TRUNK_BRANCH=""
146
+ SETUP_SCRIPT=""
147
+
148
+ # Parse arguments
149
+ while [[ $# -gt 0 ]]; do
150
+ case "$1" in
151
+ --graphite|-g)
152
+ USE_GRAPHITE="true"
153
+ shift
154
+ ;;
155
+ --trunk)
156
+ if [[ -n "${2:-}" && ! "$2" =~ ^- ]]; then
157
+ TRUNK_BRANCH="$2"
158
+ shift 2
159
+ else
160
+ echo "Error: --trunk requires a branch name argument"
161
+ exit 1
162
+ fi
163
+ ;;
164
+ --setup)
165
+ if [[ -n "${2:-}" && ! "$2" =~ ^- ]]; then
166
+ SETUP_SCRIPT="$2"
167
+ shift 2
168
+ else
169
+ echo "Error: --setup requires a script path or command argument"
170
+ exit 1
171
+ fi
172
+ ;;
173
+ -*)
174
+ echo "Error: Unknown option: $1"
175
+ echo "Usage: <command> <branch-name> [--graphite| -g] [--trunk <branch>] [--setup <script-or-command>] [linear-task-id]"
176
+ exit 1
177
+ ;;
178
+ *)
179
+ # Positional arguments: first is branch, second is linear_task_id
180
+ if [[ -z "$BRANCH" ]]; then
181
+ BRANCH="$1"
182
+ elif [[ -z "$LINEAR_TASK_ID" ]]; then
183
+ LINEAR_TASK_ID="$1"
184
+ else
185
+ echo "Error: Unexpected argument: $1"
186
+ exit 1
187
+ fi
188
+ shift
189
+ ;;
190
+ esac
191
+ done
192
+
193
+ # Also check for env-provided variables as fallback
194
+ BRANCH="${BRANCH:-${branch:-}}"
195
+ LINEAR_TASK_ID="${LINEAR_TASK_ID:-${linear_task_id:-}}"
196
+ USE_GRAPHITE="${USE_GRAPHITE:-${use_graphite:-}}"
197
+ TRUNK_BRANCH="${TRUNK_BRANCH:-${trunk_branch:-}}"
198
+ SETUP_SCRIPT="${SETUP_SCRIPT:-${setup_script:-}}"
97
199
 
98
200
  if [[ -z "${BRANCH:-}" ]]; then
99
201
  echo "Error: branch name is required."
100
- echo "Usage: <command> <branch-name> [linear-task-id]"
202
+ echo "Usage: <command> <branch-name> [--graphite | -g] [--trunk <branch>] [--setup <script-or-command>] [linear-task-id]"
101
203
  exit 1
102
204
  fi
103
205
 
@@ -205,6 +307,98 @@ else
205
307
  echo " claude mcp add spec-workflow npx @uniswap/spec-workflow-mcp@latest \"$NEW_DIR\""
206
308
  fi
207
309
 
310
+ # Prompt for Graphite usage if not specified
311
+ if [[ -z "${USE_GRAPHITE:-}" ]]; then
312
+ echo ""
313
+ read -r -p "Use Graphite to track this branch? (y/N): " GRAPHITE_RESP || true
314
+ if [[ "$GRAPHITE_RESP" =~ ^[Yy]$ ]]; then
315
+ USE_GRAPHITE="true"
316
+ fi
317
+ fi
318
+
319
+ # Graphite integration
320
+ if [[ "${USE_GRAPHITE:-}" == "true" ]]; then
321
+ echo ""
322
+ echo "============================================"
323
+ echo "Graphite Integration"
324
+ echo "============================================"
325
+
326
+ if ! command -v gt >/dev/null 2>&1; then
327
+ echo "Warning: 'gt' (Graphite CLI) not found. Skipping Graphite setup."
328
+ echo "Install it from: https://graphite.dev/docs/installing-the-cli"
329
+ else
330
+ # Prompt for trunk branch if not provided
331
+ if [[ -z "${TRUNK_BRANCH:-}" ]]; then
332
+ DEFAULT_TRUNK="$(git -C "$NEW_DIR" remote show origin 2>/dev/null | sed -n 's/.*HEAD branch: //p')" || DEFAULT_TRUNK=""
333
+ DEFAULT_TRUNK="${DEFAULT_TRUNK:-main}"
334
+ read -r -p "Enter trunk branch name [$DEFAULT_TRUNK]: " TRUNK_INPUT || true
335
+ TRUNK_BRANCH="${TRUNK_INPUT:-$DEFAULT_TRUNK}"
336
+ fi
337
+
338
+ echo "Tracking branch '$BRANCH' on top of trunk '$TRUNK_BRANCH'..."
339
+ if ! gt -C "$NEW_DIR" track --trunk "$TRUNK_BRANCH"; then
340
+ echo "Warning: Failed to track branch with Graphite. You can run this manually:"
341
+ echo " cd \"$NEW_DIR\" && gt track --trunk \"$TRUNK_BRANCH\""
342
+ else
343
+ echo "Successfully tracked branch with Graphite."
344
+ fi
345
+ fi
346
+ fi
347
+
348
+ # Prompt for setup script if not provided
349
+ if [[ -z "${SETUP_SCRIPT:-}" ]]; then
350
+ echo ""
351
+ read -r -p "Run a setup script/command in the new worktree? (y/N): " SETUP_RESP || true
352
+ if [[ "$SETUP_RESP" =~ ^[Yy]$ ]]; then
353
+ read -r -p "Enter script path or inline command: " SETUP_SCRIPT || true
354
+ fi
355
+ fi
356
+
357
+ # Execute setup script if provided
358
+ if [[ -n "${SETUP_SCRIPT:-}" ]]; then
359
+ echo ""
360
+ echo "============================================"
361
+ echo "Running Setup Script"
362
+ echo "============================================"
363
+ echo "Executing: $SETUP_SCRIPT"
364
+ echo ""
365
+
366
+ # Change to the new worktree directory for script execution
367
+ pushd "$NEW_DIR" >/dev/null
368
+
369
+ # Check if it's a file path (absolute or relative to original directory)
370
+ SCRIPT_PATH=""
371
+ if [[ -f "$SETUP_SCRIPT" ]]; then
372
+ SCRIPT_PATH="$SETUP_SCRIPT"
373
+ elif [[ -f "$CWD/$SETUP_SCRIPT" ]]; then
374
+ SCRIPT_PATH="$CWD/$SETUP_SCRIPT"
375
+ elif [[ -f "$REPO_ROOT/$SETUP_SCRIPT" ]]; then
376
+ SCRIPT_PATH="$REPO_ROOT/$SETUP_SCRIPT"
377
+ fi
378
+
379
+ if [[ -n "$SCRIPT_PATH" ]]; then
380
+ echo "Running script file: $SCRIPT_PATH"
381
+ if [[ -x "$SCRIPT_PATH" ]]; then
382
+ "$SCRIPT_PATH"
383
+ else
384
+ bash "$SCRIPT_PATH"
385
+ fi
386
+ else
387
+ # Treat as inline command
388
+ echo "Running inline command..."
389
+ eval "$SETUP_SCRIPT"
390
+ fi
391
+
392
+ SETUP_EXIT_CODE=$?
393
+ popd >/dev/null
394
+
395
+ if [[ $SETUP_EXIT_CODE -eq 0 ]]; then
396
+ echo "Setup script completed successfully."
397
+ else
398
+ echo "Warning: Setup script exited with code $SETUP_EXIT_CODE"
399
+ fi
400
+ fi
401
+
208
402
  # Prompt for Linear task ID if not provided
209
403
  if [[ -z "${LINEAR_TASK_ID:-}" ]]; then
210
404
  echo ""
@@ -361,7 +555,8 @@ The command creates worktrees in a sibling directory pattern:
361
555
  - **Spec Workflow**: Symlinks `.spec-workflow` from the main repo to enable spec-workflow MCP functionality
362
556
  - **Claude Settings**: Copies local Claude settings to maintain consistent behavior
363
557
  - **Linear Integration**: Supports autonomous task completion when provided with a Linear task ID
364
- - **Graphite Compatible**: Works alongside Graphite for PR stack management
558
+ - **Graphite Integration**: Built-in support for `gt track` to manage branch stacks; tracks new branches on specified trunk
559
+ - **Setup Scripts**: Runs custom setup scripts or commands (e.g., `npm install`, `./scripts/setup.sh`) after worktree creation
365
560
 
366
561
  ## Merging Work Back
367
562
 
@@ -407,4 +602,46 @@ claude mcp add spec-workflow "npx @uniswap/spec-workflow-mcp@latest" "/path/to/w
407
602
 
408
603
  **Solution:** Install Claude Code from <https://claude.ai/download>
409
604
 
605
+ ### "gt (Graphite CLI) not found"
606
+
607
+ **Solution:** Install the Graphite CLI:
608
+
609
+ ```bash
610
+ npm install -g @withgraphite/graphite-cli
611
+ ```
612
+
613
+ Or follow the installation guide at <https://graphite.dev/docs/installing-the-cli>
614
+
615
+ ### "Failed to track branch with Graphite"
616
+
617
+ **Solution:** Ensure you're in a Graphite-enabled repository and the trunk branch exists:
618
+
619
+ ```bash
620
+ cd /path/to/worktree
621
+ gt init # If not already initialized
622
+ gt track --trunk main
623
+ ```
624
+
625
+ ### "Setup script failed"
626
+
627
+ **Solution:** Check that your script:
628
+
629
+ 1. Exists at the specified path (relative to CWD or repo root)
630
+ 2. Has proper execute permissions (`chmod +x script.sh`)
631
+ 3. Returns exit code 0 on success
632
+
633
+ You can test the script manually:
634
+
635
+ ```bash
636
+ cd /path/to/worktree
637
+ ./your-script.sh # or: bash your-script.sh
638
+ ```
639
+
640
+ ### "Setup command not found"
641
+
642
+ **Solution:** Inline commands are executed with `eval` in the worktree directory. Ensure:
643
+
644
+ 1. The command is available in your PATH
645
+ 2. You're using proper shell syntax for chained commands (`&&` for sequential, `;` for independent)
646
+
410
647
  Arguments: $ARGUMENTS
@@ -211,7 +211,7 @@ var init_addon_registry = __esm({
211
211
  mcp: {
212
212
  serverName: "slack",
213
213
  command: "npx",
214
- args: ["-y", "@zencoderai/slack-mcp-server", "--transport", "stdio"],
214
+ args: ["-y", "-p", "@zencoderai/slack-mcp-server", "slack-mcp"],
215
215
  env: {
216
216
  SLACK_BOT_TOKEN: "PROMPT_TO_INSERT_SLACK_BOT_TOKEN",
217
217
  SLACK_TEAM_ID: "TKZBCKUJJ"
@@ -162,7 +162,7 @@ echo "export AI_TOOLKIT_SKIP_UPDATE_CHECK=1" >> ~/.zshrc
162
162
 
163
163
  - If update checker installation fails, a warning is shown but installation continues
164
164
  - Failure is treated as non-critical (user can still use installed commands/agents)
165
- - Users are advised to report issues to #pod-dev-ai Slack channel
165
+ - Users are advised to report issues at <https://github.com/Uniswap/ai-toolkit/issues>
166
166
 
167
167
  ### Installation Modes
168
168
 
@@ -211,7 +211,7 @@ var init_addon_registry = __esm({
211
211
  mcp: {
212
212
  serverName: "slack",
213
213
  command: "npx",
214
- args: ["-y", "@zencoderai/slack-mcp-server", "--transport", "stdio"],
214
+ args: ["-y", "-p", "@zencoderai/slack-mcp-server", "slack-mcp"],
215
215
  env: {
216
216
  SLACK_BOT_TOKEN: "PROMPT_TO_INSERT_SLACK_BOT_TOKEN",
217
217
  SLACK_TEAM_ID: "TKZBCKUJJ"
@@ -922,13 +922,7 @@ function getCurrentToolkitVersion() {
922
922
  return packageJson.version;
923
923
  } catch (error) {
924
924
  import_devkit.logger.info("checking parent directory for package.json");
925
- const packageJsonPath = path.join(
926
- __dirname,
927
- "..",
928
- "..",
929
- "..",
930
- "package.json"
931
- );
925
+ const packageJsonPath = path.join(__dirname, "..", "..", "..", "package.json");
932
926
  const packageJson = JSON.parse(fs2.readFileSync(packageJsonPath, "utf-8"));
933
927
  return packageJson.version;
934
928
  }
@@ -977,7 +971,7 @@ _ai_toolkit_check_updates() {
977
971
  if command -v npm >/dev/null 2>&1; then
978
972
  if ! npm view @uniswap/ai-toolkit-nx-claude@latest version >/dev/null 2>&1; then
979
973
  echo "\u26A0\uFE0F Failed to check for AI Toolkit updates (npm registry unavailable)"
980
- echo "\u{1F41E} Please report this bug to the #pod-dev-ai Slack channel"
974
+ echo "\u{1F41E} Please report this bug at https://github.com/Uniswap/ai-toolkit/issues"
981
975
  return
982
976
  fi
983
977
 
@@ -1031,7 +1025,7 @@ function _ai_toolkit_check_updates
1031
1025
  if command -v npm >/dev/null 2>&1
1032
1026
  if not npm view @uniswap/ai-toolkit-nx-claude@latest version >/dev/null 2>&1
1033
1027
  echo "\u26A0\uFE0F Failed to check for AI Toolkit updates (npm registry unavailable)"
1034
- echo "\u{1F41E} Please report this bug to the #pod-dev-ai Slack channel"
1028
+ echo "\u{1F41E} Please report this bug at https://github.com/Uniswap/ai-toolkit/issues"
1035
1029
  return
1036
1030
  end
1037
1031
 
@@ -1063,19 +1057,14 @@ function installUpdateChecker(shell, version) {
1063
1057
  let configContent = fs2.readFileSync(configPath, "utf-8");
1064
1058
  const startMarker = "# AUTOMATED BY AI_TOOLKIT_UPDATE_CHECK";
1065
1059
  const endMarker = "# END AI_TOOLKIT_UPDATE_CHECK";
1066
- const blockRegex = new RegExp(
1067
- `${startMarker}[\\s\\S]*?${endMarker}\\n?`,
1068
- "g"
1069
- );
1060
+ const blockRegex = new RegExp(`${startMarker}[\\s\\S]*?${endMarker}\\n?`, "g");
1070
1061
  configContent = configContent.replace(blockRegex, "");
1071
1062
  const snippet = shell === "fish" ? generateFishAutoUpdateSnippet(version) : generateAutoUpdateSnippet(version);
1072
1063
  const prefix = configContent.trim() ? "\n\n" : "";
1073
1064
  const updatedContent = configContent + prefix + snippet + "\n";
1074
1065
  fs2.writeFileSync(configPath, updatedContent);
1075
1066
  import_devkit.logger.info(`\u2705 Update checker installed to ${configPath}`);
1076
- import_devkit.logger.info(
1077
- ` Checks once per week, disable with: export AI_TOOLKIT_SKIP_UPDATE_CHECK=1`
1078
- );
1067
+ import_devkit.logger.info(` Checks once per week, disable with: export AI_TOOLKIT_SKIP_UPDATE_CHECK=1`);
1079
1068
  }
1080
1069
 
1081
1070
  // packages/commands/agnostic/dist/src/index.js
@@ -1133,7 +1122,7 @@ var commands = {
1133
1122
  filePath: "./generate-commit-message.md"
1134
1123
  },
1135
1124
  "git-worktree-orchestrator": {
1136
- description: "Create and manage a git worktree based on the current directory and a branch name, with optional spec-workflow setup and Linear task automation.",
1125
+ description: "Create and manage a git worktree based on the current directory and a branch name, with optional spec-workflow setup, Graphite integration, and Linear task automation.",
1137
1126
  filePath: "./git-worktree-orchestrator.md"
1138
1127
  },
1139
1128
  "implement-spec": {
@@ -2816,13 +2805,7 @@ function showGeneralMcpInstructions(installedAddons) {
2816
2805
  }
2817
2806
 
2818
2807
  // packages/ai-toolkit-nx-claude/src/generators/init/generator.ts
2819
- var DEFAULT_COMMANDS = [
2820
- "explore",
2821
- "plan",
2822
- "review-plan",
2823
- "execute-plan",
2824
- "address-pr-issues"
2825
- ];
2808
+ var DEFAULT_COMMANDS = ["explore", "plan", "review-plan", "execute-plan", "address-pr-issues"];
2826
2809
  var DEFAULT_AGENTS = [
2827
2810
  "context-loader",
2828
2811
  "planner",
@@ -2866,17 +2849,13 @@ async function initGenerator(tree, options) {
2866
2849
  import_devkit7.logger.info("\u{1F50D} DRY RUN: Claude CLI is not installed");
2867
2850
  import_devkit7.logger.info("Would attempt installation in this order:");
2868
2851
  import_devkit7.logger.info(" 1. curl -fsSL https://claude.ai/install.sh | bash");
2869
- import_devkit7.logger.info(
2870
- " 2. npm install -g @anthropic-ai/claude-code (if curl fails)"
2871
- );
2852
+ import_devkit7.logger.info(" 2. npm install -g @anthropic-ai/claude-code (if curl fails)");
2872
2853
  import_devkit7.logger.info(" 3. Manual instructions (if both fail)");
2873
2854
  }
2874
2855
  const installMode = options.installMode;
2875
2856
  if (installMode === "default") {
2876
2857
  import_devkit7.logger.info("\u{1F4E6} Default Installation Mode");
2877
- import_devkit7.logger.info(
2878
- " Installing recommended setup with pre-selected components\n"
2879
- );
2858
+ import_devkit7.logger.info(" Installing recommended setup with pre-selected components\n");
2880
2859
  options.installMode = "default";
2881
2860
  options.installationType = "global";
2882
2861
  options.commands = DEFAULT_COMMANDS;
@@ -2905,16 +2884,10 @@ async function initGenerator(tree, options) {
2905
2884
  }
2906
2885
  const schemaPath = path5.join(__dirname, "schema.json");
2907
2886
  const commandDescriptions = Object.fromEntries(
2908
- Object.entries(commands).map(([key, value]) => [
2909
- key,
2910
- value.description
2911
- ])
2887
+ Object.entries(commands).map(([key, value]) => [key, value.description])
2912
2888
  );
2913
2889
  const agentDescriptions = Object.fromEntries(
2914
- Object.entries(agents).map(([key, value]) => [
2915
- key,
2916
- value.description
2917
- ])
2890
+ Object.entries(agents).map(([key, value]) => [key, value.description])
2918
2891
  );
2919
2892
  const homeDir = os4.homedir();
2920
2893
  const globalDir = path5.join(homeDir, ".claude");
@@ -2924,21 +2897,13 @@ async function initGenerator(tree, options) {
2924
2897
  "commands",
2925
2898
  Object.keys(commands)
2926
2899
  );
2927
- const globalExistingAgents = checkExistingFiles(
2928
- globalDir,
2929
- "agents",
2930
- Object.keys(agents)
2931
- );
2900
+ const globalExistingAgents = checkExistingFiles(globalDir, "agents", Object.keys(agents));
2932
2901
  const localExistingCommands = checkExistingFiles(
2933
2902
  localDir,
2934
2903
  "commands",
2935
2904
  Object.keys(commands)
2936
2905
  );
2937
- const localExistingAgents = checkExistingFiles(
2938
- localDir,
2939
- "agents",
2940
- Object.keys(agents)
2941
- );
2906
+ const localExistingAgents = checkExistingFiles(localDir, "agents", Object.keys(agents));
2942
2907
  const optionsWithNoInteractive = {
2943
2908
  ...options,
2944
2909
  "no-interactive": nxNoInteractiveProvided || options.nonInteractive
@@ -2975,15 +2940,11 @@ async function initGenerator(tree, options) {
2975
2940
  }
2976
2941
  if (normalizedOptions.commandSelectionMode === "all") {
2977
2942
  normalizedOptions.commands = Object.keys(commands);
2978
- import_devkit7.logger.info(
2979
- `\u{1F4DD} All commands selected (${normalizedOptions.commands.length} total)`
2980
- );
2943
+ import_devkit7.logger.info(`\u{1F4DD} All commands selected (${normalizedOptions.commands.length} total)`);
2981
2944
  }
2982
2945
  if (normalizedOptions.agentSelectionMode === "all") {
2983
2946
  normalizedOptions.agents = Object.keys(agents);
2984
- import_devkit7.logger.info(
2985
- `\u{1F916} All agents selected (${normalizedOptions.agents.length} total)`
2986
- );
2947
+ import_devkit7.logger.info(`\u{1F916} All agents selected (${normalizedOptions.agents.length} total)`);
2987
2948
  }
2988
2949
  if (normalizedOptions.installCommands === false) {
2989
2950
  normalizedOptions.commands = [];
@@ -3018,24 +2979,14 @@ async function initGenerator(tree, options) {
3018
2979
  const commandsToInstall = normalizedOptions.commands || [];
3019
2980
  for (const commandName of commandsToInstall) {
3020
2981
  let sourcePath = null;
3021
- const bundledContentDir = path5.join(
3022
- __dirname,
3023
- "..",
3024
- "..",
3025
- "content",
3026
- "commands"
3027
- );
2982
+ const bundledContentDir = path5.join(__dirname, "..", "..", "content", "commands");
3028
2983
  if (fs5.existsSync(bundledContentDir)) {
3029
2984
  const contentSubDirs = fs5.readdirSync(bundledContentDir).filter((item) => {
3030
2985
  const itemPath = path5.join(bundledContentDir, item);
3031
2986
  return fs5.statSync(itemPath).isDirectory();
3032
2987
  });
3033
2988
  for (const subDir of contentSubDirs) {
3034
- const potentialPath = path5.join(
3035
- bundledContentDir,
3036
- subDir,
3037
- `${commandName}.md`
3038
- );
2989
+ const potentialPath = path5.join(bundledContentDir, subDir, `${commandName}.md`);
3039
2990
  if (fs5.existsSync(potentialPath)) {
3040
2991
  sourcePath = potentialPath;
3041
2992
  break;
@@ -3050,12 +3001,7 @@ async function initGenerator(tree, options) {
3050
3001
  return fs5.statSync(itemPath).isDirectory();
3051
3002
  });
3052
3003
  for (const subDir of commandSubDirs) {
3053
- const potentialPath = path5.join(
3054
- commandsBaseDir,
3055
- subDir,
3056
- "src",
3057
- `${commandName}.md`
3058
- );
3004
+ const potentialPath = path5.join(commandsBaseDir, subDir, "src", `${commandName}.md`);
3059
3005
  if (fs5.existsSync(potentialPath)) {
3060
3006
  sourcePath = potentialPath;
3061
3007
  break;
@@ -3064,10 +3010,7 @@ async function initGenerator(tree, options) {
3064
3010
  }
3065
3011
  }
3066
3012
  const destPath = path5.join(commandsDir, `${commandName}.md`);
3067
- const relativeDestPath = path5.join(
3068
- relativeCommandsDir,
3069
- `${commandName}.md`
3070
- );
3013
+ const relativeDestPath = path5.join(relativeCommandsDir, `${commandName}.md`);
3071
3014
  try {
3072
3015
  if (sourcePath && fs5.existsSync(sourcePath)) {
3073
3016
  const content = fs5.readFileSync(sourcePath, "utf-8");
@@ -3086,24 +3029,14 @@ async function initGenerator(tree, options) {
3086
3029
  const agentsToInstall = normalizedOptions.agents || [];
3087
3030
  for (const agentName of agentsToInstall) {
3088
3031
  let sourcePath = null;
3089
- const bundledContentDir = path5.join(
3090
- __dirname,
3091
- "..",
3092
- "..",
3093
- "content",
3094
- "agents"
3095
- );
3032
+ const bundledContentDir = path5.join(__dirname, "..", "..", "content", "agents");
3096
3033
  if (fs5.existsSync(bundledContentDir)) {
3097
3034
  const contentSubDirs = fs5.readdirSync(bundledContentDir).filter((item) => {
3098
3035
  const itemPath = path5.join(bundledContentDir, item);
3099
3036
  return fs5.statSync(itemPath).isDirectory();
3100
3037
  });
3101
3038
  for (const subDir of contentSubDirs) {
3102
- const potentialPath = path5.join(
3103
- bundledContentDir,
3104
- subDir,
3105
- `${agentName}.md`
3106
- );
3039
+ const potentialPath = path5.join(bundledContentDir, subDir, `${agentName}.md`);
3107
3040
  if (fs5.existsSync(potentialPath)) {
3108
3041
  sourcePath = potentialPath;
3109
3042
  break;
@@ -3118,12 +3051,7 @@ async function initGenerator(tree, options) {
3118
3051
  return fs5.statSync(itemPath).isDirectory();
3119
3052
  });
3120
3053
  for (const subDir of agentSubDirs) {
3121
- const potentialPath = path5.join(
3122
- agentsBaseDir,
3123
- subDir,
3124
- "src",
3125
- `${agentName}.md`
3126
- );
3054
+ const potentialPath = path5.join(agentsBaseDir, subDir, "src", `${agentName}.md`);
3127
3055
  if (fs5.existsSync(potentialPath)) {
3128
3056
  sourcePath = potentialPath;
3129
3057
  break;
@@ -3164,9 +3092,7 @@ async function initGenerator(tree, options) {
3164
3092
  import_devkit7.logger.info(" - Add update check script to your shell configuration");
3165
3093
  import_devkit7.logger.info(" - Checks once per week for new versions");
3166
3094
  import_devkit7.logger.info(" - Runs in background (non-blocking)");
3167
- import_devkit7.logger.info(
3168
- " - Can be disabled with: export AI_TOOLKIT_SKIP_UPDATE_CHECK=1"
3169
- );
3095
+ import_devkit7.logger.info(" - Can be disabled with: export AI_TOOLKIT_SKIP_UPDATE_CHECK=1");
3170
3096
  return;
3171
3097
  }
3172
3098
  if (!isDryRun) {
@@ -3192,7 +3118,7 @@ async function initGenerator(tree, options) {
3192
3118
  } catch (error) {
3193
3119
  import_devkit7.logger.warn(`\u26A0\uFE0F Failed to install update checker: ${error}`);
3194
3120
  import_devkit7.logger.info(
3195
- "This is a bug in ai-toolkit, please report it to the #pod-dev-ai Slack channel"
3121
+ "This is a bug in ai-toolkit, please report it at https://github.com/Uniswap/ai-toolkit/issues"
3196
3122
  );
3197
3123
  }
3198
3124
  if (normalizedOptions.installHooks) {
@@ -3257,15 +3183,11 @@ async function initGenerator(tree, options) {
3257
3183
  }
3258
3184
  } else {
3259
3185
  if (normalizedOptions.installHooks) {
3260
- import_devkit7.logger.info(
3261
- "\n\u{1F50D} DRY RUN: Would install notification hooks (sound mode)"
3262
- );
3186
+ import_devkit7.logger.info("\n\u{1F50D} DRY RUN: Would install notification hooks (sound mode)");
3263
3187
  }
3264
3188
  const installAddonsExplicit = explicitlyProvided.has("installAddons") || explicitlyProvided.has("install-addons");
3265
3189
  if (normalizedOptions.installMode === "custom" && !installAddonsExplicit && !normalizedOptions.nonInteractive) {
3266
- import_devkit7.logger.info(
3267
- "\n\u{1F50D} DRY RUN: Would prompt to install spec-mcp-workflow addon after hooks"
3268
- );
3190
+ import_devkit7.logger.info("\n\u{1F50D} DRY RUN: Would prompt to install spec-mcp-workflow addon after hooks");
3269
3191
  } else if (normalizedOptions.installAddons) {
3270
3192
  import_devkit7.logger.info("\n\u{1F50D} DRY RUN: Would install spec-mcp-workflow addon");
3271
3193
  }
@@ -3359,9 +3281,7 @@ async function verifyInstallation2(method) {
3359
3281
  import_devkit7.logger.info('You can also run "claude --version" to verify');
3360
3282
  } catch {
3361
3283
  import_devkit7.logger.warn("\u26A0\uFE0F Claude CLI not found in PATH");
3362
- import_devkit7.logger.info(
3363
- "You may need to restart your terminal or add Claude to your PATH"
3364
- );
3284
+ import_devkit7.logger.info("You may need to restart your terminal or add Claude to your PATH");
3365
3285
  }
3366
3286
  }
3367
3287
  function provideManualInstructions() {
@@ -3369,12 +3289,8 @@ function provideManualInstructions() {
3369
3289
  import_devkit7.logger.info("\n\u{1F4DA} Manual Installation Instructions:");
3370
3290
  import_devkit7.logger.info("1. Via curl: curl -fsSL https://claude.ai/install.sh | bash");
3371
3291
  import_devkit7.logger.info("2. Via npm: npm install -g @anthropic-ai/claude-code");
3372
- import_devkit7.logger.info(
3373
- "3. Visit: https://claude.ai/download for platform-specific instructions"
3374
- );
3375
- import_devkit7.logger.info(
3376
- '\nFor troubleshooting, run "claude doctor" after manual installation'
3377
- );
3292
+ import_devkit7.logger.info("3. Visit: https://claude.ai/download for platform-specific instructions");
3293
+ import_devkit7.logger.info('\nFor troubleshooting, run "claude doctor" after manual installation');
3378
3294
  }
3379
3295
  var generator_default2 = initGenerator;
3380
3296
  // Annotate the CommonJS export names for ESM import in node:
package/dist/index.cjs CHANGED
@@ -211,7 +211,7 @@ var init_addon_registry = __esm({
211
211
  mcp: {
212
212
  serverName: "slack",
213
213
  command: "npx",
214
- args: ["-y", "@zencoderai/slack-mcp-server", "--transport", "stdio"],
214
+ args: ["-y", "-p", "@zencoderai/slack-mcp-server", "slack-mcp"],
215
215
  env: {
216
216
  SLACK_BOT_TOKEN: "PROMPT_TO_INSERT_SLACK_BOT_TOKEN",
217
217
  SLACK_TEAM_ID: "TKZBCKUJJ"
@@ -1 +1 @@
1
- {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../../../../../src/generators/init/generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAOvC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AA+DpD,wBAAsB,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,mBAAmB,iBA0jB3E;AAqJD,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../../../../../src/generators/init/generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAOvC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAyDpD,wBAAsB,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,mBAAmB,iBAif3E;AA4ID,eAAe,aAAa,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"auto-update-utils.d.ts","sourceRoot":"","sources":["../../../../../src/utils/auto-update-utils.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAEhD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAqBjD;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,SAAS,CAKvC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAQ3D;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CA8CjE;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAoDrE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CA0C5E"}
1
+ {"version":3,"file":"auto-update-utils.d.ts","sourceRoot":"","sources":["../../../../../src/utils/auto-update-utils.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAEhD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAejD;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,SAAS,CAKvC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAQ3D;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CA8CjE;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAoDrE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAmC5E"}
package/package.json CHANGED
@@ -1,17 +1,17 @@
1
1
  {
2
2
  "name": "@uniswap/ai-toolkit-nx-claude",
3
- "version": "0.5.23",
3
+ "version": "0.5.24-next.0",
4
4
  "private": false,
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.cjs",
7
7
  "types": "./dist/index.d.ts",
8
8
  "repository": {
9
9
  "type": "git",
10
- "url": "git+https://github.com/uniswap/ai-toolkit.git",
10
+ "url": "https://github.com/Uniswap/ai-toolkit.git",
11
11
  "directory": "packages/ai-toolkit-nx-claude"
12
12
  },
13
13
  "publishConfig": {
14
- "access": "restricted"
14
+ "access": "public"
15
15
  },
16
16
  "bin": {
17
17
  "ai-toolkit-nx-claude": "dist/cli-generator.cjs",