slxd-coursekit 0.1.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. coursekit/__init__.py +8 -0
  2. coursekit/__main__.py +5 -0
  3. coursekit/agentkit/__init__.py +0 -0
  4. coursekit/agentkit/agents/reviewer.md +29 -0
  5. coursekit/agentkit/agents/writer.md +26 -0
  6. coursekit/agentkit/commands/approve-design.md +19 -0
  7. coursekit/agentkit/commands/approve-unit.md +18 -0
  8. coursekit/agentkit/commands/assemble.md +10 -0
  9. coursekit/agentkit/commands/client-feedback.md +9 -0
  10. coursekit/agentkit/commands/course-status.md +7 -0
  11. coursekit/agentkit/commands/define-theme.md +10 -0
  12. coursekit/agentkit/commands/deliver.md +11 -0
  13. coursekit/agentkit/commands/design-change.md +14 -0
  14. coursekit/agentkit/commands/new-course.md +29 -0
  15. coursekit/agentkit/commands/produce-media.md +10 -0
  16. coursekit/agentkit/commands/review-unit.md +12 -0
  17. coursekit/agentkit/commands/sync-directives.md +19 -0
  18. coursekit/agentkit/commands/write-unit.md +25 -0
  19. coursekit/agentkit/docs/content-format.md +126 -0
  20. coursekit/agentkit/docs/slxd-mcp.md +41 -0
  21. coursekit/agentkit/skills/_slxd-tools.md +10 -0
  22. coursekit/agentkit/skills/client-review/SKILL.md +50 -0
  23. coursekit/agentkit/skills/content-review/SKILL.md +78 -0
  24. coursekit/agentkit/skills/content-writing/SKILL.md +70 -0
  25. coursekit/agentkit/skills/creator-assembly/SKILL.md +101 -0
  26. coursekit/agentkit/skills/delivery/SKILL.md +48 -0
  27. coursekit/agentkit/skills/html-assembly/SKILL.md +51 -0
  28. coursekit/agentkit/skills/instructional-design/SKILL.md +117 -0
  29. coursekit/agentkit/skills/media-production/SKILL.md +97 -0
  30. coursekit/agentkit/skills/theme-definition/SKILL.md +67 -0
  31. coursekit/agents.py +363 -0
  32. coursekit/approve.py +206 -0
  33. coursekit/assemble.py +794 -0
  34. coursekit/brief.py +268 -0
  35. coursekit/catalog.py +189 -0
  36. coursekit/cli.py +318 -0
  37. coursekit/clientreview.py +139 -0
  38. coursekit/commands.py +895 -0
  39. coursekit/config.py +130 -0
  40. coursekit/course.py +114 -0
  41. coursekit/defaults/__init__.py +0 -0
  42. coursekit/defaults/agents.yaml +21 -0
  43. coursekit/defaults/delivery.yaml +13 -0
  44. coursekit/defaults/directives.yaml +79 -0
  45. coursekit/defaults/media.yaml +59 -0
  46. coursekit/defaults/rules.yaml +54 -0
  47. coursekit/delivery.py +130 -0
  48. coursekit/directives.py +56 -0
  49. coursekit/doctor.py +144 -0
  50. coursekit/envfile.py +38 -0
  51. coursekit/fingerprint.py +59 -0
  52. coursekit/handoff.py +472 -0
  53. coursekit/htmlkit/__init__.py +5 -0
  54. coursekit/htmlkit/build.py +249 -0
  55. coursekit/htmlkit/check.py +106 -0
  56. coursekit/htmlkit/manifest.py +52 -0
  57. coursekit/htmlkit/render.py +374 -0
  58. coursekit/htmlkit/sanitize.py +96 -0
  59. coursekit/i18n.py +96 -0
  60. coursekit/identity.py +37 -0
  61. coursekit/init.py +314 -0
  62. coursekit/lang/__init__.py +47 -0
  63. coursekit/lang/en.yaml +83 -0
  64. coursekit/lang/es.yaml +83 -0
  65. coursekit/lang/messages/__init__.py +0 -0
  66. coursekit/lang/messages/agents.yaml +10 -0
  67. coursekit/lang/messages/approve.yaml +57 -0
  68. coursekit/lang/messages/assemble.yaml +73 -0
  69. coursekit/lang/messages/brief.yaml +57 -0
  70. coursekit/lang/messages/cli.yaml +129 -0
  71. coursekit/lang/messages/clientreview.yaml +24 -0
  72. coursekit/lang/messages/commands.yaml +314 -0
  73. coursekit/lang/messages/config.yaml +4 -0
  74. coursekit/lang/messages/course.yaml +12 -0
  75. coursekit/lang/messages/delivery.yaml +18 -0
  76. coursekit/lang/messages/directives.yaml +14 -0
  77. coursekit/lang/messages/doctor.yaml +57 -0
  78. coursekit/lang/messages/handoff.yaml +92 -0
  79. coursekit/lang/messages/htmlkit.yaml +20 -0
  80. coursekit/lang/messages/init.yaml +30 -0
  81. coursekit/lang/messages/launch.yaml +31 -0
  82. coursekit/lang/messages/media.yaml +54 -0
  83. coursekit/lang/messages/mediatools.yaml +35 -0
  84. coursekit/lang/messages/new.yaml +2 -0
  85. coursekit/lang/messages/outline.yaml +11 -0
  86. coursekit/lang/messages/project.yaml +4 -0
  87. coursekit/lang/messages/publish.yaml +29 -0
  88. coursekit/lang/messages/refresh.yaml +10 -0
  89. coursekit/lang/messages/setup.yaml +115 -0
  90. coursekit/lang/messages/states.yaml +9 -0
  91. coursekit/lang/messages/status.yaml +63 -0
  92. coursekit/lang/messages/sync.yaml +25 -0
  93. coursekit/lang/messages/theme.yaml +32 -0
  94. coursekit/lang/messages/uninstall.yaml +34 -0
  95. coursekit/lang/messages/verify.yaml +75 -0
  96. coursekit/lang/messages/voices.yaml +42 -0
  97. coursekit/launch.py +386 -0
  98. coursekit/media.py +341 -0
  99. coursekit/mediatools.py +223 -0
  100. coursekit/new.py +85 -0
  101. coursekit/outline.py +65 -0
  102. coursekit/project.py +88 -0
  103. coursekit/publish.py +210 -0
  104. coursekit/refresh.py +80 -0
  105. coursekit/setup.py +371 -0
  106. coursekit/states.py +123 -0
  107. coursekit/status.py +68 -0
  108. coursekit/store.py +153 -0
  109. coursekit/sync.py +264 -0
  110. coursekit/templates/__init__.py +0 -0
  111. coursekit/templates/brief/__init__.py +0 -0
  112. coursekit/templates/brief/links.md +4 -0
  113. coursekit/templates/brief/notes.md +13 -0
  114. coursekit/templates/course/__init__.py +0 -0
  115. coursekit/templates/course/course.yaml +40 -0
  116. coursekit/templates/course/en/__init__.py +0 -0
  117. coursekit/templates/course/en/assessment.md +12 -0
  118. coursekit/templates/course/en/content.md +9 -0
  119. coursekit/templates/course/es/__init__.py +0 -0
  120. coursekit/templates/course/es/assessment.md +12 -0
  121. coursekit/templates/course/es/content.md +9 -0
  122. coursekit/templates/html/__init__.py +0 -0
  123. coursekit/templates/html/package.json +9 -0
  124. coursekit/templates/html/player/entry.js +123 -0
  125. coursekit/templates/html/player/questions.js +265 -0
  126. coursekit/templates/html/player/scorm.js +92 -0
  127. coursekit/templates/html/player/widgets.js +126 -0
  128. coursekit/templates/html/styles/base.css +162 -0
  129. coursekit/templates/project/AGENTS.md +44 -0
  130. coursekit/templates/project/CLAUDE.md +1 -0
  131. coursekit/templates/project/__init__.py +0 -0
  132. coursekit/templates/project/brief/links.md +4 -0
  133. coursekit/templates/project/brief/notes.md +12 -0
  134. coursekit/templates/project/env.example +37 -0
  135. coursekit/templates/project/githooks/__init__.py +0 -0
  136. coursekit/templates/project/githooks/post-checkout +4 -0
  137. coursekit/templates/project/githooks/post-merge +7 -0
  138. coursekit/templates/project/gitignore +19 -0
  139. coursekit/templates/project/project.yaml +42 -0
  140. coursekit/templates/remotion/__init__.py +0 -0
  141. coursekit/templates/remotion/package.json +19 -0
  142. coursekit/templates/remotion/src/Root.tsx +32 -0
  143. coursekit/templates/remotion/src/index.ts +4 -0
  144. coursekit/templates/remotion/src/theme.ts +7 -0
  145. coursekit/templates/remotion/tsconfig.json +13 -0
  146. coursekit/theme.py +454 -0
  147. coursekit/tools/__init__.py +0 -0
  148. coursekit/tools/web2md.js +513 -0
  149. coursekit/uninstall.py +205 -0
  150. coursekit/util.py +76 -0
  151. coursekit/verify.py +355 -0
  152. coursekit/voices.py +131 -0
  153. slxd_coursekit-0.1.2.dist-info/METADATA +115 -0
  154. slxd_coursekit-0.1.2.dist-info/RECORD +157 -0
  155. slxd_coursekit-0.1.2.dist-info/WHEEL +4 -0
  156. slxd_coursekit-0.1.2.dist-info/entry_points.txt +2 -0
  157. slxd_coursekit-0.1.2.dist-info/licenses/LICENSE +21 -0
coursekit/__init__.py ADDED
@@ -0,0 +1,8 @@
1
+ """coursekit: AI-assisted e-learning course production."""
2
+
3
+ from importlib.metadata import PackageNotFoundError, version
4
+
5
+ try:
6
+ __version__ = version("slxd-coursekit")
7
+ except PackageNotFoundError: # running from a source checkout without installing
8
+ __version__ = "0.0.0"
coursekit/__main__.py ADDED
@@ -0,0 +1,5 @@
1
+ import sys
2
+
3
+ from coursekit.cli import main
4
+
5
+ sys.exit(main())
File without changes
@@ -0,0 +1,29 @@
1
+ ---
2
+ description: AI reviewer of course units. Reviews content.md and assessment.md of one unit with the content-review skill and writes the report in reviews/.
3
+ mode: primary
4
+ model: {{model}}
5
+ temperature: 0.2
6
+ permission:
7
+ edit: allow
8
+ bash:
9
+ "*": ask
10
+ "coursekit verify*": allow
11
+ "coursekit status*": allow
12
+ "coursekit brief*": allow
13
+ "coursekit outline*": allow
14
+ "coursekit config*": allow
15
+ "coursekit reviewed*": allow
16
+ "git status*": allow
17
+ "git diff*": allow
18
+ "git commit*": deny
19
+ "git push*": deny
20
+ "*coursekit approve*": deny
21
+ "*coursekit client*": deny
22
+ "*coursekit hold*": deny
23
+ "*coursekit resume*": deny
24
+ "*coursekit handoff*": deny
25
+ "*coursekit reviewed*--by*": deny
26
+ ---
27
+
28
+ You are the e-learning content reviewer of the {{project_name}} team. Follow the `/review-unit` command
29
+ and the `content-review` skill to the letter.
@@ -0,0 +1,26 @@
1
+ ---
2
+ description: Writer of course units. Writes content.md and assessment.md of one unit from the signed design, following /write-unit and the content-writing skill.
3
+ mode: primary
4
+ model: {{model}}
5
+ temperature: 0.4
6
+ permission:
7
+ edit: allow
8
+ bash:
9
+ "*": ask
10
+ "coursekit verify*": allow
11
+ "coursekit status*": allow
12
+ "coursekit brief*": allow
13
+ "coursekit outline*": allow
14
+ "coursekit config*": allow
15
+ "git status*": allow
16
+ "git diff*": allow
17
+ "git commit*": deny
18
+ "git push*": deny
19
+ "*coursekit approve*": deny
20
+ "*coursekit client*": deny
21
+ "*coursekit hold*": deny
22
+ "*coursekit resume*": deny
23
+ ---
24
+
25
+ You are the e-learning content writer of the {{project_name}} team. Follow the `/write-unit` command
26
+ and the `content-writing` skill to the letter.
@@ -0,0 +1,19 @@
1
+ ---
2
+ description: Prepare the sign-off of a course's instructional design (refresh the export from slxd) and tell the person how to sign it.
3
+ argument-hint: "<CODE>"
4
+ ---
5
+
6
+ Prepare the approval of the instructional design of course $ARGUMENTS.
7
+
8
+ 1. Read the matrix with `design_matrix_get` and compare it with `courses/<CODE>/design/matrix.json`.
9
+ If the person edited in slxd since the last export, export again (Excel, `matrix.json`,
10
+ `validation.json`).
11
+ 2. `design_matrix_validate`: if there are errors, stop and explain them.
12
+ 3. Run `coursekit sync <CODE> --check` and summarise what will be signed: units, hours, sections,
13
+ objectives and minimum words, plus the warnings.
14
+ 4. Tell the person that, if they agree, they sign it themselves by typing in this same chat:
15
+
16
+ `! coursekit approve design <CODE> --yes`
17
+
18
+ (or `coursekit approve design <CODE>` in their terminal). **You cannot run that command**: the
19
+ signature belongs to the reviewer.
@@ -0,0 +1,18 @@
1
+ ---
2
+ description: Check that a unit is ready for the editorial sign-off and tell the person how to sign it.
3
+ argument-hint: "<CODE> <N>"
4
+ ---
5
+
6
+ Prepare the editorial approval of the unit: $ARGUMENTS (course code and unit number).
7
+
8
+ 1. `coursekit verify <CODE> --unit <N>` without errors.
9
+ 2. How the unit was reviewed (`course.yaml › units[N].review.kind`): `ai` (or missing) means that
10
+ `courses/<CODE>/reviews/unit-NN-ai-review.md` exists and has no pending blocking findings; `human` means that a
11
+ person recorded their review (`by`, `note`, `report`: read them); `skipped` means that the project does not use AI
12
+ review. Say which one it is in the summary.
13
+ 3. Summarise the state (words, directives, placeholders, proposals awaiting a decision).
14
+ 4. If all is well, tell the person to sign it themselves:
15
+
16
+ `! coursekit approve content <CODE> --unit <N> --yes`
17
+
18
+ **You cannot run that command.**
@@ -0,0 +1,10 @@
1
+ ---
2
+ description: Assemble a course or one unit: load it into slxd creator (only what changed) or build its SCORM package with the html backend.
3
+ argument-hint: "<CODE> [N]"
4
+ ---
5
+
6
+ Assembly of: $ARGUMENTS (course code and, optionally, the unit).
7
+
8
+ The project assembles with the **{{backend}}** backend by default; `coursekit status <CODE>` says the one of the course (a course
9
+ may use the other). With `creator` load the `creator-assembly` skill; with `html` load the `html-assembly` skill. Follow it.
10
+ Without a unit number, process every unit in order.
@@ -0,0 +1,9 @@
1
+ ---
2
+ description: Read the client's review comments of a course, apply the ones that make sense and answer them in creator.
3
+ argument-hint: "<CODE> [N]"
4
+ ---
5
+
6
+ Client feedback of: $ARGUMENTS (course code and, optionally, one unit).
7
+
8
+ Load the `client-review` skill and follow it. Without a unit number, process every unit that has a
9
+ review link. Never run `coursekit client`: the person records what the client decided.
@@ -0,0 +1,7 @@
1
+ ---
2
+ description: Show the state of the courses, or of one course, and the next step.
3
+ argument-hint: "[CODE]"
4
+ ---
5
+
6
+ Run `coursekit status $ARGUMENTS` and explain the result in two or three lines, in
7
+ {{ui_language_name}}, including the next step.
@@ -0,0 +1,10 @@
1
+ ---
2
+ description: Define the theme of the project (or of one course) in the authoring platform and derive the design tokens for the media.
3
+ argument-hint: "[CODE]"
4
+ ---
5
+
6
+ Theme definition: $ARGUMENTS (without a course code, the theme of the project; with one, the own theme of that course).
7
+
8
+ Load the `theme-definition` skill and follow it (it reads the brand material in `theme/branding/` and the project's choice,
9
+ `project.yaml › theme › source`). Never write or edit `tokens.json` by hand: it is derived from the
10
+ theme of the platform with `coursekit theme import`.
@@ -0,0 +1,11 @@
1
+ ---
2
+ description: Export the SCORM packages of a course from slxd, record them in the course.
3
+ argument-hint: "<CODE> [version]"
4
+ ---
5
+
6
+ Delivery of the course: $ARGUMENTS (code and, optionally, version).
7
+
8
+ Load the `delivery` skill and follow it unit by unit. First run `coursekit delivery check <CODE>`: if it
9
+ refuses, stop and tell the person why. With the html backend (`coursekit status <CODE>`) there is no export in a platform: the
10
+ steps for each unit are `coursekit assemble build <CODE> --unit N --version X.Y` and then `coursekit delivery add` without
11
+ `--job` or `--snapshot`; skip steps 1 to 4 below.
@@ -0,0 +1,14 @@
1
+ ---
2
+ description: Apply in slxd the changes the person asks for on a course's instructional design proposal.
3
+ argument-hint: "<CODE> <changes>"
4
+ ---
5
+
6
+ Changes asked for on the instructional design: $ARGUMENTS
7
+
8
+ The first argument is the course code; the rest, the changes. Run `coursekit brief <CODE>` first
9
+ in case there is new material. Load the `instructional-design` skill and follow its **Changes**
10
+ section.
11
+
12
+ If the design was already signed (`course.yaml › approvals`), say that the change invalidates the
13
+ signature and that it must be approved again. Summarise what changed and its consequences (hours,
14
+ minimum words, activities). Do not sign anything and do not commit.
@@ -0,0 +1,29 @@
1
+ ---
2
+ description: Create a course from its title and hours and build the instructional design proposal in slxd for human review.
3
+ argument-hint: "\"<title>\" <hours> [--code ABC101] [--no-intro] [--no-summary] [--no-material] [indications]"
4
+ ---
5
+
6
+ Create a new course and its instructional design **proposal**. Arguments from the person:
7
+
8
+ $ARGUMENTS
9
+
10
+ 1. Separate the title (in quotes), the hours, the options `--code`, `--no-intro`, `--no-summary`,
11
+ `--no-material` (only for you: do not pass it to `coursekit new`) and the rest as free indications. If the title or the hours are missing, ask for them and stop.
12
+ 2. Run `coursekit new "<title>" <hours> [options] --notes "<indications>"`, unless `courses/<CODE>/course.yaml` already
13
+ exists (the course was created before, for example in handoff mode): then skip this step and work on it as it is.
14
+ 3. Run `coursekit brief <CODE>` and read `brief/index.md` and `brief/notes.md`. If there is no
15
+ material (no documents, no web links, no notes beyond the template, in the course or in the
16
+ project) and `--no-material` was not given, **stop before designing** and ask the person, in
17
+ {{ui_language_name}}: they can drop files in `courses/<CODE>/brief/sources/` (or the project's
18
+ `brief/sources/`), URLs in `brief/links.md` and indications in `brief/notes.md`, and say when
19
+ it is there (then run `coursekit brief <CODE>` again), or tell you to go on without it. If you
20
+ cannot ask (non-interactive session) or the person goes on without material, say in the final
21
+ summary that the syllabus is an assumption and that `/design-change` redoes it with material.
22
+ 4. Load the `instructional-design` skill and follow its **Proposal** section.
23
+ 5. Run `coursekit theme show`. If the project has no theme tokens, say in the summary that `/define-theme`
24
+ must be run before producing media.
25
+ 6. Finish with a short summary for the person, in {{ui_language_name}}: units with hours and
26
+ objectives, decisions and assumptions to check, where the Excel is, and how to go on: changes
27
+ with `/design-change <CODE> <changes>` and sign-off with `/approve-design <CODE>`.
28
+
29
+ Do not sign anything and do not commit.
@@ -0,0 +1,10 @@
1
+ ---
2
+ description: Produce the pending media assets of a course with the available providers and upload them.
3
+ argument-hint: "<CODE> [asset id]"
4
+ ---
5
+
6
+ Media production of: $ARGUMENTS (course code and, optionally, one asset).
7
+
8
+ Load the `media-production` skill and follow it. Start with `coursekit media extract` and
9
+ `coursekit media plan`, and tell the person what you will produce and with what before spending
10
+ credits of paid APIs.
@@ -0,0 +1,12 @@
1
+ ---
2
+ description: AI review of a written unit (reviewer agent of REVIEWER_AGENT / REVIEWER_MODEL), with a report in reviews/.
3
+ argument-hint: "<CODE> <N>"
4
+ agent: reviewer
5
+ ---
6
+
7
+ Review the unit: $ARGUMENTS (course code and unit number).
8
+
9
+ Load the `content-review` skill and follow it. If the message says PARTIAL REVIEW, follow its
10
+ "Partial review" section. The review should be done by a model other than the writer's: check
11
+ `written_with` of the unit in `courses/<CODE>/course.yaml`; if it matches the tool and model you
12
+ are running on, say so at the start and in the report, and go on with the review.
@@ -0,0 +1,19 @@
1
+ ---
2
+ description: Sync the directive registry of the project with the slxd creator brick catalog (list_brick_types).
3
+ ---
4
+
5
+ Update the directive registry with the current creator catalog.
6
+
7
+ 1. Call `list_brick_types` (slxd MCP) and save the JSON as it is in `.cache/list_brick_types.json`.
8
+ 2. Run `coursekit directives check .cache/list_brick_types.json`.
9
+ 3. If it says `ok`, update only `synced_with_creator` with today's date in
10
+ `config/directives.yaml` (create it with that key if missing) and finish.
11
+ 4. For each `NEW`: call `get_brick_type_schema` of the type and decide whether it should be a
12
+ directive.
13
+ - If so: add it to `directives` in `config/directives.yaml` with a kebab-case name, `brick`,
14
+ `role` (`interactive`, `question` or `static`) and `use` in {{ui_language_name}}.
15
+ - If not: add it to `not_directives` with the reason.
16
+ 5. For each `REMOVED`: remove it from the registry. If it was a directive, find its uses in
17
+ `courses/*/content/**/*.md` and list the affected files (do not change them).
18
+ 6. Update `synced_with_creator`, run step 2 again until it says `ok` and summarise the changes.
19
+ Do not commit.
@@ -0,0 +1,25 @@
1
+ ---
2
+ description: Write one unit of a course with a signed design, or every unit still to write (writer agent of WRITER_AGENT / WRITER_MODEL).
3
+ argument-hint: "<CODE> [N]"
4
+ agent: writer
5
+ ---
6
+
7
+ Write: $ARGUMENTS (course code and, optionally, a unit number). If the code is missing, ask.
8
+
9
+ Load the `content-writing` skill and follow it. Before writing anything, check with
10
+ `coursekit status <CODE>` that the instructional design is signed; if not, stop and say so.
11
+
12
+ - **With a unit number**, write that unit only.
13
+ - **Without a number**, write every unit still to write, in order: the ones whose status in
14
+ `courses/<CODE>/course.yaml › units[].status` is `pending` or `writing`. Finish a unit completely
15
+ (`coursekit verify <CODE> --unit N` passes and it is `verified`) before starting the next, and stop at
16
+ the first one that does not verify, saying why. Between units give a one-line summary and go on without
17
+ asking. Do not re-read the units you finished: for continuity use `coursekit outline <CODE>` and
18
+ `coursekit outline <CODE> --section U.S`, as the skill says.
19
+ - You work on one unit at a time: `courses/<CODE>/content/unit-NN/`. Do not touch the other units, nor
20
+ `config/`, nor `project.yaml`.
21
+ - Write section by section and run `coursekit verify <CODE> --unit N` after each one. Do not go
22
+ on with errors.
23
+ - {{language_name}}, {{address_rule}}, no emojis.
24
+ - If a fact cannot be verified, mark it with `<!-- VERIFICAR: … -->`; do not invent it.
25
+ - Do not commit or push, and never run `coursekit approve`.
@@ -0,0 +1,126 @@
1
+ # Content format — `content.md` and `assessment.md`
2
+
3
+ Canonical format of a unit's content. The writing agent writes it, `coursekit verify` checks it
4
+ and the assembly turns it into the platform's blocks. Course language: {{language_name}}; the
5
+ format words below (section heading, objective tag, media placeholder) are in that language.
6
+
7
+ ## 1. Structure of `content.md`
8
+
9
+ ```markdown
10
+ # {{t_unit}} N — <unit title>
11
+
12
+ > unit header: duration, minimum pages and words, unit objectives (UN.1, UN.2…)
13
+
14
+ ---
15
+
16
+ ## {{t_section}} 1 — {{t_intro_title}} *(…)*
17
+ ### Subsection
18
+ …
19
+ ## {{t_section}} 2 — <title> *(…)*
20
+ …
21
+ *[{{t_objective}} UN.1 — Verb]*
22
+ …
23
+ ## {{t_section}} N — {{t_summary_title}} *(…)*
24
+ ```
25
+
26
+ - Each section opens with `## {{t_section}} N — <title> *(minimum)*`. Number, order, title and
27
+ minimum come from the approved instructional design (`course.yaml › units › sections`): the
28
+ minimum is {{words_per_hour}} words per hour of the section ({{pages_per_hour}} pages of
29
+ {{words_per_page}} words).
30
+ - Each section becomes one lesson.
31
+ - Subsections with `###`. Prose, lists, Markdown tables and code blocks are converted as they are.
32
+ - Code blocks: write ```` ```bash ```` for commands (also PowerShell and `cmd`) and ```` ```text ```` for what a program prints or a
33
+ conversation. Creator has no plain-text language, so a `text` block made only of commands is shown as `bash` and the rest
34
+ uses the platform's automatic detection, which guesses badly with short code: keep outputs in `text` and commands in `bash`.
35
+ - The tag `*[{{t_objective}} UN.M — Verb]*`, one per line, closes each content section. It is
36
+ editorial metadata: it is not published.
37
+
38
+ **Word count:** only text the learner reads counts. Media placeholders, objective tags, HTML
39
+ comments and the `:::` lines of directives do not count (the text inside a directive does).
40
+
41
+ Writing rules: {{language_name}}, {{address_rule}}, complete prose (no bare lists or unexpanded
42
+ outlines), **no emojis** (only `{{allowed_symbols}}` are allowed).
43
+
44
+ ## 2. Interactive component directives
45
+
46
+ A component is written as a `:::name` … `:::` block and becomes one block of the assembly
47
+ platform. The full registry of directives, their block and when to use each one is
48
+ `coursekit config directives` (`directives` and `use`): it is the only valid list. Common
49
+ components that are not directives have their equivalent in `component_equivalents`.
50
+
51
+ Each content section includes **distinct** interactive directives in proportion to its hours
52
+ ({{interactive_per_hour}} per hour, at least {{min_interactive_per_content_section}}). `note`,
53
+ `highlight` and `quote` do not count as interactive.
54
+
55
+ Internal structure (anything else fails at assembly):
56
+
57
+ | Directive | Internal structure |
58
+ |---|---|
59
+ | `accordion`, `tabs`, `carousel` | one `#### Title` per panel, tab or slide + Markdown text |
60
+ | `timeline` | `#### <date> — <title>` per milestone (without " — ", all of it is the title) + text |
61
+ | `flashcards`, `flashcard-gallery` | `#### Front` + text of the back |
62
+ | `labelled-graphic` | `{{k_image}}: <exact title of the placeholder, as in `media/manifest.yaml`>` + `#### Point` + text; optional `{{k_position}}: x,y` (0–100) under each point |
63
+ | `dialog` | `**Character:** line`, one per line |
64
+ | `carousel-quotes` | one quote per paragraph, with `— author` on its last line |
65
+ | `note` | optional `{{k_title}}: …` + text |
66
+ | `highlight` | text |
67
+ | `quote` | quote + `— author` on the last line |
68
+ | `word-search`, `wordle`, `hangman` | `- WORD` per line |
69
+ | `memory` | `- card content` per line |
70
+ | `pasapalabra` | `- A ({{w_starts}}): definition :: ANSWER` or `({{w_contains}})`; alternatives with `/` |
71
+ | `trivial` | `#### Category` + `{{k_question}}: …` blocks with `- [x]` / `- [ ]` options, separated by a blank line |
72
+
73
+ A plain blockquote (`> text`) becomes a highlight.
74
+
75
+ ## 3. Question directives (practice activities and tests)
76
+
77
+ The directives with `role: question`: `single-choice`, `multi-select`, `true-false`, `sorting`,
78
+ `match`, `sorting-groups`, `fill-in-the-blank`, `order-words`, `short-answer`.
79
+
80
+ ```markdown
81
+ :::single-choice
82
+ {{t_question_key}} U1.2
83
+ {{k_question}}: <question>
84
+ - [ ] <distractor>
85
+ - [x] <correct answer>
86
+ - [ ] <distractor>
87
+ {{k_feedback_correct}}: <why it is right>
88
+ {{k_feedback_incorrect}}: <which section to review>
89
+ :::
90
+ ```
91
+
92
+ - `single-choice` (exactly one `- [x]`) and `multi-select`: options `- [x]` / `- [ ]`.
93
+ - `match`: lines `- term :: definition`. `sorting`: list in the right order. `order-words`:
94
+ `- full sentence` per sentence. `sorting-groups`: `#### Category` + list of items.
95
+ `true-false`: `{{k_answer}}: {{w_true}}|{{w_false}}`. `fill-in-the-blank`: blanks in `{{k_question}}:` as
96
+ `{{{k_answer}}}` (several accepted: `{a/b}`). `short-answer`: `{{k_answers}}: a | b | c`.
97
+ - Common keys: `{{t_question_key}}`, `{{k_question}}:`, `{{k_feedback_correct}}:`, `{{k_feedback_incorrect}}:`,
98
+ `{{k_feedback}}:`. Each key on one line. Every question carries `{{t_question_key}}` and feedback.
99
+
100
+ ## 4. Media placeholders
101
+
102
+ Exact format (shown as a visible box until the asset is produced):
103
+
104
+ ```markdown
105
+ > **[{{t_placeholder}} — <type>]**
106
+ {{placeholder_field_lines}}
107
+ ```
108
+
109
+ Allowed types (what is written in the placeholder, and its id in the configuration): {{placeholder_types}}. Per unit: {{placeholders_per_hour}} placeholders per hour
110
+ of the unit and at least {{min_placeholder_types}} different types.
111
+
112
+ ## 5. `assessment.md`
113
+
114
+ The summative activities of the unit, in order:
115
+
116
+ ```markdown
117
+ ## {{t_assessment}} N.M — <name>
118
+ ### (objectives assessed · instructions for the learner · development · automatic marking and
119
+ ### scoring · attempts and feedback · question bank)
120
+ :::single-choice
121
+ …
122
+ :::
123
+ ```
124
+
125
+ The unit test bank has {{questions_per_objective}} questions per objective assessed by
126
+ questionnaire.
@@ -0,0 +1,41 @@
1
+ # slxd MCP (creator) — reference for coursekit
2
+
3
+ > Before using a tool, confirm its schema with `tool_schema` (or `get_brick_type_schema` for
4
+ > bricks): this page is a guide, not the contract.
5
+
6
+ ## Connection
7
+
8
+ - The project server is **`{{mcp_name}}`** (`project.yaml › platform.slxd`), configured in
9
+ `.mcp.json`, `opencode.json` and `.codex/config.toml` by `coursekit agents`. Each person
10
+ authenticates with OAuth (slxd account) the first time.
11
+ - Streamable HTTP transport; **OAuth 2.1** or an `sk_…` key.
12
+ - An MCP credential always acts as **member**: owner/admin actions are not available.
13
+ - Destructive tools need `confirm: true`; without it they return a preview.
14
+ - **Direct tools** include `browse_workspace`, `get_content`, `get_lesson`, `create_content`,
15
+ `update_content`, `create_lesson`, `update_lesson`, `reorder_lessons`, `delete_lesson`,
16
+ `list_brick_types`, `get_brick_type_schema`, `add_brick`, `update_brick`, `move_brick`,
17
+ `delete_brick`, `audit_content_accessibility`, `apply_accessibility_autofix`, `list_themes`,
18
+ `get_theme`, `update_theme`, `request_asset_upload`, `search_stock_images`, `create_export`,
19
+ `get_export_status` and `design_matrix_create/get/list/validate/generate_course`.
20
+ - **The rest** (other `design_matrix_*`, `design_matrix_export`, `create_snapshot`,
21
+ `share_content`, `update_quiz_settings`, `set_content_theme`, `create_theme`,
22
+ `import_stock_image`, `search_stock_icons`, `request_embed_upload`…) go through
23
+ **`find_tools`** → **`tool_schema`** → **`run_tool`**.
24
+
25
+ ## Tools by phase
26
+
27
+ | Phase | Tools |
28
+ |---|---|
29
+ | Theme | `list_themes`, `create_theme`, `get_theme`, `update_theme`, `set_content_theme` |
30
+ | Design | `design_matrix_*` (matrix, competencies, objectives, nodes, learning and assessment activities, validate, export) |
31
+ | Skeleton | `design_matrix_generate_course`, `design_matrix_redaccion_status` |
32
+ | Media | `request_asset_upload`, `request_embed_upload`, `search_stock_images`, `import_stock_image`, `search_stock_icons`, `import_stock_icon` |
33
+ | Assembly | lessons and bricks, `update_quiz_settings`, `set_lesson_bank_references`, accessibility audit, `create_snapshot` |
34
+ | Review | `share_content` (live preview) |
35
+ | Delivery | `create_export`, `get_export_status` |
36
+
37
+ Useful values:
38
+ - `design_matrix_create.patronEstructural`: `con_modulos | sin_modulos` (cannot be changed).
39
+ - `nivelBloom`: `recordar | comprender | aplicar | analizar | evaluar | crear`.
40
+ - Assessment `instrumento`: `cuestionario | caso_practico | entrega_portfolio | rubrica`.
41
+ - `create_export.standard`: `scorm_1_2 | scorm_2004`.
@@ -0,0 +1,10 @@
1
+ ## Calling the slxd tools
2
+
3
+ The MCP server `{{mcp_name}}` lists only its main tools directly. **If a tool named in this skill
4
+ is not in your list** (e.g. `design_matrix_competencia_create`, `design_matrix_export`,
5
+ `create_snapshot`, `share_content`, `enable_review`, `update_quiz_settings`), do not assume it does not exist:
6
+ 1. `find_tools` with keywords (e.g. `"design_matrix objective"`) to get its exact name;
7
+ 2. `tool_schema` with that name to see its arguments;
8
+ 3. `run_tool` with `name` and `arguments`.
9
+ Direct tools are called as usual. Destructive tools (`confirm: true`) are confirmed with the
10
+ person first.
@@ -0,0 +1,50 @@
1
+ ---
2
+ name: client-review
3
+ description: Comments of the client on the review link of a course in slxd creator — read them, apply the agreed changes in the .md, reload, publish a new review version and answer each comment. Use with /client-feedback or when the client has commented.
4
+ ---
5
+
6
+ # The client's review
7
+
8
+ The review of each unit is a link of its creator content (`course.yaml › units[].links.review`); the client
9
+ comments on it without an account. A round is opened and closed by the person with `coursekit client`.
10
+ The `.md` rules still apply: never edit content directly in creator; fix the `.md` and reload it.
11
+
12
+ {{> _slxd-tools}}
13
+
14
+ ## 1. Read the comments
15
+
16
+ For each unit with a `content_id` and a review link:
17
+ 1. `get_review`: enabled, latest version and how many threads are pending.
18
+ 2. `list_review_comments` with `status: pending` (use `since` to read only what is new). Each thread says the
19
+ lesson (`lessonTitle`), the text and, if any, a screenshot (`screenshotUrl`: open it).
20
+ 3. Map each comment to the section or activity of the `.md` (`coursekit outline <CODE> --section …`).
21
+
22
+ ## 2. Decide with the person
23
+
24
+ Show a table per unit: comment, section, what you propose (apply, do not apply and why, needs the person).
25
+ In an interactive session wait for the person's decision; without an interface, apply only the clear text
26
+ corrections that fit the design and leave the rest in the summary. Comments that change objectives, hours,
27
+ activities or the structure are a design change: do not apply them, point to `/design-change`.
28
+
29
+ ## 3. Apply
30
+
31
+ 1. Edit the `.md` with the `content-writing` rules (language, tone, no emojis) and run `coursekit verify <CODE>`.
32
+ 2. A unit edited after its signature goes back to `verified`: tell the person it needs a new review and signature
33
+ (`/review-unit`, `/approve-unit`) before the course is delivered.
34
+ 3. Reload what changed: `coursekit assemble plan`, `diff` and apply as in the `creator-assembly` skill.
35
+
36
+ ## 4. Answer
37
+
38
+ For each unit that changed:
39
+ 1. `publish_review_version` with a label (`v1.1`, `v1.2`…): the client sees the update. Only the latest version
40
+ accepts comments.
41
+ 2. For each applied comment: `reply_review_comment` on the root of the thread, saying what changed (and for the
42
+ ones you did not apply, why), then `set_review_comment_status` with `resolved`. `verified` is for the client.
43
+ 3. When the person closes the round, `export_review_comments` and download the CSV (the link lasts 24 hours) to
44
+ `.cache/client-review/<CODE>-round-N.csv` (outside git and never published); it has the e-mail addresses of guests: do not paste it anywhere nor move it into the course.
45
+
46
+ ## 5. Summary
47
+
48
+ Comments read, applied, discarded and pending; units reloaded and the new review version of each; what the
49
+ person has to do next (`coursekit client <CODE> send` for another round, or `approve` when the client agrees).
50
+ Do not commit unless asked.
@@ -0,0 +1,78 @@
1
+ ---
2
+ name: content-review
3
+ description: Quality review (second layer, by the reviewer agent of the .env, other than the writer) of a written unit. Use to review content.md/assessment.md of courses/<CODE> and write reviews/unit-NN-ai-review.md.
4
+ ---
5
+
6
+ # AI review of a unit
7
+
8
+ The reviewer should **not** be the model that wrote the unit: compare with `written_with` of the
9
+ unit in `course.yaml`; if it matches, say so in the report and carry on.
10
+
11
+ ## Preparation
12
+
13
+ 1. `coursekit verify <CODE> --unit N`: errors are fixed first (they are objective and cheap).
14
+ 2. Read `course.yaml` (objectives, sections and activities of the unit, audience, level), the
15
+ design Excel, `design/proposal-notes.md` and the whole unit.
16
+ 3. Reference material: `coursekit brief <CODE>`, then `brief/index.md` and `brief/notes.md` of the
17
+ course and of the project. Check technical accuracy (criterion 1) against `brief/text/` and
18
+ resolve the `<!-- VERIFICAR -->` with it; anything contradicting the material is **blocking**.
19
+
20
+ ## Rubric
21
+
22
+ Assess each section with these criteria. Every finding has a severity: **blocking** (cannot
23
+ reach the learner), **improvement** (noticeably better quality) or **minor** (style, typos).
24
+
25
+ | # | Criterion | What to check |
26
+ |---|---|---|
27
+ | 1 | Technical accuracy | Facts, versions, commands, prices, regulations and names correct and current. Find and resolve the `<!-- VERIFICAR -->`. |
28
+ | 2 | Alignment | Each content section lets the learner reach its objective at the declared Bloom level; activities practise and assess **that** objective. |
29
+ | 3 | Coherence with the design | Titles, sections and activities match the matrix; nothing out of scope. |
30
+ | 4 | Depth | Developed prose, no padding or repetition to reach the minimum; concrete professional examples. |
31
+ | 5 | Activities | Match the design; unambiguous questions, plausible distractors, one right answer in single-choice, useful feedback pointing to the section. {{questions_per_objective}} questions per objective assessed by questionnaire. |
32
+ | 6 | Interactivity | Directive suited to the kind of content; no flat section. |
33
+ | 7 | Media | Necessary placeholders, well specified, with accessibility (captions, alt text). |
34
+ | 8 | Style | {{language_name}}, {{address_rule}}, tone of `course.yaml`, inclusive language, no emojis. |
35
+ | 9 | Continuity | No overlap with other units nor content the design keeps for a later one (`coursekit outline <CODE>`; to check an overlap, `--section U.S`); correct cross-references. |
36
+
37
+ ## Partial review
38
+
39
+ When the unit was already reviewed and only some parts changed (`coursekit review` computes
40
+ them against the previous review, or the person names them with `--parts`):
41
+
42
+ 1. Apply the rubric **only** to those parts (sections of `content.md`, activities of
43
+ `assessment.md`). Of the rest, read only what you need to check how they fit: the objective
44
+ they develop, the neighbouring sections (continuity, cross-references) and the bank questions
45
+ and activities of the same objective. Use `coursekit outline <CODE>` and `--section U.S`
46
+ instead of reading the whole unit.
47
+ 2. Do not reopen findings already resolved in parts that did not change.
48
+ 3. Do not write a new report: **append** to `reviews/unit-NN-ai-review.md` a section
49
+ `## Partial review — YYYY-MM-DD (<model>)` with the parts reviewed, the findings table and the
50
+ changes applied, and update the **Result** in the header if it changes.
51
+ 4. Finish as usual: `coursekit reviewed <CODE> <N>`.
52
+
53
+ ## Output
54
+
55
+ 1. **Apply directly** the blocking and minor fixes in the `.md`. Leave the improvements that
56
+ change the approach as proposals in the report.
57
+ 2. Write `courses/<CODE>/reviews/unit-NN-ai-review.md` (in {{ui_language_name}}):
58
+
59
+ ```markdown
60
+ # AI review — <CODE> · Unit N
61
+ > **Reviewer:** <model> · **Date:** YYYY-MM-DD · **Result:** ready | ready with changes | not ready
62
+ <!-- result: ready | ready_with_changes | not_ready -->
63
+
64
+ ## Summary
65
+ ## Findings
66
+ | # | Section | Criterion | Severity | Finding | Action (applied / proposed) |
67
+ ## Changes applied
68
+ ## Proposals awaiting a human decision
69
+ ```
70
+
71
+ The `<!-- result: … -->` line repeats the **Result** with one of its three values, as written there (untranslated,
72
+ with underscores): tools read it. Update it too when a partial review changes the Result.
73
+ 3. Run `coursekit reviewed <CODE> <N>`: it verifies again and marks the unit as reviewed (if it
74
+ fails, fix and repeat). Never edit statuses by hand. Never pass `--by` to it: that option records the review
75
+ of a person.
76
+ 4. Remind the person that, after their editorial review, they sign with `/approve-unit <CODE> <N>`.
77
+
78
+ Do not commit or push unless asked.