@contractspec/example.learning-journey-registry 1.46.1 → 1.47.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/.turbo/turbo-build$colon$bundle.log +18 -18
- package/.turbo/turbo-build.log +18 -18
- package/CHANGELOG.md +51 -0
- package/dist/api.js.map +1 -1
- package/dist/example.d.ts +2 -2
- package/dist/example.d.ts.map +1 -1
- package/dist/example.js +4 -2
- package/dist/example.js.map +1 -1
- package/dist/learning-journey-registry.feature.d.ts +2 -2
- package/dist/learning-journey-registry.feature.d.ts.map +1 -1
- package/dist/learning-journey-registry.feature.js +9 -2
- package/dist/learning-journey-registry.feature.js.map +1 -1
- package/dist/presentations/index.d.ts +5 -5
- package/dist/presentations/index.d.ts.map +1 -1
- package/dist/presentations/index.js +7 -7
- package/dist/presentations/index.js.map +1 -1
- package/dist/tracks.js.map +1 -1
- package/dist/ui/LearningMiniApp.js.map +1 -1
- package/package.json +17 -19
- package/src/example.ts +3 -3
- package/src/learning-journey-registry.feature.ts +3 -3
- package/src/presentations/index.ts +7 -11
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
$ tsdown
|
|
2
|
-
[34mℹ[39m tsdown [2mv0.
|
|
2
|
+
[34mℹ[39m tsdown [2mv0.19.0[22m powered by rolldown [2mv1.0.0-beta.59[22m
|
|
3
3
|
[34mℹ[39m config file: [4m/home/runner/work/contractspec/contractspec/packages/examples/learning-journey-registry/tsdown.config.js[24m
|
|
4
4
|
[34mℹ[39m entry: [34msrc/api-types.ts, src/api.ts, src/example.ts, src/index.ts, src/learning-journey-registry.feature.ts, src/progress-store.ts, src/tracks.ts, src/docs/index.ts, src/docs/learning-journey-registry.docblock.ts, src/presentations/index.ts, src/ui/LearningMiniApp.tsx, src/ui/index.ts[39m
|
|
5
5
|
[34mℹ[39m target: [34mesnext[39m
|
|
@@ -8,43 +8,43 @@ $ tsdown
|
|
|
8
8
|
[34mℹ[39m Cleaning 43 files
|
|
9
9
|
[34mℹ[39m [2mdist/[22m[1mapi.js[22m [2m 6.79 kB[22m [2m│ gzip: 1.96 kB[22m
|
|
10
10
|
[34mℹ[39m [2mdist/[22m[1mui/LearningMiniApp.js[22m [2m 2.93 kB[22m [2m│ gzip: 0.99 kB[22m
|
|
11
|
+
[34mℹ[39m [2mdist/[22m[1mpresentations/index.js[22m [2m 1.81 kB[22m [2m│ gzip: 0.61 kB[22m
|
|
11
12
|
[34mℹ[39m [2mdist/[22m[1mtracks.js[22m [2m 1.81 kB[22m [2m│ gzip: 0.60 kB[22m
|
|
12
|
-
[34mℹ[39m [2mdist/[22m[
|
|
13
|
-
[34mℹ[39m [2mdist/[22m[1mlearning-journey-registry.feature.js[22m [2m 1.41 kB[22m [2m│ gzip: 0.51 kB[22m
|
|
13
|
+
[34mℹ[39m [2mdist/[22m[1mlearning-journey-registry.feature.js[22m [2m 1.62 kB[22m [2m│ gzip: 0.57 kB[22m
|
|
14
14
|
[34mℹ[39m [2mdist/[22m[1mdocs/learning-journey-registry.docblock.js[22m [2m 1.36 kB[22m [2m│ gzip: 0.70 kB[22m
|
|
15
15
|
[34mℹ[39m [2mdist/[22m[1mindex.js[22m [2m 1.14 kB[22m [2m│ gzip: 0.34 kB[22m
|
|
16
|
-
[34mℹ[39m [2mdist/[22m[1mexample.js[22m [2m 0.
|
|
16
|
+
[34mℹ[39m [2mdist/[22m[1mexample.js[22m [2m 0.95 kB[22m [2m│ gzip: 0.50 kB[22m
|
|
17
17
|
[34mℹ[39m [2mdist/[22m[1mprogress-store.js[22m [2m 0.84 kB[22m [2m│ gzip: 0.42 kB[22m
|
|
18
18
|
[34mℹ[39m [2mdist/[22m[1mui/index.js[22m [2m 0.17 kB[22m [2m│ gzip: 0.09 kB[22m
|
|
19
19
|
[34mℹ[39m [2mdist/[22m[1mdocs/index.js[22m [2m 0.05 kB[22m [2m│ gzip: 0.07 kB[22m
|
|
20
20
|
[34mℹ[39m [2mdist/[22m[1mapi-types.js[22m [2m 0.00 kB[22m [2m│ gzip: 0.02 kB[22m
|
|
21
|
-
[34mℹ[39m [2mdist/[22mapi.js.map [2m13.
|
|
22
|
-
[34mℹ[39m [2mdist/[22mui/LearningMiniApp.js.map [2m
|
|
23
|
-
[34mℹ[39m [2mdist/[22mtracks.js.map [2m 3.
|
|
24
|
-
[34mℹ[39m [2mdist/[22mpresentations/index.js.map [2m 2.
|
|
25
|
-
[34mℹ[39m [2mdist/[22mlearning-journey-registry.feature.js.map [2m 2.
|
|
21
|
+
[34mℹ[39m [2mdist/[22mapi.js.map [2m13.12 kB[22m [2m│ gzip: 3.83 kB[22m
|
|
22
|
+
[34mℹ[39m [2mdist/[22mui/LearningMiniApp.js.map [2m 4.91 kB[22m [2m│ gzip: 1.57 kB[22m
|
|
23
|
+
[34mℹ[39m [2mdist/[22mtracks.js.map [2m 3.58 kB[22m [2m│ gzip: 1.07 kB[22m
|
|
24
|
+
[34mℹ[39m [2mdist/[22mpresentations/index.js.map [2m 2.68 kB[22m [2m│ gzip: 0.90 kB[22m
|
|
25
|
+
[34mℹ[39m [2mdist/[22mlearning-journey-registry.feature.js.map [2m 2.58 kB[22m [2m│ gzip: 0.96 kB[22m
|
|
26
26
|
[34mℹ[39m [2mdist/[22mdocs/learning-journey-registry.docblock.js.map [2m 1.77 kB[22m [2m│ gzip: 0.86 kB[22m
|
|
27
27
|
[34mℹ[39m [2mdist/[22mprogress-store.js.map [2m 1.67 kB[22m [2m│ gzip: 0.76 kB[22m
|
|
28
|
-
[34mℹ[39m [2mdist/[22mexample.js.map [2m 1.
|
|
28
|
+
[34mℹ[39m [2mdist/[22mexample.js.map [2m 1.39 kB[22m [2m│ gzip: 0.69 kB[22m
|
|
29
29
|
[34mℹ[39m [2mdist/[22mapi-types.d.ts.map [2m 0.65 kB[22m [2m│ gzip: 0.34 kB[22m
|
|
30
30
|
[34mℹ[39m [2mdist/[22mtracks.d.ts.map [2m 0.58 kB[22m [2m│ gzip: 0.30 kB[22m
|
|
31
31
|
[34mℹ[39m [2mdist/[22mui/LearningMiniApp.d.ts.map [2m 0.49 kB[22m [2m│ gzip: 0.29 kB[22m
|
|
32
32
|
[34mℹ[39m [2mdist/[22mprogress-store.d.ts.map [2m 0.34 kB[22m [2m│ gzip: 0.23 kB[22m
|
|
33
33
|
[34mℹ[39m [2mdist/[22mapi.d.ts.map [2m 0.26 kB[22m [2m│ gzip: 0.19 kB[22m
|
|
34
|
-
[34mℹ[39m [2mdist/[22mpresentations/index.d.ts.map [2m 0.
|
|
35
|
-
[34mℹ[39m [2mdist/[22mlearning-journey-registry.feature.d.ts.map [2m 0.
|
|
36
|
-
[34mℹ[39m [2mdist/[22mexample.d.ts.map [2m 0.
|
|
34
|
+
[34mℹ[39m [2mdist/[22mpresentations/index.d.ts.map [2m 0.25 kB[22m [2m│ gzip: 0.19 kB[22m
|
|
35
|
+
[34mℹ[39m [2mdist/[22mlearning-journey-registry.feature.d.ts.map [2m 0.20 kB[22m [2m│ gzip: 0.15 kB[22m
|
|
36
|
+
[34mℹ[39m [2mdist/[22mexample.d.ts.map [2m 0.14 kB[22m [2m│ gzip: 0.13 kB[22m
|
|
37
37
|
[34mℹ[39m [2mdist/[22m[32m[1mtracks.d.ts[22m[39m [2m 1.76 kB[22m [2m│ gzip: 0.57 kB[22m
|
|
38
38
|
[34mℹ[39m [2mdist/[22m[32m[1mui/LearningMiniApp.d.ts[22m[39m [2m 1.21 kB[22m [2m│ gzip: 0.53 kB[22m
|
|
39
39
|
[34mℹ[39m [2mdist/[22m[32m[1mindex.d.ts[22m[39m [2m 1.17 kB[22m [2m│ gzip: 0.34 kB[22m
|
|
40
40
|
[34mℹ[39m [2mdist/[22m[32m[1mapi-types.d.ts[22m[39m [2m 1.08 kB[22m [2m│ gzip: 0.48 kB[22m
|
|
41
|
+
[34mℹ[39m [2mdist/[22m[32m[1mpresentations/index.d.ts[22m[39m [2m 0.69 kB[22m [2m│ gzip: 0.24 kB[22m
|
|
41
42
|
[34mℹ[39m [2mdist/[22m[32m[1mprogress-store.d.ts[22m[39m [2m 0.69 kB[22m [2m│ gzip: 0.31 kB[22m
|
|
42
|
-
[34mℹ[39m [2mdist/[22m[32m[1mpresentations/index.d.ts[22m[39m [2m 0.56 kB[22m [2m│ gzip: 0.23 kB[22m
|
|
43
43
|
[34mℹ[39m [2mdist/[22m[32m[1mapi.d.ts[22m[39m [2m 0.56 kB[22m [2m│ gzip: 0.30 kB[22m
|
|
44
|
-
[34mℹ[39m [2mdist/[22m[32m[1mlearning-journey-registry.feature.d.ts[22m[39m [2m 0.
|
|
45
|
-
[34mℹ[39m [2mdist/[22m[32m[1mexample.d.ts[22m[39m [2m 0.
|
|
44
|
+
[34mℹ[39m [2mdist/[22m[32m[1mlearning-journey-registry.feature.d.ts[22m[39m [2m 0.47 kB[22m [2m│ gzip: 0.26 kB[22m
|
|
45
|
+
[34mℹ[39m [2mdist/[22m[32m[1mexample.d.ts[22m[39m [2m 0.25 kB[22m [2m│ gzip: 0.17 kB[22m
|
|
46
46
|
[34mℹ[39m [2mdist/[22m[32m[1mui/index.d.ts[22m[39m [2m 0.17 kB[22m [2m│ gzip: 0.09 kB[22m
|
|
47
47
|
[34mℹ[39m [2mdist/[22m[32m[1mdocs/index.d.ts[22m[39m [2m 0.01 kB[22m [2m│ gzip: 0.03 kB[22m
|
|
48
48
|
[34mℹ[39m [2mdist/[22m[32m[1mdocs/learning-journey-registry.docblock.d.ts[22m[39m [2m 0.01 kB[22m [2m│ gzip: 0.03 kB[22m
|
|
49
|
-
[34mℹ[39m 40 files, total: 62.
|
|
50
|
-
[32m✔[39m Build complete in [
|
|
49
|
+
[34mℹ[39m 40 files, total: 62.15 kB
|
|
50
|
+
[32m✔[39m Build complete in [32m3172ms[39m
|
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
$ bun build:types && bun build:bundle
|
|
2
2
|
$ tsc --noEmit
|
|
3
3
|
$ tsdown
|
|
4
|
-
[34mℹ[39m tsdown [2mv0.
|
|
4
|
+
[34mℹ[39m tsdown [2mv0.19.0[22m powered by rolldown [2mv1.0.0-beta.59[22m
|
|
5
5
|
[34mℹ[39m config file: [4m/home/runner/work/contractspec/contractspec/packages/examples/learning-journey-registry/tsdown.config.js[24m
|
|
6
6
|
[34mℹ[39m entry: [34msrc/api-types.ts, src/api.ts, src/example.ts, src/index.ts, src/learning-journey-registry.feature.ts, src/progress-store.ts, src/tracks.ts, src/docs/index.ts, src/docs/learning-journey-registry.docblock.ts, src/presentations/index.ts, src/ui/LearningMiniApp.tsx, src/ui/index.ts[39m
|
|
7
7
|
[34mℹ[39m target: [34mesnext[39m
|
|
@@ -9,43 +9,43 @@ $ tsdown
|
|
|
9
9
|
[34mℹ[39m Build start
|
|
10
10
|
[34mℹ[39m [2mdist/[22m[1mapi.js[22m [2m 6.79 kB[22m [2m│ gzip: 1.96 kB[22m
|
|
11
11
|
[34mℹ[39m [2mdist/[22m[1mui/LearningMiniApp.js[22m [2m 2.93 kB[22m [2m│ gzip: 0.99 kB[22m
|
|
12
|
+
[34mℹ[39m [2mdist/[22m[1mpresentations/index.js[22m [2m 1.81 kB[22m [2m│ gzip: 0.61 kB[22m
|
|
12
13
|
[34mℹ[39m [2mdist/[22m[1mtracks.js[22m [2m 1.81 kB[22m [2m│ gzip: 0.60 kB[22m
|
|
13
|
-
[34mℹ[39m [2mdist/[22m[
|
|
14
|
-
[34mℹ[39m [2mdist/[22m[1mlearning-journey-registry.feature.js[22m [2m 1.41 kB[22m [2m│ gzip: 0.51 kB[22m
|
|
14
|
+
[34mℹ[39m [2mdist/[22m[1mlearning-journey-registry.feature.js[22m [2m 1.62 kB[22m [2m│ gzip: 0.57 kB[22m
|
|
15
15
|
[34mℹ[39m [2mdist/[22m[1mdocs/learning-journey-registry.docblock.js[22m [2m 1.36 kB[22m [2m│ gzip: 0.70 kB[22m
|
|
16
16
|
[34mℹ[39m [2mdist/[22m[1mindex.js[22m [2m 1.14 kB[22m [2m│ gzip: 0.34 kB[22m
|
|
17
|
-
[34mℹ[39m [2mdist/[22m[1mexample.js[22m [2m 0.
|
|
17
|
+
[34mℹ[39m [2mdist/[22m[1mexample.js[22m [2m 0.95 kB[22m [2m│ gzip: 0.50 kB[22m
|
|
18
18
|
[34mℹ[39m [2mdist/[22m[1mprogress-store.js[22m [2m 0.84 kB[22m [2m│ gzip: 0.42 kB[22m
|
|
19
19
|
[34mℹ[39m [2mdist/[22m[1mui/index.js[22m [2m 0.17 kB[22m [2m│ gzip: 0.09 kB[22m
|
|
20
20
|
[34mℹ[39m [2mdist/[22m[1mdocs/index.js[22m [2m 0.05 kB[22m [2m│ gzip: 0.07 kB[22m
|
|
21
21
|
[34mℹ[39m [2mdist/[22m[1mapi-types.js[22m [2m 0.00 kB[22m [2m│ gzip: 0.02 kB[22m
|
|
22
|
-
[34mℹ[39m [2mdist/[22mapi.js.map [2m13.
|
|
23
|
-
[34mℹ[39m [2mdist/[22mui/LearningMiniApp.js.map [2m
|
|
24
|
-
[34mℹ[39m [2mdist/[22mtracks.js.map [2m 3.
|
|
25
|
-
[34mℹ[39m [2mdist/[22mpresentations/index.js.map [2m 2.
|
|
26
|
-
[34mℹ[39m [2mdist/[22mlearning-journey-registry.feature.js.map [2m 2.
|
|
22
|
+
[34mℹ[39m [2mdist/[22mapi.js.map [2m13.12 kB[22m [2m│ gzip: 3.83 kB[22m
|
|
23
|
+
[34mℹ[39m [2mdist/[22mui/LearningMiniApp.js.map [2m 4.91 kB[22m [2m│ gzip: 1.57 kB[22m
|
|
24
|
+
[34mℹ[39m [2mdist/[22mtracks.js.map [2m 3.58 kB[22m [2m│ gzip: 1.07 kB[22m
|
|
25
|
+
[34mℹ[39m [2mdist/[22mpresentations/index.js.map [2m 2.68 kB[22m [2m│ gzip: 0.90 kB[22m
|
|
26
|
+
[34mℹ[39m [2mdist/[22mlearning-journey-registry.feature.js.map [2m 2.58 kB[22m [2m│ gzip: 0.96 kB[22m
|
|
27
27
|
[34mℹ[39m [2mdist/[22mdocs/learning-journey-registry.docblock.js.map [2m 1.77 kB[22m [2m│ gzip: 0.86 kB[22m
|
|
28
28
|
[34mℹ[39m [2mdist/[22mprogress-store.js.map [2m 1.67 kB[22m [2m│ gzip: 0.76 kB[22m
|
|
29
|
-
[34mℹ[39m [2mdist/[22mexample.js.map [2m 1.
|
|
29
|
+
[34mℹ[39m [2mdist/[22mexample.js.map [2m 1.39 kB[22m [2m│ gzip: 0.69 kB[22m
|
|
30
30
|
[34mℹ[39m [2mdist/[22mapi-types.d.ts.map [2m 0.65 kB[22m [2m│ gzip: 0.34 kB[22m
|
|
31
31
|
[34mℹ[39m [2mdist/[22mtracks.d.ts.map [2m 0.58 kB[22m [2m│ gzip: 0.30 kB[22m
|
|
32
32
|
[34mℹ[39m [2mdist/[22mui/LearningMiniApp.d.ts.map [2m 0.49 kB[22m [2m│ gzip: 0.29 kB[22m
|
|
33
33
|
[34mℹ[39m [2mdist/[22mprogress-store.d.ts.map [2m 0.34 kB[22m [2m│ gzip: 0.23 kB[22m
|
|
34
34
|
[34mℹ[39m [2mdist/[22mapi.d.ts.map [2m 0.26 kB[22m [2m│ gzip: 0.19 kB[22m
|
|
35
|
-
[34mℹ[39m [2mdist/[22mpresentations/index.d.ts.map [2m 0.
|
|
36
|
-
[34mℹ[39m [2mdist/[22mlearning-journey-registry.feature.d.ts.map [2m 0.
|
|
37
|
-
[34mℹ[39m [2mdist/[22mexample.d.ts.map [2m 0.
|
|
35
|
+
[34mℹ[39m [2mdist/[22mpresentations/index.d.ts.map [2m 0.25 kB[22m [2m│ gzip: 0.19 kB[22m
|
|
36
|
+
[34mℹ[39m [2mdist/[22mlearning-journey-registry.feature.d.ts.map [2m 0.20 kB[22m [2m│ gzip: 0.15 kB[22m
|
|
37
|
+
[34mℹ[39m [2mdist/[22mexample.d.ts.map [2m 0.14 kB[22m [2m│ gzip: 0.13 kB[22m
|
|
38
38
|
[34mℹ[39m [2mdist/[22m[32m[1mtracks.d.ts[22m[39m [2m 1.76 kB[22m [2m│ gzip: 0.57 kB[22m
|
|
39
39
|
[34mℹ[39m [2mdist/[22m[32m[1mui/LearningMiniApp.d.ts[22m[39m [2m 1.21 kB[22m [2m│ gzip: 0.53 kB[22m
|
|
40
40
|
[34mℹ[39m [2mdist/[22m[32m[1mindex.d.ts[22m[39m [2m 1.17 kB[22m [2m│ gzip: 0.34 kB[22m
|
|
41
41
|
[34mℹ[39m [2mdist/[22m[32m[1mapi-types.d.ts[22m[39m [2m 1.08 kB[22m [2m│ gzip: 0.48 kB[22m
|
|
42
|
+
[34mℹ[39m [2mdist/[22m[32m[1mpresentations/index.d.ts[22m[39m [2m 0.69 kB[22m [2m│ gzip: 0.24 kB[22m
|
|
42
43
|
[34mℹ[39m [2mdist/[22m[32m[1mprogress-store.d.ts[22m[39m [2m 0.69 kB[22m [2m│ gzip: 0.31 kB[22m
|
|
43
|
-
[34mℹ[39m [2mdist/[22m[32m[1mpresentations/index.d.ts[22m[39m [2m 0.56 kB[22m [2m│ gzip: 0.23 kB[22m
|
|
44
44
|
[34mℹ[39m [2mdist/[22m[32m[1mapi.d.ts[22m[39m [2m 0.56 kB[22m [2m│ gzip: 0.30 kB[22m
|
|
45
|
-
[34mℹ[39m [2mdist/[22m[32m[1mlearning-journey-registry.feature.d.ts[22m[39m [2m 0.
|
|
46
|
-
[34mℹ[39m [2mdist/[22m[32m[1mexample.d.ts[22m[39m [2m 0.
|
|
45
|
+
[34mℹ[39m [2mdist/[22m[32m[1mlearning-journey-registry.feature.d.ts[22m[39m [2m 0.47 kB[22m [2m│ gzip: 0.25 kB[22m
|
|
46
|
+
[34mℹ[39m [2mdist/[22m[32m[1mexample.d.ts[22m[39m [2m 0.25 kB[22m [2m│ gzip: 0.17 kB[22m
|
|
47
47
|
[34mℹ[39m [2mdist/[22m[32m[1mui/index.d.ts[22m[39m [2m 0.17 kB[22m [2m│ gzip: 0.09 kB[22m
|
|
48
48
|
[34mℹ[39m [2mdist/[22m[32m[1mdocs/index.d.ts[22m[39m [2m 0.01 kB[22m [2m│ gzip: 0.03 kB[22m
|
|
49
49
|
[34mℹ[39m [2mdist/[22m[32m[1mdocs/learning-journey-registry.docblock.d.ts[22m[39m [2m 0.01 kB[22m [2m│ gzip: 0.03 kB[22m
|
|
50
|
-
[34mℹ[39m 40 files, total: 62.
|
|
51
|
-
[32m✔[39m Build complete in [
|
|
50
|
+
[34mℹ[39m 40 files, total: 62.15 kB
|
|
51
|
+
[32m✔[39m Build complete in [32m3258ms[39m
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,56 @@
|
|
|
1
1
|
# @contractspec/example.learning-journey-registry
|
|
2
2
|
|
|
3
|
+
## 1.47.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- caf8701: feat: add cli vibe command to run workflow
|
|
8
|
+
- c69b849: feat: add api web services (mcp & website)
|
|
9
|
+
- 42b8d78: feat: add cli `contractspec vibe` workflow to simplify usage
|
|
10
|
+
- fd38e85: feat: auto-fix contractspec issues
|
|
11
|
+
|
|
12
|
+
### Patch Changes
|
|
13
|
+
|
|
14
|
+
- e7ded36: feat: improve stability (adding ts-morph)
|
|
15
|
+
- c231a8b: test: improve workspace stability
|
|
16
|
+
- Updated dependencies [e7ded36]
|
|
17
|
+
- Updated dependencies [caf8701]
|
|
18
|
+
- Updated dependencies [c69b849]
|
|
19
|
+
- Updated dependencies [c231a8b]
|
|
20
|
+
- Updated dependencies [42b8d78]
|
|
21
|
+
- Updated dependencies [fd38e85]
|
|
22
|
+
- @contractspec/example.learning-journey-studio-onboarding@1.47.0
|
|
23
|
+
- @contractspec/example.learning-journey-quest-challenges@1.47.0
|
|
24
|
+
- @contractspec/example.learning-journey-crm-onboarding@1.47.0
|
|
25
|
+
- @contractspec/example.learning-journey-ambient-coach@1.47.0
|
|
26
|
+
- @contractspec/example.learning-journey-platform-tour@1.47.0
|
|
27
|
+
- @contractspec/example.learning-journey-ui-onboarding@1.47.0
|
|
28
|
+
- @contractspec/example.learning-journey-ui-coaching@1.47.0
|
|
29
|
+
- @contractspec/example.learning-journey-ui-gamified@1.47.0
|
|
30
|
+
- @contractspec/example.learning-journey-duo-drills@1.47.0
|
|
31
|
+
- @contractspec/example.learning-journey-ui-shared@1.47.0
|
|
32
|
+
- @contractspec/module.learning-journey@1.47.0
|
|
33
|
+
- @contractspec/lib.contracts@1.47.0
|
|
34
|
+
|
|
35
|
+
## 1.46.2
|
|
36
|
+
|
|
37
|
+
### Patch Changes
|
|
38
|
+
|
|
39
|
+
- 7e21625: feat: library services (landing page & api)
|
|
40
|
+
- Updated dependencies [7e21625]
|
|
41
|
+
- @contractspec/example.learning-journey-studio-onboarding@1.46.2
|
|
42
|
+
- @contractspec/example.learning-journey-quest-challenges@1.46.2
|
|
43
|
+
- @contractspec/example.learning-journey-crm-onboarding@1.46.2
|
|
44
|
+
- @contractspec/example.learning-journey-ambient-coach@1.46.2
|
|
45
|
+
- @contractspec/example.learning-journey-platform-tour@1.46.2
|
|
46
|
+
- @contractspec/example.learning-journey-ui-onboarding@1.46.2
|
|
47
|
+
- @contractspec/example.learning-journey-ui-coaching@1.46.2
|
|
48
|
+
- @contractspec/example.learning-journey-ui-gamified@1.46.2
|
|
49
|
+
- @contractspec/example.learning-journey-duo-drills@1.46.2
|
|
50
|
+
- @contractspec/example.learning-journey-ui-shared@1.46.2
|
|
51
|
+
- @contractspec/module.learning-journey@1.46.2
|
|
52
|
+
- @contractspec/lib.contracts@1.46.2
|
|
53
|
+
|
|
3
54
|
## 1.46.1
|
|
4
55
|
|
|
5
56
|
### Patch Changes
|
package/dist/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","names":["updated: TrackProgress[]","steps: StepProgress[]","progress: TrackProgress"],"sources":["../src/api.ts"],"sourcesContent":["import { learningJourneyTracks } from './tracks';\nimport type {\n LearningJourneyTrackSpec,\n StepAvailabilitySpec,\n StepCompletionConditionSpec,\n} from '@contractspec/module.learning-journey/track-spec';\nimport type { LearningEvent, StepProgress, TrackProgress } from './api-types';\nimport {\n getLearnerTracks,\n getTrackResolver,\n initProgress,\n} from './progress-store';\n\nconst getTrack = getTrackResolver(learningJourneyTracks);\n\nconst matchesFilter = (\n filter: Record<string, unknown> | undefined,\n payload: Record<string, unknown> | undefined\n): boolean => {\n if (!filter) return true;\n if (!payload) return false;\n return Object.entries(filter).every(([key, value]) => payload[key] === value);\n};\n\nconst matchesBaseEvent = (\n condition: {\n eventName: string;\n eventVersion?: number;\n sourceModule?: string;\n payloadFilter?: Record<string, unknown>;\n },\n event: LearningEvent\n): boolean => {\n if (condition.eventName !== event.name) return false;\n if (condition.eventVersion !== undefined && event.version !== undefined) {\n if (condition.eventVersion !== event.version) return false;\n }\n if (\n condition.sourceModule &&\n event.sourceModule &&\n condition.sourceModule !== event.sourceModule\n ) {\n return false;\n }\n return matchesFilter(\n condition.payloadFilter,\n event.payload as Record<string, unknown> | undefined\n );\n};\n\nconst matchesCondition = (\n condition: StepCompletionConditionSpec,\n event: LearningEvent,\n step: StepProgress,\n trackStartedAt: Date | undefined\n): {\n matched: boolean;\n occurrences?: number;\n masteryCount?: number;\n} => {\n if (condition.kind === 'count') {\n if (!matchesBaseEvent(condition, event)) return { matched: false };\n const occurrences = (step.occurrences ?? 0) + 1;\n const within =\n condition.withinHours === undefined ||\n Boolean(\n trackStartedAt &&\n event.occurredAt &&\n (event.occurredAt.getTime() - trackStartedAt.getTime()) /\n (1000 * 60 * 60) <=\n condition.withinHours\n );\n return { matched: within && occurrences >= condition.atLeast, occurrences };\n }\n\n if (condition.kind === 'time_window') {\n if (!matchesBaseEvent(condition, event)) return { matched: false };\n if (\n condition.withinHoursOfStart !== undefined &&\n trackStartedAt &&\n event.occurredAt\n ) {\n const hoursSinceStart =\n (event.occurredAt.getTime() - trackStartedAt.getTime()) /\n (1000 * 60 * 60);\n if (hoursSinceStart > condition.withinHoursOfStart) {\n return { matched: false };\n }\n }\n return { matched: true };\n }\n\n if (condition.kind === 'srs_mastery') {\n if (event.name !== condition.eventName) return { matched: false };\n const payload = event.payload as Record<string, unknown> | undefined;\n if (!matchesFilter(condition.payloadFilter, payload)) {\n return { matched: false };\n }\n const skillKey = condition.skillIdField ?? 'skillId';\n const masteryKey = condition.masteryField ?? 'mastery';\n const skillId = payload?.[skillKey];\n const masteryValue = payload?.[masteryKey];\n if (skillId === undefined || masteryValue === undefined) {\n return { matched: false };\n }\n if (typeof masteryValue !== 'number') return { matched: false };\n if (masteryValue < condition.minimumMastery) return { matched: false };\n const masteryCount = (step.masteryCount ?? 0) + 1;\n const required = condition.requiredCount ?? 1;\n return { matched: masteryCount >= required, masteryCount };\n }\n\n return { matched: matchesBaseEvent(condition, event) };\n};\n\nconst getAvailability = (\n availability: StepAvailabilitySpec | undefined,\n startedAt: Date | undefined\n): { availableAt?: Date; dueAt?: Date } => {\n if (!availability || !startedAt) return {};\n\n const baseTime = startedAt.getTime();\n let unlockTime = baseTime;\n\n if (availability.unlockOnDay !== undefined) {\n unlockTime =\n baseTime + (availability.unlockOnDay - 1) * 24 * 60 * 60 * 1000;\n }\n\n if (availability.unlockAfterHours !== undefined) {\n unlockTime = baseTime + availability.unlockAfterHours * 60 * 60 * 1000;\n }\n\n const availableAt = new Date(unlockTime);\n const dueAt =\n availability.dueWithinHours !== undefined\n ? new Date(\n availableAt.getTime() + availability.dueWithinHours * 60 * 60 * 1000\n )\n : undefined;\n\n return { availableAt, dueAt };\n};\n\nconst computeProgressPercent = (steps: StepProgress[]): number => {\n const total = steps.length || 1;\n const done = steps.filter((s) => s.status === 'COMPLETED').length;\n return Math.round((done / total) * 100);\n};\n\nconst applyTrackCompletionBonuses = (\n track: LearningJourneyTrackSpec,\n progress: TrackProgress\n) => {\n if (progress.isCompleted) return progress;\n\n const completedAt = new Date();\n const startedAt = progress.startedAt ?? completedAt;\n const hoursElapsed =\n (completedAt.getTime() - startedAt.getTime()) / (1000 * 60 * 60);\n\n let xpEarned = progress.xpEarned;\n const { completionRewards, streakRule } = track;\n\n if (completionRewards?.xpBonus) {\n xpEarned += completionRewards.xpBonus;\n }\n\n if (\n streakRule?.hoursWindow !== undefined &&\n hoursElapsed <= streakRule.hoursWindow &&\n streakRule.bonusXp\n ) {\n xpEarned += streakRule.bonusXp;\n }\n\n return {\n ...progress,\n xpEarned,\n isCompleted: true,\n completedAt,\n lastActivityAt: completedAt,\n };\n};\n\nexport const listTracks = (learnerId?: string) => {\n const progressMap = learnerId ? getLearnerTracks(learnerId) : undefined;\n const progress =\n learnerId && progressMap\n ? Array.from(progressMap.values())\n : ([] as TrackProgress[]);\n\n return {\n tracks: learningJourneyTracks,\n progress,\n };\n};\n\nexport const getProgress = (trackId: string, learnerId: string) => {\n const track = getTrack(trackId);\n if (!track) return undefined;\n\n const map = getLearnerTracks(learnerId);\n const existing = map.get(trackId) ?? initProgress(learnerId, track);\n map.set(trackId, existing);\n return existing;\n};\n\nexport const recordEvent = (event: LearningEvent) => {\n const targets =\n event.trackId !== undefined\n ? learningJourneyTracks.filter((t) => t.id === event.trackId)\n : learningJourneyTracks;\n\n const updated: TrackProgress[] = [];\n const eventTime = event.occurredAt ?? new Date();\n\n for (const track of targets) {\n const map = getLearnerTracks(event.learnerId);\n const current = map.get(track.id) ?? initProgress(event.learnerId, track);\n const startedAt = current.startedAt ?? eventTime;\n\n let changed = current.startedAt === undefined;\n const steps: StepProgress[] = current.steps.map((step) => {\n if (step.status === 'COMPLETED') return step;\n\n const spec = track.steps.find((s) => s.id === step.id);\n if (!spec) return step;\n\n const { availableAt, dueAt } = getAvailability(\n spec.availability,\n startedAt\n );\n if (availableAt && eventTime < availableAt) {\n return { ...step, availableAt, dueAt };\n }\n if (dueAt && eventTime > dueAt) {\n // keep pending but note deadlines\n return { ...step, availableAt, dueAt };\n }\n\n const result = matchesCondition(spec.completion, event, step, startedAt);\n\n if (result.matched) {\n changed = true;\n return {\n ...step,\n status: 'COMPLETED',\n xpEarned: spec.xpReward ?? 0,\n completedAt: eventTime,\n triggeringEvent: event.name,\n eventPayload: event.payload,\n occurrences: result.occurrences ?? step.occurrences,\n masteryCount: result.masteryCount ?? step.masteryCount,\n availableAt,\n dueAt,\n };\n }\n\n if (\n result.occurrences !== undefined ||\n result.masteryCount !== undefined\n ) {\n changed = true;\n }\n\n return {\n ...step,\n occurrences: result.occurrences ?? step.occurrences,\n masteryCount: result.masteryCount ?? step.masteryCount,\n availableAt,\n dueAt,\n };\n });\n\n if (!changed) {\n continue;\n }\n\n const xpEarned =\n steps.reduce((sum, s) => sum + s.xpEarned, 0) + (track.totalXp ?? 0);\n let progress: TrackProgress = {\n ...current,\n steps,\n xpEarned,\n startedAt,\n lastActivityAt: eventTime,\n progress: computeProgressPercent(steps),\n };\n\n const allDone = steps.every((s) => s.status === 'COMPLETED');\n if (allDone) {\n progress = applyTrackCompletionBonuses(track, progress);\n }\n\n map.set(track.id, progress);\n updated.push(progress);\n }\n\n return updated;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"api.js","names":[],"sources":["../src/api.ts"],"sourcesContent":["import { learningJourneyTracks } from './tracks';\nimport type {\n LearningJourneyTrackSpec,\n StepAvailabilitySpec,\n StepCompletionConditionSpec,\n} from '@contractspec/module.learning-journey/track-spec';\nimport type { LearningEvent, StepProgress, TrackProgress } from './api-types';\nimport {\n getLearnerTracks,\n getTrackResolver,\n initProgress,\n} from './progress-store';\n\nconst getTrack = getTrackResolver(learningJourneyTracks);\n\nconst matchesFilter = (\n filter: Record<string, unknown> | undefined,\n payload: Record<string, unknown> | undefined\n): boolean => {\n if (!filter) return true;\n if (!payload) return false;\n return Object.entries(filter).every(([key, value]) => payload[key] === value);\n};\n\nconst matchesBaseEvent = (\n condition: {\n eventName: string;\n eventVersion?: number;\n sourceModule?: string;\n payloadFilter?: Record<string, unknown>;\n },\n event: LearningEvent\n): boolean => {\n if (condition.eventName !== event.name) return false;\n if (condition.eventVersion !== undefined && event.version !== undefined) {\n if (condition.eventVersion !== event.version) return false;\n }\n if (\n condition.sourceModule &&\n event.sourceModule &&\n condition.sourceModule !== event.sourceModule\n ) {\n return false;\n }\n return matchesFilter(\n condition.payloadFilter,\n event.payload as Record<string, unknown> | undefined\n );\n};\n\nconst matchesCondition = (\n condition: StepCompletionConditionSpec,\n event: LearningEvent,\n step: StepProgress,\n trackStartedAt: Date | undefined\n): {\n matched: boolean;\n occurrences?: number;\n masteryCount?: number;\n} => {\n if (condition.kind === 'count') {\n if (!matchesBaseEvent(condition, event)) return { matched: false };\n const occurrences = (step.occurrences ?? 0) + 1;\n const within =\n condition.withinHours === undefined ||\n Boolean(\n trackStartedAt &&\n event.occurredAt &&\n (event.occurredAt.getTime() - trackStartedAt.getTime()) /\n (1000 * 60 * 60) <=\n condition.withinHours\n );\n return { matched: within && occurrences >= condition.atLeast, occurrences };\n }\n\n if (condition.kind === 'time_window') {\n if (!matchesBaseEvent(condition, event)) return { matched: false };\n if (\n condition.withinHoursOfStart !== undefined &&\n trackStartedAt &&\n event.occurredAt\n ) {\n const hoursSinceStart =\n (event.occurredAt.getTime() - trackStartedAt.getTime()) /\n (1000 * 60 * 60);\n if (hoursSinceStart > condition.withinHoursOfStart) {\n return { matched: false };\n }\n }\n return { matched: true };\n }\n\n if (condition.kind === 'srs_mastery') {\n if (event.name !== condition.eventName) return { matched: false };\n const payload = event.payload as Record<string, unknown> | undefined;\n if (!matchesFilter(condition.payloadFilter, payload)) {\n return { matched: false };\n }\n const skillKey = condition.skillIdField ?? 'skillId';\n const masteryKey = condition.masteryField ?? 'mastery';\n const skillId = payload?.[skillKey];\n const masteryValue = payload?.[masteryKey];\n if (skillId === undefined || masteryValue === undefined) {\n return { matched: false };\n }\n if (typeof masteryValue !== 'number') return { matched: false };\n if (masteryValue < condition.minimumMastery) return { matched: false };\n const masteryCount = (step.masteryCount ?? 0) + 1;\n const required = condition.requiredCount ?? 1;\n return { matched: masteryCount >= required, masteryCount };\n }\n\n return { matched: matchesBaseEvent(condition, event) };\n};\n\nconst getAvailability = (\n availability: StepAvailabilitySpec | undefined,\n startedAt: Date | undefined\n): { availableAt?: Date; dueAt?: Date } => {\n if (!availability || !startedAt) return {};\n\n const baseTime = startedAt.getTime();\n let unlockTime = baseTime;\n\n if (availability.unlockOnDay !== undefined) {\n unlockTime =\n baseTime + (availability.unlockOnDay - 1) * 24 * 60 * 60 * 1000;\n }\n\n if (availability.unlockAfterHours !== undefined) {\n unlockTime = baseTime + availability.unlockAfterHours * 60 * 60 * 1000;\n }\n\n const availableAt = new Date(unlockTime);\n const dueAt =\n availability.dueWithinHours !== undefined\n ? new Date(\n availableAt.getTime() + availability.dueWithinHours * 60 * 60 * 1000\n )\n : undefined;\n\n return { availableAt, dueAt };\n};\n\nconst computeProgressPercent = (steps: StepProgress[]): number => {\n const total = steps.length || 1;\n const done = steps.filter((s) => s.status === 'COMPLETED').length;\n return Math.round((done / total) * 100);\n};\n\nconst applyTrackCompletionBonuses = (\n track: LearningJourneyTrackSpec,\n progress: TrackProgress\n) => {\n if (progress.isCompleted) return progress;\n\n const completedAt = new Date();\n const startedAt = progress.startedAt ?? completedAt;\n const hoursElapsed =\n (completedAt.getTime() - startedAt.getTime()) / (1000 * 60 * 60);\n\n let xpEarned = progress.xpEarned;\n const { completionRewards, streakRule } = track;\n\n if (completionRewards?.xpBonus) {\n xpEarned += completionRewards.xpBonus;\n }\n\n if (\n streakRule?.hoursWindow !== undefined &&\n hoursElapsed <= streakRule.hoursWindow &&\n streakRule.bonusXp\n ) {\n xpEarned += streakRule.bonusXp;\n }\n\n return {\n ...progress,\n xpEarned,\n isCompleted: true,\n completedAt,\n lastActivityAt: completedAt,\n };\n};\n\nexport const listTracks = (learnerId?: string) => {\n const progressMap = learnerId ? getLearnerTracks(learnerId) : undefined;\n const progress =\n learnerId && progressMap\n ? Array.from(progressMap.values())\n : ([] as TrackProgress[]);\n\n return {\n tracks: learningJourneyTracks,\n progress,\n };\n};\n\nexport const getProgress = (trackId: string, learnerId: string) => {\n const track = getTrack(trackId);\n if (!track) return undefined;\n\n const map = getLearnerTracks(learnerId);\n const existing = map.get(trackId) ?? initProgress(learnerId, track);\n map.set(trackId, existing);\n return existing;\n};\n\nexport const recordEvent = (event: LearningEvent) => {\n const targets =\n event.trackId !== undefined\n ? learningJourneyTracks.filter((t) => t.id === event.trackId)\n : learningJourneyTracks;\n\n const updated: TrackProgress[] = [];\n const eventTime = event.occurredAt ?? new Date();\n\n for (const track of targets) {\n const map = getLearnerTracks(event.learnerId);\n const current = map.get(track.id) ?? initProgress(event.learnerId, track);\n const startedAt = current.startedAt ?? eventTime;\n\n let changed = current.startedAt === undefined;\n const steps: StepProgress[] = current.steps.map((step) => {\n if (step.status === 'COMPLETED') return step;\n\n const spec = track.steps.find((s) => s.id === step.id);\n if (!spec) return step;\n\n const { availableAt, dueAt } = getAvailability(\n spec.availability,\n startedAt\n );\n if (availableAt && eventTime < availableAt) {\n return { ...step, availableAt, dueAt };\n }\n if (dueAt && eventTime > dueAt) {\n // keep pending but note deadlines\n return { ...step, availableAt, dueAt };\n }\n\n const result = matchesCondition(spec.completion, event, step, startedAt);\n\n if (result.matched) {\n changed = true;\n return {\n ...step,\n status: 'COMPLETED',\n xpEarned: spec.xpReward ?? 0,\n completedAt: eventTime,\n triggeringEvent: event.name,\n eventPayload: event.payload,\n occurrences: result.occurrences ?? step.occurrences,\n masteryCount: result.masteryCount ?? step.masteryCount,\n availableAt,\n dueAt,\n };\n }\n\n if (\n result.occurrences !== undefined ||\n result.masteryCount !== undefined\n ) {\n changed = true;\n }\n\n return {\n ...step,\n occurrences: result.occurrences ?? step.occurrences,\n masteryCount: result.masteryCount ?? step.masteryCount,\n availableAt,\n dueAt,\n };\n });\n\n if (!changed) {\n continue;\n }\n\n const xpEarned =\n steps.reduce((sum, s) => sum + s.xpEarned, 0) + (track.totalXp ?? 0);\n let progress: TrackProgress = {\n ...current,\n steps,\n xpEarned,\n startedAt,\n lastActivityAt: eventTime,\n progress: computeProgressPercent(steps),\n };\n\n const allDone = steps.every((s) => s.status === 'COMPLETED');\n if (allDone) {\n progress = applyTrackCompletionBonuses(track, progress);\n }\n\n map.set(track.id, progress);\n updated.push(progress);\n }\n\n return updated;\n};\n"],"mappings":"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"}
|
package/dist/example.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as _contractspec_lib_contracts0 from "@contractspec/lib.contracts";
|
|
2
2
|
|
|
3
3
|
//#region src/example.d.ts
|
|
4
|
-
declare const example: ExampleSpec;
|
|
4
|
+
declare const example: _contractspec_lib_contracts0.ExampleSpec;
|
|
5
5
|
//#endregion
|
|
6
6
|
export { example as default };
|
|
7
7
|
//# sourceMappingURL=example.d.ts.map
|
package/dist/example.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"example.d.ts","names":[],"sources":["../src/example.ts"],"sourcesContent":[],"mappings":";;;cAEM,
|
|
1
|
+
{"version":3,"file":"example.d.ts","names":[],"sources":["../src/example.ts"],"sourcesContent":[],"mappings":";;;cAEM,SA0BJ,4BAAA,CA1BW"}
|
package/dist/example.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import { defineExample } from "@contractspec/lib.contracts";
|
|
2
|
+
|
|
1
3
|
//#region src/example.ts
|
|
2
|
-
const example = {
|
|
4
|
+
const example = defineExample({
|
|
3
5
|
meta: {
|
|
4
6
|
key: "learning-journey-registry",
|
|
5
7
|
version: "1.0.0",
|
|
@@ -32,7 +34,7 @@ const example = {
|
|
|
32
34
|
},
|
|
33
35
|
mcp: { enabled: true }
|
|
34
36
|
}
|
|
35
|
-
};
|
|
37
|
+
});
|
|
36
38
|
var example_default = example;
|
|
37
39
|
|
|
38
40
|
//#endregion
|
package/dist/example.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"example.js","names":[
|
|
1
|
+
{"version":3,"file":"example.js","names":[],"sources":["../src/example.ts"],"sourcesContent":["import { defineExample } from '@contractspec/lib.contracts';\n\nconst example = defineExample({\n meta: {\n key: 'learning-journey-registry',\n version: '1.0.0',\n title: 'Learning Journey Registry',\n description:\n 'Registry of learning journey tracks + presentations + UI mini-app bindings.',\n kind: 'library',\n visibility: 'public',\n stability: 'experimental',\n owners: ['@platform.core'],\n tags: ['learning', 'journey', 'registry'],\n },\n docs: {\n rootDocId: 'docs.examples.learning-journey-registry',\n },\n entrypoints: {\n packageName: '@contractspec/example.learning-journey-registry',\n docs: './docs',\n },\n surfaces: {\n templates: true,\n sandbox: { enabled: true, modes: ['markdown', 'specs'] },\n studio: { enabled: true, installable: true },\n mcp: { enabled: true },\n },\n});\n\nexport default example;\n"],"mappings":";;;AAEA,MAAM,UAAU,cAAc;CAC5B,MAAM;EACJ,KAAK;EACL,SAAS;EACT,OAAO;EACP,aACE;EACF,MAAM;EACN,YAAY;EACZ,WAAW;EACX,QAAQ,CAAC,iBAAiB;EAC1B,MAAM;GAAC;GAAY;GAAW;GAAW;EAC1C;CACD,MAAM,EACJ,WAAW,2CACZ;CACD,aAAa;EACX,aAAa;EACb,MAAM;EACP;CACD,UAAU;EACR,WAAW;EACX,SAAS;GAAE,SAAS;GAAM,OAAO,CAAC,YAAY,QAAQ;GAAE;EACxD,QAAQ;GAAE,SAAS;GAAM,aAAa;GAAM;EAC5C,KAAK,EAAE,SAAS,MAAM;EACvB;CACF,CAAC;AAEF,sBAAe"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as _contractspec_lib_contracts4 from "@contractspec/lib.contracts";
|
|
2
2
|
|
|
3
3
|
//#region src/learning-journey-registry.feature.d.ts
|
|
4
4
|
|
|
@@ -6,7 +6,7 @@ import { FeatureModuleSpec } from "@contractspec/lib.contracts";
|
|
|
6
6
|
* Learning Journey Registry feature module that bundles
|
|
7
7
|
* the shared presentations for learning journey tracks.
|
|
8
8
|
*/
|
|
9
|
-
declare const LearningJourneyRegistryFeature: FeatureModuleSpec;
|
|
9
|
+
declare const LearningJourneyRegistryFeature: _contractspec_lib_contracts4.FeatureModuleSpec;
|
|
10
10
|
//#endregion
|
|
11
11
|
export { LearningJourneyRegistryFeature };
|
|
12
12
|
//# sourceMappingURL=learning-journey-registry.feature.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"learning-journey-registry.feature.d.ts","names":[],"sources":["../src/learning-journey-registry.feature.ts"],"sourcesContent":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"learning-journey-registry.feature.d.ts","names":[],"sources":["../src/learning-journey-registry.feature.ts"],"sourcesContent":[],"mappings":";;;;;;;AAWA;cAAa,gCAoDX,4BAAA,CApDyC"}
|
|
@@ -1,9 +1,16 @@
|
|
|
1
|
+
import { defineFeature } from "@contractspec/lib.contracts";
|
|
2
|
+
|
|
1
3
|
//#region src/learning-journey-registry.feature.ts
|
|
2
4
|
/**
|
|
5
|
+
* Learning Journey Registry Feature Module Specification
|
|
6
|
+
*
|
|
7
|
+
* Defines the feature module for the learning journey registry.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
3
10
|
* Learning Journey Registry feature module that bundles
|
|
4
11
|
* the shared presentations for learning journey tracks.
|
|
5
12
|
*/
|
|
6
|
-
const LearningJourneyRegistryFeature = {
|
|
13
|
+
const LearningJourneyRegistryFeature = defineFeature({
|
|
7
14
|
meta: {
|
|
8
15
|
key: "learning-journey-registry",
|
|
9
16
|
version: "1.0.0",
|
|
@@ -61,7 +68,7 @@ const LearningJourneyRegistryFeature = {
|
|
|
61
68
|
key: "identity",
|
|
62
69
|
version: "1.0.0"
|
|
63
70
|
}] }
|
|
64
|
-
};
|
|
71
|
+
});
|
|
65
72
|
|
|
66
73
|
//#endregion
|
|
67
74
|
export { LearningJourneyRegistryFeature };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"learning-journey-registry.feature.js","names":[
|
|
1
|
+
{"version":3,"file":"learning-journey-registry.feature.js","names":[],"sources":["../src/learning-journey-registry.feature.ts"],"sourcesContent":["/**\n * Learning Journey Registry Feature Module Specification\n *\n * Defines the feature module for the learning journey registry.\n */\nimport { defineFeature } from '@contractspec/lib.contracts';\n\n/**\n * Learning Journey Registry feature module that bundles\n * the shared presentations for learning journey tracks.\n */\nexport const LearningJourneyRegistryFeature = defineFeature({\n meta: {\n key: 'learning-journey-registry',\n version: '1.0.0',\n title: 'Learning Journey Registry',\n description:\n 'Shared registry and presentations for learning journey tracks',\n domain: 'learning-journey',\n owners: ['@learning-team'],\n tags: ['learning', 'journey', 'onboarding', 'registry'],\n stability: 'experimental',\n },\n\n // No operations in the registry - it's presentation-only\n operations: [],\n\n // Events emitted by this feature\n events: [],\n\n // Presentations associated with this feature\n presentations: [\n { key: 'learning.journey.track_list', version: '1.0.0' },\n { key: 'learning.journey.track_detail', version: '1.0.0' },\n { key: 'learning.journey.progress_widget', version: '1.0.0' },\n ],\n\n // No op to presentation links for registry\n opToPresentation: [],\n\n // Target requirements for multi-surface rendering\n presentationsTargets: [\n {\n key: 'learning.journey.track_list',\n version: '1.0.0',\n targets: ['react', 'markdown'],\n },\n {\n key: 'learning.journey.track_detail',\n version: '1.0.0',\n targets: ['react', 'markdown', 'application/json'],\n },\n {\n key: 'learning.journey.progress_widget',\n version: '1.0.0',\n targets: ['react'],\n },\n ],\n\n // Capability requirements\n capabilities: {\n requires: [{ key: 'identity', version: '1.0.0' }],\n },\n});\n"],"mappings":";;;;;;;;;;;;AAWA,MAAa,iCAAiC,cAAc;CAC1D,MAAM;EACJ,KAAK;EACL,SAAS;EACT,OAAO;EACP,aACE;EACF,QAAQ;EACR,QAAQ,CAAC,iBAAiB;EAC1B,MAAM;GAAC;GAAY;GAAW;GAAc;GAAW;EACvD,WAAW;EACZ;CAGD,YAAY,EAAE;CAGd,QAAQ,EAAE;CAGV,eAAe;EACb;GAAE,KAAK;GAA+B,SAAS;GAAS;EACxD;GAAE,KAAK;GAAiC,SAAS;GAAS;EAC1D;GAAE,KAAK;GAAoC,SAAS;GAAS;EAC9D;CAGD,kBAAkB,EAAE;CAGpB,sBAAsB;EACpB;GACE,KAAK;GACL,SAAS;GACT,SAAS,CAAC,SAAS,WAAW;GAC/B;EACD;GACE,KAAK;GACL,SAAS;GACT,SAAS;IAAC;IAAS;IAAY;IAAmB;GACnD;EACD;GACE,KAAK;GACL,SAAS;GACT,SAAS,CAAC,QAAQ;GACnB;EACF;CAGD,cAAc,EACZ,UAAU,CAAC;EAAE,KAAK;EAAY,SAAS;EAAS,CAAC,EAClD;CACF,CAAC"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as _contractspec_lib_contracts0 from "@contractspec/lib.contracts";
|
|
2
2
|
|
|
3
3
|
//#region src/presentations/index.d.ts
|
|
4
|
-
declare const LearningTrackListPresentation: PresentationSpec;
|
|
5
|
-
declare const LearningTrackDetailPresentation: PresentationSpec;
|
|
6
|
-
declare const LearningTrackProgressWidgetPresentation: PresentationSpec;
|
|
7
|
-
declare const learningJourneyPresentations: PresentationSpec[];
|
|
4
|
+
declare const LearningTrackListPresentation: _contractspec_lib_contracts0.PresentationSpec;
|
|
5
|
+
declare const LearningTrackDetailPresentation: _contractspec_lib_contracts0.PresentationSpec;
|
|
6
|
+
declare const LearningTrackProgressWidgetPresentation: _contractspec_lib_contracts0.PresentationSpec;
|
|
7
|
+
declare const learningJourneyPresentations: _contractspec_lib_contracts0.PresentationSpec[];
|
|
8
8
|
//#endregion
|
|
9
9
|
export { LearningTrackDetailPresentation, LearningTrackListPresentation, LearningTrackProgressWidgetPresentation, learningJourneyPresentations };
|
|
10
10
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/presentations/index.ts"],"sourcesContent":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/presentations/index.ts"],"sourcesContent":[],"mappings":";;;cAea,+BAaX,4BAAA,CAbwC;cAe7B,iCAaX,4BAAA,CAb0C;cAe/B,yCAaX,4BAAA,CAbkD;AA9BvC,cA6CA,4BAhCX,EAoCD,4BAAA,CAJwC,gBAAA,EAhCvC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { StabilityEnum } from "@contractspec/lib.contracts";
|
|
1
|
+
import { StabilityEnum, definePresentation } from "@contractspec/lib.contracts";
|
|
2
2
|
|
|
3
3
|
//#region src/presentations/index.ts
|
|
4
4
|
const baseMeta = {
|
|
@@ -14,7 +14,7 @@ const baseMeta = {
|
|
|
14
14
|
goal: "Progress through learning tracks",
|
|
15
15
|
context: "Learning journey section"
|
|
16
16
|
};
|
|
17
|
-
const LearningTrackListPresentation = {
|
|
17
|
+
const LearningTrackListPresentation = definePresentation({
|
|
18
18
|
meta: {
|
|
19
19
|
key: "learning.journey.track_list",
|
|
20
20
|
version: "1.0.0",
|
|
@@ -27,8 +27,8 @@ const LearningTrackListPresentation = {
|
|
|
27
27
|
componentKey: "LearningTrackList"
|
|
28
28
|
},
|
|
29
29
|
targets: ["react", "markdown"]
|
|
30
|
-
};
|
|
31
|
-
const LearningTrackDetailPresentation = {
|
|
30
|
+
});
|
|
31
|
+
const LearningTrackDetailPresentation = definePresentation({
|
|
32
32
|
meta: {
|
|
33
33
|
key: "learning.journey.track_detail",
|
|
34
34
|
version: "1.0.0",
|
|
@@ -45,8 +45,8 @@ const LearningTrackDetailPresentation = {
|
|
|
45
45
|
"markdown",
|
|
46
46
|
"application/json"
|
|
47
47
|
]
|
|
48
|
-
};
|
|
49
|
-
const LearningTrackProgressWidgetPresentation = {
|
|
48
|
+
});
|
|
49
|
+
const LearningTrackProgressWidgetPresentation = definePresentation({
|
|
50
50
|
meta: {
|
|
51
51
|
key: "learning.journey.progress_widget",
|
|
52
52
|
version: "1.0.0",
|
|
@@ -59,7 +59,7 @@ const LearningTrackProgressWidgetPresentation = {
|
|
|
59
59
|
componentKey: "LearningTrackProgressWidget"
|
|
60
60
|
},
|
|
61
61
|
targets: ["react"]
|
|
62
|
-
};
|
|
62
|
+
});
|
|
63
63
|
const learningJourneyPresentations = [
|
|
64
64
|
LearningTrackListPresentation,
|
|
65
65
|
LearningTrackDetailPresentation,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/presentations/index.ts"],"sourcesContent":["import { definePresentation, StabilityEnum, type PresentationSpecMeta } from '@contractspec/lib.contracts';\n\nconst baseMeta: Pick<\n PresentationSpecMeta,\n 'domain' | 'owners' | 'tags' | 'title' | 'stability' | 'goal' | 'context'\n> = {\n domain: 'learning-journey',\n title: 'Learning Journey',\n owners: ['@learning-team'] as string[],\n tags: ['learning', 'journey', 'onboarding'] as string[],\n stability: StabilityEnum.Experimental,\n goal: 'Progress through learning tracks',\n context: 'Learning journey section',\n};\n\nexport const LearningTrackListPresentation = definePresentation({\n meta: {\n key: 'learning.journey.track_list',\n version: '1.0.0',\n description: 'List of learning journeys available to the learner.',\n ...baseMeta,\n },\n source: {\n type: 'component',\n framework: 'react',\n componentKey: 'LearningTrackList',\n },\n targets: ['react', 'markdown'],\n});\n\nexport const LearningTrackDetailPresentation = definePresentation({\n meta: {\n key: 'learning.journey.track_detail',\n version: '1.0.0',\n description: 'Track detail with steps and progress state.',\n ...baseMeta,\n },\n source: {\n type: 'component',\n framework: 'react',\n componentKey: 'LearningTrackDetail',\n },\n targets: ['react', 'markdown', 'application/json'],\n});\n\nexport const LearningTrackProgressWidgetPresentation = definePresentation({\n meta: {\n key: 'learning.journey.progress_widget',\n version: '1.0.0',\n description: 'Compact widget showing progress for active track.',\n ...baseMeta,\n },\n source: {\n type: 'component',\n framework: 'react',\n componentKey: 'LearningTrackProgressWidget',\n },\n targets: ['react'],\n});\n\nexport const learningJourneyPresentations = [\n LearningTrackListPresentation,\n LearningTrackDetailPresentation,\n LearningTrackProgressWidgetPresentation,\n];\n"],"mappings":";;;AAEA,MAAM,WAGF;CACF,QAAQ;CACR,OAAO;CACP,QAAQ,CAAC,iBAAiB;CAC1B,MAAM;EAAC;EAAY;EAAW;EAAa;CAC3C,WAAW,cAAc;CACzB,MAAM;CACN,SAAS;CACV;AAED,MAAa,gCAAgC,mBAAmB;CAC9D,MAAM;EACJ,KAAK;EACL,SAAS;EACT,aAAa;EACb,GAAG;EACJ;CACD,QAAQ;EACN,MAAM;EACN,WAAW;EACX,cAAc;EACf;CACD,SAAS,CAAC,SAAS,WAAW;CAC/B,CAAC;AAEF,MAAa,kCAAkC,mBAAmB;CAChE,MAAM;EACJ,KAAK;EACL,SAAS;EACT,aAAa;EACb,GAAG;EACJ;CACD,QAAQ;EACN,MAAM;EACN,WAAW;EACX,cAAc;EACf;CACD,SAAS;EAAC;EAAS;EAAY;EAAmB;CACnD,CAAC;AAEF,MAAa,0CAA0C,mBAAmB;CACxE,MAAM;EACJ,KAAK;EACL,SAAS;EACT,aAAa;EACb,GAAG;EACJ;CACD,QAAQ;EACN,MAAM;EACN,WAAW;EACX,cAAc;EACf;CACD,SAAS,CAAC,QAAQ;CACnB,CAAC;AAEF,MAAa,+BAA+B;CAC1C;CACA;CACA;CACD"}
|
package/dist/tracks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracks.js","names":[
|
|
1
|
+
{"version":3,"file":"tracks.js","names":[],"sources":["../src/tracks.ts"],"sourcesContent":["import type {\n LearningJourneyStepSpec,\n LearningJourneyTrackSpec,\n StepAvailabilitySpec,\n StepCompletionConditionSpec,\n} from '@contractspec/module.learning-journey/track-spec';\nimport { crmLearningTracks } from '@contractspec/example.learning-journey-crm-onboarding/track';\nimport { drillTracks } from '@contractspec/example.learning-journey-duo-drills/track';\nimport { ambientCoachTracks } from '@contractspec/example.learning-journey-ambient-coach/track';\nimport { questTracks } from '@contractspec/example.learning-journey-quest-challenges/track';\nimport { platformLearningTracks } from '@contractspec/example.learning-journey-platform-tour/track';\nimport { studioLearningTracks } from '@contractspec/example.learning-journey-studio-onboarding/track';\n\nexport interface OnboardingStepDto {\n id: string;\n title: string;\n description?: string;\n completionEvent: string;\n completionCondition?: StepCompletionConditionSpec;\n xpReward?: number;\n isRequired?: boolean;\n canSkip?: boolean;\n actionUrl?: string;\n actionLabel?: string;\n availability?: StepAvailabilitySpec;\n metadata?: Record<string, unknown>;\n}\n\nexport interface OnboardingTrackDto {\n id: string;\n name: string;\n description?: string;\n productId?: string;\n targetUserSegment?: string;\n targetRole?: string;\n totalXp?: number;\n streakRule?: LearningJourneyTrackSpec['streakRule'];\n completionRewards?: LearningJourneyTrackSpec['completionRewards'];\n steps: OnboardingStepDto[];\n metadata?: Record<string, unknown>;\n}\n\nconst mapStep = (step: LearningJourneyStepSpec): OnboardingStepDto => ({\n id: step.id,\n title: step.title,\n description: step.description,\n completionEvent: step.completion.eventName,\n completionCondition: step.completion,\n xpReward: step.xpReward,\n isRequired: step.isRequired,\n canSkip: step.canSkip,\n actionUrl: step.actionUrl,\n actionLabel: step.actionLabel,\n availability: step.availability,\n metadata: step.metadata,\n});\n\nexport const mapTrackSpecToDto = (\n track: LearningJourneyTrackSpec\n): OnboardingTrackDto => ({\n id: track.id,\n name: track.name,\n description: track.description,\n productId: track.productId,\n targetUserSegment: track.targetUserSegment,\n targetRole: track.targetRole,\n totalXp: track.totalXp,\n streakRule: track.streakRule,\n completionRewards: track.completionRewards,\n steps: track.steps.map(mapStep),\n metadata: track.metadata,\n});\n\nexport const learningJourneyTracks: LearningJourneyTrackSpec[] = [\n ...studioLearningTracks,\n ...platformLearningTracks,\n ...crmLearningTracks,\n ...drillTracks,\n ...ambientCoachTracks,\n ...questTracks,\n];\n\nexport const onboardingTrackCatalog: OnboardingTrackDto[] =\n learningJourneyTracks.map(mapTrackSpecToDto);\n\nexport {\n studioLearningTracks,\n platformLearningTracks,\n crmLearningTracks,\n mapStep,\n};\n"],"mappings":";;;;;;;;AA0CA,MAAM,WAAW,UAAsD;CACrE,IAAI,KAAK;CACT,OAAO,KAAK;CACZ,aAAa,KAAK;CAClB,iBAAiB,KAAK,WAAW;CACjC,qBAAqB,KAAK;CAC1B,UAAU,KAAK;CACf,YAAY,KAAK;CACjB,SAAS,KAAK;CACd,WAAW,KAAK;CAChB,aAAa,KAAK;CAClB,cAAc,KAAK;CACnB,UAAU,KAAK;CAChB;AAED,MAAa,qBACX,WACwB;CACxB,IAAI,MAAM;CACV,MAAM,MAAM;CACZ,aAAa,MAAM;CACnB,WAAW,MAAM;CACjB,mBAAmB,MAAM;CACzB,YAAY,MAAM;CAClB,SAAS,MAAM;CACf,YAAY,MAAM;CAClB,mBAAmB,MAAM;CACzB,OAAO,MAAM,MAAM,IAAI,QAAQ;CAC/B,UAAU,MAAM;CACjB;AAED,MAAa,wBAAoD;CAC/D,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACJ;AAED,MAAa,yBACX,sBAAsB,IAAI,kBAAkB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LearningMiniApp.js","names":[
|
|
1
|
+
{"version":3,"file":"LearningMiniApp.js","names":[],"sources":["../../src/ui/LearningMiniApp.tsx"],"sourcesContent":["'use client';\n\nimport { useMemo } from 'react';\nimport { GamifiedMiniApp } from '@contractspec/example.learning-journey-ui-gamified';\nimport { OnboardingMiniApp } from '@contractspec/example.learning-journey-ui-onboarding';\nimport { CoachingMiniApp } from '@contractspec/example.learning-journey-ui-coaching';\nimport type { LearningView } from '@contractspec/example.learning-journey-ui-shared';\nimport { learningJourneyTracks } from '../tracks';\n\n/** Template IDs that map to learning journey tracks */\ntype LearningTemplateId =\n | 'learning-journey-duo-drills'\n | 'learning-journey-quest-challenges'\n | 'learning-journey-studio-onboarding'\n | 'learning-journey-platform-tour'\n | 'learning-journey-ambient-coach'\n | 'learning-journey-crm-onboarding';\n\n/** Map template IDs to track IDs */\nconst TEMPLATE_TO_TRACK: Record<LearningTemplateId, string> = {\n 'learning-journey-duo-drills': 'drills_language_basics',\n 'learning-journey-quest-challenges': 'money_reset_7day',\n 'learning-journey-studio-onboarding': 'studio_getting_started',\n 'learning-journey-platform-tour': 'platform_tour',\n 'learning-journey-ambient-coach': 'money_ambient_coach',\n 'learning-journey-crm-onboarding': 'crm_first_win',\n};\n\n/** Map template IDs to mini-app type */\nconst TEMPLATE_TO_APP_TYPE: Record<\n LearningTemplateId,\n 'gamified' | 'onboarding' | 'coaching'\n> = {\n 'learning-journey-duo-drills': 'gamified',\n 'learning-journey-quest-challenges': 'gamified',\n 'learning-journey-studio-onboarding': 'onboarding',\n 'learning-journey-platform-tour': 'onboarding',\n 'learning-journey-ambient-coach': 'coaching',\n 'learning-journey-crm-onboarding': 'coaching',\n};\n\ninterface LearningMiniAppProps {\n templateId: string;\n initialView?: LearningView;\n onViewChange?: (view: LearningView) => void;\n}\n\n/** Router component that picks the correct mini-app based on template ID */\nexport function LearningMiniApp({\n templateId,\n initialView = 'overview',\n onViewChange,\n}: LearningMiniAppProps) {\n // Find the track for this template\n const track = useMemo(() => {\n const trackId = TEMPLATE_TO_TRACK[templateId as LearningTemplateId];\n if (!trackId) return null;\n return learningJourneyTracks.find((t) => t.id === trackId);\n }, [templateId]);\n\n // Determine app type\n const appType = TEMPLATE_TO_APP_TYPE[templateId as LearningTemplateId];\n\n if (!track) {\n return (\n <div className=\"rounded-lg border border-amber-500/50 bg-amber-500/10 p-6 text-center\">\n <p className=\"text-amber-500\">\n Unknown learning template: {templateId}\n </p>\n </div>\n );\n }\n\n // Render the appropriate mini-app\n switch (appType) {\n case 'gamified':\n return (\n <GamifiedMiniApp\n track={track}\n initialView={initialView}\n onViewChange={onViewChange}\n />\n );\n case 'onboarding':\n return (\n <OnboardingMiniApp\n track={track}\n initialView={initialView}\n onViewChange={onViewChange}\n />\n );\n case 'coaching':\n return (\n <CoachingMiniApp\n track={track}\n initialView={initialView}\n onViewChange={onViewChange}\n />\n );\n default:\n return (\n <div className=\"rounded-lg border border-red-500/50 bg-red-500/10 p-6 text-center\">\n <p className=\"text-red-500\">\n Unknown app type for template: {templateId}\n </p>\n </div>\n );\n }\n}\n\n/** Check if a template ID is a learning journey template */\nexport function isLearningTemplate(\n templateId: string\n): templateId is LearningTemplateId {\n return templateId in TEMPLATE_TO_TRACK;\n}\n\n/** Get all learning template IDs */\nexport function getLearningTemplateIds(): LearningTemplateId[] {\n return Object.keys(TEMPLATE_TO_TRACK) as LearningTemplateId[];\n}\n"],"mappings":";;;;;;;;;;;AAmBA,MAAM,oBAAwD;CAC5D,+BAA+B;CAC/B,qCAAqC;CACrC,sCAAsC;CACtC,kCAAkC;CAClC,kCAAkC;CAClC,mCAAmC;CACpC;;AAGD,MAAM,uBAGF;CACF,+BAA+B;CAC/B,qCAAqC;CACrC,sCAAsC;CACtC,kCAAkC;CAClC,kCAAkC;CAClC,mCAAmC;CACpC;;AASD,SAAgB,gBAAgB,EAC9B,YACA,cAAc,YACd,gBACuB;CAEvB,MAAM,QAAQ,cAAc;EAC1B,MAAM,UAAU,kBAAkB;AAClC,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,sBAAsB,MAAM,MAAM,EAAE,OAAO,QAAQ;IACzD,CAAC,WAAW,CAAC;CAGhB,MAAM,UAAU,qBAAqB;AAErC,KAAI,CAAC,MACH,QACE,oBAAC;EAAI,WAAU;YACb,qBAAC;GAAE,WAAU;cAAiB,+BACA;IAC1B;GACA;AAKV,SAAQ,SAAR;EACE,KAAK,WACH,QACE,oBAAC;GACQ;GACM;GACC;IACd;EAEN,KAAK,aACH,QACE,oBAAC;GACQ;GACM;GACC;IACd;EAEN,KAAK,WACH,QACE,oBAAC;GACQ;GACM;GACC;IACd;EAEN,QACE,QACE,oBAAC;GAAI,WAAU;aACb,qBAAC;IAAE,WAAU;eAAe,mCACM;KAC9B;IACA;;;;AAMd,SAAgB,mBACd,YACkC;AAClC,QAAO,cAAc;;;AAIvB,SAAgB,yBAA+C;AAC7D,QAAO,OAAO,KAAK,kBAAkB"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@contractspec/example.learning-journey-registry",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.47.0",
|
|
4
4
|
"description": "Registry that aggregates learning journey example tracks.",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"main": "./dist/index.js",
|
|
7
6
|
"types": "./dist/index.d.ts",
|
|
8
7
|
"exports": {
|
|
9
8
|
".": "./dist/index.js",
|
|
@@ -34,31 +33,30 @@
|
|
|
34
33
|
"lint:check": "eslint src"
|
|
35
34
|
},
|
|
36
35
|
"dependencies": {
|
|
37
|
-
"@contractspec/lib.contracts": "1.
|
|
38
|
-
"@contractspec/example.learning-journey-ambient-coach": "1.
|
|
39
|
-
"@contractspec/example.learning-journey-duo-drills": "1.
|
|
40
|
-
"@contractspec/example.learning-journey-crm-onboarding": "1.
|
|
41
|
-
"@contractspec/example.learning-journey-platform-tour": "1.
|
|
42
|
-
"@contractspec/example.learning-journey-quest-challenges": "1.
|
|
43
|
-
"@contractspec/example.learning-journey-studio-onboarding": "1.
|
|
44
|
-
"@contractspec/example.learning-journey-ui-shared": "1.
|
|
45
|
-
"@contractspec/example.learning-journey-ui-gamified": "1.
|
|
46
|
-
"@contractspec/example.learning-journey-ui-onboarding": "1.
|
|
47
|
-
"@contractspec/example.learning-journey-ui-coaching": "1.
|
|
48
|
-
"@contractspec/module.learning-journey": "1.
|
|
36
|
+
"@contractspec/lib.contracts": "1.47.0",
|
|
37
|
+
"@contractspec/example.learning-journey-ambient-coach": "1.47.0",
|
|
38
|
+
"@contractspec/example.learning-journey-duo-drills": "1.47.0",
|
|
39
|
+
"@contractspec/example.learning-journey-crm-onboarding": "1.47.0",
|
|
40
|
+
"@contractspec/example.learning-journey-platform-tour": "1.47.0",
|
|
41
|
+
"@contractspec/example.learning-journey-quest-challenges": "1.47.0",
|
|
42
|
+
"@contractspec/example.learning-journey-studio-onboarding": "1.47.0",
|
|
43
|
+
"@contractspec/example.learning-journey-ui-shared": "1.47.0",
|
|
44
|
+
"@contractspec/example.learning-journey-ui-gamified": "1.47.0",
|
|
45
|
+
"@contractspec/example.learning-journey-ui-onboarding": "1.47.0",
|
|
46
|
+
"@contractspec/example.learning-journey-ui-coaching": "1.47.0",
|
|
47
|
+
"@contractspec/module.learning-journey": "1.47.0",
|
|
49
48
|
"react": "19.2.3"
|
|
50
49
|
},
|
|
51
50
|
"devDependencies": {
|
|
52
|
-
"@contractspec/tool.tsdown": "1.
|
|
53
|
-
"@contractspec/tool.typescript": "1.
|
|
54
|
-
"@types/react": "^19.
|
|
55
|
-
"tsdown": "^0.
|
|
51
|
+
"@contractspec/tool.tsdown": "1.47.0",
|
|
52
|
+
"@contractspec/tool.typescript": "1.47.0",
|
|
53
|
+
"@types/react": "^19.2.8",
|
|
54
|
+
"tsdown": "^0.19.0",
|
|
56
55
|
"typescript": "^5.9.3"
|
|
57
56
|
},
|
|
58
57
|
"peerDependencies": {
|
|
59
58
|
"react": "^19.2.3"
|
|
60
59
|
},
|
|
61
|
-
"module": "./dist/index.js",
|
|
62
60
|
"publishConfig": {
|
|
63
61
|
"exports": {
|
|
64
62
|
".": "./dist/index.js",
|
package/src/example.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { defineExample } from '@contractspec/lib.contracts';
|
|
2
2
|
|
|
3
|
-
const example
|
|
3
|
+
const example = defineExample({
|
|
4
4
|
meta: {
|
|
5
5
|
key: 'learning-journey-registry',
|
|
6
6
|
version: '1.0.0',
|
|
@@ -26,6 +26,6 @@ const example: ExampleSpec = {
|
|
|
26
26
|
studio: { enabled: true, installable: true },
|
|
27
27
|
mcp: { enabled: true },
|
|
28
28
|
},
|
|
29
|
-
};
|
|
29
|
+
});
|
|
30
30
|
|
|
31
31
|
export default example;
|