mirror of
https://github.com/catlog22/Claude-Code-Workflow.git
synced 2026-03-01 11:13:25 +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.
172 lines
3.7 KiB
Markdown
172 lines
3.7 KiB
Markdown
# 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:
|
|
```javascript
|
|
{
|
|
skillName: string, // e.g., "create"
|
|
description: string,
|
|
location: "project" | "user",
|
|
group: string | null, // e.g., "issue"
|
|
argumentHint: string
|
|
}
|
|
```
|
|
|
|
## Path Resolution Rules
|
|
|
|
### Location Mapping
|
|
|
|
```javascript
|
|
const locationMap = {
|
|
project: '.claude/commands',
|
|
user: '~/.claude/commands' // Expands to user home directory
|
|
};
|
|
```
|
|
|
|
### Path Construction
|
|
|
|
```javascript
|
|
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
|
|
|
|
```javascript
|
|
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)
|
|
|
|
```javascript
|
|
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
|
|
|
|
```javascript
|
|
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
|
|
|
|
```javascript
|
|
// Check and create directory if needed
|
|
Bash(`mkdir -p "${targetDir}"`);
|
|
```
|
|
|
|
### Step 5: Check File Existence
|
|
|
|
```javascript
|
|
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
|
|
|
|
```javascript
|
|
{
|
|
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](03-template-loading.md) with `targetPath` and `params`.
|