Agent skill

Education Cloud Course Catalog Migrate

by forcedotcom in forcedotcom/sf-skills

A skill your agent uses to migrate course catalog data from external sources (CSV, PDF, website) and bulk-create Learning and LearningCourse records in Education Cloud.

Apache-2.0Auto-check passedData & Analytics

Install Education Cloud Course Catalog Migrate

skills CLI
$ npx skills add forcedotcom/sf-skills --skill education-cloud-course-catalog-migrate -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install forcedotcom/sf-skills education-cloud-course-catalog-migrate --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/forcedotcom/sf-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/education-cloud-course-catalog-migrate .claude/skills/education-cloud-course-catalog-migrate && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
education-cloud-course-catalog-migrate
GitHub stars
1.1k
Token cost
~5.4k tokens
SKILL.md length
2,414 words
Files
10 (incl. scripts, references)
Skills in repo
251
Repo updated
First seen
Licence
Apache-2.0

At a glance

A skill your agent uses to migrate course catalog data from external sources (CSV, PDF, website) and bulk-create Learning and LearningCourse records in Education Cloud.

  • Works in 5 steps: Ingest Primary Source → Identify Gaps and Request Additional… → Batch Create Learning and LearningCourse… → …
  • Migrate course catalog data from external sources (CSV
  • SKILL.md covers Scope, Required Inputs, Execution Transport and Workflow, plus 5 more sections
  • Runs Python scripts from its folder; calls python3

What it does

Education Cloud Course Catalog Migrate is an agent skill from forcedotcom/sf-skills. Use this skill to migrate course catalog data from external sources (CSV, PDF, website) and bulk-create Learning and LearningCourse records in Education Cloud. Triggers when a user wants to import courses, parse course catalog documents, or set up a course catalog for an academic term. Handles multi-source data ingestion, intelligent interpretation of course structures (lecture+lab linked courses via IsLinkedOnly flag, credit hours, course types), batch creation via sObject REST API, data quality validation…

Its SKILL.md is about 5.4k tokens, which your agent loads only when the skill is triggered. The skill folder holds 11 other files, including scripts and reference files (for example `references/gotchas-detail.md`, `references/gotchas.md` and `references/large-catalog-handling.md`).

It sits in Data & Analytics, covering Data cleaning, CSV and tabular files and Data pipelines and ETL. It works with Salesforce. The repository describes itself as: Salesforce's curated collection of agent skills for building applications. Optimized for Agentforce Vibes, compatible with all AI tools. The licence is Apache-2.0.

When your agent uses it

  • Migrate course catalog data from external sources (CSV
  • Website) and bulk-create Learning and LearningCourse records in Education Cloud
  • A user wants to import courses
  • Parse course catalog documents

Example prompts

  • “/education-cloud-course-catalog-migrate”

Requirements

  • Python 3

Workflow steps

5 steps, taken from the step headings in SKILL.md.

  1. Ingest Primary Source
  2. Identify Gaps and Request Additional Sources
  3. Batch Create Learning and LearningCourse Records
  4. Data Quality Validation and Conflict Resolution
  5. Summary and Verification

What it can do on your machine

Read from SKILL.md and the folder at commit e5164d9. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Ships 6 files in scripts/ (Python), which the agent can run.

    Shell commands in SKILL.md call:

    • python3

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Education Cloud Course Catalog Migrate loads about 5.4k tokens when it runs, and up to ~8.7k if it reads all its reference files. Until then it costs about 235 tokens; SKILL.md has 2,414 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~235
When it runs · the whole SKILL.md, loaded when a task matches
~5.4k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~8.7k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.

SKILL.md

The full file from forcedotcom/sf-skills at commit e5164d9, republished under its Apache-2.0 licence (© forcedotcom). 2,414 words, ~5,427 tokens.

Download SKILL.mdSave it as .claude/skills/education-cloud-course-catalog-migrate/SKILL.md (or your agent's skills folder). This skill also uses 9 other files; get the full folder from GitHub.
name
education-cloud-course-catalog-migrate
description
Use this skill to migrate course catalog data from external sources (CSV, PDF, website) and bulk-create Learning and LearningCourse records in Education Cloud. Triggers when a user wants to import courses, parse course catalog documents, or set up a course catalog for an academic term. Handles multi-source data ingestion, intelligent interpretation of course structures (lecture+lab linked courses via IsLinkedOnly flag, credit hours, course types), batch creation via sObject REST API, data quality validation, conflict resolution for existing courses, and gap identification. Explains what's missing (descriptions, types) and requests additional sources. Pauses for clarification on multi-component courses and conflicting data. DO NOT TRIGGER for creating individual Learning Course records manually, for creating Learning Programs (different workflow), or for enrollment/registration workflows.
metadata.version
1.0
metadata.domains
Education

Migrating Course Catalog to Education Cloud

Import course catalog data from multiple sources (CSV, PDF, website) and bulk-create Learning Course records with structure detection and data quality validation.

Scope

  • In scope: Multi-source ingestion (CSV, PDF, web), Learning + LearningCourse bulk creation via sObject REST API (Composite batches up to 200), linked course detection (lecture+lab via IsLinkedOnly), credit hour parsing (Duration/DurationUnit), course type mapping, data quality validation, conflict resolution, gap identification/remediation
  • Out of scope: Creating individual Learning Course records manually (delegate to metadata generation skills), creating Learning Programs (Learning.Type = 'LearningProgram' + separate child object), creating External Learning (Learning.Type = 'ExternalLearning'), course sections/offerings (CourseOffering object), enrollment/registration workflows (no dedicated skill yet — ask the user), SIS sync (separate integration workflow)

Required Inputs

Gather or infer before proceeding:

  • Target org: Active Salesforce org with Education Cloud enabled
  • Primary data source: CSV file, PDF document, or website URL with course catalog data
  • Business Account: the Academic Operations Business Account to link courses to (e.g., College of Engineering)
  • Academic term (optional): context only, not stored on Learning Course

Additional sources (gathered during workflow):

  • Supplementary data sources for missing fields (descriptions, types, mappings)
  • Lecture-lab mapping files (if multi-component courses detected)
  • Conflict resolution decisions (if existing courses found)

Defaults unless specified:

  • Course status: Active (IsActive = true on Learning)
  • Batch size: 25 records per Composite API call as an agent (API supports 200; tool-call payload limits are the binding constraint — see Step 7)
  • Data quality validation: Enabled
  • Learning.Type: 'LearningCourse' (required for course catalog entries)

Execution Transport

Resolve the API version first — do not hardcode. GET /services/data/ (no version segment) returns an endpoint map already resolved to the org's max version, not a {version, label, url} list. Pipe it into scripts/resolve_api_version.py to get {"version": "69.0"}; use as vXX.X everywhere below, including the transport probe.

Then probe transport health: GET /services/data/vXX.X/limits via headless-360 dispatch. 2xx → route all calls through it. On absent/4xx/5xx → probe other transports (other Salesforce MCP, custom MCP), use first healthy, announce it. None healthy → stop, ask user to connect one; never fabricate. (SOQL /query is routable on headless-360 — confirmed by live test; /tooling/query and ?fields= are unconfirmed, use describe + direct record reads instead.)

Never fall back to sf CLI or shell out for org credentials — a slow/oversized batch is a batch-size problem (shrink it, step 7), not a transport failure, and CLI shell-out trips an unbypassable approval gate on some surfaces. A version too new for the org returns 404 NOT_FOUND on an otherwise-healthy transport — re-read GET /services/data/, drop to the org's max version, retry, don't switch transport. See references/gotchas.md for both.


Workflow

All steps are sequential. Do not skip or reorder. If blocked, stop and ask for missing context.

Phase 1 — Ingest Primary Source
  1. Identify data source type — determine if primary source is CSV, PDF, or website URL. Ask user to provide the source if not already specified.

  2. Parse primary source — extract course data:

    • For CSV: Use Read tool to load file, parse columns
    • For PDF: Use Read tool (supports PDF extraction), parse text. Over 20 pages, read in sequential page-range chunks and merge parsed rows before validating completeness — see references/large-catalog-handling.md §1
    • For website: Use WebFetch tool to retrieve HTML, parse course listings

    Look for: course codes (identity — split into SubjectAbbreviation + CourseNumber, see step 8/9), course names (Name), credit hours (Duration + DurationUnit), descriptions (Description), course types (Lecture/Lab/Exam/Drill/Recitation), prerequisites, corequisites, linked course indicators (IsLinkedOnly), delivery modality (if the same course code repeats with different Duration/DurationUnit — see references/large-catalog-handling.md §2).

  3. Validate data completeness — pipe the parsed records into the completeness helper:

    bash
    python3 scripts/validate_completeness.py --required "CourseCode,Name,Duration" --recommended "Description,CourseType" <<'JSON'
    [ { "CourseCode": "...", "Name": "...", ... }, ... ]
    JSON

    The report gives present/missing counts per field. Optional fields (prerequisites, corequisites, linked courses) are not checked — their absence never blocks progress.

    If any required field shows missing > 0, report error and stop. If recommended fields are missing, note the gaps and continue to Phase 2.

Phase 2 — Identify Gaps and Request Additional Sources
  1. Report data quality — print a summary table showing which fields are present and which are missing. Example:

    text
    Data Quality Report:
    • Course codes: 120/120 OK
    • Course names: 120/120 OK
    • Credit hours: 120/120 OK
    • Descriptions: 115/120 (5 missing)
    • Course types: 118/120 (2 missing)
  2. Request supplementary sources — if key fields are missing (descriptions, types), ask user: "Do you have additional sources — a website, department document, or mapping file?"

    • If yes: receive additional source, parse it, and merge data with primary source
    • If no: offer to create courses with placeholder values or stop and wait for complete data

    Repeat this step until all gaps are filled or user confirms to proceed with incomplete data.

    If subject-to-Business-Account mapping is ambiguous, resolve every ambiguous case in one pass (source doc + live public catalog + course level/number patterns) and present them together, not one round at a time (see references/gotchas.md).

  3. Detect multi-component courses — pipe the course codes into the lecture/lab pairing helper:

    bash
    python3 scripts/detect_linked_courses.py --suffixes "L,LAB" <<'JSON'
    [ "BIO-201", "BIO-201L", ... ]
    JSON

    Each {"lecture", "lab"} pair returned is a candidate multi-component course.

    • If any pairs are found, pause and explain: "I found X multi-component (lecture + lab) courses. Structure them as (1) separate standalone courses, or (2) linked courses (IsLinkedOnly flag, students must take both)?"

    If user selects "linked courses", request a mapping file or confirm the naming pattern is reliable.

    Detect modality duplicates — group parsed rows by course code. Same code, different Duration/DurationUnit/Description = a modality variant (e.g. Online vs. On-Campus), not a duplicate — never silently dedupe/merge. Resolve the representation once per run, not per-course. See references/large-catalog-handling.md §2.

Phase 3 — Batch Create Learning and LearningCourse Records
  1. Prepare batch creation plan — pipe the parsed course records into the batching helper. The Composite API accepts up to 200 records/call, but an agent's tool-call payload has a smaller practical ceiling (~56KB/150 records). Use --batch-size 25 when executing as an agent (raise toward 200 only if the calling environment confirms it can handle larger payloads):

    bash
    python3 scripts/batch_courses.py --batch-size 25 <<'JSON'
    [ { "Name": "...", ... }, ... ]
    JSON

    Each element of the returned array is one Composite API call's worth of records. Print: "Starting course catalog import. I'll use Composite API to create records in batches. Total: X courses."

    If a batch still won't inline through a healthy dispatch transport, re-run with a smaller --batch-size (e.g. 10) instead of switching transport. Track dispatch vs. fallback counts and report both in the Phase 5 summary.

    Over 200 courses (8+ batches): disclose total batch count upfront, print the Batch N complete line after every batch (not just at the end), and — only if the surface exposes a parallel-task/subagent tool — follow the fan-out rules in references/large-catalog-handling.md §3-4. Never assume that capability exists; default to sequential batches.

  2. Check for existing courses — before creating Batch 1, scope the check to this batch's own course codes, never a global fetch (an unrelated catalog entry already in the org is not a conflict).

    Split this batch's course codes first (scripts/split_course_code.py) — key the check on those identity fields, never CipCode (many orgs leave it null — see references/gotchas.md).

    Headless-360 note: SOQL /query is routable via the headless-360 dispatch tool (confirmed by live test) — query LearningCourse, matching each split {SubjectAbbreviation, CourseNumber} pair exactly (SOQL has no tuple IN, so OR the pairs): SELECT Id, LearningId, Name, SubjectAbbreviation, CourseNumber FROM LearningCourse WHERE (SubjectAbbreviation = 'BIO' AND CourseNumber = '201') OR .... If Ids are unknown and a SOQL lookup isn't available, ask the user to supply them (or a prior import manifest). Never do this via Bash/CLI — see references/gotchas.md.

    If any rows come back (i.e. a SubjectAbbreviation+CourseNumber pair in this batch already exists in the org), pause and explain conflict:

    • Show existing course details vs. new import data side-by-side
    • Check if existing courses have dependencies (course offerings, enrollments)
    • Offer options: (1) Update existing courses, (2) Skip existing courses, (3) Cancel and review manually

    Wait for user decision before proceeding.

  3. Create Batch 1 — two-step process for each course:

    Field placement (verified via describe): CipCode, Duration, DurationUnit, ProviderId are createable on Learning ONLY — ProviderId on the child fails with INVALID_FIELD_FOR_INSERT_UPDATE. LearningCourse takes Name, LearningId, CourseType, IsLinkedOnly, SubjectAbbreviation, CourseNumber, Description, CourseLevelDescription, FieldOfStudy — it inherits the account link via LearningId. Confirm with describe before building the body.

    CipCode is opt-in. Federal CIP taxonomy field, not the course's identity — leave unset unless the source supplies a real CIP code and the user confirms.

    Step 1: Create Learning (parent) records via Composite API:

    http
    POST /services/data/vXX.X/composite/sobjects
    {
      "allOrNone": false,
      "records": [
        {
          "attributes": {"type": "Learning", "referenceId": "learning1"},
          "Name": "<course-name>",
          "Type": "LearningCourse",
          "Description": "<description>",
          "ProviderId": "<account-id>",
          "Duration": <hours>,
          "DurationUnit": "Credit Hours",
          "IsActive": true
        },
        ...
      ]
    }

    Capture each returned Id (order matches the records array) to use as LearningId in Step 2.

    Step 2: Create LearningCourse (child) records via Composite API:

    http
    POST /services/data/vXX.X/composite/sobjects
    {
      "allOrNone": false,
      "records": [
        {
          "attributes": {"type": "LearningCourse"},
          "Name": "<course-record-name>",
          "LearningId": "<learning-id-from-step-1>",
          "SubjectAbbreviation": "<subject-prefix>",
          "CourseNumber": "<course-number>",
          "CourseType": "<parsed-course-type>",
          "IsLinkedOnly": false
        },
        ...
      ]
    }

    Set CourseType from the parsed/mapped course type for that record (see the Gotchas table for value mapping) — do not hard-code it. A lab record must get CourseType: "Lab", not "Lecture".

    CourseType picklist values (verified): Lecture, Lab, Exam, Drill, Recitation.

    restrictedPicklist: true means only today's values are valid to submit, not that the set is closed. If a source value (e.g. DurationUnit = "Program Points") isn't in describe's list, don't silently drop/remap it — offer adding the picklist value via metadata alongside remapping or a placeholder (see references/gotchas.md).

    Print progress: Batch 1 complete — X Learning + X LearningCourse records created.

  4. Handle multi-component courses — if user selected "linked courses" in step 6:

    • Create lecture courses with CourseType: "Lecture", IsLinkedOnly = false
    • Create lab courses with CourseType: "Lab", IsLinkedOnly = true
    • Use the detect_linked_courses.py pairs (or a user-supplied mapping file) to determine which labs are linked-only
    • Print: X linked lab courses created (IsLinkedOnly = true)
  5. Repeat for remaining batches — continue steps 8-10 for Batch 2, Batch 3, etc. until all courses created.

Show full SKILL.md (901 more words)Show less
Phase 4 — Data Quality Validation and Conflict Resolution
  1. Scan for incomplete records — after all batches complete, read back each newly created record by the Id captured from its create response:

    http
    GET /services/data/vXX.X/sobjects/Learning/<id>
    GET /services/data/vXX.X/sobjects/LearningCourse/<id>

    Headless-360 note: SOQL /query is routable via the headless-360 dispatch tool (confirmed by live test) — a CreatedDate = TODAY query works as an alternative to iterating captured Ids with direct record GETs.

    Run the completeness helper separately per sObject — CourseType exists only on LearningCourse, Description only on Learning; combining both shapes into one call false-positives every parent as missing CourseType:

    bash
    python3 scripts/validate_completeness.py --required "Name" --recommended "Description" <<'JSON'
    [ { "Name": "...", "Description": "...", ... }, ... ]   # Learning read-backs only
    JSON

    Repeat with --recommended "CourseType" against LearningCourse read-backs only. Identify courses with missing descriptions (Learning report) or missing types (LearningCourse report). Print data quality report (same format as step 4).

  2. Detect conflicting data — if multiple sources provided different values for the same course, flag conflicts, e.g. "CHEM-301: website says X, PDF says Y — which should I use?" Wait for user decision, then update the conflicting courses.

  3. Remediate gaps — if user provides additional sources to fill gaps, parse them and update the incomplete courses:

    http
    PATCH /services/data/vXX.X/sobjects/Learning/<id>
    {"Description": "..."}
    
    PATCH /services/data/vXX.X/sobjects/LearningCourse/<id>
    {"CourseType": "<parsed-course-type>"}
Phase 5 — Summary and Verification
  1. Generate import summary — print final report:

    text
    Course catalog import finished!
    Summary:
    • X Learning + X LearningCourse records created
    • Y standalone, Z linked lab courses (IsLinkedOnly)
    • All courses linked to <Business Account name>, set Active
    Data sources used: 1. <primary> 2. <supplementary 1> 3. <supplementary 2>

    If any gaps were remediated from a supplementary source (step 5/14 ran), the final report MUST also include, in this order:

    • Data Quality Report — two tables, "Initial data (from <primary source>)" and "After supplementary source (<supplementary source>)", each listing every field from step 4 with its present/total count. This is the before/after pair, not just the final counts.
    • Gap Remediation — grouped by field (e.g. "Courses with missing descriptions (filled from <source>)"), a numbered list of every remediated course with the value it received. One list per remediated field.
  2. Offer verification — ask user: "Would you like me to query specific courses to verify the data? For example, I can show you a course with its LearningCourse child record, or check for any remaining data quality issues."

  3. Check the running user can actually see what was just created — don't just flag this, check it (see references/gotchas.md for the resolve-running-user + FLS/RecordTypeVisibility pattern), against every object touched (Learning, LearningCourse, Account if Person Accounts came up). Name any gap and its profile, offer the specific fix, and wait for confirmation before writing Profile/PermissionSet metadata. Default-Private OWD/sharing is org-wide, not per-user — flag it, don't offer to change it.


Rules / Constraints

ConstraintRationale
Use Composite API, batched at 25 records/call for agent execution (API supports up to 200)sObject REST standard in H360 MCP; a 150-record payload (~56KB) exceeds typical tool-call limits
Create Learning first, then LearningCourseLearningCourse.LearningId requires parent to exist first
Always set Learning.Type = 'LearningCourse'Learning is polymorphic — Type distinguishes courses from programs
Always query for existing courses before creatingPrevents duplicates; lets user decide on conflicts
Pause for clarification on multi-component coursesIsLinkedOnly flag affects enrollment behavior — user must confirm structure
Report data quality gaps before proceedingLets user provide complete data before committing to org
Wait for user decision on conflicting dataAgent cannot determine which source is authoritative
Do not invent missing dataPlaceholder values must be explicitly approved by user
Set ProviderId (Business Account) on the parent Learning ONLYCreateable on Learning, not LearningCourse — see step 9 field-placement note
Set all courses to Active status by default (IsActive = true)Must be Active to appear in catalog search/registration
Use sObject REST API, not CLI commands for org callsH360 MCP skills have no execution environment for reaching the org. The scripts/ helpers are local data transforms (no org call) — if no Bash tool is available, perform the equivalent check inline instead of skipping it
Use tool-agnostic languageSkill ships to multiple AI surfaces beyond Claude Code
Over 200 courses or 20+ source pages: follow references/large-catalog-handling.md, not ad hoc chunkingImprovised chunking risks split-page data loss or duplicate creates

Gotchas

See references/gotchas.md for known failure modes and resolutions (parsing quirks, missing Business Account, picklist mapping, partial Composite failures, and more).


Output Expectations

Deliverables:

  • X Learning records created (Type = 'LearningCourse')
  • X LearningCourse child records created (LearningId lookups)
  • Data quality report showing completeness per field
  • Import summary listing all data sources used
  • Optional: course verification via direct record reads or SOQL /query (both routable via headless-360)

No files are produced — all output is org records created via sObject REST API.


Cross-Skill Integration

NeedDelegate to
Create individual Learning Course manuallyPlatform metadata generation skills
Create Learning ProgramsNo dedicated skill yet — ask the user
Set up course sections/offeringsNo dedicated skill yet — ask the user
Configure enrollment eligibility rulesNo dedicated skill yet — ask the user

Reference File Index

  • references/gotchas.md — known failure modes and their resolutions
  • references/gotchas-detail.md — lower-frequency gotchas, linked from gotchas.md
  • references/large-catalog-handling.md — rules for >200 courses or >20-page source docs: paginated reads, modality-duplicate detection, checkpointing, gated parallel fan-out (steps 2, 6, 7)
  • scripts/resolve_api_version.py — extracts org's max API version from the headless-360 endpoint map (Execution Transport)
  • scripts/validate_completeness.py — required/recommended field presence check (steps 3, 12)
  • scripts/detect_linked_courses.py — lecture/lab course-code pairing (step 6)
  • scripts/detect_modality_variants.py — flags CourseCode rows differing by Duration/DurationUnit/Description, for large-catalog-handling.md §2
  • scripts/batch_courses.py — Composite API batch splitting (step 7)
  • scripts/split_course_code.py — SubjectAbbreviation/CourseNumber splitting (step 9)

© forcedotcom, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 9 other files (scripts, references) in skills/education-cloud-course-catalog-migrate of forcedotcom/sf-skills.

  • SKILL.md
  • references/gotchas-detail.md
  • references/gotchas.md
  • references/large-catalog-handling.md
  • scripts/batch_courses.py
  • scripts/detect_linked_courses.py
  • scripts/detect_modality_variants.py
  • scripts/resolve_api_version.py
  • scripts/split_course_code.py
  • scripts/validate_completeness.py

Open the folder on GitHubat commit e5164d9

Compare with similar skills

Education Cloud Course Catalog Migrate next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Education Cloud Course Catalog Migrate compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Education Cloud Course Catalog Migrate this skillforcedotcom/sf-skills1.1k—~5.4kAutomated safety check: PassApache-2.0
Phy Pipeline Contract EnforcerLeoYeAI/openclaw-master-skills2.2k—~4.7kAutomated safety check: PassApache-2.0
Portaljs Check Data Qualitydatopian/portaljs2.4k1 repos~1.5kAutomated safety check: PassMIT
Dataset Quality Auditzebbern/claude-code-guide4.7k—~996Automated safety check: PassMIT
Multi Source Data Integration ExtractionDrchronx/ai-agent-research-starter-kit137—~671Automated safety check: PassCustom licence
CSV Processingbenchflow-ai/skillsbench1.8k—~455Automated safety check: PassApache-2.0

Similar skills

  • Phy Pipeline Contract Enforcer

    LeoYeAI/openclaw-master-skills

    Data pipeline contract enforcer. An agent skill from LeoYeAI/openclaw-master-skills.

    2.2k GitHub stars~4.7k tokensUpdated 2 mo ago
    Data & AnalyticsAuto-check passed
  • Audit a local or remote tabular file (CSV/TSV) for common data quality issues — schema, nulls, types, duplicates.

    2.4k GitHub starsUsed in 1 repo~1.5k tokens
    Data & AnalyticsAuto-check passed
  • Dataset Quality Audit

    zebbern/claude-code-guide

    Run comprehensive quality checks on tabular data (CSV/Excel/TSV/JSON), detecting missing values, duplicates, outliers, format issues, and type inconsistencies to produce an overall score, grade, and…

    4.7k GitHub stars~996 tokensUpdated today
    Data & AnalyticsAuto-check passed
  • Multi Source Data Integration Extraction

    Drchronx/ai-agent-research-starter-kit

    Automatically merge scattered Excel and CSV files, normalize column names, and extract structured tables from PDF, HTML, TXT, or Markdown documents.

    137 GitHub stars~671 tokensUpdated 4 mo ago
    Documents & OfficeAuto-check passed
  • CSV Processing

    benchflow-ai/skillsbench

    A skill your agent uses when reading sensor data from CSV files, writing simulation results to CSV, processing time-series data with pandas, or handling missing values in datasets.

    1.8k GitHub stars~455 tokensUpdated 2 mo ago
    Data & AnalyticsAuto-check passed
  • Create a brand-new OWID dataset in ETL from a data file the user provides — a local CSV/Excel, a downloaded file, or a web link to data (snapshot → meadow → garden → grapher → PR → staging server).

    159 GitHub stars~7.5k tokensUpdated today
    Data & AnalyticsAuto-check passed

More from forcedotcom/sf-skills

All 251 skills in this repo
  • Agentforce Architecture Analyze

    forcedotcom/sf-skills

    Declared architecture snapshot for one Agentforce agent: planner, topics, actions, flows, Apex, prompt templates, and NGA plugins.

    1.1k GitHub stars~4.5k tokensUpdated yesterday
    Auto-check passed
  • Agentforce D360 Analyze

    forcedotcom/sf-skills

    Data Cloud 360° view of a single Agentforce session. An agent skill from forcedotcom/sf-skills.

    1.1k GitHub stars~3.4k tokensUpdated yesterday
    Auto-check passed
  • Apply a Salesforce sandbox post-copy automation JSON config against a target org.

    1.1k GitHub stars~5.3k tokensUpdated yesterday
    Auto-check: notes
  • Apply a Salesforce sandbox post-copy automation JSON config against a target org.

    1.1k GitHub stars~5.4k tokensUpdated yesterday
    Auto-check: notes
  • Design Systems Slds Apply

    forcedotcom/sf-skills

    Apply SLDS-compliant UI using the correct blueprints, styling hooks, utility classes, and icons.

    1.1k GitHub stars~3.7k tokensUpdated yesterday
    Auto-check passed
  • Experience Lwc Generate

    forcedotcom/sf-skills

    Lightning Web Components with PICKLES methodology and 165-point scoring.

    1.1k GitHub stars~2.4k tokensUpdated yesterday
    Auto-check passed

Works with

Questions about Education Cloud Course Catalog Migrate

What does Education Cloud Course Catalog Migrate do?

A skill your agent uses to migrate course catalog data from external sources (CSV, PDF, website) and bulk-create Learning and LearningCourse records in Education Cloud. Education Cloud Course Catalog Migrate is an agent skill from forcedotcom/sf-skills. Use this skill to migrate course catalog data from external sources (CSV, PDF, website) and bulk-create Learning and LearningCourse records in Education Cloud.

When should I use Education Cloud Course Catalog Migrate?

Education Cloud Course Catalog Migrate fits situations like: migrate course catalog data from external sources (CSV; website) and bulk-create Learning and LearningCourse records in Education Cloud; A user wants to import courses; parse course catalog documents.

How do I install Education Cloud Course Catalog Migrate in Claude Code?

Run `npx skills add forcedotcom/sf-skills --skill education-cloud-course-catalog-migrate -a claude-code`. Or copy the skill folder (skills/education-cloud-course-catalog-migrate in forcedotcom/sf-skills) into .claude/skills/education-cloud-course-catalog-migrate in your project. Claude Code loads it when a task matches its description.

How do I install Education Cloud Course Catalog Migrate in Codex?

Run `npx skills add forcedotcom/sf-skills --skill education-cloud-course-catalog-migrate -a codex`. Or copy the skill folder (skills/education-cloud-course-catalog-migrate in forcedotcom/sf-skills) into .agents/skills/education-cloud-course-catalog-migrate in your project. Codex loads it when a task matches its description.

Can I use Education Cloud Course Catalog Migrate in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add forcedotcom/sf-skills --skill education-cloud-course-catalog-migrate -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/education-cloud-course-catalog-migrate, .gemini/skills/education-cloud-course-catalog-migrate, .github/skills/education-cloud-course-catalog-migrate and .opencode/skills/education-cloud-course-catalog-migrate in your project.

What does Education Cloud Course Catalog Migrate need to run?

Going by SKILL.md and its folder, Education Cloud Course Catalog Migrate needs Python for the scripts in its folder and the command-line tools its instructions call (python3). Our summary lists: Python 3.

Does Education Cloud Course Catalog Migrate access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Education Cloud Course Catalog Migrate safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.

What licence does Education Cloud Course Catalog Migrate use?

Education Cloud Course Catalog Migrate is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Education Cloud Course Catalog Migrate use?

About 5.4k tokens (SKILL.md is roughly 22k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 3.3k tokens, read only when the agent opens those files.

What are the alternatives to Education Cloud Course Catalog Migrate?

Skills that share tags, products or a category with Education Cloud Course Catalog Migrate: Phy Pipeline Contract Enforcer (LeoYeAI/openclaw-master-skills, 2.2k stars), Portaljs Check Data Quality (datopian/portaljs, 2.4k stars), Dataset Quality Audit (zebbern/claude-code-guide, 4.7k stars) and Multi Source Data Integration Extraction (Drchronx/ai-agent-research-starter-kit, 137 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Education Cloud Course Catalog Migrate?

forcedotcom (a GitHub organization) maintains it in forcedotcom/sf-skills, which has 1,065 GitHub stars. The repository holds 251 skills in this directory. The repository was last updated on October 7, 2026.

Source: forcedotcom/sf-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.