Skip to content
Development
Skill

/sap-cc-campaign

Owns the S/4HANA custom-code migration campaign workspace and is the orchestration entry point for the sap-migrate engine. Five subcommands: init — create a campaign workspace from the migration Customer Brief (source/target release, in-scope packages, decommission policy,

From plugin
sap-dev
8123 skills3 agents
Install
$ npx -y skills add sapdev-ai/sap-dev --skill sap-cc-campaign --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/sap-cc-campaign

Context preview

The summary Claude sees to decide when to auto-load this skill.

Owns the S/4HANA custom-code migration campaign workspace and is the orchestration entry point for the sap-migrate engine. Five subcommands: init — create a campaign workspace from the migration Customer Brief (source/target release, in-scope packages, decommission policy,

SKILL.md

sap-cc-campaign.SKILL.md
name: sap-cc-campaign
description: |
  Owns the S/4HANA custom-code migration campaign workspace and is the
  orchestration entry point for the sap-migrate engine. Five subcommands:
    init   — create a campaign workspace from the migration Customer Brief
             (source/target release, in-scope packages, decommission policy,
             connection profiles, human gates) + the empty state ledger.
    status — per-state / per-tier counts + headline metrics.
    report — render reports/dashboard.md: state/tier/pattern rollup + five KPIs
             (decommission savings, ATC-clean rate, auto-fix rate, unmatched-finding
             backlog, business sign-off); every percentage honest ("n/a", not 0%,
             when the ledger isn't produced yet).
    next   — recommend the next pipeline skill, honouring the human-approval gates.
    signoff— record a business-owner sign-off in campaign.json.
  Pure workspace/state/reporting skill — OFFLINE (no SAP GUI, no RFC, no NCo); it
  only reads/writes the campaign files the other sap-cc-* skills produce.
  Prerequisites: none (the downstream skills it sequences do need SAP access).
argument-hint: "<init|status|report|next|signoff> --campaign <id> [--brief <path>] [--source <profile>] [--sandbox <profile>] [--check-system <profile>] [--target-release <rel>] [--gate <gate>] [--owner <name>] [--signoff-status APPROVED|PENDING|REJECTED] [--note <text>]"

SAP Custom-Code Migration — Campaign Manager

You own the **campaign workspace** for an S/4HANA custom-code migration and act as the pipeline's orchestration brain. Every other `sap-cc-*` skill writes into and reads from the workspace you create here; this skill never touches the SAP system itself. It is fast, offline, and safe to call as often as you like.

Task: $ARGUMENTS

---

Shared Resources

| File | Token | Purpose | |---|---|---| | `<SAP_DEV_CORE_SHARED_DIR>/rules/skill_operating_rules.md` | *(rule)* | Mandatory operating rules (applies to the downstream skills this one sequences). | | `<SAP_DEV_CORE_SHARED_DIR>/rules/settings_lookup.md` | *(rule)* | Settings/`work_dir` resolution contract. | | `<SAP_DEV_CORE_SHARED_DIR>/scripts/sap_settings_lib.ps1` | *(dot-source)* | `Get-SapSettingValue` — settings merge. | | `<SAP_DEV_CORE_SHARED_DIR>/scripts/sap_connection_lib.ps1` | *(dot-source)* | `Get-SapWorkDir` — env-aware `work_dir`. | | `<SAP_DEV_CORE_SHARED_DIR>/scripts/sap_log_helper.ps1` | *(invoke)* | Start/step/end JSONL logging across bash blocks. | | `<SAP_DEV_CORE_SHARED_DIR>/templates/migration_brief.md` | *(read)* | Migration Campaign Brief (+ `migration_brief_sample.md`); supplies the campaign profile for `init` (resolved via the standard Template Language Resolution order). Distinct from the build-time `customer_brief.md`. | | `<SKILL_DIR>/references/sap_cc_campaign.ps1` | *(invoke)* | **Companion helper (v1, shipped).** Offline aggregator: performs the atomic `init` write (campaign.json + `state.tsv`), and for `status` / `report` / `next` reads `state.tsv` (+ the triage pattern summary) and emits parseable count / recommendation lines. | | `<SKILL_DIR>/references/sap_cc_drift_read.ps1` | *(invoke, RFC)* | **Landscape-drift reader** (optional `report` pre-step). Reads the source system's `E070`/`E071` for transports touching in-scope objects since the campaign start (`--MaxTrs`-bounded) + `SMODILOG` (SPDD/SPAU exposure), writes `drift\drift.tsv`. Read-only. Emits `DRIFT:` / `DRIFT_OBJ:` / `WINDOW_WARN:` / `STATUS: OK\|NO_DRIFT\|ERROR`. |

> This skill drives no SAP GUI, so — unlike the deploy skills — it does NOT > include `language_independence_rules.md`, the session broker, the attach > library, or any RFC lib. Keep it that way: campaign state is plain files.

---

Step 0 — Resolve Work Directory and Settings

**Resolve `work_dir` via the env-aware helper** — do NOT read `work_dir` from `settings.json` directly (that ignores `SAPDEV_AI_WORK_DIR` and `userconfig.json`). Parse the `WORK_DIR=` line from:

powershell -NoProfile -ExecutionPolicy Bypass -Command ". '<SAP_DEV_CORE_SHARED_DIR>\scripts\sap_settings_lib.ps1'; . '<SAP_DEV_CORE_SHARED_DIR>\scripts\sap_connection_lib.ps1'; Write-Output ('WORK_DIR=' + (Get-SapWorkDir)); Write-Output ('CUSTOM_URL=' + (Get-SapSettingValue 'custom_url' ((Get-SapWorkDir) + '\custom')))"

Set `{WORK_TEMP}` = `{work_dir}\temp` and ensure it exists:

cmd /c if not exist "{WORK_TEMP}" mkdir "{WORK_TEMP}"

Set `{RUN_TEMP}` = the per-run scratch dir (`Get-SapRunTemp` mints + creates `{work_dir}\temp\run_<id>`):

powershell -NoProfile -ExecutionPolicy Bypass -Command ". '<SAP_DEV_CORE_SHARED_DIR>\scripts\sap_connection_lib.ps1'; Write-Output ('RUN_TEMP=' + (Get-SapRunTemp))"

Per the CLAUDE.md "Two-bucket temp model" write this skill's per-run scratch (the log state file below) under `{RUN_TEMP}`, never at a fixed name under the `{WORK_TEMP}` root.

`{custom_url}` (from the same command) is needed only by `init` to resolve a customer-overridden migration brief.

---

Step 0.5 — Start Logging

State file: `{RUN_TEMP}\sap_cc_campaign_run.json`. Best-effort.

powershell -ExecutionPolicy Bypass -File "<SAP_DEV_CORE_SHARED_DIR>\scripts\sap_log_helper.ps1" -Action start -StateFile "{RUN_TEMP}\sap_cc_campaign_run.json" -Skill sap-cc-campaign -ParamsJson "{}"

(Pass the parsed args into `-ParamsJson` when convenient, e.g. `{"sub":"init","campaign":"CCMIG01"}`.)

---

Step 1 — Parse Arguments & Dispatch

Parse `$ARGUMENTS`:

  • **Positional 1** — the subcommand: `init` | `status` | `report` | `next` |

`signoff`. If missing or unrecognised → print usage (the `argument-hint`) and exit `2`.

  • `--campaign <id>` — **required for all subcommands.** Validate it matches

`^[A-Za-z0-9_-]{1,40}$` (it becomes a folder name). On violation exit `2`.

  • `init` also accepts: `--brief <path>`, `--source <profile>`,

`--sandbox <profile>`, `--check-system <profile>`, `--target-release <rel>`. These o

Read more
Ships withsap-dev

SAP development automation skills for AI coding assistants. Windows-only — the skills drive SAP GUI for Windows via GUI Scripting (plus optional RFC via SAP NCo); there is no macOS/Linux path.

Get the whole plugin

Other skills on sap-dev.