Port Allocator
Smart port allocator that only assigns ports to real projects containing package.json.
Usage
| Command | Description |
|---|---|
/port-allocator | Allocate/query port for current project |
/port-allocator list | List all allocated ports |
/port-allocator scan | Scan code directory, discover and allocate ports for new projects |
/port-allocator config <path> | Set the main code directory path |
/port-allocator add <dir-path> | Manually add port allocation for a project |
/port-allocator allow | Configure Claude Code permissions for this skill's commands |
Important Rules
1. Only Operate on Current Project's Ports When Restarting Services
When restarting the development server, only kill processes within the current project's port range, never affect other ports:
bash# Correct: Only kill current project ports (e.g., 3000-3009) lsof -ti:3000 | xargs kill -9 2>/dev/null lsof -ti:3001 | xargs kill -9 2>/dev/null # Wrong: Kill all node processes or other ports pkill -f node # Will affect other projects! lsof -ti:3010 | xargs kill # This is another project's port!
2. Append Rather Than Overwrite When Updating CLAUDE.md
When updating ~/.claude/CLAUDE.md, must preserve the user's existing content:
bash# Correct: Check and append or update specific sections # Wrong: Directly overwrite the entire file
Execution Steps
Command: /port-allocator allow
Configure Claude Code to allow commands used by this skill, avoiding manual confirmation each time:
- Read
~/.claude/settings.json(if exists) - Merge the following commands into
permissions.allowarray (preserve existing config):
json{ "permissions": { "allow": [ "Bash(ls -d *)", "Bash(find * -maxdepth * -name package.json *)", "Bash(cat ~/.claude/*)", "Bash(dirname *)", "Bash(lsof -i:3*)", "Bash(lsof -ti:3*)" ] } }
- Write updated settings.json
- Output the list of added permissions
Output Format:
Configured Claude Code permissions Added allowed command patterns: - Bash(ls -d *) - Bash(find * -maxdepth * -name package.json *) - Bash(cat ~/.claude/*) - Bash(lsof -i:3*) - Bash(lsof -ti:3*) Config file: ~/.claude/settings.json
Command: /port-allocator config <path>
Set the user's main code directory:
- Verify path exists (required! Error and exit if not found)
- Update
code_rootfield in~/.claude/port-registry.json - Output confirmation
First Run: Auto-Detection
On first run (when ~/.claude/port-registry.json doesn't exist or has no code_root), automatically detect the code directory:
bash# Check common code directories for dir in ~/Codes ~/Code ~/Projects ~/Dev ~/Development ~/repos; do if [ -d "$dir" ]; then CODE_ROOT="$dir" break fi done # If none exist, default to ~/Codes CODE_ROOT="${CODE_ROOT:-~/Codes}"
Auto-detection output:
First run, detecting code directory... Code directory detected: ~/Codes Port registry initialized: ~/.claude/port-registry.json To change, use: /port-allocator config ~/your/code/path
If no directory found:
Could not auto-detect code directory. Please configure manually: /port-allocator config ~/your/code/path Common locations: ~/Codes, ~/Code, ~/Projects, ~/Dev
Command: /port-allocator scan
Scan code directory, automatically discover and register projects:
- Read
~/.claude/port-registry.jsonto getcode_root- If config doesn't exist, run auto-detection first
- If
code_rootdirectory doesn't exist, prompt user to configure
- Find all directories containing
package.json(exact to package.json location):
bash# Find all package.json, exclude build artifact directories find <code_root> -maxdepth 3 -name "package.json" -type f \ -not -path "*/.next/*" \ -not -path "*/node_modules/*" \ -not -path "*/dist/*" \ -not -path "*/build/*" | while read pkg; do dirname "$pkg" done
-
Important: Path must be exact to the directory containing
package.json- Correct:
~/Codes/chekusu/landing - Wrong:
~/Codes/chekusu(if package.json is in subdirectory)
- Correct:
-
For each discovered project directory:
- Check if already in registry
- If not, allocate next available port range
-
Update config file (append mode, don't overwrite user content)
-
Output scan result summary
Command: /port-allocator (default)
Allocate/query port for current project:
- Get current working directory
- Read config to get
code_rootand allocated ports - Match current directory to corresponding project
- If no
package.json, indicate this is not a project needing ports - If exists, check if port already allocated, auto-allocate if not
- Output port info
Command: /port-allocator list
List all allocated ports (read-only operation).
Output Format
Port Information
Project directory: ~/Codes/chekusu/landing package.json: Detected Port range: 3000-3009 - Main app: 3000 - API: 3001 - Other services: 3002-3009 Warning: Only operate on ports 3000-3009 when restarting services!
Scan Results
Scan complete: ~/Codes Registered projects (N): - chekusu/landing: 3000-3009 - saifuri: 3010-3019 Newly discovered projects (M): - new-project: 3090-3099 (newly allocated) Skipped (K): - .next, node_modules (build artifacts) - research-folder (no package.json)
Port Allocation Rules
- Each project is allocated 10 consecutive ports
- Starting port: 3000
- Interval: 10
x0: Main application (e.g., 3000, 3010, 3020)x1: API service (e.g., 3001, 3011, 3021)x2-x9: Other services (database, cache, etc.)
Configuration Files
- Port registry:
~/.claude/port-registry.json - Global instructions:
~/.claude/CLAUDE.md(append mode updates) - Claude Code settings:
~/.claude/settings.json(stores allowedCommands) - Skip patterns:
.next,node_modules,dist,build
Notes
- Only operate on project ports - Never affect other projects when restarting services
- Append not overwrite - Preserve user's existing content when updating config files
- Precise paths - Point to actual directory containing package.json
- Skip build artifacts - .next, node_modules, etc. don't get port allocation
- First use - Recommend running
/port-allocator allowto configure permissions first


