diff --git a/claude/code/commands/migrate.md b/claude/code/commands/migrate.md new file mode 100644 index 0000000..7850dce --- /dev/null +++ b/claude/code/commands/migrate.md @@ -0,0 +1,35 @@ +--- +name: migrate +description: Manage Laravel migrations in the monorepo +args: [arguments] +--- + +# Laravel Migration Helper + +Commands to help with Laravel migrations in the monorepo. + +## Subcommands + +### `create ` +Create a new migration file. +e.g., `/core:migrate create create_users_table` + +### `run` +Run pending migrations. +e.g., `/core:migrate run` + +### `rollback` +Rollback the last batch of migrations. +e.g., `/core:migrate rollback` + +### `fresh` +Drop all tables and re-run all migrations. +e.g., `/core:migrate fresh` + +### `status` +Show the migration status. +e.g., `/core:migrate status` + +### `from-model ` +Generate a migration from a model. +e.g., `/core:migrate from-model User` diff --git a/claude/code/scripts/migrate.sh b/claude/code/scripts/migrate.sh new file mode 100755 index 0000000..b52d86c --- /dev/null +++ b/claude/code/scripts/migrate.sh @@ -0,0 +1,107 @@ +#!/bin/bash +set -e + +SUBCOMMAND=$1 +shift + +case $SUBCOMMAND in + create) + php artisan make:migration "$@" + ;; + run) + php artisan migrate "$@" + ;; + rollback) + php artisan migrate:rollback "$@" + ;; + fresh) + php artisan migrate:fresh "$@" + ;; + status) + php artisan migrate:status "$@" + ;; + from-model) + MODEL_NAME=$(basename "$1") + if [ -z "$MODEL_NAME" ]; then + echo "Error: Model name not provided." + exit 1 + fi + + MODEL_PATH=$(find . -path "*/src/Core/Models/${MODEL_NAME}.php" -print -quit) + if [ -z "$MODEL_PATH" ]; then + echo "Error: Model ${MODEL_NAME}.php not found." + exit 1 + fi + echo "Found model: $MODEL_PATH" + + TABLE_NAME=$(echo "$MODEL_NAME" | sed 's/\(.\)\([A-Z]\)/\1_\2/g' | tr '[:upper:]' '[:lower:]') + TABLE_NAME="${TABLE_NAME}s" + + MODULE_ROOT=$(echo "$MODEL_PATH" | sed 's|/src/Core/Models/.*||') + MIGRATIONS_DIR="${MODULE_ROOT}/database/migrations" + if [ ! -d "$MIGRATIONS_DIR" ]; then + echo "Error: Migrations directory not found at $MIGRATIONS_DIR" + exit 1 + fi + + TIMESTAMP=$(date +%Y_%m_%d_%H%M%S) + MIGRATION_FILE="${MIGRATIONS_DIR}/${TIMESTAMP}_create_${TABLE_NAME}_table.php" + + COLUMNS=" \$table->id();\n" + + if grep -q "use BelongsToWorkspace;" "$MODEL_PATH"; then + COLUMNS+=" \$table->foreignId('workspace_id')->constrained()->cascadeOnDelete();\n" + fi + + FILLABLE_LINE=$(grep 'protected \$fillable' "$MODEL_PATH" || echo "") + if [ -n "$FILLABLE_LINE" ]; then + FILLABLE_FIELDS=$(echo "$FILLABLE_LINE" | grep -oP "\[\K[^\]]*" | sed "s/['\",]//g") + for field in $FILLABLE_FIELDS; do + if [[ "$field" != "workspace_id" ]] && [[ "$field" != *_id ]]; then + COLUMNS+=" \$table->string('$field');\n" + fi + done + fi + + RELATIONS=$(grep -oP 'public function \K[a-zA-Z0-9_]+(?=\(\): BelongsTo)' "$MODEL_PATH" || echo "") + for rel in $RELATIONS; do + COLUMNS+=" \$table->foreignId('${rel}_id')->constrained()->cascadeOnDelete();\n" + done + + COLUMNS+=" \$table->timestamps();" + + MIGRATION_CONTENT=$(cat < "$MIGRATION_FILE" + echo "Successfully created migration: $MIGRATION_FILE" + ;; + *) + echo "Usage: /core:migrate [arguments]" + echo "Subcommands: create, run, rollback, fresh, status, from-model" + exit 1 + ;; +esac diff --git a/claude/code/skills/php/SKILL.md b/claude/code/skills/php/SKILL.md index 2133a20..98dc739 100644 --- a/claude/code/skills/php/SKILL.md +++ b/claude/code/skills/php/SKILL.md @@ -110,6 +110,12 @@ class Thing extends Model | Format | `core php fmt --fix` | | Analyse | `core php analyse` | | Dev server | `core php dev` | +| Create migration | `/core:migrate create ` | +| Create migration from model | `/core:migrate from-model ` | +| Run migrations | `/core:migrate run` | +| Rollback migrations | `/core:migrate rollback` | +| Refresh migrations | `/core:migrate fresh` | +| Migration status | `/core:migrate status` | ## Rules