mirror of
https://github.com/ivuorinen/dotfiles.git
synced 2026-03-20 23:06:51 +00:00
Compare commits
894 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 9bfc7702ae | |||
| 9c90d48372 | |||
| a20f21c8b3 | |||
| a285e01601 | |||
| 5d8baea825 | |||
| 73ef292bd9 | |||
| 72934232d9 | |||
| 4ca473b11c | |||
| 10cc23f471 | |||
| c17b4d6a8b | |||
| cff83e4738 | |||
| 2b867c3348 | |||
| 301ded44f3 | |||
| 3a1461a647 | |||
| f2a3ae9a4b | |||
| 98394f1220 | |||
| 066207ef45 | |||
|
|
2cdcac2a65 | ||
| 4b8ee6ffc1 | |||
|
|
9875a4d4a0 | ||
|
|
035405b22f | ||
|
|
7dd6ccbc6c | ||
| 8a5c9f9089 | |||
|
|
2410f343c2 | ||
|
|
d120839830 | ||
|
|
5662d09202 | ||
|
|
076050ad58 | ||
|
|
313915e55c | ||
|
|
e490a735c8 | ||
|
|
5fe82b2898 | ||
|
|
6621bcb470 | ||
| 3b6ace12e9 | |||
|
|
f92e4a606f | ||
| fae7a8f13f | |||
| eaa7680671 | |||
| 070c94a244 | |||
| 70cf8ccf6d | |||
| 63faf4c4bf | |||
|
|
d81ff6dabb | ||
| ed6bef5c7e | |||
| 46b9e3ebeb | |||
| f26303a0ff | |||
| 8379135c81 | |||
| 73d0d6b35f | |||
| 6a839eea56 | |||
| 28c8332058 | |||
| b956119b98 | |||
|
|
0f82f8e65b | ||
|
|
f1277ddf99 | ||
|
|
c834eab42b | ||
|
|
f93deb8bca | ||
|
|
248f57b914 | ||
|
|
86e4f9618c | ||
|
|
7eb97392fb | ||
|
|
8be1a9e7e2 | ||
|
|
a7c03fc3d6 | ||
|
|
3368e3b6dc | ||
|
|
5d87452224 | ||
|
|
d779d23723 | ||
|
|
ee812de4af | ||
| a18c16b0b9 | |||
| 785a8e8eb7 | |||
| 1cda859999 | |||
| bc69560da4 | |||
| 2ee9407a43 | |||
| 765c2fce72 | |||
| 88eceaf194 | |||
| 6d72003446 | |||
| cff3d1dd8a | |||
| a47ce85991 | |||
| 13dd701eb7 | |||
| cfde007494 | |||
| ed4aa2ffe1 | |||
| bcf11406b6 | |||
| 443361cddb | |||
| 083d30a0c3 | |||
| 81190c051a | |||
| de773ad68f | |||
| e8725c4b47 | |||
| b8070e2815 | |||
| 9de394d8e9 | |||
| 08de5ea4a6 | |||
| 0e69b7cb16 | |||
| 7c9096d666 | |||
| efd9eebc85 | |||
| fc8db1f5b5 | |||
| 4414e0c3b6 | |||
| abb6c9f615 | |||
| 57b566704e | |||
|
|
4510e62070 | ||
| 959e7c418e | |||
| 3fb9d2a32e | |||
| e1050fc7e1 | |||
| 9d7a1acd30 | |||
| 9b7942a9fb | |||
| 3e6b80b598 | |||
| f6fb14d651 | |||
| bafb8fc2f6 | |||
| 6b11727540 | |||
| 5f4268d2e0 | |||
| ed3f881b93 | |||
| 939ee65e7a | |||
| 14f0cd00e2 | |||
| ddbfed1dd9 | |||
| e19120c45a | |||
|
|
d46631b017 | ||
| cbfc9049a1 | |||
| 12391d7757 | |||
| 10fd3862aa | |||
| 77b3173531 | |||
| e53a880e75 | |||
|
|
8efdde88a3 | ||
|
|
575a80ffff | ||
|
|
e86c137529 | ||
|
|
cb35b5eb62 | ||
|
|
0ae6b106b7 | ||
|
|
c61127abbe | ||
|
|
4b8a53f687 | ||
|
|
712187578f | ||
|
|
db4b663e64 | ||
| 6bb804ec7f | |||
|
|
892216a8fc | ||
|
|
a2a99445ff | ||
|
|
678466b898 | ||
| bd5eff8bce | |||
| 2979cc6cfc | |||
|
|
5630200d95 | ||
| 961efec364 | |||
| 4b0e38ffd2 | |||
|
|
c6ba0e4036 | ||
|
|
7b1ed2f596 | ||
|
|
82d48c8989 | ||
|
|
48f61fa917 | ||
|
|
abc3408609 | ||
|
|
8bef11095e | ||
| 7d427d29bb | |||
|
|
fd71a1ad32 | ||
|
|
277d47098f | ||
|
|
d35014ed2e | ||
|
|
8e7af8ddc7 | ||
| 099e6672c8 | |||
| e578e52aff | |||
|
|
0b5f80cb03 | ||
|
|
72f42835ff | ||
|
|
a949f0d4cf | ||
|
|
8b1e4462b3 | ||
|
|
055cf7ef2e | ||
|
|
8c2b3fb475 | ||
| 3fa1efe88d | |||
| 9cc81c4cbf | |||
| bba76843db | |||
| 9018d1a038 | |||
|
|
a8595e2e07 | ||
|
|
beb89e9490 | ||
|
|
cb381fe57d | ||
|
|
7be770a2af | ||
|
|
d16ce9ad0f | ||
| ab67f6be5a | |||
| efadbb4248 | |||
| ded4bf3bb3 | |||
|
|
62eb417935 | ||
| d22f9ece7d | |||
| 79be2d41bc | |||
|
|
743ebb0e9f | ||
|
|
8fcab21a67 | ||
|
|
43a714513f | ||
|
|
044298af74 | ||
|
|
6604f7a2ca | ||
|
|
065eb2f9c0 | ||
|
|
49b7fa43ad | ||
|
|
8f652a2a9b | ||
|
|
b81adc62b1 | ||
|
|
fd044776b9 | ||
| 5472634f08 | |||
| 33db70e725 | |||
| 56b2fdabf1 | |||
| 3f2d1b85ed | |||
|
|
0bd72c6d51 | ||
|
|
69684c23b9 | ||
|
|
28a36b5d6b | ||
|
|
00fd6fc5dc | ||
|
|
abfe7cc011 | ||
|
|
95e21a124b | ||
|
|
5178bec1a0 | ||
|
|
1b94674e6b | ||
|
|
7e9d2df990 | ||
| 91be3b9edc | |||
| 6bfcd38773 | |||
| 74a3d58417 | |||
| 7b6e95c4ab | |||
| 88a2b3dadf | |||
|
|
416523660a | ||
|
|
1e15c0cad2 | ||
|
|
93129c0fd0 | ||
|
|
7c835df7dc | ||
|
|
729efdd406 | ||
| ebb22064ce | |||
|
|
c4a55efd7c | ||
|
|
508b44fd48 | ||
|
|
2fdcd839a4 | ||
|
|
cdf791bb63 | ||
|
|
cd72b003a0 | ||
| bb93200f52 | |||
|
|
7715e1c8b0 | ||
|
|
e91f31a049 | ||
|
|
56791753f7 | ||
| e9bd3708fa | |||
| 0a2b0b8a45 | |||
|
|
1be21eb247 | ||
|
|
dd89164b8b | ||
|
|
aae39dd913 | ||
|
|
4ab8182d90 | ||
|
|
b281efc576 | ||
|
|
35ede87808 | ||
|
|
2e184aa6c1 | ||
|
|
ffd4121eef | ||
|
|
a424347974 | ||
|
|
574cafed0e | ||
|
|
099a80c78b | ||
|
|
081ac55dd7 | ||
|
|
4136b66d9f | ||
|
|
4183bc0a24 | ||
|
|
cc8578ed4c | ||
| 65d5040af2 | |||
| 5606cff9fd | |||
| 530ce0df4f | |||
|
|
f6252c871e | ||
| caf5722b95 | |||
|
|
185562737c | ||
| 579685e4ee | |||
| 9ece4c64c6 | |||
| b413eefd37 | |||
| 06c1275fa5 | |||
| c2a5d45998 | |||
| 94038a71bf | |||
| 4bfa54972e | |||
| 25831458aa | |||
|
|
41315f7c53 | ||
|
|
fecbb3568c | ||
| f18d08ec5f | |||
| b9fac1a444 | |||
| a5fe70d3c2 | |||
| fdaa1883a7 | |||
|
|
e67abce6ed | ||
|
|
ab07793804 | ||
|
|
ba87c82d51 | ||
|
|
cf5ce57a57 | ||
|
|
17a0dfd6e1 | ||
|
|
e3e0f99eaf | ||
|
|
3399288a81 | ||
|
|
fe0d7408cf | ||
|
|
0223e08da8 | ||
|
|
bfe46f0a90 | ||
|
|
a60ce374b5 | ||
| 5f59851c7a | |||
|
|
9c68e8b05c | ||
| 84e3351125 | |||
| 363ae046c8 | |||
|
|
9ac792b924 | ||
|
|
e377d9212a | ||
|
|
125fd027f7 | ||
|
|
ecd099edbd | ||
| 3baa7547e1 | |||
|
|
782eeb78ec | ||
|
|
7b211489fd | ||
| d3ec2e7332 | |||
|
|
0b11f6456a | ||
|
|
58064a7b9b | ||
|
|
4723d5c61c | ||
|
|
4e0e4b8883 | ||
|
|
5b6f43e22f | ||
| ca594f9b2d | |||
| 685a843d78 | |||
| 470acd8956 | |||
| a6907d890e | |||
|
|
c37fdb7cd3 | ||
| bad1ce2a34 | |||
| e67d4285b6 | |||
| f577ad28a9 | |||
|
|
e9ac5e48ac | ||
|
|
cc01f4fdde | ||
| 52a5f226e9 | |||
|
|
9b94302270 | ||
|
|
fe7e9173d0 | ||
|
|
fb5aae3deb | ||
| 036392d38a | |||
| 2cb11292d4 | |||
| a163d6338a | |||
| 191488c081 | |||
| cc47614280 | |||
| 91cde60dba | |||
| 5dea757707 | |||
| f8833fca73 | |||
| 9cd99dbc88 | |||
| 14f67cb5ca | |||
|
|
4ce76fbd70 | ||
|
|
ca68803fb9 | ||
| fb97f10f64 | |||
| 6dbbc439b3 | |||
| 368fbfc7c8 | |||
| d6d5a8ca36 | |||
|
|
d65c25819f | ||
|
|
62c620efad | ||
| 07fe18af75 | |||
|
|
29d3676b38 | ||
| 0b9e1803d4 | |||
|
|
c45ad9710d | ||
| cf7ca2109f | |||
| 1531647e01 | |||
|
|
15aff17f03 | ||
|
|
42a5b79048 | ||
| a72c8ff33a | |||
| 19d9035214 | |||
| 7ca077c852 | |||
| 48604d81d6 | |||
|
|
405e68f895 | ||
| 6d62352127 | |||
| 017d82abc5 | |||
|
|
24ad4bf5b7 | ||
| 07264c594f | |||
|
|
7b58f660ac | ||
|
|
b000f2b0c4 | ||
| 4d548687e1 | |||
| 519d8398de | |||
| 2203bb3957 | |||
|
|
ddafdfe3c9 | ||
| a3f35b2d18 | |||
| 90020a4998 | |||
| 0f806c172d | |||
|
|
e8eb9b98b2 | ||
| 7e0a88cf8f | |||
| f72f57ebf0 | |||
| b5e56e2cbb | |||
|
|
179938132c | ||
|
|
bae84c176c | ||
| be8a6761af | |||
| c348f3625f | |||
| 094f19c99c | |||
| 5a23ae8f01 | |||
|
|
ee47821089 | ||
|
|
b834ce04f7 | ||
|
|
6a62d73d7f | ||
|
|
440842ed34 | ||
|
|
d0563e4a29 | ||
|
|
bc404bfbea | ||
| 923f881725 | |||
| ccc5903290 | |||
|
|
786efc48fa | ||
| 2a11a28422 | |||
| 812a27ea61 | |||
| e73e61f01b | |||
| 314679b4fc | |||
|
|
516b27384a | ||
|
|
9e1af3053d | ||
|
|
9e4f8741b3 | ||
| c0995c1b49 | |||
| c9f1e824c3 | |||
| 3d301daeb1 | |||
| 8b4198dc90 | |||
| 66461f9b1b | |||
| 80851d1efd | |||
|
|
c457c0f3ab | ||
| 9936e4bd76 | |||
| c3a45e2653 | |||
| 506360a027 | |||
|
|
00074ec3ff | ||
|
|
7c7daf89ea | ||
|
|
267c54aa56 | ||
|
|
d72409efc0 | ||
| 3d9e0477b0 | |||
| cfab48eee0 | |||
| 624920b2ab | |||
|
|
fd82f1e36c | ||
|
|
48ec8cd7a7 | ||
|
|
3a61bd2b72 | ||
| 895b0ad353 | |||
| 3c733ec7eb | |||
| 5321ad7bd7 | |||
| 196077bea9 | |||
|
|
75147c7dd6 | ||
| f28ad41f67 | |||
| 61b66d3114 | |||
| 282f760a4f | |||
| 4a9c9b4cb9 | |||
| 16311ee5b4 | |||
| 2fddfa82c0 | |||
| 8f5f44db2d | |||
| 8ad1f5c4d0 | |||
| ac0aa1fbc0 | |||
| e8c6794ff6 | |||
| 4de9a649f0 | |||
|
|
e7f115680e | ||
| f3b4551d0c | |||
| 64725c57dc | |||
| b32ee414e3 | |||
|
|
6ea7807718 | ||
| 6a776bd3dd | |||
| 6ffe581326 | |||
| 5d476e8eed | |||
|
|
bf84c67f08 | ||
| 9cb400dd3f | |||
| fce649619a | |||
| 8b0148e468 | |||
| 9cb27eb9dc | |||
| f1ed88a98e | |||
| ec35f1cb1e | |||
| dab8504cfd | |||
| 0f9a76e36f | |||
|
|
97244d5287 | ||
| 50ea9bea89 | |||
| 688469ad8b | |||
|
|
af32914d71 | ||
|
|
840bd85232 | ||
| c81ee240bf | |||
| e215fe0a2f | |||
| 38e340ac8d | |||
| c9383f955c | |||
| 8eeaea802a | |||
| d626731736 | |||
| e459cd99e7 | |||
| 3e4391adda | |||
| a6400943d2 | |||
| 5ec8e89641 | |||
|
|
115dac4fb4 | ||
|
|
405e2d5c77 | ||
| 535925aeaf | |||
|
|
7fa29ae3d6 | ||
|
|
b1a01b6717 | ||
|
|
b9d2ee01ed | ||
| e81938a04d | |||
| 3bbcb248ba | |||
| 17194755e6 | |||
| 45f95422ef | |||
| b8f0bb570e | |||
| a0d8069455 | |||
|
|
8b1eb0a582 | ||
|
|
9cb10250c5 | ||
| 2836ed19cf | |||
| 21eb5086a9 | |||
| 56f49ab314 | |||
| 5e1a2d0dd0 | |||
| 5fdd26bf80 | |||
| 0c93dd9ad8 | |||
| 9deb613b5b | |||
|
|
bf4031c238 | ||
| 087b33cc97 | |||
|
|
361657cdec | ||
| 4855e56f3c | |||
| c119d4c20b | |||
| 4815e8678b | |||
| 31a45fed19 | |||
| 5aae400c92 | |||
| 26e11047ce | |||
| 1f0826c7e7 | |||
| 9f71f3c8aa | |||
| 5d929c6466 | |||
| afc04db93a | |||
|
|
eca0321e21 | ||
| def3372b9a | |||
|
|
5aaa177756 | ||
| 31a6ea351d | |||
| 333995c7f4 | |||
| d6b24c27a1 | |||
| 89ae4003f9 | |||
| 7a008c3ae8 | |||
| a6f89e80bd | |||
| 3d987e491e | |||
| e1729fd925 | |||
| 4e5dae4161 | |||
| 6b30ebfddb | |||
|
|
0aafae5d97 | ||
| 32cc561d20 | |||
| 784fddea64 | |||
| 0a058aaf22 | |||
| ff6876a56d | |||
| ccbd29fc40 | |||
| 9251225d3e | |||
| 241eed66f5 | |||
| 6de8e92968 | |||
| 2cdda605ef | |||
| 87a4ec8ecf | |||
| 87613d10ec | |||
| f6dc193f6a | |||
| 4adbbdb47a | |||
| bdbe10f612 | |||
| 531488001f | |||
| 4f2b47d5c3 | |||
|
|
dfbdb89aca | ||
|
|
c9489ae50f | ||
| 9fdb4cdfb0 | |||
| f4da515120 | |||
| fae9665671 | |||
| d5e34d168b | |||
| e8b43d76dc | |||
| 4f9757ad2b | |||
| 611a3bfa72 | |||
| 10da4ea372 | |||
| 68525d5ae4 | |||
|
|
7311f2576e | ||
| 721d3c0d15 | |||
| c82e183ff9 | |||
| 1b6a93650b | |||
| aa85bb0c72 | |||
| ceb452aa68 | |||
| 467a1c2ff9 | |||
| f73cd32309 | |||
| 0be2a5b879 | |||
| 8c015ac251 | |||
| 894ec12fd8 | |||
| 8cf3602de1 | |||
| 57c4f0438e | |||
|
|
02907d6a6b | ||
|
|
127edd1b2c | ||
|
|
76dc53b50a | ||
| f88a5298b2 | |||
| b436472bbb | |||
| 4e4a2eaab1 | |||
| d59204f25f | |||
| b299e3df1e | |||
| 5bcc06d53b | |||
|
|
7c09a7ff74 | ||
| 88efedf26b | |||
|
|
cdd68748e0 | ||
|
|
f8ff2699e6 | ||
| c5e06888b8 | |||
|
|
4f138eee73 | ||
|
|
90258e5105 | ||
| efc53fc9bf | |||
|
|
f62c17d940 | ||
|
|
fb15b93887 | ||
|
|
222276486a | ||
|
|
4446d59e73 | ||
| a22709a0f0 | |||
| 76598ad33b | |||
| 56ccb7c136 | |||
|
|
b6d933d018 | ||
| f9856a27b9 | |||
| b36b52ad57 | |||
| 1e60ccf49b | |||
|
|
9ca9439b9a | ||
| 6d30ae7e84 | |||
| 031e124663 | |||
| bb50c9fe18 | |||
| 8e608de501 | |||
|
|
8917b7736b | ||
| 18ff879f1d | |||
| c5a258d7be | |||
| 7525f1f71d | |||
| 3b665bdba0 | |||
| 99477364bd | |||
|
|
629fdf6d4c | ||
| 1288599b1f | |||
| be3a68fecb | |||
| 101e4da1d6 | |||
| 23430a609a | |||
| bb0d56e403 | |||
| d3b08bdf4f | |||
| e1ec501c55 | |||
| f92c3407f0 | |||
| b5971439b6 | |||
| 8ea8a2797a | |||
| b0f9222482 | |||
| 825ccc1031 | |||
| dab7a8a38a | |||
| 1dbc7ae5cd | |||
| 7038da568e | |||
| bfcaa26070 | |||
| f6488aecce | |||
| ad166e8012 | |||
| 2a76a414a0 | |||
| bb8ddf0bba | |||
| bf3e746010 | |||
|
|
b9957e4f0e | ||
| e1deba4ccf | |||
| 36e4de3035 | |||
| 3eab1faeab | |||
| 1eb4098646 | |||
| f7db8cae15 | |||
| 97dd3dc21d | |||
| 6da6797f1b | |||
|
|
88356f1392 | ||
| 174bb842e9 | |||
| f6e7590118 | |||
| 498996a6e2 | |||
| 0961985fb4 | |||
| 293452604d | |||
|
|
9582f18c7d | ||
| 051e3604ee | |||
| 09d62dd159 | |||
| 8a3763e168 | |||
| c37793f649 | |||
| 7bc7230990 | |||
| 067df4e34b | |||
| 4d28499423 | |||
| b685af82fb | |||
|
|
b8a4b82431 | ||
| 0b03acebd8 | |||
| d172b86cb8 | |||
| f910dfb9ac | |||
| ee95d57ba0 | |||
| f8a317f3c7 | |||
| 3762e10932 | |||
| afda96902b | |||
| 3060b6ad66 | |||
|
|
4f154cf509 | ||
| 863d803483 | |||
| 07bb2b56d1 | |||
| 84a753100e | |||
| c8b01f3fda | |||
| 8e6a110aac | |||
| a8baa1671f | |||
| 2ccdd042f6 | |||
|
|
8cf43ed555 | ||
| e22094e0da | |||
| 6186c5cba4 | |||
| c453dcbf84 | |||
| 4daaa62aed | |||
| f56d5682d1 | |||
| 439638b686 | |||
| a8a473a46d | |||
| eb91a43bbd | |||
|
|
193fae662e | ||
|
|
117ca1a944 | ||
| 1f1a6d42ad | |||
| cca265cd99 | |||
| cc6abb53ba | |||
| ab34c148a6 | |||
|
|
910b29ed9f | ||
| 3fb0a75a62 | |||
|
|
f73abb508b | ||
|
|
1dd3d952cf | ||
| 1ffd6e1569 | |||
| a76033a48a | |||
| 34dc18883e | |||
| 832d8b94f3 | |||
| c40eb765f8 | |||
|
|
1bb7e9076b | ||
|
|
17821dfefa | ||
| 19327947ed | |||
| 2356fc4c61 | |||
| 45219deccb | |||
| 5471aba1a4 | |||
|
|
6f6ee3611c | ||
|
|
d8f9cdf265 | ||
| abb6de05be | |||
| 60ef48e918 | |||
| e58c79a3c3 | |||
| d47f21286d | |||
| 3f108c9353 | |||
|
|
4a68146786 | ||
|
|
cf79e61943 | ||
| 43dcb303a0 | |||
| 1b03f0bbd6 | |||
| 8a52c9a97e | |||
| 8e84c3aef7 | |||
| acd2f7fc6d | |||
| 1e4aa1558a | |||
| b314c0ba76 | |||
| ece46561c4 | |||
| 196d217c34 | |||
| 7d2fc55791 | |||
| 74fb12f093 | |||
|
|
d7988bcad7 | ||
| 320ae35dcd | |||
| 0964253be5 | |||
|
|
f3f7ecc522 | ||
|
|
b88de0c3ae | ||
| c5e6860595 | |||
| b5a3c34fc3 | |||
| 87c89cf828 | |||
|
|
8d57c9425e | ||
|
|
cfe97d81a7 | ||
| 2f13ad324a | |||
|
|
d203fc9d51 | ||
| bf279b6def | |||
| 87926f8d9b | |||
| 6b056f6072 | |||
| 823cdbc07f | |||
| 0f6157eb04 | |||
| 721fe614a7 | |||
| 5ea16d4653 | |||
| 900e6a8f85 | |||
| 16673de789 | |||
| c732a75184 | |||
|
|
96280e6e9b | ||
| 5ab0f89765 | |||
| d585d61537 | |||
| 746646ae55 | |||
|
|
6e69ec6410 | ||
| af123e5138 | |||
| 3879289559 | |||
| 392628e733 | |||
| aa70eab5fb | |||
| e5311ca285 | |||
| d5618c9b5f | |||
| d091f5a88f | |||
| cb9195e3ad | |||
| c91cc387b6 | |||
| 083091ea46 | |||
| 7ff74f0e15 | |||
| 9d1f62fcca | |||
| a563e82e33 | |||
| 62ff7836e7 | |||
| 88cb573027 | |||
| 82772d8208 | |||
|
|
240035569c | ||
|
|
9697c200f9 | ||
| fd11f9966b | |||
| 722b3c0cde | |||
| 4fcb9d9741 | |||
| fc232f26f7 | |||
| 8b078309cf | |||
| 5a8f990e52 | |||
| c76c5d08b0 | |||
| b2857e226c | |||
| dfbac0c736 | |||
| fdd713908c | |||
| 60210c9bec | |||
| eaf8d2bdca | |||
| cc00055626 | |||
|
|
567de68844 | ||
|
|
ed0b229757 | ||
| c8b6243c0b | |||
|
|
21a92eb145 | ||
| 8ec317f582 | |||
|
|
42201d8b68 | ||
|
|
0c003ae5b9 | ||
| d383031ec8 | |||
|
|
fa5e5f16da | ||
| f82396236e | |||
| b127c2514d | |||
|
|
b06ac3bc0f | ||
|
|
7e4ea90a05 | ||
|
|
d264a33d21 | ||
| 224ee56461 | |||
|
|
8147490c65 | ||
|
|
c6d501347a | ||
|
|
d8044f2b6a | ||
|
|
1b3fe6d12e | ||
| 76b66d8c61 | |||
| 9c8644de17 | |||
| 120345b562 | |||
| 8accd4a60b | |||
| 8fb03660ad | |||
| 8b2dc74f2a | |||
| 8fa63e63bb | |||
| 4ca5b63b75 | |||
| 5a59872377 | |||
| 38419eda28 | |||
| fc85dbaa6c | |||
| 250e7f5666 | |||
| 8f96922033 | |||
| 4c4de2dc26 | |||
| b8c163e028 | |||
| 0a974c2a17 | |||
| fd8d72ab38 | |||
| 0908a23231 | |||
| 2e070eed83 | |||
| e22762255d | |||
| 093f58f129 | |||
| 9b6e39b4af | |||
|
|
6f1e1a0416 | ||
| 36e0f36e06 | |||
| e2c37d29e8 | |||
| 78716fa8ce | |||
| 81e9b20eb6 | |||
|
|
94e58b307b | ||
| 98aca096a9 | |||
| 121e31c7d4 | |||
| f6bcd10ac5 | |||
| 619c772fcc | |||
| 746d44151c | |||
| b9585209be | |||
| 930dcf00c4 | |||
| bb8e3bba56 | |||
| 6431c2e6dc | |||
| 248eca1ae6 | |||
| 4b1ab2e1b8 | |||
| c0f537439b | |||
| 9ab132d37c | |||
| 2b9ddc232b | |||
| 1a244ce0b1 | |||
| fdc0f45b23 | |||
| 3fa90eef3b | |||
| 7ea7c12f0b | |||
| f76492b942 | |||
| 7947340663 | |||
| 300c48b1e9 | |||
| 772527cc66 | |||
|
|
370fdcbcbe | ||
| b32c86bac2 | |||
| 8d85809b1c | |||
| 7fc40e3eab | |||
|
|
1aca769ebf | ||
| 57df4edf6c | |||
| 240ac35aa8 | |||
| ad0ba59b67 | |||
| bbc26e66dd | |||
| 1803d41969 | |||
| 34d547433f | |||
| dff4b9a9c5 | |||
| c33404eb27 | |||
| 99e7578d60 | |||
| d8011728c7 | |||
| 2f67d4a2e2 | |||
|
|
ef37681087 | ||
|
|
0c014033d1 | ||
|
|
14635009d2 | ||
| 70118fee52 | |||
|
|
0dce28ea6a | ||
| ba15f82302 | |||
| d4972ea30d | |||
| ed7263dfee | |||
| 4cda063305 | |||
| d251ea9cdc | |||
| bc4e906ff6 | |||
| 75c36bacf9 | |||
| e7cda5ac0c | |||
| 41024b1eb5 | |||
| 74afeb61c8 | |||
| 104bc369bc | |||
| 57e63847ce | |||
| 2dc08e5e51 | |||
| 989b5b5111 | |||
| 24a5dd1ff6 | |||
| 5826e35853 | |||
| e329868568 | |||
| dc76fa8914 | |||
| 3413365d41 | |||
| 37299f4893 | |||
| 71a78c6e0c | |||
| 3f8a4deb05 | |||
| ffe288aba3 | |||
| 28a1fc2831 | |||
| 28aae89f70 | |||
| e8fe5c570b | |||
| 26f6024292 | |||
| 4e4692321b | |||
| 3ea221ccf9 | |||
| e7774c4ab1 | |||
| 1f2ca90ca5 | |||
| adecceda7a | |||
| 8a3b2e703c | |||
| 1ee726e30c | |||
| 9857c8eb00 | |||
| a919d9544e | |||
| 7bc7921a17 | |||
| 735807f245 | |||
| 6d531e2d40 | |||
| 77f89c0f48 | |||
| 7f3c7b7e1c | |||
| fc16b8231e | |||
| 64a626d5c4 | |||
| 54816c2ce9 | |||
| 3acaea5611 | |||
| e4a313abe7 | |||
| 0b1c75cbdd | |||
| cab0f4da49 | |||
| cef15eddce | |||
| f8987818b8 | |||
|
|
15d1f6a59a | ||
| ba586fca7d | |||
|
|
d93bc7aae3 | ||
| 77b0428cec | |||
| 387432b27b | |||
| 88fa706b75 | |||
| 96ce9fec0c | |||
| 66d5fbc8ac | |||
| cc3ceb4176 | |||
| 0f9c69bb65 | |||
| c754746b9f | |||
| df5cab6a88 | |||
| b9ddba4666 | |||
| 77e92ef15e | |||
| 383bc2b052 | |||
| 0e109c3da3 | |||
| 50abd5aa30 | |||
| 082e27fb0a | |||
| e05e68f5d1 | |||
| 074c169e3c | |||
| 636ea749ac | |||
| da2a2e0f81 | |||
| 0ef12b61ac | |||
| c6fc3db52f | |||
| 1bde81a673 | |||
| d60248f356 | |||
| 40e8b9443b | |||
| 8a032a2804 | |||
| 367be373c4 | |||
| cf2f98d5c0 | |||
| a3704f7db9 | |||
| 7c359ffea0 | |||
| 9542624323 | |||
|
|
b0d74bad1a |
@@ -1 +1 @@
|
||||
extends @ivuorinen/browserslist-config
|
||||
extends @ivuorinen/browserslist-config
|
||||
|
||||
14
.claude/agents/code-reviewer.md
Normal file
14
.claude/agents/code-reviewer.md
Normal file
@@ -0,0 +1,14 @@
|
||||
---
|
||||
name: code-reviewer
|
||||
description: Reviews shell/fish/lua changes for correctness and style
|
||||
tools: [Read, Grep, Glob, Bash]
|
||||
---
|
||||
|
||||
Review the changed files for:
|
||||
|
||||
1. **Shell scripts**: POSIX compliance for /bin/sh scripts, proper quoting, shellcheck issues
|
||||
2. **Fish files**: fish syntax correctness, consistent function patterns
|
||||
3. **Lua files**: stylua compliance, Neovim API usage patterns
|
||||
4. **All**: EditorConfig compliance (2-space indent, LF endings)
|
||||
|
||||
Report only high-confidence issues. Skip vendor files (fzf-tmux).
|
||||
13
.claude/hooks/async-bats.sh
Executable file
13
.claude/hooks/async-bats.sh
Executable file
@@ -0,0 +1,13 @@
|
||||
#!/usr/bin/env bash
|
||||
# Async Bats runner: run matching test file when a script is edited.
|
||||
# Runs in background (async: true) — output appears on next turn.
|
||||
|
||||
fp=$(jq -r '.tool_input.file_path // empty')
|
||||
[ -z "$fp" ] && exit 0
|
||||
|
||||
name=$(basename "$fp")
|
||||
test_file="$CLAUDE_PROJECT_DIR/tests/${name}.bats"
|
||||
[ ! -f "$test_file" ] && exit 0
|
||||
|
||||
echo "Running $test_file ..."
|
||||
"$CLAUDE_PROJECT_DIR/node_modules/.bin/bats" "$test_file"
|
||||
14
.claude/hooks/log-failures.sh
Executable file
14
.claude/hooks/log-failures.sh
Executable file
@@ -0,0 +1,14 @@
|
||||
#!/usr/bin/env bash
|
||||
# PostToolUseFailure logger: append tool failures to a local log file.
|
||||
|
||||
log_file="$CLAUDE_PROJECT_DIR/.claude/hook-failures.log"
|
||||
|
||||
entry=$(jq -c '{
|
||||
time: (now | strftime("%Y-%m-%dT%H:%M:%SZ")),
|
||||
tool: .tool_name,
|
||||
error: .error
|
||||
}')
|
||||
|
||||
echo "$entry" >> "$log_file"
|
||||
|
||||
exit 0
|
||||
13
.claude/hooks/notify-idle.sh
Executable file
13
.claude/hooks/notify-idle.sh
Executable file
@@ -0,0 +1,13 @@
|
||||
#!/usr/bin/env bash
|
||||
# Notification hook: alert when Claude goes idle.
|
||||
# Uses pushover if available, falls back to macOS native notification.
|
||||
|
||||
msg=$(jq -r '.message // "Claude is waiting for input"')
|
||||
|
||||
if command -v pushover > /dev/null; then
|
||||
pushover "Claude Code" "$msg"
|
||||
elif command -v osascript > /dev/null; then
|
||||
osascript -e "display notification \"$msg\" with title \"Claude Code\""
|
||||
fi
|
||||
|
||||
exit 0
|
||||
15
.claude/hooks/post-edit-config-warn.sh
Executable file
15
.claude/hooks/post-edit-config-warn.sh
Executable file
@@ -0,0 +1,15 @@
|
||||
#!/usr/bin/env bash
|
||||
# Post-edit: warn when formatter/linter configs are changed,
|
||||
# since they affect the entire repo's code style.
|
||||
|
||||
fp=$(jq -r '.tool_input.file_path // empty')
|
||||
[ -z "$fp" ] || [ ! -f "$fp" ] && exit 0
|
||||
|
||||
case "$(basename "$fp")" in
|
||||
.editorconfig | biome.json | .prettierrc.json | .shellcheckrc | stylua.toml | .yamllint.yml)
|
||||
echo "NOTE: Formatter/linter config changed ($fp)." >&2
|
||||
echo "Run 'pre-commit run --all-files' to verify consistency." >&2
|
||||
;;
|
||||
esac
|
||||
|
||||
exit 0
|
||||
28
.claude/hooks/post-edit-dotbot-validate.sh
Executable file
28
.claude/hooks/post-edit-dotbot-validate.sh
Executable file
@@ -0,0 +1,28 @@
|
||||
#!/usr/bin/env bash
|
||||
# Post-edit: validate Dotbot install.conf.yaml files after editing.
|
||||
# Checks YAML syntax and verifies link targets exist.
|
||||
|
||||
fp=$(jq -r '.tool_input.file_path // empty')
|
||||
[ -z "$fp" ] || [ ! -f "$fp" ] && exit 0
|
||||
|
||||
case "$fp" in
|
||||
*install.conf.yaml) ;;
|
||||
*) exit 0 ;;
|
||||
esac
|
||||
|
||||
# YAML syntax check
|
||||
if command -v yamllint > /dev/null; then
|
||||
if ! output=$(yamllint -d relaxed "$fp" 2>&1); then
|
||||
echo "Dotbot config YAML error in $fp:" >&2
|
||||
echo "$output" >&2
|
||||
exit 2
|
||||
fi
|
||||
elif command -v python3 > /dev/null; then
|
||||
if ! output=$(python3 -c "import yaml; yaml.safe_load(open('$fp'))" 2>&1); then
|
||||
echo "Dotbot config YAML parse error in $fp:" >&2
|
||||
echo "$output" >&2
|
||||
exit 2
|
||||
fi
|
||||
fi
|
||||
|
||||
exit 0
|
||||
30
.claude/hooks/post-edit-format.sh
Executable file
30
.claude/hooks/post-edit-format.sh
Executable file
@@ -0,0 +1,30 @@
|
||||
#!/usr/bin/env bash
|
||||
# Post-edit formatter: auto-format file based on extension.
|
||||
# Receives tool output JSON on stdin.
|
||||
|
||||
fp=$(jq -r '.tool_input.file_path // empty')
|
||||
[ -z "$fp" ] || [ ! -f "$fp" ] && exit 0
|
||||
|
||||
case "$fp" in
|
||||
*.sh | */bin/*)
|
||||
head -1 "$fp" | grep -qE '^#!.*(ba)?sh' \
|
||||
&& command -v shfmt > /dev/null \
|
||||
&& shfmt -i 2 -bn -ci -sr -fn -w "$fp"
|
||||
;;
|
||||
*.fish)
|
||||
command -v fish_indent > /dev/null && fish_indent -w "$fp"
|
||||
;;
|
||||
*.lua)
|
||||
command -v stylua > /dev/null && stylua "$fp"
|
||||
;;
|
||||
*.md)
|
||||
command -v biome > /dev/null && biome format --write "$fp" 2> /dev/null
|
||||
command -v markdown-table-formatter > /dev/null \
|
||||
&& markdown-table-formatter "$fp" 2> /dev/null
|
||||
;;
|
||||
*.yml | *.yaml)
|
||||
command -v prettier > /dev/null && prettier --write "$fp" 2> /dev/null
|
||||
;;
|
||||
esac
|
||||
|
||||
exit 0
|
||||
35
.claude/hooks/pre-edit-block.sh
Executable file
35
.claude/hooks/pre-edit-block.sh
Executable file
@@ -0,0 +1,35 @@
|
||||
#!/usr/bin/env bash
|
||||
# Pre-edit guard: block vendor/lock files and secrets.d real fish files.
|
||||
# Receives tool input JSON on stdin.
|
||||
|
||||
fp=$(jq -r '.tool_input.file_path // empty')
|
||||
[ -z "$fp" ] && exit 0
|
||||
|
||||
case "$fp" in
|
||||
*/fzf-tmux | */yarn.lock | */.yarn/*)
|
||||
echo "BLOCKED: $fp is a vendor/lock file — do not edit directly" >&2
|
||||
exit 2
|
||||
;;
|
||||
*/tools/dotbot/* | */tools/dotbot-include/* | */tools/antidote/*)
|
||||
echo "BLOCKED: $fp is inside a git submodule — do not edit" >&2
|
||||
exit 2
|
||||
;;
|
||||
*/config/tmux/plugins/*)
|
||||
echo "BLOCKED: $fp is a tmux plugin submodule — do not edit" >&2
|
||||
exit 2
|
||||
;;
|
||||
*/config/cheat/cheatsheets/community/* | */config/cheat/cheatsheets/tldr/*)
|
||||
echo "BLOCKED: $fp is a cheat submodule — do not edit" >&2
|
||||
exit 2
|
||||
;;
|
||||
*/secrets.d/*.fish)
|
||||
case "$(basename "$fp")" in
|
||||
*.example.fish | *.fish.example) exit 0 ;;
|
||||
esac
|
||||
echo "BLOCKED: do not edit $fp directly — it is gitignored." >&2
|
||||
echo "Copy the matching .fish.example file and edit that locally." >&2
|
||||
exit 2
|
||||
;;
|
||||
esac
|
||||
|
||||
exit 0
|
||||
15
.claude/hooks/session-start-context.sh
Executable file
15
.claude/hooks/session-start-context.sh
Executable file
@@ -0,0 +1,15 @@
|
||||
#!/usr/bin/env bash
|
||||
# SessionStart context: print branch, dirty file count, and last commit.
|
||||
|
||||
cd "$CLAUDE_PROJECT_DIR" || exit 0
|
||||
|
||||
branch=$(git branch --show-current 2> /dev/null)
|
||||
dirty=$(git status --short 2> /dev/null | wc -l | tr -d ' ')
|
||||
last=$(git log -1 --oneline 2> /dev/null)
|
||||
|
||||
echo "=== Dotfiles session context ==="
|
||||
echo "Branch : ${branch:-unknown}"
|
||||
echo "Dirty : ${dirty} file(s)"
|
||||
echo "Last : ${last}"
|
||||
|
||||
exit 0
|
||||
16
.claude/hooks/stop-lint-gate.sh
Executable file
16
.claude/hooks/stop-lint-gate.sh
Executable file
@@ -0,0 +1,16 @@
|
||||
#!/usr/bin/env bash
|
||||
# Stop gate: run yarn lint before Claude finishes.
|
||||
# Exit 2 sends feedback back and keeps Claude working.
|
||||
|
||||
cd "$CLAUDE_PROJECT_DIR" || exit 0
|
||||
|
||||
output=$(yarn lint 2>&1)
|
||||
status=$?
|
||||
|
||||
if [ $status -ne 0 ]; then
|
||||
echo "Lint failed — fix before finishing:" >&2
|
||||
echo "$output" >&2
|
||||
exit 2
|
||||
fi
|
||||
|
||||
exit 0
|
||||
87
.claude/settings.json
Normal file
87
.claude/settings.json
Normal file
@@ -0,0 +1,87 @@
|
||||
{
|
||||
"hooks": {
|
||||
"SessionStart": [
|
||||
{
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-start-context.sh",
|
||||
"statusMessage": "Loading project context..."
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"PreToolUse": [
|
||||
{
|
||||
"matcher": "Edit|Write",
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/pre-edit-block.sh"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"PostToolUse": [
|
||||
{
|
||||
"matcher": "Edit|Write",
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/post-edit-format.sh",
|
||||
"statusMessage": "Formatting..."
|
||||
},
|
||||
{
|
||||
"type": "command",
|
||||
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/post-edit-dotbot-validate.sh",
|
||||
"statusMessage": "Validating Dotbot config..."
|
||||
},
|
||||
{
|
||||
"type": "command",
|
||||
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/post-edit-config-warn.sh"
|
||||
},
|
||||
{
|
||||
"type": "command",
|
||||
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/async-bats.sh",
|
||||
"async": true,
|
||||
"statusMessage": "Running tests..."
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"PostToolUseFailure": [
|
||||
{
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/log-failures.sh",
|
||||
"async": true
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"Notification": [
|
||||
{
|
||||
"matcher": "idle_prompt",
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/notify-idle.sh",
|
||||
"async": true
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"Stop": [
|
||||
{
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/stop-lint-gate.sh",
|
||||
"statusMessage": "Running lint gate..."
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
38
.claude/skills/dotbot-validate/SKILL.md
Normal file
38
.claude/skills/dotbot-validate/SKILL.md
Normal file
@@ -0,0 +1,38 @@
|
||||
---
|
||||
name: dotbot-validate
|
||||
description: >-
|
||||
Validate Dotbot install.conf.yaml files after editing.
|
||||
Apply when writing or modifying any install.conf.yaml.
|
||||
user-invocable: false
|
||||
allowed-tools: Bash, Read
|
||||
---
|
||||
|
||||
After editing any `install.conf.yaml` file, validate it:
|
||||
|
||||
## 1. YAML syntax
|
||||
|
||||
```bash
|
||||
yamllint -d relaxed <file>
|
||||
```
|
||||
|
||||
If yamllint is not available, fall back to:
|
||||
|
||||
```bash
|
||||
python3 -c "import yaml; yaml.safe_load(open('<file>'))"
|
||||
```
|
||||
|
||||
## 2. Link target verification
|
||||
|
||||
For each `link` entry, verify the source path exists relative
|
||||
to the repo root. Report any missing source files.
|
||||
|
||||
## 3. Host-specific configs
|
||||
|
||||
Files in `hosts/<hostname>/install.conf.yaml` overlay the
|
||||
global config. Verify that any `include` directives reference
|
||||
existing files.
|
||||
|
||||
## Key locations
|
||||
|
||||
- `install.conf.yaml` — global config
|
||||
- `hosts/*/install.conf.yaml` — per-host overlays
|
||||
38
.claude/skills/fish-validate/SKILL.md
Normal file
38
.claude/skills/fish-validate/SKILL.md
Normal file
@@ -0,0 +1,38 @@
|
||||
---
|
||||
name: fish-validate
|
||||
description: >-
|
||||
Validate fish scripts after editing.
|
||||
Apply when writing or modifying any .fish file
|
||||
in config/fish/.
|
||||
user-invocable: false
|
||||
allowed-tools: Bash, Read
|
||||
---
|
||||
|
||||
After editing any `.fish` file in `config/fish/`, validate it:
|
||||
|
||||
## 1. Syntax check
|
||||
|
||||
```bash
|
||||
fish --no-execute <file>
|
||||
```
|
||||
|
||||
If syntax check fails, fix the issue before proceeding.
|
||||
|
||||
## 2. Format check
|
||||
|
||||
Run `fish_indent` to verify formatting:
|
||||
|
||||
```bash
|
||||
fish_indent --check <file>
|
||||
```
|
||||
|
||||
If formatting differs, apply it:
|
||||
|
||||
```bash
|
||||
fish_indent -w <file>
|
||||
```
|
||||
|
||||
## Key files to never validate
|
||||
|
||||
- Files inside `config/fish/functions/` prefixed with `_tide_`
|
||||
(managed by the tide prompt plugin)
|
||||
58
.claude/skills/host-override/SKILL.md
Normal file
58
.claude/skills/host-override/SKILL.md
Normal file
@@ -0,0 +1,58 @@
|
||||
---
|
||||
name: host-override
|
||||
description: >-
|
||||
Create or extend host-specific config overlays
|
||||
in hosts/<hostname>/ for machine-specific settings.
|
||||
user-invocable: true
|
||||
allowed-tools: Bash, Read, Write, Edit
|
||||
---
|
||||
|
||||
When creating host-specific configuration overrides:
|
||||
|
||||
## 1. Determine hostname
|
||||
|
||||
```bash
|
||||
hostname -s
|
||||
```
|
||||
|
||||
## 2. Directory structure
|
||||
|
||||
Host overrides live in `hosts/<hostname>/` mirroring the
|
||||
global layout:
|
||||
|
||||
```
|
||||
hosts/<hostname>/
|
||||
base/ -> ~/.*
|
||||
config/ -> ~/.config/
|
||||
install.conf.yaml
|
||||
```
|
||||
|
||||
## 3. Create install.conf.yaml
|
||||
|
||||
If it doesn't exist, create `hosts/<hostname>/install.conf.yaml`
|
||||
following the Dotbot format. Use `include` to layer on top of
|
||||
the global config:
|
||||
|
||||
```yaml
|
||||
- defaults:
|
||||
link:
|
||||
create: true
|
||||
relink: true
|
||||
force: true
|
||||
```
|
||||
|
||||
## 4. Git config overrides
|
||||
|
||||
The most common override is `hosts/<hostname>/config/git/overrides/config`.
|
||||
This is where host-specific git user, signing keys, and credential
|
||||
helpers go. Always `[include]` the shared config:
|
||||
|
||||
```ini
|
||||
[include]
|
||||
path = ~/.dotfiles/config/git/shared
|
||||
```
|
||||
|
||||
## 5. Test
|
||||
|
||||
Run `./install` to apply. Dotbot processes
|
||||
`hosts/<hostname>/install.conf.yaml` after the global config.
|
||||
22
.claude/skills/lua-format/SKILL.md
Normal file
22
.claude/skills/lua-format/SKILL.md
Normal file
@@ -0,0 +1,22 @@
|
||||
---
|
||||
name: lua-format
|
||||
description: >-
|
||||
Format Lua files after editing.
|
||||
Apply when writing or modifying any .lua file.
|
||||
user-invocable: false
|
||||
allowed-tools: Bash
|
||||
---
|
||||
|
||||
After editing any `.lua` file, format it with stylua:
|
||||
|
||||
```bash
|
||||
stylua <file>
|
||||
```
|
||||
|
||||
Project settings are in `stylua.toml` (90-char line length).
|
||||
|
||||
If stylua is not available, skip formatting silently.
|
||||
|
||||
## Files to never format
|
||||
|
||||
- Files inside `config/nvim/` managed by plugins (lazy.nvim lockfile)
|
||||
40
.claude/skills/new-fish-function/SKILL.md
Normal file
40
.claude/skills/new-fish-function/SKILL.md
Normal file
@@ -0,0 +1,40 @@
|
||||
---
|
||||
name: new-fish-function
|
||||
description: >-
|
||||
Scaffold a new fish function in config/fish/functions/
|
||||
with proper conventions and event handling.
|
||||
user-invocable: true
|
||||
allowed-tools: Bash, Read, Write, Edit
|
||||
---
|
||||
|
||||
When creating a new fish function in `config/fish/functions/`:
|
||||
|
||||
## 1. Create the function file
|
||||
|
||||
Create `config/fish/functions/<name>.fish`:
|
||||
|
||||
```fish
|
||||
function <name> --description '<one-line description>'
|
||||
# Function logic here
|
||||
end
|
||||
```
|
||||
|
||||
- One function per file, filename must match function name
|
||||
- Always include `--description`
|
||||
- Use `--argument-names` for named parameters
|
||||
|
||||
## 2. Conventions
|
||||
|
||||
- Do NOT use `_tide_` prefix (reserved for tide prompt plugin)
|
||||
- Use `--wraps` if the function wraps an existing command
|
||||
- For abbreviation-like functions, prefer fish abbreviations
|
||||
in `config/fish/alias.fish` instead
|
||||
|
||||
## 3. Validate
|
||||
|
||||
Run the fish-validate skill checks:
|
||||
|
||||
```bash
|
||||
fish --no-execute config/fish/functions/<name>.fish
|
||||
fish_indent --check config/fish/functions/<name>.fish
|
||||
```
|
||||
53
.claude/skills/new-script/SKILL.md
Normal file
53
.claude/skills/new-script/SKILL.md
Normal file
@@ -0,0 +1,53 @@
|
||||
---
|
||||
name: new-script
|
||||
description: >-
|
||||
Scaffold a new helper script in local/bin/ with proper
|
||||
boilerplate, msgr sourcing, and documentation tag.
|
||||
user-invocable: true
|
||||
allowed-tools: Bash, Read, Write, Edit
|
||||
---
|
||||
|
||||
When creating a new script in `local/bin/`, follow this template:
|
||||
|
||||
## 1. Script file
|
||||
|
||||
Create `local/bin/<name>` with:
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
# @description <one-line description>
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
# shellcheck source=msgr
|
||||
. "$(dirname "$0")/msgr"
|
||||
|
||||
# Script logic here
|
||||
```
|
||||
|
||||
- Use `msgr` functions for output: `msgr msg`, `msgr run`,
|
||||
`msgr yay`, `msgr err`, `msgr warn`
|
||||
- The `@description` tag is required — `dfm scripts` discovers
|
||||
scripts by it
|
||||
- POSIX scripts (`/bin/sh`) should NOT source msgr
|
||||
|
||||
## 2. Make executable
|
||||
|
||||
```bash
|
||||
chmod +x local/bin/<name>
|
||||
```
|
||||
|
||||
## 3. Generate docs
|
||||
|
||||
Run `dfm docs script <name>` or manually create `local/bin/<name>.md`
|
||||
with a usage summary.
|
||||
|
||||
## 4. Validate
|
||||
|
||||
Run the shell-validate skill checks (syntax + shellcheck).
|
||||
|
||||
## Naming conventions
|
||||
|
||||
- `x-` prefix for standalone utilities (e.g., `x-ssl-expiry-date`)
|
||||
- Short names for frequently used commands (e.g., `a`, `ad`, `ae`)
|
||||
- `git-` prefix for git subcommands (e.g., `git-dirty`)
|
||||
44
.claude/skills/shell-validate/SKILL.md
Normal file
44
.claude/skills/shell-validate/SKILL.md
Normal file
@@ -0,0 +1,44 @@
|
||||
---
|
||||
name: shell-validate
|
||||
description: >-
|
||||
Validate shell scripts after editing.
|
||||
Apply when writing or modifying any shell script
|
||||
in local/bin/ or scripts/.
|
||||
user-invocable: false
|
||||
allowed-tools: Bash, Read, Grep
|
||||
---
|
||||
|
||||
After editing any shell script in `local/bin/`, `scripts/`, or `config/`
|
||||
(files with a `#!` shebang or `# shellcheck shell=` directive),
|
||||
validate it:
|
||||
|
||||
## 1. Determine the shell
|
||||
|
||||
- `/bin/sh` or `#!/usr/bin/env sh` shebang -> POSIX, use `sh -n`
|
||||
- `/bin/bash` or `#!/usr/bin/env bash` shebang -> Bash, use `bash -n`
|
||||
- `# shellcheck shell=bash` directive (no shebang) -> use `bash -n`
|
||||
- `# shellcheck shell=sh` directive (no shebang) -> use `sh -n`
|
||||
- No shebang and no directive -> default to `bash -n`
|
||||
|
||||
## 2. Syntax check
|
||||
|
||||
Run the appropriate syntax checker:
|
||||
|
||||
```bash
|
||||
bash -n <file> # for bash scripts
|
||||
sh -n <file> # for POSIX sh scripts
|
||||
```
|
||||
|
||||
If syntax check fails, fix the issue before proceeding.
|
||||
|
||||
## 3. ShellCheck
|
||||
|
||||
Run `shellcheck <file>`. The project `.shellcheckrc` already
|
||||
disables SC2039, SC2166, SC2154, SC1091, SC2174, SC2016.
|
||||
Only report and fix warnings that are NOT in that exclude list.
|
||||
|
||||
## Key files to never validate (not shell scripts)
|
||||
|
||||
- `local/bin/fzf-tmux` (vendor file)
|
||||
- `*.md` files
|
||||
- `*.bats` test files (Bats, not plain shell)
|
||||
38
.claude/skills/yaml-validate/SKILL.md
Normal file
38
.claude/skills/yaml-validate/SKILL.md
Normal file
@@ -0,0 +1,38 @@
|
||||
---
|
||||
name: yaml-validate
|
||||
description: >-
|
||||
Validate YAML files after editing.
|
||||
Apply when writing or modifying any .yml or .yaml file.
|
||||
user-invocable: false
|
||||
allowed-tools: Bash, Read
|
||||
---
|
||||
|
||||
After editing any YAML file, validate it:
|
||||
|
||||
## 1. Syntax check
|
||||
|
||||
Run yamllint on the file:
|
||||
|
||||
```bash
|
||||
yamllint <file>
|
||||
```
|
||||
|
||||
If yamllint is not available, fall back to:
|
||||
|
||||
```bash
|
||||
python3 -c "import yaml; yaml.safe_load(open('<file>'))"
|
||||
```
|
||||
|
||||
## 2. GitHub Actions workflows
|
||||
|
||||
If the file is under `.github/workflows/`, also run:
|
||||
|
||||
```bash
|
||||
actionlint <file>
|
||||
```
|
||||
|
||||
If actionlint is not available, skip silently.
|
||||
|
||||
## Files to skip
|
||||
|
||||
- `config/gh/hosts.yml` — managed by `gh` CLI, not hand-edited
|
||||
19
.ecrc
19
.ecrc
@@ -1,19 +0,0 @@
|
||||
{
|
||||
"Version": "2.7.0",
|
||||
"Verbose": false,
|
||||
"Debug": false,
|
||||
"IgnoreDefaults": false,
|
||||
"SpacesAftertabs": false,
|
||||
"NoColor": false,
|
||||
"Exclude": [],
|
||||
"AllowedContentTypes": [],
|
||||
"PassedFiles": [],
|
||||
"Disable": {
|
||||
"EndOfLine": false,
|
||||
"Indentation": false,
|
||||
"InsertFinalNewline": false,
|
||||
"TrimTrailingWhitespace": false,
|
||||
"IndentSize": false,
|
||||
"MaxLineLength": false
|
||||
}
|
||||
}
|
||||
@@ -8,18 +8,30 @@ indent_style = space
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
[*.php]
|
||||
[*.py]
|
||||
indent_size = 4
|
||||
max_line_length = 120
|
||||
|
||||
[*.fish]
|
||||
max_line_length = 120
|
||||
|
||||
[*.md]
|
||||
max_line_length = 120
|
||||
trim_trailing_whitespace = false
|
||||
|
||||
[*.lua]
|
||||
max_line_length = 90
|
||||
|
||||
[*.{php,fish}]
|
||||
indent_size = 4
|
||||
|
||||
[.git{ignore,modules}]
|
||||
indent_style = tab
|
||||
indent_size = 1
|
||||
|
||||
[*.plist]
|
||||
indent_size = 1
|
||||
indent_style = tab
|
||||
|
||||
[{local/bin/*,**/*.sh,**/zshrc,config/*}]
|
||||
[{local/bin/*,**/*.sh,**/zshrc,config/*,scripts/*}]
|
||||
indent_size = 2
|
||||
tab_width = 2
|
||||
shell_variant = bash # --language-variant
|
||||
binary_next_line = true
|
||||
switch_case_indent = true # --case-indent
|
||||
@@ -27,3 +39,20 @@ space_redirects = true
|
||||
keep_padding = false
|
||||
function_next_line = true # --func-next-line
|
||||
|
||||
[{*.plist,config/git/**,**/config/git/**}]
|
||||
indent_size = 1
|
||||
indent_style = tab
|
||||
|
||||
# Ignore the entire "third_party" directory when calling shfmt on directories,
|
||||
# such as "shfmt -l -w .". When formatting files directly,
|
||||
# like "shfmt -w third_party/foo.sh" or "shfmt --filename=third_party/foo.sh",
|
||||
# the ignore logic is applied only when the --apply-ignore flag is given.
|
||||
[{tools/**,local/bin/asdf/**,config/cheat/cheatsheets/**,config/tmux/plugins/**}]
|
||||
ignore = true
|
||||
|
||||
[plan]
|
||||
trim_trailing_whitespace = false
|
||||
max_line_length = off
|
||||
|
||||
[base/hammerspoon/hammerspoon.types.lua]
|
||||
max_line_length = off
|
||||
|
||||
30
.editorconfig-checker.json
Normal file
30
.editorconfig-checker.json
Normal file
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"Verbose": false,
|
||||
"Debug": false,
|
||||
"IgnoreDefaults": false,
|
||||
"SpacesAfterTabs": false,
|
||||
"NoColor": false,
|
||||
"Exclude": [
|
||||
"base/plan",
|
||||
"config/fish/completions/.*",
|
||||
"config/karabiner/.*",
|
||||
"config/fish/conf.d/.*",
|
||||
"config/fish/functions/.*",
|
||||
"config/fzf/key-bindings.fish",
|
||||
"config/irssi/scripts/autorun/.*",
|
||||
"config/vim/autoload/.*",
|
||||
"docs/.*",
|
||||
"local/man/.*",
|
||||
"local/share/.*"
|
||||
],
|
||||
"AllowedContentTypes": [],
|
||||
"PassedFiles": [],
|
||||
"Disable": {
|
||||
"EndOfLine": false,
|
||||
"Indentation": false,
|
||||
"InsertFinalNewline": false,
|
||||
"TrimTrailingWhitespace": false,
|
||||
"IndentSize": false,
|
||||
"MaxLineLength": false
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
{
|
||||
"extends": ["@ivuorinen"]
|
||||
}
|
||||
53
.gitattributes
vendored
53
.gitattributes
vendored
@@ -1,4 +1,4 @@
|
||||
## GITATTRIBUTES FOR WEB PROJECTS
|
||||
## GITATTRIBUTES
|
||||
#
|
||||
# These settings are for any web project.
|
||||
#
|
||||
@@ -20,20 +20,23 @@
|
||||
*.bat text eol=crlf
|
||||
*.cmd text eol=crlf
|
||||
*.coffee text
|
||||
*.css text diff=css
|
||||
*.htm text diff=html
|
||||
*.html text diff=html
|
||||
*.css text diff=css eol=lf
|
||||
*.fish text diff=shell eol=lf
|
||||
*.htm text diff=html eol=lf
|
||||
*.html text diff=html eol=lf
|
||||
*.inc text
|
||||
*.ini text
|
||||
*.js text
|
||||
*.json text
|
||||
*.jsx text
|
||||
*.less text
|
||||
*.lua text diff=lua eol=lf
|
||||
*.ls text
|
||||
*.map text -diff
|
||||
*.od text
|
||||
*.onlydata text
|
||||
*.php text diff=php
|
||||
*.plist text eol=lf
|
||||
*.pl text
|
||||
*.ps1 text eol=crlf
|
||||
*.py text diff=python
|
||||
@@ -41,15 +44,18 @@
|
||||
*.sass text
|
||||
*.scm text
|
||||
*.scss text diff=css
|
||||
*.sh text eol=lf
|
||||
*.sh text eol=lf diff=shell
|
||||
.husky/* text eol=lf
|
||||
*.sql text
|
||||
*.styl text
|
||||
*.tag text
|
||||
*.tmux text eol=lf diff=tmux
|
||||
*.ts text
|
||||
*.tsx text
|
||||
*.vim text eol=lf
|
||||
*.xml text
|
||||
*.xhtml text diff=html
|
||||
*.zsh text diff=zsh eol=lf
|
||||
|
||||
# Docker
|
||||
Dockerfile text
|
||||
@@ -68,6 +74,7 @@ Dockerfile text
|
||||
AUTHORS text
|
||||
CHANGELOG text
|
||||
CHANGES text
|
||||
CODEOWNERS text
|
||||
CONTRIBUTING text
|
||||
COPYING text
|
||||
copyright text
|
||||
@@ -78,6 +85,7 @@ LICENSE text
|
||||
NEWS text
|
||||
readme text
|
||||
*README* text
|
||||
# Files literally named "TODO", not a todo list item
|
||||
TODO text
|
||||
|
||||
# Templates
|
||||
@@ -105,6 +113,8 @@ TODO text
|
||||
*.config text
|
||||
.editorconfig text
|
||||
.env text
|
||||
*.env text
|
||||
*.env.* text
|
||||
.gitattributes text
|
||||
.gitconfig text
|
||||
.htaccess text
|
||||
@@ -113,7 +123,8 @@ package.json text eol=lf
|
||||
package-lock.json text eol=lf -diff
|
||||
pnpm-lock.yaml text eol=lf -diff
|
||||
.prettierrc text
|
||||
yarn.lock text -diff
|
||||
# Ensure yarn.lock shows textual diffs
|
||||
yarn.lock text eol=lf
|
||||
*.toml text
|
||||
*.yaml text
|
||||
*.yml text
|
||||
@@ -208,20 +219,38 @@ Procfile text
|
||||
|
||||
*.gitignore text
|
||||
*.gitkeep text
|
||||
.gitattributes export-ignore
|
||||
.gitattributes text export-ignore
|
||||
*.gitattributes text export-ignore
|
||||
.gitmodules text export-ignore
|
||||
*.gitmodules text export-ignore
|
||||
**/.gitignore export-ignore
|
||||
**/.gitkeep export-ignore
|
||||
|
||||
# Repo specials
|
||||
local/bin/* text eol=lf
|
||||
local/bin/* text eol=lf diff=shell
|
||||
local/bin/*.md text eol=lf diff=markdown
|
||||
config/antigen.zsh text
|
||||
git/* text
|
||||
**/git/* text
|
||||
**/alias text
|
||||
ssh/* text
|
||||
ssh/shared.d/* text
|
||||
ssh/local.d/* text
|
||||
|
||||
# Git Crypt special files
|
||||
*-secret filter=git-crypt diff=git-crypt
|
||||
*.key filter=git-crypt diff=git-crypt
|
||||
secrets/** filter=git-crypt diff=git-crypt
|
||||
# Auto-generated rules - 2025-04-16 10:28:04
|
||||
# Shell scripts detected by content
|
||||
install text eol=lf diff=shell
|
||||
|
||||
# File extension-based rules
|
||||
*.1 text eol=lf
|
||||
*.applescript text eol=lf
|
||||
*.d/work-git text eol=lf
|
||||
*.dirs text eol=lf
|
||||
*.example text eol=lf
|
||||
*.itermcolors text eol=lf
|
||||
*.locale text eol=lf
|
||||
*.python-version text eol=lf
|
||||
*.snippets text eol=lf
|
||||
*.theme text eol=lf
|
||||
*.yamlfmt text eol=lf
|
||||
*.bats text eol=lf diff=shell
|
||||
|
||||
1
.github/CODEOWNERS
vendored
Normal file
1
.github/CODEOWNERS
vendored
Normal file
@@ -0,0 +1 @@
|
||||
* @ivuorinen
|
||||
8
.github/CODE_OF_CONDUCT.md
vendored
8
.github/CODE_OF_CONDUCT.md
vendored
@@ -60,7 +60,7 @@ representative at an online or offline event.
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||
reported to the community leaders responsible for enforcement at
|
||||
ismo@ivuorinen.net.
|
||||
<ismo@ivuorinen.net>.
|
||||
All complaints will be reviewed and investigated promptly and fairly.
|
||||
|
||||
All community leaders are obligated to respect the privacy and security of the
|
||||
@@ -116,7 +116,7 @@ the community.
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
||||
version 2.0, available at
|
||||
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
|
||||
<https://www.contributor-covenant.org/version/2/0/code_of_conduct.html>.
|
||||
|
||||
Community Impact Guidelines were inspired by [Mozilla's code of conduct
|
||||
enforcement ladder](https://github.com/mozilla/diversity).
|
||||
@@ -124,5 +124,5 @@ enforcement ladder](https://github.com/mozilla/diversity).
|
||||
[homepage]: https://www.contributor-covenant.org
|
||||
|
||||
For answers to common questions about this code of conduct, see the FAQ at
|
||||
https://www.contributor-covenant.org/faq. Translations are available at
|
||||
https://www.contributor-covenant.org/translations.
|
||||
<https://www.contributor-covenant.org/faq>. Translations are available at
|
||||
<https://www.contributor-covenant.org/translations>.
|
||||
|
||||
104
.github/README.md
vendored
104
.github/README.md
vendored
@@ -6,7 +6,10 @@ aware of yet. As I find more interesting tools, configs and other stuff,
|
||||
this repository will live accordingly.
|
||||
|
||||
Please for the love of everything good do not use these 1:1 as your own dotfiles,
|
||||
fork or download the repo as a zip and go from there with your own configs.
|
||||
fork or download the repository as a zip and go from there with your own configs.
|
||||
|
||||
It would be nice if you'd add an issue linking to your fork or repo so I can
|
||||
see what interesting stuff you've done with it. Sharing is caring.
|
||||
|
||||
## Setup
|
||||
|
||||
@@ -23,31 +26,58 @@ fork or download the repo as a zip and go from there with your own configs.
|
||||
|
||||
## The looks
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
## Interesting files and locations
|
||||
|
||||
### Interesting folders
|
||||
|
||||
| Path | Description |
|
||||
| ------------------- | -------------------------------------------- |
|
||||
| `.github` | GitHub Repository configuration files. |
|
||||
|---------------------|----------------------------------------------|
|
||||
| `.github` | GitHub Repository configuration files, meta. |
|
||||
| `hosts/{hostname}/` | Configs that should apply to that host only. |
|
||||
| `local/bin` | Helper scripts that I've collected or wrote. |
|
||||
| `scripts` | Setup scripts. |
|
||||
|
||||
### Host specific configuration
|
||||
|
||||
Configurations under `hosts/<hostname>` are applied only when running on the
|
||||
matching machine. Each host folder contains its own `install.conf.yaml` that
|
||||
is processed by Dotbot during installation.
|
||||
|
||||
### dotfile folders
|
||||
|
||||
| Repo | Destination | Description |
|
||||
| --------- | ----------- | ------------------------------------------- |
|
||||
|-----------|-------------|---------------------------------------------|
|
||||
| `base/` | `.*` | `$HOME` level files. |
|
||||
| `config/` | `.config/` | Configurations for applications. |
|
||||
| `local/` | `.local/` | XDG Base folder: `bin`, `share` and `state` |
|
||||
| `ssh/` | `.ssh/` | SSH Configurations. |
|
||||
|
||||
### dfm - the dotfiles manager
|
||||
### `dfm` - the dotfiles manager
|
||||
|
||||
`.local/bin/dfm` is a shell script that has some tools that help with dotfiles management.
|
||||
[`.local/bin/dfm`][dfm] is a shell script that has some tools that help with dotfiles management.
|
||||
|
||||
Running `dfm` gives you a list of available commands.
|
||||
|
||||
#### Documentation generation
|
||||
|
||||
`dfm docs` generates Markdown documentation under the `docs/` directory. The
|
||||
subcommands are:
|
||||
|
||||
```bash
|
||||
dfm docs alias # regenerate alias table
|
||||
dfm docs folders # document interesting folders
|
||||
dfm docs keybindings # update keybinding docs for tmux, nvim and others
|
||||
dfm docs all # run every docs task
|
||||
```
|
||||
|
||||
The `docs/` folder contains generated cheat sheets, keybindings and other
|
||||
reference files. New documentation can be added without modifying this README.
|
||||
|
||||
## Configuration
|
||||
|
||||
@@ -56,57 +86,39 @@ The folder structure follows [XDG Base Directory Specification][xdg] where possi
|
||||
### XDG Variables
|
||||
|
||||
| Env | Default | Short description |
|
||||
| ------------------ | -------------------- | ---------------------------------------------- |
|
||||
|--------------------|----------------------|------------------------------------------------|
|
||||
| `$XDG_BIN_HOME` | `$HOME/.local/bin` | Local binaries |
|
||||
| `$XDG_CONFIG_HOME` | `$HOME/.config` | User-specific configs |
|
||||
| `$XDG_DATA_HOME` | `$HOME/.local/share` | User-specific data files |
|
||||
| `$XDG_STATE_HOME` | `$HOME/.local/state` | App state that should persist between restarts |
|
||||
|
||||
#### XDG_BIN_HOME (`$HOME/.local/bin`)
|
||||
Please see [docs/folders.md][docs-folders] for more information.
|
||||
|
||||
`$XDG_BIN_HOME` defines directory that contains local binaries.
|
||||
## Managing submodules
|
||||
|
||||
User-specific executable files may be stored in `$HOME/.local/bin`.
|
||||
Distributions should ensure this directory shows up in the UNIX `$PATH`
|
||||
environment variable, at an appropriate place.
|
||||
This repository uses Git submodules for external dependencies. After cloning,
|
||||
run:
|
||||
|
||||
#### XDG_DATA_HOME (`$HOME/.local/share`)
|
||||
```bash
|
||||
git submodule update --init --recursive
|
||||
```
|
||||
|
||||
`$XDG_DATA_HOME` defines the base directory relative to which
|
||||
user-specific _data files_ should be stored.
|
||||
To pull submodule updates later use:
|
||||
|
||||
If `$XDG_DATA_HOME` is either not set or empty,
|
||||
a default equal to `$HOME/.local/share` should be used.
|
||||
```bash
|
||||
git submodule update --remote --merge
|
||||
```
|
||||
|
||||
#### XDG_CONFIG_HOME (`$HOME/.config`)
|
||||
The helper script `add-submodules.sh` documents how each submodule is added and
|
||||
configured. Submodules are automatically updated by the
|
||||
[update-submodules.yml](.github/workflows/update-submodules.yml) workflow.
|
||||
|
||||
`$XDG_CONFIG_HOME` defines the base directory relative to which
|
||||
user-specific _configuration files_ should be stored.
|
||||
## Testing
|
||||
|
||||
If `$XDG_CONFIG_HOME` is either not set or empty,
|
||||
a default equal to `$HOME/.config` should be used.
|
||||
|
||||
#### XDG_STATE_HOME (`$HOME/.local/state`)
|
||||
|
||||
`$XDG_STATE_HOME` defines the base directory relative to which
|
||||
user-specific _state files_ should be stored.
|
||||
|
||||
If `$XDG_STATE_HOME` is either not set or empty,
|
||||
a default equal to `$HOME/.local/state` should be used.
|
||||
|
||||
The `$XDG_STATE_HOME` contains _state data_ that should
|
||||
_persist between (application) restarts_, but that is not important or
|
||||
portable enough to the user that it should be stored in `$XDG_DATA_HOME`.
|
||||
|
||||
- It may contain:
|
||||
- actions history (logs, history, recently used files, …)
|
||||
- current state of the application that can be reused
|
||||
on a restart (view, layout, open files, undo history, …)
|
||||
|
||||
#### XDG_DATA_DIRS
|
||||
|
||||
`$XDG_DATA_DIRS` defines the preference-ordered set of base directories
|
||||
to search for data files in addition to the `$XDG_DATA_HOME` base directory.
|
||||
The directories in `$XDG_DATA_DIRS` should be seperated with a colon ':'.
|
||||
Shell scripts under `local/bin` are validated with [Bats](https://github.com/bats-core/bats-core).
|
||||
Run `yarn test` to execute every test file. Bats is installed as a development
|
||||
dependency, so run `yarn install` first if needed.
|
||||
|
||||
[dfm]: https://github.com/ivuorinen/dotfiles/blob/main/local/bin/dfm
|
||||
[docs-folders]: https://github.com/ivuorinen/dotfiles/blob/main/docs/folders.md
|
||||
[xdg]: https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html
|
||||
|
||||
7
.github/dependabot.yml
vendored
7
.github/dependabot.yml
vendored
@@ -1,7 +0,0 @@
|
||||
version: 2
|
||||
updates:
|
||||
# Maintain dependencies for GitHub Actions
|
||||
- package-ecosystem: 'github-actions'
|
||||
directory: '/'
|
||||
schedule:
|
||||
interval: 'weekly'
|
||||
2
.github/renovate.json
vendored
2
.github/renovate.json
vendored
@@ -1,4 +1,4 @@
|
||||
{
|
||||
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
||||
"extends": ["local>ivuorinen/.github:renovate-config"]
|
||||
"extends": ["local>ivuorinen/renovate-config"]
|
||||
}
|
||||
|
||||
BIN
.github/screenshots/oh-my-posh.png
vendored
BIN
.github/screenshots/oh-my-posh.png
vendored
Binary file not shown.
|
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 45 KiB |
BIN
.github/screenshots/tmux-nvim-kickstart-dark.png
vendored
Normal file
BIN
.github/screenshots/tmux-nvim-kickstart-dark.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 85 KiB |
BIN
.github/screenshots/tmux-nvim-kickstart-light.png
vendored
Normal file
BIN
.github/screenshots/tmux-nvim-kickstart-light.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 87 KiB |
8
.github/tag-changelog-config.js
vendored
8
.github/tag-changelog-config.js
vendored
@@ -16,10 +16,10 @@ module.exports = {
|
||||
|
||||
excludeTypes: [],
|
||||
|
||||
renderTypeSection: function (label, commits) {
|
||||
renderTypeSection: (label, commits) => {
|
||||
let text = `\n## ${label}\n\n`
|
||||
|
||||
commits.forEach(commit => {
|
||||
commits.forEach((commit) => {
|
||||
const scope = commit.scope ? `**${commit.scope}:** ` : ''
|
||||
text += `- ${scope}${commit.subject}\n`
|
||||
})
|
||||
@@ -27,10 +27,10 @@ module.exports = {
|
||||
return text
|
||||
},
|
||||
|
||||
renderChangelog: function (release, changes) {
|
||||
renderChangelog: (release, changes) => {
|
||||
const now = new Date()
|
||||
const d = now.toISOString().substring(0, 10)
|
||||
const header = `# ${release} - ${d}\n`
|
||||
return header + changes + '\n\n'
|
||||
return `${header}${changes}\n\n`
|
||||
},
|
||||
}
|
||||
|
||||
25
.github/workflows/changelog.yml
vendored
25
.github/workflows/changelog.yml
vendored
@@ -1,18 +1,35 @@
|
||||
---
|
||||
# $schema: "https://json.schemastore.org/github-workflow.json"
|
||||
name: Debug Changelog # Workflow name displayed on GitHub
|
||||
|
||||
on:
|
||||
workflow_dispatch: # Trigger manually
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
debug-changelog:
|
||||
runs-on: self-hosted
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
|
||||
- name: Create changelog text
|
||||
id: changelog
|
||||
uses: loopwerk/tag-changelog@v1
|
||||
uses: loopwerk/tag-changelog@8dd150d55fbf1fe93e0ea00a29a6153aaeb81912 # v1.5.0
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
config_file: .github/tag-changelog-config.js
|
||||
- name: 'Echo results'
|
||||
|
||||
- name: "Echo results"
|
||||
id: output-changelog
|
||||
run: |
|
||||
echo "${{ steps.changelog.outputs.changes }}"
|
||||
|
||||
72
.github/workflows/linters.yml
vendored
72
.github/workflows/linters.yml
vendored
@@ -1,39 +1,39 @@
|
||||
name: reviewdog
|
||||
on: [push]
|
||||
---
|
||||
# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json
|
||||
name: Lint Code Base
|
||||
|
||||
# yamllint disable-line
|
||||
on:
|
||||
pull_request:
|
||||
branches: [main]
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
linters:
|
||||
name: Linters
|
||||
runs-on: self-hosted
|
||||
Linter:
|
||||
name: PR Lint
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 15
|
||||
permissions:
|
||||
contents: read
|
||||
issues: write
|
||||
packages: read
|
||||
pull-requests: write
|
||||
statuses: write
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: GitHub Actions
|
||||
uses: reviewdog/action-actionlint@v1
|
||||
- name: Checkout
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
|
||||
- name: Yarn Lock Changes
|
||||
uses: Simek/yarn-lock-changes@59f47ee499424d2c2437c5aebf863b5c6d50a5bc # v0.14.1
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
reporter: github-pr-review
|
||||
- name: detect-secrets
|
||||
uses: reviewdog/action-detect-secrets@master
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
reporter: github-pr-review
|
||||
- name: markdownlint
|
||||
uses: reviewdog/action-markdownlint@v0
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
reporter: github-pr-review
|
||||
- name: shfmt
|
||||
uses: reviewdog/action-shfmt@v1
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
shfmt_flags: |
|
||||
--find
|
||||
--list
|
||||
--write
|
||||
--diff
|
||||
--simplify
|
||||
--language-dialect bash
|
||||
--indent 2
|
||||
--binary-next-line
|
||||
--case-indent
|
||||
--space-redirects
|
||||
--func-next-line
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Run PR Lint
|
||||
uses: ivuorinen/actions/pr-lint@1da3a0e79fcd7da6bed9ee1979f1449ba11f58f9 # v2026.03.14
|
||||
|
||||
40
.github/workflows/new-release.yml
vendored
40
.github/workflows/new-release.yml
vendored
@@ -1,34 +1,50 @@
|
||||
name: Release Daily State # Workflow name displayed on GitHub
|
||||
---
|
||||
# $schema: "https://json.schemastore.org/github-workflow.json"
|
||||
name: Release Daily State
|
||||
|
||||
on:
|
||||
workflow_dispatch: # Trigger manually
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
- cron: '30 20 * * *' # UTC is 2-3 hours behind Europe/Helsinki, my timezone
|
||||
- cron: "0 21 * * *" # 00:00 at Europe/Helsinki
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
new-daily-release:
|
||||
runs-on: self-hosted
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
outputs:
|
||||
created: ${{ steps.daily-version.outputs.created }}
|
||||
version: ${{ steps.daily-version.outputs.version }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4 # Checkout our working repository
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
|
||||
- name: Create tag if necessary
|
||||
uses: fregante/daily-version-action@v2
|
||||
uses: fregante/daily-version-action@fb1a60b7c4daf1410cd755e360ebec3901e58588 # v2.1.3
|
||||
id: daily-version
|
||||
|
||||
- name: Create changelog text
|
||||
if: steps.daily-version.outputs.created
|
||||
id: changelog
|
||||
uses: loopwerk/tag-changelog@v1
|
||||
uses: loopwerk/tag-changelog@8dd150d55fbf1fe93e0ea00a29a6153aaeb81912 # v1.5.0
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
config_file: .github/tag-changelog-config.js
|
||||
|
||||
- name: Create release
|
||||
if: steps.daily-version.outputs.created
|
||||
uses: actions/create-release@latest
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
uses: softprops/action-gh-release@153bb8e04406b158c6c84fc1615b65b24149a1fe # v2.6.1
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
tag_name: ${{ steps.daily-version.outputs.version }}
|
||||
release_name: Release ${{ steps.daily-version.outputs.version }}
|
||||
name: Release ${{ steps.daily-version.outputs.version }}
|
||||
body: ${{ steps.changelog.outputs.changes }}
|
||||
|
||||
39
.github/workflows/pre-commit-autoupdate.yml
vendored
Normal file
39
.github/workflows/pre-commit-autoupdate.yml
vendored
Normal file
@@ -0,0 +1,39 @@
|
||||
---
|
||||
# $schema: "https://json.schemastore.org/github-workflow.json"
|
||||
name: Pre-commit autoupdate
|
||||
|
||||
on:
|
||||
schedule:
|
||||
# At 04:00 on Monday and Thursday.
|
||||
- cron: "0 4 * * 1,4"
|
||||
workflow_dispatch:
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
auto-update:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
|
||||
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
||||
|
||||
- run: pip install pre-commit && pre-commit autoupdate
|
||||
|
||||
- uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v8.1.0
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
branch: update/pre-commit-hooks
|
||||
title: "chore: update pre-commit hooks"
|
||||
commit-message: "chore: update pre-commit hooks"
|
||||
body: Update versions of pre-commit hooks to latest version.
|
||||
29
.github/workflows/semantic-pr.yml
vendored
Normal file
29
.github/workflows/semantic-pr.yml
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
---
|
||||
# $schema: "https://json.schemastore.org/github-workflow.json"
|
||||
name: Semantic PR
|
||||
|
||||
# yamllint disable-line
|
||||
on:
|
||||
pull_request:
|
||||
types:
|
||||
- opened
|
||||
- edited
|
||||
- synchronize
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
pull-requests: read
|
||||
|
||||
jobs:
|
||||
semantic-pr:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: amannn/action-semantic-pull-request@48f256284bd46cdaab1048c3721360e808335d50 # v6.1.1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
validateSingleCommit: true
|
||||
33
.github/workflows/sync-labels.yml
vendored
Normal file
33
.github/workflows/sync-labels.yml
vendored
Normal file
@@ -0,0 +1,33 @@
|
||||
---
|
||||
# $schema: "https://json.schemastore.org/github-workflow.json"
|
||||
name: Sync labels
|
||||
|
||||
# yamllint disable-line rule:truthy
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
paths:
|
||||
- .github/workflows/sync-labels.yml
|
||||
- .github/labels.yml
|
||||
schedule:
|
||||
- cron: "34 5 * * *"
|
||||
workflow_call:
|
||||
workflow_dispatch:
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
SyncLabels:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
permissions:
|
||||
issues: write
|
||||
|
||||
steps:
|
||||
- uses: ivuorinen/actions/sync-labels@1da3a0e79fcd7da6bed9ee1979f1449ba11f58f9 # v2026.03.14
|
||||
56
.github/workflows/update-submodules.yml
vendored
56
.github/workflows/update-submodules.yml
vendored
@@ -1,36 +1,58 @@
|
||||
---
|
||||
# $schema: "https://json.schemastore.org/github-workflow.json"
|
||||
name: Update submodules
|
||||
|
||||
on:
|
||||
schedule: [{ cron: 0 3 * * * }]
|
||||
schedule:
|
||||
# At 04:00 on Monday and Thursday.
|
||||
- cron: "0 4 * * 1,4"
|
||||
workflow_dispatch:
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
issues: write
|
||||
pull-requests: write
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
update-submodules:
|
||||
runs-on: self-hosted
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
submodules: true
|
||||
fetch-depth: 0
|
||||
fetch-depth: 2
|
||||
token: ${{secrets.GITHUB_TOKEN}}
|
||||
|
||||
- name: Config Git User
|
||||
shell: bash
|
||||
run: |
|
||||
git config --global user.name "${{ github.actor }}"
|
||||
git config --global user.email "${{ github.actor }}@users.noreply.github.com"
|
||||
- name: Update submodules
|
||||
run: |
|
||||
if git commit -am"chore(git): Update submodules (automated)
|
||||
|
||||
$(git submodule --quiet foreach \
|
||||
'tag="$(git describe --tags --abbrev=0 origin/HEAD)"
|
||||
if [ "$(git describe --tags)" != "$tag" ]; then
|
||||
git checkout --quiet "$tag"
|
||||
echo "$name" "$tag"
|
||||
fi')"
|
||||
then
|
||||
- name: Update submodules
|
||||
shell: bash
|
||||
run: |
|
||||
git submodule sync
|
||||
git submodule foreach --quiet "
|
||||
tag=\"$(git describe --tags --abbrev=0 origin/HEAD)\"
|
||||
if [ \"$(git describe --tags)\" != \"$tag\" ]; then
|
||||
git checkout --quiet \"$tag\"
|
||||
echo \"$name updated to $tag\"
|
||||
fi
|
||||
"
|
||||
|
||||
if git diff --quiet; then
|
||||
echo "No updates for submodules."
|
||||
else
|
||||
git add .
|
||||
git commit -m "chore(git): Update submodules (automated)"
|
||||
git show --raw
|
||||
git push
|
||||
fi
|
||||
|
||||
78
.gitignore
vendored
78
.gitignore
vendored
@@ -1,24 +1,72 @@
|
||||
Brewfile.lock.json
|
||||
config/nvim/lazy-lock.json
|
||||
*.log
|
||||
!.gitkeep
|
||||
*-secret
|
||||
*.bak
|
||||
*.log
|
||||
*.socket
|
||||
*.swp
|
||||
*.old
|
||||
*cache
|
||||
.env
|
||||
.idea
|
||||
.nfs*
|
||||
.scannerwork
|
||||
.vscode
|
||||
.yarn/
|
||||
!config/git/local.d/.gitkeep
|
||||
!config/nvim/spell/.gitkeep
|
||||
!config/zed/settings.json
|
||||
!ssh/local.d/.gitkeep
|
||||
**/exports-secret.fish
|
||||
**/exports.secret.fish
|
||||
*.tmp.*
|
||||
Brewfile.lock.json
|
||||
antidote_plugins.zsh
|
||||
config/alacritty/theme-active.toml
|
||||
config/cheat/cheatsheets/pure-bash-bible/*
|
||||
config/cheat/cheatsheets/tldr/*
|
||||
config/fish/completions/asdf.fish
|
||||
config/fish/completions/kubectl.fish
|
||||
config/fish/completions/orbctl.fish
|
||||
config/fish/fish_variables
|
||||
config/fish/fish_variables.*
|
||||
config/fish/secrets.d/*
|
||||
!config/fish/secrets.d/*.example
|
||||
!config/fish/secrets.d/README.md
|
||||
config/gh/hosts.yml
|
||||
config/git/credentials
|
||||
config/npm/npmrc
|
||||
config/zsh/.zcompdump
|
||||
ssh/local.d/*
|
||||
!ssh/local.d/.gitkeep
|
||||
!.gitkeep
|
||||
.env
|
||||
local/share/fonts/*
|
||||
node_modules
|
||||
.nfs*
|
||||
*.socket
|
||||
iTermServer-*
|
||||
lock
|
||||
config/git/local.d/*
|
||||
config/gnupg/S.*
|
||||
config/gnupg/private-keys-v1.d
|
||||
config/gnupg/s
|
||||
config/iterm2/AppSupport
|
||||
config/karabiner/automatic_backups
|
||||
config/npm/npmrc
|
||||
config/nvim/lazy-lock.json
|
||||
config/nvim/spell/*
|
||||
config/op/plugins/gh.json
|
||||
config/op/plugins/used_items/gh.json
|
||||
config/vim/.netrwhist
|
||||
config/vim/extra/*
|
||||
config/vim/fzf
|
||||
config/vim/plugged/*
|
||||
config/zed/*
|
||||
config/zed/settings.json
|
||||
config/zsh/.zcompdump
|
||||
dependency-check-report.html
|
||||
iTermServer-*
|
||||
lazy-lock.json
|
||||
local/bin/asdf/plugins/*
|
||||
local/bin/yabai
|
||||
local/man/yabai.1
|
||||
local/share/fonts/*
|
||||
lock
|
||||
node_modules
|
||||
__pycache__
|
||||
ssh/local.d/*
|
||||
config/fish/fish_variables*
|
||||
|
||||
# Allow .claude directory (overrides global **/.claude/* ignore)
|
||||
!.claude/
|
||||
!.claude/**
|
||||
.claude/**/*.log
|
||||
.claude/settings.local.json
|
||||
|
||||
58
.gitmodules
vendored
58
.gitmodules
vendored
@@ -1,14 +1,9 @@
|
||||
# vim: set expandtab:
|
||||
# vim: noexpandtab filetype=gitconfig
|
||||
[submodule "dotbot"]
|
||||
path = tools/dotbot
|
||||
url = https://github.com/anishathalye/dotbot.git
|
||||
ignore = dirty
|
||||
|
||||
[submodule "dotbot-brew"]
|
||||
path = tools/dotbot-brew
|
||||
url = https://github.com/wren/dotbot-brew.git
|
||||
ignore = dirty
|
||||
|
||||
[submodule "dotbot-include"]
|
||||
path = tools/dotbot-include
|
||||
url = https://gitlab.com/gnfzdz/dotbot-include.git
|
||||
@@ -23,44 +18,43 @@
|
||||
path = config/tmux/plugins/tmux-continuum
|
||||
url = https://github.com/tmux-plugins/tmux-continuum
|
||||
ignore = dirty
|
||||
[submodule "tmux/tmux-resurrect"]
|
||||
path = config/tmux/plugins/tmux-resurrect
|
||||
url = https://github.com/tmux-plugins/tmux-resurrect
|
||||
ignore = dirty
|
||||
[submodule "tmux/tmux-sensible"]
|
||||
path = config/tmux/plugins/tmux-sensible
|
||||
url = https://github.com/tmux-plugins/tmux-sensible.git
|
||||
ignore = dirty
|
||||
|
||||
[submodule "tmux/tmux-sessionist"]
|
||||
path = config/tmux/plugins/tmux-sessionist
|
||||
url = https://github.com/tmux-plugins/tmux-sessionist.git
|
||||
ignore = dirty
|
||||
[submodule "tmux/tmux-yank"]
|
||||
path = config/tmux/plugins/tmux-yank
|
||||
url = https://github.com/tmux-plugins/tmux-yank.git
|
||||
ignore = dirty
|
||||
[submodule "tmux/tmux-window-name"]
|
||||
path = config/tmux/plugins/tmux-window-name
|
||||
url = https://github.com/ivuorinen/tmux-window-name.git
|
||||
ignore = dirty
|
||||
[submodule "dotbot-pip"]
|
||||
path = tools/dotbot-pip
|
||||
url = https://github.com/sobolevn/dotbot-pip.git
|
||||
|
||||
[submodule "tmux/tmux-suspend"]
|
||||
path = config/tmux/plugins/tmux-suspend
|
||||
url = https://github.com/MunifTanjim/tmux-suspend.git
|
||||
[submodule "tmux/tmux-mode-indicator"]
|
||||
path = config/tmux/plugins/tmux-mode-indicator
|
||||
url = https://github.com/MunifTanjim/tmux-mode-indicator.git
|
||||
ignore = dirty
|
||||
|
||||
[submodule "tmux/tmux-current-pane-hostname"]
|
||||
path = config/tmux/plugins/tmux-current-pane-hostname
|
||||
url = https://github.com/soyuka/tmux-current-pane-hostname.git
|
||||
ignore = dirty
|
||||
|
||||
[submodule "cheat-tldr"]
|
||||
path = config/cheat/cheatsheets/tldr
|
||||
url = https://github.com/ivuorinen/cheatsheet-tldr.git
|
||||
[submodule "nvim-kickstart"]
|
||||
path = config/nvim-kickstart
|
||||
url = https://github.com/ivuorinen/kickstart.nvim
|
||||
ignore = dirty
|
||||
|
||||
[submodule "tmux/tmux-dark-notify"]
|
||||
path = config/tmux/plugins/tmux-dark-notify
|
||||
url = https://github.com/erikw/tmux-dark-notify.git
|
||||
url = https://github.com/ivuorinen/tmux-dark-notify.git
|
||||
ignore = dirty
|
||||
|
||||
[submodule "antidote"]
|
||||
path = tools/antidote
|
||||
url = https://github.com/mattmc3/antidote.git
|
||||
shallow = true
|
||||
ignore = dirty
|
||||
|
||||
[submodule "tmux/tmux-resurrect"]
|
||||
path = config/tmux/plugins/tmux-resurrect
|
||||
url = https://github.com/tmux-plugins/tmux-resurrect.git
|
||||
ignore = dirty
|
||||
[submodule "tmux/catppuccin"]
|
||||
path = config/tmux/plugins/catppuccin
|
||||
url = https://github.com/catppuccin/tmux.git
|
||||
ignore = dirty
|
||||
|
||||
10
.ignore
10
.ignore
@@ -1,6 +1,10 @@
|
||||
**/__pycache__/**
|
||||
*.pyc
|
||||
.git/**
|
||||
config/cheat/cheatsheets/community/**
|
||||
tools/dotbot/**
|
||||
tools/dotbot-brew/**
|
||||
tools/dotbot-include/**
|
||||
config/tmux/plugins/**
|
||||
config/vim/plugged/**
|
||||
node_modules
|
||||
tools/antidote/**
|
||||
tools/dotbot-include/**
|
||||
tools/dotbot/**
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
{
|
||||
"extends": "@ivuorinen/markdownlint-config",
|
||||
"code-block-style": {
|
||||
"style": "fenced"
|
||||
},
|
||||
"code-fence-style": {
|
||||
"style": "backtick"
|
||||
},
|
||||
"heading-style": {
|
||||
"style": "atx"
|
||||
},
|
||||
"no-duplicate-heading": {
|
||||
"siblings_only": true
|
||||
},
|
||||
"required-headings": false,
|
||||
"ul-style": {
|
||||
"style": "dash"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,10 @@
|
||||
# only care about files that are under our control
|
||||
# only care about files that are directly under our control
|
||||
.git/*
|
||||
config/cheat/cheatsheets/community/*
|
||||
config/cheat/cheatsheets/tldr/*
|
||||
config/op/plugins/used_plugins/*
|
||||
config/tmux/plugins/*
|
||||
tools/*
|
||||
config/vim/*
|
||||
local/bin/asdf/*
|
||||
node_modules/*
|
||||
|
||||
tools/*
|
||||
|
||||
29
.mega-linter.yml
Normal file
29
.mega-linter.yml
Normal file
@@ -0,0 +1,29 @@
|
||||
---
|
||||
# Configuration file for MegaLinter
|
||||
# See all available variables at
|
||||
# https://megalinter.io/configuration/ and in linters documentation
|
||||
APPLY_FIXES: all
|
||||
SHOW_ELAPSED_TIME: false # Show elapsed time at the end of MegaLinter run
|
||||
PARALLEL: true
|
||||
VALIDATE_ALL_CODEBASE: true
|
||||
FILEIO_REPORTER: false # Generate file.io report
|
||||
GITHUB_STATUS_REPORTER: true # Generate GitHub status report
|
||||
IGNORE_GENERATED_FILES: true # Ignore generated files
|
||||
PRINT_ALPACA: false # Print Alpaca logo in console
|
||||
SARIF_REPORTER: true # Generate SARIF report
|
||||
SHOW_SKIPPED_LINTERS: false # Show skipped linters in MegaLinter log
|
||||
DISABLE_LINTERS:
|
||||
- REPOSITORY_DEVSKIM
|
||||
- JAVASCRIPT_ES # using biome
|
||||
- JAVASCRIPT_PRETTIER # using biome
|
||||
- TYPESCRIPT_PRETTIER # using biome
|
||||
- JSON_PRETTIER # using biome
|
||||
- PYTHON_BLACK # using ruff
|
||||
- PYTHON_FLAKE8 # using ruff
|
||||
- PYTHON_PYLINT # using ruff
|
||||
- PYTHON_ISORT # using ruff (I rules)
|
||||
YAML_YAMLLINT_CONFIG_FILE: .yamllint.yml
|
||||
REPOSITORY_GIT_DIFF_DISABLE_ERRORS: true
|
||||
BASH_SHFMT_ARGUMENTS: -i 2 -bn -ci -sr -fn
|
||||
FILTER_REGEX_EXCLUDE: >
|
||||
(node_modules|tools|config/cheat/cheatsheets/community|config/cheat/cheatsheets/tldr|config/fzf|config/zsh|config/tmux/plugins)
|
||||
4
.mise.toml
Normal file
4
.mise.toml
Normal file
@@ -0,0 +1,4 @@
|
||||
[tools]
|
||||
node = "24.14.0"
|
||||
python = "3.14.3"
|
||||
go = "1.26.1"
|
||||
83
.pre-commit-config.yaml
Normal file
83
.pre-commit-config.yaml
Normal file
@@ -0,0 +1,83 @@
|
||||
---
|
||||
repos:
|
||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||
rev: v6.0.0
|
||||
hooks:
|
||||
- id: requirements-txt-fixer
|
||||
- id: detect-aws-credentials
|
||||
- id: detect-private-key
|
||||
- id: trailing-whitespace
|
||||
args: [--markdown-linebreak-ext=md]
|
||||
- id: check-case-conflict
|
||||
- id: check-merge-conflict
|
||||
- id: check-executables-have-shebangs
|
||||
- id: check-shebang-scripts-are-executable
|
||||
- id: check-symlinks
|
||||
- id: check-toml
|
||||
- id: check-xml
|
||||
- id: check-yaml
|
||||
args: [--allow-multiple-documents]
|
||||
- id: end-of-file-fixer
|
||||
- id: mixed-line-ending
|
||||
args: [--fix=auto]
|
||||
|
||||
- repo: local
|
||||
hooks:
|
||||
- id: biome-check
|
||||
name: Biome Check
|
||||
entry: yarn biome check --write --files-ignore-unknown=true --no-errors-on-unmatched
|
||||
language: system
|
||||
files: \.(js|ts|jsx|tsx|json)$
|
||||
- id: markdown-table-formatter
|
||||
name: Markdown Table Formatter
|
||||
entry: yarn markdown-table-formatter
|
||||
language: system
|
||||
types: [markdown]
|
||||
|
||||
- repo: https://github.com/adrienverge/yamllint
|
||||
rev: v1.38.0
|
||||
hooks:
|
||||
- id: yamllint
|
||||
|
||||
- repo: local
|
||||
hooks:
|
||||
- id: prettier
|
||||
name: Prettier (YAML)
|
||||
entry: yarn prettier --write
|
||||
language: system
|
||||
types_or: [yaml]
|
||||
|
||||
- repo: https://github.com/shellcheck-py/shellcheck-py
|
||||
rev: v0.11.0.1
|
||||
hooks:
|
||||
- id: shellcheck
|
||||
|
||||
- repo: https://github.com/scop/pre-commit-shfmt
|
||||
rev: v3.12.0-2
|
||||
hooks:
|
||||
- id: shfmt
|
||||
args: [-i, "2", -bn, -ci, -sr, -fn, -w]
|
||||
|
||||
- repo: https://github.com/rhysd/actionlint
|
||||
rev: v1.7.11
|
||||
hooks:
|
||||
- id: actionlint
|
||||
|
||||
- repo: https://github.com/JohnnyMorganz/StyLua
|
||||
rev: v2.4.0
|
||||
hooks:
|
||||
- id: stylua # or stylua-system / stylua-github
|
||||
exclude: hammerspoon\.types\.lua$
|
||||
|
||||
- repo: https://github.com/hugoh/pre-commit-fish.git
|
||||
rev: v1.2
|
||||
hooks:
|
||||
- id: fish_syntax
|
||||
- id: fish_indent
|
||||
|
||||
- repo: https://github.com/astral-sh/ruff-pre-commit
|
||||
rev: v0.15.6
|
||||
hooks:
|
||||
- id: ruff-check
|
||||
args: [--fix]
|
||||
- id: ruff-format
|
||||
@@ -1,8 +1,18 @@
|
||||
.mypy_cache/*
|
||||
tools/dotbot*
|
||||
local/bin/antigen.zsh
|
||||
config/cheat/cheatsheets/community
|
||||
config/tmux/plugins/*
|
||||
lazy-lock.json
|
||||
node_modules
|
||||
.yarn
|
||||
.pnp.*
|
||||
.mypy_cache
|
||||
Brewfile.lock.json
|
||||
|
||||
lazy-lock.json
|
||||
config/cheat/cheatsheets/community
|
||||
config/cheat/cheatsheets/tldr
|
||||
config/fzf
|
||||
config/nvim
|
||||
config/op/plugins/used_plugins
|
||||
config/tmux/plugins
|
||||
config/vim/plugged
|
||||
config/zsh
|
||||
local/bin/antigen.zsh
|
||||
local/bin/asdf
|
||||
tools
|
||||
config/gh/hosts.yml
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
module.exports = {
|
||||
...require('@ivuorinen/prettier-config'),
|
||||
trailingComma: 'all',
|
||||
// Add custom options below:
|
||||
overrides: [
|
||||
{
|
||||
files: '*.md',
|
||||
options: {
|
||||
printWidth: 120,
|
||||
proseWrap: 'preserve',
|
||||
},
|
||||
},
|
||||
],
|
||||
}
|
||||
9
.prettierrc.json
Normal file
9
.prettierrc.json
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"$schema": "https://json.schemastore.org/prettierrc",
|
||||
"printWidth": 200,
|
||||
"tabWidth": 2,
|
||||
"useTabs": false,
|
||||
"endOfLine": "lf",
|
||||
"singleQuote": false,
|
||||
"proseWrap": "preserve"
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
3.12
|
||||
1
.serena/.gitignore
vendored
Normal file
1
.serena/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
/cache
|
||||
67
.serena/memories/areas_for_improvement.md
Normal file
67
.serena/memories/areas_for_improvement.md
Normal file
@@ -0,0 +1,67 @@
|
||||
# Areas for Improvement
|
||||
|
||||
## Code Quality Enhancements
|
||||
|
||||
### 1. Configuration Management
|
||||
|
||||
- **Inconsistent indentation**: Mixed tabs/spaces across config files
|
||||
- **Line length management**: Need consistent enforcement of limits
|
||||
- **Template standardization**: Memory files need consistent formatting template
|
||||
|
||||
### 2. Linting Configuration Improvements
|
||||
|
||||
- **Shellcheck exclusions**: Add proper ignore patterns for submodules
|
||||
- **EditorConfig refinement**: Some rules too strict for generated/third-party content
|
||||
- **Prettier ignore patterns**: Better exclusion of binary/generated files
|
||||
|
||||
### 3. Testing Infrastructure
|
||||
|
||||
- **Bats test errors**: Tests failing due to missing `rm` command in PATH
|
||||
- **Test coverage**: Limited test coverage for shell functions
|
||||
- **CI/CD integration**: Need automated linting in GitHub Actions
|
||||
|
||||
### 4. Documentation Gaps
|
||||
|
||||
- **Onboarding docs**: Missing clear setup instructions for new contributors
|
||||
- **Troubleshooting guide**: Need common error resolution steps
|
||||
- **Architecture overview**: Missing high-level system architecture
|
||||
|
||||
## Performance & Maintenance
|
||||
|
||||
### 5. Submodule Management
|
||||
|
||||
- **Large submodules**: Some submodules contain unnecessary files
|
||||
- **Update frequency**: Need systematic submodule update process
|
||||
- **Dependency tracking**: Better documentation of submodule purposes
|
||||
|
||||
### 6. Cross-Platform Considerations
|
||||
|
||||
- **Darwin-specific paths**: Some hardcoded macOS paths could be parameterized
|
||||
- **Shell compatibility**: More testing across bash/zsh/fish environments
|
||||
- **Tool availability**: Better fallbacks when optional tools missing
|
||||
|
||||
### 7. Security & Privacy
|
||||
|
||||
- **Secret management**: Better examples for secret configuration
|
||||
- **Permission handling**: Some scripts could use more restrictive permissions
|
||||
- **Audit trail**: Track configuration changes and their impact
|
||||
|
||||
## Development Workflow
|
||||
|
||||
### 8. Automation Opportunities
|
||||
|
||||
- **Auto-formatting**: Pre-commit hooks for consistent formatting
|
||||
- **Dependency updates**: Automated updates for package.json dependencies
|
||||
- **Health checks**: Scripts to validate configuration integrity
|
||||
|
||||
### 9. Error Handling
|
||||
|
||||
- **Graceful degradation**: Better fallbacks when tools unavailable
|
||||
- **Error messages**: More informative error output
|
||||
- **Recovery procedures**: Automated recovery from common failures
|
||||
|
||||
### 10. Modularity
|
||||
|
||||
- **Configuration splitting**: Some large config files could be modularized
|
||||
- **Feature flags**: Optional components for minimal installations
|
||||
- **Host-specific configs**: Better organization of machine-specific settings
|
||||
50
.serena/memories/code_style_conventions.md
Normal file
50
.serena/memories/code_style_conventions.md
Normal file
@@ -0,0 +1,50 @@
|
||||
# Code Style and Conventions
|
||||
|
||||
## EditorConfig Rules (.editorconfig)
|
||||
|
||||
- **Charset**: UTF-8
|
||||
- **Line endings**: LF
|
||||
- **Indent style**: Spaces (except for specific files)
|
||||
- **Indent size**: 2 spaces (default)
|
||||
- **Final newline**: Required
|
||||
- **Trailing whitespace**: Trimmed
|
||||
|
||||
### Language-specific Rules
|
||||
|
||||
- **Fish scripts**: 4-space indent, 80 char line limit
|
||||
- **PHP files**: 4-space indent
|
||||
- **Markdown**: 120 char line limit
|
||||
- **Lua**: 90 char line limit
|
||||
- **Git files**: Tab indentation
|
||||
- **Shell scripts**: 2-space indent with specific shfmt settings
|
||||
|
||||
## Prettier Configuration
|
||||
|
||||
- Extends `@ivuorinen/prettier-config`
|
||||
- **Trailing commas**: Always
|
||||
- **Markdown**: 120 char width, preserve prose wrapping
|
||||
|
||||
## ESLint Configuration
|
||||
|
||||
- Extends `@ivuorinen` base configuration
|
||||
- Applied to JavaScript/TypeScript files
|
||||
|
||||
## Shell Script Standards (.shellcheckrc)
|
||||
|
||||
- External sources following enabled
|
||||
- Disabled checks: SC2039, SC2166, SC2154, SC1091, SC2174, SC2016
|
||||
- Must include shebang or `# shellcheck shell=bash`
|
||||
|
||||
## Formatting Tools
|
||||
|
||||
- **Shell scripts**: shfmt with specific rules
|
||||
- **Markdown**: markdownlint + prettier
|
||||
- **JavaScript/TypeScript**: prettier + eslint
|
||||
- **YAML**: yamllint
|
||||
|
||||
## Naming Conventions
|
||||
|
||||
- **Shell functions**: Use `x-` prefix for cross-shell compatibility
|
||||
- **Environment variables**: UPPERCASE with underscores
|
||||
- **File names**: lowercase with hyphens for scripts
|
||||
- **Directory structure**: lowercase, organized by tool/purpose
|
||||
80
.serena/memories/critical_linting_errors.md
Normal file
80
.serena/memories/critical_linting_errors.md
Normal file
@@ -0,0 +1,80 @@
|
||||
# Critical Linting Errors That Must Be Fixed
|
||||
|
||||
## Current Status: BLOCKING Issues Identified
|
||||
|
||||
The linting system has revealed 150+ violations across multiple categories that must be addressed immediately.
|
||||
|
||||
## EditorConfig Violations (High Priority)
|
||||
|
||||
### Missing Final Newlines
|
||||
|
||||
- All `.serena/memories/*.md` files missing final newlines
|
||||
- Multiple project configuration files affected
|
||||
- This is a BLOCKING issue per user instructions
|
||||
|
||||
### Line Length Violations
|
||||
|
||||
- Fish shell configs exceed 80-character limit (`.editorconfig` enforced)
|
||||
- Memory files have lines exceeding 120-character limit
|
||||
- WezTerm configuration files have long lines
|
||||
|
||||
### Indentation Errors
|
||||
|
||||
- Git configuration using tabs instead of spaces
|
||||
- WezTerm color scheme files using tabs vs spaces
|
||||
- Perl scripts with inconsistent indentation
|
||||
|
||||
## Markdownlint Issues (Memory Files)
|
||||
|
||||
### Systematic Problems Across All Memory Files
|
||||
|
||||
- Missing blank lines around headings (MD022)
|
||||
- Lists not surrounded by blank lines (MD032)
|
||||
- Fenced code blocks not surrounded by blank lines (MD031)
|
||||
- Trailing punctuation in headings (MD026)
|
||||
- Missing language specification for fenced code blocks (MD040)
|
||||
- Missing final newlines (MD047)
|
||||
|
||||
### Specific Files Affected
|
||||
|
||||
- `areas_for_improvement.md`: 20+ violations
|
||||
- `code_style_conventions.md`: 15+ violations
|
||||
- `critical_linting_errors.md`: 25+ violations
|
||||
- `darwin_system_utilities.md`: 15+ violations
|
||||
- `immediate_action_items.md`: 25+ violations
|
||||
- `project_overview.md`: 15+ violations
|
||||
- `project_structure.md`: 20+ violations
|
||||
- `shellcheck_issues.md`: 15+ violations
|
||||
- `suggested_commands.md`: 25+ violations
|
||||
- `task_completion_checklist.md`: 10+ violations
|
||||
|
||||
## Prettier Formatting Issues
|
||||
|
||||
### JSON Configuration Files
|
||||
|
||||
- `.commitlintrc.json`, `.eslintrc.json`, `.luarc.json`
|
||||
- `.releaserc.json`, `.github/renovate.json`
|
||||
- Host-specific configurations in `config/` directory
|
||||
|
||||
### YAML Files
|
||||
|
||||
- `.mega-linter.yml` formatting inconsistencies
|
||||
- Various configuration files needing formatting
|
||||
|
||||
## Immediate Action Required
|
||||
|
||||
1. **Fix memory files**: Apply markdown formatting rules
|
||||
2. **Run auto-fixers**: `yarn fix` to address automatic fixes
|
||||
3. **Manual corrections**: Address remaining EditorConfig violations
|
||||
4. **Validation**: Ensure `yarn lint` passes completely
|
||||
|
||||
## Impact Assessment
|
||||
|
||||
These violations prevent:
|
||||
|
||||
- Successful CI/CD pipeline execution
|
||||
- Code quality standards compliance
|
||||
- Pre-commit hook success
|
||||
- Project maintainability standards
|
||||
|
||||
Per user instructions: "Linting issues ARE NOT ACCEPTABLE" and "EditorConfig problems are blocking errors"
|
||||
66
.serena/memories/darwin_system_utilities.md
Normal file
66
.serena/memories/darwin_system_utilities.md
Normal file
@@ -0,0 +1,66 @@
|
||||
# Darwin (macOS) System Utilities
|
||||
|
||||
## Available Command Paths
|
||||
|
||||
Based on the current system setup:
|
||||
|
||||
### Core System Commands
|
||||
|
||||
- `git`: `/opt/homebrew/bin/git` (Homebrew version)
|
||||
- `find`: `/usr/bin/find` (system version)
|
||||
- `cd`: shell built-in command
|
||||
- `ls`: aliased to `eza -h -s=type --git --icons --group-directories-first`
|
||||
- `grep`: aliased to `grep --color`
|
||||
|
||||
### Modern Alternatives (Rust-based)
|
||||
|
||||
- `fd`: `/Users/ivuorinen/.local/share/cargo/bin/fd` (modern find)
|
||||
- `rg`: `/Users/ivuorinen/.local/share/cargo/bin/rg` (ripgrep for text search)
|
||||
|
||||
## Recommended Usage Patterns
|
||||
|
||||
### File Search
|
||||
|
||||
```bash
|
||||
# Use fd instead of find when possible
|
||||
fd "*.sh" # Find shell scripts
|
||||
fd -t f -e lua # Find Lua files
|
||||
find . -name "*.sh" # Fallback to system find
|
||||
```
|
||||
|
||||
### Text Search
|
||||
|
||||
```bash
|
||||
# Use rg (ripgrep) instead of grep when possible
|
||||
rg "function.*bash" # Search for bash functions
|
||||
rg -t shell "export" # Search in shell files only
|
||||
grep "pattern" file.txt # Fallback to system grep
|
||||
```
|
||||
|
||||
### Directory Navigation
|
||||
|
||||
```bash
|
||||
# Use eza features via ls alias
|
||||
ls # Shows icons, git status, grouped directories
|
||||
ls -la # Long format with hidden files
|
||||
cd /full/path # Always use full paths in scripts
|
||||
```
|
||||
|
||||
## Path Configuration
|
||||
|
||||
The system is configured with these PATH priorities:
|
||||
|
||||
1. `~/.local/bin` (user scripts)
|
||||
2. `~/.dotfiles/local/bin` (dotfiles scripts)
|
||||
3. `~/.local/share/bob/nvim-bin` (Neovim)
|
||||
4. `~/.local/share/cargo/bin` (Rust tools like fd, rg)
|
||||
5. `/opt/homebrew/bin` (Homebrew packages)
|
||||
6. `/usr/local/bin` (system packages)
|
||||
|
||||
## Shell Compatibility
|
||||
|
||||
The dotfiles support multiple shells through `config/shared.sh`:
|
||||
|
||||
- Functions prefixed with `x-` work across bash, zsh, and fish
|
||||
- Path management handled automatically per shell
|
||||
- Environment variables set appropriately per shell
|
||||
114
.serena/memories/immediate_action_items.md
Normal file
114
.serena/memories/immediate_action_items.md
Normal file
@@ -0,0 +1,114 @@
|
||||
# Immediate Action Items - Priority Order
|
||||
|
||||
## HIGH PRIORITY (Must Fix Before Any Development)
|
||||
|
||||
### 1. Fix Memory File Formatting (BLOCKING)
|
||||
|
||||
```bash
|
||||
# These files prevent any linting from passing:
|
||||
- .serena/memories/code_style_conventions.md
|
||||
- .serena/memories/darwin_system_utilities.md
|
||||
- .serena/memories/project_overview.md
|
||||
- .serena/memories/project_structure.md
|
||||
- .serena/memories/suggested_commands.md
|
||||
- .serena/memories/task_completion_checklist.md
|
||||
|
||||
# Issues: Missing final newlines, markdown formatting, line length
|
||||
# Impact: Blocks all linting commands
|
||||
```
|
||||
|
||||
### 2. Fix Fish Shell Line Length Violations (BLOCKING)
|
||||
|
||||
```bash
|
||||
# Files exceeding 80-char limit:
|
||||
config/fish/alias.fish (4 violations)
|
||||
config/fish/exports.fish (15 violations)
|
||||
|
||||
# These are CRITICAL - Fish config has strict limits
|
||||
# Must be fixed before any fish-related changes
|
||||
```
|
||||
|
||||
### 3. Fix Git Configuration Indentation (BLOCKING)
|
||||
|
||||
```bash
|
||||
# Files with tab/space mixing:
|
||||
config/git/shared (40+ violations)
|
||||
hosts/s/config/git/overrides/config
|
||||
hosts/s/config/git/local.d/work-git
|
||||
|
||||
# Impact: Git configuration may not work correctly
|
||||
```
|
||||
|
||||
## MEDIUM PRIORITY (Fix During Next Development Cycle)
|
||||
|
||||
### 4. Prettier Formatting Issues
|
||||
|
||||
```bash
|
||||
# 17 files need prettier formatting:
|
||||
yarn fix:prettier
|
||||
# Most are JSON/YAML configuration files
|
||||
```
|
||||
|
||||
### 5. WezTerm Color Scheme Indentation
|
||||
|
||||
```bash
|
||||
# All files in config/wezterm/colors/ using tabs instead of spaces
|
||||
# Affects terminal appearance configuration
|
||||
```
|
||||
|
||||
### 6. Update Linting Configuration
|
||||
|
||||
```bash
|
||||
# Add shellcheck exclusions for submodules:
|
||||
# - tools/antidote/
|
||||
# - config/tmux/plugins/
|
||||
# - config/vim/extra/fzf/
|
||||
# - config/cheat/cheatsheets/tldr/
|
||||
```
|
||||
|
||||
## LOW PRIORITY (Future Improvements)
|
||||
|
||||
### 7. Test Infrastructure
|
||||
|
||||
```bash
|
||||
# Fix bats test PATH issues
|
||||
# Tests pass but show rm command not found errors
|
||||
```
|
||||
|
||||
### 8. Documentation Updates
|
||||
|
||||
```bash
|
||||
# Add troubleshooting section to AGENTS.md
|
||||
# Create shellcheck exclusion documentation
|
||||
```
|
||||
|
||||
## Immediate Commands to Run
|
||||
|
||||
### Step 1: Auto-fix What's Possible
|
||||
|
||||
```bash
|
||||
yarn fix:prettier # Fix 17 files
|
||||
yarn fix:markdown # Attempt markdown fixes
|
||||
```
|
||||
|
||||
### Step 2: Manual Fixes Required
|
||||
|
||||
- Add final newlines to all memory files
|
||||
- Wrap long lines in Fish configuration files
|
||||
- Convert tabs to spaces in Git configuration files
|
||||
|
||||
### Step 3: Verify Progress
|
||||
|
||||
```bash
|
||||
yarn lint:ec # Check EditorConfig compliance
|
||||
yarn lint:markdown # Check markdown issues
|
||||
yarn lint:prettier # Check remaining prettier issues
|
||||
```
|
||||
|
||||
## Success Criteria
|
||||
|
||||
✅ `yarn lint` passes without errors
|
||||
✅ All EditorConfig violations resolved
|
||||
✅ Memory files properly formatted
|
||||
✅ Fish configuration under line limits
|
||||
✅ Git configuration uses consistent indentation
|
||||
60
.serena/memories/project_overview.md
Normal file
60
.serena/memories/project_overview.md
Normal file
@@ -0,0 +1,60 @@
|
||||
# .dotfiles Project Overview
|
||||
|
||||
## Purpose
|
||||
|
||||
This is a comprehensive personal dotfiles repository for managing development
|
||||
environment configurations across macOS systems. The project uses **Dotbot** as
|
||||
the primary installation framework to manage symlinks and setup configurations.
|
||||
|
||||
## Key Features
|
||||
|
||||
- Automated configuration management using Dotbot
|
||||
- Support for multiple development tools and applications
|
||||
- Host-specific configurations in `/hosts/` directory
|
||||
- Comprehensive testing and linting setup with pre-commit hooks
|
||||
- Cross-shell compatibility (bash, zsh, fish)
|
||||
- Large collection of custom utility scripts in `local/bin/`
|
||||
- Git submodules for external tools (dotbot, antidote, tmux plugins)
|
||||
- Environment-specific configurations (secrets management)
|
||||
|
||||
## Recent Notable Changes (from git status)
|
||||
|
||||
- New everforest color theme configurations added
|
||||
- Multiple temporary fish configuration files present
|
||||
- Updates to various configuration files (.commitlintrc.json, .eslintrc.json, etc.)
|
||||
- New x-pr-comments script and documentation added
|
||||
- Various tmux plugin updates
|
||||
- Husky configuration relocated from base/ to config/husky/
|
||||
|
||||
## Tech Stack
|
||||
|
||||
- **Shell**: Bash (primary), with Fish and Zsh support
|
||||
- **Configuration Manager**: Dotbot with plugins (asdf, brew, include, pip)
|
||||
- **Package Manager**: Yarn 1.22.22 (Node.js), Homebrew (macOS), pipx (Python)
|
||||
- **Testing**: Bats test framework, custom test-all.sh script
|
||||
- **Linting**: MegaLinter, Prettier, ESLint, Markdownlint, ShellCheck, EditorConfig
|
||||
- **Automation**: Pre-commit hooks, GitHub Actions, Renovate
|
||||
|
||||
## Project Structure Highlights
|
||||
|
||||
- `/config/` - Main configuration directory (74+ subdirectories)
|
||||
- `/local/bin/` - Custom utility scripts (100+ scripts with documentation)
|
||||
- `/hosts/` - Host-specific configurations
|
||||
- `/tools/` - Git submodules for external tools
|
||||
- `/base/` - Base configuration files
|
||||
- `/secrets/` - Secret management configurations
|
||||
- `/scripts/` - Installation and setup scripts
|
||||
- `/.github/` - GitHub Actions workflows and configurations
|
||||
|
||||
## Target System
|
||||
|
||||
- **Platform**: Darwin (macOS) - Version 24.6.0
|
||||
- **Architecture**: Universal (Intel/Apple Silicon via Homebrew)
|
||||
- **Dependencies**: Git, Homebrew, Yarn, various CLI tools managed via mise
|
||||
|
||||
## Development Environment
|
||||
|
||||
- Node.js, Go, Python, Ruby, Rust managed via mise
|
||||
- Version files (.nvmrc, .go-version, .python-version) consumed by mise via idiomatic_version_file
|
||||
- Package management via Yarn with lockfile
|
||||
- TypeScript support for configuration files
|
||||
116
.serena/memories/project_structure.md
Normal file
116
.serena/memories/project_structure.md
Normal file
@@ -0,0 +1,116 @@
|
||||
# Project Structure
|
||||
|
||||
## Root Directory
|
||||
|
||||
```text
|
||||
.dotfiles/
|
||||
├── install # Main installation script (Dotbot runner)
|
||||
├── install.conf.yaml # Dotbot configuration
|
||||
├── package.json # Node.js dependencies for linting/testing (Yarn managed)
|
||||
├── AGENTS.md # Project documentation and guidelines
|
||||
├── test-all.sh # Bats test runner
|
||||
├── add-submodules.sh # Git submodule management
|
||||
└── .serena/ # Claude Code/Serena analysis cache (new)
|
||||
```
|
||||
|
||||
## Main Directories
|
||||
|
||||
### `config/` (74+ subdirectories)
|
||||
|
||||
Configuration files for development tools and applications:
|
||||
|
||||
- `git/` - Git configuration with delta integration and everforest theme
|
||||
- `nvim/` - Neovim configuration with Lua plugins
|
||||
- `tmux/` - Tmux configuration with multiple plugins (dark-notify, window-name, etc.)
|
||||
- `fish/` - Fish shell configuration with completions and functions
|
||||
- `zsh/` - Zsh configuration with antidote plugin manager
|
||||
- `fzf/` - Fuzzy finder configuration with everforest theme
|
||||
- `wezterm/` - WezTerm terminal configuration
|
||||
- `homebrew/` - Homebrew environment configuration
|
||||
- `starship.toml` - Starship prompt configuration
|
||||
- `shared.sh` - Cross-shell compatibility functions
|
||||
- `aerospace/`, `amethyst/`, `yabai/`, `skhd/` - Window managers
|
||||
- `direnv/`, `mise/`, `aqua/` - Development environment tools
|
||||
- `gpg-tui/`, `op/`, `gh/` - Security and CLI tools
|
||||
- Theme configurations: everforest color schemes across multiple tools
|
||||
|
||||
### `base/`
|
||||
|
||||
Dotfiles that get symlinked to home directory with `.` prefix:
|
||||
|
||||
- Contains traditional dotfiles like `.bashrc`, `.zshrc`, etc.
|
||||
- `plan` - Planning/note-taking configuration
|
||||
- `shellcheckrc` - ShellCheck rules
|
||||
|
||||
### `local/`
|
||||
|
||||
- `bin/` - 100+ custom scripts with comprehensive documentation
|
||||
- Homegrown utilities (dfm, git tools, backup scripts, etc.)
|
||||
- Sourced utilities (from skx/sysadmin-util, mvdan/dotfiles)
|
||||
- Each script has corresponding .md documentation
|
||||
- Recent additions: x-pr-comments for GitHub PR analysis
|
||||
- `share/fonts/` - JetBrains Mono font files
|
||||
- `man/` - Manual pages
|
||||
|
||||
### `ssh/`
|
||||
|
||||
SSH configuration files (mode 0600/0700)
|
||||
|
||||
- `shared.d/` - Shared SSH configurations for specific hosts
|
||||
|
||||
### `tools/` (Git submodules)
|
||||
|
||||
External tools and Dotbot plugins:
|
||||
|
||||
- `dotbot/` - Dotbot installation framework
|
||||
- `dotbot-*` - Dotbot plugins (asdf, brew, include, pip)
|
||||
- `antidote/` - Zsh plugin manager
|
||||
- Various tmux plugins (continuum, resurrect, yank, etc.)
|
||||
|
||||
### `hosts/`
|
||||
|
||||
Host-specific configurations:
|
||||
|
||||
- `air/`, `s/`, `v/` - Individual host configurations
|
||||
- Applied after main configuration
|
||||
|
||||
### `secrets/`
|
||||
|
||||
Secret and credential management configuration
|
||||
|
||||
### `scripts/`
|
||||
|
||||
Installation and setup automation scripts
|
||||
|
||||
### `.github/`
|
||||
|
||||
- GitHub Actions workflows
|
||||
- Renovate configuration
|
||||
- Issue templates and documentation
|
||||
|
||||
### Development Configuration Files
|
||||
|
||||
- `.editorconfig` - Editor configuration rules
|
||||
- `.prettierrc.js` - Prettier formatting rules
|
||||
- `.eslintrc.json` - ESLint linting rules
|
||||
- `.commitlintrc.json` - Commit message linting
|
||||
- `.shellcheckrc` - ShellCheck configuration
|
||||
- `.mega-linter.yml` - MegaLinter configuration
|
||||
- `.luarc.json` - Lua language server configuration
|
||||
- `.nvmrc`, `.go-version`, `.python-version` - Version files (consumed by mise)
|
||||
- Various ignore files (.gitignore, .prettierignore, .yamlignore, etc.)
|
||||
|
||||
## Testing Infrastructure
|
||||
|
||||
- `tests/` - Bats test files
|
||||
- `test-all.sh` - Main test runner
|
||||
- Pre-commit hooks for automated testing
|
||||
- GitHub Actions for CI/CD
|
||||
|
||||
## Recent Structural Changes
|
||||
|
||||
- Husky configuration moved from `base/huskyrc` to `config/husky/init.sh`
|
||||
- Addition of everforest theme configurations across multiple tools
|
||||
- New .serena directory for AI analysis caching
|
||||
- Multiple temporary fish configuration files (everforest themes)
|
||||
- Enhanced git configuration with delta and everforest theming
|
||||
62
.serena/memories/shellcheck_issues.md
Normal file
62
.serena/memories/shellcheck_issues.md
Normal file
@@ -0,0 +1,62 @@
|
||||
# ShellCheck Issues Analysis
|
||||
|
||||
## Critical Shell Script Problems
|
||||
|
||||
### Missing Shebangs (SC2148)
|
||||
|
||||
Multiple shell scripts missing proper shebang lines:
|
||||
|
||||
- `tools/antidote/tests/` - Test scripts
|
||||
- `config/vim/*/test/lib/common.sh` - FZF test libraries
|
||||
- `config/tmux/plugins/*/scripts/helpers.sh` - Plugin helper scripts
|
||||
- Various submodule scripts
|
||||
|
||||
### Syntax Errors (SC1036, SC1088, SC1073)
|
||||
|
||||
- `config/vim/fzf/test/lib/common.sh` - Invalid ERB template syntax
|
||||
- `config/cheat/cheatsheets/tldr/` - Markdown files incorrectly parsed as shell
|
||||
- `tmux-sessionist/scripts/list_sessions.sh` - Brace parsing errors
|
||||
|
||||
### Variable Assignment Issues (SC1007, SC2155)
|
||||
|
||||
- `config/vim/extra/fzf/test/lib/common.sh` - Incorrect empty variable assignments
|
||||
- Multiple tmux plugin scripts - Declare and assign should be separate
|
||||
|
||||
### Quoting Problems (SC2086, SC2006)
|
||||
|
||||
- Unquoted variable expansions in tmux plugin scripts
|
||||
- Legacy backtick usage instead of $(...) syntax
|
||||
- Missing quotes around variable expansions
|
||||
|
||||
## Third-Party Code Issues
|
||||
|
||||
### Submodule Problems
|
||||
|
||||
Most shellcheck errors are in **third-party submodules**:
|
||||
|
||||
- `tools/antidote/` - Zsh plugin manager
|
||||
- `config/tmux/plugins/` - Tmux plugins
|
||||
- `config/vim/extra/fzf/` - FZF integration
|
||||
- `config/cheat/cheatsheets/tldr/` - Cheat sheet collection
|
||||
|
||||
### Recommendation
|
||||
|
||||
- These should be **excluded from shellcheck** via configuration
|
||||
- Focus linting only on **project-owned scripts**
|
||||
- Add shellcheck ignore patterns for submodule directories
|
||||
|
||||
## Project-Owned Script Issues
|
||||
|
||||
### Main Scripts Status
|
||||
|
||||
- `install` - ✅ Clean (no shellcheck errors)
|
||||
- `test-all.sh` - ✅ Clean
|
||||
- `add-submodules.sh` - ✅ Clean
|
||||
- `config/shared.sh` - ✅ Clean
|
||||
- Scripts in `local/bin/` - ✅ Mostly clean
|
||||
|
||||
### Minor Issues Found
|
||||
|
||||
- Some scripts could benefit from stricter quoting
|
||||
- Consistent shebang usage across all scripts
|
||||
- Consider adding `set -euo pipefail` to more scripts
|
||||
122
.serena/memories/suggested_commands.md
Normal file
122
.serena/memories/suggested_commands.md
Normal file
@@ -0,0 +1,122 @@
|
||||
# Essential Commands for .dotfiles Development
|
||||
|
||||
## Installation & Setup
|
||||
|
||||
```bash
|
||||
# Initial setup - install linting tools and dependencies
|
||||
yarn install
|
||||
|
||||
# Install/update all dotfiles configurations
|
||||
./install
|
||||
|
||||
# Update git submodules (multiple approaches)
|
||||
git submodule update --remote --merge
|
||||
git submodule update --init --recursive --force
|
||||
bash add-submodules.sh
|
||||
```
|
||||
|
||||
## Development Commands
|
||||
|
||||
```bash
|
||||
# Linting (run all linters - ALWAYS fix all issues)
|
||||
yarn lint
|
||||
|
||||
# Individual linting commands
|
||||
yarn lint:markdown # Markdownlint
|
||||
yarn lint:prettier # Prettier check
|
||||
yarn lint:ec # EditorConfig checker
|
||||
|
||||
# Auto-fixing (use these BEFORE manual linting)
|
||||
yarn fix # Fix all format issues
|
||||
yarn fix:markdown # Fix markdown formatting
|
||||
yarn fix:prettier # Fix prettier formatting
|
||||
|
||||
# Testing
|
||||
yarn test # Run all Bats tests
|
||||
bash test-all.sh # Alternative test runner
|
||||
```
|
||||
|
||||
## Pre-commit Hooks (Comprehensive)
|
||||
|
||||
Current pre-commit configuration includes:
|
||||
|
||||
- **Security**: detect-aws-credentials, detect-private-key
|
||||
- **File integrity**: check-case-conflict, check-merge-conflict, check-symlinks
|
||||
- **Shell scripts**: shellcheck, shfmt (formatting)
|
||||
- **YAML/JSON**: yamllint, check-yaml, check-toml, pretty-format-json
|
||||
- **Markdown**: markdownlint with auto-fix
|
||||
- **Lua**: stylua formatting for Neovim configs
|
||||
- **Fish**: fish_syntax, fish_indent for shell configs
|
||||
- **GitHub Actions**: actionlint validation
|
||||
- **Renovate**: renovate-config-validator
|
||||
- **General**: trailing-whitespace, end-of-file-fixer, mixed-line-ending
|
||||
|
||||
```bash
|
||||
# Run pre-commit manually
|
||||
pre-commit run --all-files
|
||||
```
|
||||
|
||||
## Version Management
|
||||
|
||||
```bash
|
||||
# Check current versions (all managed by mise)
|
||||
node --version # mise (.nvmrc via idiomatic_version_file)
|
||||
go version # mise (.go-version)
|
||||
python --version # mise (.python-version)
|
||||
mise ls # List all installed tool versions
|
||||
```
|
||||
|
||||
## System Utilities (Darwin-specific)
|
||||
|
||||
```bash
|
||||
# Modern CLI tools available
|
||||
ls # aliased to eza with icons and git info
|
||||
grep # aliased to grep --color
|
||||
fd pattern # modern find alternative
|
||||
rg pattern # ripgrep for text search
|
||||
bat file # modern cat with syntax highlighting
|
||||
```
|
||||
|
||||
## Project-specific Scripts (100+ available)
|
||||
|
||||
```bash
|
||||
# Dotfiles management
|
||||
bash local/bin/dfm install all
|
||||
|
||||
# Git utilities
|
||||
git-dirty # Check for dirty git repositories
|
||||
git-fsck-dirs # Run fsck on git directories
|
||||
git-update-dirs # Update multiple git directories
|
||||
|
||||
# Development utilities
|
||||
x-pr-comments <pr> # Analyze GitHub PR comments (NEW)
|
||||
x-set-php-aliases # Generate PHP version aliases
|
||||
x-env-list # List environment variables
|
||||
x-open-ports # Check open network ports
|
||||
|
||||
# Backup utilities
|
||||
x-backup-folder # Backup directories
|
||||
x-backup-mysql-with-prefix # MySQL backup with prefix
|
||||
```
|
||||
|
||||
## Configuration Management
|
||||
|
||||
```bash
|
||||
# Load shell configurations
|
||||
source config/shared.sh # Cross-shell compatibility functions
|
||||
source x-set-php-aliases # PHP version management
|
||||
|
||||
# Host-specific configurations
|
||||
# Automatically applied: hosts/{hostname}/
|
||||
```
|
||||
|
||||
## Quality Assurance (CRITICAL)
|
||||
|
||||
**All linting errors are BLOCKING and must be fixed:**
|
||||
|
||||
- EditorConfig violations are considered blocking errors
|
||||
- ShellCheck warnings must be addressed
|
||||
- Prettier formatting must be consistent
|
||||
- Markdownlint rules must be followed
|
||||
- NEVER use --no-verify with git operations
|
||||
- ALWAYS run autofixers before manual intervention
|
||||
115
.serena/memories/task_completion_checklist.md
Normal file
115
.serena/memories/task_completion_checklist.md
Normal file
@@ -0,0 +1,115 @@
|
||||
# Task Completion Checklist
|
||||
|
||||
When completing any development task in this dotfiles repository, follow this
|
||||
checklist to ensure compliance with project standards.
|
||||
|
||||
## Required Steps (BLOCKING)
|
||||
|
||||
### 1. Code Quality Checks
|
||||
|
||||
```bash
|
||||
# Run all linting tools - MUST PASS with zero errors
|
||||
yarn lint
|
||||
|
||||
# Individual checks if needed:
|
||||
yarn lint:markdown # Markdownlint validation
|
||||
yarn lint:prettier # Prettier formatting check
|
||||
yarn lint:ec # EditorConfig compliance verification
|
||||
```
|
||||
|
||||
### 2. Shell Script Validation (if applicable)
|
||||
|
||||
```bash
|
||||
# All shell scripts must pass shellcheck without warnings
|
||||
find . -path ./node_modules -prune -o -name '*.sh' -print0 | xargs -0 shellcheck
|
||||
|
||||
# For individual scripts:
|
||||
shellcheck path/to/script.sh
|
||||
```
|
||||
|
||||
### 3. Testing Infrastructure
|
||||
|
||||
```bash
|
||||
# Run all tests - MUST PASS completely
|
||||
yarn test
|
||||
# OR alternative runner
|
||||
bash test-all.sh
|
||||
|
||||
# For specific test categories:
|
||||
# Bats tests in tests/ directory
|
||||
# Individual script functionality tests
|
||||
```
|
||||
|
||||
### 4. EditorConfig Compliance (CRITICAL)
|
||||
|
||||
- **BLOCKING REQUIREMENT**: EditorConfig violations prevent completion
|
||||
- All code must follow `.editorconfig` rules exactly:
|
||||
- UTF-8 charset
|
||||
- LF line endings
|
||||
- Final newline required
|
||||
- Trailing whitespace removal
|
||||
- Language-specific indentation (2-space default, 4-space for Fish)
|
||||
- Use autofixers before attempting manual fixes
|
||||
- Never modify linting configuration to bypass errors
|
||||
|
||||
## Auto-fixing Protocol
|
||||
|
||||
```bash
|
||||
# ALWAYS run auto-fixers first, in this order:
|
||||
yarn fix # Fix all auto-fixable issues
|
||||
yarn fix:markdown # Fix markdown formatting violations
|
||||
yarn fix:prettier # Fix code formatting issues
|
||||
|
||||
# Verify fixes applied correctly:
|
||||
yarn lint # Should show reduced error count
|
||||
```
|
||||
|
||||
## Pre-commit Hook Integration
|
||||
|
||||
Current pre-commit configuration enforces:
|
||||
|
||||
- Security checks (credentials, private keys)
|
||||
- Shell script validation (shellcheck, shfmt)
|
||||
- Markdown formatting (markdownlint with auto-fix)
|
||||
- YAML/JSON validation and formatting
|
||||
- Lua formatting (stylua for Neovim configs)
|
||||
- Fish shell syntax validation
|
||||
- GitHub Actions validation (actionlint)
|
||||
- Renovate configuration validation
|
||||
|
||||
## Memory File Maintenance
|
||||
|
||||
When updating memory files:
|
||||
|
||||
1. Follow markdown best practices (blank lines around headings/lists)
|
||||
2. Specify language for fenced code blocks
|
||||
3. Ensure final newline exists
|
||||
4. Respect line length limits (120 chars for markdown)
|
||||
5. Use proper heading hierarchy
|
||||
|
||||
## Critical Success Criteria
|
||||
|
||||
✅ **REQUIRED FOR TASK COMPLETION:**
|
||||
|
||||
- `yarn lint` exits with code 0 (no errors)
|
||||
- `yarn test` passes all test suites
|
||||
- EditorConfig compliance verified
|
||||
- No trailing whitespace or missing final newlines
|
||||
- Shell scripts have proper shebangs and pass shellcheck
|
||||
- All temporary/cache files cleaned up
|
||||
|
||||
❌ **BLOCKING ISSUES:**
|
||||
|
||||
- Any linting errors or warnings
|
||||
- EditorConfig violations of any kind
|
||||
- Test failures or incomplete test coverage
|
||||
- Use of `--no-verify` flag with git operations
|
||||
- Modified linting configurations to bypass errors
|
||||
|
||||
## Quality Assurance Notes
|
||||
|
||||
- **Use `which command`** to get full paths in scripts
|
||||
- **Prefer modern tools**: `rg` over `grep`, `fd` over `find`, `bat` over `cat`
|
||||
- **Test cross-shell compatibility**: bash, zsh, fish
|
||||
- **Validate host-specific configurations** don't break general setup
|
||||
- **Document any new utilities** in `local/bin/README.md`
|
||||
160
.serena/project.yml
Normal file
160
.serena/project.yml
Normal file
@@ -0,0 +1,160 @@
|
||||
---
|
||||
# whether to use the project's gitignore file to ignore files
|
||||
# Added on 2025-04-07
|
||||
ignore_all_files_in_gitignore: true
|
||||
# list of additional paths to ignore
|
||||
# same syntax as gitignore, so you can use * and **
|
||||
# Was previously called `ignored_dirs`, please update your config if you are using that.
|
||||
# Added (renamed) on 2025-04-07
|
||||
ignored_paths:
|
||||
- "*.swp"
|
||||
- "*.tmp"
|
||||
- "*.tmp.*"
|
||||
- ".DS_Store"
|
||||
- ".git/**"
|
||||
- /config/cheat/cheatsheets/community/**
|
||||
- /config/cheat/cheatsheets/pure-bash-bible/**
|
||||
- /config/cheat/cheatsheets/tldr/**
|
||||
- /config/fish/cheatsheets/community/**
|
||||
- /config/fzf/**
|
||||
- /config/nvim/snippets/**
|
||||
- /config/nvim/spell/**
|
||||
- /config/op/plugins/**
|
||||
- /config/tmux/plugins/**
|
||||
- /config/vim/extra/**
|
||||
- /config/zsh/completions/**
|
||||
- /config/zsh/plugins/**
|
||||
- /local/man/fzf
|
||||
- /local/share/fonts
|
||||
- /tools/antidote
|
||||
- /tools/dotbot
|
||||
- /tools/dotbot-*/**
|
||||
- node_modules/**
|
||||
|
||||
# whether the project is in read-only mode
|
||||
# If set to true, all editing tools will be disabled and attempts to use them will result in an error
|
||||
# Added on 2025-04-18
|
||||
read_only: false
|
||||
|
||||
# list of tool names to exclude. We recommend not excluding any tools, see the readme for more details.
|
||||
# Below is the complete list of tools for convenience.
|
||||
# To make sure you have the latest list of tools, and to view their descriptions,
|
||||
# execute `uv run scripts/print_tool_overview.py`.
|
||||
#
|
||||
# * `activate_project`: Activates a project by name.
|
||||
# * `check_onboarding_performed`: Checks whether project onboarding was already performed.
|
||||
# * `create_text_file`: Creates/overwrites a file in the project directory.
|
||||
# * `delete_lines`: Deletes a range of lines within a file.
|
||||
# * `delete_memory`: Deletes a memory from Serena's project-specific memory store.
|
||||
# * `execute_shell_command`: Executes a shell command.
|
||||
# * `find_referencing_code_snippets`: Finds code snippets in which the symbol at the given location is referenced.
|
||||
# * `find_referencing_symbols`: Finds symbols that reference the symbol at the given location (optionally filtered by type).
|
||||
# * `find_symbol`: Performs a global (or local) search for symbols with/containing a given name/substring (optionally filtered by type).
|
||||
# * `get_current_config`: Prints the current configuration of the agent, including the active and available projects, tools, contexts, and modes.
|
||||
# * `get_symbols_overview`: Gets an overview of the top-level symbols defined in a given file.
|
||||
# * `initial_instructions`: Gets the initial instructions for the current project.
|
||||
# Should only be used in settings where the system prompt cannot be set,
|
||||
# e.g. in clients you have no control over, like Claude Desktop.
|
||||
# * `insert_after_symbol`: Inserts content after the end of the definition of a given symbol.
|
||||
# * `insert_at_line`: Inserts content at a given line in a file.
|
||||
# * `insert_before_symbol`: Inserts content before the beginning of the definition of a given symbol.
|
||||
# * `list_dir`: Lists files and directories in the given directory (optionally with recursion).
|
||||
# * `list_memories`: Lists memories in Serena's project-specific memory store.
|
||||
# * `onboarding`: Performs onboarding (identifying the project structure and essential tasks, e.g. for testing or building).
|
||||
# * `prepare_for_new_conversation`: Provides instructions for preparing for a new conversation (in order to continue with the necessary context).
|
||||
# * `read_file`: Reads a file within the project directory.
|
||||
# * `read_memory`: Reads the memory with the given name from Serena's project-specific memory store.
|
||||
# * `remove_project`: Removes a project from the Serena configuration.
|
||||
# * `replace_lines`: Replaces a range of lines within a file with new content.
|
||||
# * `replace_symbol_body`: Replaces the full definition of a symbol.
|
||||
# * `restart_language_server`: Restarts the language server, may be necessary when edits not through Serena happen.
|
||||
# * `search_for_pattern`: Performs a search for a pattern in the project.
|
||||
# * `summarize_changes`: Provides instructions for summarizing the changes made to the codebase.
|
||||
# * `switch_modes`: Activates modes by providing a list of their names
|
||||
# * `think_about_collected_information`: Thinking tool for pondering the completeness of collected information.
|
||||
# * `think_about_task_adherence`: Thinking tool for determining whether the agent is still on track with the current task.
|
||||
# * `think_about_whether_you_are_done`: Thinking tool for determining whether the task is truly completed.
|
||||
# * `write_memory`: Writes a named memory (for future reference) to Serena's project-specific memory store.
|
||||
excluded_tools: []
|
||||
|
||||
# initial prompt for the project. It will always be given to the LLM upon activating the project
|
||||
# (contrary to the memories, which are loaded on demand).
|
||||
initial_prompt: ""
|
||||
# the name by which the project can be referenced within Serena
|
||||
project_name: ".dotfiles"
|
||||
|
||||
# list of tools to include that would otherwise be disabled (particularly optional tools that are disabled by default).
|
||||
# This extends the existing inclusions (e.g. from the global configuration).
|
||||
included_optional_tools: []
|
||||
|
||||
# fixed set of tools to use as the base tool set (if non-empty), replacing Serena's default set of tools.
|
||||
# This cannot be combined with non-empty excluded_tools or included_optional_tools.
|
||||
fixed_tools: []
|
||||
|
||||
# list of mode names to that are always to be included in the set of active modes
|
||||
# The full set of modes to be activated is base_modes + default_modes.
|
||||
# If the setting is undefined, the base_modes from the global configuration (serena_config.yml) apply.
|
||||
# Otherwise, this setting overrides the global configuration.
|
||||
# Set this to [] to disable base modes for this project.
|
||||
# Set this to a list of mode names to always include the respective modes for this project.
|
||||
base_modes:
|
||||
|
||||
# list of mode names that are to be activated by default.
|
||||
# The full set of modes to be activated is base_modes + default_modes.
|
||||
# If the setting is undefined, the default_modes from the global configuration (serena_config.yml) apply.
|
||||
# Otherwise, this overrides the setting from the global configuration (serena_config.yml).
|
||||
# This setting can, in turn, be overridden by CLI parameters (--mode).
|
||||
default_modes:
|
||||
|
||||
# time budget (seconds) per tool call for the retrieval of additional symbol information
|
||||
# such as docstrings or parameter information.
|
||||
# This overrides the corresponding setting in the global configuration; see the documentation there.
|
||||
# If null or missing, use the setting from the global configuration.
|
||||
symbol_info_budget:
|
||||
|
||||
# The language backend to use for this project.
|
||||
# If not set, the global setting from serena_config.yml is used.
|
||||
# Valid values: LSP, JetBrains
|
||||
# Note: the backend is fixed at startup. If a project with a different backend
|
||||
# is activated post-init, an error will be returned.
|
||||
language_backend:
|
||||
|
||||
# line ending convention to use when writing source files.
|
||||
# Possible values: unset (use global setting), "lf", "crlf", or "native" (platform default)
|
||||
# This does not affect Serena's own files (e.g. memories and configuration files), which always use native line endings.
|
||||
line_ending:
|
||||
|
||||
# list of regex patterns which, when matched, mark a memory entry as read‑only.
|
||||
# Extends the list from the global configuration, merging the two lists.
|
||||
read_only_memory_patterns: []
|
||||
|
||||
# the encoding used by text files in the project
|
||||
# For a list of possible encodings, see https://docs.python.org/3.11/library/codecs.html#standard-encodings
|
||||
encoding: utf-8
|
||||
|
||||
# list of languages for which language servers are started; choose from:
|
||||
# al bash clojure cpp csharp
|
||||
# csharp_omnisharp dart elixir elm erlang
|
||||
# fortran fsharp go groovy haskell
|
||||
# java julia kotlin lua markdown
|
||||
# matlab nix pascal perl php
|
||||
# php_phpactor powershell python python_jedi r
|
||||
# rego ruby ruby_solargraph rust scala
|
||||
# swift terraform toml typescript typescript_vts
|
||||
# vue yaml zig
|
||||
# (This list may be outdated. For the current list, see values of Language enum here:
|
||||
# https://github.com/oraios/serena/blob/main/src/solidlsp/ls_config.py
|
||||
# For some languages, there are alternative language servers, e.g. csharp_omnisharp, ruby_solargraph.)
|
||||
# Note:
|
||||
# - For C, use cpp
|
||||
# - For JavaScript, use typescript
|
||||
# - For Free Pascal/Lazarus, use pascal
|
||||
# Special requirements:
|
||||
# Some languages require additional setup/installations.
|
||||
# See here for details: https://oraios.github.io/serena/01-about/020_programming-languages.html#language-servers
|
||||
# When using multiple languages, the first language server that supports a given file will be used for that file.
|
||||
# The first language is the default language and the respective language server will be used as a fallback.
|
||||
# Note that when using the JetBrains backend, language servers are not used and this list is correspondingly ignored.
|
||||
languages:
|
||||
- bash
|
||||
- lua
|
||||
@@ -24,3 +24,7 @@ disable=SC1091
|
||||
# SC2174: When used with -p, -m only applies to the deepest directory.
|
||||
# https://github.com/koalaman/shellcheck/wiki/SC2174
|
||||
disable=SC2174
|
||||
|
||||
# SC2016: Expressions don't expand in single quotes, use double quotes for that.
|
||||
# https://www.shellcheck.net/wiki/SC2016
|
||||
disable=SC2016
|
||||
|
||||
5
.sonarlint/connectedMode.json
Normal file
5
.sonarlint/connectedMode.json
Normal file
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"sonarCloudOrganization": "ivuorinen",
|
||||
"projectKey": "ivuorinen_dotfiles",
|
||||
"region": "EU"
|
||||
}
|
||||
16
.yamlignore
Normal file
16
.yamlignore
Normal file
@@ -0,0 +1,16 @@
|
||||
# vim: ft=gitignore
|
||||
.mypy_cache/*
|
||||
Brewfile.lock.json
|
||||
config/cheat/cheatsheets/community
|
||||
config/cheat/cheatsheets/tldr
|
||||
config/fzf/*
|
||||
config/nvim/*
|
||||
config/op/plugins/used_plugins/*
|
||||
config/tmux/plugins/*
|
||||
config/vim/plugged/*
|
||||
config/zsh/*
|
||||
lazy-lock.json
|
||||
local/bin/antigen.zsh
|
||||
local/bin/asdf
|
||||
tools/antidote/*
|
||||
tools/dotbot*
|
||||
21
.yamllint.yml
Normal file
21
.yamllint.yml
Normal file
@@ -0,0 +1,21 @@
|
||||
---
|
||||
extends: default
|
||||
|
||||
ignore: |
|
||||
node_modules
|
||||
tools
|
||||
config/tmux/plugins
|
||||
|
||||
rules:
|
||||
empty-lines:
|
||||
level: warning
|
||||
max: 1
|
||||
line-length:
|
||||
max: 200
|
||||
level: warning
|
||||
truthy:
|
||||
check-keys: false
|
||||
comments:
|
||||
min-spaces-from-content: 1
|
||||
trailing-spaces:
|
||||
level: warning
|
||||
1
.yarnrc.yml
Normal file
1
.yarnrc.yml
Normal file
@@ -0,0 +1 @@
|
||||
nodeLinker: node-modules
|
||||
277
CLAUDE.md
Normal file
277
CLAUDE.md
Normal file
@@ -0,0 +1,277 @@
|
||||
# CLAUDE.md
|
||||
|
||||
This file provides guidance to Claude Code (claude.ai/code)
|
||||
when working with code in this repository.
|
||||
|
||||
## Repository Overview
|
||||
|
||||
Personal dotfiles repository for Ismo Vuorinen.
|
||||
Uses **Dotbot** (not GNU Stow) to symlink configuration files into place.
|
||||
The directory layout follows the XDG Base Directory Specification.
|
||||
|
||||
## Directory Layout and Linking
|
||||
|
||||
| Source | Destination | Notes |
|
||||
|---------------------|-------------------|-------------------------------------------|
|
||||
| `base/*` | `~/.*` | Home-level dotfiles (`.` added by Dotbot) |
|
||||
| `config/*` | `~/.config/` | Application configurations |
|
||||
| `local/bin/*` | `~/.local/bin/` | Helper scripts and utilities |
|
||||
| `local/share/*` | `~/.local/share/` | Data files |
|
||||
| `local/man/**` | `~/.local/man/` | Manual pages |
|
||||
| `ssh/*` | `~/.ssh/` | SSH configuration (mode 0600) |
|
||||
| `hosts/<hostname>/` | Overlays | Host-specific overrides |
|
||||
|
||||
Installation: `./install` runs Dotbot with `install.conf.yaml`,
|
||||
then applies `hosts/<hostname>/install.conf.yaml` if it exists.
|
||||
|
||||
## Commands
|
||||
|
||||
```bash
|
||||
# Install dependencies (required before lint/test)
|
||||
yarn install
|
||||
|
||||
# Linting
|
||||
yarn lint # Run biome + prettier + editorconfig-checker
|
||||
yarn lint:biome # Biome only
|
||||
yarn lint:ec # EditorConfig checker only
|
||||
yarn lint:md-table # Markdown table formatting check
|
||||
yarn fix:md-table # Auto-fix markdown tables
|
||||
|
||||
# Formatting
|
||||
yarn fix:biome # Autofix with biome (JS/TS/JSON/MD)
|
||||
yarn fix:prettier # Autofix with prettier (YAML)
|
||||
yarn format # Format with biome
|
||||
yarn format:yaml # Format YAML files with prettier
|
||||
|
||||
# Testing (Bats - Bash Automated Testing System)
|
||||
yarn test # Run all tests in tests/
|
||||
# Run a single test file:
|
||||
./node_modules/.bin/bats tests/dfm.bats
|
||||
|
||||
# Shell linting
|
||||
shellcheck <script> # Lint shell scripts
|
||||
|
||||
# Tooling maintenance
|
||||
npx @biomejs/biome migrate --write # Update biome schema version
|
||||
```
|
||||
|
||||
## Pre-commit Hooks
|
||||
|
||||
Configured in `.pre-commit-config.yaml`: shellcheck, shfmt, biome,
|
||||
yamllint, prettier, actionlint, stylua, fish_syntax/fish_indent, ruff.
|
||||
Run `pre-commit run --all-files` to check everything.
|
||||
|
||||
## Commit Convention
|
||||
|
||||
Semantic Commit messages: `type(scope): summary`
|
||||
(e.g., `fix(tmux): correct prefix binding`).
|
||||
Enforced by commitlint extending `@ivuorinen/commitlint-config`.
|
||||
|
||||
## Architecture
|
||||
|
||||
### Shell Configuration Chain
|
||||
|
||||
Both `base/bashrc` and `base/zshrc` source `config/shared.sh`,
|
||||
which loads:
|
||||
- `config/exports` — environment variables, XDG dirs, PATH
|
||||
- `config/alias` — shell aliases
|
||||
|
||||
Zsh additionally uses **antidote** (in `tools/antidote/`)
|
||||
for plugin management and **oh-my-posh** for the prompt.
|
||||
|
||||
### msgr — Messaging Helper
|
||||
|
||||
`local/bin/msgr` provides colored output functions (`msgr msg`,
|
||||
`msgr run`, `msgr yay`, `msgr err`, `msgr warn`). Sourced by `dfm`
|
||||
and most scripts in `local/bin/`.
|
||||
|
||||
### dfm — Dotfiles Manager
|
||||
|
||||
`local/bin/dfm` is the main management script. Key commands:
|
||||
- `dfm install all` — install everything in tiered stages
|
||||
- `dfm brew install` / `dfm brew update` — Homebrew management
|
||||
- `dfm apt upkeep` — APT package maintenance (Debian/Ubuntu)
|
||||
- `dfm dotfiles fmt` / `dfm dotfiles shfmt` — format configs/scripts
|
||||
- `dfm helpers <name>` — inspect aliases, colors, env, functions, path
|
||||
- `dfm docs all` — regenerate documentation under `docs/`
|
||||
- `dfm check arch` / `dfm check host` — system info
|
||||
- `dfm scripts` — run scripts from `scripts/` (discovered via `@description` tags)
|
||||
- `dfm tests` — test visualization helpers
|
||||
|
||||
### mise — Unified Tool Manager
|
||||
|
||||
`config/mise/config.toml` manages language runtimes (Node LTS, Python 3,
|
||||
Go latest, Rust stable) and CLI tools (fd, ripgrep, eza, neovim, delta,
|
||||
zoxide, etc.). Activated via `eval "$(mise activate bash)"` in
|
||||
`config/exports`. Run `mise install` after adding new tools.
|
||||
|
||||
### Submodules
|
||||
|
||||
External dependencies are git submodules (Dotbot, plugins,
|
||||
tmux plugins, cheatsheets, antidote).
|
||||
Managed by `add-submodules.sh`. All set to `ignore = dirty`.
|
||||
Updated automatically via GitHub Actions on a schedule.
|
||||
|
||||
### Host-specific Configs
|
||||
|
||||
Machine-specific overrides live in `hosts/<hostname>/`
|
||||
with their own `base/`, `config/`, and `install.conf.yaml`.
|
||||
These are layered on top of the global config during installation.
|
||||
|
||||
## Code Style
|
||||
|
||||
- **EditorConfig**: 2-space indent, UTF-8, LF line endings.
|
||||
See `.editorconfig` for per-filetype overrides
|
||||
(4-space for PHP/fish, tabs for git config).
|
||||
- **Shell scripts**: Must have a shebang or
|
||||
`# shellcheck shell=bash` directive.
|
||||
Follow shfmt settings in `.editorconfig`
|
||||
(2-space indent, `binary_next_line`,
|
||||
`switch_case_indent`, `space_redirects`, `function_next_line`).
|
||||
- **Lua** (neovim config): Formatted with stylua (`stylua.toml`),
|
||||
90-char line length.
|
||||
- **JSON/JS/TS/Markdown**: Formatted with Biome (`biome.json`),
|
||||
80-char width (Markdown uses 120-char override).
|
||||
- **YAML**: Formatted with Prettier (`.prettierrc.json`),
|
||||
validated with yamllint (`.yamllint.yml`).
|
||||
|
||||
## ShellCheck Disabled Rules
|
||||
|
||||
Defined in `.shellcheckrc`:
|
||||
SC2039 (POSIX `local`), SC2166 (`-o` in test),
|
||||
SC2154 (unassigned variables), SC1091 (source following),
|
||||
SC2174 (mkdir -p -m), SC2016 (single-quote expressions).
|
||||
|
||||
## Gotchas
|
||||
|
||||
- **POSIX scripts**: `x-ssh-audit`, `x-codeql`, `x-until-error`,
|
||||
`x-until-success`, `x-ssl-expiry-date` use `/bin/sh`.
|
||||
Validate with `sh -n`, not `bash -n`.
|
||||
- **Vendor file**: `local/bin/fzf-tmux` is vendored from
|
||||
junegunn/fzf — do not modify.
|
||||
- **Fish config**: `config/fish/` has its own config chain
|
||||
(`config.fish`, `exports.fish`, `alias.fish`) plus 60+ functions.
|
||||
- **gh CLI config**: `config/gh/hosts.yml` is managed by `gh` CLI
|
||||
and excluded from prettier (see `.prettierignore`).
|
||||
- **Python**: Two scripts (`x-compare-versions.py`,
|
||||
`x-git-largest-files.py`) linted by Ruff (config in `pyproject.toml`).
|
||||
- **Fish secrets**: `config/fish/secrets.d/*.fish` files are auto-sourced
|
||||
by `exports.fish`. Copy `github.fish.example` → `github.fish` for local
|
||||
secrets. These files are gitignored; only `*.example` and `README.md`
|
||||
are tracked.
|
||||
|
||||
## Claude Code Configuration
|
||||
|
||||
- **Hooks** (`.claude/settings.json`):
|
||||
- *PreToolUse*: Blocks edits to `fzf-tmux`, `yarn.lock`,
|
||||
`.yarn/`, submodule paths, and real secrets.d files
|
||||
- *PostToolUse*: Auto-formats files by extension
|
||||
(shfmt, fish_indent, stylua, biome, prettier)
|
||||
- *PostToolUse*: Validates Dotbot `install.conf.yaml`
|
||||
after edits
|
||||
- *PostToolUse*: Warns on formatter/linter config changes
|
||||
- *Stop*: Runs `yarn lint` gate before finishing
|
||||
- **Skills** (`.claude/skills/`):
|
||||
- `shell-validate`: Auto-validates shell scripts
|
||||
(syntax + shellcheck)
|
||||
- `fish-validate`: Auto-validates fish scripts
|
||||
(syntax + fish_indent)
|
||||
- `lua-format`: Auto-formats Lua files with stylua
|
||||
- `yaml-validate`: Auto-validates YAML files
|
||||
(yamllint + actionlint)
|
||||
- `dotbot-validate`: Validates Dotbot install.conf.yaml
|
||||
- `new-script`: Scaffolds helper scripts in local/bin/
|
||||
- `new-fish-function`: Scaffolds fish functions
|
||||
- `host-override`: Creates host-specific config overlays
|
||||
- **Subagents** (`.claude/agents/`):
|
||||
- `code-reviewer`: Reviews shell/fish/lua changes
|
||||
- **Plugins** (required):
|
||||
- `context-mode`: Context window protection — must be
|
||||
installed for this repo. See routing rules below.
|
||||
- `context7`: Live documentation lookup
|
||||
|
||||
## Package Manager
|
||||
|
||||
Yarn (v4+) is the package manager. Do not use npm.
|
||||
|
||||
# context-mode — MANDATORY routing rules
|
||||
|
||||
You have context-mode MCP tools available. These rules are NOT optional —
|
||||
they protect your context window from flooding. A single unrouted command
|
||||
can dump 56 KB into context and waste the entire session.
|
||||
|
||||
## BLOCKED commands — do NOT attempt these
|
||||
|
||||
### curl / wget — BLOCKED
|
||||
Any Bash command containing `curl` or `wget` is intercepted and replaced with an error message. Do NOT retry.
|
||||
Instead use:
|
||||
- `ctx_fetch_and_index(url, source)` to fetch and index web pages
|
||||
- `ctx_execute(language: "javascript", code: "const r = await fetch(...)")` to run HTTP calls in sandbox
|
||||
|
||||
### Inline HTTP — BLOCKED
|
||||
Any Bash command containing `fetch('http`, `requests.get(`,
|
||||
`requests.post(`, `http.get(`, or `http.request(` is intercepted
|
||||
and replaced with an error message. Do NOT retry with Bash.
|
||||
Instead use:
|
||||
- `ctx_execute(language, code)` to run HTTP calls in sandbox — only stdout enters context
|
||||
|
||||
### WebFetch — BLOCKED
|
||||
WebFetch calls are denied entirely. The URL is extracted and you are told to use `ctx_fetch_and_index` instead.
|
||||
Instead use:
|
||||
- `ctx_fetch_and_index(url, source)` then `ctx_search(queries)` to query the indexed content
|
||||
|
||||
## REDIRECTED tools — use sandbox equivalents
|
||||
|
||||
### Bash (>20 lines output)
|
||||
Bash is ONLY for: `git`, `mkdir`, `rm`, `mv`, `cd`, `ls`, `npm install`, `pip install`, and other short-output commands.
|
||||
For everything else, use:
|
||||
- `ctx_batch_execute(commands, queries)` — run multiple commands + search in ONE call
|
||||
- `ctx_execute(language: "shell", code: "...")` — run in sandbox, only stdout enters context
|
||||
|
||||
### Read (for analysis)
|
||||
If you are reading a file to **Edit** it → Read is correct (Edit needs content in context).
|
||||
If you are reading to **analyze, explore, or summarize** →
|
||||
use `ctx_execute_file(path, language, code)` instead. Only your
|
||||
printed summary enters context. The raw file stays in the sandbox.
|
||||
|
||||
### Grep (large results)
|
||||
Grep results can flood context.
|
||||
Use `ctx_execute(language: "shell", code: "grep ...")` to run
|
||||
searches in sandbox. Only your printed summary enters context.
|
||||
|
||||
## Tool selection hierarchy
|
||||
|
||||
1. **GATHER**: `ctx_batch_execute(commands, queries)` — Primary
|
||||
tool. Runs all commands, auto-indexes output, returns search
|
||||
results. ONE call replaces 30+ individual calls.
|
||||
2. **FOLLOW-UP**: `ctx_search(queries: ["q1", "q2", ...])` —
|
||||
Query indexed content. Pass ALL questions as array in ONE call.
|
||||
3. **PROCESSING**: `ctx_execute(language, code)` |
|
||||
`ctx_execute_file(path, language, code)` — Sandbox execution.
|
||||
Only stdout enters context.
|
||||
4. **WEB**: `ctx_fetch_and_index(url, source)` then
|
||||
`ctx_search(queries)` — Fetch, chunk, index, query.
|
||||
Raw HTML never enters context.
|
||||
5. **INDEX**: `ctx_index(content, source)` — Store content in FTS5 knowledge base for later search.
|
||||
|
||||
## Subagent routing
|
||||
|
||||
When spawning subagents (Agent/Task tool), the routing block is
|
||||
automatically injected into their prompt. Bash-type subagents are
|
||||
upgraded to general-purpose so they have access to MCP tools.
|
||||
You do NOT need to manually instruct subagents about context-mode.
|
||||
|
||||
## Output constraints
|
||||
|
||||
- Keep responses under 500 words.
|
||||
- Write artifacts (code, configs, PRDs) to FILES — never return
|
||||
them as inline text. Return only: file path + 1-line description.
|
||||
- When indexing content, use descriptive source labels so others can `ctx_search(source: "label")` later.
|
||||
|
||||
## ctx commands
|
||||
|
||||
| Command | Action |
|
||||
|---------------|---------------------------------------------------------------------------------------|
|
||||
| `ctx stats` | Call the `ctx_stats` MCP tool and display the full output verbatim |
|
||||
| `ctx doctor` | Call the `ctx_doctor` MCP tool, run the returned shell command, display as checklist |
|
||||
| `ctx upgrade` | Call the `ctx_upgrade` MCP tool, run the returned shell command, display as checklist |
|
||||
@@ -1,54 +1,111 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
git submodule sync --recursive
|
||||
|
||||
# dotbot and plugins
|
||||
git submodule add --name dotbot \
|
||||
-f https://github.com/anishathalye/dotbot.git tools/dotbot
|
||||
git submodule add --name dotbot-brew \
|
||||
-f https://github.com/wren/dotbot-brew.git tools/dotbot-brew
|
||||
git submodule add --name dotbot-include \
|
||||
-f https://gitlab.com/gnfzdz/dotbot-include.git tools/dotbot-include
|
||||
git submodule add --name dotbot-pip \
|
||||
-f https://github.com/sobolevn/dotbot-pip.git tools/dotbot-pip
|
||||
|
||||
git submodule add --name nvim-kickstart \
|
||||
-f https://github.com/ivuorinen/kickstart.nvim config/nvim-kickstart
|
||||
|
||||
# other repos
|
||||
git submodule add --name cheat-community \
|
||||
-f https://github.com/cheat/cheatsheets.git config/cheat/cheatsheets/community
|
||||
git submodule add --name cheat-tldr \
|
||||
-f https://github.com/ivuorinen/cheatsheet-tldr.git config/cheat/cheatsheets/tldr
|
||||
git submodule add --name antidote \
|
||||
--depth 1 \
|
||||
-f https://github.com/mattmc3/antidote.git tools/antidote
|
||||
|
||||
# tmux plugin manager and plugins
|
||||
git submodule add --name tmux/tmux-continuum \
|
||||
-f https://github.com/tmux-plugins/tmux-continuum config/tmux/plugins/tmux-continuum
|
||||
git submodule add --name tmux/tmux-mode-indicator \
|
||||
-f https://github.com/MunifTanjim/tmux-mode-indicator.git config/tmux/plugins/tmux-mode-indicator
|
||||
git submodule add --name tmux/tmux-resurrect \
|
||||
-f https://github.com/tmux-plugins/tmux-resurrect config/tmux/plugins/tmux-resurrect
|
||||
git submodule add --name tmux/tmux-sensible \
|
||||
-f https://github.com/tmux-plugins/tmux-sensible.git config/tmux/plugins/tmux-sensible
|
||||
-f https://github.com/tmux-plugins/tmux-resurrect.git config/tmux/plugins/tmux-resurrect
|
||||
git submodule add --name tmux/tmux-sessionist \
|
||||
-f https://github.com/tmux-plugins/tmux-sessionist.git config/tmux/plugins/tmux-sessionist
|
||||
git submodule add --name tmux/tmux-suspend \
|
||||
-f https://github.com/MunifTanjim/tmux-suspend.git config/tmux/plugins/tmux-suspend
|
||||
git submodule add --name tmux/tmux-window-name \
|
||||
-f https://github.com/ivuorinen/tmux-window-name.git config/tmux/plugins/tmux-window-name
|
||||
git submodule add --name tmux/tmux-yank \
|
||||
-f https://github.com/tmux-plugins/tmux-yank.git config/tmux/plugins/tmux-yank
|
||||
git submodule add --name tmux/tmux-current-pane-hostname \
|
||||
-f https://github.com/soyuka/tmux-current-pane-hostname.git config/tmux/plugins/tmux-current-pane-hostname
|
||||
git submodule add --name tmux/tmux-dark-notify \
|
||||
-f https://github.com/erikw/tmux-dark-notify.git config/tmux/plugins/tmux-dark-notify
|
||||
-f https://github.com/ivuorinen/tmux-dark-notify.git config/tmux/plugins/tmux-dark-notify
|
||||
git submodule add --name tmux/catppuccin \
|
||||
-f https://github.com/catppuccin/tmux.git config/tmux/plugins/catppuccin
|
||||
|
||||
# Takes submodules and sets them to ignore all changes
|
||||
for MODULE in $(git config --file .gitmodules --get-regexp path | awk '{ print $2 }'); do
|
||||
git config "submodule.${MODULE}.ignore" all
|
||||
echo "Ignoring submodule changes for submodule.${MODULE}..."
|
||||
git config "submodule.${MODULE}.ignore" "dirty"
|
||||
done
|
||||
|
||||
# remove old submodules
|
||||
[ -d "config/tmux/plugins/tpm" ] && rm -rf config/tmux/plugins/tpm
|
||||
[ -d "config/tmux/plugins/tmux" ] && rm -rf config/tmux/plugins/tmux
|
||||
[ -d "config/tmux/plugins/tmux-menus" ] && rm -rf config/tmux/plugins/tmux-menus
|
||||
[ -d "tools/dotbot-crontab" ] && rm -rf tools/dotbot-crontab
|
||||
[ -d "tools/dotbot-snap" ] && rm -rf tools/dotbot-snap
|
||||
# Mark certain repositories shallow
|
||||
git config -f .gitmodules submodule.antidote.shallow true
|
||||
|
||||
# Log a message using msgr if available, else echo
|
||||
_log()
|
||||
{
|
||||
local msg="$1"
|
||||
if command -v msgr > /dev/null 2>&1; then
|
||||
msgr run_done "$msg"
|
||||
else
|
||||
echo " [ok] $msg"
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
# Remove a stale git submodule and clean up references
|
||||
remove_old_submodule()
|
||||
{
|
||||
local name="$1" path="$2"
|
||||
|
||||
# Remove working tree
|
||||
if [[ -d "$path" ]]; then
|
||||
rm -rf "$path"
|
||||
_log "Removed $path"
|
||||
fi
|
||||
|
||||
# Remove stale git index entry
|
||||
git rm --cached "$path" 2> /dev/null || true
|
||||
|
||||
# Remove .git/config section keyed by path
|
||||
git config --remove-section "submodule.$path" 2> /dev/null || true
|
||||
|
||||
# Skip name-based cleanup if no submodule name provided
|
||||
[[ -z "$name" ]] && return 0
|
||||
|
||||
# Remove .git/config section keyed by name
|
||||
git config --remove-section "submodule.$name" 2> /dev/null || true
|
||||
|
||||
# Remove .git/modules/<name>/ cached repository
|
||||
if [[ -d ".git/modules/$name" ]]; then
|
||||
rm -rf ".git/modules/$name"
|
||||
_log "Removed .git/modules/$name"
|
||||
fi
|
||||
}
|
||||
|
||||
# remove old submodules (name:path pairs)
|
||||
old_submodules=(
|
||||
"tmux/tpm:config/tmux/plugins/tpm"
|
||||
":config/tmux/plugins/tmux"
|
||||
"tmux/tmux-menus:config/tmux/plugins/tmux-menus"
|
||||
"dotbot-crontab:tools/dotbot-crontab"
|
||||
"dotbot-snap:tools/dotbot-snap"
|
||||
"tmux/tmux-window-name:config/tmux/plugins/tmux-window-name"
|
||||
"tmux/tmux-sensible:config/tmux/plugins/tmux-sensible"
|
||||
"tmux/tmux-mode-indicator:config/tmux/plugins/tmux-mode-indicator"
|
||||
"tmux/tmux-yank:config/tmux/plugins/tmux-yank"
|
||||
":config/tmux/plugins/tmux-fzf-url"
|
||||
"nvim-kickstart:config/nvim-kickstart"
|
||||
"asdf:local/bin/asdf"
|
||||
"asdf:local/asdf"
|
||||
"dotbot-asdf:tools/dotbot-asdf"
|
||||
"dotbot-pip:tools/dotbot-pip"
|
||||
"dotbot-brew:tools/dotbot-brew"
|
||||
)
|
||||
|
||||
for entry in "${old_submodules[@]}"; do
|
||||
name="${entry%%:*}"
|
||||
path="${entry#*:}"
|
||||
remove_old_submodule "$name" "$path"
|
||||
done
|
||||
|
||||
36
base/bashrc
36
base/bashrc
@@ -1,44 +1,24 @@
|
||||
# this is my bashrc config. there are many like it, but this one is mine.
|
||||
# shellcheck shell=bash
|
||||
|
||||
# Defaults
|
||||
export DOTFILES="$HOME/.dotfiles"
|
||||
# Minimal PATH for x-have and utilities; full PATH set in shared.sh/exports
|
||||
export PATH="$HOME/.local/bin:$DOTFILES/local/bin:$PATH"
|
||||
export SHARED_SCRIPTS_SOURCED=0
|
||||
|
||||
# Explicitly set XDG folders
|
||||
# https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html
|
||||
export XDG_CONFIG_HOME="$HOME/.config"
|
||||
export XDG_DATA_HOME="$HOME/.local/share"
|
||||
export XDG_STATE_HOME="$HOME/.local/state"
|
||||
|
||||
# custom variables
|
||||
export XDG_BIN_HOME="$HOME/.local/bin"
|
||||
export XDG_CACHE_HOME="$HOME/.cache"
|
||||
export XDG_RUNTIME_DIR="$HOME/.local/run"
|
||||
|
||||
# Paths
|
||||
export PATH="$XDG_BIN_HOME:$DOTFILES/local/bin:$HOME/.local/go/bin:$XDG_DATA_HOME/cargo/bin:$PATH"
|
||||
|
||||
source "$DOTFILES/config/exports"
|
||||
source "$DOTFILES/config/functions"
|
||||
source "$DOTFILES/config/alias"
|
||||
x-load-configs
|
||||
source "$DOTFILES/config/shared.sh"
|
||||
|
||||
# shellcheck source=../config/fzf/fzf.bash
|
||||
[ -f "${DOTFILES}/config/fzf/fzf.bash" ] &&
|
||||
source "${DOTFILES}/config/fzf/fzf.bash"
|
||||
|
||||
# Import ssh keys in keychain
|
||||
# Import ssh keys in keychain (macOS-specific -A flag, silently fails on Linux)
|
||||
ssh-add -A 2>/dev/null
|
||||
|
||||
x-have antidot && {
|
||||
eval "$(antidot init)"
|
||||
}
|
||||
|
||||
x-have rbenv && {
|
||||
eval "$(rbenv init - bash)"
|
||||
}
|
||||
|
||||
# eval "$(starship init bash)"
|
||||
x-have oh-my-posh && {
|
||||
eval "$(oh-my-posh init bash --config $XDG_CONFIG_HOME/oh-my-posh.omp.json)"
|
||||
}
|
||||
PROMPT_DIRTRIM=3
|
||||
PROMPT_COMMAND='PS1_CMD1=$(git branch --show-current 2>/dev/null)'
|
||||
PS1='\[\e[95m\]\u\[\e[0m\]@\[\e[38;5;22;2m\]\h\[\e[0m\] \[\e[38;5;33m\]\w\[\e[0m\] \[\e[92;2m\]${PS1_CMD1}\n\[\e[39m\]➜\[\e[0m\] '
|
||||
|
||||
@@ -20,10 +20,20 @@
|
||||
"value": "Ismo Vuorinen"
|
||||
}
|
||||
],
|
||||
"masf": [
|
||||
{
|
||||
"key": "user.email",
|
||||
"value": "ismo@masf.fi"
|
||||
},
|
||||
{
|
||||
"key": "user.name",
|
||||
"value": "Ismo Vuorinen"
|
||||
}
|
||||
],
|
||||
"work": [
|
||||
{
|
||||
"key": "user.email",
|
||||
"value": "ismo.vuorinen@vincit.fi"
|
||||
"value": "ismo.vuorinen@svea.com"
|
||||
},
|
||||
{
|
||||
"key": "user.name",
|
||||
@@ -31,4 +41,4 @@
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
15
base/hammerspoon/.luacheckrc
Normal file
15
base/hammerspoon/.luacheckrc
Normal file
@@ -0,0 +1,15 @@
|
||||
--
|
||||
-- These globals can be set and accessed:
|
||||
--
|
||||
globals = {
|
||||
"rawrequire",
|
||||
}
|
||||
|
||||
--
|
||||
-- These globals can only be accessed:
|
||||
--
|
||||
read_globals = {
|
||||
"hs",
|
||||
"ls",
|
||||
"spoon",
|
||||
}
|
||||
205
base/hammerspoon/init.lua
Normal file
205
base/hammerspoon/init.lua
Normal file
@@ -0,0 +1,205 @@
|
||||
-- ╭─────────────────────────────────────────────────────────╮
|
||||
-- │ Hammerspoon config file │
|
||||
-- ╰─────────────────────────────────────────────────────────╯
|
||||
-- init.lua — Pure Hammerspoon window controls
|
||||
-- Converted from skhdrc logic; expanded with per‑display grids,
|
||||
-- app rules with groups, wrap‑around focus, cross‑display moves,
|
||||
-- and overlay/notification toggles.
|
||||
-- Author: Ismo Vuorinen (ivuorinen)
|
||||
|
||||
--------------------------------------------------
|
||||
-- Caps Lock as Meh key (Shift+Control+Alt)
|
||||
--------------------------------------------------
|
||||
-- Prerequisites:
|
||||
-- 1. Go to System Settings → Keyboard → Keyboard Shortcuts → Modifier Keys
|
||||
-- 2. Set Caps Lock to "No Action" (you mentioned you already did this)
|
||||
-- 3. Install Karabiner-Elements: brew install --cask karabiner-elements
|
||||
-- 4. Open Karabiner-Elements, go to "Simple Modifications"
|
||||
-- 5. Add: caps_lock → f18
|
||||
--
|
||||
-- Then you can use F18 as your Meh key in Hammerspoon:
|
||||
local f18 = hs.hotkey.modal.new()
|
||||
|
||||
-- Capture F18 key press/release
|
||||
hs.hotkey.bind({}, 'F18', function()
|
||||
f18:enter()
|
||||
end, function()
|
||||
f18:exit()
|
||||
end)
|
||||
|
||||
-- Meh (F18/Caps Lock) key bindings for window management
|
||||
-- These provide quick access to common window operations
|
||||
|
||||
-- Helper function to get focused window
|
||||
local function W()
|
||||
return hs.window.focusedWindow()
|
||||
end
|
||||
|
||||
-- Window positioning: thirds (U/I/O)
|
||||
f18:bind({}, 'u', function()
|
||||
local w = W()
|
||||
if w then
|
||||
w:moveToUnit({ x = 0, y = 0, w = 1 / 3, h = 1 }, 0)
|
||||
end
|
||||
end)
|
||||
f18:bind({}, 'i', function()
|
||||
local w = W()
|
||||
if w then
|
||||
w:moveToUnit({ x = 1 / 3, y = 0, w = 1 / 3, h = 1 }, 0)
|
||||
end
|
||||
end)
|
||||
f18:bind({}, 'o', function()
|
||||
local w = W()
|
||||
if w then
|
||||
w:moveToUnit({ x = 2 / 3, y = 0, w = 1 / 3, h = 1 }, 0)
|
||||
end
|
||||
end)
|
||||
|
||||
-- Window positioning: half width, full height (Y)
|
||||
f18:bind({}, 'y', function()
|
||||
local w = W()
|
||||
if w then
|
||||
w:moveToUnit({ x = 0, y = 0, w = 0.5, h = 1 }, 0)
|
||||
end
|
||||
end)
|
||||
|
||||
-- Cycle through all windows (H/L)
|
||||
-- We need to maintain state to properly cycle through all windows
|
||||
local windowCycleIndex = 1
|
||||
local windowCycleList = {}
|
||||
local lastCycleTime = 0
|
||||
|
||||
local function getWindowCycleList()
|
||||
local currentTime = hs.timer.secondsSinceEpoch()
|
||||
-- Reset if more than 2 seconds have passed since last cycle
|
||||
if currentTime - lastCycleTime > 2 then
|
||||
windowCycleIndex = 1
|
||||
windowCycleList = hs.window.orderedWindows()
|
||||
end
|
||||
lastCycleTime = currentTime
|
||||
return windowCycleList
|
||||
end
|
||||
|
||||
f18:bind({}, 'h', function()
|
||||
local windows = getWindowCycleList()
|
||||
if #windows <= 1 then
|
||||
return
|
||||
end
|
||||
|
||||
-- Cycle backward
|
||||
windowCycleIndex = windowCycleIndex - 1
|
||||
if windowCycleIndex < 1 then
|
||||
windowCycleIndex = #windows
|
||||
end
|
||||
|
||||
windows[windowCycleIndex]:focus()
|
||||
end)
|
||||
|
||||
f18:bind({}, 'l', function()
|
||||
local windows = getWindowCycleList()
|
||||
if #windows <= 1 then
|
||||
return
|
||||
end
|
||||
|
||||
-- Cycle forward
|
||||
windowCycleIndex = windowCycleIndex + 1
|
||||
if windowCycleIndex > #windows then
|
||||
windowCycleIndex = 1
|
||||
end
|
||||
|
||||
windows[windowCycleIndex]:focus()
|
||||
end)
|
||||
|
||||
-- Window sizing: maximize (Up/J) and center (Down)
|
||||
f18:bind({}, 'up', function()
|
||||
local w = W()
|
||||
if w then
|
||||
w:maximize(0)
|
||||
end
|
||||
end)
|
||||
f18:bind({}, 'j', function()
|
||||
local w = W()
|
||||
if w then
|
||||
w:maximize(0)
|
||||
end
|
||||
end)
|
||||
f18:bind({}, 'down', function()
|
||||
local w = W()
|
||||
if not w then
|
||||
return
|
||||
end
|
||||
local f = w:frame()
|
||||
local sf = w:screen():frame()
|
||||
if f.w < sf.w * 0.95 then
|
||||
w:maximize(0)
|
||||
else
|
||||
local ww, hh = math.floor(sf.w * 0.5), math.floor(sf.h * 0.9)
|
||||
local xx = sf.x + math.floor((sf.w - ww) / 2)
|
||||
local yy = sf.y + math.floor((sf.h - hh) / 2)
|
||||
w:setFrame({ x = xx, y = yy, w = ww, h = hh }, 0)
|
||||
end
|
||||
end)
|
||||
f18:bind({}, 'k', function()
|
||||
local w = W()
|
||||
if w then
|
||||
local sf = w:screen():frame()
|
||||
local ww, hh = math.floor(sf.w * 0.9), math.floor(sf.h * 0.9)
|
||||
local xx = sf.x + math.floor((sf.w - ww) / 2)
|
||||
local yy = sf.y + math.floor((sf.h - hh) / 2)
|
||||
w:setFrame({ x = xx, y = yy, w = ww, h = hh }, 0)
|
||||
end
|
||||
end)
|
||||
|
||||
-- Move to next/previous screen (. and ,)
|
||||
f18:bind({}, '.', function()
|
||||
local w = W()
|
||||
if w then
|
||||
local s = w:screen()
|
||||
local ns = s:toEast() or s:toWest()
|
||||
if ns then
|
||||
w:moveToScreen(ns, true, true, 0)
|
||||
end
|
||||
end
|
||||
end)
|
||||
f18:bind({}, ',', function()
|
||||
local w = W()
|
||||
if w then
|
||||
local s = w:screen()
|
||||
local ps = s:toWest() or s:toEast()
|
||||
if ps then
|
||||
w:moveToScreen(ps, true, true, 0)
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
-- Window positioning: halves (Left/Right arrows)
|
||||
f18:bind({}, 'left', function()
|
||||
local w = W()
|
||||
if w then
|
||||
w:moveToUnit(hs.layout.left50, 0)
|
||||
end
|
||||
end)
|
||||
f18:bind({}, 'right', function()
|
||||
local w = W()
|
||||
if w then
|
||||
w:moveToUnit(hs.layout.right50, 0)
|
||||
end
|
||||
end)
|
||||
|
||||
-- Paste from clipboard with Meh + V
|
||||
f18:bind({}, 'v', function()
|
||||
hs.eventtap.keyStrokes(hs.pasteboard.getContents())
|
||||
end)
|
||||
|
||||
-- Paste 1Password secret with Meh + P
|
||||
f18:bind({}, 'p', function()
|
||||
local output, status =
|
||||
hs.execute('op read "op://Svea/3hzhctmvovbwlgulv7mgy25rf4/login-input"', true)
|
||||
if status then
|
||||
hs.eventtap.keyStrokes(output:gsub('%s+$', '')) -- trim trailing whitespace
|
||||
else
|
||||
hs.alert.show '1Password CLI error'
|
||||
end
|
||||
end)
|
||||
|
||||
-- require 'generate_emmylua'
|
||||
@@ -1,6 +0,0 @@
|
||||
#!/bin/env bash
|
||||
|
||||
[ -z "$NVM_DIR" ] && export NVM_DIR="$HOME/.config/nvm"
|
||||
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
|
||||
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
|
||||
|
||||
6
base/ignore
Normal file
6
base/ignore
Normal file
@@ -0,0 +1,6 @@
|
||||
Applications/
|
||||
Library/
|
||||
Movies/
|
||||
Music/
|
||||
Pictures/
|
||||
Google Drive/
|
||||
1
base/nvmrc
Normal file
1
base/nvmrc
Normal file
@@ -0,0 +1 @@
|
||||
v22.14.0
|
||||
@@ -12,5 +12,3 @@
|
||||
~-.__| /_ - ~ ^| /- _ `..-' f: f:
|
||||
| / | / ~-. `-. _||_||_
|
||||
|_____| |_____| ~ - . _ _ _ _ _>
|
||||
|
||||
|
||||
|
||||
@@ -4,4 +4,3 @@
|
||||
# paths in source statements (since 0.8.0).
|
||||
external-sources=true
|
||||
includeAllWorkspaceSymbols=true
|
||||
|
||||
|
||||
21
base/zshenv
21
base/zshenv
@@ -1,21 +0,0 @@
|
||||
# shellcheck shell=bash
|
||||
# vim: filetype=zsh
|
||||
|
||||
export PATH="$HOME/.local/bin:$HOME/.dotfiles/local/bin:$HOME/.local/go/bin:$PATH"
|
||||
|
||||
export DOTFILES="$HOME/.dotfiles"
|
||||
|
||||
# Explicitly set XDG folders
|
||||
# https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html
|
||||
export XDG_CONFIG_HOME="$HOME/.config"
|
||||
export XDG_DATA_HOME="$HOME/.local/share"
|
||||
export XDG_STATE_HOME="$HOME/.local/state"
|
||||
|
||||
# custom variables
|
||||
export XDG_BIN_HOME="$HOME/.local/bin"
|
||||
export XDG_CACHE_HOME="$HOME/.cache"
|
||||
export XDG_RUNTIME_DIR="$HOME/.local/run"
|
||||
|
||||
source "$DOTFILES/config/exports"
|
||||
source "$DOTFILES/config/alias"
|
||||
|
||||
134
base/zshrc
Executable file → Normal file
134
base/zshrc
Executable file → Normal file
@@ -1,118 +1,40 @@
|
||||
# this is my zsh config. there are many like it, but this one is mine.
|
||||
# https://zsh.sourceforge.io/Intro/intro_3.html
|
||||
# shellcheck shell=bash
|
||||
|
||||
# export VERBOSE=1
|
||||
# export DEBUG=1
|
||||
autoload -U promptinit; promptinit
|
||||
|
||||
export DOTFILES="$HOME/.dotfiles"
|
||||
# Minimal PATH for x-have and utilities; full PATH set in shared.sh/exports
|
||||
export PATH="$HOME/.local/bin:$DOTFILES/local/bin:$PATH"
|
||||
export SHARED_SCRIPTS_SOURCED=0
|
||||
|
||||
# Explicitly set XDG folders
|
||||
# https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html
|
||||
export XDG_CONFIG_HOME="$HOME/.config"
|
||||
export XDG_DATA_HOME="$HOME/.local/share"
|
||||
export XDG_STATE_HOME="$HOME/.local/state"
|
||||
source "$DOTFILES/config/shared.sh"
|
||||
|
||||
# custom variables
|
||||
export XDG_BIN_HOME="$HOME/.local/bin"
|
||||
export XDG_CACHE_HOME="$HOME/.cache"
|
||||
export XDG_RUNTIME_DIR="$HOME/.local/run"
|
||||
# zsh completions directory (ZSH_CUSTOM_COMPLETION_PATH set in shared.sh)
|
||||
ZSH_COMPDUMP="$XDG_CACHE_HOME/zsh/zcompdump-${SHORT_HOST}-${ZSH_VERSION}"
|
||||
|
||||
export PATH="$XDG_BIN_HOME:$DOTFILES/local/bin:$HOME/.local/go/bin:$XDG_DATA_HOME/bob/nvim-bin:$XDG_DATA_HOME/cargo/bin:/opt/homebrew/bin:/usr/local/bin:$PATH"
|
||||
source "$DOTFILES/config/zsh/antidote.zsh"
|
||||
|
||||
x-load-configs
|
||||
|
||||
x-have antidot && {
|
||||
eval "$(antidot init)"
|
||||
# Function to source FZF configuration
|
||||
source_fzf_config()
|
||||
{
|
||||
local fzf_config="${DOTFILES}/config/fzf/fzf.zsh"
|
||||
if [[ -f "$fzf_config" ]]; then
|
||||
# shellcheck source=config/fzf/fzf.zsh
|
||||
source "$fzf_config"
|
||||
fi
|
||||
}
|
||||
|
||||
export COMPLETION_WAITING_DOTS=true
|
||||
source_fzf_config
|
||||
x-have antidot && eval "$(antidot init)"
|
||||
|
||||
if type brew &> /dev/null; then
|
||||
eval "$(brew shellenv)"
|
||||
FPATH="$HOMEBREW_PREFIX/share/zsh/site-functions:${FPATH}"
|
||||
fi
|
||||
autoload -Uz compinit bashcompinit
|
||||
compinit -d "$ZSH_COMPDUMP"
|
||||
bashcompinit
|
||||
|
||||
export ZSH_CUSTOM_COMPLETION_PATH="$XDG_CONFIG_HOME/zsh/completion"
|
||||
x-dc "$ZSH_CUSTOM_COMPLETION_PATH"
|
||||
|
||||
# Add completion scripts to zsh path
|
||||
FPATH="$ZSH_CUSTOM_COMPLETION_PATH:$FPATH"
|
||||
|
||||
# Try to load antigen, if present
|
||||
ANTIGEN_ZSH_PATH="$XDG_BIN_HOME/antigen.zsh"
|
||||
# shellcheck source=../../.local/bin/antigen.zsh
|
||||
[[ -f "$ANTIGEN_ZSH_PATH" ]] && source "$ANTIGEN_ZSH_PATH"
|
||||
|
||||
# antigen is present
|
||||
antigen use oh-my-zsh
|
||||
|
||||
export ZSH_TMUX_AUTOSTART=true
|
||||
export ZSH_TMUX_CONFIG="$DOTFILES/config/tmux/tmux.conf"
|
||||
export ZSH_TMUX_UNICODE=true
|
||||
export ZSH_TMUX_AUTOQUIT=false
|
||||
export ZSH_TMUX_DEFAULT_SESSION_NAME=main
|
||||
|
||||
export NVM_DIR="$XDG_CONFIG_HOME/nvm"
|
||||
export NPM_CONFIG_USERCONFIG="$XDG_CONFIG_HOME"/npm/npmrc
|
||||
|
||||
# z, the zsh version
|
||||
export ZSHZ_DATA="$XDG_STATE_HOME/z"
|
||||
antigen bundle z
|
||||
|
||||
# these should be always available
|
||||
antigen bundle tmux
|
||||
antigen bundle colored-man-pages
|
||||
antigen bundle command-not-found
|
||||
antigen bundle ssh-agent
|
||||
antigen bundle jreese/zsh-titles
|
||||
antigen bundle zsh-users/zsh-completions
|
||||
|
||||
# these should be available if there's need
|
||||
x-have python && antigen bundle MichaelAquilina/zsh-autoswitch-virtualenv
|
||||
|
||||
# nvm is a strange beast
|
||||
zstyle ':omz:plugins:nvm' autoload yes
|
||||
antigen bundle nvm
|
||||
|
||||
# this needs to be the last item
|
||||
antigen bundle zsh-users/zsh-syntax-highlighting
|
||||
antigen apply
|
||||
|
||||
# shellcheck source=../config/fzf/fzf.zsh
|
||||
[ -f "${DOTFILES}/config/fzf/fzf.zsh" ] \
|
||||
&& source "${DOTFILES}/config/fzf/fzf.zsh"
|
||||
|
||||
x-have rbenv && {
|
||||
eval "$(rbenv init - zsh)"
|
||||
}
|
||||
|
||||
x-have pyenv && {
|
||||
[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
|
||||
eval "$(pyenv init -)"
|
||||
eval "$(pyenv virtualenv-init -)"
|
||||
}
|
||||
|
||||
# Run only if tmux is active
|
||||
[[ -n "$TMUX" ]] && {
|
||||
# Autoupdate tmux window name
|
||||
TMUX_WINDOW_NAME_PLUGIN="$DOTFILES/config/tmux/plugins/tmux-window-name/scripts/rename_session_windows.py"
|
||||
[ -f "$TMUX_WINDOW_NAME_PLUGIN" ] && {
|
||||
tmux-window-name()
|
||||
{
|
||||
($TMUX_WINDOW_NAME_PLUGIN &)
|
||||
}
|
||||
add-zsh-hook chpwd tmux-window-name
|
||||
tmux-window-name
|
||||
}
|
||||
}
|
||||
|
||||
# eval "$(starship init zsh)"
|
||||
x-have oh-my-posh && {
|
||||
eval "$(oh-my-posh init zsh --config $XDG_CONFIG_HOME/oh-my-posh.omp.json)"
|
||||
}
|
||||
source "$DOTFILES/config/alias"
|
||||
|
||||
# Herd checks for a few environment variables to inject PHP binaries and configurations.
|
||||
# Herd injected PHP binary.
|
||||
# export PATH="/Users/ivuorinen/Library/Application Support/Herd/bin/":$PATH
|
||||
# Herd injected PHP 8.3 configuration.
|
||||
# export HERD_PHP_83_INI_SCAN_DIR="/Users/ivuorinen/Library/Application Support/Herd/config/php/83/"
|
||||
# Herd injected PHP 7.4 configuration.
|
||||
# export HERD_PHP_74_INI_SCAN_DIR="/Users/ivuorinen/Library/Application Support/Herd/config/php/74/"
|
||||
# To customize prompt, run `p10k configure` or edit ~/.p10k.zsh.
|
||||
export P10K_CONFIG="$DOTFILES/config/zsh/p10k.zsh"
|
||||
[[ ! -f "$P10K_CONFIG" ]] || source "$P10K_CONFIG"
|
||||
|
||||
104
biome.json
Normal file
104
biome.json
Normal file
@@ -0,0 +1,104 @@
|
||||
{
|
||||
"$schema": "https://biomejs.dev/schemas/2.4.7/schema.json",
|
||||
"vcs": {
|
||||
"enabled": true,
|
||||
"clientKind": "git",
|
||||
"useIgnoreFile": true,
|
||||
"defaultBranch": "main"
|
||||
},
|
||||
"files": {
|
||||
"ignoreUnknown": true,
|
||||
"includes": [
|
||||
"**",
|
||||
"!!**/.mypy_cache",
|
||||
"!!**/Brewfile.lock.json",
|
||||
"!!**/base/plan",
|
||||
"!!**/config/cheat/cheatsheets/community",
|
||||
"!!**/config/cheat/cheatsheets/tldr",
|
||||
"!!**/config/fzf",
|
||||
"!!**/config/nvim",
|
||||
"!!**/config/op/plugins/used_plugins",
|
||||
"!!**/config/tmux/plugins",
|
||||
"!!**/config/zsh",
|
||||
"!!**/config/karabiner",
|
||||
"!!**/config/vim",
|
||||
"!!**/lazy-lock.json",
|
||||
"!!**/local/bin/antigen.zsh",
|
||||
"!!**/local/bin/asdf",
|
||||
"!!**/tools/antidote",
|
||||
"!!**/tools/dotbot",
|
||||
"!!**/node_modules"
|
||||
]
|
||||
},
|
||||
"formatter": {
|
||||
"enabled": true,
|
||||
"formatWithErrors": false,
|
||||
"indentStyle": "space",
|
||||
"indentWidth": 2,
|
||||
"lineEnding": "lf",
|
||||
"lineWidth": 80
|
||||
},
|
||||
"linter": {
|
||||
"enabled": true,
|
||||
"rules": {
|
||||
"recommended": true,
|
||||
"correctness": {
|
||||
"noUnusedVariables": "warn",
|
||||
"noUnusedImports": "warn"
|
||||
},
|
||||
"style": {
|
||||
"useConst": "warn",
|
||||
"useTemplate": "warn"
|
||||
},
|
||||
"suspicious": {
|
||||
"noExplicitAny": "warn",
|
||||
"noConsole": "off"
|
||||
}
|
||||
}
|
||||
},
|
||||
"javascript": {
|
||||
"formatter": {
|
||||
"enabled": true,
|
||||
"quoteStyle": "single",
|
||||
"jsxQuoteStyle": "double",
|
||||
"trailingCommas": "all",
|
||||
"semicolons": "asNeeded",
|
||||
"arrowParentheses": "always",
|
||||
"bracketSpacing": true,
|
||||
"bracketSameLine": false,
|
||||
"quoteProperties": "asNeeded",
|
||||
"indentStyle": "space",
|
||||
"indentWidth": 2
|
||||
}
|
||||
},
|
||||
"json": {
|
||||
"parser": {
|
||||
"allowComments": true,
|
||||
"allowTrailingCommas": false
|
||||
},
|
||||
"formatter": {
|
||||
"enabled": true,
|
||||
"indentStyle": "space",
|
||||
"indentWidth": 2,
|
||||
"lineWidth": 80
|
||||
}
|
||||
},
|
||||
"overrides": [
|
||||
{
|
||||
"includes": ["*.md", "*.mdx"],
|
||||
"formatter": {
|
||||
"enabled": true,
|
||||
"lineWidth": 120
|
||||
}
|
||||
},
|
||||
{
|
||||
"includes": ["package.json"],
|
||||
"json": {
|
||||
"formatter": {
|
||||
"enabled": true,
|
||||
"indentWidth": 2
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,3 +1,4 @@
|
||||
--container-architecture linux/amd64
|
||||
-P ubuntu-latest=catthehacker/ubuntu:act-latest
|
||||
-P ubuntu-22.04=catthehacker/ubuntu:act-22.04
|
||||
-P ubuntu-20.04=catthehacker/ubuntu:act-20.04
|
||||
|
||||
@@ -1,336 +1,33 @@
|
||||
[colors]
|
||||
draw_bold_text_with_bright_colors = true
|
||||
|
||||
[colors.bright]
|
||||
black = "0x414868"
|
||||
blue = "0x7aa2f7"
|
||||
cyan = "0x7dcfff"
|
||||
green = "0x9ece6a"
|
||||
magenta = "0xbb9af7"
|
||||
red = "0xf7768e"
|
||||
white = "0xc0caf5"
|
||||
yellow = "0xe0af68"
|
||||
|
||||
[colors.normal]
|
||||
black = "0x1d202f"
|
||||
blue = "0x7aa2f7"
|
||||
cyan = "0x7dcfff"
|
||||
green = "0x9ece6a"
|
||||
magenta = "0xbb9af7"
|
||||
red = "0xf7768e"
|
||||
white = "0xa9b1d6"
|
||||
yellow = "0xe0af68"
|
||||
|
||||
[colors.primary]
|
||||
background = "0x24283b"
|
||||
foreground = "0xc0caf5"
|
||||
|
||||
[env]
|
||||
TERM = "xterm-256color"
|
||||
|
||||
[colors]
|
||||
draw_bold_text_with_bright_colors = true
|
||||
|
||||
[font]
|
||||
size = 14.0
|
||||
|
||||
[font.bold]
|
||||
family = "JetBrainsMonoNL Nerd Font Mono"
|
||||
style = "Bold"
|
||||
|
||||
[font.glyph_offset]
|
||||
x = 0
|
||||
y = 0
|
||||
|
||||
[font.italic]
|
||||
family = "JetBrainsMonoNL Nerd Font Mono"
|
||||
style = "Italic"
|
||||
|
||||
[font.normal]
|
||||
family = "JetBrainsMonoNL Nerd Font Mono"
|
||||
style = "ExtraLight"
|
||||
|
||||
[font.italic]
|
||||
family = "JetBrainsMonoNL Nerd Font Mono"
|
||||
style = "Italic"
|
||||
|
||||
[font.bold]
|
||||
family = "JetBrainsMonoNL Nerd Font Mono"
|
||||
style = "Bold"
|
||||
|
||||
[font.offset]
|
||||
x = 0
|
||||
y = 0
|
||||
|
||||
[[keyboard.bindings]]
|
||||
action = "Paste"
|
||||
key = "V"
|
||||
mods = "Command"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
action = "Copy"
|
||||
key = "C"
|
||||
mods = "Command"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
action = "Quit"
|
||||
key = "Q"
|
||||
mods = "Command"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
action = "Quit"
|
||||
key = "W"
|
||||
mods = "Command"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
action = "SpawnNewInstance"
|
||||
key = "N"
|
||||
mods = "Command"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001BOH"
|
||||
key = "Home"
|
||||
mode = "AppCursor"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001B[1~"
|
||||
key = "Home"
|
||||
mode = "~AppCursor"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001BOF"
|
||||
key = "End"
|
||||
mode = "AppCursor"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001B[4~"
|
||||
key = "End"
|
||||
mode = "~AppCursor"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001B[5;2~"
|
||||
key = "PageUp"
|
||||
mods = "Shift"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001B[5;5~"
|
||||
key = "PageUp"
|
||||
mods = "Control"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001B[5~"
|
||||
key = "PageUp"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001B[6;2~"
|
||||
key = "PageDown"
|
||||
mods = "Shift"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001B[6;5~"
|
||||
key = "PageDown"
|
||||
mods = "Control"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001B[6~"
|
||||
key = "PageDown"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001B[1;2D"
|
||||
key = "Left"
|
||||
mods = "Shift"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001B[1;5D"
|
||||
key = "Left"
|
||||
mods = "Control"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001B[1;3D"
|
||||
key = "Left"
|
||||
mods = "Alt"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001B[D"
|
||||
key = "Left"
|
||||
mode = "~AppCursor"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001BOD"
|
||||
key = "Left"
|
||||
mode = "AppCursor"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001B[1;2C"
|
||||
key = "Right"
|
||||
mods = "Shift"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001B[1;5C"
|
||||
key = "Right"
|
||||
mods = "Control"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001B[1;3C"
|
||||
key = "Right"
|
||||
mods = "Alt"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001B[C"
|
||||
key = "Right"
|
||||
mode = "~AppCursor"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001BOC"
|
||||
key = "Right"
|
||||
mode = "AppCursor"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001B[1;2A"
|
||||
key = "Up"
|
||||
mods = "Shift"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001B[1;5A"
|
||||
key = "Up"
|
||||
mods = "Control"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001B[1;3A"
|
||||
key = "Up"
|
||||
mods = "Alt"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001B[A"
|
||||
key = "Up"
|
||||
mode = "~AppCursor"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001BOA"
|
||||
key = "Up"
|
||||
mode = "AppCursor"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001B[1;2B"
|
||||
key = "Down"
|
||||
mods = "Shift"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001B[1;5B"
|
||||
key = "Down"
|
||||
mods = "Control"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001B[1;3B"
|
||||
key = "Down"
|
||||
mods = "Alt"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001B[B"
|
||||
key = "Down"
|
||||
mode = "~AppCursor"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001BOB"
|
||||
key = "Down"
|
||||
mode = "AppCursor"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001B[Z"
|
||||
key = "Tab"
|
||||
mods = "Shift"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001BOP"
|
||||
key = "F1"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001BOQ"
|
||||
key = "F2"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001BOR"
|
||||
key = "F3"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001BOS"
|
||||
key = "F4"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001B[15~"
|
||||
key = "F5"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001B[17~"
|
||||
key = "F6"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001B[18~"
|
||||
key = "F7"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001B[19~"
|
||||
key = "F8"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001B[20~"
|
||||
key = "F9"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001B[21~"
|
||||
key = "F10"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001B[23~"
|
||||
key = "F11"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001B[24~"
|
||||
key = "F12"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
key = "Back"
|
||||
action = "ReceiveChar"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001B[2~"
|
||||
key = "Insert"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u001B[3~"
|
||||
key = "Delete"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u0002&"
|
||||
key = "W"
|
||||
mods = "Command"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u0002c"
|
||||
key = "T"
|
||||
mods = "Command"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u0002n"
|
||||
key = "RBracket"
|
||||
mods = "Command|Shift"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u0002p"
|
||||
key = "LBracket"
|
||||
mods = "Command|Shift"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u0002o"
|
||||
key = "RBracket"
|
||||
mods = "Command"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u0002;"
|
||||
key = "LBracket"
|
||||
mods = "Command"
|
||||
|
||||
[[keyboard.bindings]]
|
||||
chars = "\u0002/"
|
||||
key = "F"
|
||||
mods = "Command"
|
||||
|
||||
[mouse]
|
||||
hide_when_typing = false
|
||||
|
||||
[[mouse.bindings]]
|
||||
action = "PasteSelection"
|
||||
mouse = "Middle"
|
||||
|
||||
[selection]
|
||||
semantic_escape_chars = ",│`|:\"' ()[]{}<>"
|
||||
save_to_clipboard = true
|
||||
@@ -348,3 +45,10 @@ lines = 75
|
||||
[window.padding]
|
||||
x = 5
|
||||
y = 5
|
||||
|
||||
[general]
|
||||
import = [
|
||||
# Default to night if the copied one doesn't exist.
|
||||
"~/.dotfiles/config/alacritty/theme-night.toml",
|
||||
"~/.config/alacritty/theme-active.toml"
|
||||
]
|
||||
|
||||
40
config/alacritty/theme-day.toml
Normal file
40
config/alacritty/theme-day.toml
Normal file
@@ -0,0 +1,40 @@
|
||||
# TokyoNight Alacritty Colors: Day
|
||||
# Default colors
|
||||
[colors.primary]
|
||||
background = '#e1e2e7'
|
||||
foreground = '#3760bf'
|
||||
|
||||
#[colors.cursor]
|
||||
#cursor = '#3760bf'
|
||||
#text = '#e1e2e7'
|
||||
|
||||
# Normal colors
|
||||
[colors.normal]
|
||||
black = '#e9e9ed'
|
||||
red = '#f52a65'
|
||||
green = '#587539'
|
||||
yellow = '#8c6c3e'
|
||||
blue = '#2e7de9'
|
||||
magenta = '#9854f1'
|
||||
cyan = '#007197'
|
||||
white = '#6172b0'
|
||||
|
||||
# Bright colors
|
||||
[colors.bright]
|
||||
black = '#a1a6c5'
|
||||
red = '#f52a65'
|
||||
green = '#587539'
|
||||
yellow = '#8c6c3e'
|
||||
blue = '#2e7de9'
|
||||
magenta = '#9854f1'
|
||||
cyan = '#007197'
|
||||
white = '#3760bf'
|
||||
|
||||
# Indexed Colors
|
||||
[[colors.indexed_colors]]
|
||||
index = 16
|
||||
color = '#b15c00'
|
||||
|
||||
[[colors.indexed_colors]]
|
||||
index = 17
|
||||
color = '#c64343'
|
||||
40
config/alacritty/theme-night.toml
Normal file
40
config/alacritty/theme-night.toml
Normal file
@@ -0,0 +1,40 @@
|
||||
# TokyoNight Alacritty Colors: Storm
|
||||
# Default colors
|
||||
[colors.primary]
|
||||
background = '#24283b'
|
||||
foreground = '#c0caf5'
|
||||
|
||||
#[colors.cursor]
|
||||
#cursor = '#c0caf5'
|
||||
#text = '#24283b'
|
||||
|
||||
# Normal colors
|
||||
[colors.normal]
|
||||
black = '#1d202f'
|
||||
red = '#f7768e'
|
||||
green = '#9ece6a'
|
||||
yellow = '#e0af68'
|
||||
blue = '#7aa2f7'
|
||||
magenta = '#bb9af7'
|
||||
cyan = '#7dcfff'
|
||||
white = '#a9b1d6'
|
||||
|
||||
# Bright colors
|
||||
[colors.bright]
|
||||
black = '#414868'
|
||||
red = '#f7768e'
|
||||
green = '#9ece6a'
|
||||
yellow = '#e0af68'
|
||||
blue = '#7aa2f7'
|
||||
magenta = '#bb9af7'
|
||||
cyan = '#7dcfff'
|
||||
white = '#c0caf5'
|
||||
|
||||
# Indexed Colors
|
||||
[[colors.indexed_colors]]
|
||||
index = 16
|
||||
color = '#ff9e64'
|
||||
|
||||
[[colors.indexed_colors]]
|
||||
index = 17
|
||||
color = '#db4b4b'
|
||||
138
config/alias
138
config/alias
@@ -1,6 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# shellcheck source="../scripts/shared.sh"
|
||||
# shellcheck disable=1091,2139
|
||||
|
||||
# Color the grep output
|
||||
alias grep="grep --color"
|
||||
@@ -14,8 +12,29 @@ alias ..="cd .."
|
||||
alias ...="cd ../.."
|
||||
alias ....="cd ../../.."
|
||||
|
||||
# Get git repository root path
|
||||
get_git_root()
|
||||
{
|
||||
# check that we are in a git repository
|
||||
if git rev-parse --is-inside-work-tree &> /dev/null; then
|
||||
git rev-parse --show-toplevel
|
||||
else
|
||||
>&2 msgr err "Not in a git repository"
|
||||
fi
|
||||
}
|
||||
|
||||
# cd to git root directory
|
||||
alias cdgr='cd "$(git root)"'
|
||||
alias cdgr='cd "$(get_git_root)"'
|
||||
|
||||
# interesting folders, and shortcuts
|
||||
alias .='cd $HOME'
|
||||
alias .b='cd $XDG_BIN_HOME'
|
||||
alias .c='cd $HOME/Code'
|
||||
alias .d='cd $DOTFILES'
|
||||
alias .l='cd $HOME/.local'
|
||||
alias .o='cd $HOME/Code/ivuorinen/obsidian/'
|
||||
alias .s='cd $HOME/Code/s'
|
||||
alias .p='cd $HOME/Code/ivuorinen'
|
||||
|
||||
# Shortcuts for listing
|
||||
alias ll="ls -la"
|
||||
@@ -25,13 +44,10 @@ alias l="ls -a"
|
||||
alias cd..="cd .."
|
||||
alias sl="ls"
|
||||
|
||||
# List only directories
|
||||
alias lsd="ls -lF | grep '^d'"
|
||||
|
||||
# IP addresses
|
||||
alias x-ip="dig +short myip.opendns.com @resolver1.opendns.com"
|
||||
alias localip="ipconfig getifaddr en1"
|
||||
alias ips="ifconfig -a | grep -o 'inet6\? \(\([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\)\|[a-fA-F0-9:]\+\)' | sed -e 's/inet6* //'"
|
||||
alias ips="ifconfig -a | grep -o 'inet6\? \(\([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\)\|[a-fA-F0-9:]\+\)' | sed -e 's/inet6* //' | sort"
|
||||
|
||||
# Show/hide hidden files in Finder
|
||||
alias show="defaults write com.apple.finder AppleShowAllFiles -bool true; killall Finder"
|
||||
@@ -46,14 +62,17 @@ alias flush="dscacheutil -flushcache"
|
||||
# Update locatedb
|
||||
alias updatedb="sudo /usr/libexec/locate.updatedb"
|
||||
|
||||
# tmux: automatically attach or create session with name 'main'
|
||||
alias tmux='tmux new-session -A -s main'
|
||||
# tmux: attach or create new session
|
||||
alias ta='tmux attach || tmux'
|
||||
# Date helpers
|
||||
alias isodate="date +'%Y-%m-%d'"
|
||||
alias x-datetime="date +'%Y-%m-%d %H:%M:%S'"
|
||||
alias x-timestamp="date +'%s'"
|
||||
|
||||
# nvim
|
||||
alias nvim-ks='NVIM_APPNAME="nvim-kickstart" nvim'
|
||||
alias ks='NVIM_APPNAME="nvim-kickstart" nvim'
|
||||
# nvim aliases
|
||||
alias vi='nvim'
|
||||
alias vim='nvim'
|
||||
|
||||
# xdg-ninja aliases for better experience
|
||||
alias xdg='xdg-ninja --skip-ok --skip-unsupported'
|
||||
|
||||
# watch with: differences, precise, beep and color
|
||||
alias watchx='watch -dpbc'
|
||||
@@ -63,8 +82,6 @@ alias zapds='find . -name ".DS_Store" -print -delete'
|
||||
alias zappyc="find . -type f -name '*.pyc' -ls -delete"
|
||||
# Run all zaps
|
||||
alias zapall="zapds && zappyc"
|
||||
# tail with follow flag on
|
||||
alias t='tail -f'
|
||||
# directory usage, return only the total
|
||||
alias dn='du -chd1'
|
||||
# Mirror site with wget
|
||||
@@ -72,6 +89,7 @@ alias mirror_site='wget -m -k -K -E -e robots=off'
|
||||
# Mirror stdout to stderr, useful for seeing data going through a pipe
|
||||
alias peek='tee >(cat 1>&2)'
|
||||
|
||||
# Runs Gitlab code quality scanner
|
||||
alias code_scanner='docker run
|
||||
--env SOURCE_CODE="$PWD"
|
||||
--volume "${PWD}":/code
|
||||
@@ -79,20 +97,25 @@ alias code_scanner='docker run
|
||||
registry.gitlab.com/gitlab-org/ci-cd/codequality:"${CODEQUALITY_VERSION:-latest}"
|
||||
/code'
|
||||
|
||||
# Runs trivy container image scanner
|
||||
alias trivy_scan='docker run -v /var/run/docker.sock:/var/run/docker.sock -v $HOME/Library/Caches:/root/.cache/ aquasec/trivy'
|
||||
|
||||
# Opens dotfiles with $EDITOR
|
||||
alias zedit='$EDITOR ~/.dotfiles'
|
||||
# Open irssi with my configurations
|
||||
alias irssi='irssi --config=$XDG_CONFIG_HOME/irssi/config --home=$XDG_CONFIG_HOME/irssi'
|
||||
# Configures wget to use correct wget-hsts file
|
||||
alias wget='wget --hsts-file=$XDG_DATA_HOME/wget-hsts'
|
||||
# Configures svn to use correct config directory
|
||||
alias svn='svn --config-dir $XDG_CONFIG_HOME/subversion'
|
||||
|
||||
alias irssi="irssi --config=$XDG_CONFIG_HOME/irssi/config --home=$XDG_CONFIG_HOME/irssi"
|
||||
# Laravel artisan shortcut
|
||||
alias art='[ -f artisan ] && php artisan || php vendor/bin/artisan'
|
||||
|
||||
alias wget="wget --hsts-file=$XDG_DATA_HOME/wget-hsts"
|
||||
alias svn="svn --config-dir $XDG_CONFIG_HOME/subversion"
|
||||
# Laravel Sail shortcut
|
||||
alias sail='[ -f sail ] && bash sail || bash vendor/bin/sail'
|
||||
|
||||
if [[ $(uname) == 'Darwin' ]]; then
|
||||
|
||||
# Laravel Sail shortcut
|
||||
alias sail='[ -f sail ] && bash sail || bash vendor/bin/sail'
|
||||
|
||||
# Flush Directory Service cache
|
||||
alias flushdns="sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder"
|
||||
|
||||
@@ -107,62 +130,13 @@ if [[ $(uname) == 'Darwin' ]]; then
|
||||
# x-set-php-aliases
|
||||
fi
|
||||
|
||||
# Alacritty preexec hook to update dynamic title
|
||||
preexec()
|
||||
{
|
||||
print -Pn "\e]0;$1%~\a"
|
||||
}
|
||||
|
||||
# Update dotfiles
|
||||
dfu()
|
||||
{
|
||||
(
|
||||
cd "$DOTFILES" && git pull --ff-only && ./install -q
|
||||
)
|
||||
}
|
||||
|
||||
# Weather in Tampere, or other city
|
||||
weather()
|
||||
{
|
||||
# https://github.com/chubin/wttr.in#usage
|
||||
local city="${1:-Tampere}"
|
||||
curl "http://wttr.in/${city// /+}?2nFQM&lang=fi"
|
||||
}
|
||||
|
||||
# Docker
|
||||
ssh-docker()
|
||||
{
|
||||
docker exec -it "$@" bash
|
||||
}
|
||||
|
||||
# Rector project to php version 8.2 by default.
|
||||
rector()
|
||||
{
|
||||
local php="${1:-82}"
|
||||
docker run -v "$(pwd)":/project rector/rector:latest process \
|
||||
"/project/$1" \
|
||||
--set "php${php}" \
|
||||
--autoload-file /project/vendor/autoload.php
|
||||
}
|
||||
|
||||
# Commit everything
|
||||
commit()
|
||||
{
|
||||
commitMessage="$*"
|
||||
|
||||
if [ "$commitMessage" = "" ]; then
|
||||
commitMessage="Automated commit"
|
||||
fi
|
||||
|
||||
git add .
|
||||
eval "git commit -a -m '${commitMessage}'"
|
||||
}
|
||||
|
||||
scheduler()
|
||||
{
|
||||
while :; do
|
||||
php artisan schedule:run
|
||||
echo "Sleeping 60 seconds..."
|
||||
sleep 60
|
||||
done
|
||||
}
|
||||
X_ALIAS_FILES=(
|
||||
"$HOME/.config/alias-secret"
|
||||
"$HOME/.config/alias-$(hostname)"
|
||||
"$HOME/.config/alias-$(hostname)-secret"
|
||||
)
|
||||
for aliasFile in "${X_ALIAS_FILES[@]}"; do
|
||||
# shellcheck source=$HOME/.config/alias-secret
|
||||
[ -f "$aliasFile" ] && source "$aliasFile" && msgr ok "Sourced $aliasFile"
|
||||
done
|
||||
unset X_ALIAS_FILES
|
||||
|
||||
@@ -93,13 +93,13 @@ expand-main:
|
||||
# Note that not all layouts respond to this command.
|
||||
increase-main:
|
||||
mod: mod1
|
||||
key: ','
|
||||
key: ","
|
||||
|
||||
# Decrease the number of windows in the main pane.
|
||||
# Note that not all layouts respond to this command.
|
||||
decrease-main:
|
||||
mod: mod1
|
||||
key: '.'
|
||||
key: "."
|
||||
|
||||
# General purpose command for custom layouts.
|
||||
# Functionality is layout-dependent.
|
||||
@@ -180,7 +180,7 @@ swap-main:
|
||||
# Move focus to the n-th screen in the list; e.g.,
|
||||
# focus-screen-3 will move mouse focus to the 3rd screen.
|
||||
# Note that the main window in the given screen will be focused.
|
||||
#focus-screen-n:
|
||||
# focus-screen-n:
|
||||
# focus-screen-<screen-number>:
|
||||
# mod: mod1
|
||||
# key: y
|
||||
@@ -197,12 +197,12 @@ swap-main:
|
||||
# key: i
|
||||
|
||||
# Select tall layout
|
||||
#select-tall-layout:
|
||||
# mod: mod1
|
||||
# key: a
|
||||
# select-tall-layout:
|
||||
# mod: mod1
|
||||
# key: a
|
||||
|
||||
# Select wide layout
|
||||
#select-wide-layout:
|
||||
# select-wide-layout:
|
||||
# mod: mod1
|
||||
# key: s
|
||||
|
||||
|
||||
@@ -6,21 +6,19 @@
|
||||
*
|
||||
* @param {Object} windows - All windows in the current space.
|
||||
* @param {Object} screenFrame - The frame of the current screen.
|
||||
* @param {Object} state - The state of the current space.
|
||||
* @param {Object} extendedFrames - The frames of the windows in the current space.
|
||||
* @return {Object} - The frames for the windows in the current space.
|
||||
*/
|
||||
function layout() {
|
||||
return {
|
||||
name: 'Almost Maximize',
|
||||
getFrameAssignments: (windows, screenFrame, state, extendedFrames) => {
|
||||
getFrameAssignments: (windows, screenFrame) => {
|
||||
const width = screenFrame.width * 0.95
|
||||
const height = screenFrame.height * 0.95
|
||||
const x = (screenFrame.width - width) / 2
|
||||
const y = (screenFrame.height - height) / 2
|
||||
const windowFrames = {}
|
||||
|
||||
windows.forEach(window => {
|
||||
windows.forEach((window) => {
|
||||
windowFrames[window.id] = {
|
||||
Y: screenFrame.y + y,
|
||||
x: screenFrame.x + x,
|
||||
@@ -33,3 +31,5 @@ function layout() {
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = layout()
|
||||
|
||||
71
config/cheat/cheatsheets/personal/printf
Normal file
71
config/cheat/cheatsheets/personal/printf
Normal file
@@ -0,0 +1,71 @@
|
||||
---
|
||||
tags: [printf, bash, zsh]
|
||||
---
|
||||
|
||||
# printf
|
||||
|
||||
The printf command accepts the following syntax:
|
||||
|
||||
`printf [-v var] [format specifiers] [arguments]`
|
||||
|
||||
- [-v var]
|
||||
The optional -v flag assigns the output to the [var]
|
||||
variable instead of printing it in standard output.
|
||||
|
||||
- [format specifiers]
|
||||
Format specifiers are strings that determine the methods of
|
||||
formatting specifiers. The following section includes a
|
||||
list of accepted specifiers.
|
||||
|
||||
- [arguments]
|
||||
Arguments can be any value or variable, and the [format specifiers]
|
||||
point to the [arguments]. If there are more arguments than format
|
||||
specifiers, the format string is reused until it interprets
|
||||
the last argument.
|
||||
|
||||
If there are fewer format specifiers than arguments, number formats
|
||||
are set to zero (0), while string formats are set to null (empty).
|
||||
|
||||
## printf Specifiers
|
||||
|
||||
Format Description
|
||||
------ -----------
|
||||
%c Treat the arguments as a single character.
|
||||
%d Treat the input as a decimal (integer) number (base 10).
|
||||
%e Treats the input as an exponential floating-point number.
|
||||
%f Treat the input as a floating-point number.
|
||||
%i Treat the input as an integer number (base 10).
|
||||
%o Treats the input as an octal number (base 8).
|
||||
%s Treat the input as a string of characters.
|
||||
%u Treat the input as an unsigned decimal (integer) number.
|
||||
%x Treats the input as a hexadecimal number (base 16).
|
||||
%% Print a percent sign.
|
||||
%Wd Print the W integer X digits wide.
|
||||
%(format)T Outputs a date-time string resulting from using format as a
|
||||
format string for strftime. The corresponding argument can
|
||||
be the number of seconds since Epoch (January 1, 1970, 00:00),
|
||||
-1 (the current time), or -2 (shell startup time).
|
||||
Not specifying an argument uses the current time as the default value.
|
||||
\% Print a percent sign.
|
||||
\n Prints a newline character.
|
||||
\t Print a tab character.
|
||||
|
||||
Some format specifiers accept format modifiers that modify their actions.
|
||||
Enter the modifiers between the % character and the character that
|
||||
specifies the format.
|
||||
|
||||
Available format modifiers are:
|
||||
|
||||
<N>. Enter a number that specifies a minimum field width.
|
||||
If the output text is shorter, it's padded with spaces.
|
||||
If the text is longer, the field expands.
|
||||
. (dot). When used with a field width modifier, the field doesn't
|
||||
expand for longer text. Instead, the text is truncated.
|
||||
-. Left-aligns the printed text. The default alignment is right.
|
||||
0. Pads the numbers with zeros instead of spaces.
|
||||
<space>. Pads a positive number with a space, and a negative
|
||||
number with a minus (-).
|
||||
+. Prints all numbers signed (+ for positive, - for negative).
|
||||
'. For decimal conversions, applies the thousands grouping
|
||||
separator to the integer portion of the output according
|
||||
to the current LC_NUMERIC file.
|
||||
@@ -3,11 +3,11 @@
|
||||
# editor: $EDITOR
|
||||
|
||||
# Should 'cheat' always colorize output?
|
||||
colorize: true
|
||||
colorize: false
|
||||
# Which 'chroma' colorscheme should be applied to the output?
|
||||
# Options are available here:
|
||||
# https://github.com/alecthomas/chroma/tree/master/styles
|
||||
style: 'catppuccin'
|
||||
# style: 'tokyonight-day'
|
||||
# Which 'chroma' "formatter" should be applied?
|
||||
# One of: "terminal", "terminal256", "terminal16m"
|
||||
formatter: terminal256
|
||||
@@ -61,12 +61,6 @@ cheatpaths:
|
||||
path: ~/.config/cheat/cheatsheets/community
|
||||
tags: [community]
|
||||
readonly: true
|
||||
# If you have personalized cheatsheets, list them last. They will take
|
||||
# precedence over the more global cheatsheets.
|
||||
- name: personal
|
||||
path: ~/.dotfiles/config/cheat/cheatsheets/personal
|
||||
tags: [personal]
|
||||
readonly: false
|
||||
- name: pure-bash-bible
|
||||
path: ~/.dotfiles/config/cheat/cheatsheets/pure-bash-bible
|
||||
tags: [pure-bash-bible]
|
||||
@@ -75,6 +69,12 @@ cheatpaths:
|
||||
path: ~/.dotfiles/config/cheat/cheatsheets/tldr/tldr
|
||||
tags: [tldr]
|
||||
readonly: true
|
||||
# If you have personalized cheatsheets, list them last. They will take
|
||||
# precedence over the more global cheatsheets.
|
||||
- name: personal
|
||||
path: ~/.dotfiles/config/cheat/cheatsheets/personal
|
||||
tags: [personal]
|
||||
readonly: false
|
||||
# While it requires no configuration here, it's also worth noting that
|
||||
# cheat will automatically append directories named '.cheat' within the
|
||||
# current working directory to the 'cheatpath'. This can be very useful if
|
||||
|
||||
@@ -56,11 +56,11 @@ TERM xterm*
|
||||
RESET 0 # reset to "normal" color
|
||||
DIR 01;34 # directory
|
||||
LINK 01;36 # symbolic link. (If you set this to 'target' instead of a
|
||||
# numerical value, the color is as for the file pointed to.)
|
||||
MULTIHARDLINK 00 # regular file with more than one link
|
||||
FIFO 40;33 # pipe
|
||||
SOCK 01;35 # socket
|
||||
DOOR 01;35 # door
|
||||
# numerical value, the color is as for the file pointed to.)
|
||||
MULTIHARDLINK 00 # regular file with more than one link
|
||||
FIFO 40;33 # pipe
|
||||
SOCK 01;35 # socket
|
||||
DOOR 01;35 # door
|
||||
BLK 40;33;01 # block device driver
|
||||
CHR 40;33;01 # character device driver
|
||||
ORPHAN 40;31;01 # symlink to nonexistent file, or non-stat'able file ...
|
||||
|
||||
490
config/exports
490
config/exports
@@ -2,48 +2,108 @@
|
||||
# shellcheck shell=bash
|
||||
# vim: filetype=zsh
|
||||
|
||||
# Set XDG directories if not already set
|
||||
# https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html
|
||||
[ -z "${XDG_CONFIG_HOME:-}" ] && export XDG_CONFIG_HOME="$HOME/.config"
|
||||
[ -z "${XDG_DATA_HOME:-}" ] && export XDG_DATA_HOME="$HOME/.local/share"
|
||||
[ -z "${XDG_CACHE_HOME:-}" ] && export XDG_CACHE_HOME="$HOME/.cache"
|
||||
[ -z "${XDG_STATE_HOME:-}" ] && export XDG_STATE_HOME="$HOME/.local/state"
|
||||
[ -z "${XDG_BIN_HOME:-}" ] && export XDG_BIN_HOME="$HOME/.local/bin"
|
||||
[ -z "${XDG_RUNTIME_DIR:-}" ] && export XDG_RUNTIME_DIR="$HOME/.local/run"
|
||||
|
||||
# if DOTFILES is not set, set it to the default location
|
||||
[ -z "${DOTFILES:-}" ] && export DOTFILES="$HOME/.dotfiles"
|
||||
|
||||
# Editor settings
|
||||
[ -z "${EDITOR:-}" ] && export EDITOR="nvim"
|
||||
[ -z "${VISUAL:-}" ] && export VISUAL="code"
|
||||
|
||||
# Bootstrap: ensure local/bin is on PATH so x-path is available
|
||||
PATH="$DOTFILES/local/bin:$PATH"
|
||||
# Use x-path to deduplicate PATH entries (only if x-path is available)
|
||||
if command -v x-path &> /dev/null; then
|
||||
# shellcheck source=../local/bin/x-path
|
||||
source "$(command -v x-path)"
|
||||
normalize_path_var
|
||||
do_prepend "$XDG_BIN_HOME" "$DOTFILES/local/bin" "/opt/homebrew/bin" "/usr/local/bin"
|
||||
fi
|
||||
export PATH
|
||||
|
||||
if ! command -v msg &> /dev/null; then
|
||||
# Function to print messages if VERBOSE is enabled
|
||||
# $1 - message (string)
|
||||
msg()
|
||||
{
|
||||
[[ $VERBOSE -eq 1 ]] && msgr msg "-> $1"
|
||||
return 0
|
||||
}
|
||||
fi
|
||||
|
||||
# Cache commands using bkt if installed
|
||||
if command -v bkt >&/dev/null; then
|
||||
if command -v bkt &> /dev/null; then
|
||||
bkt()
|
||||
{
|
||||
command bkt --cache-dir="$XDG_CACHE_HOME/bkt" "$@"
|
||||
}
|
||||
else
|
||||
# If bkt isn't installed skip its arguments and just execute directly.
|
||||
# If bkt isn't installed, skip its arguments and just execute directly.
|
||||
# Optionally write a msg to stderr suggesting users install bkt.
|
||||
bkt()
|
||||
{
|
||||
while [[ "$1" == --* ]]; do shift; done
|
||||
while [[ $1 == --* ]]; do shift; done
|
||||
"$@"
|
||||
}
|
||||
fi
|
||||
|
||||
# shorthand for checking if the system has the bin in path,
|
||||
# this version does not use caching
|
||||
# usage: have_command php && php -v
|
||||
# Shorthand for checking if the system has the bin in path,
|
||||
# this version does not use caching.
|
||||
# Usage: have_command php && php -v
|
||||
have_command()
|
||||
{
|
||||
command -v "$1" >&/dev/null
|
||||
[ -z "$1" ] && {
|
||||
echo "Usage: have_command <command>"
|
||||
return 1
|
||||
}
|
||||
|
||||
command -v "$1" &> /dev/null
|
||||
}
|
||||
|
||||
# shorthand for checking if the system has the bin in path,
|
||||
# this version uses caching
|
||||
# usage: have php && php -v
|
||||
# Shorthand for checking if the system has the bin in path,
|
||||
# this version uses caching.
|
||||
# Usage: have php && php -v
|
||||
have()
|
||||
{
|
||||
bkt -- which "$1" >&/dev/null
|
||||
bkt -- which "$1" &> /dev/null
|
||||
}
|
||||
|
||||
# Function to run dark-notify and change alacritty theme
|
||||
# It uses flock to prevent running multiple instances.
|
||||
# Install flock with `brew install flock` on macOS.
|
||||
darknotify_alacritty()
|
||||
{
|
||||
x-have flock && [[ -f /tmp/dark-notify-alacritty.lock ]] && return
|
||||
x-have dark-notify && {
|
||||
# subprocess is used to prevent the command from showing it was backgrounded
|
||||
(
|
||||
flock /tmp/dark-notify-alacritty.lock dark-notify \
|
||||
-c "$HOME/.dotfiles/local/bin/x-change-alacritty-theme" &
|
||||
) &> /dev/null
|
||||
}
|
||||
return 0
|
||||
}
|
||||
# darknotify_alacritty
|
||||
|
||||
# Function to list installed Homebrew packages using bkt caching
|
||||
brew_installed()
|
||||
{
|
||||
bkt -- brew list
|
||||
}
|
||||
|
||||
# shorthand for checking if brew package is installed
|
||||
# usage: have_brew php && php -v
|
||||
# Shorthand for checking if a Homebrew package is installed
|
||||
# Usage: have_brew php && php -v
|
||||
have_brew()
|
||||
{
|
||||
! x-have brew && return 125
|
||||
! have brew && return 125
|
||||
|
||||
if bkt -- brew list "$1" &> /dev/null; then
|
||||
return 0
|
||||
@@ -52,9 +112,403 @@ have_brew()
|
||||
fi
|
||||
}
|
||||
|
||||
if [[ -f "$DOTFILES/config/exports-secret" ]]; then
|
||||
source "$DOTFILES/config/exports-secret"
|
||||
# Alacritty preexec hook to update dynamic title
|
||||
preexec()
|
||||
{
|
||||
print -n -P "\e]0;$1%~\a"
|
||||
}
|
||||
|
||||
# Update dotfiles
|
||||
dfu()
|
||||
{
|
||||
(
|
||||
cd "$DOTFILES" && git rebase --ff --autostash && ./install
|
||||
)
|
||||
}
|
||||
|
||||
# Weather in Tampere, or other city
|
||||
weather()
|
||||
{
|
||||
# https://github.com/chubin/wttr.in#usage
|
||||
local city="${1:-Tampere}"
|
||||
curl "http://wttr.in/${city// /+}?2nFQM&lang=fi"
|
||||
}
|
||||
|
||||
# Docker
|
||||
ssh_docker()
|
||||
{
|
||||
docker exec -it "$@" bash
|
||||
}
|
||||
|
||||
# Rector project to php version 8.2 by default.
|
||||
rector()
|
||||
{
|
||||
local php="${1:-82}"
|
||||
docker run -v "$(pwd)":/project rector/rector:latest process \
|
||||
"/project/" \
|
||||
--set "php${php}" \
|
||||
--autoload-file /project/vendor/autoload.php
|
||||
}
|
||||
|
||||
# Commit everything
|
||||
commit()
|
||||
{
|
||||
local commitMessage="$*"
|
||||
|
||||
if [ -z "$commitMessage" ]; then
|
||||
commitMessage="Automated commit"
|
||||
fi
|
||||
|
||||
git add .
|
||||
git commit -a -m "$commitMessage"
|
||||
}
|
||||
|
||||
# Run Laravel scheduler in a loop
|
||||
scheduler()
|
||||
{
|
||||
while :; do
|
||||
php artisan schedule:run
|
||||
echo "Sleeping 60 seconds..."
|
||||
sleep 60
|
||||
done
|
||||
}
|
||||
|
||||
# Run command silently
|
||||
# Usage: silent uptime
|
||||
silent()
|
||||
{
|
||||
"$@" >&/dev/null
|
||||
}
|
||||
|
||||
# Check if a file contains non-ascii characters
|
||||
nonascii()
|
||||
{
|
||||
LC_ALL=C grep -n '[^[:print:][:space:]]' "${@}"
|
||||
}
|
||||
|
||||
# Remove non-ascii characters from string
|
||||
# Usage: strip_nonascii "string"
|
||||
strip_nonascii()
|
||||
{
|
||||
# shellcheck disable=SC2001
|
||||
echo "$1" | LC_ALL=C sed 's/[^[:print:][:space:]]//g'
|
||||
}
|
||||
|
||||
# Slugify a string
|
||||
# Usage: slugify "string"
|
||||
slugify()
|
||||
{
|
||||
echo "$1" | iconv -t ascii//TRANSLIT | sed -r s/[^a-zA-Z0-9]+/-/g | sed -r s/^-+\|-+$//g | tr '[:upper:]' '[:lower:]'
|
||||
}
|
||||
|
||||
# https://stackoverflow.com/a/85932
|
||||
fn_exists()
|
||||
{
|
||||
declare -f -F "$1" > /dev/null
|
||||
return $?
|
||||
}
|
||||
|
||||
# Creates a random string
|
||||
rnd()
|
||||
{
|
||||
echo $RANDOM | md5sum | head -c 20
|
||||
}
|
||||
|
||||
# return sha256sum for file
|
||||
# $1 - filename (string)
|
||||
get_sha256sum()
|
||||
{
|
||||
sha256sum "$1" | head -c 64
|
||||
}
|
||||
|
||||
# Replaceable file
|
||||
#
|
||||
# $1 - filename (string)
|
||||
# $2 - filename (string)
|
||||
#
|
||||
# Returns 1 when replaceable, 0 when not replaceable.
|
||||
replaceable()
|
||||
{
|
||||
FILE1="$1"
|
||||
FILE2="$2"
|
||||
|
||||
[[ ! -r $FILE1 ]] && {
|
||||
[[ $VERBOSE -eq 1 ]] && msgr err "File 1 ($FILE1) does not exist"
|
||||
return 0
|
||||
}
|
||||
[[ ! -r $FILE2 ]] && {
|
||||
[[ $VERBOSE -eq 1 ]] && msgr err "File 2 ($FILE2) does not exist, replaceable"
|
||||
return 1
|
||||
}
|
||||
|
||||
FILE1_HASH=$(get_sha256sum "$FILE1")
|
||||
FILE2_HASH=$(get_sha256sum "$FILE2")
|
||||
|
||||
[[ $FILE1_HASH == "" ]] && {
|
||||
[[ $VERBOSE -eq 1 ]] && msgr err "Could not get hash for file 1 ($FILE1)"
|
||||
return 0
|
||||
}
|
||||
[[ $FILE2_HASH == "" ]] && {
|
||||
[[ $VERBOSE -eq 1 ]] && msgr err "Could not get hash for file 2 ($FILE2), replaceable"
|
||||
return 1
|
||||
}
|
||||
|
||||
[[ $FILE1_HASH == "$FILE2_HASH" ]] && {
|
||||
[[ $VERBOSE -eq 1 ]] && msgr ok "Files match, not replaceable: $FILE1"
|
||||
return 0
|
||||
}
|
||||
|
||||
[[ $VERBOSE -eq 1 ]] && msgr warn "Files do not match ($FILE1_HASH != $FILE2_HASH), replaceable"
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
export COMPLETION_WAITING_DOTS=true
|
||||
|
||||
# Bash completion file location
|
||||
export BASH_COMPLETION_USER_FILE="${XDG_CONFIG_HOME}/bash-completion/bash_completion"
|
||||
|
||||
# History env variables
|
||||
export HIST_STAMPS="yyyy-mm-dd"
|
||||
export HISTFILE="${XDG_STATE_HOME}/zsh/history"
|
||||
# Larger bash history (allow 32³ entries; default is 500)
|
||||
export HISTSIZE=32768
|
||||
export HISTFILESIZE=$HISTSIZE
|
||||
# don't put duplicate lines or lines starting with space in the history.
|
||||
# See bash(1) for more options
|
||||
export HISTCONTROL=ignoreboth
|
||||
# Make some commands not show up in history
|
||||
export HISTIGNORE="ls:cd:cd -:pwd:exit:date:* --help"
|
||||
# And include the parameter for ZSH
|
||||
export HISTORY_IGNORE="(ls|cd|cd -|pwd|exit|date|* --help)"
|
||||
|
||||
# Less history location
|
||||
export LESSHISTFILE="$XDG_STATE_HOME"/less/history
|
||||
|
||||
# Highlight section titles in manual pages
|
||||
# export LESS_TERMCAP_md="$ORANGE"
|
||||
|
||||
# zsh autoloaded terminfo
|
||||
# export TERMINFO="${XDG_DATA_HOME}/terminfo"
|
||||
# export TERMINFO_DIRS="${XDG_DATA_HOME}/terminfo":/usr/share/terminfo
|
||||
|
||||
# Don't clear the screen after quitting a manual page
|
||||
export MANPAGER="less -X"
|
||||
|
||||
# Always enable colored `grep` output
|
||||
# Note: GREP_OPTIONS is deprecated since GNU grep 2.21
|
||||
# Color is handled via alias in config/alias
|
||||
|
||||
# check the window size after each command and, if necessary,
|
||||
# update the values of LINES and COLUMNS.
|
||||
hash shopt 2> /dev/null && shopt -s checkwinsize
|
||||
|
||||
# shellcheck disable=SC2155
|
||||
export SHORT_HOST=$(hostname -s)
|
||||
|
||||
# Antidote configuration
|
||||
# https://getantidote.github.io/
|
||||
msg "Setting up Antidote configuration"
|
||||
export ANTIDOTE_DIR="$DOTFILES/tools/antidote"
|
||||
export ANTIDOTE_HOME="$XDG_CACHE_HOME/antidote"
|
||||
export ANTIDOTE_PLUGINS="$XDG_CONFIG_HOME/zsh/antidote_plugins"
|
||||
|
||||
# Ansible configuration
|
||||
# https://docs.ansible.com/ansible/latest/reference_appendices/config.html
|
||||
msg "Setting up Ansible configuration"
|
||||
export ANSIBLE_HOME="$XDG_CONFIG_HOME/ansible"
|
||||
export ANSIBLE_CONFIG="$ANSIBLE_HOME/ansible.cfg"
|
||||
export ANSIBLE_GALAXY_CACHE_DIR="$XDG_CACHE_HOME/ansible/galaxy_cache"
|
||||
x-dc "$ANSIBLE_HOME"
|
||||
x-dc "$ANSIBLE_GALAXY_CACHE_DIR"
|
||||
|
||||
# aws
|
||||
# https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html
|
||||
# https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html
|
||||
# https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html
|
||||
msg "Setting up AWS configuration"
|
||||
export AWS_CONFIG_FILE="${XDG_STATE_HOME}/aws/config"
|
||||
export AWS_SHARED_CREDENTIALS_FILE="${XDG_STATE_HOME}/aws/credentials"
|
||||
export AWS_DATA_PATH="${XDG_DATA_HOME}/aws"
|
||||
export AWS_DEFAULT_REGION="eu-west-1"
|
||||
export AWS_DEFAULT_OUTPUT="table"
|
||||
export AWS_CONFIGURE_KEYS=true
|
||||
export AWS_CONFIGURE_REGION=true
|
||||
export AWS_CONFIGURE_OUTPUT=true
|
||||
export AWS_CONFIGURE_PROFILE=true
|
||||
export AWS_CONFIGURE_PROMPT=true
|
||||
export AWS_CONFIGURE_PROMPT_DEFAULT="default"
|
||||
export AWS_SESSION_TOKEN_FILE="${XDG_STATE_HOME}/aws/session_token"
|
||||
export AWS_CONFIGURE_SESSION=true
|
||||
export AWS_CONFIGURE_SESSION_DURATION=7200
|
||||
export AWS_CONFIGURE_SESSION_MFA=true
|
||||
|
||||
# Mason (nvim package manager)
|
||||
msg "Setting up Mason configuration"
|
||||
export MASON_HOME="$XDG_DATA_HOME/nvim/mason"
|
||||
|
||||
# Neovim environment variables
|
||||
msg "Setting up Neovim configuration"
|
||||
[ -z "${NVIM_STATE:-}" ] && export NVIM_STATE="$XDG_STATE_HOME/nvim"
|
||||
[ -z "${NVIM_CONFIG_HOME:-}" ] && export NVIM_CONFIG_HOME="$XDG_CONFIG_HOME/nvim"
|
||||
[ -z "${NVIM_DATA_HOME:-}" ] && export NVIM_DATA_HOME="$XDG_DATA_HOME/nvim"
|
||||
[ -z "${NVIM_CACHE_HOME:-}" ] && export NVIM_CACHE_HOME="$XDG_CACHE_HOME/nvim"
|
||||
[ -z "${NVIM_LOG_PATH:-}" ] && export NVIM_LOG_PATH="$NVIM_STATE/log"
|
||||
[ -z "${NVIM_SESSION_PATH:-}" ] && export NVIM_SESSION_PATH="$NVIM_STATE/session"
|
||||
[ -z "${NVIM_SHADA_PATH:-}" ] && export NVIM_SHADA_PATH="$NVIM_STATE/shada"
|
||||
[ -z "${NVIM_UNDO_PATH:-}" ] && export NVIM_UNDO_PATH="$NVIM_STATE/undo"
|
||||
|
||||
# bkt (shell command caching tool) configuration
|
||||
msg "Setting up bkt configuration"
|
||||
export BKT_TTL=1m
|
||||
|
||||
# brew, https://docs.brew.sh/Manpage
|
||||
msg "Setting up Homebrew configuration"
|
||||
export HOMEBREW_NO_ANALYTICS=true
|
||||
export HOMEBREW_NO_ENV_HINTS=true
|
||||
export HOMEBREW_BUNDLE_MAS_SKIP=true
|
||||
export HOMEBREW_BUNDLE_FILE="$XDG_CONFIG_HOME/homebrew/Brewfile"
|
||||
x-have brew && {
|
||||
eval "$(brew shellenv)"
|
||||
}
|
||||
|
||||
# composer, https://getcomposer.org/
|
||||
msg "Setting up Composer configuration"
|
||||
export COMPOSER_HOME="$XDG_STATE_HOME/composer"
|
||||
export COMPOSER_BIN="$COMPOSER_HOME/vendor/bin"
|
||||
export PATH="$COMPOSER_BIN:$PATH"
|
||||
|
||||
# Yarn
|
||||
msg "Setting up Yarn configuration"
|
||||
export YARN_GLOBAL_FOLDER="$XDG_DATA_HOME/yarn"
|
||||
|
||||
# docker, https://docs.docker.com/engine/reference/commandline/cli/
|
||||
msg "Setting up Docker configuration"
|
||||
export DOCKER_CONFIG="${XDG_CONFIG_HOME}/docker"
|
||||
x-dc "$DOCKER_CONFIG"
|
||||
# Docker: Disable snyk ad
|
||||
export DOCKER_SCAN_SUGGEST=false
|
||||
export DOCKER_HIDE_LEGACY_COMMANDS=true
|
||||
|
||||
# direnv
|
||||
msg "Setting up direnv configuration"
|
||||
export DIRENV_LOG_FORMAT=""
|
||||
|
||||
# fzf
|
||||
export FZF_BASE="${XDG_CONFIG_HOME}/fzf"
|
||||
export FZF_DEFAULT_OPTS='--height 40% --tmux bottom,40% --layout reverse --border top'
|
||||
|
||||
# GnuPG
|
||||
# https://gnupg.org/documentation/manuals/gnupg/Invoking-GPG.html
|
||||
msg "Setting up GnuPG configuration"
|
||||
export GNUPGHOME="${XDG_DATA_HOME}/gnupg"
|
||||
|
||||
# Go
|
||||
# https://golang.org/doc/code.html
|
||||
msg "Setting up Go configuration"
|
||||
export GOPATH="$XDG_DATA_HOME/go"
|
||||
export GOBIN="$XDG_BIN_HOME"
|
||||
|
||||
# Lando
|
||||
export PATH="$HOME/.lando/bin${PATH+:$PATH}" #landopath
|
||||
|
||||
# oh-my-posh (omp) configuration
|
||||
msg "Setting up oh-my-posh configuration"
|
||||
export OHMYPOSH_CFG="$DOTFILES/config/omp/own.toml"
|
||||
|
||||
# op (1Password cli) is present
|
||||
msg "Setting up 1Password CLI configuration"
|
||||
export OP_CACHE="$XDG_STATE_HOME/1password"
|
||||
|
||||
# Python
|
||||
msg "Setting up Python configuration"
|
||||
export WORKON_HOME="$XDG_DATA_HOME/virtualenvs"
|
||||
## for MichaelAquilina/zsh-autoswitch-virtualenv
|
||||
export AUTOSWITCH_VIRTUAL_ENV_DIR="$WORKON_HOME"
|
||||
|
||||
# Rust / cargo
|
||||
msg "Setting up Rust/Cargo configuration"
|
||||
export CARGO_HOME="$XDG_DATA_HOME/cargo"
|
||||
export CARGO_BIN_HOME="$XDG_BIN_HOME"
|
||||
export RUSTUP_HOME="$XDG_DATA_HOME/rustup"
|
||||
export RUST_WITHOUT="clippy,docs,rls"
|
||||
|
||||
# Poetry
|
||||
msg "Setting up Poetry configuration"
|
||||
export POETRY_HOME="$XDG_DATA_HOME/poetry"
|
||||
|
||||
# sonarlint
|
||||
# https://www.sonarlint.org/
|
||||
msg "Setting up Sonarlint configuration"
|
||||
export SONARLINT_USER_HOME="$XDG_DATA_HOME/sonarlint"
|
||||
|
||||
# terraform
|
||||
# https://www.terraform.io/docs/cli/config/config-file.html
|
||||
# https://www.terraform.io/docs/cli/config/environment-variables.html
|
||||
msg "Setting up Terraform configuration"
|
||||
export TF_DATA_DIR="$XDG_STATE_HOME/terraform"
|
||||
export TF_CLI_CONFIG_FILE="$XDG_CONFIG_HOME/terraform/terraformrc"
|
||||
export TF_PLUGIN_CACHE_DIR="$XDG_CACHE_HOME/terraform/plugin-cache"
|
||||
|
||||
# tmux
|
||||
# https://tmux.github.io/
|
||||
msg "Setting up tmux configuration"
|
||||
export TMUX_TMPDIR="$XDG_STATE_HOME/tmux"
|
||||
export TMUX_CONF_DIR="$XDG_CONFIG_HOME/tmux"
|
||||
export TMUX_PLUGINS="$TMUX_CONF_DIR/plugins"
|
||||
export TMUX_CONF="$TMUX_CONF_DIR/tmux.conf"
|
||||
## These settings are for zsh-tmux
|
||||
export ZSH_TMUX_AUTOSTART=true
|
||||
export ZSH_TMUX_CONFIG="$TMUX_CONF"
|
||||
export ZSH_TMUX_UNICODE=true
|
||||
export ZSH_TMUX_AUTOQUIT=false
|
||||
export ZSH_TMUX_DEFAULT_SESSION_NAME=main
|
||||
|
||||
# tms (tmux session manager)
|
||||
msg "Setting up tms configuration"
|
||||
export TMS_CONFIG_FILE="$XDG_CONFIG_HOME/tms/config.toml"
|
||||
|
||||
# wakatime, https://github.com/wakatime/wakatime-cli
|
||||
msg "Setting up Wakatime configuration"
|
||||
export WAKATIME_HOME="$XDG_STATE_HOME/wakatime"
|
||||
x-dc "$WAKATIME_HOME"
|
||||
|
||||
# LM Studio CLI
|
||||
msg "Setting up LM Studio configuration"
|
||||
export PATH="$PATH:$HOME/.lmstudio/bin"
|
||||
|
||||
# Screen
|
||||
msg "Setting up screen configuration"
|
||||
export SCREENRC="$XDG_CONFIG_HOME/misc/screenrc"
|
||||
|
||||
# Zoxide
|
||||
msg "Setting up Zoxide configuration"
|
||||
export _ZO_DATA_DIR="$XDG_DATA_HOME/zoxide"
|
||||
export _ZO_EXCLUDE_DIRS="$XDG_DATA_HOME"
|
||||
|
||||
# Misc
|
||||
msg "Setting up miscellaneous configuration"
|
||||
export ZSHZ_DATA="$XDG_STATE_HOME/z"
|
||||
export CHEAT_USE_FZF=true
|
||||
export SQLITE_HISTORY="${XDG_CACHE_HOME}/sqlite_history"
|
||||
|
||||
# Additional PATH entries (aligned with fish config)
|
||||
[ -d "$XDG_DATA_HOME/mise/shims" ] && export PATH="$XDG_DATA_HOME/mise/shims:$PATH"
|
||||
[ -d "$YARN_GLOBAL_FOLDER/bin" ] && export PATH="$PATH:$YARN_GLOBAL_FOLDER/bin"
|
||||
[ -d "$MASON_HOME/bin" ] && export PATH="$PATH:$MASON_HOME/bin"
|
||||
[ -d "$HOME/.dotnet/tools" ] && export PATH="$PATH:$HOME/.dotnet/tools"
|
||||
[ -d "$POETRY_HOME/bin" ] && export PATH="$PATH:$POETRY_HOME/bin"
|
||||
[ -d "$HOME/.opencode/bin" ] && export PATH="$PATH:$HOME/.opencode/bin"
|
||||
|
||||
# mise — unified tool version manager
|
||||
# https://mise.jdx.dev
|
||||
if command -v mise &> /dev/null; then
|
||||
eval "$(mise activate bash)"
|
||||
fi
|
||||
|
||||
source "$DOTFILES/config/exports-shell"
|
||||
source "$DOTFILES/config/exports-apps"
|
||||
if [ -f "$XDG_CONFIG_HOME/exports-secret" ]; then source "$XDG_CONFIG_HOME/exports-secret"; fi
|
||||
if [ -f "$XDG_CONFIG_HOME/exports-local" ]; then source "$XDG_CONFIG_HOME/exports-local"; fi
|
||||
# shellcheck source=./exports-lakka
|
||||
if [ -f "$XDG_CONFIG_HOME/exports-$(hostname)" ]; then source "$XDG_CONFIG_HOME/exports-$(hostname)"; fi
|
||||
# shellcheck source=./exports-lakka-secret
|
||||
if [ -f "$XDG_CONFIG_HOME/exports-$(hostname)-secret" ]; then source "$XDG_CONFIG_HOME/exports-$(hostname)-secret"; fi
|
||||
|
||||
@@ -1,134 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
# shellcheck shell=bash
|
||||
# shellcheck enable=external-sources
|
||||
# shellcheck disable=1091,2139
|
||||
# vim: filetype=bash
|
||||
|
||||
# Antigen configuration
|
||||
# https://github.com/zsh-users/antigen/wiki/Configuration
|
||||
export ADOTDIR="$XDG_DATA_HOME/antigen"
|
||||
export ANTIGEN_CACHE="$XDG_CACHE_HOME/antigen"
|
||||
export ANTIGEN_SYSTEM_RECEIPT_F=".local/share/antigen/antigen_system_lastupdate"
|
||||
export ANTIGEN_PLUGIN_RECEIPT_F=".local/share/antigen/antigen_plugin_lastupdate"
|
||||
|
||||
# Ansible configuration
|
||||
# https://docs.ansible.com/ansible/latest/reference_appendices/config.html
|
||||
export ANSIBLE_HOME="$XDG_CONFIG_HOME/ansible"
|
||||
export ANSIBLE_CONFIG="$XDG_CONFIG_HOME/ansible.cfg"
|
||||
export ANSIBLE_GALAXY_CACHE_DIR="$XDG_CACHE_HOME/ansible/galaxy_cache"
|
||||
x-dc "$ANSIBLE_HOME"
|
||||
x-dc "$ANSIBLE_GALAXY_CACHE_DIR"
|
||||
|
||||
export ANDROID_HOME="$XDG_DATA_HOME/android"
|
||||
|
||||
# bob manages nvim versions
|
||||
export PATH="$XDG_DATA_HOME/bob/nvim-bin:$PATH"
|
||||
|
||||
# bkt (shell command caching tool) configuration
|
||||
export BKT_TTL=1m
|
||||
|
||||
# brew, https://docs.brew.sh/Manpage
|
||||
export HOMEBREW_NO_ENV_HINTS=true
|
||||
export HOMEBREW_BUNDLE_MAS_SKIP=true
|
||||
export HOMEBREW_BUNDLE_FILE="$XDG_CONFIG_HOME/homebrew/Brewfile"
|
||||
|
||||
# composer, https://getcomposer.org/
|
||||
export COMPOSER_HOME="$XDG_STATE_HOME/composer"
|
||||
export COMPOSER_BIN="$COMPOSER_HOME/vendor/bin"
|
||||
export PATH="$COMPOSER_BIN:$PATH"
|
||||
|
||||
# docker, https://docs.docker.com/engine/reference/commandline/cli/
|
||||
export DOCKER_CONFIG="$XDG_CONFIG_HOME/docker"
|
||||
x-dc "$DOCKER_CONFIG"
|
||||
# Docker: Disable snyk ad
|
||||
export DOCKER_SCAN_SUGGEST=false
|
||||
|
||||
# ffmpeg
|
||||
export FFMPEG_DATADIR="$XDG_CONFIG_HOME/ffmpeg"
|
||||
x-have ffmpeg && x-dc "$FFMPEG_DATADIR"
|
||||
|
||||
# GnuPG
|
||||
export GNUPGHOME="$XDG_DATA_HOME/gnupg"
|
||||
|
||||
# Go
|
||||
export GOPATH="$XDG_DATA_HOME/go"
|
||||
export GOBIN="$XDG_BIN_HOME"
|
||||
|
||||
# Herd, herd.laravel.com
|
||||
# Herd injected PHP binary.
|
||||
export PATH="$HOME/Library/Application Support/Herd/bin/":$PATH
|
||||
|
||||
x-have herd && {
|
||||
# Herd injected PHP 8.3 configuration.
|
||||
export HERD_PHP_83_INI_SCAN_DIR="$HOME/Library/Application Support/Herd/config/php/83/"
|
||||
# Herd injected PHP 7.4 configuration.
|
||||
export HERD_PHP_74_INI_SCAN_DIR="$HOME/Library/Application Support/Herd/config/php/74/"
|
||||
}
|
||||
|
||||
# nb, https://xwmx.github.io/nb/
|
||||
export NBRC_PATH="$XDG_CONFIG_HOME/nbrc"
|
||||
export NB_DIR="$XDG_STATE_HOME/nb"
|
||||
|
||||
# NPM: Add npm packages to path
|
||||
x-have node && {
|
||||
NVM_NODE_BIN_DIR="$(dirname "$(which node)")"
|
||||
export PATH="$NVM_NODE_BIN_DIR:$PATH"
|
||||
}
|
||||
|
||||
# op (1Password cli) is present
|
||||
export OP_CACHE="$XDG_STATE_HOME/1password"
|
||||
|
||||
# Python
|
||||
#
|
||||
# pyenv, python environments
|
||||
export WORKON_HOME="$XDG_DATA_HOME/virtualenvs"
|
||||
export PYENV_ROOT="$XDG_STATE_HOME/pyenv"
|
||||
export PATH="$PYENV_ROOT/bin:$PYENV_ROOT/shims:$PATH"
|
||||
x-have pyenv && {
|
||||
eval "$(pyenv init -)"
|
||||
}
|
||||
|
||||
# Ruby
|
||||
#
|
||||
# including: bundler, rbenv
|
||||
export GEM_HOME="${XDG_DATA_HOME}"/gem
|
||||
export GEM_SPEC_CACHE="${XDG_CACHE_HOME}"/gem
|
||||
export BUNDLE_USER_CONFIG="$XDG_CONFIG_HOME"/bundle
|
||||
export BUNDLE_USER_CACHE="$XDG_CACHE_HOME"/bundle
|
||||
export BUNDLE_USER_PLUGIN="$XDG_DATA_HOME"/bundle
|
||||
export RBENV_ROOT="$XDG_STATE_HOME/rbenv"
|
||||
x-dc "$RBENV_ROOT"
|
||||
x-have gem && export PATH="${GEM_HOME}/bin:$PATH"
|
||||
|
||||
# Rust / cargo
|
||||
export RUSTUP_HOME="$XDG_DATA_HOME/rustup"
|
||||
export CARGO_HOME="$XDG_DATA_HOME/cargo"
|
||||
export PATH="$CARGO_HOME/bin:$PATH"
|
||||
|
||||
# screen
|
||||
export SCREENRC="$XDG_CONFIG_HOME/misc/screenrc"
|
||||
|
||||
# sonarlint
|
||||
export SONARLINT_USER_HOME="$XDG_DATA_HOME/sonarlint"
|
||||
|
||||
# terraform
|
||||
# https://www.terraform.io/docs/cli/config/config-file.html
|
||||
# https://www.terraform.io/docs/cli/config/environment-variables.html
|
||||
export TF_DATA_DIR="$XDG_STATE_HOME/terraform"
|
||||
export TF_CLI_CONFIG_FILE="$XDG_CONFIG_HOME/terraform/terraformrc"
|
||||
export TF_PLUGIN_CACHE_DIR="$XDG_CACHE_HOME/terraform/plugin-cache"
|
||||
|
||||
# tldr / tealdeer
|
||||
export TEALDEER_CONFIG_DIR="$XDG_CONFIG_HOME/tealdeer/"
|
||||
|
||||
# tmux
|
||||
export TMUX_CONF="$XDG_CONFIG_HOME/tmux/tmux.conf"
|
||||
|
||||
# wakatime, https://github.com/wakatime/wakatime-cli
|
||||
export WAKATIME_HOME="$XDG_STATE_HOME/wakatime"
|
||||
x-dc "$WAKATIME_HOME"
|
||||
|
||||
# Misc
|
||||
export BAT_THEME="ansi"
|
||||
export CHEAT_USE_FZF=true
|
||||
export SQLITE_HISTORY="$XDG_CACHE_HOME"/sqlite_history
|
||||
@@ -1,19 +1,24 @@
|
||||
# lakka exports
|
||||
|
||||
## LUA
|
||||
x-have luarocks && $(luarocks path --bin)
|
||||
if command -v luarocks &> /dev/null; then
|
||||
eval "$(luarocks path --bin)"
|
||||
fi
|
||||
|
||||
export PATH="$HOME/.local/go/bin:$PATH"
|
||||
|
||||
alias logrotate='/usr/sbin/logrotate -s $HOME/logs/state'
|
||||
alias nano='nano -wS -$'
|
||||
alias logrotate='/usr/sbin/logrotate -s "$HOME/logs/state"'
|
||||
alias gpg=gpg2
|
||||
|
||||
ACME_PATH="$HOME/.acme.sh"
|
||||
# shellcheck source=$HOME/.acme.sh/acme.sh.env
|
||||
[[ -s "$ACME_PATH/acme.sh.env" ]] && . "$ACME_PATH/acme.sh.env"
|
||||
if [[ -s "$ACME_PATH/acme.sh.env" ]]; then
|
||||
source "$ACME_PATH/acme.sh.env"
|
||||
fi
|
||||
|
||||
export RVM_PATH="$HOME/.rvm"
|
||||
export PATH="$RVM_PATH/bin:$PATH"
|
||||
# shellcheck source=$HOME/.rvm/scripts/rvm
|
||||
[[ -s "$RVM_PATH/scripts/rvm" ]] && source "$RVM_PATH/scripts/rvm" # Load RVM into a shell session *as a function*
|
||||
if [[ -s "$RVM_PATH/scripts/rvm" ]]; then
|
||||
source "$RVM_PATH/scripts/rvm" # Load RVM into a shell session *as a function*
|
||||
fi
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
#!/usr/bin/env bash
|
||||
#
|
||||
# This file is secret and wont be added to the git repo.
|
||||
|
||||
export GITLAB_API_TOKEN=""
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user