Files
Claude-Code-Workflow/.claude/skills/command-generator/phases/02-target-path-resolution.md
catlog22 3b92bfae8c feat: add Discuss and Explore subagents for dynamic critique and code exploration
- Implement Discuss Subagent for multi-perspective critique with dynamic perspectives.
- Create Explore Subagent for shared codebase exploration with centralized caching.
- Add tests for CcwToolsMcpCard component to ensure enabled tools are preserved on config save.
- Introduce SessionPreviewPanel component for previewing and selecting sessions for Memory V2 extraction.
- Develop CommandCreateDialog component for creating/importing commands with import and CLI generate modes.
2026-02-27 17:25:52 +08:00

3.7 KiB

Phase 2: Target Path Resolution

Resolve the target commands directory based on location parameter.

Objective

Determine the correct target path for the command file based on:

  • location: "project" or "user" scope
  • group: Optional subdirectory for command organization
  • skillName: Command filename (with .md extension)

Input

From Phase 1 validation:

{
  skillName: string,      // e.g., "create"
  description: string,
  location: "project" | "user",
  group: string | null,   // e.g., "issue"
  argumentHint: string
}

Path Resolution Rules

Location Mapping

const locationMap = {
  project: '.claude/commands',
  user: '~/.claude/commands'  // Expands to user home directory
};

Path Construction

function resolveTargetPath(params) {
  const baseDir = locationMap[params.location];
  
  if (!baseDir) {
    throw new Error(`Invalid location: ${params.location}. Must be "project" or "user".`);
  }
  
  // Expand ~ to user home if present
  const expandedBase = baseDir.startsWith('~') 
    ? path.join(os.homedir(), baseDir.slice(1))
    : baseDir;
  
  // Build full path
  let targetPath;
  if (params.group) {
    // Grouped command: .claude/commands/{group}/{skillName}.md
    targetPath = path.join(expandedBase, params.group, `${params.skillName}.md`);
  } else {
    // Top-level command: .claude/commands/{skillName}.md
    targetPath = path.join(expandedBase, `${params.skillName}.md`);
  }
  
  return targetPath;
}

Execution Steps

Step 1: Get Base Directory

const location = validatedParams.location;
const baseDir = locationMap[location];

if (!baseDir) {
  throw new Error(`Invalid location: ${location}. Must be "project" or "user".`);
}

Step 2: Expand User Path (if applicable)

const os = require('os');
const path = require('path');

let expandedBase = baseDir;
if (baseDir.startsWith('~')) {
  expandedBase = path.join(os.homedir(), baseDir.slice(1));
}

Step 3: Construct Full Path

let targetPath;
let targetDir;

if (validatedParams.group) {
  // Command with group subdirectory
  targetDir = path.join(expandedBase, validatedParams.group);
  targetPath = path.join(targetDir, `${validatedParams.skillName}.md`);
} else {
  // Top-level command
  targetDir = expandedBase;
  targetPath = path.join(targetDir, `${validatedParams.skillName}.md`);
}

Step 4: Ensure Target Directory Exists

// Check and create directory if needed
Bash(`mkdir -p "${targetDir}"`);

Step 5: Check File Existence

const fileExists = Bash(`test -f "${targetPath}" && echo "EXISTS" || echo "NOT_FOUND"`);

if (fileExists.includes('EXISTS')) {
  console.warn(`Warning: Command file already exists at ${targetPath}. Will overwrite.`);
}

Output

{
  status: 'resolved',
  targetPath: targetPath,     // Full path to command file
  targetDir: targetDir,       // Directory containing command
  fileName: `${skillName}.md`,
  fileExists: fileExists.includes('EXISTS'),
  params: validatedParams     // Pass through to next phase
}

Path Examples

Project Scope (No Group)

location: "project"
skillName: "deploy"
-> .claude/commands/deploy.md

Project Scope (With Group)

location: "project"
skillName: "create"
group: "issue"
-> .claude/commands/issue/create.md

User Scope (No Group)

location: "user"
skillName: "global-status"
-> ~/.claude/commands/global-status.md

User Scope (With Group)

location: "user"
skillName: "sync"
group: "session"
-> ~/.claude/commands/session/sync.md

Next Phase

Proceed to Phase 3: Template Loading with targetPath and params.