Files
gh-duongdev-ccpm/commands/_shared-project-config-loader.md
2025-11-29 18:24:24 +08:00

6.7 KiB
Raw Blame History

Shared Project Configuration Loader

Include this in commands that need project configuration.

Usage

Add this to your command file where you need to load project config:

**LOAD PROJECT CONFIG** (see `_shared-project-config-loader.md`)

Configuration Loader Code

# ============================================================================
# Project Configuration Loader
# ============================================================================

CONFIG_FILE="$HOME/.claude/ccpm-config.yaml"

# Check if config file exists
if [[ ! -f "$CONFIG_FILE" ]]; then
  echo "❌ Error: CCPM configuration not found"
  echo ""
  echo "Create configuration:"
  echo "  /ccpm:project:add <project-id>"
  echo ""
  echo "Or copy example:"
  echo "  cp ~/.claude/plugins/ccpm/ccpm-config.example.yaml ~/.claude/ccpm-config.yaml"
  exit 1
fi

# Get project ID from argument (adjust $INDEX based on your command)
# For most commands: $2 is project ID
# Adjust this based on your command's argument structure
PROJECT_ID="${PROJECT_ARG}"  # Set PROJECT_ARG before including this

# If no project specified, try active project
if [[ -z "$PROJECT_ID" ]]; then
  PROJECT_ID=$(yq eval '.context.current_project' "$CONFIG_FILE" 2>/dev/null)

  if [[ "$PROJECT_ID" == "null" ]] || [[ -z "$PROJECT_ID" ]]; then
    # No active project - list available and exit
    echo "⚠️  No project specified and no active project set"
    echo ""
    echo "Available projects:"
    yq eval '.projects | keys | .[]' "$CONFIG_FILE"
    echo ""
    echo "To use this command:"
    echo "  1. Set active project: /ccpm:project:set <project-id>"
    echo "  2. Or specify in command: <command> ... <project-id>"
    echo ""
    echo "To add a new project:"
    echo "  /ccpm:project:add <project-id>"
    exit 1
  fi

  echo "  Using active project: $PROJECT_ID"
fi

# Validate project exists in configuration
if ! yq eval ".projects.$PROJECT_ID" "$CONFIG_FILE" > /dev/null 2>&1; then
  echo "❌ Error: Project '$PROJECT_ID' not found"
  echo ""
  echo "Available projects:"
  yq eval '.projects | keys | .[]' "$CONFIG_FILE"
  echo ""
  echo "Add project:"
  echo "  /ccpm:project:add $PROJECT_ID"
  exit 1
fi

# Load all project settings into variables
PROJECT_NAME=$(yq eval ".projects.$PROJECT_ID.name" "$CONFIG_FILE")
PROJECT_DESCRIPTION=$(yq eval ".projects.$PROJECT_ID.description" "$CONFIG_FILE")

# Linear configuration
LINEAR_TEAM=$(yq eval ".projects.$PROJECT_ID.linear.team" "$CONFIG_FILE")
LINEAR_PROJECT=$(yq eval ".projects.$PROJECT_ID.linear.project" "$CONFIG_FILE")
LINEAR_DEFAULT_LABELS=$(yq eval ".projects.$PROJECT_ID.linear.default_labels[]" "$CONFIG_FILE" | tr '\n' ',' | sed 's/,$//')

# External PM configuration
EXTERNAL_PM_ENABLED=$(yq eval ".projects.$PROJECT_ID.external_pm.enabled" "$CONFIG_FILE")
EXTERNAL_PM_TYPE=$(yq eval ".projects.$PROJECT_ID.external_pm.type" "$CONFIG_FILE")

# Jira configuration (if enabled)
if [[ "$EXTERNAL_PM_ENABLED" == "true" ]] && [[ "$EXTERNAL_PM_TYPE" == "jira" ]]; then
  JIRA_ENABLED=$(yq eval ".projects.$PROJECT_ID.external_pm.jira.enabled" "$CONFIG_FILE")
  JIRA_BASE_URL=$(yq eval ".projects.$PROJECT_ID.external_pm.jira.base_url" "$CONFIG_FILE")
  JIRA_PROJECT_KEY=$(yq eval ".projects.$PROJECT_ID.external_pm.jira.project_key" "$CONFIG_FILE")

  CONFLUENCE_ENABLED=$(yq eval ".projects.$PROJECT_ID.external_pm.confluence.enabled" "$CONFIG_FILE")
  CONFLUENCE_BASE_URL=$(yq eval ".projects.$PROJECT_ID.external_pm.confluence.base_url" "$CONFIG_FILE")
  CONFLUENCE_SPACE_KEY=$(yq eval ".projects.$PROJECT_ID.external_pm.confluence.space_key" "$CONFIG_FILE")

  SLACK_ENABLED=$(yq eval ".projects.$PROJECT_ID.external_pm.slack.enabled" "$CONFIG_FILE")
  SLACK_WORKSPACE=$(yq eval ".projects.$PROJECT_ID.external_pm.slack.workspace" "$CONFIG_FILE")
fi

# Repository configuration
REPO_TYPE=$(yq eval ".projects.$PROJECT_ID.code_repository.type" "$CONFIG_FILE")

if [[ "$REPO_TYPE" == "github" ]]; then
  GITHUB_OWNER=$(yq eval ".projects.$PROJECT_ID.code_repository.github.owner" "$CONFIG_FILE")
  GITHUB_REPO=$(yq eval ".projects.$PROJECT_ID.code_repository.github.repo" "$CONFIG_FILE")
elif [[ "$REPO_TYPE" == "bitbucket" ]]; then
  BITBUCKET_WORKSPACE=$(yq eval ".projects.$PROJECT_ID.code_repository.bitbucket.workspace" "$CONFIG_FILE")
  BITBUCKET_REPO=$(yq eval ".projects.$PROJECT_ID.code_repository.bitbucket.repo_slug" "$CONFIG_FILE")
  BITBUCKET_BASE_URL=$(yq eval ".projects.$PROJECT_ID.code_repository.bitbucket.base_url" "$CONFIG_FILE")
fi

# Display loaded configuration (optional - for debugging)
echo "✅ Loaded project configuration: $PROJECT_NAME"
echo "   Linear: $LINEAR_TEAM / $LINEAR_PROJECT"
echo "   External PM: $([ "$EXTERNAL_PM_ENABLED" = "true" ] && echo "$EXTERNAL_PM_TYPE" || echo "disabled")"
echo ""

# ============================================================================
# Available Variables After Loading:
# ============================================================================
# - PROJECT_ID: Project identifier
# - PROJECT_NAME: Human-readable project name
# - PROJECT_DESCRIPTION: Project description
#
# Linear:
# - LINEAR_TEAM: Linear team name
# - LINEAR_PROJECT: Linear project name
# - LINEAR_DEFAULT_LABELS: Comma-separated labels
#
# External PM:
# - EXTERNAL_PM_ENABLED: true/false
# - EXTERNAL_PM_TYPE: jira/github/linear-only
#
# Jira (if enabled):
# - JIRA_ENABLED: true/false
# - JIRA_BASE_URL: https://jira.company.com
# - JIRA_PROJECT_KEY: PROJ
# - CONFLUENCE_ENABLED: true/false
# - CONFLUENCE_BASE_URL: https://confluence.company.com
# - CONFLUENCE_SPACE_KEY: PROJ
# - SLACK_ENABLED: true/false
# - SLACK_WORKSPACE: company-workspace
#
# Repository:
# - REPO_TYPE: github/bitbucket/gitlab
# - GITHUB_OWNER, GITHUB_REPO (if GitHub)
# - BITBUCKET_WORKSPACE, BITBUCKET_REPO, BITBUCKET_BASE_URL (if BitBucket)
# ============================================================================

Example Usage in Commands

In planning:create.md

## Load Project Configuration

Set the project argument index:
```bash
PROJECT_ARG="$2"  # $2 is the project ID in this command

LOAD PROJECT CONFIG (see _shared-project-config-loader.md)

Now you can use all the loaded variables:

  • ${LINEAR_TEAM}
  • ${LINEAR_PROJECT}
  • ${JIRA_ENABLED}
  • etc.

### In planning:plan.md

```markdown
## Load Project Configuration

Set the project argument:
```bash
# Extract from Linear issue or use argument
PROJECT_ARG=$(get_project_from_issue "$1")  # Or $2, etc.

LOAD PROJECT CONFIG (see _shared-project-config-loader.md)


## Notes

- Commands must set `PROJECT_ARG` before loading
- All variables are available after loading
- Handles active project fallback automatically
- Provides helpful error messages
- Validates project exists before proceeding