@examplary/cli 1.1.0 → 1.3.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.
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@examplary/cli",
3
3
  "description": "A bundler for Examplary question types.",
4
4
  "packageManager": "yarn@4.8.1",
5
- "version": "1.1.0",
5
+ "version": "1.3.0",
6
6
  "type": "module",
7
7
  "bin": {
8
8
  "exp": "./bin/index.js"
@@ -20,25 +20,25 @@
20
20
  "@examplary/schemas": "*",
21
21
  "@examplary/ui": "*",
22
22
  "@hono/node-server": "^1.19.0",
23
- "@monaco-editor/react": "^4.7.0",
24
- "@tailwindcss/postcss": "^4.1.11",
25
- "@tailwindcss/vite": "^4.1.11",
26
- "@vitejs/plugin-react": "^4.7.0",
27
- "esbuild": "^0.25.8",
28
- "hono": "^4.8.9",
23
+ "@tailwindcss/postcss": "^4.1.14",
24
+ "@tailwindcss/vite": "^4.1.16",
25
+ "@vitejs/plugin-react": "^5.0.4",
26
+ "esbuild": "^0.27.1",
27
+ "hono": "^4.9.12",
29
28
  "i18next": "^25.3.2",
30
29
  "i18next-browser-languagedetector": "^8.2.0",
30
+ "jsonata": "^2.1.0",
31
31
  "lucide-react": "^0.535.0",
32
32
  "open": "^10.2.0",
33
33
  "postcss": "^8.5.6",
34
- "react": "^19.1.0",
35
- "react-dom": "^19.1.0",
34
+ "react": "^19.0.0",
35
+ "react-dom": "^19.0.0",
36
36
  "react-error-boundary": "^6.0.0",
37
- "react-i18next": "^15.6.1",
37
+ "react-i18next": "^16.0.0",
38
38
  "swr": "^2.3.6",
39
- "tailwindcss": "^4.1.11",
39
+ "tailwindcss": "^4.1.14",
40
40
  "use-local-storage": "^3.0.0",
41
- "vite": "^7.0.6",
41
+ "vite": "^7.1.10",
42
42
  "ws": "^8.18.3",
43
43
  "yargs": "^18.0.0"
44
44
  },
@@ -2,7 +2,7 @@
2
2
  import { watch } from "fs";
3
3
  import { stat, readFile } from "fs/promises";
4
4
  import { createServer as createHttpServer } from "http";
5
- import { join, resolve } from "path";
5
+ import path, { join, resolve } from "path";
6
6
  import { cwd, exit } from "process";
7
7
 
8
8
  import { serve } from "@hono/node-server";
@@ -41,6 +41,12 @@ export const previewCommand = async (argv) => {
41
41
  appType: "custom",
42
42
  root,
43
43
  plugins: [react(), tailwindcss()],
44
+ resolve: {
45
+ alias: {
46
+ react: path.dirname(import.meta.resolve("react")),
47
+ "react-dom": path.dirname(import.meta.resolve("react-dom")),
48
+ },
49
+ },
44
50
  });
45
51
 
46
52
  app.get("/api/bundle", async (c) => {
@@ -5,6 +5,7 @@ import { cwd, exit } from "process";
5
5
 
6
6
  import { setApiHost, setApiKey, uploadFile } from "../lib/api.js";
7
7
  import { buildComponent } from "../lib/bundle.js";
8
+ import { deepCompileJsonata } from "../lib/jsonata.js";
8
9
  import { buildStyles } from "../lib/styles.js";
9
10
 
10
11
  export const uploadCommand = async (argv) => {
@@ -42,6 +43,18 @@ export const uploadCommand = async (argv) => {
42
43
  exit(1);
43
44
  }
44
45
 
46
+ // Validate JSONata expressions in the definition
47
+ if (definition.export?.qti?.interaction?.options) {
48
+ try {
49
+ await deepCompileJsonata(definition.export.qti.interaction.options);
50
+ } catch (e) {
51
+ console.error(
52
+ `🚫 Invalid JSONata expression in export.qti.interaction.options: ${e.message}`,
53
+ );
54
+ exit(1);
55
+ }
56
+ }
57
+
45
58
  // Bundle and upload components
46
59
  const components = {};
47
60
  const validComponentTypes = [
@@ -156,7 +169,7 @@ export const uploadCommand = async (argv) => {
156
169
  // Upload the main question type definition
157
170
  const res = await fetch(`${argv.host}/question-types`, {
158
171
  headers: {
159
- Authorization: argv.key,
172
+ Authorization: `Bearer ${argv.key}`,
160
173
  "Content-Type": "application/json",
161
174
  },
162
175
  method: "POST",
package/src/lib/api.js CHANGED
@@ -23,7 +23,7 @@ export const uploadFile = async (fileName, fileContents, contentType) => {
23
23
  // Request the upload URL
24
24
  const res = await fetch(`${API_HOST}/media/upload?${params.toString()}`, {
25
25
  headers: {
26
- Authorization: API_KEY,
26
+ Authorization: `Bearer ${API_KEY}`,
27
27
  },
28
28
  });
29
29
 
@@ -0,0 +1,31 @@
1
+ import jsonata from "jsonata";
2
+
3
+ export const deepCompileJsonata = async (expression) => {
4
+ if (typeof expression === "string" && expression.startsWith("=")) {
5
+ try {
6
+ jsonata(expression.substring(1));
7
+ } catch (error) {
8
+ throw new Error(
9
+ `JSONata evaluation failed for "${expression}": ${error.message}`,
10
+ );
11
+ }
12
+ }
13
+
14
+ if (Array.isArray(expression)) {
15
+ const output = [];
16
+ for (const o of expression) {
17
+ output.push(await deepCompileJsonata(o));
18
+ }
19
+ return output;
20
+ }
21
+
22
+ if (typeof expression === "object" && expression !== null) {
23
+ const result = {};
24
+ for (const [key, value] of Object.entries(expression)) {
25
+ result[key] = await deepCompileJsonata(value);
26
+ }
27
+ return result;
28
+ }
29
+
30
+ return expression;
31
+ };
@@ -53,30 +53,14 @@ function App() {
53
53
  "When Napoleon Bonaparte rose to power, he was seen as a hero of the French Revolution. However, his actions and policies during his rule have been debated by historians. What was Napoleon's role in the French Revolution?",
54
54
  settings: {
55
55
  ...defaultSettings,
56
- scoringCriteria: [
57
- "The answer must correctly identify Napoleon's role in the French Revolution and provide relevant historical context.",
58
- ],
59
56
  options: [
60
- {
61
- correct: true,
62
- value:
63
- "To establish a centralized legal system and promote the principles of the Revolution.",
64
- },
65
- {
66
- correct: false,
67
- value:
68
- "To overthrow the revolutionary government and establish a dictatorship.",
69
- },
70
- {
71
- correct: false,
72
- value:
73
- "To maintain the status quo and prevent further revolutionary changes.",
74
- },
75
- {
76
- correct: false,
77
- value: "To support the monarchy and restore the old regime.",
78
- },
57
+ "To establish a centralized legal system and promote the principles of the Revolution.",
58
+ "To overthrow the revolutionary government and establish a dictatorship.",
59
+ "To maintain the status quo and prevent further revolutionary changes.",
60
+ "To support the monarchy and restore the old regime.",
79
61
  ],
62
+ correctAnswer:
63
+ "To establish a centralized legal system and promote the principles of the Revolution.",
80
64
  },
81
65
  },
82
66
  );
@@ -88,7 +72,7 @@ function App() {
88
72
  <h2 className="text-sm opacity-50">Question type preview</h2>
89
73
 
90
74
  <h3 className="text-sm font-medium mb-1.5 mt-8">Preview options</h3>
91
- <div className="grid grid-cols-3 items-center gap-3 border-2 rounded-md bg-white p-4">
75
+ <div className="grid grid-cols-3 items-center gap-3 border border-border-accent rounded-md bg-white p-4">
92
76
  <p className="text-gray-800 text-sm">Component</p>
93
77
  <Select value={componentName} onValueChange={setComponentName}>
94
78
  <SelectTrigger className="text-sm col-span-2">
@@ -118,12 +102,12 @@ function App() {
118
102
  </div>
119
103
 
120
104
  <h3 className="text-sm font-medium mb-1.5 mt-8">Question</h3>
121
- <div className="border-2 rounded-md bg-white overflow-hidden">
105
+ <div className="border border-border-accent rounded-md bg-white overflow-hidden">
122
106
  <JsonEditor value={question} setValue={setQuestion} />
123
107
  </div>
124
108
 
125
109
  <h3 className="text-sm font-medium mb-1.5 mt-8">Answer</h3>
126
- <div className="border-2 rounded-md bg-white overflow-hidden">
110
+ <div className="border border-border-accent rounded-md bg-white overflow-hidden">
127
111
  <JsonEditor value={answer} setValue={setAnswer} />
128
112
  </div>
129
113
  </aside>
@@ -1,7 +1,5 @@
1
1
  import { useEffect, useState } from "react";
2
2
 
3
- import { Editor } from "@monaco-editor/react";
4
-
5
3
  export const JsonEditor = ({ value, setValue }) => {
6
4
  const [stringValue, setStringValue] = useState(() =>
7
5
  JSON.stringify(value, null, 2),
@@ -11,11 +9,11 @@ export const JsonEditor = ({ value, setValue }) => {
11
9
  }, [value]);
12
10
 
13
11
  return (
14
- <Editor
15
- height={160}
16
- defaultLanguage="json"
12
+ <textarea
13
+ className="h-[160px] font-mono text-xs p-3 w-full"
17
14
  value={stringValue}
18
- onChange={(newStringValue) => {
15
+ onChange={(e) => {
16
+ const newStringValue = e.target.value;
19
17
  setStringValue(newStringValue || "");
20
18
  try {
21
19
  const parsedValue = JSON.parse(newStringValue || "");
@@ -24,18 +22,6 @@ export const JsonEditor = ({ value, setValue }) => {
24
22
  console.error("Invalid JSON:", error);
25
23
  }
26
24
  }}
27
- options={{
28
- minimap: { enabled: false },
29
- stickyScroll: { enabled: false },
30
- tabSize: 3,
31
- fontSize: 11,
32
- lineNumbers: "off",
33
- scrollBeyondLastLine: false,
34
- padding: {
35
- top: 8,
36
- bottom: 8,
37
- },
38
- }}
39
25
  />
40
26
  );
41
27
  };
@@ -1,6 +1,7 @@
1
1
  import { RichTextDisplay } from "@examplary/ui";
2
2
 
3
3
  import { QuestionComponent } from "./question-component";
4
+ import { api } from "../lib/demo-api";
4
5
 
5
6
  export const PreviewAssessment = ({
6
7
  questionType,
@@ -10,10 +11,9 @@ export const PreviewAssessment = ({
10
11
  }) => {
11
12
  return (
12
13
  <div className="relative flex flex-col min-h-[calc(100vh-17.5rem)]">
13
- <div className="rounded-base shadow-light border-2 border-border bg-main text-black hidden md:block right-0 top-5 bottom-5 left-5 absolute" />
14
- <div className="rounded-base shadow-light border-2 border-border bg-main text-black flex-1 bg-white py-7 px-10 md:mr-5 relative z-10">
14
+ <div className="rounded-xl border border-border bg-main text-black flex-1 bg-white py-7 px-10 relative z-10">
15
15
  <div className="flex justify-between gap-2 mb-3">
16
- <div className="size-6 bg-bright border-2 text-sm font-bold rounded-full flex items-center justify-center shrink-0">
16
+ <div className="size-6 bg-bright border text-sm font-bold rounded-full flex items-center justify-center shrink-0">
17
17
  1
18
18
  </div>
19
19
  <div className="flex-1">
@@ -28,6 +28,7 @@ export const PreviewAssessment = ({
28
28
  type={questionType}
29
29
  componentName="assessment"
30
30
  props={{
31
+ api,
31
32
  question,
32
33
  answer,
33
34
  saveAnswer,
@@ -1,6 +1,7 @@
1
1
  import { RichTextDisplay } from "@examplary/ui";
2
2
 
3
3
  import { QuestionComponent } from "./question-component";
4
+ import { api } from "../lib/demo-api";
4
5
 
5
6
  export const PreviewResults = ({ questionType, question, answer }) => {
6
7
  return (
@@ -19,6 +20,7 @@ export const PreviewResults = ({ questionType, question, answer }) => {
19
20
  type={questionType}
20
21
  componentName="results"
21
22
  props={{
23
+ api,
22
24
  question,
23
25
  answer,
24
26
  }}
@@ -2,6 +2,7 @@ import { cn, MinimalRichTextField } from "@examplary/ui";
2
2
  import { FileQuestionIcon } from "lucide-react";
3
3
 
4
4
  import { QuestionComponent } from "./question-component";
5
+ import { api } from "../lib/demo-api";
5
6
 
6
7
  export const PreviewSettingsArea = ({
7
8
  questionType,
@@ -13,20 +14,15 @@ export const PreviewSettingsArea = ({
13
14
  data-type="question"
14
15
  data-question-id={question.id}
15
16
  className={cn(
16
- "rounded-base shadow-light border-2 border-border bg-main text-black",
17
- "mb-3 relative bg-white transition-[border,shadow,opacity]",
18
- "shadow-light",
17
+ "rounded-xl border border-border bg-main text-black",
18
+ "mb-3 relative bg-white transition-[border,shadow,opacity] p-6 px-7",
19
19
  )}
20
20
  >
21
- <div className="p-4 flex gap-3">
21
+ <div className="flex gap-3">
22
22
  <div
23
23
  className={cn(
24
- "size-6 rounded-full border-2 items-center justify-center flex transition",
25
- questionType?.iconBackgroundColor ? "" : "bg-bright",
24
+ "size-6 rounded-full border-2 items-center justify-center flex transition bg-bright",
26
25
  )}
27
- style={{
28
- backgroundColor: questionType?.iconBackgroundColor || undefined,
29
- }}
30
26
  >
31
27
  {questionType?.icon ? (
32
28
  <img
@@ -65,14 +61,24 @@ export const PreviewSettingsArea = ({
65
61
  </div>
66
62
  </div>
67
63
  </div>
68
- <div className="border-t-2 pt-5">
69
- <div className="pb-5 px-6">
64
+ <div className="border-t border-border pt-5 mt-5 ml-9 mb-4">
65
+ <div>
70
66
  <QuestionComponent
71
67
  type={questionType}
72
68
  componentName="settings-area"
73
69
  props={{
70
+ api,
74
71
  question,
75
72
  settings: question.settings,
73
+ setMultipleSettings: (newSettings) => {
74
+ setQuestion({
75
+ ...question,
76
+ settings: {
77
+ ...question.settings,
78
+ ...newSettings,
79
+ },
80
+ });
81
+ },
76
82
  setSetting: (settingId, value) => {
77
83
  setQuestion({
78
84
  ...question,
@@ -4,6 +4,13 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>Examplary - Question type preview</title>
7
+
8
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
9
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
10
+ <link
11
+ href="https://fonts.googleapis.com/css2?family=Epunda+Sans:ital,wght@0,300..900;1,300..900&family=Epunda+Slab:ital,wght@0,300..900;1,300..900&display=swap"
12
+ rel="stylesheet"
13
+ />
7
14
  </head>
8
15
  <body class="bg-app-bg font-sans">
9
16
  <div id="root"></div>
@@ -0,0 +1,29 @@
1
+ export const api = {
2
+ get: async (path: string, options: any) => {
3
+ console.warn("API calls are not supported in the preview UI");
4
+ return {};
5
+ },
6
+ post: async (path: string, body: any, options: any) => {
7
+ console.warn("API calls are not supported in the preview UI");
8
+ return {};
9
+ },
10
+ put: async (path: string, body: any, options: any) => {
11
+ console.warn("API calls are not supported in the preview UI");
12
+ return {};
13
+ },
14
+ delete: async (path: string, options: any) => {
15
+ console.warn("API calls are not supported in the preview UI");
16
+ return {};
17
+ },
18
+ patch: async (path: string, body: any, options: any) => {
19
+ console.warn("API calls are not supported in the preview UI");
20
+ return {};
21
+ },
22
+ uploadFile: async (accept: "*/*") => {
23
+ console.warn("File uploads are not supported in the preview UI");
24
+ return {
25
+ url: `https://placehold.co/600x400?${Math.random()}`,
26
+ name: "image.jpg",
27
+ };
28
+ },
29
+ };
@@ -1,80 +0,0 @@
1
- [1:32:33 PM] [semantic-release] › ℹ Running semantic-release version 24.2.7
2
- [1:32:34 PM] [semantic-release] › ✔ Loaded plugin "verifyConditions" from "@semantic-release/npm"
3
- [1:32:34 PM] [semantic-release] › ✔ Loaded plugin "verifyConditions" from "@semantic-release/github"
4
- [1:32:34 PM] [semantic-release] › ✔ Loaded plugin "prepare" from "@semantic-release/npm"
5
- [1:32:34 PM] [semantic-release] › ✔ Loaded plugin "publish" from "@semantic-release/npm"
6
- [1:32:34 PM] [semantic-release] › ✔ Loaded plugin "publish" from "@semantic-release/github"
7
- [1:32:34 PM] [semantic-release] › ✔ Loaded plugin "addChannel" from "@semantic-release/npm"
8
- [1:32:34 PM] [semantic-release] › ✔ Loaded plugin "addChannel" from "@semantic-release/github"
9
- [1:32:41 PM] [semantic-release] › ✔ Run automated release from branch main on repository https://github.com/examplary-ai/examplary
10
- [1:32:42 PM] [semantic-release] › ✔ Allowed to push to the Git repository
11
- [1:32:42 PM] [semantic-release] › ℹ Start step "verifyConditions" of plugin "@semantic-release/npm"
12
- [1:32:42 PM] [semantic-release] [@semantic-release/npm] › ℹ Verify authentication for registry https://registry.npmjs.org/
13
- [1:32:42 PM] [semantic-release] [@semantic-release/npm] › ℹ Reading npm config from /home/runner/work/examplary/examplary/.npmrc
14
- [1:32:42 PM] [semantic-release] [@semantic-release/npm] › ℹ Wrote NPM_TOKEN to /tmp/080f60dec1867118082aefee0669259b/.npmrc
15
- tschoffelen
16
- [1:32:43 PM] [semantic-release] › ✔ Completed step "verifyConditions" of plugin "@semantic-release/npm"
17
- [1:32:43 PM] [semantic-release] › ℹ Start step "verifyConditions" of plugin "@semantic-release/github"
18
- [1:32:43 PM] [semantic-release] [@semantic-release/github] › ℹ Verify GitHub authentication (https://api.github.com)
19
- [1:32:43 PM] [semantic-release] › ✔ Completed step "verifyConditions" of plugin "@semantic-release/github"
20
- [1:32:43 PM] [semantic-release] › ℹ Found git tag @examplary/cli-v1.0.0 associated with version 1.0.0 on branch main
21
- [1:32:44 PM] [semantic-release] › ℹ Found 179 commits since last release
22
- [1:32:44 PM] [semantic-release] › ℹ Start step "analyzeCommits" of plugin "[Function: semantic-release-monorepo]"
23
- [1:32:44 PM] [semantic-release] [[Function: semantic-release-monorepo]] › ℹ Start step "analyzeCommits" of plugin "@semantic-release/commit-analyzer"
24
- [1:32:45 PM] [semantic-release] [[Function: semantic-release-monorepo]] › ℹ Found 3 commits for package @examplary/cli since last release
25
- [1:32:45 PM] [semantic-release] [[Function: semantic-release-monorepo]] › ℹ Analyzing commit: feat(schemas): add question generation instructions field
26
- [1:32:45 PM] [semantic-release] [[Function: semantic-release-monorepo]] › ℹ The release type for the commit is minor
27
- [1:32:45 PM] [semantic-release] [[Function: semantic-release-monorepo]] › ℹ Analyzing commit: chore: rename cli
28
- [1:32:45 PM] [semantic-release] [[Function: semantic-release-monorepo]] › ℹ The commit should not trigger a release
29
- [1:32:45 PM] [semantic-release] [[Function: semantic-release-monorepo]] › ℹ Analyzing commit: chore(deps): bump swr from 2.3.4 to 2.3.6
30
-
31
- Bumps [swr](https://github.com/vercel/swr) from 2.3.4 to 2.3.6.
32
- - [Release notes](https://github.com/vercel/swr/releases)
33
- - [Commits](https://github.com/vercel/swr/compare/v2.3.4...v2.3.6)
34
-
35
- ---
36
- updated-dependencies:
37
- - dependency-name: swr
38
- dependency-version: 2.3.6
39
- dependency-type: direct:production
40
- update-type: version-update:semver-patch
41
- ...
42
-
43
- Signed-off-by: dependabot[bot] <support@github.com>
44
- [1:32:45 PM] [semantic-release] [[Function: semantic-release-monorepo]] › ℹ The commit should not trigger a release
45
- [1:32:45 PM] [semantic-release] [[Function: semantic-release-monorepo]] › ℹ Analysis of 3 commits complete: minor release
46
- [1:32:45 PM] [semantic-release] [[Function: semantic-release-monorepo]] › ℹ Completed step "analyzeCommits" of plugin "@semantic-release/commit-analyzer"
47
- [1:32:45 PM] [semantic-release] › ✔ Completed step "analyzeCommits" of plugin "[Function: semantic-release-monorepo]"
48
- [1:32:45 PM] [semantic-release] › ℹ Start step "analyzeCommits" of plugin "[Function: semantic-release-monorepo]"
49
- [1:32:45 PM] [semantic-release] [[Function: semantic-release-monorepo]] › ℹ Plugin "@semantic-release/release-notes-generator" does not provide step "analyzeCommits"
50
- [1:32:45 PM] [semantic-release] › ✔ Completed step "analyzeCommits" of plugin "[Function: semantic-release-monorepo]"
51
- [1:32:45 PM] [semantic-release] › ℹ Start step "analyzeCommits" of plugin "[Function: semantic-release-monorepo]"
52
- [1:32:45 PM] [semantic-release] [[Function: semantic-release-monorepo]] › ℹ Plugin "@semantic-release/npm" does not provide step "analyzeCommits"
53
- [1:32:45 PM] [semantic-release] › ✔ Completed step "analyzeCommits" of plugin "[Function: semantic-release-monorepo]"
54
- [1:32:45 PM] [semantic-release] › ℹ Start step "analyzeCommits" of plugin "[Function: semantic-release-monorepo]"
55
- [1:32:45 PM] [semantic-release] [[Function: semantic-release-monorepo]] › ℹ Plugin "@semantic-release/github" does not provide step "analyzeCommits"
56
- [1:32:45 PM] [semantic-release] › ✔ Completed step "analyzeCommits" of plugin "[Function: semantic-release-monorepo]"
57
- [1:32:45 PM] [semantic-release] › ℹ Start step "analyzeCommits" of plugin "[Function: semantic-release-monorepo]"
58
- [1:32:45 PM] [semantic-release] [[Function: semantic-release-monorepo]] › ℹ No more plugins
59
- [1:32:45 PM] [semantic-release] › ✔ Completed step "analyzeCommits" of plugin "[Function: semantic-release-monorepo]"
60
- [1:32:45 PM] [semantic-release] › ℹ Start step "analyzeCommits" of plugin "[Function: semantic-release-monorepo]"
61
- [1:32:45 PM] [semantic-release] [[Function: semantic-release-monorepo]] › ℹ No more plugins
62
- [1:32:45 PM] [semantic-release] › ✔ Completed step "analyzeCommits" of plugin "[Function: semantic-release-monorepo]"
63
- [1:32:45 PM] [semantic-release] › ℹ Start step "analyzeCommits" of plugin "[Function: semantic-release-monorepo]"
64
- [1:32:45 PM] [semantic-release] [[Function: semantic-release-monorepo]] › ℹ No more plugins
65
- [1:32:45 PM] [semantic-release] › ✔ Completed step "analyzeCommits" of plugin "[Function: semantic-release-monorepo]"
66
- [1:32:45 PM] [semantic-release] › ℹ Start step "analyzeCommits" of plugin "[Function: semantic-release-monorepo]"
67
- [1:32:45 PM] [semantic-release] [[Function: semantic-release-monorepo]] › ℹ No more plugins
68
- [1:32:45 PM] [semantic-release] › ✔ Completed step "analyzeCommits" of plugin "[Function: semantic-release-monorepo]"
69
- [1:32:45 PM] [semantic-release] › ℹ Start step "analyzeCommits" of plugin "[Function: semantic-release-monorepo]"
70
- [1:32:45 PM] [semantic-release] [[Function: semantic-release-monorepo]] › ℹ No more plugins
71
- [1:32:45 PM] [semantic-release] › ✔ Completed step "analyzeCommits" of plugin "[Function: semantic-release-monorepo]"
72
- [1:32:45 PM] [semantic-release] › ℹ Start step "analyzeCommits" of plugin "[Function: semantic-release-monorepo]"
73
- [1:32:45 PM] [semantic-release] [[Function: semantic-release-monorepo]] › ℹ No more plugins
74
- [1:32:45 PM] [semantic-release] › ✔ Completed step "analyzeCommits" of plugin "[Function: semantic-release-monorepo]"
75
- [1:32:45 PM] [semantic-release] › ℹ The next release version is 1.1.0
76
- [1:32:45 PM] [semantic-release] › ℹ Start step "generateNotes" of plugin "[Function: semantic-release-monorepo]"
77
- [1:32:45 PM] [semantic-release] [[Function: semantic-release-monorepo]] › ℹ Plugin "@semantic-release/commit-analyzer" does not provide step "generateNotes"
78
- [1:32:45 PM] [semantic-release] › ✔ Completed step "generateNotes" of plugin "[Function: semantic-release-monorepo]"
79
- [1:32:45 PM] [semantic-release] › ℹ Start step "generateNotes" of plugin "[Function: semantic-release-monorepo]"
80
- [1:32:45 PM] [semantic-release] [[Function: semantic-release-monorepo]] › ℹ Start step "generateNotes" of plugin "@semantic-release/release-notes-generator"