course-corporate-edition
Original:🇺🇸 English
Translated
Use this skill when an existing multi-day public-class teaching site needs to be condensed and re-packaged for a corporate in-house training — typically a half-day or one-day intensive (e.g. 4-day public class → 6-hour corporate). Triggers on phrases like "企業包班", "濃縮版", "客製化課程", "corporate edition", "intensive version", "in-house training", "single-file deliverable", "客戶端課程", "壓縮成一天", or when the user wants a single-folder zippable deliverable for a client. This skill builds on top of an existing site — picking units, condensing time allocation, embedding data into a single HTML, setting up asset fallback chains, and producing an offline-ready package.
15installs
Added on
NPX Install
npx skill4agent add kevintsai1202/teaching-site-skills course-corporate-editionTags
Translated version includes tags in frontmatterSKILL.md Content
View Translation Comparison →Course Corporate Edition
Schema authority: allfield names come fromwindow.COURSE._shared/domain-primitives.mdFilename convention (English-first): corporate editions live under. Per-edition folders usecorporate-editions/{client}_{hours}h/,materials/,assets/,index.html. Legacy Chinese names (README.md,企業包班/) are deprecated.教學素材/
This skill takes an existing public-class teaching site and produces a corporate edition: shorter, brand-customisable, single-folder deliverable.
When to Invoke
- User has a finished public-class site (e.g. 4 days × 6h) and needs a 1-day version for a client.
- User wants to clone an existing corporate edition for a new client with different branding.
- User wants the deliverable to be a single folder the client's IT can zip and host themselves.
The Two Architectural Shifts
The corporate edition makes two deliberate departures from the public-class architecture:
Shift 1: Single-file SPA (inline window.COURSE
)
window.COURSEPublic class: + (separate file).
Corporate: is inlined as inside .
index.htmlcourse-data.jscourse-data<script>window.COURSE = { ... }</script>index.htmlWhy: corporate clients zip and host the folder themselves. One file is one less moving part. Also: double-click works (no separate JS fetch issues).
file://Cost: editing the data requires touching HTML. Acceptable because corporate editions ship and don't get edited again.
Shift 2: Asset fallback chain
Corporate edition has its own folder, but falls back to the public-class for anything not overridden:
assets/assets/corporate-editions/client_6h/
├── index.html ← inline COURSE
├── assets/ ← corporate-specific overrides (logo, customised hero)
└── materials/ ← curated subset (~11 files vs. public's ~30)
↓ falls back to
project-root/assets/ ← public class's full asset library
project-root/course-package/materials/ ← public class's full material libraryImplementation: every asset reference tries the corporate path first; on 404, it tries the public-class path. The bundled ebook builder does the same in its compose layer:
js
const ASSET_ROOTS = [
path.join(CORP_DIR, 'assets'),
path.join(PUBLIC_ROOT, 'assets'),
];
async function findAsset(filename) {
for (const root of ASSET_ROOTS) {
try { await fs.access(path.join(root, filename)); return path.join(root, filename); }
catch { /* try next */ }
}
return null;
}Why: you'd duplicate 200+ MB of illustrations across every client edition otherwise. Override only what changes (brand, hero), share everything else.
Folder Convention
project-root/
├── (all public-class files)
├── corporate-editions/
│ ├── clientA_6h/ ← Generic edition (fictional case, sellable to many clients)
│ │ ├── index.html
│ │ ├── README.md ← shipping / HR onboarding notes
│ │ ├── assets/ ← edition-specific overrides
│ │ └── materials/ ← edition-specific curated materials
│ └── clientB_condensed/ ← Real-client custom edition
│ └── (same shape)
└── assets/ ← public-class full asset library (fallback target)Generic vs custom edition: the generic edition uses a fictional company name (e.g. "GreenField Select") as the running case — sellable to multiple clients. Custom editions replace the case with real client data only on demand.
Condensing Strategy (24h → 6h)
Picking which units to keep is the hardest part. Heuristic:
- Drop units about general concepts (e.g. "AI 的歷史", "Prompt 基礎") — corporate audiences want to see immediate ROI, not foundations.
- Keep units with concrete deliverables — the corporate measure of success is "what did we walk out with". Aim for 7–8 takeaway artifacts.
- Compress shared scenario — public class has multiple recurring brands; corporate gets one (the most relatable to the client's industry).
- Merge similar units — two related units in the public class often become one combined unit (e.g. "撰寫提示詞" + "建立 Gem" → "Gem 封裝實戰").
- Restructure time: public class is "Day-based"; corporate is usually "Morning / Afternoon" (e.g. AM 3h + PM 3h with 1h lunch). Adjust accordingly (
window.COURSE.day1.title,"Day1: 上午")."Day2: 下午"
Unit-Picking Worksheet
When planning the condensed version, fill in a table like this:
| Corporate Unit | Borrowed From | Time | Why kept |
|---|---|---|---|
| 1.1 開場 + 自我盤點 | (new) | 25 min | Anchor for the day |
| 1.2 Gem 概念 + 多平台文案 | public Day 1 u2-u4 | 95 min | Highest ROI, concrete output |
| 1.3 NotebookLM × Gem 整合 | public Day 3 u1 | 25 min | Differentiator |
| ... | ... | ... | ... |
This table becomes the source of truth when wiring up the corporate — every unit must trace back.
index.htmlBranding Customisation Variables
Pull all client-specific text into a single block at the top of inlined COURSE:
js
window.COURSE = {
meta: {
title: '電商團隊 AI 即戰力',
audience: '3–30 人企業內訓',
client: '景笙顧問', // ← swap per client
hours: 6,
schedule: '09:00–16:00',
classroom: '客戶端(由企業指定,實體 / 線上同步皆可)',
},
// ...
};Cloning for a new client: copy the folder, search-replace the client name, swap branded assets in .
assets/Single-Folder Deliverable Check
Before sending to a client, verify the folder is truly self-contained:
js
// scripts/verify-corp-self-contained.mjs
// Walk the folder, parse every src/href, ensure no path goes outside this folder
// EXCEPT for the documented public-class fallback paths.If a stray slips in, the client's IT will see broken images after unzipping.
../assets/foo.pngCompanion Verification Scripts
The example workshop ships these — adapt for any new corporate edition:
| Script | What it checks |
|---|---|
| Playwright: load, screenshot at multiple viewports, sidebar/scrollspy/progress |
| Crawl every asset, confirm none 404 |
| Diff inlined COURSE vs source markdown to catch drift |
| Per-issue diagnostic (DOM zone, day visibility) |
The pattern: one verify script per concern, all under with the prefix.
scripts/corp-{name}Anti-Patterns
- Duplicating the whole assets folder — defeats the point of the fallback chain.
- Editing the public-class site to "make it work" for the corporate version — keep them decoupled. The corporate edition reads from public-class assets read-only.
- Hardcoding the client's actual data in the generic edition — keep the generic edition with a fictional case; only customise on demand.
- Forgetting constraints — corporate clients double-click
file://. Avoidindex.htmlof local JSON, avoid features that need a real HTTP server (localStorage works fine).fetch()
Hand-off
When this skill finishes:
- A new folder under is ready to zip.
corporate-editions/{client}_{hours}h/ - inside explains startup (double-click), HR notes, and a course summary.
README.md - Verify scripts pass.
If the client also wants a printed PDF / DOCX deliverable, that's 's job — invoke that next.
course-ebook-publishing