canvas-design-mcp 0.9.0

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 (118) hide show
  1. package/CLAUDE.md +200 -0
  2. package/DESIGN.md +288 -0
  3. package/PROFESSOR-INSTRUCTIONS.txt +131 -0
  4. package/README.md +250 -0
  5. package/dist/canvas-api.d.ts +24 -0
  6. package/dist/canvas-api.d.ts.map +1 -0
  7. package/dist/canvas-api.js +146 -0
  8. package/dist/canvas-api.js.map +1 -0
  9. package/dist/config.d.ts +5 -0
  10. package/dist/config.d.ts.map +1 -0
  11. package/dist/config.js +22 -0
  12. package/dist/config.js.map +1 -0
  13. package/dist/design-engine.d.ts +5 -0
  14. package/dist/design-engine.d.ts.map +1 -0
  15. package/dist/design-engine.js +23 -0
  16. package/dist/design-engine.js.map +1 -0
  17. package/dist/index.d.ts +3 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +567 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/tools/accessibility.d.ts +7 -0
  22. package/dist/tools/accessibility.d.ts.map +1 -0
  23. package/dist/tools/accessibility.js +149 -0
  24. package/dist/tools/accessibility.js.map +1 -0
  25. package/dist/tools/contrast.d.ts +2 -0
  26. package/dist/tools/contrast.d.ts.map +1 -0
  27. package/dist/tools/contrast.js +7 -0
  28. package/dist/tools/contrast.js.map +1 -0
  29. package/dist/tools/critique.d.ts +23 -0
  30. package/dist/tools/critique.d.ts.map +1 -0
  31. package/dist/tools/critique.js +194 -0
  32. package/dist/tools/critique.js.map +1 -0
  33. package/dist/tools/generate.d.ts +18 -0
  34. package/dist/tools/generate.d.ts.map +1 -0
  35. package/dist/tools/generate.js +101 -0
  36. package/dist/tools/generate.js.map +1 -0
  37. package/dist/tools/gotchas.d.ts +7 -0
  38. package/dist/tools/gotchas.d.ts.map +1 -0
  39. package/dist/tools/gotchas.js +61 -0
  40. package/dist/tools/gotchas.js.map +1 -0
  41. package/dist/tools/ingest.d.ts +44 -0
  42. package/dist/tools/ingest.d.ts.map +1 -0
  43. package/dist/tools/ingest.js +211 -0
  44. package/dist/tools/ingest.js.map +1 -0
  45. package/dist/tools/list-courses.d.ts +16 -0
  46. package/dist/tools/list-courses.d.ts.map +1 -0
  47. package/dist/tools/list-courses.js +79 -0
  48. package/dist/tools/list-courses.js.map +1 -0
  49. package/dist/tools/page-io.d.ts +19 -0
  50. package/dist/tools/page-io.d.ts.map +1 -0
  51. package/dist/tools/page-io.js +77 -0
  52. package/dist/tools/page-io.js.map +1 -0
  53. package/dist/tools/panopto.d.ts +36 -0
  54. package/dist/tools/panopto.d.ts.map +1 -0
  55. package/dist/tools/panopto.js +188 -0
  56. package/dist/tools/panopto.js.map +1 -0
  57. package/dist/tools/personas.d.ts +21 -0
  58. package/dist/tools/personas.d.ts.map +1 -0
  59. package/dist/tools/personas.js +464 -0
  60. package/dist/tools/personas.js.map +1 -0
  61. package/dist/tools/philosophy.d.ts +21 -0
  62. package/dist/tools/philosophy.d.ts.map +1 -0
  63. package/dist/tools/philosophy.js +137 -0
  64. package/dist/tools/philosophy.js.map +1 -0
  65. package/dist/tools/publish.d.ts +31 -0
  66. package/dist/tools/publish.d.ts.map +1 -0
  67. package/dist/tools/publish.js +198 -0
  68. package/dist/tools/publish.js.map +1 -0
  69. package/dist/tools/redesign.d.ts +18 -0
  70. package/dist/tools/redesign.d.ts.map +1 -0
  71. package/dist/tools/redesign.js +68 -0
  72. package/dist/tools/redesign.js.map +1 -0
  73. package/dist/tools/update-kb.d.ts +10 -0
  74. package/dist/tools/update-kb.d.ts.map +1 -0
  75. package/dist/tools/update-kb.js +93 -0
  76. package/dist/tools/update-kb.js.map +1 -0
  77. package/dist/tools/validate.d.ts +10 -0
  78. package/dist/tools/validate.d.ts.map +1 -0
  79. package/dist/tools/validate.js +76 -0
  80. package/dist/tools/validate.js.map +1 -0
  81. package/dist/types.d.ts +65 -0
  82. package/dist/types.d.ts.map +1 -0
  83. package/dist/types.js +2 -0
  84. package/dist/types.js.map +1 -0
  85. package/dist/wizard.d.ts +3 -0
  86. package/dist/wizard.d.ts.map +1 -0
  87. package/dist/wizard.js +229 -0
  88. package/dist/wizard.js.map +1 -0
  89. package/docs/canvas-design-kb/00-meta/Changelog.md +42 -0
  90. package/docs/canvas-design-kb/00-meta/Contributing.md +58 -0
  91. package/docs/canvas-design-kb/00-meta/KB-Overview.md +51 -0
  92. package/docs/canvas-design-kb/01-canvas-rce/CSS-Inline-Strategy.md +166 -0
  93. package/docs/canvas-design-kb/01-canvas-rce/Canvas-Built-In-CSS-Classes.md +243 -0
  94. package/docs/canvas-design-kb/01-canvas-rce/Canvas-Page-Types.md +59 -0
  95. package/docs/canvas-design-kb/01-canvas-rce/HTML-Allowlist.md +204 -0
  96. package/docs/canvas-design-kb/01-canvas-rce/RCE-Limitations-and-Workarounds.md +151 -0
  97. package/docs/canvas-design-kb/01-canvas-rce/RCE-Overview.md +92 -0
  98. package/docs/canvas-design-kb/02-design-md/DESIGN-MD-Canvas-Template.md +323 -0
  99. package/docs/canvas-design-kb/02-design-md/DESIGN-MD-File-Structure.md +245 -0
  100. package/docs/canvas-design-kb/02-design-md/DESIGN-MD-Overview.md +120 -0
  101. package/docs/canvas-design-kb/02-design-md/DESIGN-MD-Toolchain.md +234 -0
  102. package/docs/canvas-design-kb/03-design-systems/Color-and-Typography.md +146 -0
  103. package/docs/canvas-design-kb/03-design-systems/Component-Library.md +299 -0
  104. package/docs/canvas-design-kb/03-design-systems/Design-System-Principles.md +99 -0
  105. package/docs/canvas-design-kb/04-tools/Canvas-Theme-Editor.md +40 -0
  106. package/docs/canvas-design-kb/04-tools/Other-Canvas-Design-Tools.md +47 -0
  107. package/docs/canvas-design-kb/05-patterns/Course-Home-Page.md +224 -0
  108. package/docs/canvas-design-kb/06-accessibility/Accessibility-Overview.md +128 -0
  109. package/docs/canvas-design-kb/07-resources/Inspiration-and-Showcases.md +121 -0
  110. package/docs/canvas-design-kb/07-resources/Official-Canvas-Links.md +54 -0
  111. package/docs/canvas-design-kb/README.md +58 -0
  112. package/docs/feature-roadmap.md +123 -0
  113. package/docs/installation.md +340 -0
  114. package/package.json +45 -0
  115. package/scripts/deploy-public.ps1 +68 -0
  116. package/src/kb/design-principles.md +45 -0
  117. package/src/templates/ignite-assignment-page.html +203 -0
  118. package/src/templates/two-column-dashboard.html +33 -0
@@ -0,0 +1,188 @@
1
+ import { mkdirSync, writeFileSync } from 'node:fs';
2
+ import { homedir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ function escapeHtml(s) {
5
+ return s.replace(/&/g, '&amp;').replace(/"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
6
+ }
7
+ export function buildEmbedUrl(domain, videoId) {
8
+ return `https://${domain}/Panopto/Pages/Embed.aspx?id=${encodeURIComponent(videoId)}&autoplay=false&captions=true`;
9
+ }
10
+ export function buildViewerUrl(domain, videoId) {
11
+ return `https://${domain}/Panopto/Pages/Viewer.aspx?id=${encodeURIComponent(videoId)}`;
12
+ }
13
+ export function formatDuration(seconds) {
14
+ const rounded = Math.round(seconds);
15
+ const hours = Math.floor(rounded / 3600);
16
+ const mins = Math.floor((rounded % 3600) / 60);
17
+ const secs = rounded % 60;
18
+ if (hours > 0) {
19
+ return `${hours}:${String(mins).padStart(2, '0')}:${String(secs).padStart(2, '0')}`;
20
+ }
21
+ return `${String(mins).padStart(2, '0')}:${String(secs).padStart(2, '0')}`;
22
+ }
23
+ export function formatSearchResults(results, query) {
24
+ if (results.length === 0) {
25
+ return query ? `No videos found matching "${query}".` : 'No videos found in your library.';
26
+ }
27
+ const header = query
28
+ ? `Found ${results.length} video(s) matching "${query}":`
29
+ : `Found ${results.length} video(s) in your library:`;
30
+ const lines = [header, ''];
31
+ results.forEach((v, i) => {
32
+ const cap = v.hasCaptions ? '✓ captions' : '⚠ no captions';
33
+ lines.push(`${i + 1}. ${v.title} [${formatDuration(v.duration)}] ${cap}`);
34
+ lines.push(` ID: ${v.id}`);
35
+ lines.push('');
36
+ });
37
+ lines.push('Use embed_panopto_video with the ID of the video you want to embed.');
38
+ return lines.join('\n');
39
+ }
40
+ export function buildEmbedHtml(config, videoId, title, placement) {
41
+ const embedUrl = buildEmbedUrl(config.domain, videoId);
42
+ const viewerUrl = buildViewerUrl(config.domain, videoId);
43
+ let embed;
44
+ if (config.iframeWhitelisted === true) {
45
+ embed = [
46
+ `<iframe`,
47
+ ` src="${embedUrl}"`,
48
+ ` width="720"`,
49
+ ` height="405"`,
50
+ ` allowfullscreen`,
51
+ ` aria-label="${escapeHtml(title)}"`,
52
+ ` style="max-width:100%;border:0;display:block;">`,
53
+ `</iframe>`,
54
+ ].join('\n');
55
+ }
56
+ else {
57
+ embed = [
58
+ `<a href="${viewerUrl}"`,
59
+ ` target="_blank"`,
60
+ ` style="display:inline-block;padding:12px 20px;background:#0033A0;color:#ffffff;`,
61
+ ` border-radius:8px;font-family:Lato,sans-serif;font-size:15px;text-decoration:none;">`,
62
+ ` ▶ Watch: ${escapeHtml(title)}`,
63
+ `</a>`,
64
+ ].join('\n');
65
+ }
66
+ if (placement === 'full-page') {
67
+ return `<div style="max-width:720px;margin:0 auto;">\n ${embed}\n</div>`;
68
+ }
69
+ return embed;
70
+ }
71
+ export function parseVttToText(vtt) {
72
+ const timestampRe = /^(\d+:)?\d+:\d+\.\d+ --> (\d+:)?\d+:\d+\.\d+/;
73
+ const cueIdRe = /^\d+$/;
74
+ const textLines = [];
75
+ for (const line of vtt.split('\n')) {
76
+ const trimmed = line.trim();
77
+ if (!trimmed || trimmed === 'WEBVTT' || timestampRe.test(trimmed))
78
+ continue;
79
+ if (trimmed.startsWith('NOTE') || trimmed.startsWith('STYLE') || trimmed.startsWith('REGION'))
80
+ continue;
81
+ if (cueIdRe.test(trimmed))
82
+ continue;
83
+ textLines.push(trimmed);
84
+ }
85
+ return textLines.join(' ');
86
+ }
87
+ export function sanitizeFilename(title) {
88
+ return title
89
+ .toLowerCase()
90
+ .replace(/[^a-z0-9]+/g, '-')
91
+ .replace(/^-+|-+$/g, '');
92
+ }
93
+ export async function getPanoptoToken(config) {
94
+ if (!config.clientId || !config.clientSecret) {
95
+ throw new Error('getPanoptoToken: clientId and clientSecret are required');
96
+ }
97
+ const url = `https://${config.domain}/Panopto/oauth2/connect/token`;
98
+ const body = new URLSearchParams({
99
+ grant_type: 'client_credentials',
100
+ client_id: config.clientId,
101
+ client_secret: config.clientSecret,
102
+ scope: 'api',
103
+ });
104
+ const res = await fetch(url, {
105
+ method: 'POST',
106
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
107
+ body: body.toString(),
108
+ });
109
+ if (!res.ok)
110
+ throw new Error(`Panopto OAuth2 failed: ${res.status}`);
111
+ const data = await res.json();
112
+ return data.access_token;
113
+ }
114
+ export async function searchPanoptoVideos(input, config) {
115
+ if (!config.clientId || !config.clientSecret) {
116
+ return 'API_NOT_CONFIGURED: Panopto API credentials are not set. Run setup_institution to add your Panopto clientId and clientSecret.';
117
+ }
118
+ const token = await getPanoptoToken(config);
119
+ const hardLimit = Math.min(input.limit ?? 500, 500);
120
+ const results = [];
121
+ let pageNumber = 0;
122
+ while (results.length < hardLimit) {
123
+ const params = new URLSearchParams({ maxResults: '100', pageNumber: String(pageNumber) });
124
+ if (input.query)
125
+ params.set('searchQuery', input.query);
126
+ const res = await fetch(`https://${config.domain}/Panopto/api/v1/sessions/search?${params.toString()}`, { headers: { Authorization: `Bearer ${token}` } });
127
+ if (!res.ok)
128
+ throw new Error(`Panopto search failed: ${res.status}`);
129
+ const data = await res.json();
130
+ for (const v of data.Results) {
131
+ if (results.length >= hardLimit)
132
+ break;
133
+ results.push({ id: v.Id, title: v.Name, duration: Math.round(v.Duration), hasCaptions: v.HasCaptions });
134
+ }
135
+ if (data.Results.length < 100 || results.length >= data.TotalNumberOfResults)
136
+ break;
137
+ pageNumber++;
138
+ }
139
+ return formatSearchResults(results, input.query ?? '');
140
+ }
141
+ export async function fetchPanoptoCaptions(input, config) {
142
+ if (!config.clientId || !config.clientSecret) {
143
+ return 'API_NOT_CONFIGURED: Panopto API credentials are not set. Run setup_institution to add your Panopto clientId and clientSecret.';
144
+ }
145
+ const token = await getPanoptoToken(config);
146
+ const listRes = await fetch(`https://${config.domain}/Panopto/api/v1/sessions/${input.videoId}/captions`, { headers: { Authorization: `Bearer ${token}` } });
147
+ if (!listRes.ok)
148
+ throw new Error(`Panopto captions list failed: ${listRes.status}`);
149
+ const captionsList = await listRes.json();
150
+ if (captionsList.length === 0) {
151
+ return `No captions available for video ${input.videoId}.`;
152
+ }
153
+ const caption = captionsList.find(c => c.IsDefault) ?? captionsList[0];
154
+ const vttRes = await fetch(caption.FileUrl, { headers: { Authorization: `Bearer ${token}` } });
155
+ if (!vttRes.ok)
156
+ throw new Error(`Panopto VTT download failed: ${vttRes.status}`);
157
+ const vtt = await vttRes.text();
158
+ const transcript = parseVttToText(vtt);
159
+ const title = input.title ?? input.videoId;
160
+ const filename = `${sanitizeFilename(title)}-${sanitizeFilename(input.videoId)}.md`;
161
+ const transcriptDir = join(homedir(), '.canvas-design-mcp', 'transcripts');
162
+ const filePath = join(transcriptDir, filename);
163
+ mkdirSync(transcriptDir, { recursive: true });
164
+ writeFileSync(filePath, `# ${title}\n**Video ID:** ${input.videoId}\n\n---\n\n${transcript}\n`, 'utf-8');
165
+ const wordCount = transcript.split(/\s+/).filter(Boolean).length;
166
+ return `✓ Transcript saved to ${filePath}\n ${wordCount} words extracted\n\nFirst 200 characters:\n${transcript.slice(0, 200)}...`;
167
+ }
168
+ export async function embedPanoptoVideo(input, config) {
169
+ let title = input.title ?? 'Video';
170
+ let hasCaptions = null;
171
+ if (config.clientId && config.clientSecret) {
172
+ const token = await getPanoptoToken(config);
173
+ const res = await fetch(`https://${config.domain}/Panopto/api/v1/sessions/${input.videoId}`, { headers: { Authorization: `Bearer ${token}` } });
174
+ if (res.ok) {
175
+ const data = await res.json();
176
+ title = data.Name;
177
+ hasCaptions = data.HasCaptions;
178
+ }
179
+ }
180
+ const html = buildEmbedHtml(config, input.videoId, title, input.placement);
181
+ const iframeUsed = config.iframeWhitelisted === true;
182
+ const result = { html, videoTitle: title, hasCaptions, iframeUsed };
183
+ if (hasCaptions === false) {
184
+ result.captionWarning = 'This video has no captions. Consider adding captions in Panopto before embedding.';
185
+ }
186
+ return result;
187
+ }
188
+ //# sourceMappingURL=panopto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panopto.js","sourceRoot":"","sources":["../../src/tools/panopto.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export declare const PERSONAS_PATH: string;
2
+ export declare const PERSONAS_TEMPLATE = "# Student Personas\n\nNo personas generated yet. Call generate_student_personas to create a set.\n";
3
+ export interface GenerateStudentPersonasInput {
4
+ count?: number;
5
+ }
6
+ export interface GetStudentPersonasResult {
7
+ content: string;
8
+ exists: boolean;
9
+ }
10
+ export interface WeightedEntry {
11
+ cumulative: number;
12
+ value: string;
13
+ }
14
+ export declare const RACE_TABLE: WeightedEntry[];
15
+ export declare const DISABILITY_TABLE: WeightedEntry[];
16
+ export declare const DIMENSION_POOLS: Record<string, string[]>;
17
+ export declare function weightedSample(table: WeightedEntry[]): string;
18
+ export declare function poolSample(pool: string[]): string;
19
+ export declare function generateStudentPersonas(input: GenerateStudentPersonasInput, personasPath?: string): string;
20
+ export declare function getStudentPersonas(personasPath?: string): GetStudentPersonasResult;
21
+ //# sourceMappingURL=personas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"personas.d.ts","sourceRoot":"","sources":["../../src/tools/personas.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,aAAa,QAA+D,CAAC;AAE1F,eAAO,MAAM,iBAAiB,uGAAuG,CAAC;AAEtI,MAAM,WAAW,4BAA4B;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;CACjB;AAGD,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAGD,eAAO,MAAM,UAAU,EAAE,aAAa,EAarC,CAAC;AAGF,eAAO,MAAM,gBAAgB,EAAE,aAAa,EAY3C,CAAC;AAIF,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAmWpD,CAAC;AAIF,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,MAAM,CAM7D;AAGD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAEjD;AAuCD,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,4BAA4B,EACnC,YAAY,SAAgB,GAC3B,MAAM,CAQR;AAED,wBAAgB,kBAAkB,CAAC,YAAY,SAAgB,GAAG,wBAAwB,CAUzF"}