Skip to main content

Overview

When multiple people work on the same Kodexa environment — some editing resources in the UI and others pushing changes from YAML files — conflicts can occur. The CLI uses sync state files to detect when a resource on the server has changed since your last pull. This prevents accidental overwrites where one person’s changes silently replace another’s, giving you the chance to review and merge before pushing.

How It Works

Each time you run kdx sync pull, the CLI records the changeSequence of every fetched resource in a state file at .sync-state/<env>.yaml. When you later run kdx sync push, the CLI compares the stored sequence against the server’s current value:
Stored stateServer stateWhat happens
No entry (never pulled)AnyPushes normally — no baseline to compare
Sequences matchSamePushes normally — no server-side changes
Sequences differChangedConflict — resource skipped with warning
Entry existsResource deletedPushes normally — recreates the resource

Example Conflict Output

When a conflict is detected, you will see a warning like:
⚠️  CONFLICT data-definition/freight-agents — server changeSequence is 15
    but was 12 when last pulled on 2026-04-08. Skipping (use --force to overwrite)
The resource is skipped, and all other non-conflicting resources continue to be pushed normally.

The --force Flag

Use --force to push conflicted resources anyway, overwriting server-side changes:
kdx sync push --target my-org --env dev --force
Using --force overwrites any changes made to the resource on the server since your last pull. Always review conflicts before force-pushing.

Sync State Files

State files are stored at .sync-state/<env>.yaml in your repository root, one per environment:
# Auto-generated by kdx sync — do not edit manually
schemaVersion: "1.0"
environment: dev4
url: https://dev4.kodexacloud.com
organization: my-org
resources:
  datadefinition/freight-agents:
    changeSequence: 12
    pulledAt: "2026-04-08T20:00:00Z"
  dataform/accessorial:
    changeSequence: 7
    pulledAt: "2026-04-08T20:00:00Z"
  tasktemplate/freight-agents/freight-document-pack:
    changeSequence: 3
    pulledAt: "2026-04-08T20:00:00Z"
Commit state files to git. This allows your team to share the same baseline — if one person pulls and commits the state file, others will get conflict detection even without pulling themselves.
For teams where some users edit resources in the Kodexa UI while others manage YAML files:
# 1. Pull latest state from the environment
kdx sync pull --target my-org --env dev
git add .sync-state/ kodexa-resources/
git commit -m "Sync from dev: $(date)"

# 2. Make your YAML changes
vim kodexa-resources/data-definitions/my-taxonomy.yaml

# 3. Dry-run to check for conflicts before pushing
kdx sync push --target my-org --env dev --dry-run

# 4. If no conflicts, push
kdx sync push --target my-org --env dev

# 5. If conflicts detected, re-pull to get latest, then merge
kdx sync pull --target my-org --env dev
# Review changes, resolve any differences in YAML files
kdx sync push --target my-org --env dev

Environment Name Resolution

The state file name is derived from the environment:
  • --env dev4 creates .sync-state/dev4.yaml
  • --to-url https://dev4.kodexacloud.com creates .sync-state/dev4.kodexacloud.com.yaml
  • --to-profile myprofile derives the name from the profile’s URL
This means each environment’s state is tracked independently — a conflict on dev4 has no effect on pushes to staging.