diff --git a/.github/workflows/auto-documentation.yml b/.github/workflows/auto-documentation.yml index 81d36558..5dbb2bef 100644 --- a/.github/workflows/auto-documentation.yml +++ b/.github/workflows/auto-documentation.yml @@ -1,16 +1,8 @@ name: Auto Documentation on: - pull_request: - branches: [main] - types: [opened, ready_for_review, reopened, synchronize] - paths: - - "source/**" - - "plugins/**" - -concurrency: - group: auto-doc - cancel-in-progress: true + workflow_dispatch: + workflow_call: permissions: contents: write @@ -20,7 +12,6 @@ permissions: jobs: auto-documentation: name: Generate Documentation - if: ${{ !github.event.pull_request.draft }} runs-on: ubuntu-latest timeout-minutes: 15 @@ -29,7 +20,7 @@ jobs: uses: actions/checkout@v4 with: token: ${{ secrets.GITHUB_TOKEN }} - ref: ${{ github.head_ref }} + ref: ${{ github.head_ref || github.ref_name }} fetch-depth: 0 - name: Check if last commit was auto-documentation @@ -99,6 +90,25 @@ jobs: ## Expected Output: Create or modify files in the `wiki/` directory as needed. I will review these changes as part of the PR. + - name: Remove Claude Attribution + if: steps.check-auto-commit.outputs.auto-commit == 'false' && steps.changed-files.outputs.has-apex-changes == 'true' + run: | + BRANCH="${{ github.head_ref || github.ref_name }}" + BASE=$(git rev-parse "origin/${BRANCH}" 2>/dev/null || echo "") + if [ -z "$BASE" ]; then + echo "Cannot determine base commit; skipping attribution cleanup" + exit 0 + fi + if git log --format="%B" "${BASE}..HEAD" 2>/dev/null | grep -qi "co-authored-by.*claude"; then + echo "Stripping Claude Co-authored-by trailers from new commits..." + FILTER_BRANCH_SQUELCH_WARNING=1 git filter-branch -f --msg-filter \ + 'sed "/[Cc]o-[Aa]uthored-[Bb]y.*[Cc]laude/d"' \ + "${BASE}..HEAD" + git push origin "HEAD:${BRANCH}" --force + else + echo "No Claude attribution found in new commits" + fi + - name: Check if Home.md Changed if: steps.check-auto-commit.outputs.auto-commit == 'false' id: check-home @@ -147,4 +157,4 @@ jobs: Generated documentation for new global classes/methods/properties" - git push origin ${{ github.head_ref }} + git push origin ${{ github.head_ref || github.ref_name }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3e81760d..f20f86fe 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,8 +6,7 @@ on: - main types: [opened, ready_for_review, reopened, synchronize] paths: - - "source/**" - - "plugins/**" + - "src/**" - ".github/**" concurrency: @@ -32,40 +31,9 @@ permissions: pull-requests: write jobs: - claude-review: - name: Claude Code Review - if: ${{ '! github.event.pull_request.draft' }} - runs-on: ubuntu-latest - permissions: - contents: read - pull-requests: write - issues: write - id-token: write - - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 1 - - - name: Run Claude Code Review - id: claude-review - uses: anthropics/claude-code-action@beta - with: - allowed_bots: "claude" - claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }} - github_token: ${{ secrets.GITHUB_TOKEN }} - direct_prompt: | - Please review this pull request and provide feedback on: - - Code quality and best practices - - Potential bugs or issues - - Performance considerations - - Security concerns - - Test coverage - scan: name: Run Static Analysis - if: ${{ '! github.event.pull_request.draft' }} + if: ${{ !github.event.pull_request.draft && !contains(github.actor, '[bot]') }} runs-on: ubuntu-latest timeout-minutes: 10 steps: @@ -84,7 +52,7 @@ jobs: # Ensure this check only runs against changed files in the current PR; not the entire codebase set -euo pipefail mkdir "$CHANGES_DIR" - sf sgd source delta --generate-delta --from "HEAD^" --to "HEAD" --output-dir "$CHANGES_DIR"/ --source-dir "source/" + sf sgd source delta --generate-delta --from "HEAD^" --to "HEAD" --output-dir "$CHANGES_DIR"/ --source-dir "src/" echo "Changed files:" ls "$CHANGES_DIR" @@ -127,16 +95,14 @@ jobs: run-unit-tests: name: Run Unit Tests - if: ${{ '! github.event.pull_request.draft' }} + if: ${{ !github.event.pull_request.draft && !contains(github.actor, '[bot]') }} runs-on: ubuntu-latest timeout-minutes: 30 steps: - name: Checkout uses: actions/checkout@v4 - - name: Setup SF CLI uses: ./.github/actions/setup-sf-cli - - name: Authenticate Devhub env: CLIENT_ID: ${{ secrets.SALESFORCE_CONSUMER_KEY }} @@ -150,7 +116,6 @@ jobs: --jwt-key-file server.key \ --set-default-dev-hub \ --username "$USERNAME" - - name: Get Existing Scratch Org id: get-existing continue-on-error: true @@ -177,7 +142,6 @@ jobs: --username "$USERNAME" echo "success=true" >> "$GITHUB_OUTPUT" fi - - name: Create Scratch Org if: ${{ steps.get-existing.outputs.success != 'true' }} run: | @@ -192,18 +156,16 @@ jobs: --set-default \ --username "$USERNAME" \ --wait 10 - - name: Run Tests run: | sf project deploy start \ --coverage-formatters json-summary \ --dry-run \ --ignore-conflicts \ - --source-dir source \ + --source-dir src \ --test-level RunLocalTests \ --verbose \ --wait 30 - - name: Check Code Coverage run: | # Parse the JSON coverage summary file to extract overall coverage percentage @@ -213,7 +175,47 @@ jobs: echo "❌ Code coverage is ${COVERAGE_PERCENT}%, but >= 99% is required" exit 1 fi - - name: Post Authenticate Devhub if: ${{ always() }} run: rm -f server.key + + claude-review: + name: Claude Code Review + needs: [scan, run-unit-tests] + if: ${{ !github.event.pull_request.draft && !contains(github.actor, '[bot]') }} + runs-on: ubuntu-latest + permissions: + contents: read + pull-requests: write + issues: write + id-token: write + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 1 + - name: Run Claude Code Review + id: claude-review + uses: anthropics/claude-code-action@beta + with: + allowed_bots: "claude" + claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }} + github_token: ${{ secrets.GITHUB_TOKEN }} + direct_prompt: | + Please review this pull request and provide feedback on: + - Code quality and best practices + - Potential bugs or issues + - Performance considerations + - Security concerns + - Test coverage + + generate-docs: + name: Generate Documentation + needs: [scan, run-unit-tests] + if: ${{ !github.event.pull_request.draft && !contains(github.actor, '[bot]') }} + uses: ./.github/workflows/auto-documentation.yml + permissions: + contents: write + pull-requests: write + id-token: write + secrets: inherit \ No newline at end of file diff --git a/.github/workflows/packaging.yml b/.github/workflows/packaging.yml index 77d36446..3059db17 100644 --- a/.github/workflows/packaging.yml +++ b/.github/workflows/packaging.yml @@ -3,11 +3,16 @@ name: Packaging on: workflow_call: inputs: - package: - description: Package Directory ("managed" or "unlocked") - default: unlocked + run-unlocked-package: + description: Create Unlocked Package Version? + default: true required: false - type: string + type: boolean + run-nebula-plugin-package: + description: Create Nebula Plugin Package Version? + default: true + required: false + type: boolean promote-package: description: Promote New Package Version? default: false @@ -18,21 +23,33 @@ on: default: false required: false type: boolean - version: - description: Version Number (#.#.#) + unlocked-version: + description: Unlocked Package Version Number (#.#.#) + required: false + type: string + nebula-version: + description: Nebula Plugin Package Version Number (#.#.#) required: false type: string outputs: - version-id: - description: "Package Version ID" - value: ${{ jobs.create-package-version.outputs.version-id }} + unlocked-version-id: + description: "Unlocked Package Version ID" + value: ${{ jobs.create-unlocked-package-version.outputs.version-id }} + nebula-version-id: + description: "Nebula Plugin Package Version ID" + value: ${{ jobs.create-nebula-plugin-package-version.outputs.version-id }} workflow_dispatch: inputs: - package: - description: Package Directory ("managed" or "unlocked") - default: unlocked + run-unlocked-package: + description: Create Unlocked Package Version? + default: true required: false - type: string + type: boolean + run-nebula-plugin-package: + description: Create Nebula Plugin Package Version? + default: true + required: false + type: boolean promote-package: description: Promote New Package Version? default: false @@ -43,14 +60,19 @@ on: default: false required: false type: boolean - version: - description: Version Number (#.#.#) + unlocked-version: + description: Unlocked Package Version Number (#.#.#) + required: false + type: string + nebula-version: + description: Nebula Plugin Package Version Number (#.#.#) required: false type: string jobs: - create-package-version: - name: Create Package Version + create-unlocked-package-version: + name: Create Unlocked Package Version + if: ${{ inputs.run-unlocked-package }} outputs: version-id: ${{ steps.create-package.outputs.version-id }} permissions: @@ -92,26 +114,12 @@ jobs: --username "$USERNAME" trap 'rm -f server.key' EXIT - - name: Switch Package Context - shell: bash - run: | - # Validate package directory and sfdx-project.json file exist - if [[ ! -f "packages/${{ inputs.package }}/sfdx-project.json" ]]; then - echo "ERROR: 'packages/${{ inputs.package }}/sfdx-project.json' not found" - exit 1 - fi - # Swap the sfdx-project.json file for the one listed in the package directory - mkdir -p tmp - mv sfdx-project.json tmp/ - cp "packages/${{ inputs.package }}/sfdx-project.json" . - - name: Get Version Number id: get-version env: - INPUT_VERSION: ${{ inputs.version }} + INPUT_VERSION: ${{ inputs.unlocked-version }} shell: bash run: | - # If an input version number isn't set, use the current version defined in sfdx-project.json: if [[ -z "$INPUT_VERSION" ]]; then VERSION_NUMBER=$(jq -r '.packageDirectories[] | select(.default == true) | .versionNumber' sfdx-project.json) echo "Using the version number defined in sfdx-project.json: $VERSION_NUMBER" @@ -119,7 +127,6 @@ jobs: VERSION_NUMBER="${INPUT_VERSION}.NEXT" echo "Using specified version number: $VERSION_NUMBER" fi - # Create version name by removing .NEXT suffix VERSION_NAME="v${VERSION_NUMBER%.NEXT}" echo "version-number=$VERSION_NUMBER" >> "$GITHUB_OUTPUT" echo "version-name=$VERSION_NAME" >> "$GITHUB_OUTPUT" @@ -130,15 +137,10 @@ jobs: VERSION_NUMBER: ${{ steps.get-version.outputs.version-number }} VERSION_NAME: ${{ steps.get-version.outputs.version-name }} run: | - # Update the version number/name in both project files: - # Update the package file jq --arg vn "$VERSION_NUMBER" --arg vnm "$VERSION_NAME" \ - '.packageDirectories[0].versionNumber = $vn | .packageDirectories[0].versionName = $vnm' \ + '(.packageDirectories[] | select(.default == true) | .versionNumber) = $vn | + (.packageDirectories[] | select(.default == true) | .versionName) = $vnm' \ sfdx-project.json > sfdx-project.json.tmp && mv sfdx-project.json.tmp sfdx-project.json - # Update version in the original root file - jq --arg vn "$VERSION_NUMBER" --arg vnm "$VERSION_NAME" \ - '.packageDirectories[0].versionNumber = $vn | .packageDirectories[0].versionName = $vnm' \ - tmp/sfdx-project.json > tmp/sfdx-project.json.tmp && mv tmp/sfdx-project.json.tmp tmp/sfdx-project.json - name: Create New Package Version id: create-package @@ -153,7 +155,6 @@ jobs: COMMAND="sf package version create --$VALIDATION_FLAG --installation-key-bypass --json --package \"$PACKAGE_ALIAS\" --post-install-url \"$WIKI_URL\" --wait 29" echo "$COMMAND" if RESULT=$(eval "$COMMAND" 2>&1); then - # Success - extract version ID VERSION_ID=$(echo "$RESULT" | jq -r '.result.SubscriberPackageVersionId') echo "Package Version ID: $VERSION_ID" echo "version-id=$VERSION_ID" >> "$GITHUB_OUTPUT" @@ -166,29 +167,142 @@ jobs: - name: Promote Package Version if: ${{ inputs.promote-package == 'true' }} env: - PACKAGE_TYPE: ${{ inputs.package }} VERSION_ID: ${{ steps.create-package.outputs.version-id }} VERSION_NAME: ${{ steps.get-version.outputs.version-name }} shell: bash run: | set -euo pipefail sf package version promote --package "$VERSION_ID" --no-prompt - echo "::success:: Promoted $PACKAGE_TYPE package $VERSION_NAME - $VERSION_ID" + echo "::success:: Promoted unlocked package $VERSION_NAME - $VERSION_ID" - name: Run Prettier shell: bash + run: npx prettier -w sfdx-project.json + + - name: Pull Latest Changes + shell: bash + run: | + git fetch origin main + git rebase origin/main || { + echo "Rebase failed, trying merge strategy" + git rebase --abort 2>/dev/null || true + git pull --no-rebase origin main + } + + - name: Tag & Commit Changes + uses: "stefanzweifel/git-auto-commit-action@v6" + with: + commit_message: "Packaged new unlocked version ${{ steps.get-version.outputs.version-name }}" + skip_dirty_check: true + + create-nebula-plugin-package-version: + name: Create Nebula Plugin Package Version + if: ${{ inputs.run-nebula-plugin-package }} + outputs: + version-id: ${{ steps.create-package.outputs.version-id }} + permissions: + contents: write + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + ref: main + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: lts/* + cache: "npm" + + - name: Setup NPM + shell: bash + run: npm ci + + - name: Setup SF CLI + uses: ./.github/actions/setup-sf-cli + + - name: Authenticate Devhub + env: + CLIENT_ID: ${{ secrets.SALESFORCE_CONSUMER_KEY }} + JWT_KEY: ${{ secrets.SALESFORCE_JWT_KEY }} + USERNAME: ${{ secrets.SALESFORCE_DEVHUB_USERNAME }} + shell: bash + run: | + set -euo pipefail + echo "${JWT_KEY}" > server.key + sf org login jwt \ + --client-id "$CLIENT_ID" \ + --jwt-key-file server.key \ + --set-default-dev-hub \ + --username "$USERNAME" + trap 'rm -f server.key' EXIT + + - name: Get Version Number + id: get-version + env: + INPUT_VERSION: ${{ inputs.nebula-version }} + shell: bash + run: | + if [[ -z "$INPUT_VERSION" ]]; then + VERSION_NUMBER=$(jq -r '.packageDirectories[] | select(.path == "src/plugins/nebula-logger") | .versionNumber' sfdx-project.json) + echo "Using the version number defined in sfdx-project.json: $VERSION_NUMBER" + else + VERSION_NUMBER="${INPUT_VERSION}.NEXT" + echo "Using specified version number: $VERSION_NUMBER" + fi + VERSION_NAME="v${VERSION_NUMBER%.NEXT}" + echo "version-number=$VERSION_NUMBER" >> "$GITHUB_OUTPUT" + echo "version-name=$VERSION_NAME" >> "$GITHUB_OUTPUT" + + - name: Update Package Version + shell: bash + env: + VERSION_NUMBER: ${{ steps.get-version.outputs.version-number }} + VERSION_NAME: ${{ steps.get-version.outputs.version-name }} + run: | + jq --arg vn "$VERSION_NUMBER" --arg vnm "$VERSION_NAME" \ + '(.packageDirectories[] | select(.path == "src/plugins/nebula-logger") | .versionNumber) = $vn | + (.packageDirectories[] | select(.path == "src/plugins/nebula-logger") | .versionName) = $vnm' \ + sfdx-project.json > sfdx-project.json.tmp && mv sfdx-project.json.tmp sfdx-project.json + + - name: Create New Package Version + id: create-package + env: + VERSION_NUMBER: ${{ steps.get-version.outputs.version-number }} + WIKI_URL: "https://github.com/jasonsiders/apex-database-layer/wiki" + shell: bash run: | - # Run Prettier on sfdx-project.json files, since packaging overwrites spacing: - npx prettier -w sfdx-project.json - npx prettier -w tmp/sfdx-project.json + set -euo pipefail + PACKAGE_ALIAS=$(jq -r '.packageDirectories[] | select(.path == "src/plugins/nebula-logger") | .package' sfdx-project.json) + VALIDATION_FLAG=$([[ "${{ inputs.skip-validation }}" == "true" ]] && echo "skip-validation" || echo "code-coverage") + COMMAND="sf package version create --$VALIDATION_FLAG --installation-key-bypass --json --package \"$PACKAGE_ALIAS\" --post-install-url \"$WIKI_URL\" --wait 29" + echo "$COMMAND" + if RESULT=$(eval "$COMMAND" 2>&1); then + VERSION_ID=$(echo "$RESULT" | jq -r '.result.SubscriberPackageVersionId') + echo "Package Version ID: $VERSION_ID" + echo "version-id=$VERSION_ID" >> "$GITHUB_OUTPUT" + [[ -n "$VERSION_ID" && "$VERSION_ID" != "null" ]] || { echo "ERROR: Invalid version ID"; exit 1; } + else + echo "::error::Package creation failed: $RESULT" + exit 1 + fi - - name: Cleanup + - name: Promote Package Version + if: ${{ inputs.promote-package == 'true' }} + env: + VERSION_ID: ${{ steps.create-package.outputs.version-id }} + VERSION_NAME: ${{ steps.get-version.outputs.version-name }} shell: bash run: | - # Relocate root & package's project files back to their original location - cp sfdx-project.json "packages/${{ inputs.package }}/" - mv tmp/sfdx-project.json . - rm -rf tmp/ + set -euo pipefail + sf package version promote --package "$VERSION_ID" --no-prompt + echo "::success:: Promoted nebula-logger plugin $VERSION_NAME - $VERSION_ID" + + - name: Run Prettier + shell: bash + run: npx prettier -w sfdx-project.json - name: Pull Latest Changes shell: bash @@ -203,5 +317,5 @@ jobs: - name: Tag & Commit Changes uses: "stefanzweifel/git-auto-commit-action@v6" with: - commit_message: "Packaged new ${{ inputs.package }} version ${{ steps.get-version.outputs.version-name }}" + commit_message: "Packaged nebula-logger plugin version ${{ steps.get-version.outputs.version-name }}" skip_dirty_check: true diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b4e11097..b557214c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -5,7 +5,7 @@ on: branches: - main paths: - - "source/**" + - "src/**" workflow_dispatch: inputs: promote-package: @@ -13,8 +13,12 @@ on: required: false default: true type: boolean - version: - description: Version Number (#.#.#) + unlocked-version: + description: Unlocked Package Version (#.#.#) + required: false + type: string + nebula-version: + description: Nebula Plugin Package Version (#.#.#) required: false type: string @@ -24,119 +28,156 @@ concurrency: cancel-in-progress: false jobs: - versioning: - name: Versioning - outputs: - version-number: ${{ steps.determine-version.outputs.version-number }} + detect-changes: + name: Detect Changed Packages runs-on: ubuntu-latest - timeout-minutes: 10 + timeout-minutes: 5 + outputs: + core-changed: ${{ steps.check.outputs.core-changed }} + nebula-changed: ${{ steps.check.outputs.nebula-changed }} steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 2 - - name: Did sfdx-project.json Change? - if: ${{ github.event_name == 'push' }} - id: check-changes + - name: Check Changed Paths + id: check run: | - # Check if sfdx-project.json was modified in the latest commit - if git diff --name-only HEAD~1 HEAD | grep -q "^sfdx-project.json$"; then - echo "sfdx-project.json was modified" - echo "changed=true" >> "$GITHUB_OUTPUT" + if git diff --name-only HEAD~1 HEAD | grep -q "^src/core/"; then + echo "core-changed=true" >> "$GITHUB_OUTPUT" else - echo "sfdx-project.json was not modified" - echo "changed=false" >> "$GITHUB_OUTPUT" + echo "core-changed=false" >> "$GITHUB_OUTPUT" fi - - - name: Determine Version - id: determine-version - run: | - # Get current version from sfdx-project.json: - CURRENT_VERSION=$(jq -r '.packageDirectories[] | select(.default == true) | .versionNumber' sfdx-project.json | sed 's/\.NEXT$//') - echo "Current version: $CURRENT_VERSION" - if [[ "${{ github.event_name }}" == "push" && "${{ steps.check-changes.outputs.changed }}" == "false" ]]; then - # 1. On push AND sfdx-project.json was NOT updated - increment the patch version - IFS='.' read -ra VERSION_PARTS <<< "$CURRENT_VERSION" - MAJOR=${VERSION_PARTS[0]} - MINOR=${VERSION_PARTS[1]} - PATCH=${VERSION_PARTS[2]} - NEW_PATCH=$((PATCH + 1)) - NEW_VERSION="$MAJOR.$MINOR.$NEW_PATCH" - echo "Auto-incremented version to: $NEW_VERSION" - elif [[ "${{ github.event_name }}" == "workflow_dispatch" && -n "${{ inputs.version }}" ]]; then - # 2. On workflow dispatch & a version input is provided - use the version input - NEW_VERSION="${{ inputs.version }}" - echo "Using input version: $NEW_VERSION" + if git diff --name-only HEAD~1 HEAD | grep -q "^src/plugins/nebula-logger/"; then + echo "nebula-changed=true" >> "$GITHUB_OUTPUT" else - # 3. Else - use the existing version number - NEW_VERSION="$CURRENT_VERSION" - echo "Using current version: $NEW_VERSION" + echo "nebula-changed=false" >> "$GITHUB_OUTPUT" fi - echo "version-number=$NEW_VERSION" >> "$GITHUB_OUTPUT" - - name: Validate Package Version + versioning: + name: Versioning + needs: [detect-changes] + outputs: + unlocked-version: ${{ steps.determine-version.outputs.unlocked-version }} + nebula-version: ${{ steps.determine-version.outputs.nebula-version }} + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 2 + + - name: Determine Versions + id: determine-version env: - VERSION: ${{ steps.determine-version.outputs.version-number }} + CORE_CHANGED: ${{ needs.detect-changes.outputs.core-changed }} + NEBULA_CHANGED: ${{ needs.detect-changes.outputs.nebula-changed }} + INPUT_UNLOCKED_VERSION: ${{ inputs.unlocked-version }} + INPUT_NEBULA_VERSION: ${{ inputs.nebula-version }} run: | - if [[ ! "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then - echo "ERROR: Version '$VERSION' is not valid semver format. Expected 'MAJOR.MINOR.PATCH'" + strip_next() { echo "${1%.NEXT}"; } + increment_patch() { + IFS='.' read -ra P <<< "$1" + echo "${P[0]}.${P[1]}.$((P[2] + 1))" + } + + UNLOCKED_CURR=$(strip_next "$(jq -r '.packageDirectories[] | select(.default == true) | .versionNumber' sfdx-project.json)") + NEBULA_CURR=$(strip_next "$(jq -r '.packageDirectories[] | select(.path == "src/plugins/nebula-logger") | .versionNumber' sfdx-project.json)") + + if [[ "${{ github.event_name }}" == "push" ]]; then + UNLOCKED_PREV=$(strip_next "$(git show HEAD~1:sfdx-project.json | jq -r '.packageDirectories[] | select(.default == true) | .versionNumber')") + NEBULA_PREV=$(strip_next "$(git show HEAD~1:sfdx-project.json | jq -r '.packageDirectories[] | select(.path == "src/plugins/nebula-logger") | .versionNumber')") + + if [[ "$UNLOCKED_CURR" == "$UNLOCKED_PREV" && "$CORE_CHANGED" == "true" ]]; then + UNLOCKED_CURR=$(increment_patch "$UNLOCKED_CURR") + echo "Auto-incremented unlocked version to: $UNLOCKED_CURR" + fi + if [[ "$NEBULA_CURR" == "$NEBULA_PREV" && "$NEBULA_CHANGED" == "true" ]]; then + NEBULA_CURR=$(increment_patch "$NEBULA_CURR") + echo "Auto-incremented nebula version to: $NEBULA_CURR" + fi + elif [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then + [[ -n "$INPUT_UNLOCKED_VERSION" ]] && UNLOCKED_CURR="$INPUT_UNLOCKED_VERSION" + [[ -n "$INPUT_NEBULA_VERSION" ]] && NEBULA_CURR="$INPUT_NEBULA_VERSION" + fi + + echo "Unlocked version: $UNLOCKED_CURR" + echo "Nebula version: $NEBULA_CURR" + + if [[ ! "$UNLOCKED_CURR" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo "ERROR: Unlocked version '$UNLOCKED_CURR' is not valid semver" + exit 1 + fi + if [[ ! "$NEBULA_CURR" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo "ERROR: Nebula version '$NEBULA_CURR' is not valid semver" exit 1 fi - create-unlocked-package-version: - name: Create Unlocked Package Version - needs: [versioning] + echo "unlocked-version=$UNLOCKED_CURR" >> "$GITHUB_OUTPUT" + echo "nebula-version=$NEBULA_CURR" >> "$GITHUB_OUTPUT" + + create-package-versions: + name: Create Package Versions + needs: [versioning, detect-changes] permissions: contents: write uses: ./.github/workflows/packaging.yml secrets: inherit with: - package: unlocked + run-unlocked-package: ${{ needs.detect-changes.outputs.core-changed == 'true' || github.event_name == 'workflow_dispatch' }} + run-nebula-plugin-package: ${{ needs.detect-changes.outputs.nebula-changed == 'true' || github.event_name == 'workflow_dispatch' }} promote-package: ${{ inputs.promote-package || false }} - version: ${{ needs.versioning.outputs.version-number }} + unlocked-version: ${{ needs.versioning.outputs.unlocked-version }} + nebula-version: ${{ needs.versioning.outputs.nebula-version }} - create-release: - name: Create Release - needs: [versioning, create-unlocked-package-version] - if: ${{ success() && needs.create-unlocked-package-version.outputs.version-id != '' }} + create-unlocked-release: + name: Create Unlocked Release + needs: [versioning, detect-changes, create-package-versions] + if: ${{ success() && (needs.detect-changes.outputs.core-changed == 'true' || github.event_name == 'workflow_dispatch') && needs.create-package-versions.outputs.unlocked-version-id != '' }} permissions: contents: write runs-on: ubuntu-latest timeout-minutes: 10 steps: - - name: Draft Release Body - id: release-body - run: | - VERSION="${{ needs.versioning.outputs.version-number }}" - UNLOCKED_ID="${{ needs.create-unlocked-package-version.outputs.version-id }}" - # Start building release body - { - echo "## Installation" - echo "" - echo "### Unlocked Package" - echo "**Package Version**: \`$UNLOCKED_ID\`" - echo "\`\`\`bash" - echo "sf package install --package $UNLOCKED_ID --wait 20" - echo "\`\`\`" - echo "" - echo "---" - echo "" - } > release_body.md - - # Set as output for next step - { - echo 'body<> "$GITHUB_OUTPUT" - - name: Create Release - id: create_release uses: softprops/action-gh-release@v2.3.2 with: - body: ${{ steps.release-body.outputs.body }} + body: | + ## Installation + + ### Unlocked Package + **Package Version**: `${{ needs.create-package-versions.outputs.unlocked-version-id }}` + ```bash + sf package install --package ${{ needs.create-package-versions.outputs.unlocked-version-id }} --wait 20 + ``` generate_release_notes: true make_latest: true - tag_name: v${{ needs.versioning.outputs.version-number }} + tag_name: unlocked/v${{ needs.versioning.outputs.unlocked-version }} + token: ${{ secrets.GITHUB_TOKEN }} + + create-nebula-release: + name: Create Nebula Plugin Release + needs: [versioning, detect-changes, create-package-versions] + if: ${{ success() && (needs.detect-changes.outputs.nebula-changed == 'true' || github.event_name == 'workflow_dispatch') && needs.create-package-versions.outputs.nebula-version-id != '' }} + permissions: + contents: write + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - name: Create Release + uses: softprops/action-gh-release@v2.3.2 + with: + body: | + ## Installation + + ### Nebula Logger Plugin + **Package Version**: `${{ needs.create-package-versions.outputs.nebula-version-id }}` + ```bash + sf package install --package ${{ needs.create-package-versions.outputs.nebula-version-id }} --wait 20 + ``` + generate_release_notes: true + make_latest: false + tag_name: plugin-nebula/v${{ needs.versioning.outputs.nebula-version }} token: ${{ secrets.GITHUB_TOKEN }} diff --git a/packages/managed/sfdx-project.json b/packages/managed/sfdx-project.json deleted file mode 100644 index 1822bf0a..00000000 --- a/packages/managed/sfdx-project.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "packageDirectories": [ - { - "path": "source", - "default": true, - "package": "apex-database-layer-managed", - "versionName": "v4.0.0", - "versionNumber": "4.0.0.NEXT", - "versionDescription": "", - "ancestorVersion": "HIGHEST" - } - ], - "name": "Apex Database Layer (Managed)", - "namespace": "apxsp", - "sfdcLoginUrl": "https://login.salesforce.com", - "sourceApiVersion": "66.0", - "packageAliases": { - "apex-database-layer-managed": "0HoDn0000010wCnKAI", - "apex-database-layer-managed@3.0.0-9": "04tDn0000011OULIA2", - "apex-database-layer-managed@3.1.0-3": "04tDn0000011OUfIAM", - "apex-database-layer-managed@3.2.0-1": "04tDn0000011OV9IAM", - "apex-database-layer-managed@3.3.0-1": "04tDn0000011OWMIA2", - "apex-database-layer-managed@3.4.0-3": "04tDn0000011OgsIAE", - "apex-database-layer-managed@3.5.0-1": "04tDn0000011Oh2IAE", - "apex-database-layer-managed@3.6.0-1": "04tDn0000011OhHIAU" - } -} diff --git a/packages/unlocked/sfdx-project.json b/packages/unlocked/sfdx-project.json deleted file mode 100644 index 5466551d..00000000 --- a/packages/unlocked/sfdx-project.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "packageDirectories": [ - { - "path": "source", - "default": true, - "package": "apex-database-layer-unlocked", - "versionName": "v4.0.0", - "versionNumber": "4.0.0.NEXT", - "versionDescription": "" - } - ], - "name": "Apex Database Layer (Unlocked)", - "namespace": "", - "sfdcLoginUrl": "https://login.salesforce.com", - "sourceApiVersion": "66.0", - "packageAliases": { - "apex-database-layer-unlocked": "0HoDn000000kAONKA2", - "apex-database-layer-unlocked@0.1.0-1": "04tDn0000006z4LIAQ", - "apex-database-layer-unlocked@1.0.0-2": "04tDn0000011O0pIAE", - "apex-database-layer-unlocked@2.0.0-1": "04tDn0000011OKyIAM", - "apex-database-layer-unlocked@2.1.0-1": "04tDn0000011OPVIA2", - "apex-database-layer-unlocked@2.2.0-1": "04tDn0000011OQJIA2", - "apex-database-layer-unlocked@2.2.1-1": "04tDn0000011OQYIA2", - "apex-database-layer-unlocked@2.2.2-1": "04tDn0000011OQdIAM", - "apex-database-layer-unlocked@2.3.0-1": "04tDn0000011OQsIAM", - "apex-database-layer-unlocked@2.4.0-1": "04tDn0000011OR7IAM", - "apex-database-layer-unlocked@2.4.1-1": "04tDn0000011ORHIA2", - "apex-database-layer-unlocked@2.4.2-2": "04tDn0000011ORbIAM", - "apex-database-layer-unlocked@2.4.3-1": "04tDn0000011ORgIAM", - "apex-database-layer-unlocked@2.4.4-1": "04tDn0000011ORvIAM", - "apex-database-layer-unlocked@2.5.0-2": "04tDn0000011OS5IAM", - "apex-database-layer-unlocked@2.5.1-1": "04tDn0000011OSAIA2", - "apex-database-layer-unlocked@3.0.0-12": "04tDn0000011OUQIA2", - "apex-database-layer-unlocked@3.1.0-1": "04tDn0000011OUkIAM", - "apex-database-layer-unlocked@3.2.0-1": "04tDn0000011OVEIA2", - "apex-database-layer-unlocked@3.3.0-1": "04tDn0000011OWRIA2", - "apex-database-layer-unlocked@3.4.0-3": "04tDn0000011OgxIAE", - "apex-database-layer-unlocked@3.5.0-1": "04tDn0000011Oh7IAE", - "apex-database-layer-unlocked@3.6.0-1": "04tDn0000011OhMIAU", - "apex-database-layer-unlocked@3.7.0-1": "04tDn0000011OhgIAE", - "apex-database-layer-unlocked@3.7.1-1": "04tDn0000011OhlIAE", - "apex-database-layer-unlocked@3.7.2-1": "04tDn0000011OhqIAE", - "apex-database-layer-unlocked@3.7.3-1": "04tDn0000011OwUIAU", - "apex-database-layer-unlocked@3.7.4-1": "04tDn0000011OweIAE", - "apex-database-layer-unlocked@3.7.5-1": "04tDn0000011OwjIAE", - "apex-database-layer-unlocked@3.7.6-1": "04tDn0000011P1LIAU", - "apex-database-layer-unlocked@3.7.7-1": "04tDn0000011P88IAE", - "apex-database-layer-unlocked@3.7.8-1": "04tDn0000011P8DIAU", - "apex-database-layer-unlocked@3.7.9-1": "04tDn0000011P8IIAU", - "apex-database-layer-unlocked@3.7.9-2": "04tDn0000011P8NIAU", - "apex-database-layer-unlocked@4.0.0-1": "04tDn0000011P8SIAU", - "apex-database-layer-unlocked@4.0.0-2": "04tDn0000011P8cIAE" - } -} diff --git a/sfdx-project.json b/sfdx-project.json index edf040eb..ef9177de 100644 --- a/sfdx-project.json +++ b/sfdx-project.json @@ -1,26 +1,26 @@ { "packageDirectories": [ { - "path": "source", + "path": "src/core", "default": true, "package": "Apex Database Layer", "versionName": "v4.0.0", "versionNumber": "4.0.0.NEXT" }, { - "versionName": "v1.0.0", - "versionNumber": "1.0.0.NEXT", - "path": "plugins/nebula-logger/source", + "versionName": "v1.1.0", + "versionNumber": "1.1.0.NEXT", + "path": "src/plugins/nebula-logger", "default": false, - "package": "apex-database-layer-plugin-nebula-logger", + "package": "plugin-nebula-logger", "versionDescription": "Use Nebula Logger to automatically log details of DML & SOQL operations", "dependencies": [ { - "package": "apex-database-layer-unlocked", - "versionNumber": "3.2.0.LATEST" + "package": "apex-database-layer", + "versionNumber": "4.0.0.LATEST" }, { - "package": "nebula-logger-unlocked@4.16.4" + "package": "nebula-logger-unlocked@4.17.3" } ] } @@ -30,10 +30,9 @@ "sfdcLoginUrl": "https://login.salesforce.com", "sourceApiVersion": "66.0", "packageAliases": { - "apex-database-layer-managed": "0HoDn0000010wCnKAI", - "apex-database-layer-unlocked": "0HoDn000000kAONKA2", - "apex-database-layer-plugin-nebula-logger": "0HoDn0000010wCxKAI", - "nebula-logger-unlocked@4.16.4": "04tKe0000011MyWIAU", - "apex-database-layer-plugin-nebula-logger@1.0.0-1": "04tDn0000011OVJIA2" + "apex-database-layer": "0HoDn000000kAONKA2", + "nebula-logger-unlocked@4.17.3": "04tg70000001IMHAA2", + "plugin-nebula-logger": "0HoDn0000010wCxKAI", + "plugin-nebula-logger@1.1.0-1": "04tDn0000011P8XIAU" } } diff --git a/source/classes/Cmdt.cls b/src/core/classes/Cmdt.cls similarity index 100% rename from source/classes/Cmdt.cls rename to src/core/classes/Cmdt.cls diff --git a/source/classes/Cmdt.cls-meta.xml b/src/core/classes/Cmdt.cls-meta.xml similarity index 100% rename from source/classes/Cmdt.cls-meta.xml rename to src/core/classes/Cmdt.cls-meta.xml diff --git a/source/classes/CmdtTest.cls b/src/core/classes/CmdtTest.cls similarity index 100% rename from source/classes/CmdtTest.cls rename to src/core/classes/CmdtTest.cls diff --git a/source/classes/CmdtTest.cls-meta.xml b/src/core/classes/CmdtTest.cls-meta.xml similarity index 100% rename from source/classes/CmdtTest.cls-meta.xml rename to src/core/classes/CmdtTest.cls-meta.xml diff --git a/source/classes/DatabaseLayer.cls b/src/core/classes/DatabaseLayer.cls similarity index 100% rename from source/classes/DatabaseLayer.cls rename to src/core/classes/DatabaseLayer.cls diff --git a/source/classes/DatabaseLayer.cls-meta.xml b/src/core/classes/DatabaseLayer.cls-meta.xml similarity index 100% rename from source/classes/DatabaseLayer.cls-meta.xml rename to src/core/classes/DatabaseLayer.cls-meta.xml diff --git a/source/classes/DatabaseLayerTest.cls b/src/core/classes/DatabaseLayerTest.cls similarity index 100% rename from source/classes/DatabaseLayerTest.cls rename to src/core/classes/DatabaseLayerTest.cls diff --git a/source/classes/DatabaseLayerTest.cls-meta.xml b/src/core/classes/DatabaseLayerTest.cls-meta.xml similarity index 100% rename from source/classes/DatabaseLayerTest.cls-meta.xml rename to src/core/classes/DatabaseLayerTest.cls-meta.xml diff --git a/source/classes/DatabaseLayerTestUtils.cls b/src/core/classes/DatabaseLayerTestUtils.cls similarity index 100% rename from source/classes/DatabaseLayerTestUtils.cls rename to src/core/classes/DatabaseLayerTestUtils.cls diff --git a/source/classes/DatabaseLayerTestUtils.cls-meta.xml b/src/core/classes/DatabaseLayerTestUtils.cls-meta.xml similarity index 100% rename from source/classes/DatabaseLayerTestUtils.cls-meta.xml rename to src/core/classes/DatabaseLayerTestUtils.cls-meta.xml diff --git a/source/classes/DatabaseLayerUtils.cls b/src/core/classes/DatabaseLayerUtils.cls similarity index 100% rename from source/classes/DatabaseLayerUtils.cls rename to src/core/classes/DatabaseLayerUtils.cls diff --git a/source/classes/DatabaseLayerUtils.cls-meta.xml b/src/core/classes/DatabaseLayerUtils.cls-meta.xml similarity index 100% rename from source/classes/DatabaseLayerUtils.cls-meta.xml rename to src/core/classes/DatabaseLayerUtils.cls-meta.xml diff --git a/source/classes/DatabaseLayerUtilsTest.cls b/src/core/classes/DatabaseLayerUtilsTest.cls similarity index 100% rename from source/classes/DatabaseLayerUtilsTest.cls rename to src/core/classes/DatabaseLayerUtilsTest.cls diff --git a/source/classes/DatabaseLayerUtilsTest.cls-meta.xml b/src/core/classes/DatabaseLayerUtilsTest.cls-meta.xml similarity index 100% rename from source/classes/DatabaseLayerUtilsTest.cls-meta.xml rename to src/core/classes/DatabaseLayerUtilsTest.cls-meta.xml diff --git a/source/classes/Dml.cls b/src/core/classes/Dml.cls similarity index 100% rename from source/classes/Dml.cls rename to src/core/classes/Dml.cls diff --git a/source/classes/Dml.cls-meta.xml b/src/core/classes/Dml.cls-meta.xml similarity index 100% rename from source/classes/Dml.cls-meta.xml rename to src/core/classes/Dml.cls-meta.xml diff --git a/source/classes/DmlTest.cls b/src/core/classes/DmlTest.cls similarity index 100% rename from source/classes/DmlTest.cls rename to src/core/classes/DmlTest.cls diff --git a/source/classes/DmlTest.cls-meta.xml b/src/core/classes/DmlTest.cls-meta.xml similarity index 100% rename from source/classes/DmlTest.cls-meta.xml rename to src/core/classes/DmlTest.cls-meta.xml diff --git a/source/classes/Duplicates.cls b/src/core/classes/Duplicates.cls similarity index 100% rename from source/classes/Duplicates.cls rename to src/core/classes/Duplicates.cls diff --git a/source/classes/Duplicates.cls-meta.xml b/src/core/classes/Duplicates.cls-meta.xml similarity index 100% rename from source/classes/Duplicates.cls-meta.xml rename to src/core/classes/Duplicates.cls-meta.xml diff --git a/source/classes/DuplicatesTest.cls b/src/core/classes/DuplicatesTest.cls similarity index 100% rename from source/classes/DuplicatesTest.cls rename to src/core/classes/DuplicatesTest.cls diff --git a/source/classes/DuplicatesTest.cls-meta.xml b/src/core/classes/DuplicatesTest.cls-meta.xml similarity index 100% rename from source/classes/DuplicatesTest.cls-meta.xml rename to src/core/classes/DuplicatesTest.cls-meta.xml diff --git a/source/classes/MockCmdt.cls b/src/core/classes/MockCmdt.cls similarity index 100% rename from source/classes/MockCmdt.cls rename to src/core/classes/MockCmdt.cls diff --git a/source/classes/MockCmdt.cls-meta.xml b/src/core/classes/MockCmdt.cls-meta.xml similarity index 100% rename from source/classes/MockCmdt.cls-meta.xml rename to src/core/classes/MockCmdt.cls-meta.xml diff --git a/source/classes/MockDml.cls b/src/core/classes/MockDml.cls similarity index 100% rename from source/classes/MockDml.cls rename to src/core/classes/MockDml.cls diff --git a/source/classes/MockDml.cls-meta.xml b/src/core/classes/MockDml.cls-meta.xml similarity index 100% rename from source/classes/MockDml.cls-meta.xml rename to src/core/classes/MockDml.cls-meta.xml diff --git a/source/classes/MockDmlTest.cls b/src/core/classes/MockDmlTest.cls similarity index 100% rename from source/classes/MockDmlTest.cls rename to src/core/classes/MockDmlTest.cls diff --git a/source/classes/MockDmlTest.cls-meta.xml b/src/core/classes/MockDmlTest.cls-meta.xml similarity index 100% rename from source/classes/MockDmlTest.cls-meta.xml rename to src/core/classes/MockDmlTest.cls-meta.xml diff --git a/source/classes/MockDuplicates.cls b/src/core/classes/MockDuplicates.cls similarity index 100% rename from source/classes/MockDuplicates.cls rename to src/core/classes/MockDuplicates.cls diff --git a/source/classes/MockDuplicates.cls-meta.xml b/src/core/classes/MockDuplicates.cls-meta.xml similarity index 100% rename from source/classes/MockDuplicates.cls-meta.xml rename to src/core/classes/MockDuplicates.cls-meta.xml diff --git a/source/classes/MockDuplicatesTest.cls b/src/core/classes/MockDuplicatesTest.cls similarity index 100% rename from source/classes/MockDuplicatesTest.cls rename to src/core/classes/MockDuplicatesTest.cls diff --git a/source/classes/MockDuplicatesTest.cls-meta.xml b/src/core/classes/MockDuplicatesTest.cls-meta.xml similarity index 100% rename from source/classes/MockDuplicatesTest.cls-meta.xml rename to src/core/classes/MockDuplicatesTest.cls-meta.xml diff --git a/source/classes/MockError.cls b/src/core/classes/MockError.cls similarity index 100% rename from source/classes/MockError.cls rename to src/core/classes/MockError.cls diff --git a/source/classes/MockError.cls-meta.xml b/src/core/classes/MockError.cls-meta.xml similarity index 100% rename from source/classes/MockError.cls-meta.xml rename to src/core/classes/MockError.cls-meta.xml diff --git a/source/classes/MockErrorTest.cls b/src/core/classes/MockErrorTest.cls similarity index 100% rename from source/classes/MockErrorTest.cls rename to src/core/classes/MockErrorTest.cls diff --git a/source/classes/MockErrorTest.cls-meta.xml b/src/core/classes/MockErrorTest.cls-meta.xml similarity index 100% rename from source/classes/MockErrorTest.cls-meta.xml rename to src/core/classes/MockErrorTest.cls-meta.xml diff --git a/source/classes/MockRecord.cls b/src/core/classes/MockRecord.cls similarity index 100% rename from source/classes/MockRecord.cls rename to src/core/classes/MockRecord.cls diff --git a/source/classes/MockRecord.cls-meta.xml b/src/core/classes/MockRecord.cls-meta.xml similarity index 100% rename from source/classes/MockRecord.cls-meta.xml rename to src/core/classes/MockRecord.cls-meta.xml diff --git a/source/classes/MockRecordTest.cls b/src/core/classes/MockRecordTest.cls similarity index 100% rename from source/classes/MockRecordTest.cls rename to src/core/classes/MockRecordTest.cls diff --git a/source/classes/MockRecordTest.cls-meta.xml b/src/core/classes/MockRecordTest.cls-meta.xml similarity index 100% rename from source/classes/MockRecordTest.cls-meta.xml rename to src/core/classes/MockRecordTest.cls-meta.xml diff --git a/source/classes/MockSoql.cls b/src/core/classes/MockSoql.cls similarity index 100% rename from source/classes/MockSoql.cls rename to src/core/classes/MockSoql.cls diff --git a/source/classes/MockSoql.cls-meta.xml b/src/core/classes/MockSoql.cls-meta.xml similarity index 100% rename from source/classes/MockSoql.cls-meta.xml rename to src/core/classes/MockSoql.cls-meta.xml diff --git a/source/classes/MockSoqlTest.cls b/src/core/classes/MockSoqlTest.cls similarity index 100% rename from source/classes/MockSoqlTest.cls rename to src/core/classes/MockSoqlTest.cls diff --git a/source/classes/MockSoqlTest.cls-meta.xml b/src/core/classes/MockSoqlTest.cls-meta.xml similarity index 100% rename from source/classes/MockSoqlTest.cls-meta.xml rename to src/core/classes/MockSoqlTest.cls-meta.xml diff --git a/source/classes/Soql.cls b/src/core/classes/Soql.cls similarity index 100% rename from source/classes/Soql.cls rename to src/core/classes/Soql.cls diff --git a/source/classes/Soql.cls-meta.xml b/src/core/classes/Soql.cls-meta.xml similarity index 100% rename from source/classes/Soql.cls-meta.xml rename to src/core/classes/Soql.cls-meta.xml diff --git a/source/classes/SoqlTest.cls b/src/core/classes/SoqlTest.cls similarity index 100% rename from source/classes/SoqlTest.cls rename to src/core/classes/SoqlTest.cls diff --git a/source/classes/SoqlTest.cls-meta.xml b/src/core/classes/SoqlTest.cls-meta.xml similarity index 100% rename from source/classes/SoqlTest.cls-meta.xml rename to src/core/classes/SoqlTest.cls-meta.xml diff --git a/source/main/default/layouts/DatabaseLayerParameter__mdt-Database Layer Parameter Layout.layout-meta.xml b/src/core/layouts/DatabaseLayerParameter__mdt-Database Layer Parameter Layout.layout-meta.xml similarity index 100% rename from source/main/default/layouts/DatabaseLayerParameter__mdt-Database Layer Parameter Layout.layout-meta.xml rename to src/core/layouts/DatabaseLayerParameter__mdt-Database Layer Parameter Layout.layout-meta.xml diff --git a/source/objects/DatabaseLayerParameter__mdt/DatabaseLayerParameter__mdt.object-meta.xml b/src/core/objects/DatabaseLayerParameter__mdt/DatabaseLayerParameter__mdt.object-meta.xml similarity index 100% rename from source/objects/DatabaseLayerParameter__mdt/DatabaseLayerParameter__mdt.object-meta.xml rename to src/core/objects/DatabaseLayerParameter__mdt/DatabaseLayerParameter__mdt.object-meta.xml diff --git a/source/objects/DatabaseLayerParameter__mdt/fields/Description__c.field-meta.xml b/src/core/objects/DatabaseLayerParameter__mdt/fields/Description__c.field-meta.xml similarity index 100% rename from source/objects/DatabaseLayerParameter__mdt/fields/Description__c.field-meta.xml rename to src/core/objects/DatabaseLayerParameter__mdt/fields/Description__c.field-meta.xml diff --git a/source/objects/DatabaseLayerParameter__mdt/fields/Value__c.field-meta.xml b/src/core/objects/DatabaseLayerParameter__mdt/fields/Value__c.field-meta.xml similarity index 100% rename from source/objects/DatabaseLayerParameter__mdt/fields/Value__c.field-meta.xml rename to src/core/objects/DatabaseLayerParameter__mdt/fields/Value__c.field-meta.xml diff --git a/plugins/nebula-logger/README.md b/src/plugins/nebula-logger/README.md similarity index 100% rename from plugins/nebula-logger/README.md rename to src/plugins/nebula-logger/README.md diff --git a/plugins/nebula-logger/source/classes/DatabaseLayerNebulaLoggerAdapter.cls b/src/plugins/nebula-logger/classes/DatabaseLayerNebulaLoggerAdapter.cls similarity index 100% rename from plugins/nebula-logger/source/classes/DatabaseLayerNebulaLoggerAdapter.cls rename to src/plugins/nebula-logger/classes/DatabaseLayerNebulaLoggerAdapter.cls diff --git a/plugins/nebula-logger/source/classes/DatabaseLayerNebulaLoggerAdapter.cls-meta.xml b/src/plugins/nebula-logger/classes/DatabaseLayerNebulaLoggerAdapter.cls-meta.xml similarity index 100% rename from plugins/nebula-logger/source/classes/DatabaseLayerNebulaLoggerAdapter.cls-meta.xml rename to src/plugins/nebula-logger/classes/DatabaseLayerNebulaLoggerAdapter.cls-meta.xml diff --git a/plugins/nebula-logger/source/classes/DatabaseLayerNebulaLoggerAdapterTest.cls b/src/plugins/nebula-logger/classes/DatabaseLayerNebulaLoggerAdapterTest.cls similarity index 100% rename from plugins/nebula-logger/source/classes/DatabaseLayerNebulaLoggerAdapterTest.cls rename to src/plugins/nebula-logger/classes/DatabaseLayerNebulaLoggerAdapterTest.cls diff --git a/plugins/nebula-logger/source/classes/DatabaseLayerNebulaLoggerAdapterTest.cls-meta.xml b/src/plugins/nebula-logger/classes/DatabaseLayerNebulaLoggerAdapterTest.cls-meta.xml similarity index 100% rename from plugins/nebula-logger/source/classes/DatabaseLayerNebulaLoggerAdapterTest.cls-meta.xml rename to src/plugins/nebula-logger/classes/DatabaseLayerNebulaLoggerAdapterTest.cls-meta.xml diff --git a/plugins/nebula-logger/source/customMetadata/DatabaseLayerParameter.DmlPreAndPostProcessor.md-meta.xml b/src/plugins/nebula-logger/customMetadata/DatabaseLayerParameter.DmlPreAndPostProcessor.md-meta.xml similarity index 100% rename from plugins/nebula-logger/source/customMetadata/DatabaseLayerParameter.DmlPreAndPostProcessor.md-meta.xml rename to src/plugins/nebula-logger/customMetadata/DatabaseLayerParameter.DmlPreAndPostProcessor.md-meta.xml diff --git a/plugins/nebula-logger/source/customMetadata/DatabaseLayerParameter.SoqlPreAndPostProcessor.md-meta.xml b/src/plugins/nebula-logger/customMetadata/DatabaseLayerParameter.SoqlPreAndPostProcessor.md-meta.xml similarity index 100% rename from plugins/nebula-logger/source/customMetadata/DatabaseLayerParameter.SoqlPreAndPostProcessor.md-meta.xml rename to src/plugins/nebula-logger/customMetadata/DatabaseLayerParameter.SoqlPreAndPostProcessor.md-meta.xml