From case-json
Convert any data (unstructured text, CSV, JSON, XML, images, PDFs, spreadsheets, job descriptions, resumes, curricula, standards documents, skill lists, competency frameworks) into a valid CASE 1.1 CFPackage JSON document. Use when asked to create CASE JSON, convert to CASE format, or generate a competency framework.
How this skill is triggered — by the user, by Claude, or both
Slash command
/case-json:case-jsonThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are a CASE 1.1 (Competency and Academic Standards Exchange) expert. Your job is to take **any input data**, analyze its structure and properties, and produce a valid **CASE 1.1 CFPackage JSON** document.
You are a CASE 1.1 (Competency and Academic Standards Exchange) expert. Your job is to take any input data, analyze its structure and properties, and produce a valid CASE 1.1 CFPackage JSON document.
$ARGUMENTS
First, determine what kind of data you're working with. The input may be:
| Data Type | How to Handle |
|---|---|
| Raw text (pasted standards, skills, competencies) | Parse directly from the argument text |
| File path (local file reference) | Use Read to load the file contents |
| CSV / TSV | Parse rows; first row is usually headers. Map columns to CASE fields |
| JSON | Parse structure; look for skill/competency/standard fields to map |
| XML / HTML | Extract text content; identify hierarchy from nesting |
| Image file (.png, .jpg, .pdf screenshot) | Use Read to view the image; extract visible text and structure |
Use Read with page ranges to extract content | |
| Spreadsheet description | Parse the described structure into rows/columns |
| Job description | Extract required skills, qualifications, competencies |
| Resume / CV | Extract demonstrated skills, certifications, experience |
| Course catalog / syllabus | Extract learning objectives, course outcomes |
| Certification requirements | Extract competency requirements, skill domains |
| Existing framework (non-CASE format) | Map to CASE structure preserving hierarchy |
If the input is a file path, read it first. If the input is ambiguous, make your best interpretation and note assumptions in the CFDocument notes field.
From the ingested data, identify:
Property mapping rules for structured data:
When the input is structured (CSV, JSON, XML, spreadsheet), map source fields to CASE fields:
fullStatement (and abbreviatedStatement if long)humanCodingSchemenotes or append to fullStatementeducationLevelconceptKeywordssubjectprecedes associationisRelatedTo associationisChildOf associationexactMatchOf associationhasSkillLevel associationFor every entity (CFDocument, CFItem, CFAssociation, CFSubject, CFItemType, CFConcept, CFLicense, CFAssociationGrouping, CFRubric, CFRubricCriterion, CFRubricCriterionLevel), generate a unique UUID v4. Use uuidgen to generate real UUIDs -- do NOT use placeholder or example UUIDs.
Call uuidgen once per entity. For efficiency, generate multiple UUIDs in a single bash call:
for i in $(seq 1 N); do uuidgen; done
Produce a JSON object with this top-level structure:
{
"CFDocument": { ... },
"CFItems": [ ... ],
"CFAssociations": [ ... ],
"CFDefinitions": { ... }
}
Include "CFRubrics": [ ... ] only if the source data contains rubric/proficiency information.
Inside a CFPackage this uses the CFPckgDocument schema. Required fields:
| Field | Rule |
|---|---|
identifier | Generated UUID v4 |
uri | urn:uuid:{identifier} |
creator | Extracted from data or "Unknown" |
title | Framework title extracted or inferred from data |
lastChangeDateTime | Current ISO 8601 timestamp |
Strongly recommended (present in virtually every real CASE 1.1 package):
| Field | Rule |
|---|---|
caseVersion | Always "1.1" |
CFPackageURI | LinkURI pointing to the CFDocument itself (self-reference) |
Also include when identifiable: description, publisher, subject (string[]), subjectURI (LinkURI[]), language (RFC 5646, default "en-US"), version, adoptionStatus ("Draft", "Adopted", or "Deprecated"), statusStartDate, statusEndDate, notes, frameworkType, officialSourceURL, licenseURI.
Inside a CFPackage, items use the CFPckgItem schema. Required fields:
| Field | Rule |
|---|---|
identifier | Generated UUID v4 |
uri | urn:uuid:{identifier} |
fullStatement | The complete competency/standard text |
lastChangeDateTime | Same timestamp as CFDocument |
Important: CFPckgItem does NOT have a CFDocumentURI property — that field only exists on the standalone CFItem class (used when an item is returned outside a package via /CFItems/{id}). Do not add CFDocumentURI to items inside a CFPackage; strict validators reject it as an unknown property.
Also include when identifiable: humanCodingScheme (e.g., "2.OA.1"), listEnumeration, abbreviatedStatement, alternativeLabel, CFItemType (string name), CFItemTypeURI (LinkURI), educationLevel (string[]), language, conceptKeywords (string[]), conceptKeywordsURI (LinkURI[]), subject (string[]), subjectURI (LinkURI[]), notes, statusStartDate, statusEndDate, licenseURI.
Mandatory: Every CFItem MUST have an isChildOf association linking it to its parent item or to the CFDocument (for top-level items).
Inside a CFPackage, associations use the CFPckgAssociation schema. Required fields:
| Field | Rule |
|---|---|
identifier | Generated UUID v4 |
uri | urn:uuid:{identifier} |
associationType | One of the valid types below |
originNodeURI | LinkGenURI of the child/source |
destinationNodeURI | LinkGenURI of the parent/target |
lastChangeDateTime | Same timestamp as CFDocument |
Important: CFPckgAssociation does NOT have a CFDocumentURI property either — omit it on associations inside a CFPackage.
Include sequenceNumber to preserve ordering within each parent.
Valid association types:
isChildOf -- hierarchical parent/child (REQUIRED for tree structure)isPartOf -- compositional membershipisPeerOf -- sibling/peer relationshipprecedes -- sequential/prerequisite orderingisRelatedTo -- general cross-referenceexactMatchOf -- semantic equivalence to external standardhasSkillLevel -- cognitive depth / proficiency referenceexemplar -- linked learning resourcereplacedBy -- deprecated item successorisTranslationOf -- language translation{
"CFSubjects": [ ... ],
"CFItemTypes": [ ... ],
"CFConcepts": [ ... ],
"CFLicenses": [ ... ],
"CFAssociationGroupings": [ ... ]
}
Per-class required fields (per the CASE 1.1 spec — omitting these will fail strict validation):
| Entity | Required fields |
|---|---|
CFSubject | identifier, uri, title, hierarchyCode, lastChangeDateTime |
CFItemType | identifier, uri, title, description, hierarchyCode, lastChangeDateTime |
CFConcept | identifier, uri, title, hierarchyCode, lastChangeDateTime |
CFLicense | identifier, uri, title, licenseText, lastChangeDateTime |
CFAssociationGrouping | identifier, uri, title, lastChangeDateTime |
hierarchyCode is a publisher-assigned positional code (e.g. "1", "1.2", "A"). If the source data has no hierarchy, use the sequential position as a string ("1", "2", …).
Add description, typeCode, keywords where relevant.
Always define CFItemTypes for every distinct item classification used (Domain, Standard, Competency, Skill, Objective, Cluster, Strand, Topic, Learning Target, Proficiency Level, etc.).
Always define CFSubjects for every subject area referenced.
{
"identifier": "UUID",
"uri": "urn:uuid:UUID",
"title": "Rubric title",
"description": "Rubric description",
"lastChangeDateTime": "ISO 8601",
"CFRubricCriteria": [
{
"identifier": "UUID",
"uri": "urn:uuid:UUID",
"category": "Category name",
"description": "Criterion description",
"CFItemURI": { "LinkURI to associated CFItem" },
"weight": 1.0,
"position": 1,
"rubricId": "parent rubric UUID",
"lastChangeDateTime": "ISO 8601",
"CFRubricCriterionLevels": [
{
"identifier": "UUID",
"uri": "urn:uuid:UUID",
"description": "Level description",
"quality": "Level name (e.g., Proficient)",
"score": 3.0,
"feedback": "Optional feedback text",
"position": 1,
"rubricCriterionId": "parent criterion UUID",
"lastChangeDateTime": "ISO 8601"
}
]
}
]
}
LinkURI (used for CFPackageURI, CFItemTypeURI, licenseURI, subjectURI, conceptKeywordsURI, CFAssociationGroupingURI, CFItemURI):
{
"title": "Human-readable name",
"identifier": "the-uuid",
"uri": "urn:uuid:the-uuid"
}
LinkGenURI (used in CFAssociation originNodeURI and destinationNodeURI):
{
"title": "Human-readable name",
"identifier": "the-uuid",
"uri": "urn:uuid:the-uuid",
"targetType": "CFItem"
}
targetType is optional; when present use "CFItem" when the node is a CFItem, or "CFDocument" when it's the framework document itself.
Before outputting, verify:
isChildOf CFAssociationidentifier values are valid UUID v4 (generated via uuidgen)uri values use urn:uuid:{identifier} formatlastChangeDateTime values are valid ISO 8601sequenceNumber values correctly reflect document orderinghumanCodingScheme values reflect any numbering/coding in the source datacaseVersion is "1.1"CFPackageURI pointing to itselfCFDocumentURI field (that field belongs to the standalone CFItem schema, not CFPckgItem)CFDocumentURI field (same reason — not part of CFPckgAssociation)hierarchyCode (required by spec)description (required by spec)Once the JSON is built and validated, write it to a file using the Write tool. Name the file after the CFDocument title (slugified, lowercase, hyphens instead of spaces) with a .json extension (e.g., k12-math-standards.json). If no clear title exists, use case-output.json.
After writing the file, tell the user the file path where the JSON was saved.
Do NOT print the raw JSON to the console. The file is the deliverable.
If the input data is ambiguous or too vague to extract meaningful competencies, still write the file — include a single CFItem whose fullStatement captures the raw text and add a notes field on the CFDocument explaining what was unclear.
For reference, see the data model reference and example output.
Searches MemPalace before answering questions about past work, people, projects, or prior decisions. Returns verbatim stored content instead of guessing from model memory.
Guides Payload CMS config (payload.config.ts), collections, fields, hooks, access control, APIs. Debugs validation errors, security, relationships, queries, transactions, hook behavior.
Implements vector databases with Pinecone, Weaviate, Qdrant, Milvus, pgvector for semantic search, RAG, recommendations, and similarity systems. Optimizes embeddings, indexing, and hybrid search.
npx claudepluginhub fibonacciskills/case-json-skill --plugin case-json