@learnpack/learnpack 5.0.270 → 5.0.274

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 (77) hide show
  1. package/README.md +409 -409
  2. package/lib/commands/audit.js +15 -15
  3. package/lib/commands/breakToken.js +19 -19
  4. package/lib/commands/clean.js +3 -3
  5. package/lib/commands/init.js +41 -41
  6. package/lib/commands/logout.js +3 -3
  7. package/lib/commands/serve.js +48 -20
  8. package/lib/creatorDist/assets/{index-CQXTTbaZ.js → index-BfLyIQVh.js} +11535 -11409
  9. package/lib/creatorDist/assets/{index-B4khtb0r.css → index-C39zeF3W.css} +3 -3
  10. package/lib/creatorDist/index.html +2 -2
  11. package/lib/managers/config/index.js +77 -77
  12. package/lib/models/creator.d.ts +1 -0
  13. package/lib/utils/api.js +1 -0
  14. package/lib/utils/creatorUtilities.js +14 -14
  15. package/package.json +1 -1
  16. package/src/commands/audit.ts +487 -487
  17. package/src/commands/breakToken.ts +67 -67
  18. package/src/commands/clean.ts +30 -30
  19. package/src/commands/init.ts +650 -650
  20. package/src/commands/logout.ts +38 -38
  21. package/src/commands/publish.ts +522 -522
  22. package/src/commands/serve.ts +64 -33
  23. package/src/commands/start.ts +333 -333
  24. package/src/commands/translate.ts +123 -123
  25. package/src/creator/README.md +54 -54
  26. package/src/creator/eslint.config.js +28 -28
  27. package/src/creator/src/components/syllabus/ContentIndex.tsx +1 -1
  28. package/src/creator/src/components/syllabus/SyllabusEditor.tsx +3 -1
  29. package/src/creator/src/i18n.ts +28 -28
  30. package/src/creator/src/index.css +217 -217
  31. package/src/creator/src/locales/en.json +1 -0
  32. package/src/creator/src/locales/es.json +1 -0
  33. package/src/creator/src/utils/configTypes.ts +122 -122
  34. package/src/creator/src/utils/constants.ts +13 -13
  35. package/src/creator/src/utils/creatorUtils.ts +46 -46
  36. package/src/creator/src/utils/eventBus.ts +2 -2
  37. package/src/creator/src/utils/lib.ts +468 -468
  38. package/src/creator/src/utils/rigo.ts +26 -26
  39. package/src/creator/src/utils/socket.ts +61 -61
  40. package/src/creator/src/utils/store.ts +222 -222
  41. package/src/creator/src/vite-env.d.ts +1 -1
  42. package/src/creator/vite.config.ts +13 -13
  43. package/src/creatorDist/assets/{index-CQXTTbaZ.js → index-BfLyIQVh.js} +11535 -11409
  44. package/src/creatorDist/assets/{index-B4khtb0r.css → index-C39zeF3W.css} +3 -3
  45. package/src/creatorDist/index.html +2 -2
  46. package/src/managers/config/defaults.ts +49 -49
  47. package/src/managers/config/exercise.ts +364 -364
  48. package/src/managers/config/index.ts +775 -775
  49. package/src/managers/file.ts +236 -236
  50. package/src/managers/server/routes.ts +554 -554
  51. package/src/managers/session.ts +182 -182
  52. package/src/managers/telemetry.ts +188 -188
  53. package/src/models/action.ts +13 -13
  54. package/src/models/config-manager.ts +28 -28
  55. package/src/models/config.ts +106 -106
  56. package/src/models/creator.ts +40 -39
  57. package/src/models/exercise-obj.ts +30 -30
  58. package/src/models/session.ts +39 -39
  59. package/src/models/socket.ts +61 -61
  60. package/src/models/status.ts +16 -16
  61. package/src/ui/_app/app.css +1 -1
  62. package/src/ui/_app/app.js +435 -414
  63. package/src/ui/_app/learnpack.svg +7 -7
  64. package/src/ui/app.tar.gz +0 -0
  65. package/src/utils/BaseCommand.ts +56 -56
  66. package/src/utils/api.ts +31 -30
  67. package/src/utils/audit.ts +392 -392
  68. package/src/utils/checkNotInstalled.ts +267 -267
  69. package/src/utils/configBuilder.ts +82 -82
  70. package/src/utils/convertCreds.js +34 -34
  71. package/src/utils/creatorUtilities.ts +504 -504
  72. package/src/utils/incrementVersion.js +74 -74
  73. package/src/utils/misc.ts +58 -58
  74. package/src/utils/rigoActions.ts +500 -500
  75. package/src/utils/sidebarGenerator.ts +195 -195
  76. package/src/utils/templates/isolated/exercises/01-hello-world/README.es.md +26 -26
  77. package/src/utils/templates/isolated/exercises/01-hello-world/README.md +26 -26
@@ -45,7 +45,10 @@ import {
45
45
  import axios from "axios"
46
46
  import * as FormData from "form-data"
47
47
  import api, { RIGOBOT_HOST } from "../utils/api"
48
- import { createUploadMiddleware, minutesToISO8601Duration } from "../utils/misc"
48
+ import {
49
+ createUploadMiddleware,
50
+ minutesToISO8601Duration,
51
+ } from "../utils/misc"
49
52
  import { buildConfig, ConfigResponse } from "../utils/configBuilder"
50
53
  import { checkReadability, slugify } from "../utils/creatorUtilities"
51
54
  import { checkAndFixSidebarPure } from "../utils/sidebarGenerator"
@@ -157,11 +160,9 @@ const uploadInitialReadme = async (
157
160
  :rigo
158
161
  \`\`\`
159
162
  `
160
- const readmeFilename = `README.${
161
- packageContext.language && packageContext.language !== "en" ?
162
- `${packageContext.language}.` :
163
- ""
164
- }md`
163
+ const readmeFilename = `README${getReadmeExtension(
164
+ packageContext.language || "en"
165
+ )}`
165
166
 
166
167
  await uploadFileToBucket(
167
168
  bucket,
@@ -229,12 +230,10 @@ const createMultiLangAsset = async (
229
230
  }
230
231
 
231
232
  async function startExerciseGeneration(
232
- bucket: Bucket,
233
233
  rigoToken: string,
234
234
  steps: Lesson[],
235
235
  packageContext: FormState,
236
236
  exercise: Lesson,
237
- tutorialDir: string,
238
237
  courseSlug: string,
239
238
  purposeSlug: string,
240
239
  lastLesson = ""
@@ -246,7 +245,7 @@ async function startExerciseGeneration(
246
245
 
247
246
  console.log("WEBHOOK URL", webhookUrl)
248
247
 
249
- await readmeCreator(
248
+ const res = await readmeCreator(
250
249
  rigoToken,
251
250
  {
252
251
  title: `${exercise.id} - ${exercise.title}`,
@@ -262,6 +261,8 @@ async function startExerciseGeneration(
262
261
  purposeSlug,
263
262
  webhookUrl
264
263
  )
264
+
265
+ console.log("README CREATOR RES", res)
265
266
  }
266
267
 
267
268
  async function createInitialReadme(
@@ -558,8 +559,6 @@ export default class ServeCommand extends SessionCommand {
558
559
  return res.json({ status: "ERROR" })
559
560
  }
560
561
 
561
- fs.writeFileSync(`image-${imageId}.json`, JSON.stringify(body, null, 2))
562
-
563
562
  const imageUrl = body.image_url
564
563
  const format = body.format
565
564
  const imagePath = `courses/${courseSlug}/.learn/assets/${imageId}`
@@ -651,18 +650,34 @@ export default class ServeCommand extends SessionCommand {
651
650
  }
652
651
 
653
652
  await startExerciseGeneration(
654
- bucket,
655
653
  rigoToken,
656
654
  syllabusJson.lessons,
657
655
  syllabusJson.courseInfo,
658
656
  exercise,
659
- `courses/${courseSlug}`,
660
657
  courseSlug,
661
658
  syllabusJson.courseInfo.purpose,
662
659
  previousReadme +
663
660
  "\n\nThe user provided the following feedback related to the content of the course so far: \n\n" +
664
661
  feedback
665
662
  )
663
+
664
+ syllabusJson.lessons[parseInt(position)].status = "GENERATING"
665
+ if (
666
+ syllabusJson.feedback &&
667
+ typeof syllabusJson.feedback === "string"
668
+ ) {
669
+ syllabusJson.feedback += "\n\n" + feedback
670
+ } else {
671
+ syllabusJson.feedback = feedback
672
+ }
673
+
674
+ await uploadFileToBucket(
675
+ bucket,
676
+ JSON.stringify(syllabusJson),
677
+ `courses/${courseSlug}/.learn/initialSyllabus.json`
678
+ )
679
+
680
+ res.json({ status: "SUCCESS" })
666
681
  }
667
682
  )
668
683
 
@@ -762,16 +777,19 @@ export default class ServeCommand extends SessionCommand {
762
777
  nextExercise &&
763
778
  (exerciseIndex === 0 || !(exerciseIndex % 3 === 0))
764
779
  ) {
780
+ let feedback = ""
781
+ if (syllabusJson.feedback) {
782
+ feedback = `\n\nThe user added the following feedback with relation to the previous generations: ${syllabusJson.feedback}`
783
+ }
784
+
765
785
  startExerciseGeneration(
766
- bucket,
767
786
  rigoToken,
768
787
  syllabusJson.lessons,
769
788
  syllabusJson.courseInfo,
770
789
  nextExercise,
771
- `courses/${courseSlug}`,
772
790
  courseSlug,
773
791
  syllabusJson.courseInfo.purpose,
774
- readme.parsed.content
792
+ readme.parsed.content + "\n\n" + feedback
775
793
  )
776
794
  nextStarted = true
777
795
  } else {
@@ -801,8 +819,8 @@ export default class ServeCommand extends SessionCommand {
801
819
 
802
820
  const newSyllabus = {
803
821
  ...syllabusJson,
804
- lessons: syllabusJson.lessons.map(lesson => {
805
- if (lesson.id === exercise.id) {
822
+ lessons: syllabusJson.lessons.map((lesson, index) => {
823
+ if (index === exerciseIndex) {
806
824
  return { ...lesson, generated: true, status: "DONE" }
807
825
  }
808
826
 
@@ -1424,12 +1442,10 @@ export default class ServeCommand extends SessionCommand {
1424
1442
  const lastResult = "---"
1425
1443
 
1426
1444
  await startExerciseGeneration(
1427
- bucket,
1428
1445
  rigoToken,
1429
1446
  syllabus.lessons,
1430
1447
  syllabus.courseInfo,
1431
1448
  firstLesson,
1432
- tutorialDir,
1433
1449
  courseSlug,
1434
1450
  syllabus.courseInfo.purpose,
1435
1451
  lastResult
@@ -1494,12 +1510,10 @@ export default class ServeCommand extends SessionCommand {
1494
1510
  const firstLessonToGenerate = notGeneratedLessons[0]
1495
1511
 
1496
1512
  await startExerciseGeneration(
1497
- bucket,
1498
1513
  rigoToken,
1499
1514
  syllabusJson.lessons,
1500
1515
  syllabusJson.courseInfo,
1501
1516
  firstLessonToGenerate,
1502
- `courses/${courseSlug}`,
1503
1517
  courseSlug,
1504
1518
  syllabusJson.courseInfo.purpose,
1505
1519
  JSON.stringify(lastGeneratedLesson) +
@@ -1734,7 +1748,9 @@ export default class ServeCommand extends SessionCommand {
1734
1748
  console.error("❌ Error fetching file:", error)
1735
1749
  return res
1736
1750
  .status(500)
1737
- .json({ error: (error as Error).message || "Unable to fetch file" })
1751
+ .json({
1752
+ error: (error as Error).message || "Unable to fetch file",
1753
+ })
1738
1754
  }
1739
1755
  }
1740
1756
  )
@@ -1750,25 +1766,38 @@ export default class ServeCommand extends SessionCommand {
1750
1766
 
1751
1767
  if (ytMatch) {
1752
1768
  const videoId = ytMatch[1]
1769
+ console.log("VIDEO ID", videoId)
1753
1770
  // fetch metadata
1754
1771
  const items = await YoutubeTranscript.fetchTranscript(videoId)
1772
+ console.log("ITEMS FROM YOUTUBE TRANSCRIPT", items)
1755
1773
  const transcript = items.map(i => i.text).join(" ")
1756
1774
 
1757
- const { data: meta } = await axios.get(
1758
- "https://www.youtube.com/oembed",
1759
- {
1760
- params: { url: decoded, format: "json" },
1761
- }
1762
- )
1775
+ let meta: any = null
1776
+ try {
1777
+ const { data: meta } = await axios.get(
1778
+ "https://www.youtube.com/oembed",
1779
+ {
1780
+ params: { url: decoded, format: "json" },
1781
+ }
1782
+ )
1783
+ console.log("META", meta)
1784
+ } catch (error) {
1785
+ console.error("ERROR FETCHING META", error)
1786
+ meta = null
1787
+ }
1788
+
1789
+ throw new Error("test")
1763
1790
 
1764
1791
  return res.json({
1765
1792
  url: decoded,
1766
- title: meta.title,
1767
- author: meta.author_name,
1768
- thumbnail: meta.thumbnail_url,
1793
+ title: meta?.title || null,
1794
+ author: meta?.author_name || null,
1795
+ thumbnail: meta?.thumbnail_url || null,
1769
1796
  transcript,
1770
1797
  })
1771
1798
  }
1799
+
1800
+ console.log("NOT A YOUTUBE LINK", decoded)
1772
1801
 
1773
1802
  const response = await axios.get(decoded, { responseType: "text" })
1774
1803
  const html = response.data as string
@@ -1783,7 +1812,9 @@ export default class ServeCommand extends SessionCommand {
1783
1812
  })
1784
1813
  } catch (error: any) {
1785
1814
  console.error("❌ /actions/fetch error:", error.message || error)
1786
- res.status(500).json({ error: error.message || "Failed to fetch link" })
1815
+ res
1816
+ .status(500)
1817
+ .json({ error: error.message || "Failed to fetch link" })
1787
1818
  }
1788
1819
  })
1789
1820
  app.delete("/packages/:slug", async (req, res) => {