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.
- coursekit/__init__.py +8 -0
- coursekit/__main__.py +5 -0
- coursekit/agentkit/__init__.py +0 -0
- coursekit/agentkit/agents/reviewer.md +29 -0
- coursekit/agentkit/agents/writer.md +26 -0
- coursekit/agentkit/commands/approve-design.md +19 -0
- coursekit/agentkit/commands/approve-unit.md +18 -0
- coursekit/agentkit/commands/assemble.md +10 -0
- coursekit/agentkit/commands/client-feedback.md +9 -0
- coursekit/agentkit/commands/course-status.md +7 -0
- coursekit/agentkit/commands/define-theme.md +10 -0
- coursekit/agentkit/commands/deliver.md +11 -0
- coursekit/agentkit/commands/design-change.md +14 -0
- coursekit/agentkit/commands/new-course.md +29 -0
- coursekit/agentkit/commands/produce-media.md +10 -0
- coursekit/agentkit/commands/review-unit.md +12 -0
- coursekit/agentkit/commands/sync-directives.md +19 -0
- coursekit/agentkit/commands/write-unit.md +25 -0
- coursekit/agentkit/docs/content-format.md +126 -0
- coursekit/agentkit/docs/slxd-mcp.md +41 -0
- coursekit/agentkit/skills/_slxd-tools.md +10 -0
- coursekit/agentkit/skills/client-review/SKILL.md +50 -0
- coursekit/agentkit/skills/content-review/SKILL.md +78 -0
- coursekit/agentkit/skills/content-writing/SKILL.md +70 -0
- coursekit/agentkit/skills/creator-assembly/SKILL.md +101 -0
- coursekit/agentkit/skills/delivery/SKILL.md +48 -0
- coursekit/agentkit/skills/html-assembly/SKILL.md +51 -0
- coursekit/agentkit/skills/instructional-design/SKILL.md +117 -0
- coursekit/agentkit/skills/media-production/SKILL.md +97 -0
- coursekit/agentkit/skills/theme-definition/SKILL.md +67 -0
- coursekit/agents.py +363 -0
- coursekit/approve.py +206 -0
- coursekit/assemble.py +794 -0
- coursekit/brief.py +268 -0
- coursekit/catalog.py +189 -0
- coursekit/cli.py +318 -0
- coursekit/clientreview.py +139 -0
- coursekit/commands.py +895 -0
- coursekit/config.py +130 -0
- coursekit/course.py +114 -0
- coursekit/defaults/__init__.py +0 -0
- coursekit/defaults/agents.yaml +21 -0
- coursekit/defaults/delivery.yaml +13 -0
- coursekit/defaults/directives.yaml +79 -0
- coursekit/defaults/media.yaml +59 -0
- coursekit/defaults/rules.yaml +54 -0
- coursekit/delivery.py +130 -0
- coursekit/directives.py +56 -0
- coursekit/doctor.py +144 -0
- coursekit/envfile.py +38 -0
- coursekit/fingerprint.py +59 -0
- coursekit/handoff.py +472 -0
- coursekit/htmlkit/__init__.py +5 -0
- coursekit/htmlkit/build.py +249 -0
- coursekit/htmlkit/check.py +106 -0
- coursekit/htmlkit/manifest.py +52 -0
- coursekit/htmlkit/render.py +374 -0
- coursekit/htmlkit/sanitize.py +96 -0
- coursekit/i18n.py +96 -0
- coursekit/identity.py +37 -0
- coursekit/init.py +314 -0
- coursekit/lang/__init__.py +47 -0
- coursekit/lang/en.yaml +83 -0
- coursekit/lang/es.yaml +83 -0
- coursekit/lang/messages/__init__.py +0 -0
- coursekit/lang/messages/agents.yaml +10 -0
- coursekit/lang/messages/approve.yaml +57 -0
- coursekit/lang/messages/assemble.yaml +73 -0
- coursekit/lang/messages/brief.yaml +57 -0
- coursekit/lang/messages/cli.yaml +129 -0
- coursekit/lang/messages/clientreview.yaml +24 -0
- coursekit/lang/messages/commands.yaml +314 -0
- coursekit/lang/messages/config.yaml +4 -0
- coursekit/lang/messages/course.yaml +12 -0
- coursekit/lang/messages/delivery.yaml +18 -0
- coursekit/lang/messages/directives.yaml +14 -0
- coursekit/lang/messages/doctor.yaml +57 -0
- coursekit/lang/messages/handoff.yaml +92 -0
- coursekit/lang/messages/htmlkit.yaml +20 -0
- coursekit/lang/messages/init.yaml +30 -0
- coursekit/lang/messages/launch.yaml +31 -0
- coursekit/lang/messages/media.yaml +54 -0
- coursekit/lang/messages/mediatools.yaml +35 -0
- coursekit/lang/messages/new.yaml +2 -0
- coursekit/lang/messages/outline.yaml +11 -0
- coursekit/lang/messages/project.yaml +4 -0
- coursekit/lang/messages/publish.yaml +29 -0
- coursekit/lang/messages/refresh.yaml +10 -0
- coursekit/lang/messages/setup.yaml +115 -0
- coursekit/lang/messages/states.yaml +9 -0
- coursekit/lang/messages/status.yaml +63 -0
- coursekit/lang/messages/sync.yaml +25 -0
- coursekit/lang/messages/theme.yaml +32 -0
- coursekit/lang/messages/uninstall.yaml +34 -0
- coursekit/lang/messages/verify.yaml +75 -0
- coursekit/lang/messages/voices.yaml +42 -0
- coursekit/launch.py +386 -0
- coursekit/media.py +341 -0
- coursekit/mediatools.py +223 -0
- coursekit/new.py +85 -0
- coursekit/outline.py +65 -0
- coursekit/project.py +88 -0
- coursekit/publish.py +210 -0
- coursekit/refresh.py +80 -0
- coursekit/setup.py +371 -0
- coursekit/states.py +123 -0
- coursekit/status.py +68 -0
- coursekit/store.py +153 -0
- coursekit/sync.py +264 -0
- coursekit/templates/__init__.py +0 -0
- coursekit/templates/brief/__init__.py +0 -0
- coursekit/templates/brief/links.md +4 -0
- coursekit/templates/brief/notes.md +13 -0
- coursekit/templates/course/__init__.py +0 -0
- coursekit/templates/course/course.yaml +40 -0
- coursekit/templates/course/en/__init__.py +0 -0
- coursekit/templates/course/en/assessment.md +12 -0
- coursekit/templates/course/en/content.md +9 -0
- coursekit/templates/course/es/__init__.py +0 -0
- coursekit/templates/course/es/assessment.md +12 -0
- coursekit/templates/course/es/content.md +9 -0
- coursekit/templates/html/__init__.py +0 -0
- coursekit/templates/html/package.json +9 -0
- coursekit/templates/html/player/entry.js +123 -0
- coursekit/templates/html/player/questions.js +265 -0
- coursekit/templates/html/player/scorm.js +92 -0
- coursekit/templates/html/player/widgets.js +126 -0
- coursekit/templates/html/styles/base.css +162 -0
- coursekit/templates/project/AGENTS.md +44 -0
- coursekit/templates/project/CLAUDE.md +1 -0
- coursekit/templates/project/__init__.py +0 -0
- coursekit/templates/project/brief/links.md +4 -0
- coursekit/templates/project/brief/notes.md +12 -0
- coursekit/templates/project/env.example +37 -0
- coursekit/templates/project/githooks/__init__.py +0 -0
- coursekit/templates/project/githooks/post-checkout +4 -0
- coursekit/templates/project/githooks/post-merge +7 -0
- coursekit/templates/project/gitignore +19 -0
- coursekit/templates/project/project.yaml +42 -0
- coursekit/templates/remotion/__init__.py +0 -0
- coursekit/templates/remotion/package.json +19 -0
- coursekit/templates/remotion/src/Root.tsx +32 -0
- coursekit/templates/remotion/src/index.ts +4 -0
- coursekit/templates/remotion/src/theme.ts +7 -0
- coursekit/templates/remotion/tsconfig.json +13 -0
- coursekit/theme.py +454 -0
- coursekit/tools/__init__.py +0 -0
- coursekit/tools/web2md.js +513 -0
- coursekit/uninstall.py +205 -0
- coursekit/util.py +76 -0
- coursekit/verify.py +355 -0
- coursekit/voices.py +131 -0
- slxd_coursekit-0.1.2.dist-info/METADATA +115 -0
- slxd_coursekit-0.1.2.dist-info/RECORD +157 -0
- slxd_coursekit-0.1.2.dist-info/WHEEL +4 -0
- slxd_coursekit-0.1.2.dist-info/entry_points.txt +2 -0
- 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
|
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,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.
|