Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8662449dcf | ||
|
|
1834bc2068 | ||
|
|
c23c6c21db | ||
|
|
b494283e9c | ||
|
|
9b334f36e1 | ||
|
|
7f8d2eb142 | ||
|
|
9d3eeb1980 | ||
|
|
0bcb675c3b | ||
|
|
574b4d08a3 | ||
|
|
d64e463a71 | ||
|
|
792fd05c85 | ||
|
|
7814b97ace | ||
|
|
75be905f14 | ||
|
|
01293590e8 | ||
|
|
b236b729b4 | ||
|
|
0170dc6e9c | ||
|
|
7834328ae0 | ||
|
|
39fa797299 | ||
|
|
03229ffb59 | ||
|
|
844a770335 | ||
|
|
c8dc9869a3 | ||
|
|
38755c9014 | ||
|
|
5d5537e4c7 | ||
|
|
9da9f5f068 | ||
|
|
d834ca5e77 | ||
|
|
85e95ec18c | ||
|
|
ff9bc00729 | ||
|
|
7451a78e60 | ||
|
|
23ee2393c6 | ||
|
|
cd6ef222d1 | ||
|
|
b5158b6ac6 | ||
|
|
beaa1d09de | ||
|
|
a716d8006c | ||
|
|
1b0d38edce | ||
|
|
995fa2d514 | ||
|
|
c71a47f2b0 | ||
|
|
6c99b811ec | ||
|
|
40a38b8b88 | ||
|
|
ad96edfad0 | ||
|
|
240b165970 | ||
|
|
c3b7250f85 | ||
|
|
2476379af1 | ||
|
|
e0d659fe46 | ||
|
|
9ff03c04f3 | ||
|
|
7b45fbeab3 | ||
|
|
a733a53d3e | ||
|
|
dfd0dfc7f9 | ||
|
|
52bbccd53c | ||
|
|
d92c2a7b66 | ||
|
|
568b327425 | ||
|
|
1fb702169e | ||
|
|
3617f40309 | ||
|
|
0c03b13d74 | ||
|
|
3cbfa1e4cb | ||
|
|
397f79caa5 | ||
|
|
972c1d5357 | ||
|
|
32d35ef2ee | ||
|
|
57e165779e | ||
|
|
690d7859c8 | ||
|
|
8f9a7d8581 | ||
|
|
3d5fcc1a55 | ||
|
|
823e0c1d94 | ||
|
|
13a149c3a2 | ||
|
|
dd130eacb0 | ||
|
|
d0238add2d | ||
|
|
fe96d72ac6 | ||
|
|
b2b8df9340 | ||
|
|
2d56eaf11a | ||
|
|
2cb9c471f9 | ||
|
|
e8fc7f497b | ||
|
|
6702f0bfad | ||
|
|
d7454e3ca4 | ||
|
|
0d9bab910e | ||
|
|
3d16bbdc64 | ||
|
|
b4e7ba2abd | ||
|
|
374b26f7c6 | ||
|
|
dbebb4f4fb | ||
|
|
eec89b626c | ||
|
|
763d23e960 | ||
|
|
3b56ed17fe | ||
|
|
4b8d22ac32 | ||
|
|
9cd873da14 | ||
|
|
c1799bf7b3 | ||
|
|
85be826b62 | ||
|
|
dd1ae97de7 | ||
|
|
63f006ab62 | ||
|
|
caf7622aa0 | ||
|
|
d746cf3bb8 | ||
|
|
88af781d78 | ||
|
|
15d5d37e50 | ||
|
|
b9aaf894d7 | ||
|
|
460cdb5af4 | ||
|
|
290bd9858e | ||
|
|
b42a7b4e43 | ||
|
|
189714c727 | ||
|
|
987051acd4 | ||
|
|
374e08a79e | ||
|
|
359886c72f | ||
|
|
f03b73b58e | ||
|
|
18d20df4da | ||
|
|
c5642a8605 | ||
|
|
673f5e5855 | ||
|
|
cabb625a17 | ||
|
|
b8f05b79b0 | ||
|
|
b22faaac86 | ||
|
|
107439d70c | ||
|
|
71869b1a58 | ||
|
|
9aed3134cf | ||
|
|
3ff57aff37 | ||
|
|
152c0541b8 | ||
|
|
7b14fa2da4 | ||
|
|
3fb6f919f8 | ||
|
|
551ca7805d | ||
|
|
8ab25fe293 | ||
|
|
eea7ed9e58 | ||
|
|
0279cf6d27 | ||
|
|
0dff1ad2ad | ||
|
|
95fbcca66f | ||
|
|
a61baa83a7 | ||
|
|
afebeecd68 | ||
|
|
f4e9925319 | ||
|
|
32460ac133 | ||
|
|
4d95a7f044 | ||
|
|
57f919fbe0 | ||
|
|
1cb9a0e58f | ||
|
|
1da43ee822 | ||
|
|
f4c7563763 | ||
|
|
a3f7cc38b1 | ||
|
|
b15cbab313 | ||
|
|
504b9ffb66 | ||
|
|
6226e3ff06 | ||
|
|
2621d7f659 | ||
|
|
a768b890fd | ||
|
|
8b9616837d | ||
|
|
0d2948e60c | ||
|
|
ecfef727c8 | ||
|
|
caed5428d5 | ||
|
|
bce3a6e253 | ||
|
|
eac660b1a0 | ||
|
|
af49870084 | ||
|
|
e2b316b3cc | ||
|
|
3a0544629d | ||
|
|
609baace73 | ||
|
|
b12cfba353 | ||
|
|
6242c6daf3 | ||
|
|
b5337de278 | ||
|
|
3512199ff4 | ||
|
|
e03b106652 | ||
|
|
f9afa22406 | ||
|
|
adfc7e91b3 | ||
|
|
40cde9c050 | ||
|
|
ddc7a7750e | ||
|
|
50a01d9dd3 | ||
|
|
793aad0a5e | ||
|
|
9c1bf8dbed | ||
|
|
620f3eecc7 | ||
|
|
4355538d8d | ||
|
|
3ad5dc9ca3 | ||
|
|
57c7e7be3f | ||
|
|
6778ccace4 | ||
|
|
1264232533 | ||
|
|
61813e67b6 | ||
|
|
c58e3411fd | ||
|
|
011d795361 | ||
|
|
3f40a04370 | ||
|
|
fc042bb7d9 | ||
|
|
d051e52131 | ||
|
|
fb4316aeb9 | ||
|
|
683203919f | ||
|
|
a0cddbcae6 | ||
|
|
4e81fc7eba | ||
|
|
b410e2de47 | ||
|
|
9868c746e1 | ||
|
|
f0b4453a5f | ||
|
|
6b49471734 | ||
|
|
fe791e83a8 | ||
|
|
edbc9eb27f | ||
|
|
2f63034d9a | ||
|
|
dee0e0284a | ||
|
|
890e591f2a | ||
|
|
cb6561e27b | ||
|
|
7ef70d7f9a | ||
|
|
86405c1dcd | ||
|
|
60fa259285 | ||
|
|
27f86eece2 | ||
|
|
4cee396ea9 | ||
|
|
d2ad295b48 | ||
|
|
009f8af4e1 | ||
|
|
0cd99209c4 | ||
|
|
3ea55303dc | ||
|
|
c458a5e036 | ||
|
|
c511725d1f | ||
|
|
3876d9b92b | ||
|
|
f863c48ab0 | ||
|
|
10096795a1 | ||
|
|
8b146c8d5f | ||
|
|
1208c4ffeb | ||
|
|
ec5de97973 | ||
|
|
0daa92cfb7 | ||
|
|
130f466026 | ||
|
|
f93de87940 | ||
|
|
367d97e9bb | ||
|
|
77701f214c | ||
|
|
b5b64f8c41 | ||
|
|
ab04ad30f1 | ||
|
|
330d9a6fdb | ||
|
|
e762343142 | ||
|
|
fce9e3d4d6 | ||
|
|
0e5855ee4e | ||
|
|
ba61737bc7 | ||
|
|
bd7ea1f713 | ||
|
|
1abd20edf5 | ||
|
|
496513c641 | ||
|
|
848b637f45 | ||
|
|
39049601d4 | ||
|
|
e31cdd17d3 | ||
|
|
2a3f2d49b8 | ||
|
|
ca452889d7 | ||
|
|
2df501ec07 | ||
|
|
6b1e6c6fdc | ||
|
|
570e970e1c | ||
|
|
f4e3505d52 | ||
|
|
9af2b9859a | ||
|
|
d99d314621 | ||
|
|
c5b8b18e33 | ||
|
|
7280265a64 | ||
|
|
35fa0ef884 | ||
|
|
9c778cb71b | ||
|
|
4a401744c1 | ||
|
|
5f6b2d4d40 | ||
|
|
bf25218af2 | ||
|
|
1f7f9d9f84 | ||
|
|
2be53a04e4 | ||
|
|
7f56ebc786 | ||
|
|
a801e4f50e | ||
|
|
a9f9ad9b94 | ||
|
|
3cf1dab5b9 | ||
|
|
63165bbbfc | ||
|
|
61caad2bef | ||
|
|
b826bbc4c7 | ||
|
|
2ce7dad8d8 | ||
|
|
dff400bf22 | ||
|
|
27ce902344 | ||
|
|
33ee0a04c6 | ||
|
|
d68f6922f8 | ||
|
|
f8539d7958 | ||
|
|
14dc911e0a | ||
|
|
deccb6bf84 | ||
|
|
dacbfcae95 | ||
|
|
1b69ed17b7 | ||
|
|
241acc9050 | ||
|
|
8fa921930c | ||
|
|
011e43811a | ||
|
|
9f16debd75 | ||
|
|
92c56c439b | ||
|
|
7de6a5af0f | ||
|
|
173a063781 | ||
|
|
e04ac7c909 | ||
|
|
a6e49e1d47 | ||
|
|
f0046c7dc2 | ||
|
|
2a17c47c25 | ||
|
|
8d741bf1b9 | ||
|
|
c676006632 | ||
|
|
5bcfd597b9 | ||
|
|
3cda3c2238 | ||
|
|
43bdd7e43b | ||
|
|
1ec7892338 | ||
|
|
6bcfd48a2f | ||
|
|
345ef70972 | ||
|
|
c876edca0c | ||
|
|
fcf3def284 | ||
|
|
6f1a2896dd | ||
|
|
62381f4160 | ||
|
|
171805debf | ||
|
|
619abcbfbc | ||
|
|
03909924c2 | ||
|
|
f4ea077114 | ||
|
|
956ccf9195 | ||
|
|
e880925e3f | ||
|
|
0a860920ad | ||
|
|
fb7a1b1282 | ||
|
|
59970ef7c3 | ||
|
|
a7750c2894 | ||
|
|
b69b81f63a | ||
|
|
00fc6dfd67 | ||
|
|
82451e9fd3 | ||
|
|
d0fcc0e447 | ||
|
|
285279629e | ||
|
|
cbfe09b5e9 | ||
|
|
b757c1d06c | ||
|
|
4550a6146a | ||
|
|
3224bb9696 | ||
|
|
3a5e73266e | ||
|
|
1cf5641c4c | ||
|
|
85dad41e60 | ||
|
|
bd839cf431 | ||
|
|
b20b2ae4ce | ||
|
|
cac6aedf78 | ||
|
|
a572c80967 | ||
|
|
a09e8261db | ||
|
|
62e8ebe926 | ||
|
|
96e0a9126f | ||
|
|
4afb195814 | ||
|
|
7da5366bca | ||
|
|
d979c38615 | ||
|
|
7def06126b | ||
|
|
9f600f88b0 | ||
|
|
e3c4d5f0c0 | ||
|
|
b97f3a8431 | ||
|
|
3b917a06af | ||
|
|
360106fb92 | ||
|
|
507ed5005f | ||
|
|
8bea5d5e68 | ||
|
|
99076adb72 | ||
|
|
d1a6230b23 | ||
|
|
cfe3916934 | ||
|
|
d798995876 | ||
|
|
43e6b7bf88 | ||
|
|
9253686de1 | ||
|
|
7e7eae2d1a | ||
|
|
1924d979d6 | ||
|
|
ed84394301 | ||
|
|
bb99cf5389 | ||
|
|
2d0700f441 | ||
|
|
e3ead8a695 | ||
|
|
942043f0b0 | ||
|
|
23d81bca35 | ||
|
|
701f538e57 | ||
|
|
bb3017ffc2 | ||
|
|
f2b9c5cc5a | ||
|
|
532a52acfc | ||
|
|
c19b5ae9a7 | ||
|
|
5f507532ed | ||
|
|
6e48f22540 | ||
|
|
66aa9f4f20 | ||
|
|
62f895efe0 | ||
|
|
4a060e1ce3 | ||
|
|
a0177c9163 | ||
|
|
f45af34614 | ||
|
|
14a8d755f0 | ||
|
|
b67ab80c75 | ||
|
|
ae71af856b | ||
|
|
279c1d9bc9 | ||
|
|
9068a109b0 | ||
|
|
7850fc610c | ||
|
|
536871d09b | ||
|
|
1af2cf5f99 | ||
|
|
b13132b259 | ||
|
|
a1a6970ea4 | ||
|
|
41bbe23404 | ||
|
|
1d2a3e283e | ||
|
|
62d7521384 | ||
|
|
bf14b59a28 | ||
|
|
0a0f64510f | ||
|
|
9445c735c3 | ||
|
|
7339e7ecec | ||
|
|
79f7c89e23 | ||
|
|
e724e5a1ba | ||
|
|
fdaa94a61d | ||
|
|
6af0074c36 | ||
|
|
97a69fed09 | ||
|
|
959879440d | ||
|
|
fd1bbb0e00 | ||
|
|
072e68cf43 | ||
|
|
610232e6b0 | ||
|
|
69c46f32eb | ||
|
|
06b3f92007 | ||
|
|
c631290049 | ||
|
|
f41c1a3ca3 | ||
|
|
bd6ba84087 | ||
|
|
1512409eb3 | ||
|
|
bcb5feeb1c | ||
|
|
da8b7cf601 | ||
|
|
316527c459 | ||
|
|
da70818b22 | ||
|
|
5ea3b72b2b | ||
|
|
632864b361 | ||
|
|
952247def0 | ||
|
|
51debede52 | ||
|
|
ce7b731bcf | ||
|
|
86e2dc8fdb | ||
|
|
78047134c2 | ||
|
|
125a1686ab | ||
|
|
d542ac48b8 | ||
|
|
1ac0227c90 | ||
|
|
a5e70bcd99 | ||
|
|
38763de7f6 | ||
|
|
db73b077c5 | ||
|
|
0969d09da1 | ||
|
|
a07108a431 | ||
|
|
6693b56ab8 | ||
|
|
a7349bd360 | ||
|
|
e92c0040b5 | ||
|
|
f448fa48c4 | ||
|
|
aa33cad4fa | ||
|
|
d0cb7d5359 | ||
|
|
90153b98fe | ||
|
|
8c4e8d523e | ||
|
|
90ad4b3ec4 | ||
|
|
62bc6b547e | ||
|
|
be11060674 | ||
|
|
d62bf9f7f9 | ||
|
|
61fcd52c65 | ||
|
|
2947ddeb64 | ||
|
|
d9b752c180 | ||
|
|
b82891caee | ||
|
|
05f04ef37e | ||
|
|
66dc9780b9 | ||
|
|
d48b22c656 | ||
|
|
727b1864eb | ||
|
|
de3bfd7551 | ||
|
|
dedb91379f | ||
|
|
1dfcd008aa | ||
|
|
cf2dc91af6 | ||
|
|
a66f80a766 | ||
|
|
f4e49c316e | ||
|
|
d1cd72bbb2 | ||
|
|
6178851def | ||
|
|
945f772c30 | ||
|
|
b546c9c712 | ||
|
|
413ce93b31 | ||
|
|
cffe32911d | ||
|
|
4f651eb42e | ||
|
|
6da1585b6b | ||
|
|
b988e81a1b | ||
|
|
1a1c1087d2 | ||
|
|
1a1549230f | ||
|
|
64ea53eba1 | ||
|
|
5e052a7e7d | ||
|
|
cf9ea495d0 | ||
|
|
9603c6423b | ||
|
|
457eef585e | ||
|
|
1ade449c4d | ||
|
|
aa9d73a810 | ||
|
|
cc266a7ba9 | ||
|
|
d8ea324018 | ||
|
|
60566e8d78 | ||
|
|
306d2994dc | ||
|
|
e6a8791fc3 | ||
|
|
6cbbc06998 | ||
|
|
0b4244fd8e | ||
|
|
367ddfbf8a | ||
|
|
168e028098 | ||
|
|
042ded37d2 | ||
|
|
4137eb2bce | ||
|
|
20a3f03e12 | ||
|
|
7792710694 | ||
|
|
dbddbbdfb8 | ||
|
|
4869f5741e | ||
|
|
bda547dd2e | ||
|
|
ef80b03a44 | ||
|
|
6e511ae949 | ||
|
|
94541d0abb | ||
|
|
586a0e5d14 | ||
|
|
814842dbaf | ||
|
|
70a993573f | ||
|
|
21659cbb13 | ||
|
|
a44251cc55 | ||
|
|
69616bbddc | ||
|
|
0a1d7ac083 | ||
|
|
364bc4cdab | ||
|
|
2504eb24e1 | ||
|
|
bdbef0bd0d | ||
|
|
e4e38ee4e6 | ||
|
|
021e892e33 | ||
|
|
c27d5022fd | ||
|
|
6730a5d625 | ||
|
|
32092f992d | ||
|
|
a5f0c8f6b5 | ||
|
|
85cd93e51a | ||
|
|
0b7e623748 | ||
|
|
62f250b43c | ||
|
|
25136349ff | ||
|
|
baeb047e27 | ||
|
|
56dd18b983 | ||
|
|
86cb70a94f | ||
|
|
9f76d37a82 | ||
|
|
a026ed9428 | ||
|
|
c178e2fbcc | ||
|
|
b88bb1dc87 | ||
|
|
3069e28224 | ||
|
|
d69b3af99b | ||
|
|
7398b7c6d0 | ||
|
|
5d57904d22 | ||
|
|
7daf352a25 | ||
|
|
6a49f6a534 | ||
|
|
5bce08683a | ||
|
|
edc60fc3d8 | ||
|
|
1361fd8a90 | ||
|
|
d539bb3dd9 | ||
|
|
3b9ae4f384 | ||
|
|
2783448de5 | ||
|
|
6e21ff08d5 | ||
|
|
e56278e4a6 | ||
|
|
fc9bf816dd | ||
|
|
854fd7df3a | ||
|
|
87dd564a12 | ||
|
|
2d389308ea | ||
|
|
ea8523be35 | ||
|
|
4479f0fab0 | ||
|
|
7a000318a6 | ||
|
|
9a08ae74b6 | ||
|
|
f3d2950df3 | ||
|
|
8cfba4a166 | ||
|
|
51e6bba2a7 | ||
|
|
ccbfa78070 | ||
|
|
69655f1936 | ||
|
|
6ea366cfed | ||
|
|
b7d17fb16d | ||
|
|
f3dc8c6344 | ||
|
|
69ec545854 | ||
|
|
65386ff731 | ||
|
|
01fa33e122 | ||
|
|
0411aa9aef | ||
|
|
4a5c890121 | ||
|
|
4c11fdc176 | ||
|
|
d99e7a45ea | ||
|
|
52528ff1b7 | ||
|
|
4a9317f3f4 | ||
|
|
9450dd5869 | ||
|
|
d5471e4828 | ||
|
|
2f71785add | ||
|
|
608f5030b2 | ||
|
|
dd8f3714ed | ||
|
|
abec2b3648 | ||
|
|
ea06a9f07d | ||
|
|
9f54759cc5 | ||
|
|
55dd5f9ed0 | ||
|
|
05455421fb | ||
|
|
af61067f08 | ||
|
|
19cda88248 | ||
|
|
0edb2738a1 | ||
|
|
e1bc364525 | ||
|
|
2925ee380d | ||
|
|
731edf5872 | ||
|
|
7b85039b17 | ||
|
|
2bc45fa574 | ||
|
|
d2b4455205 | ||
|
|
bce4a26197 | ||
|
|
1da5040d60 | ||
|
|
afd33e053b | ||
|
|
171d03c006 | ||
|
|
34d5237aaa | ||
|
|
037c3d6a05 | ||
|
|
5596ba634e | ||
|
|
a5f69065f4 | ||
|
|
969ef249ea | ||
|
|
a37183851f | ||
|
|
4cf3e1a769 | ||
|
|
354e5a2761 | ||
|
|
c9fd8cc2a7 | ||
|
|
bb19f752a1 | ||
|
|
6bd9c1055c | ||
|
|
dff77097c6 | ||
|
|
b4dc1c5661 | ||
|
|
992338d924 | ||
|
|
f88a402b0c | ||
|
|
5938d36149 | ||
|
|
78577db3f9 | ||
|
|
0b4a6b77e2 | ||
|
|
01084a8897 | ||
|
|
0f18a1979e | ||
|
|
68a615bc7b | ||
|
|
add1068c1a | ||
|
|
7a40df9965 | ||
|
|
3e6a1aa59a | ||
|
|
d3fe79cf39 | ||
|
|
48fa547c8f | ||
|
|
80e2f7df71 | ||
|
|
0107f1f58a | ||
|
|
d29c9a96f4 | ||
|
|
37d75c3281 | ||
|
|
666ded7b89 | ||
|
|
73a882f75e | ||
|
|
310f5f2349 | ||
|
|
8c86d6b696 | ||
|
|
82cd163adc | ||
|
|
802ee25621 | ||
|
|
f48ebb65ba | ||
|
|
aaa2a8ed2c | ||
|
|
5a06f5420b | ||
|
|
343f5a44f2 | ||
|
|
92125aee3a | ||
|
|
96f651b7ca | ||
|
|
06ea01e928 | ||
|
|
577f1e429a | ||
|
|
7808f64fe5 | ||
|
|
e6789e49e4 | ||
|
|
797619aece | ||
|
|
1b5363611d | ||
|
|
103f773286 | ||
|
|
d9ef0b587e | ||
|
|
d5b98256f0 | ||
|
|
efcceaa898 | ||
|
|
e4aad11965 | ||
|
|
47207fad52 | ||
|
|
202bf82896 | ||
|
|
0e3274a743 | ||
|
|
b06174926d | ||
|
|
abb23a3c02 | ||
|
|
0c8f232282 | ||
|
|
ef023d27bf | ||
|
|
7a591825eb | ||
|
|
e71c49d596 | ||
|
|
e6ce8995ba | ||
|
|
f6250b6d5b | ||
|
|
757eff2937 | ||
|
|
996a7f3ddf | ||
|
|
94c050bacb | ||
|
|
3f4aa59a29 | ||
|
|
bee7cf4278 | ||
|
|
b9db6f0b40 | ||
|
|
8967cba3c7 | ||
|
|
d04ad2eea9 | ||
|
|
f2d3880a06 | ||
|
|
ec5f70ecfc | ||
|
|
40b3fe7165 | ||
|
|
4095f1e946 | ||
|
|
e219fc47ba | ||
|
|
6e2e7a4af5 | ||
|
|
2e7f764d6c | ||
|
|
ce64de5b3d | ||
|
|
35ca1dd7ea | ||
|
|
8d0ad6b871 | ||
|
|
0aa4791cf7 | ||
|
|
082c2b46d0 | ||
|
|
50420f9052 | ||
|
|
499cbf8a60 | ||
|
|
2e38284d6e | ||
|
|
00cc3a11c6 | ||
|
|
9909a7f7b0 | ||
|
|
3363fca160 | ||
|
|
78e0b09c7a | ||
|
|
caa3ffc8f5 | ||
|
|
323fb6a5fe | ||
|
|
1adc5f1729 | ||
|
|
78079252c9 | ||
|
|
72fdabd099 | ||
|
|
64bd6aa055 | ||
|
|
6329200b84 | ||
|
|
3f3fd16110 | ||
|
|
34f0c4ac2d | ||
|
|
dde04d514e | ||
|
|
ffddadd798 | ||
|
|
5dca337b92 | ||
|
|
131df181e6 | ||
|
|
e207952786 | ||
|
|
3f7ef284fc | ||
|
|
1a41533d15 | ||
|
|
85f7bbbf1a | ||
|
|
ccc603b59f | ||
|
|
8135f99616 | ||
|
|
713f4ae18b | ||
|
|
f3f5d0bbd1 | ||
|
|
4a9e11c480 | ||
|
|
cd94326aad | ||
|
|
a4b971bba0 | ||
|
|
5d1609111c | ||
|
|
d54ccaf629 | ||
|
|
6adea240e2 | ||
|
|
3486d403d2 | ||
|
|
f533186c8d | ||
|
|
0beadf8e5a | ||
|
|
8bc06f0476 | ||
|
|
8fd8f74b27 | ||
|
|
9fc9b60de5 | ||
|
|
2a026726db | ||
|
|
f9a99f8b09 | ||
|
|
95b8dc765d | ||
|
|
052d6e25e7 | ||
|
|
fd82486bbc | ||
|
|
ef07f7555f | ||
|
|
67859b7be0 | ||
|
|
1e5ddadd00 | ||
|
|
7bab76d765 | ||
|
|
416f243bda | ||
|
|
77ad112f67 | ||
|
|
dc3d639824 | ||
|
|
13a001c258 | ||
|
|
85bdd97d48 | ||
|
|
3d9c8699e7 | ||
|
|
ea482dab48 | ||
|
|
96a41eb2cc | ||
|
|
e5dfb20aa2 | ||
|
|
fe308d35f2 | ||
|
|
219b90fc5d | ||
|
|
44e2ca07e5 | ||
|
|
79d684caae | ||
|
|
4db8734a34 | ||
|
|
8b7baf7f86 | ||
|
|
28145e876f | ||
|
|
53625cf87b | ||
|
|
88f9779dd0 | ||
|
|
561a44b26b | ||
|
|
26068aaf6f | ||
|
|
fb0f9dc608 | ||
|
|
6c44d38c10 | ||
|
|
da3ab02a8d | ||
|
|
9c7703eb2d | ||
|
|
84922794fb | ||
|
|
1dcce99d87 | ||
|
|
fd62aa469a | ||
|
|
63d307b95a | ||
|
|
9f12971eda | ||
|
|
47edd4f583 | ||
|
|
e94b7b23e4 | ||
|
|
5c77e6c56d | ||
|
|
522cbe0e6e | ||
|
|
f7061f360d | ||
|
|
16cdfa0426 | ||
|
|
74bd0c161f | ||
|
|
da595e1eb9 | ||
|
|
5277c0de7d | ||
|
|
b3c85e00f9 | ||
|
|
0748652a8d | ||
|
|
9fa0442b20 | ||
|
|
bc6920f829 | ||
|
|
d576a95548 | ||
|
|
99eca546d2 | ||
|
|
b5d0fc6d0d | ||
|
|
17b36f01b0 | ||
|
|
5a6d1c72fe | ||
|
|
030fade7b6 | ||
|
|
60177d5a8e | ||
|
|
a28fb72e36 | ||
|
|
5e15543bab | ||
|
|
e1365ed343 | ||
|
|
abb5d10a54 | ||
|
|
c58ca510cc | ||
|
|
781bad9573 | ||
|
|
7e94f42b10 | ||
|
|
0b8d752773 | ||
|
|
e6096b644f | ||
|
|
6b2c18ad75 | ||
|
|
8b5bc444f1 | ||
|
|
d2915fe30c | ||
|
|
b9522ade5d | ||
|
|
f6513a0cf3 | ||
|
|
d7ec4d087c | ||
|
|
25fca1ed56 | ||
|
|
b9822f2270 | ||
|
|
11d03cef0c | ||
|
|
1c9276b4a1 | ||
|
|
4f7cfb087a | ||
|
|
93768fb4d9 | ||
|
|
f6b6a8aa1b | ||
|
|
1be5862dc4 | ||
|
|
3e182db019 | ||
|
|
8ac1eba378 | ||
|
|
eca9ba7b82 | ||
|
|
6699c32f73 | ||
|
|
cadaeda3bf | ||
|
|
62acd38492 | ||
|
|
01c6c306b1 | ||
|
|
1de1b6e05f | ||
|
|
6f1fc314b6 | ||
|
|
d84ffcc2b7 | ||
|
|
f934890fac | ||
|
|
ebc1ab649e | ||
|
|
0738e51852 | ||
|
|
90d84f9316 | ||
|
|
fa10d5d4d5 | ||
|
|
8ed3eb24c3 | ||
|
|
c60fe13d71 | ||
|
|
59c8d456cb | ||
|
|
c0450f21b6 | ||
|
|
0e7dc67d9d | ||
|
|
f38b5261d5 | ||
|
|
8230d9cd9b | ||
|
|
24da0b79c2 | ||
|
|
1c6bb682ea | ||
|
|
9d2d96c52a | ||
|
|
e455785140 | ||
|
|
dabbe0b6e7 | ||
|
|
4c123ed0ec | ||
|
|
838795fd34 | ||
|
|
c398c714a3 | ||
|
|
8c5e4537a6 | ||
|
|
06b2163aaa | ||
|
|
cf492daa93 | ||
|
|
bddae046a0 | ||
|
|
2a0d4ef4dd | ||
|
|
8b3b645fbb | ||
|
|
c8096e3334 | ||
|
|
89d1d9c6c3 | ||
|
|
c2cd3b9c44 | ||
|
|
9654a4d8c9 | ||
|
|
9d0c583399 | ||
|
|
c59c822fbf | ||
|
|
2a257ec5b2 | ||
|
|
8ce6b53cd5 | ||
|
|
5ce44651bf | ||
|
|
dac0ef1507 | ||
|
|
57c39e9091 | ||
|
|
4f6d3cb10e | ||
|
|
4665d1d0ea | ||
|
|
89cfd5388f | ||
|
|
f41179965d | ||
|
|
f8f83c52a1 | ||
|
|
83b88039e4 | ||
|
|
23a7d8af23 | ||
|
|
b2ebd5ee94 | ||
|
|
f9284e9d8e | ||
|
|
0d8878abef | ||
|
|
0137309d3a | ||
|
|
4c329881a1 | ||
|
|
3b4a3fad5a | ||
|
|
bac1ce5b7a | ||
|
|
6113fd9986 | ||
|
|
ae2cfdafdd | ||
|
|
de3f7bff60 | ||
|
|
97dfcb4c04 | ||
|
|
1bb1b8704b | ||
|
|
918d998f4c | ||
|
|
24edbdd025 | ||
|
|
015a3b633a | ||
|
|
101d720f2a | ||
|
|
8b76eb3ccc | ||
|
|
1e8d2172bc | ||
|
|
8bc367ab48 | ||
|
|
73b484d894 | ||
|
|
5c0ee92d85 | ||
|
|
e67f568069 | ||
|
|
5845128479 | ||
|
|
6505f31ad5 | ||
|
|
30cc74c8eb | ||
|
|
eb0787c198 | ||
|
|
0f17aff8fd | ||
|
|
14a73e4010 | ||
|
|
0fd6a24f5a | ||
|
|
7eab688d9c | ||
|
|
562bacbe22 | ||
|
|
8b423310a6 | ||
|
|
7268ebab4a | ||
|
|
8191359953 | ||
|
|
c9fc9ffea5 | ||
|
|
1a78dada61 | ||
|
|
85cc4b4ecc | ||
|
|
fc6a8a0803 | ||
|
|
3d8cdaf46c | ||
|
|
0e7b0bc45c | ||
|
|
74fcfd7778 | ||
|
|
c9c745c730 | ||
|
|
dd994cb16d | ||
|
|
861ef3db31 | ||
|
|
f33bac012a | ||
|
|
4294632909 | ||
|
|
449ca74e44 | ||
|
|
52980f0b55 | ||
|
|
8e97dcda9c | ||
|
|
4ce810bdcd | ||
|
|
24a463b85b | ||
|
|
700d0194be | ||
|
|
34a8d48df9 | ||
|
|
8db028db1c |
@@ -0,0 +1,62 @@
|
|||||||
|
{
|
||||||
|
"projectName": "ecs-framework",
|
||||||
|
"projectOwner": "esengine",
|
||||||
|
"repoType": "github",
|
||||||
|
"repoHost": "https://github.com",
|
||||||
|
"files": ["README.md"],
|
||||||
|
"imageSize": 100,
|
||||||
|
"commit": true,
|
||||||
|
"commitConvention": "angular",
|
||||||
|
"contributors": [
|
||||||
|
{
|
||||||
|
"login": "yhh",
|
||||||
|
"name": "Frank Huang",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/145575?v=4",
|
||||||
|
"profile": "https://github.com/yhh",
|
||||||
|
"contributions": ["code"]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"contributorsPerLine": 7,
|
||||||
|
"contributorsSortAlphabetically": false,
|
||||||
|
"badgeTemplate": "[](#contributors)",
|
||||||
|
"contributorTemplate": "<a href=\"<%= contributor.profile %>\"><img src=\"<%= contributor.avatar_url %>\" width=\"<%= options.imageSize %>px;\" alt=\"<%= contributor.name %>\"/><br /><sub><b><%= contributor.name %></b></sub></a>",
|
||||||
|
"types": {
|
||||||
|
"code": {
|
||||||
|
"symbol": "💻",
|
||||||
|
"description": "Code",
|
||||||
|
"link": "[<%= symbol %>](<%= url %> \"Code\")"
|
||||||
|
},
|
||||||
|
"doc": {
|
||||||
|
"symbol": "📖",
|
||||||
|
"description": "Documentation",
|
||||||
|
"link": "[<%= symbol %>](<%= url %> \"Documentation\")"
|
||||||
|
},
|
||||||
|
"test": {
|
||||||
|
"symbol": "⚠️",
|
||||||
|
"description": "Tests",
|
||||||
|
"link": "[<%= symbol %>](<%= url %> \"Tests\")"
|
||||||
|
},
|
||||||
|
"bug": {
|
||||||
|
"symbol": "🐛",
|
||||||
|
"description": "Bug reports",
|
||||||
|
"link": "[<%= symbol %>](<%= url %> \"Bug reports\")"
|
||||||
|
},
|
||||||
|
"example": {
|
||||||
|
"symbol": "💡",
|
||||||
|
"description": "Examples",
|
||||||
|
"link": "[<%= symbol %>](<%= url %> \"Examples\")"
|
||||||
|
},
|
||||||
|
"design": {
|
||||||
|
"symbol": "🎨",
|
||||||
|
"description": "Design",
|
||||||
|
"link": "[<%= symbol %>](<%= url %> \"Design\")"
|
||||||
|
},
|
||||||
|
"ideas": {
|
||||||
|
"symbol": "🤔",
|
||||||
|
"description": "Ideas & Planning",
|
||||||
|
"link": "[<%= symbol %>](<%= url %> \"Ideas & Planning\")"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"skipCi": true
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
# CodeRabbit 配置文件
|
||||||
|
# https://docs.coderabbit.ai/configuration
|
||||||
|
|
||||||
|
language: "zh-CN" # 使用中文评论
|
||||||
|
reviews:
|
||||||
|
# 审查级别
|
||||||
|
profile: "chill" # "chill" 或 "strict" 或 "assertive"
|
||||||
|
|
||||||
|
# 自动审查设置
|
||||||
|
auto_review:
|
||||||
|
enabled: true
|
||||||
|
drafts: false # 草稿 PR 不自动审查
|
||||||
|
base_branches:
|
||||||
|
- master
|
||||||
|
- main
|
||||||
|
|
||||||
|
# 审查内容
|
||||||
|
request_changes_workflow: false # 不阻止 PR 合并
|
||||||
|
high_level_summary: true # 生成高层次摘要
|
||||||
|
poem: false # 不生成诗歌(可以改为 true 增加趣味)
|
||||||
|
review_status: true # 显示审查状态
|
||||||
|
|
||||||
|
# 忽略的文件
|
||||||
|
path_filters:
|
||||||
|
- "!**/*.md" # 不审查 markdown
|
||||||
|
- "!**/package-lock.json" # 不审查 lock 文件
|
||||||
|
- "!**/dist/**" # 不审查构建输出
|
||||||
|
- "!**/*.min.js" # 不审查压缩文件
|
||||||
|
|
||||||
|
# 聊天设置
|
||||||
|
chat:
|
||||||
|
auto_reply: true # 自动回复问题
|
||||||
|
|
||||||
|
# 提交建议
|
||||||
|
suggestions:
|
||||||
|
enabled: true # 启用代码建议
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"extends": ["@commitlint/config-conventional"],
|
||||||
|
"rules": {
|
||||||
|
"type-enum": [
|
||||||
|
2,
|
||||||
|
"always",
|
||||||
|
[
|
||||||
|
"feat",
|
||||||
|
"fix",
|
||||||
|
"docs",
|
||||||
|
"style",
|
||||||
|
"refactor",
|
||||||
|
"perf",
|
||||||
|
"test",
|
||||||
|
"build",
|
||||||
|
"ci",
|
||||||
|
"chore",
|
||||||
|
"revert"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"scope-enum": [
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"scope-empty": [0],
|
||||||
|
"subject-empty": [2, "never"],
|
||||||
|
"subject-case": [0],
|
||||||
|
"header-max-length": [2, "always", 100]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
# EditorConfig is awesome: https://EditorConfig.org
|
||||||
|
|
||||||
|
# top-most EditorConfig file
|
||||||
|
root = true
|
||||||
|
|
||||||
|
# 所有文件的默认设置
|
||||||
|
[*]
|
||||||
|
charset = utf-8
|
||||||
|
end_of_line = lf
|
||||||
|
insert_final_newline = true
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
|
||||||
|
# TypeScript/JavaScript 文件
|
||||||
|
[*.{ts,tsx,js,jsx,mjs,cjs}]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 4
|
||||||
|
|
||||||
|
# JSON 文件
|
||||||
|
[*.json]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
|
|
||||||
|
# YAML 文件
|
||||||
|
[*.{yml,yaml}]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
|
|
||||||
|
# Markdown 文件
|
||||||
|
[*.md]
|
||||||
|
trim_trailing_whitespace = false
|
||||||
|
indent_size = 2
|
||||||
|
|
||||||
|
# 包管理文件
|
||||||
|
[{package.json,package-lock.json,tsconfig.json}]
|
||||||
|
indent_size = 2
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"toolchains": [],
|
||||||
|
"backend.maxHeapSizeMb": 896
|
||||||
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
# 自动检测文本文件并规范化换行符
|
||||||
|
* text=auto
|
||||||
|
|
||||||
|
# 源代码文件强制使用 LF
|
||||||
|
*.ts text eol=lf
|
||||||
|
*.tsx text eol=lf
|
||||||
|
*.js text eol=lf
|
||||||
|
*.jsx text eol=lf
|
||||||
|
*.mjs text eol=lf
|
||||||
|
*.cjs text eol=lf
|
||||||
|
*.json text eol=lf
|
||||||
|
*.md text eol=lf
|
||||||
|
*.yml text eol=lf
|
||||||
|
*.yaml text eol=lf
|
||||||
|
|
||||||
|
# 配置文件强制使用 LF
|
||||||
|
.gitignore text eol=lf
|
||||||
|
.gitattributes text eol=lf
|
||||||
|
.editorconfig text eol=lf
|
||||||
|
.prettierrc text eol=lf
|
||||||
|
.prettierignore text eol=lf
|
||||||
|
.eslintrc.json text eol=lf
|
||||||
|
tsconfig.json text eol=lf
|
||||||
|
|
||||||
|
# Shell 脚本强制使用 LF
|
||||||
|
*.sh text eol=lf
|
||||||
|
|
||||||
|
# Windows 批处理文件使用 CRLF
|
||||||
|
*.bat text eol=crlf
|
||||||
|
*.cmd text eol=crlf
|
||||||
|
*.ps1 text eol=crlf
|
||||||
|
|
||||||
|
# 二进制文件不转换
|
||||||
|
*.png binary
|
||||||
|
*.jpg binary
|
||||||
|
*.jpeg binary
|
||||||
|
*.gif binary
|
||||||
|
*.ico binary
|
||||||
|
*.svg binary
|
||||||
|
*.woff binary
|
||||||
|
*.woff2 binary
|
||||||
|
*.ttf binary
|
||||||
|
*.eot binary
|
||||||
|
*.otf binary
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
# These are supported funding model platforms
|
||||||
|
|
||||||
|
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
||||||
|
patreon: esengine # Replace with a single Patreon username
|
||||||
|
open_collective: # Replace with a single Open Collective username
|
||||||
|
ko_fi: # Replace with a single Ko-fi username
|
||||||
|
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
||||||
|
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
||||||
|
liberapay: # Replace with a single Liberapay username
|
||||||
|
issuehunt: # Replace with a single IssueHunt username
|
||||||
|
otechie: # Replace with a single Otechie username
|
||||||
|
custom: ['https://github.com/esengine/esengine/blob/master/sponsor/alipay.jpg', 'https://github.com/esengine/esengine/blob/master/sponsor/wechatpay.png'] # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
|
||||||
@@ -0,0 +1,130 @@
|
|||||||
|
name: 🐛 Bug Report / 错误报告
|
||||||
|
description: Report a bug or issue / 报告一个错误或问题
|
||||||
|
title: "[Bug]: "
|
||||||
|
labels: ["bug"]
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
感谢你提交 Bug 报告!请填写以下信息帮助我们更快定位问题。
|
||||||
|
Thanks for reporting a bug! Please fill in the information below to help us locate the issue faster.
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: description
|
||||||
|
attributes:
|
||||||
|
label: 问题描述 / Bug Description
|
||||||
|
description: 清晰简洁地描述遇到的问题 / A clear and concise description of the bug
|
||||||
|
placeholder: 例如:当我创建超过1000个实体时,游戏卡顿严重...
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: reproduction
|
||||||
|
attributes:
|
||||||
|
label: 复现步骤 / Steps to Reproduce
|
||||||
|
description: 如何复现这个问题?/ How can we reproduce this issue?
|
||||||
|
placeholder: |
|
||||||
|
1. 创建场景
|
||||||
|
2. 添加 1000 个实体
|
||||||
|
3. 运行游戏
|
||||||
|
4. 观察卡顿
|
||||||
|
value: |
|
||||||
|
1.
|
||||||
|
2.
|
||||||
|
3.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: expected
|
||||||
|
attributes:
|
||||||
|
label: 期望行为 / Expected Behavior
|
||||||
|
description: 你期望发生什么?/ What did you expect to happen?
|
||||||
|
placeholder: 游戏应该流畅运行,FPS 保持在 60...
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: actual
|
||||||
|
attributes:
|
||||||
|
label: 实际行为 / Actual Behavior
|
||||||
|
description: 实际发生了什么?/ What actually happened?
|
||||||
|
placeholder: FPS 降到 20,游戏严重卡顿...
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: input
|
||||||
|
id: version
|
||||||
|
attributes:
|
||||||
|
label: 版本 / Version
|
||||||
|
description: 使用的 @esengine/ecs-framework 版本 / Version of @esengine/ecs-framework
|
||||||
|
placeholder: 例如 / e.g., 2.2.8
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: dropdown
|
||||||
|
id: platform
|
||||||
|
attributes:
|
||||||
|
label: 平台 / Platform
|
||||||
|
description: 在哪个平台遇到问题?/ Which platform did you encounter the issue?
|
||||||
|
multiple: true
|
||||||
|
options:
|
||||||
|
- Web / 浏览器
|
||||||
|
- Cocos Creator
|
||||||
|
- Laya Engine
|
||||||
|
- WeChat Mini Game / 微信小游戏
|
||||||
|
- Other / 其他
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: environment
|
||||||
|
attributes:
|
||||||
|
label: 环境信息 / Environment
|
||||||
|
description: |
|
||||||
|
相关环境信息 / Relevant environment information
|
||||||
|
例如:操作系统、浏览器版本、Node.js 版本等
|
||||||
|
placeholder: |
|
||||||
|
- OS: Windows 11
|
||||||
|
- Browser: Chrome 120
|
||||||
|
- Node.js: 20.10.0
|
||||||
|
value: |
|
||||||
|
- OS:
|
||||||
|
- Browser:
|
||||||
|
- Node.js:
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: code
|
||||||
|
attributes:
|
||||||
|
label: 代码示例 / Code Sample
|
||||||
|
description: 如果可能,提供最小可复现代码 / If possible, provide minimal reproducible code
|
||||||
|
render: typescript
|
||||||
|
placeholder: |
|
||||||
|
import { Core, Scene, Entity } from '@esengine/ecs-framework';
|
||||||
|
|
||||||
|
// 你的代码 / Your code here
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: logs
|
||||||
|
attributes:
|
||||||
|
label: 错误日志 / Error Logs
|
||||||
|
description: 相关的错误日志或截图 / Relevant error logs or screenshots
|
||||||
|
render: shell
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
|
||||||
|
- type: checkboxes
|
||||||
|
id: checklist
|
||||||
|
attributes:
|
||||||
|
label: 检查清单 / Checklist
|
||||||
|
options:
|
||||||
|
- label: 我已经搜索过类似的 issue / I have searched for similar issues
|
||||||
|
required: true
|
||||||
|
- label: 我使用的是最新版本 / I am using the latest version
|
||||||
|
required: false
|
||||||
|
- label: 我愿意提交 PR 修复此问题 / I am willing to submit a PR to fix this issue
|
||||||
|
required: false
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
blank_issues_enabled: true
|
||||||
|
contact_links:
|
||||||
|
- name: 📚 文档 / Documentation
|
||||||
|
url: https://esengine.github.io/ecs-framework/
|
||||||
|
about: 查看完整文档和教程 / View full documentation and tutorials
|
||||||
|
|
||||||
|
- name: 🤖 AI 文档助手 / AI Documentation Assistant
|
||||||
|
url: https://deepwiki.com/esengine/esengine
|
||||||
|
about: 使用 AI 助手快速找到答案 / Use AI assistant to quickly find answers
|
||||||
|
|
||||||
|
- name: 💬 QQ 交流群 / QQ Group
|
||||||
|
url: https://jq.qq.com/?_wv=1027&k=29w1Nud6
|
||||||
|
about: 加入社区交流群 / Join the community group
|
||||||
|
|
||||||
|
- name: 🌟 GitHub Discussions
|
||||||
|
url: https://github.com/esengine/esengine/discussions
|
||||||
|
about: 参与社区讨论 / Join community discussions
|
||||||
@@ -0,0 +1,90 @@
|
|||||||
|
name: ✨ Feature Request / 功能建议
|
||||||
|
description: Suggest a new feature or enhancement / 建议新功能或改进
|
||||||
|
title: "[Feature]: "
|
||||||
|
labels: ["enhancement"]
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
感谢你的功能建议!请详细描述你的想法。
|
||||||
|
Thanks for your feature suggestion! Please describe your idea in detail.
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: problem
|
||||||
|
attributes:
|
||||||
|
label: 问题描述 / Problem Description
|
||||||
|
description: 这个功能解决什么问题?/ What problem does this feature solve?
|
||||||
|
placeholder: 当我需要...的时候,现在很不方便,因为... / When I need to..., it's inconvenient because...
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: solution
|
||||||
|
attributes:
|
||||||
|
label: 建议的解决方案 / Proposed Solution
|
||||||
|
description: 你希望如何实现这个功能?/ How would you like this feature to work?
|
||||||
|
placeholder: 可以添加一个新的 API,例如... / Could add a new API, for example...
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: alternatives
|
||||||
|
attributes:
|
||||||
|
label: 其他方案 / Alternatives
|
||||||
|
description: 你考虑过哪些替代方案?/ What alternatives have you considered?
|
||||||
|
placeholder: 也可以通过...来实现,但是... / Could also achieve this by..., but...
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: examples
|
||||||
|
attributes:
|
||||||
|
label: 使用示例 / Usage Example
|
||||||
|
description: 展示这个功能如何使用 / Show how this feature would be used
|
||||||
|
render: typescript
|
||||||
|
placeholder: |
|
||||||
|
// 理想的 API 设计 / Ideal API design
|
||||||
|
const pool = new ComponentPool(MyComponent, { size: 100 });
|
||||||
|
const component = pool.acquire();
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
|
||||||
|
- type: dropdown
|
||||||
|
id: scope
|
||||||
|
attributes:
|
||||||
|
label: 影响范围 / Scope
|
||||||
|
description: 这个功能主要影响哪个部分?/ Which part does this feature mainly affect?
|
||||||
|
options:
|
||||||
|
- Core / 核心框架
|
||||||
|
- Performance / 性能
|
||||||
|
- API Design / API 设计
|
||||||
|
- Developer Experience / 开发体验
|
||||||
|
- Documentation / 文档
|
||||||
|
- Editor / 编辑器
|
||||||
|
- Other / 其他
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: dropdown
|
||||||
|
id: priority
|
||||||
|
attributes:
|
||||||
|
label: 优先级 / Priority
|
||||||
|
description: 你认为这个功能有多重要?/ How important do you think this feature is?
|
||||||
|
options:
|
||||||
|
- High / 高 - 非常需要这个功能
|
||||||
|
- Medium / 中 - 有会更好
|
||||||
|
- Low / 低 - 可有可无
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: checkboxes
|
||||||
|
id: checklist
|
||||||
|
attributes:
|
||||||
|
label: 检查清单 / Checklist
|
||||||
|
options:
|
||||||
|
- label: 我已经搜索过类似的功能请求 / I have searched for similar feature requests
|
||||||
|
required: true
|
||||||
|
- label: 这个功能不会破坏现有 API / This feature won't break existing APIs
|
||||||
|
required: false
|
||||||
|
- label: 我愿意提交 PR 实现此功能 / I am willing to submit a PR to implement this feature
|
||||||
|
required: false
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
name: ❓ Question / 问题咨询
|
||||||
|
description: Ask a question about using the framework / 询问框架使用问题
|
||||||
|
title: "[Question]: "
|
||||||
|
labels: ["question"]
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
💡 提示:如果是简单问题,可以先查看:
|
||||||
|
- [📚 文档](https://esengine.github.io/ecs-framework/)
|
||||||
|
- [📖 AI 文档助手](https://deepwiki.com/esengine/esengine)
|
||||||
|
- [💬 QQ 交流群](https://jq.qq.com/?_wv=1027&k=29w1Nud6)
|
||||||
|
|
||||||
|
💡 Tip: For simple questions, please check first:
|
||||||
|
- [📚 Documentation](https://esengine.github.io/ecs-framework/)
|
||||||
|
- [📖 AI Documentation](https://deepwiki.com/esengine/esengine)
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: question
|
||||||
|
attributes:
|
||||||
|
label: 你的问题 / Your Question
|
||||||
|
description: 清晰描述你的问题 / Describe your question clearly
|
||||||
|
placeholder: 如何在 Cocos Creator 中使用 ECS Framework?
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: context
|
||||||
|
attributes:
|
||||||
|
label: 背景信息 / Context
|
||||||
|
description: 提供更多上下文帮助理解问题 / Provide more context to help understand
|
||||||
|
placeholder: |
|
||||||
|
我正在开发一个多人在线游戏...
|
||||||
|
我尝试过...但是...
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: code
|
||||||
|
attributes:
|
||||||
|
label: 相关代码 / Related Code
|
||||||
|
description: 如果适用,提供相关代码片段 / If applicable, provide relevant code snippet
|
||||||
|
render: typescript
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
|
||||||
|
- type: input
|
||||||
|
id: version
|
||||||
|
attributes:
|
||||||
|
label: 版本 / Version
|
||||||
|
description: 使用的框架版本 / Framework version you're using
|
||||||
|
placeholder: 例如 / e.g., 2.2.8
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
|
||||||
|
- type: checkboxes
|
||||||
|
id: checklist
|
||||||
|
attributes:
|
||||||
|
label: 检查清单 / Checklist
|
||||||
|
options:
|
||||||
|
- label: 我已经查看过文档 / I have checked the documentation
|
||||||
|
required: true
|
||||||
|
- label: 我已经搜索过类似问题 / I have searched for similar questions
|
||||||
|
required: true
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
name: "CodeQL Config"
|
||||||
|
|
||||||
|
# Paths to exclude from analysis
|
||||||
|
paths-ignore:
|
||||||
|
- thirdparty
|
||||||
|
- "**/node_modules"
|
||||||
|
- "**/dist"
|
||||||
|
- "**/bin"
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
# 自动标签配置
|
||||||
|
# 根据 issue/PR 内容自动打标签
|
||||||
|
|
||||||
|
'bug':
|
||||||
|
- '/(bug|错误|崩溃|crash|error|exception|问题)/i'
|
||||||
|
|
||||||
|
'enhancement':
|
||||||
|
- '/(feature|功能|enhancement|improve|优化|建议)/i'
|
||||||
|
|
||||||
|
'documentation':
|
||||||
|
- '/(doc|文档|readme|guide|tutorial|教程)/i'
|
||||||
|
|
||||||
|
'question':
|
||||||
|
- '/(question|疑问|how to|如何|怎么)/i'
|
||||||
|
|
||||||
|
'performance':
|
||||||
|
- '/(performance|性能|slow|慢|lag|卡顿|optimize)/i'
|
||||||
|
|
||||||
|
'core':
|
||||||
|
- '/(@esengine\/ecs-framework|packages\/core|core package)/i'
|
||||||
|
|
||||||
|
'editor':
|
||||||
|
- '/(editor|编辑器|tauri)/i'
|
||||||
|
|
||||||
|
'network':
|
||||||
|
- '/(network|网络|multiplayer|多人)/i'
|
||||||
|
|
||||||
|
'help wanted':
|
||||||
|
- '/(help wanted|需要帮助|求助)/i'
|
||||||
|
|
||||||
|
'good first issue':
|
||||||
|
- '/(good first issue|新手友好|beginner)/i'
|
||||||
@@ -0,0 +1,95 @@
|
|||||||
|
# GitHub Labels 配置
|
||||||
|
# 可以使用 https://github.com/Financial-Times/github-label-sync 来同步标签
|
||||||
|
|
||||||
|
# Size Labels (PR 大小)
|
||||||
|
- name: 'size/XS'
|
||||||
|
color: '00ff00'
|
||||||
|
description: '极小的改动 (< 10 行)'
|
||||||
|
|
||||||
|
- name: 'size/S'
|
||||||
|
color: '00ff00'
|
||||||
|
description: '小改动 (10-100 行)'
|
||||||
|
|
||||||
|
- name: 'size/M'
|
||||||
|
color: 'ffff00'
|
||||||
|
description: '中等改动 (100-500 行)'
|
||||||
|
|
||||||
|
- name: 'size/L'
|
||||||
|
color: 'ff9900'
|
||||||
|
description: '大改动 (500-1000 行)'
|
||||||
|
|
||||||
|
- name: 'size/XL'
|
||||||
|
color: 'ff0000'
|
||||||
|
description: '超大改动 (> 1000 行)'
|
||||||
|
|
||||||
|
# Type Labels
|
||||||
|
- name: 'bug'
|
||||||
|
color: 'd73a4a'
|
||||||
|
description: '错误或问题'
|
||||||
|
|
||||||
|
- name: 'enhancement'
|
||||||
|
color: 'a2eeef'
|
||||||
|
description: '新功能或改进'
|
||||||
|
|
||||||
|
- name: 'documentation'
|
||||||
|
color: '0075ca'
|
||||||
|
description: '文档相关'
|
||||||
|
|
||||||
|
- name: 'question'
|
||||||
|
color: 'd876e3'
|
||||||
|
description: '问题咨询'
|
||||||
|
|
||||||
|
- name: 'performance'
|
||||||
|
color: 'ff6b6b'
|
||||||
|
description: '性能相关'
|
||||||
|
|
||||||
|
# Scope Labels
|
||||||
|
- name: 'core'
|
||||||
|
color: '5319e7'
|
||||||
|
description: '核心包相关'
|
||||||
|
|
||||||
|
- name: 'editor'
|
||||||
|
color: '5319e7'
|
||||||
|
description: '编辑器相关'
|
||||||
|
|
||||||
|
- name: 'network'
|
||||||
|
color: '5319e7'
|
||||||
|
description: '网络相关'
|
||||||
|
|
||||||
|
# Status Labels
|
||||||
|
- name: 'stale'
|
||||||
|
color: 'ededed'
|
||||||
|
description: '长时间无活动'
|
||||||
|
|
||||||
|
- name: 'wip'
|
||||||
|
color: 'fbca04'
|
||||||
|
description: '进行中'
|
||||||
|
|
||||||
|
- name: 'help wanted'
|
||||||
|
color: '008672'
|
||||||
|
description: '需要帮助'
|
||||||
|
|
||||||
|
- name: 'good first issue'
|
||||||
|
color: '7057ff'
|
||||||
|
description: '适合新手'
|
||||||
|
|
||||||
|
- name: 'quick-review'
|
||||||
|
color: '00ff00'
|
||||||
|
description: '小改动,快速 Review'
|
||||||
|
|
||||||
|
- name: 'automerge'
|
||||||
|
color: 'bfdadc'
|
||||||
|
description: '自动合并'
|
||||||
|
|
||||||
|
- name: 'pinned'
|
||||||
|
color: 'c2e0c6'
|
||||||
|
description: '置顶,不会被标记为 stale'
|
||||||
|
|
||||||
|
- name: 'security'
|
||||||
|
color: 'ee0701'
|
||||||
|
description: '安全相关,高优先级'
|
||||||
|
|
||||||
|
# Dependencies
|
||||||
|
- name: 'dependencies'
|
||||||
|
color: '0366d6'
|
||||||
|
description: '依赖更新'
|
||||||
@@ -0,0 +1,73 @@
|
|||||||
|
name: AI Batch Analyze Issues
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
mode:
|
||||||
|
description: '分析模式'
|
||||||
|
required: true
|
||||||
|
type: choice
|
||||||
|
options:
|
||||||
|
- 'recent' # 最近 10 个 issue
|
||||||
|
- 'open' # 所有打开的 issue
|
||||||
|
- 'all' # 所有 issue(慎用)
|
||||||
|
default: 'recent'
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
analyze:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Setup Node.js
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: '20.x'
|
||||||
|
|
||||||
|
- name: Install GitHub CLI
|
||||||
|
run: |
|
||||||
|
gh --version || (curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg
|
||||||
|
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install gh)
|
||||||
|
|
||||||
|
- name: Batch Analyze Issues
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
run: |
|
||||||
|
MODE="${{ github.event.inputs.mode }}"
|
||||||
|
|
||||||
|
# 获取 issue 列表
|
||||||
|
if [ "$MODE" = "recent" ]; then
|
||||||
|
echo "📊 分析最近 10 个 issue..."
|
||||||
|
ISSUES=$(gh issue list --limit 10 --json number --jq '.[].number')
|
||||||
|
elif [ "$MODE" = "open" ]; then
|
||||||
|
echo "📊 分析所有打开的 issue..."
|
||||||
|
ISSUES=$(gh issue list --state open --json number --jq '.[].number')
|
||||||
|
else
|
||||||
|
echo "📊 分析所有 issue(这可能需要很长时间)..."
|
||||||
|
ISSUES=$(gh issue list --state all --limit 100 --json number --jq '.[].number')
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 为每个 issue 添加 AI 分析评论
|
||||||
|
for issue_num in $ISSUES; do
|
||||||
|
echo "🤖 分析 Issue #$issue_num..."
|
||||||
|
|
||||||
|
# 获取 issue 内容
|
||||||
|
ISSUE_BODY=$(gh issue view $issue_num --json body --jq '.body')
|
||||||
|
ISSUE_TITLE=$(gh issue view $issue_num --json title --jq '.title')
|
||||||
|
|
||||||
|
# 添加触发评论
|
||||||
|
gh issue comment $issue_num --body "@ai-helper 请帮我分析这个 issue" || true
|
||||||
|
|
||||||
|
# 避免 API 限制
|
||||||
|
sleep 2
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "✅ 批量分析完成!"
|
||||||
|
echo "查看结果:https://github.com/${{ github.repository }}/issues"
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
name: AI Helper Tip
|
||||||
|
|
||||||
|
# 对所有新创建的 issue 自动回复 AI 助手使用说明(新老用户都适用)
|
||||||
|
on:
|
||||||
|
issues:
|
||||||
|
types: [opened]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
tip:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Post AI Helper Usage Tip
|
||||||
|
uses: actions/github-script@v7
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
const message = [
|
||||||
|
"## 🤖 AI 助手可用 | AI Helper Available",
|
||||||
|
"",
|
||||||
|
"**中文说明:**",
|
||||||
|
"",
|
||||||
|
"本项目配备了 AI 智能助手,可以帮助你快速获得解答!",
|
||||||
|
"",
|
||||||
|
"**使用方法:** 在评论中提及 `@ai-helper`,AI 会自动搜索项目代码并提供解决方案。",
|
||||||
|
"",
|
||||||
|
"**示例:**",
|
||||||
|
"```",
|
||||||
|
"@ai-helper 如何创建一个新的 System?",
|
||||||
|
"@ai-helper 这个报错是什么原因?",
|
||||||
|
"```",
|
||||||
|
"",
|
||||||
|
"---",
|
||||||
|
"",
|
||||||
|
"**English:**",
|
||||||
|
"",
|
||||||
|
"This project has an AI assistant to help you get answers quickly!",
|
||||||
|
"",
|
||||||
|
"**How to use:** Mention `@ai-helper` in a comment, and AI will automatically search the codebase and provide solutions.",
|
||||||
|
"",
|
||||||
|
"**Examples:**",
|
||||||
|
"```",
|
||||||
|
"@ai-helper How do I create a new System?",
|
||||||
|
"@ai-helper What causes this error?",
|
||||||
|
"```",
|
||||||
|
"",
|
||||||
|
"---",
|
||||||
|
"",
|
||||||
|
"💡 *AI 助手基于代码库提供建议,复杂问题建议等待维护者回复*",
|
||||||
|
"💡 *AI suggestions are based on the codebase. For complex issues, please wait for maintainer responses*"
|
||||||
|
].join('\n');
|
||||||
|
|
||||||
|
await github.rest.issues.createComment({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
issue_number: context.issue.number,
|
||||||
|
body: message
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('✅ AI helper tip posted successfully');
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
name: AI Issue Helper
|
||||||
|
|
||||||
|
on:
|
||||||
|
issue_comment:
|
||||||
|
types: [created]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
contents: read
|
||||||
|
models: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
ai-helper:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
# 只在真实用户提到 @ai-helper 时触发,忽略机器人评论
|
||||||
|
if: |
|
||||||
|
contains(github.event.comment.body, '@ai-helper') &&
|
||||||
|
github.event.comment.user.type != 'Bot'
|
||||||
|
steps:
|
||||||
|
- name: Checkout Repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Get Issue Details
|
||||||
|
id: issue
|
||||||
|
uses: actions/github-script@v7
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
const issue = await github.rest.issues.get({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
issue_number: context.issue.number
|
||||||
|
});
|
||||||
|
|
||||||
|
// 限制长度,避免超过 token 限制
|
||||||
|
const maxLength = 1000;
|
||||||
|
const truncate = (str, max) => {
|
||||||
|
if (!str) return '';
|
||||||
|
return str.length > max ? str.substring(0, max) + '...[内容过长已截断]' : str;
|
||||||
|
};
|
||||||
|
|
||||||
|
core.exportVariable('ISSUE_TITLE', truncate(issue.data.title || '', 200));
|
||||||
|
core.exportVariable('ISSUE_BODY', truncate(issue.data.body || '', maxLength));
|
||||||
|
core.exportVariable('COMMENT_BODY', truncate(context.payload.comment.body || '', 500));
|
||||||
|
core.exportVariable('ISSUE_NUMBER', context.issue.number);
|
||||||
|
|
||||||
|
- name: Create Prompt
|
||||||
|
id: prompt
|
||||||
|
run: |
|
||||||
|
cat > prompt.txt << 'PROMPT_EOF'
|
||||||
|
Issue #${{ env.ISSUE_NUMBER }}
|
||||||
|
|
||||||
|
标题: ${{ env.ISSUE_TITLE }}
|
||||||
|
|
||||||
|
内容: ${{ env.ISSUE_BODY }}
|
||||||
|
|
||||||
|
评论: ${{ env.COMMENT_BODY }}
|
||||||
|
|
||||||
|
请搜索项目代码并提供解决方案。
|
||||||
|
PROMPT_EOF
|
||||||
|
|
||||||
|
- name: AI Analysis
|
||||||
|
uses: actions/ai-inference@v1
|
||||||
|
id: ai
|
||||||
|
with:
|
||||||
|
model: 'gpt-4o'
|
||||||
|
enable-github-mcp: true
|
||||||
|
max-tokens: 1500
|
||||||
|
system-prompt: |
|
||||||
|
你是 ECS Framework (TypeScript ECS 框架) 的 AI 助手。
|
||||||
|
主要代码在 packages/core/src。
|
||||||
|
搜索相关代码后,用中文简洁回答问题,包含问题分析、解决方案和代码引用。
|
||||||
|
prompt-file: prompt.txt
|
||||||
|
|
||||||
|
- name: Post AI Response
|
||||||
|
env:
|
||||||
|
AI_RESPONSE: ${{ steps.ai.outputs.response }}
|
||||||
|
uses: actions/github-script@v7
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
await github.rest.issues.createComment({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
issue_number: context.issue.number,
|
||||||
|
body: process.env.AI_RESPONSE
|
||||||
|
});
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
name: AI Issue Moderator
|
||||||
|
|
||||||
|
on:
|
||||||
|
issues:
|
||||||
|
types: [opened]
|
||||||
|
issue_comment:
|
||||||
|
types: [created]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
contents: read
|
||||||
|
models: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
moderate:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Check Content
|
||||||
|
uses: actions/ai-inference@v1
|
||||||
|
id: check
|
||||||
|
with:
|
||||||
|
model: 'gpt-4o-mini'
|
||||||
|
system-prompt: |
|
||||||
|
你是一个内容审查助手。
|
||||||
|
检查内容是否包含:
|
||||||
|
1. 垃圾信息或广告
|
||||||
|
2. 恶意或攻击性内容
|
||||||
|
3. 与项目完全无关的内容
|
||||||
|
|
||||||
|
只返回 "SPAM" 或 "OK",不要其他内容。
|
||||||
|
prompt: |
|
||||||
|
标题:${{ github.event.issue.title || github.event.comment.body }}
|
||||||
|
|
||||||
|
内容:
|
||||||
|
${{ github.event.issue.body || github.event.comment.body }}
|
||||||
|
|
||||||
|
- name: Mark as Spam
|
||||||
|
if: contains(steps.check.outputs.response, 'SPAM')
|
||||||
|
uses: actions/github-script@v7
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
// 添加 spam 标签
|
||||||
|
github.rest.issues.addLabels({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
issue_number: context.issue.number,
|
||||||
|
labels: ['spam']
|
||||||
|
});
|
||||||
|
|
||||||
|
// 添加评论
|
||||||
|
github.rest.issues.createComment({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
issue_number: context.issue.number,
|
||||||
|
body: '🤖 这个内容被 AI 检测为可能的垃圾内容。如果这是误判,请联系维护者。\n\n🤖 This content was detected as potential spam by AI. If this is a false positive, please contact the maintainers.'
|
||||||
|
});
|
||||||
@@ -0,0 +1,160 @@
|
|||||||
|
name: Batch Label Issues
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
mode:
|
||||||
|
description: '标签模式'
|
||||||
|
required: true
|
||||||
|
type: choice
|
||||||
|
options:
|
||||||
|
- 'recent' # 最近 20 个 issue
|
||||||
|
- 'open' # 所有打开的 issue
|
||||||
|
- 'unlabeled' # 只处理没有标签的 issue
|
||||||
|
- 'all' # 所有 issue(慎用)
|
||||||
|
default: 'recent'
|
||||||
|
|
||||||
|
skip_labeled:
|
||||||
|
description: '跳过已有标签的 issue'
|
||||||
|
required: false
|
||||||
|
type: boolean
|
||||||
|
default: true
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
batch-label:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Setup Node.js
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: '20.x'
|
||||||
|
|
||||||
|
- name: Batch Label Issues
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
run: |
|
||||||
|
MODE="${{ github.event.inputs.mode }}"
|
||||||
|
SKIP_LABELED="${{ github.event.inputs.skip_labeled }}"
|
||||||
|
|
||||||
|
echo "📊 开始批量打标签..."
|
||||||
|
echo "模式: $MODE"
|
||||||
|
echo "跳过已标签: $SKIP_LABELED"
|
||||||
|
|
||||||
|
# 获取 issue 列表
|
||||||
|
if [ "$MODE" = "recent" ]; then
|
||||||
|
echo "📋 获取最近 20 个 issue..."
|
||||||
|
ISSUES=$(gh issue list --limit 20 --json number,labels,title,body --jq '.[] | {number, labels: [.labels[].name], title, body}')
|
||||||
|
elif [ "$MODE" = "open" ]; then
|
||||||
|
echo "📋 获取所有打开的 issue..."
|
||||||
|
ISSUES=$(gh issue list --state open --json number,labels,title,body --jq '.[] | {number, labels: [.labels[].name], title, body}')
|
||||||
|
elif [ "$MODE" = "unlabeled" ]; then
|
||||||
|
echo "📋 获取没有标签的 issue..."
|
||||||
|
ISSUES=$(gh issue list --state all --json number,labels,title,body --jq '.[] | select(.labels | length == 0) | {number, labels: [.labels[].name], title, body}')
|
||||||
|
else
|
||||||
|
echo "📋 获取所有 issue(限制 100 个)..."
|
||||||
|
ISSUES=$(gh issue list --state all --limit 100 --json number,labels,title,body --jq '.[] | {number, labels: [.labels[].name], title, body}')
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 临时文件
|
||||||
|
echo "$ISSUES" > /tmp/issues.json
|
||||||
|
|
||||||
|
# 处理每个 issue
|
||||||
|
cat /tmp/issues.json | jq -c '.' | while read -r issue; do
|
||||||
|
ISSUE_NUM=$(echo "$issue" | jq -r '.number')
|
||||||
|
EXISTING_LABELS=$(echo "$issue" | jq -r '.labels | join(",")')
|
||||||
|
TITLE=$(echo "$issue" | jq -r '.title')
|
||||||
|
BODY=$(echo "$issue" | jq -r '.body')
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "🔍 处理 Issue #$ISSUE_NUM: $TITLE"
|
||||||
|
echo " 现有标签: $EXISTING_LABELS"
|
||||||
|
|
||||||
|
# 跳过已有标签的 issue
|
||||||
|
if [ "$SKIP_LABELED" = "true" ] && [ ! -z "$EXISTING_LABELS" ]; then
|
||||||
|
echo " ⏭️ 跳过(已有标签)"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 分析内容并打标签
|
||||||
|
LABELS_TO_ADD=""
|
||||||
|
|
||||||
|
# 检测 bug
|
||||||
|
if echo "$TITLE $BODY" | grep -iE "(bug|错误|崩溃|crash|error|exception|问题|fix)" > /dev/null; then
|
||||||
|
LABELS_TO_ADD="$LABELS_TO_ADD bug"
|
||||||
|
echo " 🐛 检测到: bug"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 检测 feature request
|
||||||
|
if echo "$TITLE $BODY" | grep -iE "(feature|功能|enhancement|improve|优化|建议|新增|添加|add)" > /dev/null; then
|
||||||
|
LABELS_TO_ADD="$LABELS_TO_ADD enhancement"
|
||||||
|
echo " ✨ 检测到: enhancement"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 检测 question
|
||||||
|
if echo "$TITLE $BODY" | grep -iE "(question|疑问|how to|如何|怎么|为什么|why|咨询|\?|?)" > /dev/null; then
|
||||||
|
LABELS_TO_ADD="$LABELS_TO_ADD question"
|
||||||
|
echo " ❓ 检测到: question"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 检测 documentation
|
||||||
|
if echo "$TITLE $BODY" | grep -iE "(doc|文档|readme|guide|tutorial|教程|说明)" > /dev/null; then
|
||||||
|
LABELS_TO_ADD="$LABELS_TO_ADD documentation"
|
||||||
|
echo " 📖 检测到: documentation"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 检测 performance
|
||||||
|
if echo "$TITLE $BODY" | grep -iE "(performance|性能|slow|慢|lag|卡顿|optimize|优化)" > /dev/null; then
|
||||||
|
LABELS_TO_ADD="$LABELS_TO_ADD performance"
|
||||||
|
echo " ⚡ 检测到: performance"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 检测 core
|
||||||
|
if echo "$TITLE $BODY" | grep -iE "(@esengine/ecs-framework|packages/core|core package|核心包)" > /dev/null; then
|
||||||
|
LABELS_TO_ADD="$LABELS_TO_ADD core"
|
||||||
|
echo " 🎯 检测到: core"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 检测 editor
|
||||||
|
if echo "$TITLE $BODY" | grep -iE "(editor|编辑器|tauri)" > /dev/null; then
|
||||||
|
LABELS_TO_ADD="$LABELS_TO_ADD editor"
|
||||||
|
echo " 🎨 检测到: editor"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 检测 network
|
||||||
|
if echo "$TITLE $BODY" | grep -iE "(network|网络|multiplayer|多人|同步)" > /dev/null; then
|
||||||
|
LABELS_TO_ADD="$LABELS_TO_ADD network"
|
||||||
|
echo " 🌐 检测到: network"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 检测 help wanted
|
||||||
|
if echo "$TITLE $BODY" | grep -iE "(help wanted|需要帮助|求助)" > /dev/null; then
|
||||||
|
LABELS_TO_ADD="$LABELS_TO_ADD help wanted"
|
||||||
|
echo " 🆘 检测到: help wanted"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 添加标签
|
||||||
|
if [ ! -z "$LABELS_TO_ADD" ]; then
|
||||||
|
echo " ✅ 添加标签: $LABELS_TO_ADD"
|
||||||
|
for label in $LABELS_TO_ADD; do
|
||||||
|
gh issue edit $ISSUE_NUM --add-label "$label" 2>&1 | grep -v "already exists" || true
|
||||||
|
done
|
||||||
|
echo " 💬 添加说明评论..."
|
||||||
|
gh issue comment $ISSUE_NUM --body $'🤖 自动标签系统检测到此 issue 并添加了相关标签。如有误判,请告知维护者。\n\n🤖 Auto-labeling system detected and labeled this issue. Please let maintainers know if this is incorrect.' || true
|
||||||
|
else
|
||||||
|
echo " ℹ️ 未检测到明确类型"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 避免 API 限制
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "✅ 批量标签完成!"
|
||||||
|
echo "查看结果: https://github.com/${{ github.repository }}/issues"
|
||||||
@@ -0,0 +1,125 @@
|
|||||||
|
name: CI
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ master, main, develop ]
|
||||||
|
paths:
|
||||||
|
- 'packages/**'
|
||||||
|
- 'package.json'
|
||||||
|
- 'pnpm-lock.yaml'
|
||||||
|
- 'tsconfig.json'
|
||||||
|
- 'turbo.json'
|
||||||
|
- 'jest.config.*'
|
||||||
|
- '.github/workflows/ci.yml'
|
||||||
|
pull_request:
|
||||||
|
branches: [ master, main, develop ]
|
||||||
|
paths:
|
||||||
|
- 'packages/**'
|
||||||
|
- 'package.json'
|
||||||
|
- 'pnpm-lock.yaml'
|
||||||
|
- 'tsconfig.json'
|
||||||
|
- 'turbo.json'
|
||||||
|
- 'jest.config.*'
|
||||||
|
- '.github/workflows/ci.yml'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
ci:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install pnpm
|
||||||
|
uses: pnpm/action-setup@v4
|
||||||
|
|
||||||
|
- name: Setup Node.js
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: '20.x'
|
||||||
|
cache: 'pnpm'
|
||||||
|
|
||||||
|
- name: Install Rust stable
|
||||||
|
uses: dtolnay/rust-toolchain@stable
|
||||||
|
with:
|
||||||
|
targets: wasm32-unknown-unknown
|
||||||
|
|
||||||
|
# 缓存 Rust 编译结果
|
||||||
|
- name: Cache Rust dependencies
|
||||||
|
uses: Swatinem/rust-cache@v2
|
||||||
|
with:
|
||||||
|
workspaces: packages/engine
|
||||||
|
cache-on-failure: true
|
||||||
|
|
||||||
|
# 缓存 wasm-pack
|
||||||
|
- name: Cache wasm-pack
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: ~/.cargo/bin/wasm-pack
|
||||||
|
key: wasm-pack-${{ runner.os }}
|
||||||
|
|
||||||
|
- name: Install wasm-pack
|
||||||
|
run: |
|
||||||
|
if ! command -v wasm-pack &> /dev/null; then
|
||||||
|
cargo install wasm-pack
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: pnpm install --no-frozen-lockfile
|
||||||
|
|
||||||
|
# 缓存 Turbo
|
||||||
|
- name: Cache Turbo
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: .turbo
|
||||||
|
key: turbo-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}-${{ github.sha }}
|
||||||
|
restore-keys: |
|
||||||
|
turbo-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}-
|
||||||
|
turbo-${{ runner.os }}-
|
||||||
|
|
||||||
|
# 构建所有包
|
||||||
|
- name: Build all packages
|
||||||
|
run: pnpm run build
|
||||||
|
|
||||||
|
- name: Copy WASM files to ecs-engine-bindgen
|
||||||
|
run: |
|
||||||
|
mkdir -p packages/ecs-engine-bindgen/src/wasm
|
||||||
|
cp packages/engine/pkg/es_engine.js packages/ecs-engine-bindgen/src/wasm/
|
||||||
|
cp packages/engine/pkg/es_engine.d.ts packages/ecs-engine-bindgen/src/wasm/
|
||||||
|
cp packages/engine/pkg/es_engine_bg.wasm packages/ecs-engine-bindgen/src/wasm/
|
||||||
|
cp packages/engine/pkg/es_engine_bg.wasm.d.ts packages/ecs-engine-bindgen/src/wasm/
|
||||||
|
|
||||||
|
# 类型检查
|
||||||
|
- name: Type check
|
||||||
|
run: pnpm run type-check
|
||||||
|
|
||||||
|
# Lint 检查
|
||||||
|
- name: Lint check
|
||||||
|
run: pnpm run lint
|
||||||
|
|
||||||
|
# 测试
|
||||||
|
- name: Run tests with coverage
|
||||||
|
run: pnpm run test:ci
|
||||||
|
|
||||||
|
- name: Upload coverage to Codecov
|
||||||
|
uses: codecov/codecov-action@v4
|
||||||
|
continue-on-error: true
|
||||||
|
with:
|
||||||
|
file: ./coverage/lcov.info
|
||||||
|
flags: unittests
|
||||||
|
name: codecov-umbrella
|
||||||
|
fail_ci_if_error: false
|
||||||
|
|
||||||
|
# 构建 npm 包
|
||||||
|
- name: Build npm packages
|
||||||
|
run: pnpm run build:npm
|
||||||
|
|
||||||
|
# 上传构建产物
|
||||||
|
- name: Upload build artifacts
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: build-artifacts
|
||||||
|
path: |
|
||||||
|
packages/*/dist/
|
||||||
|
packages/*/bin/
|
||||||
|
retention-days: 7
|
||||||
@@ -0,0 +1,146 @@
|
|||||||
|
name: Cleanup Old Dependabot PRs
|
||||||
|
|
||||||
|
# 手动触发的 workflow,用于清理堆积的 Dependabot PR
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
days_old:
|
||||||
|
description: '关闭多少天前创建的 PR(默认 7 天)'
|
||||||
|
required: false
|
||||||
|
default: '7'
|
||||||
|
dry_run:
|
||||||
|
description: '试运行模式(true=仅显示,不关闭)'
|
||||||
|
required: false
|
||||||
|
default: 'true'
|
||||||
|
type: choice
|
||||||
|
options:
|
||||||
|
- 'true'
|
||||||
|
- 'false'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
cleanup:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
pull-requests: write
|
||||||
|
issues: write
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: List and Close Old Dependabot PRs
|
||||||
|
uses: actions/github-script@v7
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
const daysOld = parseInt('${{ github.event.inputs.days_old }}') || 7;
|
||||||
|
const dryRun = '${{ github.event.inputs.dry_run }}' === 'true';
|
||||||
|
const cutoffDate = new Date();
|
||||||
|
cutoffDate.setDate(cutoffDate.getDate() - daysOld);
|
||||||
|
|
||||||
|
console.log(`🔍 查找超过 ${daysOld} 天的 Dependabot PR...`);
|
||||||
|
console.log(`📅 截止日期: ${cutoffDate.toISOString()}`);
|
||||||
|
console.log(`🏃 模式: ${dryRun ? '试运行(不会实际关闭)' : '实际执行'}`);
|
||||||
|
console.log('---');
|
||||||
|
|
||||||
|
// 获取所有 Dependabot PR
|
||||||
|
const { data: pulls } = await github.rest.pulls.list({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
state: 'open',
|
||||||
|
per_page: 100
|
||||||
|
});
|
||||||
|
|
||||||
|
const dependabotPRs = pulls.filter(pr =>
|
||||||
|
pr.user.login === 'dependabot[bot]' &&
|
||||||
|
new Date(pr.created_at) < cutoffDate
|
||||||
|
);
|
||||||
|
|
||||||
|
console.log(`📊 找到 ${dependabotPRs.length} 个符合条件的 Dependabot PR`);
|
||||||
|
console.log('');
|
||||||
|
|
||||||
|
if (dependabotPRs.length === 0) {
|
||||||
|
console.log('✅ 没有需要清理的 PR');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 按类型分组
|
||||||
|
const byType = {
|
||||||
|
dev: [],
|
||||||
|
prod: [],
|
||||||
|
actions: [],
|
||||||
|
other: []
|
||||||
|
};
|
||||||
|
|
||||||
|
for (const pr of dependabotPRs) {
|
||||||
|
const title = pr.title.toLowerCase();
|
||||||
|
const labels = pr.labels.map(l => l.name);
|
||||||
|
|
||||||
|
let type = 'other';
|
||||||
|
if (title.includes('dev-dependencies') || title.includes('development')) {
|
||||||
|
type = 'dev';
|
||||||
|
} else if (title.includes('production-dependencies')) {
|
||||||
|
type = 'prod';
|
||||||
|
} else if (labels.includes('github-actions')) {
|
||||||
|
type = 'actions';
|
||||||
|
}
|
||||||
|
|
||||||
|
byType[type].push(pr);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('📋 PR 分类统计:');
|
||||||
|
console.log(` 🔧 开发依赖: ${byType.dev.length} 个`);
|
||||||
|
console.log(` 📦 生产依赖: ${byType.prod.length} 个`);
|
||||||
|
console.log(` ⚙️ GitHub Actions: ${byType.actions.length} 个`);
|
||||||
|
console.log(` ❓ 其他: ${byType.other.length} 个`);
|
||||||
|
console.log('');
|
||||||
|
|
||||||
|
// 处理每个 PR
|
||||||
|
for (const pr of dependabotPRs) {
|
||||||
|
const age = Math.floor((Date.now() - new Date(pr.created_at)) / (1000 * 60 * 60 * 24));
|
||||||
|
|
||||||
|
console.log(`${dryRun ? '🔍' : '🗑️ '} #${pr.number}: ${pr.title}`);
|
||||||
|
console.log(` 创建时间: ${pr.created_at} (${age} 天前)`);
|
||||||
|
console.log(` 链接: ${pr.html_url}`);
|
||||||
|
|
||||||
|
if (!dryRun) {
|
||||||
|
await github.rest.pulls.update({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
pull_number: pr.number,
|
||||||
|
state: 'closed'
|
||||||
|
});
|
||||||
|
|
||||||
|
await github.rest.issues.createComment({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
issue_number: pr.number,
|
||||||
|
body: `🤖 **自动关闭旧的 Dependabot PR**
|
||||||
|
|
||||||
|
此 PR 已超过 ${daysOld} 天未合并,已被自动关闭以清理积压。
|
||||||
|
|
||||||
|
📌 **下一步:**
|
||||||
|
- Dependabot 已配置为月度运行,届时会创建新的分组更新
|
||||||
|
- 新的 Mergify 规则会智能处理不同类型的依赖更新
|
||||||
|
- 开发依赖和 GitHub Actions 会自动合并(即使 CI 失败)
|
||||||
|
- 生产依赖需要 CI 通过才会自动合并
|
||||||
|
|
||||||
|
如果需要立即应用此更新,请手动更新依赖。
|
||||||
|
|
||||||
|
---
|
||||||
|
*此操作由仓库维护者手动触发的清理工作流执行*`
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log(' ✅ 已关闭并添加说明');
|
||||||
|
} else {
|
||||||
|
console.log(' ℹ️ 试运行模式 - 未执行操作');
|
||||||
|
}
|
||||||
|
console.log('');
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('---');
|
||||||
|
if (dryRun) {
|
||||||
|
console.log(`✨ 试运行完成!共发现 ${dependabotPRs.length} 个待清理的 PR`);
|
||||||
|
console.log('💡 要实际执行清理,请将 dry_run 参数设为 false 重新运行');
|
||||||
|
} else {
|
||||||
|
console.log(`✅ 清理完成!已关闭 ${dependabotPRs.length} 个 Dependabot PR`);
|
||||||
|
}
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
name: Code Coverage
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ master, main ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ master, main ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
coverage:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install pnpm
|
||||||
|
uses: pnpm/action-setup@v4
|
||||||
|
|
||||||
|
- name: Setup Node.js
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: '20.x'
|
||||||
|
cache: 'pnpm'
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: pnpm install
|
||||||
|
|
||||||
|
- name: Run tests with coverage
|
||||||
|
run: |
|
||||||
|
cd packages/core
|
||||||
|
pnpm run test:coverage
|
||||||
|
|
||||||
|
- name: Upload coverage to Codecov
|
||||||
|
uses: codecov/codecov-action@v4
|
||||||
|
continue-on-error: true
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.CODECOV_TOKEN }}
|
||||||
|
files: ./packages/core/coverage/coverage-final.json
|
||||||
|
flags: core
|
||||||
|
name: core-coverage
|
||||||
|
fail_ci_if_error: false
|
||||||
|
verbose: true
|
||||||
|
|
||||||
|
- name: Upload coverage artifact
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: coverage-report
|
||||||
|
path: packages/core/coverage/
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
name: "CodeQL"
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ "master", "main" ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ "master", "main" ]
|
||||||
|
schedule:
|
||||||
|
- cron: '0 0 * * 1' # 每周一运行
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
analyze:
|
||||||
|
name: Analyze
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
actions: read
|
||||||
|
contents: read
|
||||||
|
security-events: write
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
language: [ 'javascript' ]
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Initialize CodeQL
|
||||||
|
uses: github/codeql-action/init@v3
|
||||||
|
with:
|
||||||
|
languages: ${{ matrix.language }}
|
||||||
|
queries: security-and-quality
|
||||||
|
config-file: ./.github/codeql/codeql-config.yml
|
||||||
|
|
||||||
|
- name: Autobuild
|
||||||
|
uses: github/codeql-action/autobuild@v3
|
||||||
|
|
||||||
|
- name: Perform CodeQL Analysis
|
||||||
|
uses: github/codeql-action/analyze@v3
|
||||||
|
with:
|
||||||
|
category: "/language:${{matrix.language}}"
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
name: Commit Lint
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
types: [opened, synchronize, reopened]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
pull-requests: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
commitlint:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Install pnpm
|
||||||
|
uses: pnpm/action-setup@v4
|
||||||
|
|
||||||
|
- name: Setup Node.js
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: '20.x'
|
||||||
|
cache: 'pnpm'
|
||||||
|
|
||||||
|
- name: Install commitlint
|
||||||
|
run: |
|
||||||
|
pnpm add -D @commitlint/config-conventional @commitlint/cli
|
||||||
|
|
||||||
|
- name: Validate PR commits
|
||||||
|
run: npx commitlint --from ${{ github.event.pull_request.base.sha }} --to ${{ github.event.pull_request.head.sha }} --verbose
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
name: Deploy Documentation
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [master]
|
||||||
|
paths:
|
||||||
|
- 'docs/**'
|
||||||
|
- 'packages/**'
|
||||||
|
- 'typedoc.json'
|
||||||
|
- 'package.json'
|
||||||
|
- '.github/workflows/docs.yml'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
pages: write
|
||||||
|
id-token: write
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: pages
|
||||||
|
cancel-in-progress: false
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Install pnpm
|
||||||
|
uses: pnpm/action-setup@v4
|
||||||
|
|
||||||
|
- name: Setup Node.js
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: '20.x'
|
||||||
|
cache: 'pnpm'
|
||||||
|
|
||||||
|
- name: Setup Pages
|
||||||
|
uses: actions/configure-pages@v4
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: pnpm install
|
||||||
|
|
||||||
|
- name: Build core package
|
||||||
|
run: pnpm run build:core
|
||||||
|
|
||||||
|
- name: Generate API documentation
|
||||||
|
run: pnpm run docs:api
|
||||||
|
|
||||||
|
- name: Build documentation
|
||||||
|
run: pnpm run docs:build
|
||||||
|
|
||||||
|
- name: Upload artifact
|
||||||
|
uses: actions/upload-pages-artifact@v3
|
||||||
|
with:
|
||||||
|
path: docs/.vitepress/dist
|
||||||
|
|
||||||
|
deploy:
|
||||||
|
environment:
|
||||||
|
name: github-pages
|
||||||
|
url: ${{ steps.deployment.outputs.page_url }}
|
||||||
|
needs: build
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Deploy to GitHub Pages
|
||||||
|
id: deployment
|
||||||
|
uses: actions/deploy-pages@v4
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
name: Issue Labeler
|
||||||
|
|
||||||
|
on:
|
||||||
|
issues:
|
||||||
|
types: [opened, edited]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
label:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Label Issues
|
||||||
|
uses: github/issue-labeler@v3.4
|
||||||
|
with:
|
||||||
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
configuration-path: .github/labeler.yml
|
||||||
|
enable-versioned-regex: 1
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
name: Issue Translator
|
||||||
|
|
||||||
|
on:
|
||||||
|
issue_comment:
|
||||||
|
types: [created]
|
||||||
|
issues:
|
||||||
|
types: [opened]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
translate:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Translate Issues
|
||||||
|
uses: tomsun28/issues-translate-action@v2.7
|
||||||
|
with:
|
||||||
|
IS_MODIFY_TITLE: false
|
||||||
|
# 设置为 true 会修改标题,false 只在评论中添加翻译
|
||||||
|
CUSTOM_BOT_NOTE: |
|
||||||
|
<details>
|
||||||
|
<summary>🌏 Translation / 翻译</summary>
|
||||||
|
|
||||||
|
Bot detected the issue body's language is not English, translate it automatically.
|
||||||
|
机器人检测到 issue 内容非英文,自动翻译。
|
||||||
|
|
||||||
|
</details>
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
|
|
||||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
|
|
||||||
|
|
||||||
name: Node.js CI
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ master ]
|
|
||||||
pull_request:
|
|
||||||
branches: [ master ]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
|
|
||||||
runs-on: windows-latest
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
node-version: [8.x]
|
|
||||||
|
|
||||||
defaults:
|
|
||||||
run:
|
|
||||||
shell: cmd
|
|
||||||
working-directory: ./source
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
- name: Use Node.js ${{ matrix.node-version }}
|
|
||||||
uses: actions/setup-node@v1
|
|
||||||
with:
|
|
||||||
node-version: ${{ matrix.node-version }}
|
|
||||||
- name: Install Dependencies
|
|
||||||
run: npm install
|
|
||||||
- run: npm run build --if-present
|
|
||||||
- run: gulp build
|
|
||||||
@@ -0,0 +1,245 @@
|
|||||||
|
name: Release Editor App
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- 'editor-v*'
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
version:
|
||||||
|
description: 'Release version (e.g., 1.0.0)'
|
||||||
|
required: true
|
||||||
|
default: '1.0.0'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-tauri:
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- platform: windows-latest
|
||||||
|
target: x86_64-pc-windows-msvc
|
||||||
|
arch: x64
|
||||||
|
- platform: macos-latest
|
||||||
|
target: x86_64-apple-darwin
|
||||||
|
arch: x64
|
||||||
|
- platform: macos-latest
|
||||||
|
target: aarch64-apple-darwin
|
||||||
|
arch: arm64
|
||||||
|
|
||||||
|
runs-on: ${{ matrix.platform }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install pnpm
|
||||||
|
uses: pnpm/action-setup@v4
|
||||||
|
|
||||||
|
- name: Setup Node.js
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: '20.x'
|
||||||
|
cache: 'pnpm'
|
||||||
|
|
||||||
|
- name: Install Rust stable
|
||||||
|
uses: dtolnay/rust-toolchain@stable
|
||||||
|
with:
|
||||||
|
targets: ${{ matrix.target }}
|
||||||
|
|
||||||
|
- name: Rust cache
|
||||||
|
uses: Swatinem/rust-cache@v2
|
||||||
|
with:
|
||||||
|
workspaces: packages/editor-app/src-tauri
|
||||||
|
cache-on-failure: true
|
||||||
|
|
||||||
|
- name: Install dependencies (Ubuntu)
|
||||||
|
if: matrix.platform == 'ubuntu-latest'
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.0-dev libappindicator3-dev librsvg2-dev patchelf
|
||||||
|
|
||||||
|
- name: Install frontend dependencies
|
||||||
|
run: pnpm install
|
||||||
|
|
||||||
|
- name: Update version in config files (for manual trigger)
|
||||||
|
if: github.event_name == 'workflow_dispatch'
|
||||||
|
run: |
|
||||||
|
cd packages/editor-app
|
||||||
|
node -e "const pkg=require('./package.json'); pkg.version='${{ github.event.inputs.version }}'; require('fs').writeFileSync('./package.json', JSON.stringify(pkg, null, 2)+'\n')"
|
||||||
|
node scripts/sync-version.js
|
||||||
|
|
||||||
|
- name: Install wasm-pack
|
||||||
|
run: cargo install wasm-pack
|
||||||
|
|
||||||
|
# 使用 Turborepo 自动按依赖顺序构建所有包
|
||||||
|
# 这会自动处理:core -> asset-system -> editor-core -> ui -> 等等
|
||||||
|
- name: Build all packages with Turborepo
|
||||||
|
run: pnpm run build
|
||||||
|
|
||||||
|
- name: Copy WASM files to ecs-engine-bindgen
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
mkdir -p packages/ecs-engine-bindgen/src/wasm
|
||||||
|
cp packages/engine/pkg/es_engine.js packages/ecs-engine-bindgen/src/wasm/
|
||||||
|
cp packages/engine/pkg/es_engine.d.ts packages/ecs-engine-bindgen/src/wasm/
|
||||||
|
cp packages/engine/pkg/es_engine_bg.wasm packages/ecs-engine-bindgen/src/wasm/
|
||||||
|
cp packages/engine/pkg/es_engine_bg.wasm.d.ts packages/ecs-engine-bindgen/src/wasm/
|
||||||
|
|
||||||
|
- name: Bundle runtime files for Tauri
|
||||||
|
run: |
|
||||||
|
cd packages/editor-app
|
||||||
|
node scripts/bundle-runtime.mjs
|
||||||
|
|
||||||
|
- name: Build Tauri app
|
||||||
|
id: tauri
|
||||||
|
uses: tauri-apps/tauri-action@v0.5
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
|
||||||
|
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
|
||||||
|
with:
|
||||||
|
projectPath: packages/editor-app
|
||||||
|
tagName: ${{ github.event_name == 'workflow_dispatch' && format('editor-v{0}', github.event.inputs.version) || github.ref_name }}
|
||||||
|
releaseName: 'ECS Editor v${{ github.event.inputs.version || github.ref_name }}'
|
||||||
|
releaseBody: 'See the assets to download this version and install.'
|
||||||
|
releaseDraft: true
|
||||||
|
prerelease: false
|
||||||
|
includeUpdaterJson: true
|
||||||
|
updaterJsonKeepUniversal: false
|
||||||
|
args: ${{ matrix.platform == 'macos-latest' && format('--target {0}', matrix.target) || '' }}
|
||||||
|
|
||||||
|
# Windows 构建上传 artifact 供 SignPath 签名
|
||||||
|
- name: Upload Windows artifacts for signing
|
||||||
|
if: matrix.platform == 'windows-latest'
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: windows-unsigned
|
||||||
|
path: |
|
||||||
|
packages/editor-app/src-tauri/target/release/bundle/nsis/*.exe
|
||||||
|
packages/editor-app/src-tauri/target/release/bundle/msi/*.msi
|
||||||
|
retention-days: 1
|
||||||
|
|
||||||
|
# SignPath 代码签名(Windows)
|
||||||
|
# SignPath OSS code signing for Windows
|
||||||
|
#
|
||||||
|
# 配置步骤 | Setup Steps:
|
||||||
|
# 1. 在 SignPath 门户创建项目 | Create project in SignPath portal
|
||||||
|
# 2. 导入 .signpath/artifact-configuration.xml | Import artifact configuration
|
||||||
|
# 3. 使用 'test-signing' 策略测试 | Use 'test-signing' policy for testing
|
||||||
|
# 生产环境改为 'release-signing' | Change to 'release-signing' for production
|
||||||
|
# 4. 配置 GitHub Secrets | Configure GitHub Secrets:
|
||||||
|
# - SIGNPATH_API_TOKEN: API token from SignPath
|
||||||
|
# - SIGNPATH_ORGANIZATION_ID: Your organization ID
|
||||||
|
#
|
||||||
|
# 文档 | Documentation: https://about.signpath.io/documentation/trusted-build-systems/github
|
||||||
|
sign-windows:
|
||||||
|
needs: build-tauri
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
# 只有在构建成功时才运行 | Only run on successful build
|
||||||
|
if: success()
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Check SignPath configuration
|
||||||
|
id: check-signpath
|
||||||
|
run: |
|
||||||
|
if [ -n "${{ secrets.SIGNPATH_API_TOKEN }}" ] && [ -n "${{ secrets.SIGNPATH_ORGANIZATION_ID }}" ]; then
|
||||||
|
echo "enabled=true" >> $GITHUB_OUTPUT
|
||||||
|
echo "SignPath is configured, proceeding with code signing"
|
||||||
|
else
|
||||||
|
echo "enabled=false" >> $GITHUB_OUTPUT
|
||||||
|
echo "SignPath secrets not configured, skipping code signing"
|
||||||
|
echo "To enable: add SIGNPATH_API_TOKEN and SIGNPATH_ORGANIZATION_ID secrets"
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Checkout
|
||||||
|
if: steps.check-signpath.outputs.enabled == 'true'
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Download Windows artifact
|
||||||
|
if: steps.check-signpath.outputs.enabled == 'true'
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: windows-unsigned
|
||||||
|
path: ./artifacts
|
||||||
|
|
||||||
|
- name: List artifacts for signing
|
||||||
|
if: steps.check-signpath.outputs.enabled == 'true'
|
||||||
|
run: |
|
||||||
|
echo "Files to be signed:"
|
||||||
|
find ./artifacts -type f \( -name "*.exe" -o -name "*.msi" \) | head -20
|
||||||
|
|
||||||
|
- name: Submit to SignPath for code signing
|
||||||
|
if: steps.check-signpath.outputs.enabled == 'true'
|
||||||
|
id: signpath
|
||||||
|
uses: signpath/github-action-submit-signing-request@v1
|
||||||
|
with:
|
||||||
|
api-token: ${{ secrets.SIGNPATH_API_TOKEN }}
|
||||||
|
organization-id: ${{ secrets.SIGNPATH_ORGANIZATION_ID }}
|
||||||
|
project-slug: 'ecs-framework'
|
||||||
|
signing-policy-slug: 'test-signing'
|
||||||
|
artifact-configuration-slug: 'default'
|
||||||
|
github-artifact-name: 'windows-unsigned'
|
||||||
|
wait-for-completion: true
|
||||||
|
wait-for-completion-timeout-in-seconds: 600
|
||||||
|
output-artifact-directory: './signed'
|
||||||
|
|
||||||
|
- name: Upload signed artifacts to release
|
||||||
|
if: steps.check-signpath.outputs.enabled == 'true'
|
||||||
|
uses: softprops/action-gh-release@v1
|
||||||
|
with:
|
||||||
|
files: ./signed/*
|
||||||
|
tag_name: ${{ github.event_name == 'workflow_dispatch' && format('editor-v{0}', github.event.inputs.version) || github.ref_name }}
|
||||||
|
draft: false
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
# 构建成功后,创建 PR 更新版本号
|
||||||
|
# Create PR to update version after successful build
|
||||||
|
update-version-pr:
|
||||||
|
needs: [build-tauri, sign-windows]
|
||||||
|
# 即使签名跳过也要运行 | Run even if signing is skipped
|
||||||
|
if: github.event_name == 'workflow_dispatch' && !failure()
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Setup Node.js
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: '20.x'
|
||||||
|
|
||||||
|
- name: Update version files
|
||||||
|
run: |
|
||||||
|
cd packages/editor-app
|
||||||
|
node -e "const pkg=require('./package.json'); pkg.version='${{ github.event.inputs.version }}'; require('fs').writeFileSync('./package.json', JSON.stringify(pkg, null, 2)+'\n')"
|
||||||
|
node scripts/sync-version.js
|
||||||
|
|
||||||
|
- name: Create Pull Request
|
||||||
|
uses: peter-evans/create-pull-request@v6
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
commit-message: "chore(editor): bump version to ${{ github.event.inputs.version }}"
|
||||||
|
branch: release/editor-v${{ github.event.inputs.version }}
|
||||||
|
delete-branch: true
|
||||||
|
title: "chore(editor): Release v${{ github.event.inputs.version }}"
|
||||||
|
body: |
|
||||||
|
## Release v${{ github.event.inputs.version }}
|
||||||
|
|
||||||
|
This PR updates the editor version after successful release build.
|
||||||
|
|
||||||
|
### Changes
|
||||||
|
- Updated `packages/editor-app/package.json` → `${{ github.event.inputs.version }}`
|
||||||
|
- Updated `packages/editor-app/src-tauri/tauri.conf.json` → `${{ github.event.inputs.version }}`
|
||||||
|
|
||||||
|
### Release
|
||||||
|
- [GitHub Release](https://github.com/${{ github.repository }}/releases/tag/editor-v${{ github.event.inputs.version }})
|
||||||
|
|
||||||
|
---
|
||||||
|
*This PR was automatically created by the release workflow.*
|
||||||
|
labels: |
|
||||||
|
release
|
||||||
|
editor
|
||||||
|
automated pr
|
||||||
@@ -0,0 +1,229 @@
|
|||||||
|
name: Release NPM Packages
|
||||||
|
|
||||||
|
on:
|
||||||
|
# 标签触发:支持 v* 和 {package}-v* 格式
|
||||||
|
# Tag trigger: supports v* and {package}-v* formats
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- 'v*'
|
||||||
|
- 'core-v*'
|
||||||
|
- 'behavior-tree-v*'
|
||||||
|
- 'editor-core-v*'
|
||||||
|
- 'node-editor-v*'
|
||||||
|
- 'blueprint-v*'
|
||||||
|
- 'tilemap-v*'
|
||||||
|
- 'physics-rapier2d-v*'
|
||||||
|
- 'worker-generator-v*'
|
||||||
|
|
||||||
|
# 保留手动触发选项
|
||||||
|
# Keep manual trigger option
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
package:
|
||||||
|
description: '选择要发布的包 | Select package to publish'
|
||||||
|
required: true
|
||||||
|
type: choice
|
||||||
|
options:
|
||||||
|
- core
|
||||||
|
- behavior-tree
|
||||||
|
- editor-core
|
||||||
|
- node-editor
|
||||||
|
- blueprint
|
||||||
|
- tilemap
|
||||||
|
- physics-rapier2d
|
||||||
|
- worker-generator
|
||||||
|
version_type:
|
||||||
|
description: '版本更新类型 | Version bump type'
|
||||||
|
required: true
|
||||||
|
type: choice
|
||||||
|
options:
|
||||||
|
- patch
|
||||||
|
- minor
|
||||||
|
- major
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
pull-requests: write
|
||||||
|
id-token: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
release-package:
|
||||||
|
name: Release Package
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Parse tag or input
|
||||||
|
id: parse
|
||||||
|
run: |
|
||||||
|
if [ "${{ github.event_name }}" = "push" ]; then
|
||||||
|
# 从标签解析包名和版本 | Parse package and version from tag
|
||||||
|
TAG="${GITHUB_REF#refs/tags/}"
|
||||||
|
echo "tag=$TAG" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
# 解析格式:v1.0.0 或 package-v1.0.0
|
||||||
|
# Parse format: v1.0.0 or package-v1.0.0
|
||||||
|
if [[ "$TAG" =~ ^v([0-9]+\.[0-9]+\.[0-9]+.*)$ ]]; then
|
||||||
|
PACKAGE="core"
|
||||||
|
VERSION="${BASH_REMATCH[1]}"
|
||||||
|
elif [[ "$TAG" =~ ^([a-z-]+)-v([0-9]+\.[0-9]+\.[0-9]+.*)$ ]]; then
|
||||||
|
PACKAGE="${BASH_REMATCH[1]}"
|
||||||
|
VERSION="${BASH_REMATCH[2]}"
|
||||||
|
else
|
||||||
|
echo "::error::Invalid tag format: $TAG"
|
||||||
|
echo "Expected: v1.0.0 or package-v1.0.0"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "package=$PACKAGE" >> $GITHUB_OUTPUT
|
||||||
|
echo "version=$VERSION" >> $GITHUB_OUTPUT
|
||||||
|
echo "mode=tag" >> $GITHUB_OUTPUT
|
||||||
|
echo "📦 Package: $PACKAGE"
|
||||||
|
echo "📌 Version: $VERSION"
|
||||||
|
else
|
||||||
|
# 手动触发:从 package.json 读取并 bump 版本
|
||||||
|
# Manual trigger: read from package.json and bump version
|
||||||
|
PACKAGE="${{ github.event.inputs.package }}"
|
||||||
|
echo "package=$PACKAGE" >> $GITHUB_OUTPUT
|
||||||
|
echo "mode=manual" >> $GITHUB_OUTPUT
|
||||||
|
echo "version_type=${{ github.event.inputs.version_type }}" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Install pnpm
|
||||||
|
uses: pnpm/action-setup@v4
|
||||||
|
|
||||||
|
- name: Setup Node.js
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: '20.x'
|
||||||
|
registry-url: 'https://registry.npmjs.org'
|
||||||
|
cache: 'pnpm'
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: pnpm install
|
||||||
|
|
||||||
|
- name: Verify version (tag mode)
|
||||||
|
if: steps.parse.outputs.mode == 'tag'
|
||||||
|
run: |
|
||||||
|
PACKAGE="${{ steps.parse.outputs.package }}"
|
||||||
|
EXPECTED_VERSION="${{ steps.parse.outputs.version }}"
|
||||||
|
|
||||||
|
# 获取 package.json 中的版本
|
||||||
|
# Get version from package.json
|
||||||
|
ACTUAL_VERSION=$(node -p "require('./packages/$PACKAGE/package.json').version")
|
||||||
|
|
||||||
|
if [ "$EXPECTED_VERSION" != "$ACTUAL_VERSION" ]; then
|
||||||
|
echo "::error::Version mismatch!"
|
||||||
|
echo "Tag version: $EXPECTED_VERSION"
|
||||||
|
echo "package.json version: $ACTUAL_VERSION"
|
||||||
|
echo ""
|
||||||
|
echo "Please update packages/$PACKAGE/package.json to version $EXPECTED_VERSION before tagging."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "✅ Version verified: $EXPECTED_VERSION"
|
||||||
|
|
||||||
|
- name: Bump version (manual mode)
|
||||||
|
if: steps.parse.outputs.mode == 'manual'
|
||||||
|
id: bump
|
||||||
|
run: |
|
||||||
|
PACKAGE="${{ steps.parse.outputs.package }}"
|
||||||
|
cd packages/$PACKAGE
|
||||||
|
|
||||||
|
CURRENT=$(node -p "require('./package.json').version")
|
||||||
|
IFS='.' read -r MAJOR MINOR PATCH <<< "$CURRENT"
|
||||||
|
|
||||||
|
case "${{ steps.parse.outputs.version_type }}" in
|
||||||
|
major) NEW_VERSION="$((MAJOR+1)).0.0" ;;
|
||||||
|
minor) NEW_VERSION="$MAJOR.$((MINOR+1)).0" ;;
|
||||||
|
patch) NEW_VERSION="$MAJOR.$MINOR.$((PATCH+1))" ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Update package.json
|
||||||
|
node -e "const fs=require('fs'); const pkg=JSON.parse(fs.readFileSync('package.json')); pkg.version='$NEW_VERSION'; fs.writeFileSync('package.json', JSON.stringify(pkg, null, 2)+'\n')"
|
||||||
|
|
||||||
|
echo "version=$NEW_VERSION" >> $GITHUB_OUTPUT
|
||||||
|
echo "📌 Bumped version: $CURRENT → $NEW_VERSION"
|
||||||
|
|
||||||
|
- name: Set final version
|
||||||
|
id: version
|
||||||
|
run: |
|
||||||
|
if [ "${{ steps.parse.outputs.mode }}" = "tag" ]; then
|
||||||
|
echo "value=${{ steps.parse.outputs.version }}" >> $GITHUB_OUTPUT
|
||||||
|
else
|
||||||
|
echo "value=${{ steps.bump.outputs.version }}" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Build core package (if needed)
|
||||||
|
if: ${{ steps.parse.outputs.package != 'core' && steps.parse.outputs.package != 'node-editor' && steps.parse.outputs.package != 'worker-generator' }}
|
||||||
|
run: |
|
||||||
|
cd packages/core
|
||||||
|
pnpm run build
|
||||||
|
|
||||||
|
- name: Build node-editor package (if needed for blueprint)
|
||||||
|
if: ${{ steps.parse.outputs.package == 'blueprint' }}
|
||||||
|
run: |
|
||||||
|
cd packages/node-editor
|
||||||
|
pnpm run build
|
||||||
|
|
||||||
|
- name: Build package
|
||||||
|
run: |
|
||||||
|
cd packages/${{ steps.parse.outputs.package }}
|
||||||
|
pnpm run build:npm
|
||||||
|
|
||||||
|
- name: Publish to npm
|
||||||
|
env:
|
||||||
|
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||||
|
run: |
|
||||||
|
cd packages/${{ steps.parse.outputs.package }}/dist
|
||||||
|
pnpm publish --access public --no-git-checks
|
||||||
|
|
||||||
|
- name: Create GitHub Release (tag mode)
|
||||||
|
if: steps.parse.outputs.mode == 'tag'
|
||||||
|
uses: softprops/action-gh-release@v1
|
||||||
|
with:
|
||||||
|
tag_name: ${{ steps.parse.outputs.tag }}
|
||||||
|
name: "${{ steps.parse.outputs.package }} v${{ steps.version.outputs.value }}"
|
||||||
|
body: |
|
||||||
|
## 🚀 @esengine/${{ steps.parse.outputs.package }} v${{ steps.version.outputs.value }}
|
||||||
|
|
||||||
|
📦 **NPM**: [@esengine/${{ steps.parse.outputs.package }}@${{ steps.version.outputs.value }}](https://www.npmjs.com/package/@esengine/${{ steps.parse.outputs.package }}/v/${{ steps.version.outputs.value }})
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install @esengine/${{ steps.parse.outputs.package }}@${{ steps.version.outputs.value }}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
*自动发布 | Auto-released by GitHub Actions*
|
||||||
|
generate_release_notes: true
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Create Pull Request (manual mode)
|
||||||
|
if: steps.parse.outputs.mode == 'manual'
|
||||||
|
uses: peter-evans/create-pull-request@v6
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
commit-message: "chore(${{ steps.parse.outputs.package }}): release v${{ steps.version.outputs.value }}"
|
||||||
|
branch: release/${{ steps.parse.outputs.package }}-v${{ steps.version.outputs.value }}
|
||||||
|
delete-branch: true
|
||||||
|
title: "chore(${{ steps.parse.outputs.package }}): Release v${{ steps.version.outputs.value }}"
|
||||||
|
body: |
|
||||||
|
## 🚀 Release v${{ steps.version.outputs.value }}
|
||||||
|
|
||||||
|
此 PR 更新 `@esengine/${{ steps.parse.outputs.package }}` 包的版本号
|
||||||
|
|
||||||
|
### 变更
|
||||||
|
- ✅ 已发布到 npm: [@esengine/${{ steps.parse.outputs.package }}@${{ steps.version.outputs.value }}](https://www.npmjs.com/package/@esengine/${{ steps.parse.outputs.package }}/v/${{ steps.version.outputs.value }})
|
||||||
|
- ✅ 更新 `packages/${{ steps.parse.outputs.package }}/package.json` → `${{ steps.version.outputs.value }}`
|
||||||
|
|
||||||
|
---
|
||||||
|
*此 PR 由发布工作流自动创建*
|
||||||
|
labels: |
|
||||||
|
release
|
||||||
|
${{ steps.parse.outputs.package }}
|
||||||
|
automated pr
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
name: Size Limit
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
- main
|
||||||
|
paths:
|
||||||
|
- 'packages/core/src/**'
|
||||||
|
- 'packages/core/package.json'
|
||||||
|
- '.size-limit.json'
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
pull-requests: write
|
||||||
|
issues: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
size:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install pnpm
|
||||||
|
uses: pnpm/action-setup@v4
|
||||||
|
|
||||||
|
- name: Setup Node.js
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: '20.x'
|
||||||
|
cache: 'pnpm'
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: pnpm install
|
||||||
|
|
||||||
|
- name: Build core package
|
||||||
|
run: |
|
||||||
|
cd packages/core
|
||||||
|
pnpm run build:npm
|
||||||
|
|
||||||
|
- name: Check bundle size
|
||||||
|
uses: andresz1/size-limit-action@v1
|
||||||
|
with:
|
||||||
|
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
skip_step: install
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
name: Stale Issues and PRs
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '0 0 * * *' # 每天运行一次
|
||||||
|
workflow_dispatch: # 允许手动触发
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
pull-requests: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
stale:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Stale Bot
|
||||||
|
uses: actions/stale@v9
|
||||||
|
with:
|
||||||
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
# Issue 配置
|
||||||
|
stale-issue-message: |
|
||||||
|
这个 issue 已经 60 天没有活动了,将在 14 天后自动关闭。
|
||||||
|
如果这个问题仍然存在,请留言说明情况。
|
||||||
|
|
||||||
|
This issue has been inactive for 60 days and will be closed in 14 days.
|
||||||
|
If this issue is still relevant, please leave a comment.
|
||||||
|
close-issue-message: |
|
||||||
|
由于长时间无活动,这个 issue 已被自动关闭。
|
||||||
|
如需重新打开,请留言说明。
|
||||||
|
|
||||||
|
This issue has been automatically closed due to inactivity.
|
||||||
|
Please comment if you'd like to reopen it.
|
||||||
|
days-before-issue-stale: 60
|
||||||
|
days-before-issue-close: 14
|
||||||
|
stale-issue-label: 'stale'
|
||||||
|
exempt-issue-labels: 'pinned,security,enhancement,help wanted'
|
||||||
|
|
||||||
|
# PR 配置
|
||||||
|
stale-pr-message: |
|
||||||
|
这个 PR 已经 30 天没有活动了,将在 7 天后自动关闭。
|
||||||
|
如果你还在处理这个 PR,请更新一下。
|
||||||
|
|
||||||
|
This PR has been inactive for 30 days and will be closed in 7 days.
|
||||||
|
If you're still working on it, please update it.
|
||||||
|
close-pr-message: |
|
||||||
|
由于长时间无活动,这个 PR 已被自动关闭。
|
||||||
|
如需继续,请重新打开或创建新的 PR。
|
||||||
|
|
||||||
|
This PR has been automatically closed due to inactivity.
|
||||||
|
Please reopen or create a new PR to continue.
|
||||||
|
days-before-pr-stale: 30
|
||||||
|
days-before-pr-close: 7
|
||||||
|
stale-pr-label: 'stale'
|
||||||
|
exempt-pr-labels: 'pinned,security,wip'
|
||||||
|
|
||||||
|
# 其他配置
|
||||||
|
operations-per-run: 100
|
||||||
|
remove-stale-when-updated: true
|
||||||
|
ascending: true
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
name: Welcome
|
||||||
|
|
||||||
|
on:
|
||||||
|
issues:
|
||||||
|
types: [opened]
|
||||||
|
pull_request_target:
|
||||||
|
types: [opened]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
pull-requests: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
welcome:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Welcome new contributors
|
||||||
|
uses: actions/first-interaction@v1.3.0
|
||||||
|
with:
|
||||||
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
issue-message: |
|
||||||
|
👋 你好!感谢你提交第一个 issue!
|
||||||
|
|
||||||
|
我们会尽快查看并回复。同时,建议你:
|
||||||
|
- 📚 查看[文档](https://esengine.github.io/ecs-framework/)
|
||||||
|
- 🤖 使用 [AI 文档助手](https://deepwiki.com/esengine/esengine)
|
||||||
|
- 💬 加入 [QQ 交流群](https://jq.qq.com/?_wv=1027&k=29w1Nud6)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
👋 Hello! Thanks for opening your first issue!
|
||||||
|
|
||||||
|
We'll review it as soon as possible. Meanwhile, you might want to:
|
||||||
|
- 📚 Check the [documentation](https://esengine.github.io/ecs-framework/)
|
||||||
|
- 🤖 Use [AI documentation assistant](https://deepwiki.com/esengine/esengine)
|
||||||
|
|
||||||
|
pr-message: |
|
||||||
|
👋 你好!感谢你提交第一个 Pull Request!
|
||||||
|
|
||||||
|
在我们 Review 之前,请确保:
|
||||||
|
- ✅ 代码遵循项目规范
|
||||||
|
- ✅ 通过所有测试
|
||||||
|
- ✅ 更新了相关文档
|
||||||
|
- ✅ Commit 遵循 [Conventional Commits](https://www.conventionalcommits.org/) 规范
|
||||||
|
|
||||||
|
查看完整的[贡献指南](https://github.com/esengine/esengine/blob/master/CONTRIBUTING.md)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
👋 Hello! Thanks for your first Pull Request!
|
||||||
|
|
||||||
|
Before we review, please ensure:
|
||||||
|
- ✅ Code follows project conventions
|
||||||
|
- ✅ All tests pass
|
||||||
|
- ✅ Documentation is updated
|
||||||
|
- ✅ Commits follow [Conventional Commits](https://www.conventionalcommits.org/)
|
||||||
|
|
||||||
|
See the full [Contributing Guide](https://github.com/esengine/esengine/blob/master/CONTRIBUTING.md).
|
||||||
@@ -1,9 +1,92 @@
|
|||||||
/source/node_modules
|
# 依赖目录
|
||||||
/demo/bin-debug
|
node_modules/
|
||||||
/demo/bin-release
|
npm-debug.log*
|
||||||
/.idea
|
yarn-debug.log*
|
||||||
/.vscode
|
yarn-error.log*
|
||||||
/demo_wxgame
|
|
||||||
/demo/.wing
|
# 构建输出
|
||||||
/demo/.idea
|
bin/
|
||||||
/demo/.vscode
|
dist/
|
||||||
|
*.tgz
|
||||||
|
|
||||||
|
# TypeScript
|
||||||
|
*.tsbuildinfo
|
||||||
|
|
||||||
|
# 临时文件
|
||||||
|
*.tmp
|
||||||
|
*.temp
|
||||||
|
.cache/
|
||||||
|
.build-cache/
|
||||||
|
|
||||||
|
# Turborepo
|
||||||
|
.turbo/
|
||||||
|
|
||||||
|
# IDE 配置
|
||||||
|
.idea/
|
||||||
|
.vscode/
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
*~
|
||||||
|
|
||||||
|
# 操作系统文件
|
||||||
|
.DS_Store
|
||||||
|
.DS_Store?
|
||||||
|
._*
|
||||||
|
.Spotlight-V100
|
||||||
|
.Trashes
|
||||||
|
ehthumbs.db
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
|
# 日志文件
|
||||||
|
logs/
|
||||||
|
*.log
|
||||||
|
|
||||||
|
# 环境配置
|
||||||
|
.env
|
||||||
|
.env.local
|
||||||
|
.env.development.local
|
||||||
|
.env.test.local
|
||||||
|
.env.production.local
|
||||||
|
|
||||||
|
# 代码签名证书(敏感文件)
|
||||||
|
certs/
|
||||||
|
*.pfx
|
||||||
|
*.p12
|
||||||
|
*.cer
|
||||||
|
*.pem
|
||||||
|
*.key
|
||||||
|
|
||||||
|
# 测试覆盖率
|
||||||
|
coverage/
|
||||||
|
*.lcov
|
||||||
|
|
||||||
|
# 包管理器锁文件(忽略yarn,保留pnpm)
|
||||||
|
yarn.lock
|
||||||
|
package-lock.json
|
||||||
|
|
||||||
|
# 文档生成
|
||||||
|
docs/api/
|
||||||
|
docs/build/
|
||||||
|
docs/.vitepress/cache/
|
||||||
|
docs/.vitepress/dist/
|
||||||
|
|
||||||
|
# 备份文件
|
||||||
|
*.bak
|
||||||
|
*.backup
|
||||||
|
|
||||||
|
# 演示项目构建产物
|
||||||
|
/demo/bin-debug/
|
||||||
|
/demo/bin-release/
|
||||||
|
/demo/.wing/
|
||||||
|
/demo/.idea/
|
||||||
|
/demo/.vscode/
|
||||||
|
/demo_wxgame/
|
||||||
|
|
||||||
|
# Tauri 构建产物
|
||||||
|
**/src-tauri/target/
|
||||||
|
**/src-tauri/WixTools/
|
||||||
|
**/src-tauri/gen/
|
||||||
|
|
||||||
|
# Tauri 捆绑输出
|
||||||
|
**/src-tauri/target/release/bundle/
|
||||||
|
**/src-tauri/target/debug/bundle/
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
[submodule "thirdparty/BehaviourTree-ai"]
|
||||||
|
path = thirdparty/BehaviourTree-ai
|
||||||
|
url = https://github.com/esengine/BehaviourTree-ai.git
|
||||||
|
[submodule "thirdparty/admin-backend"]
|
||||||
|
path = thirdparty/admin-backend
|
||||||
|
url = https://github.com/esengine/admin-backend.git
|
||||||
|
[submodule "thirdparty/mvvm-ui-framework"]
|
||||||
|
path = thirdparty/mvvm-ui-framework
|
||||||
|
url = https://github.com/esengine/mvvm-ui-framework.git
|
||||||
|
[submodule "thirdparty/cocos-nexus"]
|
||||||
|
path = thirdparty/cocos-nexus
|
||||||
|
url = https://github.com/esengine/cocos-nexus.git
|
||||||
|
[submodule "thirdparty/ecs-astar"]
|
||||||
|
path = thirdparty/ecs-astar
|
||||||
|
url = https://github.com/esengine/ecs-astar.git
|
||||||
|
[submodule "examples/lawn-mower-demo"]
|
||||||
|
path = examples/lawn-mower-demo
|
||||||
|
url = https://github.com/esengine/lawn-mower-demo.git
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
# 源代码文件
|
||||||
|
src/
|
||||||
|
tsconfig*.json
|
||||||
|
*.ts
|
||||||
|
!bin/**/*.d.ts
|
||||||
|
|
||||||
|
# 开发文件
|
||||||
|
dev-bin/
|
||||||
|
scripts/
|
||||||
|
.vscode/
|
||||||
|
.git/
|
||||||
|
.gitignore
|
||||||
|
|
||||||
|
# 测试文件
|
||||||
|
**/*.test.*
|
||||||
|
**/*.spec.*
|
||||||
|
**/test/
|
||||||
|
**/tests/
|
||||||
|
|
||||||
|
# 构建缓存
|
||||||
|
node_modules/
|
||||||
|
*.log
|
||||||
|
*.tmp
|
||||||
|
*.temp
|
||||||
|
|
||||||
|
# 文档草稿
|
||||||
|
docs/draft/
|
||||||
|
*.draft.md
|
||||||
|
|
||||||
|
# 编辑器文件
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
*~
|
||||||
|
|
||||||
|
# 环境文件
|
||||||
|
.env
|
||||||
|
.env.local
|
||||||
|
.env.*.local
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
# 依赖和构建输出
|
||||||
|
node_modules/
|
||||||
|
dist/
|
||||||
|
bin/
|
||||||
|
build/
|
||||||
|
coverage/
|
||||||
|
*.min.js
|
||||||
|
*.min.css
|
||||||
|
|
||||||
|
# 编译输出
|
||||||
|
**/*.d.ts
|
||||||
|
tsconfig.tsbuildinfo
|
||||||
|
|
||||||
|
# 日志
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
pnpm-debug.log*
|
||||||
|
|
||||||
|
# 第三方库
|
||||||
|
thirdparty/
|
||||||
|
examples/lawn-mower-demo/
|
||||||
|
extensions/
|
||||||
|
|
||||||
|
# 文档生成
|
||||||
|
docs/.vitepress/cache/
|
||||||
|
docs/.vitepress/dist/
|
||||||
|
docs/api/
|
||||||
|
|
||||||
|
# 临时文件
|
||||||
|
*.tmp
|
||||||
|
*.bak
|
||||||
|
*.swp
|
||||||
|
*~
|
||||||
|
|
||||||
|
# 系统文件
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
|
# 编辑器
|
||||||
|
.vscode/
|
||||||
|
.idea/
|
||||||
|
|
||||||
|
# 其他
|
||||||
|
*.backup
|
||||||
|
CHANGELOG.md
|
||||||
|
LICENSE
|
||||||
|
README.md
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"semi": true,
|
||||||
|
"singleQuote": true,
|
||||||
|
"tabWidth": 4,
|
||||||
|
"useTabs": false,
|
||||||
|
"trailingComma": "none",
|
||||||
|
"printWidth": 120,
|
||||||
|
"arrowParens": "always",
|
||||||
|
"endOfLine": "lf",
|
||||||
|
"bracketSpacing": true,
|
||||||
|
"quoteProps": "as-needed",
|
||||||
|
"jsxSingleQuote": false,
|
||||||
|
"proseWrap": "preserve"
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "@esengine/ecs-framework (ESM)",
|
||||||
|
"path": "packages/core/dist/esm/index.js",
|
||||||
|
"import": "*",
|
||||||
|
"limit": "50 KB",
|
||||||
|
"webpack": false,
|
||||||
|
"gzip": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "@esengine/ecs-framework (UMD)",
|
||||||
|
"path": "packages/core/dist/umd/ecs-framework.js",
|
||||||
|
"limit": "60 KB",
|
||||||
|
"webpack": false,
|
||||||
|
"gzip": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Core Runtime (Tree-shaking)",
|
||||||
|
"path": "packages/core/dist/esm/index.js",
|
||||||
|
"import": "{ Core, Scene, Entity, Component }",
|
||||||
|
"limit": "30 KB",
|
||||||
|
"webpack": false,
|
||||||
|
"gzip": true
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,130 @@
|
|||||||
|
# 贡献指南 / Contributing Guide
|
||||||
|
|
||||||
|
感谢你对 ECS Framework 的关注!
|
||||||
|
|
||||||
|
Thank you for your interest in contributing to ECS Framework!
|
||||||
|
|
||||||
|
## Commit 规范 / Commit Convention
|
||||||
|
|
||||||
|
本项目使用 [Conventional Commits](https://www.conventionalcommits.org/) 规范。
|
||||||
|
|
||||||
|
This project follows the [Conventional Commits](https://www.conventionalcommits.org/) specification.
|
||||||
|
|
||||||
|
### 格式 / Format
|
||||||
|
|
||||||
|
```
|
||||||
|
<type>(<scope>): <subject>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<footer>
|
||||||
|
```
|
||||||
|
|
||||||
|
### 类型 / Types
|
||||||
|
|
||||||
|
- **feat**: 新功能 / New feature
|
||||||
|
- **fix**: 错误修复 / Bug fix
|
||||||
|
- **docs**: 文档变更 / Documentation changes
|
||||||
|
- **style**: 代码格式(不影响代码运行) / Code style changes
|
||||||
|
- **refactor**: 重构(既不是新功能也不是修复) / Code refactoring
|
||||||
|
- **perf**: 性能优化 / Performance improvements
|
||||||
|
- **test**: 测试相关 / Test changes
|
||||||
|
- **build**: 构建系统或依赖变更 / Build system changes
|
||||||
|
- **ci**: CI 配置变更 / CI configuration changes
|
||||||
|
- **chore**: 其他变更 / Other changes
|
||||||
|
|
||||||
|
### 范围 / Scope
|
||||||
|
|
||||||
|
- **core**: 核心包 @esengine/ecs-framework
|
||||||
|
- **math**: 数学库包
|
||||||
|
- **editor**: 编辑器
|
||||||
|
- **docs**: 文档
|
||||||
|
|
||||||
|
### 示例 / Examples
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 新功能
|
||||||
|
feat(core): add component pooling system
|
||||||
|
|
||||||
|
# 错误修复
|
||||||
|
fix(core): fix entity deletion memory leak
|
||||||
|
|
||||||
|
# 破坏性变更
|
||||||
|
feat(core): redesign system lifecycle
|
||||||
|
|
||||||
|
BREAKING CHANGE: System.initialize() now requires Scene parameter
|
||||||
|
```
|
||||||
|
|
||||||
|
## 自动发布 / Automatic Release
|
||||||
|
|
||||||
|
本项目使用 Semantic Release 自动发布。
|
||||||
|
|
||||||
|
This project uses Semantic Release for automatic publishing.
|
||||||
|
|
||||||
|
### 版本规则 / Versioning Rules
|
||||||
|
|
||||||
|
根据你的 commit 类型,版本号会自动更新:
|
||||||
|
|
||||||
|
Based on your commit type, the version will be automatically updated:
|
||||||
|
|
||||||
|
- `feat`: 增加 **minor** 版本 (0.x.0)
|
||||||
|
- `fix`, `perf`, `refactor`: 增加 **patch** 版本 (0.0.x)
|
||||||
|
- `BREAKING CHANGE`: 增加 **major** 版本 (x.0.0)
|
||||||
|
|
||||||
|
### 发布流程 / Release Process
|
||||||
|
|
||||||
|
1. 提交代码到 `master` 分支 / Push commits to `master` branch
|
||||||
|
2. GitHub Actions 自动运行测试 / GitHub Actions runs tests automatically
|
||||||
|
3. Semantic Release 分析 commits / Semantic Release analyzes commits
|
||||||
|
4. 自动更新版本号 / Version is automatically updated
|
||||||
|
5. 自动生成 CHANGELOG.md / CHANGELOG.md is automatically generated
|
||||||
|
6. 自动发布到 npm / Package is automatically published to npm
|
||||||
|
7. 自动创建 GitHub Release / GitHub Release is automatically created
|
||||||
|
|
||||||
|
## 开发流程 / Development Workflow
|
||||||
|
|
||||||
|
1. Fork 本仓库 / Fork this repository
|
||||||
|
2. 创建特性分支 / Create a feature branch
|
||||||
|
```bash
|
||||||
|
git checkout -b feat/my-feature
|
||||||
|
```
|
||||||
|
3. 提交你的变更 / Commit your changes
|
||||||
|
```bash
|
||||||
|
git commit -m "feat(core): add new feature"
|
||||||
|
```
|
||||||
|
4. 推送到你的 Fork / Push to your fork
|
||||||
|
```bash
|
||||||
|
git push origin feat/my-feature
|
||||||
|
```
|
||||||
|
5. 创建 Pull Request / Create a Pull Request
|
||||||
|
|
||||||
|
## 本地测试 / Local Testing
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 安装依赖
|
||||||
|
npm install
|
||||||
|
|
||||||
|
# 运行测试
|
||||||
|
npm test
|
||||||
|
|
||||||
|
# 构建
|
||||||
|
npm run build
|
||||||
|
|
||||||
|
# 代码检查
|
||||||
|
npm run lint
|
||||||
|
|
||||||
|
# 代码格式化
|
||||||
|
npm run format
|
||||||
|
```
|
||||||
|
|
||||||
|
## 问题反馈 / Issue Reporting
|
||||||
|
|
||||||
|
如果你发现了 bug 或有新功能建议,请[创建 Issue](https://github.com/esengine/esengine/issues/new)。
|
||||||
|
|
||||||
|
If you find a bug or have a feature request, please [create an issue](https://github.com/esengine/esengine/issues/new).
|
||||||
|
|
||||||
|
## 许可证 / License
|
||||||
|
|
||||||
|
通过贡献代码,你同意你的贡献将遵循 MIT 许可证。
|
||||||
|
|
||||||
|
By contributing, you agree that your contributions will be licensed under the MIT License.
|
||||||
@@ -1,201 +1,21 @@
|
|||||||
Apache License
|
MIT License
|
||||||
Version 2.0, January 2004
|
|
||||||
http://www.apache.org/licenses/
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
Copyright (c) 2025 ESEngine Contributors
|
||||||
|
|
||||||
1. Definitions.
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
"License" shall mean the terms and conditions for use, reproduction,
|
The above copyright notice and this permission notice shall be included in all
|
||||||
and distribution as defined by Sections 1 through 9 of this document.
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
"Licensor" shall mean the copyright owner or entity authorized by
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
the copyright owner that is granting the License.
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
"Legal Entity" shall mean the union of the acting entity and all
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
other entities that control, are controlled by, or are under common
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
control with that entity. For the purposes of this definition,
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
"control" means (i) the power, direct or indirect, to cause the
|
SOFTWARE.
|
||||||
direction or management of such entity, whether by contract or
|
|
||||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
||||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
||||||
|
|
||||||
"You" (or "Your") shall mean an individual or Legal Entity
|
|
||||||
exercising permissions granted by this License.
|
|
||||||
|
|
||||||
"Source" form shall mean the preferred form for making modifications,
|
|
||||||
including but not limited to software source code, documentation
|
|
||||||
source, and configuration files.
|
|
||||||
|
|
||||||
"Object" form shall mean any form resulting from mechanical
|
|
||||||
transformation or translation of a Source form, including but
|
|
||||||
not limited to compiled object code, generated documentation,
|
|
||||||
and conversions to other media types.
|
|
||||||
|
|
||||||
"Work" shall mean the work of authorship, whether in Source or
|
|
||||||
Object form, made available under the License, as indicated by a
|
|
||||||
copyright notice that is included in or attached to the work
|
|
||||||
(an example is provided in the Appendix below).
|
|
||||||
|
|
||||||
"Derivative Works" shall mean any work, whether in Source or Object
|
|
||||||
form, that is based on (or derived from) the Work and for which the
|
|
||||||
editorial revisions, annotations, elaborations, or other modifications
|
|
||||||
represent, as a whole, an original work of authorship. For the purposes
|
|
||||||
of this License, Derivative Works shall not include works that remain
|
|
||||||
separable from, or merely link (or bind by name) to the interfaces of,
|
|
||||||
the Work and Derivative Works thereof.
|
|
||||||
|
|
||||||
"Contribution" shall mean any work of authorship, including
|
|
||||||
the original version of the Work and any modifications or additions
|
|
||||||
to that Work or Derivative Works thereof, that is intentionally
|
|
||||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
||||||
or by an individual or Legal Entity authorized to submit on behalf of
|
|
||||||
the copyright owner. For the purposes of this definition, "submitted"
|
|
||||||
means any form of electronic, verbal, or written communication sent
|
|
||||||
to the Licensor or its representatives, including but not limited to
|
|
||||||
communication on electronic mailing lists, source code control systems,
|
|
||||||
and issue tracking systems that are managed by, or on behalf of, the
|
|
||||||
Licensor for the purpose of discussing and improving the Work, but
|
|
||||||
excluding communication that is conspicuously marked or otherwise
|
|
||||||
designated in writing by the copyright owner as "Not a Contribution."
|
|
||||||
|
|
||||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
||||||
on behalf of whom a Contribution has been received by Licensor and
|
|
||||||
subsequently incorporated within the Work.
|
|
||||||
|
|
||||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
copyright license to reproduce, prepare Derivative Works of,
|
|
||||||
publicly display, publicly perform, sublicense, and distribute the
|
|
||||||
Work and such Derivative Works in Source or Object form.
|
|
||||||
|
|
||||||
3. Grant of Patent License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
(except as stated in this section) patent license to make, have made,
|
|
||||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
||||||
where such license applies only to those patent claims licensable
|
|
||||||
by such Contributor that are necessarily infringed by their
|
|
||||||
Contribution(s) alone or by combination of their Contribution(s)
|
|
||||||
with the Work to which such Contribution(s) was submitted. If You
|
|
||||||
institute patent litigation against any entity (including a
|
|
||||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
||||||
or a Contribution incorporated within the Work constitutes direct
|
|
||||||
or contributory patent infringement, then any patent licenses
|
|
||||||
granted to You under this License for that Work shall terminate
|
|
||||||
as of the date such litigation is filed.
|
|
||||||
|
|
||||||
4. Redistribution. You may reproduce and distribute copies of the
|
|
||||||
Work or Derivative Works thereof in any medium, with or without
|
|
||||||
modifications, and in Source or Object form, provided that You
|
|
||||||
meet the following conditions:
|
|
||||||
|
|
||||||
(a) You must give any other recipients of the Work or
|
|
||||||
Derivative Works a copy of this License; and
|
|
||||||
|
|
||||||
(b) You must cause any modified files to carry prominent notices
|
|
||||||
stating that You changed the files; and
|
|
||||||
|
|
||||||
(c) You must retain, in the Source form of any Derivative Works
|
|
||||||
that You distribute, all copyright, patent, trademark, and
|
|
||||||
attribution notices from the Source form of the Work,
|
|
||||||
excluding those notices that do not pertain to any part of
|
|
||||||
the Derivative Works; and
|
|
||||||
|
|
||||||
(d) If the Work includes a "NOTICE" text file as part of its
|
|
||||||
distribution, then any Derivative Works that You distribute must
|
|
||||||
include a readable copy of the attribution notices contained
|
|
||||||
within such NOTICE file, excluding those notices that do not
|
|
||||||
pertain to any part of the Derivative Works, in at least one
|
|
||||||
of the following places: within a NOTICE text file distributed
|
|
||||||
as part of the Derivative Works; within the Source form or
|
|
||||||
documentation, if provided along with the Derivative Works; or,
|
|
||||||
within a display generated by the Derivative Works, if and
|
|
||||||
wherever such third-party notices normally appear. The contents
|
|
||||||
of the NOTICE file are for informational purposes only and
|
|
||||||
do not modify the License. You may add Your own attribution
|
|
||||||
notices within Derivative Works that You distribute, alongside
|
|
||||||
or as an addendum to the NOTICE text from the Work, provided
|
|
||||||
that such additional attribution notices cannot be construed
|
|
||||||
as modifying the License.
|
|
||||||
|
|
||||||
You may add Your own copyright statement to Your modifications and
|
|
||||||
may provide additional or different license terms and conditions
|
|
||||||
for use, reproduction, or distribution of Your modifications, or
|
|
||||||
for any such Derivative Works as a whole, provided Your use,
|
|
||||||
reproduction, and distribution of the Work otherwise complies with
|
|
||||||
the conditions stated in this License.
|
|
||||||
|
|
||||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
||||||
any Contribution intentionally submitted for inclusion in the Work
|
|
||||||
by You to the Licensor shall be under the terms and conditions of
|
|
||||||
this License, without any additional terms or conditions.
|
|
||||||
Notwithstanding the above, nothing herein shall supersede or modify
|
|
||||||
the terms of any separate license agreement you may have executed
|
|
||||||
with Licensor regarding such Contributions.
|
|
||||||
|
|
||||||
6. Trademarks. This License does not grant permission to use the trade
|
|
||||||
names, trademarks, service marks, or product names of the Licensor,
|
|
||||||
except as required for reasonable and customary use in describing the
|
|
||||||
origin of the Work and reproducing the content of the NOTICE file.
|
|
||||||
|
|
||||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
||||||
agreed to in writing, Licensor provides the Work (and each
|
|
||||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
||||||
implied, including, without limitation, any warranties or conditions
|
|
||||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
||||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
||||||
appropriateness of using or redistributing the Work and assume any
|
|
||||||
risks associated with Your exercise of permissions under this License.
|
|
||||||
|
|
||||||
8. Limitation of Liability. In no event and under no legal theory,
|
|
||||||
whether in tort (including negligence), contract, or otherwise,
|
|
||||||
unless required by applicable law (such as deliberate and grossly
|
|
||||||
negligent acts) or agreed to in writing, shall any Contributor be
|
|
||||||
liable to You for damages, including any direct, indirect, special,
|
|
||||||
incidental, or consequential damages of any character arising as a
|
|
||||||
result of this License or out of the use or inability to use the
|
|
||||||
Work (including but not limited to damages for loss of goodwill,
|
|
||||||
work stoppage, computer failure or malfunction, or any and all
|
|
||||||
other commercial damages or losses), even if such Contributor
|
|
||||||
has been advised of the possibility of such damages.
|
|
||||||
|
|
||||||
9. Accepting Warranty or Additional Liability. While redistributing
|
|
||||||
the Work or Derivative Works thereof, You may choose to offer,
|
|
||||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
||||||
or other liability obligations and/or rights consistent with this
|
|
||||||
License. However, in accepting such obligations, You may act only
|
|
||||||
on Your own behalf and on Your sole responsibility, not on behalf
|
|
||||||
of any other Contributor, and only if You agree to indemnify,
|
|
||||||
defend, and hold each Contributor harmless for any liability
|
|
||||||
incurred by, or claims asserted against, such Contributor by reason
|
|
||||||
of your accepting any such warranty or additional liability.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
APPENDIX: How to apply the Apache License to your work.
|
|
||||||
|
|
||||||
To apply the Apache License to your work, attach the following
|
|
||||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
||||||
replaced with your own identifying information. (Don't include
|
|
||||||
the brackets!) The text should be enclosed in the appropriate
|
|
||||||
comment syntax for the file format. We also recommend that a
|
|
||||||
file or class name and description of purpose be included on the
|
|
||||||
same "printed page" as the copyright notice for easier
|
|
||||||
identification within third-party archives.
|
|
||||||
|
|
||||||
Copyright [yyyy] [name of copyright owner]
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
|
|||||||
@@ -1,139 +1,277 @@
|
|||||||
Cegret-framework
|
<h1 align="center">
|
||||||
|
<img src="https://raw.githubusercontent.com/esengine/esengine/master/docs/public/logo.svg" alt="ESEngine" width="180">
|
||||||
|
<br>
|
||||||
|
ESEngine
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<strong>Cross-platform 2D Game Engine</strong>
|
||||||
|
</p>
|
||||||
|
|
||||||
[](https://lgtm.com/projects/g/esengine/egret-framework/context:javascript)
|
<p align="center">
|
||||||
|
<a href="https://www.npmjs.com/package/@esengine/ecs-framework"><img src="https://img.shields.io/npm/v/@esengine/ecs-framework?style=flat-square&color=blue" alt="npm"></a>
|
||||||
|
<a href="https://github.com/esengine/esengine/actions"><img src="https://img.shields.io/github/actions/workflow/status/esengine/esengine/ci.yml?branch=master&style=flat-square" alt="build"></a>
|
||||||
|
<a href="https://github.com/esengine/esengine/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-green?style=flat-square" alt="license"></a>
|
||||||
|
<a href="https://github.com/esengine/esengine/stargazers"><img src="https://img.shields.io/github/stars/esengine/esengine?style=flat-square" alt="stars"></a>
|
||||||
|
<img src="https://img.shields.io/badge/TypeScript-5.0+-blue?style=flat-square&logo=typescript&logoColor=white" alt="TypeScript">
|
||||||
|
</p>
|
||||||
|
|
||||||
这是一套用于egret的游戏框架,里面包含ECS框架用于管理场景实体,一些常用2D碰撞检测及A*寻路。如果您还需要包含其他的AI系统可以查看作者其他库(行为树、简易FSM、实用AI)。
|
<p align="center">
|
||||||
|
<b>English</b> | <a href="./README_CN.md">中文</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
## 在线框架演示
|
<p align="center">
|
||||||
|
<a href="https://esengine.cn/">Documentation</a> ·
|
||||||
|
<a href="https://esengine.cn/api/README">API Reference</a> ·
|
||||||
|
<a href="https://github.com/esengine/esengine/releases">Download Editor</a> ·
|
||||||
|
<a href="./examples/">Examples</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
[非完整游戏演示](http://www.hyuan.org/samples)
|
---
|
||||||
|
|
||||||
## 入门教程
|
## Overview
|
||||||
|
|
||||||
[Getting Start](https://github.com/esengine/egret-framework/wiki/Getting-Start)
|
ESEngine is a cross-platform 2D game engine built from the ground up with modern web technologies. It provides a comprehensive toolset that enables developers to focus on creating games rather than building infrastructure.
|
||||||
|
|
||||||
打开白鹭工程 替换 `Main.ts` 文件内容
|
Export your games to multiple platforms including web browsers, WeChat Mini Games, and other mini-game platforms from a single codebase.
|
||||||
|
|
||||||
```ts
|
## Key Features
|
||||||
class Main extends es.Core {
|
|
||||||
/**
|
| Feature | Description |
|
||||||
* 由监听事件 egret.Event.ADDED_TO_STAGE后触发的事件
|
|---------|-------------|
|
||||||
*/
|
| **ECS Architecture** | Data-driven Entity-Component-System pattern for flexible and cache-friendly game logic |
|
||||||
protected initialize() {
|
| **High-Performance Rendering** | Rust/WebAssembly 2D renderer with automatic sprite batching and WebGL 2.0 backend |
|
||||||
// 初始化游戏逻辑
|
| **Visual Editor** | Cross-platform desktop editor built with Tauri for scene management and asset workflows |
|
||||||
}
|
| **Modular Design** | Import only what you need - each feature is a standalone package |
|
||||||
|
| **Multi-Platform Export** | Deploy to Web, WeChat Mini Games, and more from one codebase |
|
||||||
/**
|
| **Physics Integration** | 2D physics powered by Rapier with editor visualization |
|
||||||
* 由监听事件 egret.Event.ENTER_FRAME后触发的事件
|
| **Visual Scripting** | Behavior trees and blueprint system for designers |
|
||||||
*/
|
|
||||||
protected async update(){
|
## Tech Stack
|
||||||
// 如果需要更新方法 不能删除super.update()
|
|
||||||
// 会导致框架内所有组件及实体无法更新
|
- **Runtime**: TypeScript, Rust, WebAssembly
|
||||||
super.update();
|
- **Renderer**: WebGL 2.0, WGPU (planned)
|
||||||
|
- **Editor**: Tauri, React, Zustand
|
||||||
// 更新逻辑
|
- **Physics**: Rapier2D
|
||||||
}
|
- **Build**: pnpm, Turborepo, Rollup
|
||||||
|
|
||||||
/**
|
## License
|
||||||
* 在update方法执行完毕后执行 draw方法
|
|
||||||
*/
|
ESEngine is **free and open source** under the [MIT License](LICENSE). No royalties, no strings attached.
|
||||||
public async draw(){
|
|
||||||
// 如果需要绘制方法 不能删除super.draw()
|
## Installation
|
||||||
// 会导致框架内所有渲染组件位置无法更新
|
|
||||||
super.draw();
|
### npm
|
||||||
|
|
||||||
// 绘制逻辑
|
```bash
|
||||||
}
|
npm install @esengine/ecs-framework
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Editor
|
||||||
|
|
||||||
|
Download pre-built binaries from the [Releases](https://github.com/esengine/esengine/releases) page (Windows, macOS).
|
||||||
|
|
||||||
## 版本计划功能
|
## Quick Start
|
||||||
|
|
||||||
- [x] 简易ECS框架
|
```typescript
|
||||||
- [x] 组件列表
|
import {
|
||||||
- [x] 碰撞组件
|
Core, Scene, Entity, Component, EntitySystem,
|
||||||
- [x] 移动组件
|
Matcher, Time, ECSComponent, ECSSystem
|
||||||
- [x] 滚动精灵组件
|
} from '@esengine/ecs-framework';
|
||||||
- [x] 平铺精灵组件
|
|
||||||
- [x] 序列帧动画组件
|
|
||||||
- [x] 相机震动组件
|
|
||||||
- [x] 相机组件
|
|
||||||
- [x] 组件池
|
|
||||||
- [x] 基础碰撞组件(矩形、圆形、多边形碰撞)
|
|
||||||
- [x] 场景组件
|
|
||||||
- [x] 系统列表
|
|
||||||
- [x] 被动系统
|
|
||||||
- [x] 协调系统
|
|
||||||
- [x] 实体系统
|
|
||||||
- [x] 实体解析系统
|
|
||||||
- [x] 扩展库
|
|
||||||
- [x] object扩展
|
|
||||||
- [x] string扩展
|
|
||||||
- [x] texture扩展
|
|
||||||
- [x] time扩展
|
|
||||||
- [x] [array扩展(Extension)](https://github.com/esengine/egret-framework/wiki/Array-%E6%89%A9%E5%B1%95%E8%AF%B4%E6%98%8E)
|
|
||||||
- [x] base64扩展
|
|
||||||
- [x] Stopwatch计数器
|
|
||||||
- [x] Input输入帮助
|
|
||||||
- [x] Keyboard键盘帮助
|
|
||||||
- [x] List池对象
|
|
||||||
- [x] Lock锁帮助
|
|
||||||
- [x] Emitter事件发射器
|
|
||||||
- [x] Random随机类帮助
|
|
||||||
- [x] Rectangle矩形帮助类
|
|
||||||
- [x] Vector2向量帮助类
|
|
||||||
- [x] Content资源管理器
|
|
||||||
- [x] 全局管理器
|
|
||||||
- [x] 向量集Bitset
|
|
||||||
- [x] 图形帮助
|
|
||||||
- [x] 场景过渡
|
|
||||||
- [x] 后处理器
|
|
||||||
- [x] 场景渲染器
|
|
||||||
- [x] 特效组
|
|
||||||
- [x] A*寻路(AStar)
|
|
||||||
- [x] 常用碰撞检测
|
|
||||||
- [x] 数学库
|
|
||||||
- [x] 矩形类(Rectangle)
|
|
||||||
- [x] 简易2D矩阵类(Matrix2D)
|
|
||||||
- [x] 简易2d 向量类(Vector2)
|
|
||||||
- [x] 数学扩展库(MathHelper)
|
|
||||||
- [x] 掩码实用类(Flags)
|
|
||||||
- [x] 贝塞尔曲线(Bezier)
|
|
||||||
- [x] 物理系统(简易)
|
|
||||||
- [x] Collision碰撞检测
|
|
||||||
- [x] ColliderTrigger帮助
|
|
||||||
- [x] Ray2D射线检测
|
|
||||||
- [x] ShapeCollision 多种形状检测
|
|
||||||
- [x] RealtimeCollisions 实时碰撞检测
|
|
||||||
- [x] SpatialHash 网格检测
|
|
||||||
- [x] BreadthFirst 寻路算法
|
|
||||||
- [x] Dijkstra 寻路算法
|
|
||||||
- [x] 事件处理器
|
|
||||||
|
|
||||||
## 关于egret用ecs框架(typescript/javascript)
|
@ECSComponent('Position')
|
||||||
ecs 是功能强大的实体组件系统。typescript与其他语言不同,因此我对ecs的设计尽可能的支持typescript特性。虽然ecs拥有标准实体组件系统,但在细节上有很大不同。创建标准ecs通常处于原始速度、缓存位置和其他性能原因。使用typescript,我们没有struct,因为没有必要匹配标准实体组件系统的设计方式,因为我们对内存布局没有那种控制。
|
class Position extends Component {
|
||||||
|
x = 0;
|
||||||
|
y = 0;
|
||||||
|
}
|
||||||
|
|
||||||
ecs更灵活,可以更好的集中、组织、排序和过滤游戏中的对象。ecs让您拥有轻量级实体和组件,这些组件可以由系统批量处理。
|
@ECSComponent('Velocity')
|
||||||
例如,您在制作一个射手,您可能会有几十到几百个子弹,这些作为轻量级实体由系统批量处理。
|
class Velocity extends Component {
|
||||||
|
dx = 0;
|
||||||
|
dy = 0;
|
||||||
|
}
|
||||||
|
|
||||||
所以ecs在设计当中拥有四种重要类型:世界(Scene),过滤器(Matcher),系统(System)和实体(Entity)
|
@ECSSystem('Movement')
|
||||||
|
class MovementSystem extends EntitySystem {
|
||||||
|
constructor() {
|
||||||
|
super(Matcher.all(Position, Velocity));
|
||||||
|
}
|
||||||
|
|
||||||
## 世界(Scene)
|
protected process(entities: readonly Entity[]): void {
|
||||||
Scene是ecs包含系统和实体最外面的容器。
|
for (const entity of entities) {
|
||||||
|
const pos = entity.getComponent(Position);
|
||||||
|
const vel = entity.getComponent(Velocity);
|
||||||
|
pos.x += vel.dx * Time.deltaTime;
|
||||||
|
pos.y += vel.dy * Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
## 实体(Entity)
|
// Initialize
|
||||||
实体只由系统处理。
|
Core.create();
|
||||||
|
const scene = new Scene();
|
||||||
|
scene.addSystem(new MovementSystem());
|
||||||
|
|
||||||
## 组件(Component)
|
const player = scene.createEntity('Player');
|
||||||
组件应该只包含数据而没有逻辑代码。对数据进行逻辑是系统的工作。
|
player.addComponent(new Position());
|
||||||
|
player.addComponent(new Velocity());
|
||||||
|
|
||||||
## 系统(System)
|
Core.setScene(scene);
|
||||||
ecs中的系统会不断的更新实体。系统使用过滤器选择某些实体,然后仅更新那些选择的实体。
|
|
||||||
|
|
||||||
## 作者其他库(egret)
|
// Game loop
|
||||||
|
function gameLoop(currentTime: number) {
|
||||||
|
Core.update(currentTime / 1000);
|
||||||
|
requestAnimationFrame(gameLoop);
|
||||||
|
}
|
||||||
|
requestAnimationFrame(gameLoop);
|
||||||
|
```
|
||||||
|
|
||||||
- [行为树/实用AI 系统](https://github.com/esengine/egret-BehaviourTree-ai)
|
## Packages
|
||||||
|
|
||||||
|
ESEngine is organized as a monorepo with modular packages.
|
||||||
|
|
||||||
|
### Core
|
||||||
|
|
||||||
|
| Package | Description |
|
||||||
|
|---------|-------------|
|
||||||
|
| `@esengine/ecs-framework` | Core ECS framework with entity management, component system, and queries |
|
||||||
|
| `@esengine/math` | Vector, matrix, and mathematical utilities |
|
||||||
|
| `@esengine/engine` | Rust/WASM 2D renderer |
|
||||||
|
| `@esengine/engine-core` | Engine module system and lifecycle management |
|
||||||
|
|
||||||
|
### Runtime
|
||||||
|
|
||||||
|
| Package | Description |
|
||||||
|
|---------|-------------|
|
||||||
|
| `@esengine/sprite` | 2D sprite rendering and animation |
|
||||||
|
| `@esengine/tilemap` | Tile-based map rendering |
|
||||||
|
| `@esengine/physics-rapier2d` | 2D physics simulation (Rapier) |
|
||||||
|
| `@esengine/behavior-tree` | Behavior tree AI system |
|
||||||
|
| `@esengine/blueprint` | Visual scripting runtime |
|
||||||
|
| `@esengine/camera` | Camera control and management |
|
||||||
|
| `@esengine/audio` | Audio playback |
|
||||||
|
| `@esengine/ui` | UI components |
|
||||||
|
| `@esengine/material-system` | Material and shader system |
|
||||||
|
| `@esengine/asset-system` | Asset loading and management |
|
||||||
|
|
||||||
|
### Editor Extensions
|
||||||
|
|
||||||
|
| Package | Description |
|
||||||
|
|---------|-------------|
|
||||||
|
| `@esengine/sprite-editor` | Sprite inspector and tools |
|
||||||
|
| `@esengine/tilemap-editor` | Visual tilemap editor |
|
||||||
|
| `@esengine/physics-rapier2d-editor` | Physics collider visualization |
|
||||||
|
| `@esengine/behavior-tree-editor` | Visual behavior tree editor |
|
||||||
|
| `@esengine/blueprint-editor` | Visual scripting editor |
|
||||||
|
| `@esengine/material-editor` | Material editor |
|
||||||
|
|
||||||
|
### Platform
|
||||||
|
|
||||||
|
| Package | Description |
|
||||||
|
|---------|-------------|
|
||||||
|
| `@esengine/platform-common` | Platform abstraction interfaces |
|
||||||
|
| `@esengine/platform-web` | Web browser runtime |
|
||||||
|
| `@esengine/platform-wechat` | WeChat Mini Game runtime |
|
||||||
|
|
||||||
|
## Editor
|
||||||
|
|
||||||
|
The ESEngine Editor is a cross-platform desktop application built with Tauri and React.
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
- Scene hierarchy and entity management
|
||||||
|
- Component inspector with custom property editors
|
||||||
|
- Asset browser with drag-and-drop
|
||||||
|
- Tilemap editor with paint and fill tools
|
||||||
|
- Behavior tree visual editor
|
||||||
|
- Blueprint visual scripting
|
||||||
|
- Material and shader editing
|
||||||
|
- Built-in performance profiler
|
||||||
|
- Localization (English, Chinese)
|
||||||
|
|
||||||
|
### Screenshot
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Platform Support
|
||||||
|
|
||||||
|
| Platform | Runtime | Editor |
|
||||||
|
|----------|:-------:|:------:|
|
||||||
|
| Web Browser | ✓ | - |
|
||||||
|
| Windows | - | ✓ |
|
||||||
|
| macOS | - | ✓ |
|
||||||
|
| WeChat Mini Game | In Progress | - |
|
||||||
|
| Playable Ads | Planned | - |
|
||||||
|
| Android | Planned | - |
|
||||||
|
| iOS | Planned | - |
|
||||||
|
|
||||||
|
## Building from Source
|
||||||
|
|
||||||
|
### Prerequisites
|
||||||
|
|
||||||
|
- Node.js 18+
|
||||||
|
- pnpm 10+
|
||||||
|
- Rust toolchain (for WASM renderer)
|
||||||
|
- wasm-pack
|
||||||
|
|
||||||
|
### Setup
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone https://github.com/esengine/esengine.git
|
||||||
|
cd esengine
|
||||||
|
|
||||||
|
pnpm install
|
||||||
|
pnpm build
|
||||||
|
|
||||||
|
# Optional: Build WASM renderer
|
||||||
|
pnpm build:wasm
|
||||||
|
```
|
||||||
|
|
||||||
|
### Run Editor
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd packages/editor-app
|
||||||
|
pnpm tauri:dev
|
||||||
|
```
|
||||||
|
|
||||||
|
### Project Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
esengine/
|
||||||
|
├── packages/ # Engine packages (runtime, editor, platform)
|
||||||
|
├── docs/ # Documentation source
|
||||||
|
├── examples/ # Example projects
|
||||||
|
├── scripts/ # Build utilities
|
||||||
|
└── thirdparty/ # Third-party dependencies
|
||||||
|
```
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
- [Getting Started](https://esengine.cn/guide/getting-started.html)
|
||||||
|
- [Architecture Guide](https://esengine.cn/guide/)
|
||||||
|
- [API Reference](https://esengine.cn/api/README)
|
||||||
|
|
||||||
|
## Community
|
||||||
|
|
||||||
|
- [GitHub Issues](https://github.com/esengine/esengine/issues) - Bug reports and feature requests
|
||||||
|
- [GitHub Discussions](https://github.com/esengine/esengine/discussions) - Questions and ideas
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
Contributions are welcome. Please read the contributing guidelines before submitting a pull request.
|
||||||
|
|
||||||
|
1. Fork the repository
|
||||||
|
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
|
||||||
|
3. Commit your changes (`git commit -m 'Add amazing feature'`)
|
||||||
|
4. Push to the branch (`git push origin feature/amazing-feature`)
|
||||||
|
5. Open a Pull Request
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
ESEngine is licensed under the [MIT License](LICENSE).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
Made with ❤️ by the ESEngine team
|
||||||
|
</p>
|
||||||
|
|||||||
@@ -0,0 +1,278 @@
|
|||||||
|
<h1 align="center">
|
||||||
|
<img src="https://raw.githubusercontent.com/esengine/esengine/master/docs/public/logo.svg" alt="ESEngine" width="180">
|
||||||
|
<br>
|
||||||
|
ESEngine
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<strong>跨平台 2D 游戏引擎</strong>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://www.npmjs.com/package/@esengine/ecs-framework"><img src="https://img.shields.io/npm/v/@esengine/ecs-framework?style=flat-square&color=blue" alt="npm"></a>
|
||||||
|
<a href="https://github.com/esengine/esengine/actions"><img src="https://img.shields.io/github/actions/workflow/status/esengine/esengine/ci.yml?branch=master&style=flat-square" alt="build"></a>
|
||||||
|
<a href="https://github.com/esengine/esengine/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-green?style=flat-square" alt="license"></a>
|
||||||
|
<a href="https://github.com/esengine/esengine/stargazers"><img src="https://img.shields.io/github/stars/esengine/esengine?style=flat-square" alt="stars"></a>
|
||||||
|
<img src="https://img.shields.io/badge/TypeScript-5.0+-blue?style=flat-square&logo=typescript&logoColor=white" alt="TypeScript">
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<a href="./README.md">English</a> | <b>中文</b>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://esengine.cn/">文档</a> ·
|
||||||
|
<a href="https://esengine.cn/api/README">API 参考</a> ·
|
||||||
|
<a href="https://github.com/esengine/esengine/releases">下载编辑器</a> ·
|
||||||
|
<a href="./examples/">示例</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 概述
|
||||||
|
|
||||||
|
ESEngine 是一款基于现代 Web 技术从零构建的跨平台 2D 游戏引擎。它提供完整的工具集,让开发者专注于游戏创作而非基础设施搭建。
|
||||||
|
|
||||||
|
一套代码即可导出到 Web 浏览器、微信小游戏等多个平台。
|
||||||
|
|
||||||
|
## 核心特性
|
||||||
|
|
||||||
|
| 特性 | 描述 |
|
||||||
|
|-----|------|
|
||||||
|
| **ECS 架构** | 数据驱动的实体-组件-系统模式,提供灵活且缓存友好的游戏逻辑 |
|
||||||
|
| **高性能渲染** | Rust/WebAssembly 2D 渲染器,支持自动精灵批处理和 WebGL 2.0 |
|
||||||
|
| **可视化编辑器** | 基于 Tauri 的跨平台桌面编辑器,支持场景管理和资源工作流 |
|
||||||
|
| **模块化设计** | 按需引入,每个功能都是独立的包 |
|
||||||
|
| **多平台导出** | 一套代码部署到 Web、微信小游戏等平台 |
|
||||||
|
| **物理集成** | 基于 Rapier 的 2D 物理,支持编辑器可视化 |
|
||||||
|
| **可视化脚本** | 行为树和蓝图系统,适合策划使用 |
|
||||||
|
|
||||||
|
## 技术栈
|
||||||
|
|
||||||
|
- **运行时**: TypeScript, Rust, WebAssembly
|
||||||
|
- **渲染器**: WebGL 2.0, WGPU (计划中)
|
||||||
|
- **编辑器**: Tauri, React, Zustand
|
||||||
|
- **物理**: Rapier2D
|
||||||
|
- **构建**: pnpm, Turborepo, Rollup
|
||||||
|
|
||||||
|
## 许可证
|
||||||
|
|
||||||
|
ESEngine **完全免费开源**,采用 [MIT 协议](LICENSE)。无版税,无附加条件。
|
||||||
|
|
||||||
|
## 安装
|
||||||
|
|
||||||
|
### npm
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install @esengine/ecs-framework
|
||||||
|
```
|
||||||
|
|
||||||
|
### 编辑器
|
||||||
|
|
||||||
|
从 [Releases](https://github.com/esengine/esengine/releases) 页面下载预编译版本(支持 Windows、macOS)。
|
||||||
|
|
||||||
|
## 快速开始
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import {
|
||||||
|
Core, Scene, Entity, Component, EntitySystem,
|
||||||
|
Matcher, Time, ECSComponent, ECSSystem
|
||||||
|
} from '@esengine/ecs-framework';
|
||||||
|
|
||||||
|
@ECSComponent('Position')
|
||||||
|
class Position extends Component {
|
||||||
|
x = 0;
|
||||||
|
y = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ECSComponent('Velocity')
|
||||||
|
class Velocity extends Component {
|
||||||
|
dx = 0;
|
||||||
|
dy = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ECSSystem('Movement')
|
||||||
|
class MovementSystem extends EntitySystem {
|
||||||
|
constructor() {
|
||||||
|
super(Matcher.all(Position, Velocity));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected process(entities: readonly Entity[]): void {
|
||||||
|
for (const entity of entities) {
|
||||||
|
const pos = entity.getComponent(Position);
|
||||||
|
const vel = entity.getComponent(Velocity);
|
||||||
|
pos.x += vel.dx * Time.deltaTime;
|
||||||
|
pos.y += vel.dy * Time.deltaTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 初始化
|
||||||
|
Core.create();
|
||||||
|
const scene = new Scene();
|
||||||
|
scene.addSystem(new MovementSystem());
|
||||||
|
|
||||||
|
const player = scene.createEntity('Player');
|
||||||
|
player.addComponent(new Position());
|
||||||
|
player.addComponent(new Velocity());
|
||||||
|
|
||||||
|
Core.setScene(scene);
|
||||||
|
|
||||||
|
// 游戏循环
|
||||||
|
function gameLoop(currentTime: number) {
|
||||||
|
Core.update(currentTime / 1000);
|
||||||
|
requestAnimationFrame(gameLoop);
|
||||||
|
}
|
||||||
|
requestAnimationFrame(gameLoop);
|
||||||
|
```
|
||||||
|
|
||||||
|
## 模块
|
||||||
|
|
||||||
|
ESEngine 采用 Monorepo 组织,包含多个模块化包。
|
||||||
|
|
||||||
|
### 核心
|
||||||
|
|
||||||
|
| 包名 | 描述 |
|
||||||
|
|------|------|
|
||||||
|
| `@esengine/ecs-framework` | ECS 框架核心,包含实体管理、组件系统和查询 |
|
||||||
|
| `@esengine/math` | 向量、矩阵和数学工具 |
|
||||||
|
| `@esengine/engine` | Rust/WASM 2D 渲染器 |
|
||||||
|
| `@esengine/engine-core` | 引擎模块系统和生命周期管理 |
|
||||||
|
|
||||||
|
### 运行时
|
||||||
|
|
||||||
|
| 包名 | 描述 |
|
||||||
|
|------|------|
|
||||||
|
| `@esengine/sprite` | 2D 精灵渲染和动画 |
|
||||||
|
| `@esengine/tilemap` | Tilemap 渲染 |
|
||||||
|
| `@esengine/physics-rapier2d` | 2D 物理模拟 (Rapier) |
|
||||||
|
| `@esengine/behavior-tree` | 行为树 AI 系统 |
|
||||||
|
| `@esengine/blueprint` | 可视化脚本运行时 |
|
||||||
|
| `@esengine/camera` | 相机控制和管理 |
|
||||||
|
| `@esengine/audio` | 音频播放 |
|
||||||
|
| `@esengine/ui` | UI 组件 |
|
||||||
|
| `@esengine/material-system` | 材质和着色器系统 |
|
||||||
|
| `@esengine/asset-system` | 资源加载和管理 |
|
||||||
|
|
||||||
|
### 编辑器扩展
|
||||||
|
|
||||||
|
| 包名 | 描述 |
|
||||||
|
|------|------|
|
||||||
|
| `@esengine/sprite-editor` | 精灵检视器和工具 |
|
||||||
|
| `@esengine/tilemap-editor` | 可视化 Tilemap 编辑器 |
|
||||||
|
| `@esengine/physics-rapier2d-editor` | 物理碰撞体可视化 |
|
||||||
|
| `@esengine/behavior-tree-editor` | 可视化行为树编辑器 |
|
||||||
|
| `@esengine/blueprint-editor` | 可视化脚本编辑器 |
|
||||||
|
| `@esengine/material-editor` | 材质编辑器 |
|
||||||
|
|
||||||
|
### 平台
|
||||||
|
|
||||||
|
| 包名 | 描述 |
|
||||||
|
|------|------|
|
||||||
|
| `@esengine/platform-common` | 平台抽象接口 |
|
||||||
|
| `@esengine/platform-web` | Web 浏览器运行时 |
|
||||||
|
| `@esengine/platform-wechat` | 微信小游戏运行时 |
|
||||||
|
|
||||||
|
## 编辑器
|
||||||
|
|
||||||
|
ESEngine 编辑器是基于 Tauri 和 React 构建的跨平台桌面应用。
|
||||||
|
|
||||||
|
### 功能
|
||||||
|
|
||||||
|
- 场景层级和实体管理
|
||||||
|
- 组件检视器,支持自定义属性编辑器
|
||||||
|
- 资源浏览器,支持拖放
|
||||||
|
- Tilemap 编辑器,支持绘制和填充工具
|
||||||
|
- 行为树可视化编辑器
|
||||||
|
- 蓝图可视化脚本
|
||||||
|
- 材质和着色器编辑
|
||||||
|
- 内置性能分析器
|
||||||
|
- 多语言支持(英文、中文)
|
||||||
|
|
||||||
|
### 截图
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## 平台支持
|
||||||
|
|
||||||
|
| 平台 | 运行时 | 编辑器 |
|
||||||
|
|------|:------:|:------:|
|
||||||
|
| Web 浏览器 | ✓ | - |
|
||||||
|
| Windows | - | ✓ |
|
||||||
|
| macOS | - | ✓ |
|
||||||
|
| 微信小游戏 | 开发中 | - |
|
||||||
|
| Playable 可玩广告 | 计划中 | - |
|
||||||
|
| Android | 计划中 | - |
|
||||||
|
| iOS | 计划中 | - |
|
||||||
|
|
||||||
|
## 从源码构建
|
||||||
|
|
||||||
|
### 前置要求
|
||||||
|
|
||||||
|
- Node.js 18+
|
||||||
|
- pnpm 10+
|
||||||
|
- Rust 工具链(用于 WASM 渲染器)
|
||||||
|
- wasm-pack
|
||||||
|
|
||||||
|
### 安装
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone https://github.com/esengine/esengine.git
|
||||||
|
cd esengine
|
||||||
|
|
||||||
|
pnpm install
|
||||||
|
pnpm build
|
||||||
|
|
||||||
|
# 可选:构建 WASM 渲染器
|
||||||
|
pnpm build:wasm
|
||||||
|
```
|
||||||
|
|
||||||
|
### 运行编辑器
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd packages/editor-app
|
||||||
|
pnpm tauri:dev
|
||||||
|
```
|
||||||
|
|
||||||
|
### 项目结构
|
||||||
|
|
||||||
|
```
|
||||||
|
esengine/
|
||||||
|
├── packages/ # 引擎包(运行时、编辑器、平台)
|
||||||
|
├── docs/ # 文档源码
|
||||||
|
├── examples/ # 示例项目
|
||||||
|
├── scripts/ # 构建工具
|
||||||
|
└── thirdparty/ # 第三方依赖
|
||||||
|
```
|
||||||
|
|
||||||
|
## 文档
|
||||||
|
|
||||||
|
- [快速入门](https://esengine.cn/guide/getting-started.html)
|
||||||
|
- [架构指南](https://esengine.cn/guide/)
|
||||||
|
- [API 参考](https://esengine.cn/api/README)
|
||||||
|
|
||||||
|
## 社区
|
||||||
|
|
||||||
|
- [GitHub Issues](https://github.com/esengine/esengine/issues) - Bug 反馈和功能建议
|
||||||
|
- [GitHub Discussions](https://github.com/esengine/esengine/discussions) - 问题和想法
|
||||||
|
- [QQ 交流群](https://jq.qq.com/?_wv=1027&k=29w1Nud6) - 中文社区
|
||||||
|
|
||||||
|
## 贡献
|
||||||
|
|
||||||
|
欢迎贡献代码。提交 PR 前请阅读贡献指南。
|
||||||
|
|
||||||
|
1. Fork 仓库
|
||||||
|
2. 创建功能分支 (`git checkout -b feature/amazing-feature`)
|
||||||
|
3. 提交修改 (`git commit -m 'Add amazing feature'`)
|
||||||
|
4. 推送分支 (`git push origin feature/amazing-feature`)
|
||||||
|
5. 发起 Pull Request
|
||||||
|
|
||||||
|
## 许可证
|
||||||
|
|
||||||
|
ESEngine 基于 [MIT 协议](LICENSE) 开源。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
由 ESEngine 团队用 ❤️ 打造
|
||||||
|
</p>
|
||||||
@@ -1,21 +1,113 @@
|
|||||||
# Security Policy
|
# Security Policy / 安全政策
|
||||||
|
|
||||||
|
**English** | [中文](#安全政策-1)
|
||||||
|
|
||||||
## Supported Versions
|
## Supported Versions
|
||||||
|
|
||||||
Use this section to tell people about which versions of your project are
|
We provide security updates for the following versions:
|
||||||
currently being supported with security updates.
|
|
||||||
|
|
||||||
| Version | Supported |
|
| Version | Supported |
|
||||||
| ------- | ------------------ |
|
| ------- | ------------------ |
|
||||||
| 5.1.x | :white_check_mark: |
|
| 2.x.x | :white_check_mark: |
|
||||||
| 5.0.x | :x: |
|
| 1.x.x | :x: |
|
||||||
| 4.0.x | :white_check_mark: |
|
|
||||||
| < 4.0 | :x: |
|
|
||||||
|
|
||||||
## Reporting a Vulnerability
|
## Reporting a Vulnerability
|
||||||
|
|
||||||
Use this section to tell people how to report a vulnerability.
|
If you discover a security vulnerability, please report it through the following channels:
|
||||||
|
|
||||||
Tell them where to go, how often they can expect to get an update on a
|
### Reporting Channels
|
||||||
reported vulnerability, what to expect if the vulnerability is accepted or
|
|
||||||
declined, etc.
|
- **GitHub Security Advisories**: [Report a vulnerability](https://github.com/esengine/esengine/security/advisories/new) (Recommended)
|
||||||
|
- **Email**: security@esengine.dev
|
||||||
|
|
||||||
|
### Reporting Guidelines
|
||||||
|
|
||||||
|
1. **Do NOT** report security vulnerabilities in public issues
|
||||||
|
2. Provide a detailed description of the vulnerability, including:
|
||||||
|
- Affected versions
|
||||||
|
- Steps to reproduce
|
||||||
|
- Potential impact
|
||||||
|
- Suggested fix (if available)
|
||||||
|
|
||||||
|
### Response Timeline
|
||||||
|
|
||||||
|
- **Acknowledgment**: Within 72 hours
|
||||||
|
- **Initial Assessment**: Within 1 week
|
||||||
|
- **Fix Release**: Typically within 2-4 weeks, depending on severity
|
||||||
|
|
||||||
|
### Process
|
||||||
|
|
||||||
|
1. We will confirm the existence and severity of the vulnerability
|
||||||
|
2. Develop and test a fix
|
||||||
|
3. Release a security update
|
||||||
|
4. Publicly disclose the vulnerability details after the fix is released
|
||||||
|
|
||||||
|
## Security Best Practices
|
||||||
|
|
||||||
|
When using ESEngine, please follow these security recommendations:
|
||||||
|
|
||||||
|
- Always use the latest stable version
|
||||||
|
- Regularly update dependencies
|
||||||
|
- Disable debug mode in production
|
||||||
|
- Validate all external input data
|
||||||
|
- Do not store sensitive information on the client side
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 安全政策
|
||||||
|
|
||||||
|
[English](#security-policy--安全政策) | **中文**
|
||||||
|
|
||||||
|
## 支持的版本
|
||||||
|
|
||||||
|
我们为以下版本提供安全更新:
|
||||||
|
|
||||||
|
| 版本 | 支持状态 |
|
||||||
|
| ------- | ------------------ |
|
||||||
|
| 2.x.x | :white_check_mark: |
|
||||||
|
| 1.x.x | :x: |
|
||||||
|
|
||||||
|
## 报告漏洞
|
||||||
|
|
||||||
|
如果您发现了安全漏洞,请通过以下方式报告:
|
||||||
|
|
||||||
|
### 报告渠道
|
||||||
|
|
||||||
|
- **GitHub 安全公告**: [报告漏洞](https://github.com/esengine/esengine/security/advisories/new)(推荐)
|
||||||
|
- **邮箱**: security@esengine.dev
|
||||||
|
|
||||||
|
### 报告指南
|
||||||
|
|
||||||
|
1. **不要**在公开的 issue 中报告安全漏洞
|
||||||
|
2. 提供详细的漏洞描述,包括:
|
||||||
|
- 受影响的版本
|
||||||
|
- 复现步骤
|
||||||
|
- 潜在的影响范围
|
||||||
|
- 如果可能,提供修复建议
|
||||||
|
|
||||||
|
### 响应时间
|
||||||
|
|
||||||
|
- **确认收到**: 72小时内
|
||||||
|
- **初步评估**: 1周内
|
||||||
|
- **修复发布**: 根据严重程度,通常在2-4周内
|
||||||
|
|
||||||
|
### 处理流程
|
||||||
|
|
||||||
|
1. 我们会确认漏洞的存在和严重程度
|
||||||
|
2. 开发修复方案并进行测试
|
||||||
|
3. 发布安全更新
|
||||||
|
4. 在修复发布后,会在相关渠道公布漏洞详情
|
||||||
|
|
||||||
|
## 安全最佳实践
|
||||||
|
|
||||||
|
使用 ESEngine 时,请遵循以下安全建议:
|
||||||
|
|
||||||
|
- 始终使用最新的稳定版本
|
||||||
|
- 定期更新依赖项
|
||||||
|
- 在生产环境中禁用调试模式
|
||||||
|
- 验证所有外部输入数据
|
||||||
|
- 不要在客户端存储敏感信息
|
||||||
|
|
||||||
|
感谢您帮助保持 ESEngine 的安全性!
|
||||||
|
|
||||||
|
Thank you for helping keep ESEngine secure!
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
theme: jekyll-theme-slate
|
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
# Codecov 配置文件
|
||||||
|
# https://docs.codecov.com/docs/codecov-yaml
|
||||||
|
|
||||||
|
coverage:
|
||||||
|
status:
|
||||||
|
# 项目整体覆盖率要求
|
||||||
|
project:
|
||||||
|
default:
|
||||||
|
target: auto
|
||||||
|
threshold: 1%
|
||||||
|
base: auto
|
||||||
|
|
||||||
|
# 补丁覆盖率要求(针对 PR 中的新代码)
|
||||||
|
patch:
|
||||||
|
default:
|
||||||
|
target: 50% # 降低补丁覆盖率要求到 50%
|
||||||
|
threshold: 5%
|
||||||
|
base: auto
|
||||||
|
|
||||||
|
# 精确度设置
|
||||||
|
precision: 2
|
||||||
|
round: down
|
||||||
|
range: "70...100"
|
||||||
|
|
||||||
|
# 注释设置
|
||||||
|
comment:
|
||||||
|
layout: "reach,diff,flags,tree,files"
|
||||||
|
behavior: default
|
||||||
|
require_changes: false
|
||||||
|
require_base: false
|
||||||
|
require_head: true
|
||||||
|
|
||||||
|
# 忽略的文件/目录
|
||||||
|
ignore:
|
||||||
|
- "tests/**/*"
|
||||||
|
- "**/*.test.ts"
|
||||||
|
- "**/*.spec.ts"
|
||||||
|
- "**/test/**/*"
|
||||||
|
- "**/tests/**/*"
|
||||||
|
- "bin/**/*"
|
||||||
|
- "dist/**/*"
|
||||||
|
- "node_modules/**/*"
|
||||||
|
|
||||||
|
# 标志组
|
||||||
|
flags:
|
||||||
|
core:
|
||||||
|
paths:
|
||||||
|
- packages/core/src/
|
||||||
|
carryforward: true
|
||||||
|
|
||||||
|
# GitHub Checks 配置
|
||||||
|
github_checks:
|
||||||
|
annotations: true
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"engineVersion": "5.2.33",
|
|
||||||
"compilerVersion": "5.2.33",
|
|
||||||
"template": {},
|
|
||||||
"target": {
|
|
||||||
"current": "web"
|
|
||||||
},
|
|
||||||
"modules": [
|
|
||||||
{
|
|
||||||
"name": "egret"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "eui"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "assetsmanager"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "game"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "tween"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "promise"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "dragonBones"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "framework",
|
|
||||||
"path": "./libs/framework"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "fairygui",
|
|
||||||
"path": "./libs/fairygui"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
Before Width: | Height: | Size: 4.2 KiB |
@@ -1,95 +0,0 @@
|
|||||||
<!DOCTYPE HTML>
|
|
||||||
<html>
|
|
||||||
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<title>Egret</title>
|
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no" />
|
|
||||||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
|
||||||
<meta name="full-screen" content="true" />
|
|
||||||
<meta name="screen-orientation" content="portrait" />
|
|
||||||
<meta name="x5-fullscreen" content="true" />
|
|
||||||
<meta name="360-fullscreen" content="true" />
|
|
||||||
<style>
|
|
||||||
html, body {
|
|
||||||
-ms-touch-action: none;
|
|
||||||
background: #888888;
|
|
||||||
padding: 0;
|
|
||||||
border: 0;
|
|
||||||
margin: 0;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
<div style="margin: auto;width: 100%;height: 100%;" class="egret-player"
|
|
||||||
data-entry-class="Main"
|
|
||||||
data-orientation="auto"
|
|
||||||
data-scale-mode="fixedWidth"
|
|
||||||
data-frame-rate="60"
|
|
||||||
data-content-width="640"
|
|
||||||
data-content-height="1136"
|
|
||||||
data-multi-fingered="2"
|
|
||||||
data-show-fps="false" data-show-log="false"
|
|
||||||
data-show-fps-style="x:0,y:0,size:12,textColor:0xffffff,bgAlpha:0.9">
|
|
||||||
</div>
|
|
||||||
<script>
|
|
||||||
var loadScript = function (list, callback) {
|
|
||||||
var loaded = 0;
|
|
||||||
var loadNext = function () {
|
|
||||||
loadSingleScript(list[loaded], function () {
|
|
||||||
loaded++;
|
|
||||||
if (loaded >= list.length) {
|
|
||||||
callback();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
loadNext();
|
|
||||||
}
|
|
||||||
})
|
|
||||||
};
|
|
||||||
loadNext();
|
|
||||||
};
|
|
||||||
|
|
||||||
var loadSingleScript = function (src, callback) {
|
|
||||||
var s = document.createElement('script');
|
|
||||||
s.async = false;
|
|
||||||
s.src = src;
|
|
||||||
s.addEventListener('load', function () {
|
|
||||||
s.parentNode.removeChild(s);
|
|
||||||
s.removeEventListener('load', arguments.callee, false);
|
|
||||||
callback();
|
|
||||||
}, false);
|
|
||||||
document.body.appendChild(s);
|
|
||||||
};
|
|
||||||
|
|
||||||
var xhr = new XMLHttpRequest();
|
|
||||||
xhr.open('GET', './manifest.json?v=' + Math.random(), true);
|
|
||||||
xhr.addEventListener("load", function () {
|
|
||||||
var manifest = JSON.parse(xhr.response);
|
|
||||||
var list = manifest.initial.concat(manifest.game);
|
|
||||||
loadScript(list, function () {
|
|
||||||
/**
|
|
||||||
* {
|
|
||||||
* "renderMode":, //Engine rendering mode, "canvas" or "webgl"
|
|
||||||
* "audioType": 0 //Use the audio type, 0: default, 2: web audio, 3: audio
|
|
||||||
* "antialias": //Whether the anti-aliasing is enabled in WebGL mode, true: on, false: off, defaults to false
|
|
||||||
* "calculateCanvasScaleFactor": //a function return canvas scale factor
|
|
||||||
* }
|
|
||||||
**/
|
|
||||||
egret.runEgret({ renderMode: "webgl", audioType: 0, calculateCanvasScaleFactor:function(context) {
|
|
||||||
var backingStore = context.backingStorePixelRatio ||
|
|
||||||
context.webkitBackingStorePixelRatio ||
|
|
||||||
context.mozBackingStorePixelRatio ||
|
|
||||||
context.msBackingStorePixelRatio ||
|
|
||||||
context.oBackingStorePixelRatio ||
|
|
||||||
context.backingStorePixelRatio || 1;
|
|
||||||
return (window.devicePixelRatio || 1) / backingStore;
|
|
||||||
}});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
xhr.send(null);
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
|
|
||||||
</html>
|
|
||||||
@@ -1,52 +0,0 @@
|
|||||||
declare module skins{
|
|
||||||
class ButtonSkin extends eui.Skin{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare module skins{
|
|
||||||
class CheckBoxSkin extends eui.Skin{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare module skins{
|
|
||||||
class HScrollBarSkin extends eui.Skin{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare module skins{
|
|
||||||
class HSliderSkin extends eui.Skin{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare module skins{
|
|
||||||
class ItemRendererSkin extends eui.Skin{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare module skins{
|
|
||||||
class PanelSkin extends eui.Skin{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare module skins{
|
|
||||||
class ProgressBarSkin extends eui.Skin{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare module skins{
|
|
||||||
class RadioButtonSkin extends eui.Skin{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare module skins{
|
|
||||||
class ScrollerSkin extends eui.Skin{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare module skins{
|
|
||||||
class TextInputSkin extends eui.Skin{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare module skins{
|
|
||||||
class ToggleSwitchSkin extends eui.Skin{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare module skins{
|
|
||||||
class VScrollBarSkin extends eui.Skin{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare module skins{
|
|
||||||
class VSliderSkin extends eui.Skin{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
{
|
|
||||||
"initial": [
|
|
||||||
"libs/modules/egret/egret.js",
|
|
||||||
"libs/modules/egret/egret.web.js",
|
|
||||||
"libs/modules/eui/eui.js",
|
|
||||||
"libs/modules/assetsmanager/assetsmanager.js",
|
|
||||||
"libs/modules/game/game.js",
|
|
||||||
"libs/modules/tween/tween.js",
|
|
||||||
"libs/modules/promise/promise.js",
|
|
||||||
"libs/modules/dragonBones/dragonBones.js",
|
|
||||||
"libs/framework/framework.js",
|
|
||||||
"libs/fairygui/fairygui.js"
|
|
||||||
],
|
|
||||||
"game": [
|
|
||||||
"bin-debug/Fgui/common/commonBinder.js",
|
|
||||||
"bin-debug/UI/mvc/BaseView.js",
|
|
||||||
"bin-debug/SampleHelpers/SampleScene.js",
|
|
||||||
"bin-debug/Scenes/Ninja Adventure/ProjectileHitDetector.js",
|
|
||||||
"bin-debug/UI/loading/LoadingView.js",
|
|
||||||
"bin-debug/Scenes/Ninja Adventure/CameraBounds.js",
|
|
||||||
"bin-debug/Fgui/loading/loadingBinder.js",
|
|
||||||
"bin-debug/Fgui/loading/UI_View_loading.js",
|
|
||||||
"bin-debug/Fgui/sc/scBinder.js",
|
|
||||||
"bin-debug/Fgui/sc/UI_btn_sc.js",
|
|
||||||
"bin-debug/Fgui/sc/UI_combo_sc_popup.js",
|
|
||||||
"bin-debug/Fgui/sc/UI_View_sc.js",
|
|
||||||
"bin-debug/Platform.js",
|
|
||||||
"bin-debug/Scenes/Animated Tiles/AnimatedTilesScene.js",
|
|
||||||
"bin-debug/Scenes/Empty Scene/BasicScene.js",
|
|
||||||
"bin-debug/Scenes/LineCasting/LineCaster.js",
|
|
||||||
"bin-debug/Scenes/LineCasting/LineCastingScene.js",
|
|
||||||
"bin-debug/Main.js",
|
|
||||||
"bin-debug/Scenes/Ninja Adventure/FireballProjectileController.js",
|
|
||||||
"bin-debug/Scenes/Ninja Adventure/Ninja.js",
|
|
||||||
"bin-debug/Scenes/Ninja Adventure/NinjaAdventureScene.js",
|
|
||||||
"bin-debug/ThemeAdapter.js",
|
|
||||||
"bin-debug/UI/PopManager.js",
|
|
||||||
"bin-debug/UI/loading/LoadingControl.js",
|
|
||||||
"bin-debug/UI/loading/LoadingEvents.js",
|
|
||||||
"bin-debug/AssetAdapter.js",
|
|
||||||
"bin-debug/Fgui/common/UI_com_tips.js",
|
|
||||||
"bin-debug/UI/mvc/EventManager.js",
|
|
||||||
"bin-debug/UI/mvc/Extension.js",
|
|
||||||
"bin-debug/UI/mvc/FguiUtils.js",
|
|
||||||
"bin-debug/UI/mvc/LayerManager.js",
|
|
||||||
"bin-debug/UI/mvc/ViewManager.js",
|
|
||||||
"bin-debug/UI/sc/ScControl.js",
|
|
||||||
"bin-debug/UI/sc/ScEvents.js",
|
|
||||||
"bin-debug/UI/sc/ScView.js"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
@@ -1,121 +0,0 @@
|
|||||||
{
|
|
||||||
"groups": [
|
|
||||||
{
|
|
||||||
"keys": "bg_png,bgNorm_png,moon_png,orange_png,moonNorm_png,orangeNorm_png,tiledMap_json,orthogonal-outside_json,tilemap_json,plume_png",
|
|
||||||
"name": "preload"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"keys": "loading",
|
|
||||||
"name": "loading"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"keys": "sc",
|
|
||||||
"name": "sc"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"keys": "common",
|
|
||||||
"name": "common"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"keys": "1_png,2_png,3_png,4_png,5_png,6_png",
|
|
||||||
"name": "characters"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"resources": [
|
|
||||||
{
|
|
||||||
"url": "preload/bg.png",
|
|
||||||
"type": "image",
|
|
||||||
"name": "bg_png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "preload/bgNorm.png",
|
|
||||||
"type": "image",
|
|
||||||
"name": "bgNorm_png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "preload/moon.png",
|
|
||||||
"type": "image",
|
|
||||||
"name": "moon_png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "preload/orange.png",
|
|
||||||
"type": "image",
|
|
||||||
"name": "orange_png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "preload/moonNorm.png",
|
|
||||||
"type": "image",
|
|
||||||
"name": "moonNorm_png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "preload/orangeNorm.png",
|
|
||||||
"type": "image",
|
|
||||||
"name": "orangeNorm_png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "characters/1.png",
|
|
||||||
"type": "image",
|
|
||||||
"name": "1_png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "characters/2.png",
|
|
||||||
"type": "image",
|
|
||||||
"name": "2_png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "characters/3.png",
|
|
||||||
"type": "image",
|
|
||||||
"name": "3_png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "characters/4.png",
|
|
||||||
"type": "image",
|
|
||||||
"name": "4_png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "characters/5.png",
|
|
||||||
"type": "image",
|
|
||||||
"name": "5_png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "characters/6.png",
|
|
||||||
"type": "image",
|
|
||||||
"name": "6_png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "fgui/common.zip",
|
|
||||||
"type": "bin",
|
|
||||||
"name": "common"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "fgui/sc.zip",
|
|
||||||
"type": "bin",
|
|
||||||
"name": "sc"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "fgui/loading.zip",
|
|
||||||
"type": "bin",
|
|
||||||
"name": "loading"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "preload/caveman/tiledMap.json",
|
|
||||||
"type": "json",
|
|
||||||
"name": "tiledMap_json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "preload/orthogonal/orthogonal-outside.json",
|
|
||||||
"type": "json",
|
|
||||||
"name": "orthogonal-outside_json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "preload/ninja/tilemap.json",
|
|
||||||
"type": "json",
|
|
||||||
"name": "tilemap_json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "preload/plume.png",
|
|
||||||
"type": "image",
|
|
||||||
"name": "plume_png"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
{
|
|
||||||
"skins": {
|
|
||||||
"eui.Button": "resource/eui_skins/ButtonSkin.exml",
|
|
||||||
"eui.CheckBox": "resource/eui_skins/CheckBoxSkin.exml",
|
|
||||||
"eui.HScrollBar": "resource/eui_skins/HScrollBarSkin.exml",
|
|
||||||
"eui.HSlider": "resource/eui_skins/HSliderSkin.exml",
|
|
||||||
"eui.Panel": "resource/eui_skins/PanelSkin.exml",
|
|
||||||
"eui.TextInput": "resource/eui_skins/TextInputSkin.exml",
|
|
||||||
"eui.ProgressBar": "resource/eui_skins/ProgressBarSkin.exml",
|
|
||||||
"eui.RadioButton": "resource/eui_skins/RadioButtonSkin.exml",
|
|
||||||
"eui.Scroller": "resource/eui_skins/ScrollerSkin.exml",
|
|
||||||
"eui.ToggleSwitch": "resource/eui_skins/ToggleSwitchSkin.exml",
|
|
||||||
"eui.VScrollBar": "resource/eui_skins/VScrollBarSkin.exml",
|
|
||||||
"eui.VSlider": "resource/eui_skins/VSliderSkin.exml",
|
|
||||||
"eui.ItemRenderer": "resource/eui_skins/ItemRendererSkin.exml"
|
|
||||||
},
|
|
||||||
"autoGenerateExmlsList": true,
|
|
||||||
"exmls": [
|
|
||||||
"resource/eui_skins/ButtonSkin.exml",
|
|
||||||
"resource/eui_skins/CheckBoxSkin.exml",
|
|
||||||
"resource/eui_skins/HScrollBarSkin.exml",
|
|
||||||
"resource/eui_skins/HSliderSkin.exml",
|
|
||||||
"resource/eui_skins/ItemRendererSkin.exml",
|
|
||||||
"resource/eui_skins/PanelSkin.exml",
|
|
||||||
"resource/eui_skins/ProgressBarSkin.exml",
|
|
||||||
"resource/eui_skins/RadioButtonSkin.exml",
|
|
||||||
"resource/eui_skins/ScrollerSkin.exml",
|
|
||||||
"resource/eui_skins/TextInputSkin.exml",
|
|
||||||
"resource/eui_skins/ToggleSwitchSkin.exml",
|
|
||||||
"resource/eui_skins/VScrollBarSkin.exml",
|
|
||||||
"resource/eui_skins/VSliderSkin.exml"
|
|
||||||
],
|
|
||||||
"path": "resource/default.thm.json"
|
|
||||||
}
|
|
||||||
|
Before Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 11 KiB |
@@ -1,193 +0,0 @@
|
|||||||
{ "height":30,
|
|
||||||
"infinite":false,
|
|
||||||
"layers":[
|
|
||||||
{
|
|
||||||
"data":[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2147483652, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2147483652, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2147483652, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2147483652, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 0, 0, 0, 0, 0, 0, 0, 2147483652, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
|
||||||
"height":30,
|
|
||||||
"id":1,
|
|
||||||
"name":"main",
|
|
||||||
"opacity":1,
|
|
||||||
"type":"tilelayer",
|
|
||||||
"visible":true,
|
|
||||||
"width":40,
|
|
||||||
"x":0,
|
|
||||||
"y":0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"draworder":"topdown",
|
|
||||||
"id":2,
|
|
||||||
"name":"objects",
|
|
||||||
"objects":[
|
|
||||||
{
|
|
||||||
"height":14.8796,
|
|
||||||
"id":6,
|
|
||||||
"name":"spawn",
|
|
||||||
"rotation":0,
|
|
||||||
"type":"",
|
|
||||||
"visible":true,
|
|
||||||
"width":14.8796,
|
|
||||||
"x":48.4346,
|
|
||||||
"y":240.503
|
|
||||||
}],
|
|
||||||
"opacity":1,
|
|
||||||
"type":"objectgroup",
|
|
||||||
"visible":true,
|
|
||||||
"x":0,
|
|
||||||
"y":0
|
|
||||||
}],
|
|
||||||
"nextlayerid":3,
|
|
||||||
"nextobjectid":7,
|
|
||||||
"orientation":"orthogonal",
|
|
||||||
"renderorder":"right-down",
|
|
||||||
"tiledversion":"1.2.1",
|
|
||||||
"tileheight":16,
|
|
||||||
"tilesets":[
|
|
||||||
{
|
|
||||||
"columns":2,
|
|
||||||
"firstgid":1,
|
|
||||||
"image":"tileset.png",
|
|
||||||
"imageheight":32,
|
|
||||||
"imagewidth":32,
|
|
||||||
"margin":0,
|
|
||||||
"name":"tileset",
|
|
||||||
"spacing":0,
|
|
||||||
"tilecount":4,
|
|
||||||
"tileheight":16,
|
|
||||||
"tiles":[
|
|
||||||
{
|
|
||||||
"id":0,
|
|
||||||
"objectgroup":
|
|
||||||
{
|
|
||||||
"draworder":"index",
|
|
||||||
"name":"",
|
|
||||||
"objects":[
|
|
||||||
{
|
|
||||||
"height":16,
|
|
||||||
"id":1,
|
|
||||||
"name":"",
|
|
||||||
"rotation":0,
|
|
||||||
"type":"",
|
|
||||||
"visible":true,
|
|
||||||
"width":16,
|
|
||||||
"x":0,
|
|
||||||
"y":0
|
|
||||||
}],
|
|
||||||
"opacity":1,
|
|
||||||
"type":"objectgroup",
|
|
||||||
"visible":true,
|
|
||||||
"x":0,
|
|
||||||
"y":0
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id":2,
|
|
||||||
"objectgroup":
|
|
||||||
{
|
|
||||||
"draworder":"index",
|
|
||||||
"name":"",
|
|
||||||
"objects":[
|
|
||||||
{
|
|
||||||
"height":3,
|
|
||||||
"id":1,
|
|
||||||
"name":"",
|
|
||||||
"rotation":0,
|
|
||||||
"type":"",
|
|
||||||
"visible":true,
|
|
||||||
"width":16,
|
|
||||||
"x":0,
|
|
||||||
"y":0
|
|
||||||
}],
|
|
||||||
"opacity":1,
|
|
||||||
"type":"objectgroup",
|
|
||||||
"visible":true,
|
|
||||||
"x":0,
|
|
||||||
"y":0
|
|
||||||
},
|
|
||||||
"properties":[
|
|
||||||
{
|
|
||||||
"name":"filewtf",
|
|
||||||
"type":"file",
|
|
||||||
"value":""
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name":"floaty",
|
|
||||||
"type":"float",
|
|
||||||
"value":0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name":"inty",
|
|
||||||
"type":"int",
|
|
||||||
"value":0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name":"nez:isOneWayPlatform",
|
|
||||||
"type":"bool",
|
|
||||||
"value":true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name":"poop",
|
|
||||||
"type":"color",
|
|
||||||
"value":""
|
|
||||||
}]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id":3,
|
|
||||||
"objectgroup":
|
|
||||||
{
|
|
||||||
"draworder":"index",
|
|
||||||
"name":"",
|
|
||||||
"objects":[
|
|
||||||
{
|
|
||||||
"height":0,
|
|
||||||
"id":1,
|
|
||||||
"name":"",
|
|
||||||
"polygon":[
|
|
||||||
{
|
|
||||||
"x":0,
|
|
||||||
"y":0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"x":0,
|
|
||||||
"y":16
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"x":16,
|
|
||||||
"y":16
|
|
||||||
}],
|
|
||||||
"rotation":0,
|
|
||||||
"type":"",
|
|
||||||
"visible":true,
|
|
||||||
"width":0,
|
|
||||||
"x":0,
|
|
||||||
"y":0
|
|
||||||
}],
|
|
||||||
"opacity":1,
|
|
||||||
"type":"objectgroup",
|
|
||||||
"visible":true,
|
|
||||||
"x":0,
|
|
||||||
"y":0
|
|
||||||
},
|
|
||||||
"properties":[
|
|
||||||
{
|
|
||||||
"name":"nez:isSlope",
|
|
||||||
"type":"bool",
|
|
||||||
"value":true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name":"nez:slopeTopLeft",
|
|
||||||
"type":"int",
|
|
||||||
"value":0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name":"nez:slopeTopRight",
|
|
||||||
"type":"int",
|
|
||||||
"value":15
|
|
||||||
}]
|
|
||||||
}],
|
|
||||||
"tilewidth":16
|
|
||||||
}],
|
|
||||||
"tilewidth":16,
|
|
||||||
"type":"map",
|
|
||||||
"version":1.2,
|
|
||||||
"width":40
|
|
||||||
}
|
|
||||||
|
Before Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 770 B |
|
Before Width: | Height: | Size: 19 KiB |