mirror of
https://github.com/catlog22/Claude-Code-Workflow.git
synced 2026-02-28 09:23:08 +08:00
- 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.
3.7 KiB
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.