From b3493e371cd58f87ac76180b4135de425fdb58fa Mon Sep 17 00:00:00 2001 From: Silberengel Date: Wed, 18 Feb 2026 19:21:49 +0100 Subject: [PATCH] display readme by default display commit history --- package-lock.json | 272 ++++-------------- package.json | 3 + src/lib/components/CodeEditor.svelte | 102 ++++--- src/lib/services/git/repo-manager.ts | 4 +- src/lib/services/messaging/event-forwarder.ts | 2 +- .../messaging/preferences-storage.server.ts | 4 +- src/lib/services/nostr/repo-polling.ts | 2 +- src/routes/repos/[npub]/[repo]/+page.svelte | 105 +++++-- 8 files changed, 210 insertions(+), 284 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5dbcce8..357c129 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,9 +8,12 @@ "name": "gitrepublic-web", "version": "0.1.0", "dependencies": { + "@codemirror/autocomplete": "^6.20.0", "@codemirror/basic-setup": "^0.20.0", + "@codemirror/commands": "^6.10.1", "@codemirror/lang-markdown": "^6.5.0", "@codemirror/language": "^6.12.1", + "@codemirror/search": "^6.6.0", "@codemirror/state": "^6.5.4", "@codemirror/view": "^6.39.14", "@sveltejs/kit": "^2.0.0", @@ -170,66 +173,23 @@ } }, "node_modules/@codemirror/autocomplete": { - "version": "0.20.3", - "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-0.20.3.tgz", - "integrity": "sha512-lYB+NPGP+LEzAudkWhLfMxhTrxtLILGl938w+RcFrGdrIc54A+UgmCoz+McE3IYRFp4xyQcL4uFJwo+93YdgHw==", - "license": "MIT", - "dependencies": { - "@codemirror/language": "^0.20.0", - "@codemirror/state": "^0.20.0", - "@codemirror/view": "^0.20.0", - "@lezer/common": "^0.16.0" - } - }, - "node_modules/@codemirror/autocomplete/node_modules/@codemirror/language": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-0.20.2.tgz", - "integrity": "sha512-WB3Bnuusw0xhVvhBocieYKwJm04SOk5bPoOEYksVHKHcGHFOaYaw+eZVxR4gIqMMcGzOIUil0FsCmFk8yrhHpw==", + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.0.tgz", + "integrity": "sha512-bOwvTOIJcG5FVo5gUUupiwYh8MioPLQ4UcqbcRf7UQ98X90tCa9E1kZ3Z7tqwpZxYyOvh1YTYbmZE9RTfTp5hg==", "license": "MIT", "dependencies": { - "@codemirror/state": "^0.20.0", - "@codemirror/view": "^0.20.0", - "@lezer/common": "^0.16.0", - "@lezer/highlight": "^0.16.0", - "@lezer/lr": "^0.16.0", - "style-mod": "^4.0.0" + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0" } }, - "node_modules/@codemirror/autocomplete/node_modules/@codemirror/state": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-0.20.1.tgz", - "integrity": "sha512-ms0tlV5A02OK0pFvTtSUGMLkoarzh1F8mr6jy1cD7ucSC2X/VLHtQCxfhdSEGqTYlQF2hoZtmLv+amqhdgbwjQ==", + "node_modules/@codemirror/autocomplete/node_modules/@lezer/common": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.5.1.tgz", + "integrity": "sha512-6YRVG9vBkaY7p1IVxL4s44n5nUnaNnGM2/AckNgYOnxTG2kWh1vR8BMxPseWPjRNpb5VtXnMpeYAEAADoRV1Iw==", "license": "MIT" }, - "node_modules/@codemirror/autocomplete/node_modules/@codemirror/view": { - "version": "0.20.7", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-0.20.7.tgz", - "integrity": "sha512-pqEPCb9QFTOtHgAH5XU/oVy9UR/Anj6r+tG5CRmkNVcqSKEPmBU05WtN/jxJCFZBXf6HumzWC9ydE4qstO3TxQ==", - "license": "MIT", - "dependencies": { - "@codemirror/state": "^0.20.0", - "style-mod": "^4.0.0", - "w3c-keyname": "^2.2.4" - } - }, - "node_modules/@codemirror/autocomplete/node_modules/@lezer/highlight": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-0.16.0.tgz", - "integrity": "sha512-iE5f4flHlJ1g1clOStvXNLbORJoiW4Kytso6ubfYzHnaNo/eo5SKhxs4wv/rtvwZQeZrK3we8S9SyA7OGOoRKQ==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^0.16.0" - } - }, - "node_modules/@codemirror/autocomplete/node_modules/@lezer/lr": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-0.16.3.tgz", - "integrity": "sha512-pau7um4eAw94BEuuShUIeQDTf3k4Wt6oIUOYxMmkZgDHdqtIcxWND4LRxi8nI9KuT4I1bXQv67BCapkxt7Ywqw==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^0.16.0" - } - }, "node_modules/@codemirror/basic-setup": { "version": "0.20.0", "resolved": "https://registry.npmjs.org/@codemirror/basic-setup/-/basic-setup-0.20.0.tgz", @@ -246,56 +206,19 @@ "@codemirror/view": "^0.20.0" } }, - "node_modules/@codemirror/basic-setup/node_modules/@codemirror/language": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-0.20.2.tgz", - "integrity": "sha512-WB3Bnuusw0xhVvhBocieYKwJm04SOk5bPoOEYksVHKHcGHFOaYaw+eZVxR4gIqMMcGzOIUil0FsCmFk8yrhHpw==", + "node_modules/@codemirror/basic-setup/node_modules/@codemirror/autocomplete": { + "version": "0.20.3", + "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-0.20.3.tgz", + "integrity": "sha512-lYB+NPGP+LEzAudkWhLfMxhTrxtLILGl938w+RcFrGdrIc54A+UgmCoz+McE3IYRFp4xyQcL4uFJwo+93YdgHw==", "license": "MIT", "dependencies": { + "@codemirror/language": "^0.20.0", "@codemirror/state": "^0.20.0", "@codemirror/view": "^0.20.0", - "@lezer/common": "^0.16.0", - "@lezer/highlight": "^0.16.0", - "@lezer/lr": "^0.16.0", - "style-mod": "^4.0.0" - } - }, - "node_modules/@codemirror/basic-setup/node_modules/@codemirror/state": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-0.20.1.tgz", - "integrity": "sha512-ms0tlV5A02OK0pFvTtSUGMLkoarzh1F8mr6jy1cD7ucSC2X/VLHtQCxfhdSEGqTYlQF2hoZtmLv+amqhdgbwjQ==", - "license": "MIT" - }, - "node_modules/@codemirror/basic-setup/node_modules/@codemirror/view": { - "version": "0.20.7", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-0.20.7.tgz", - "integrity": "sha512-pqEPCb9QFTOtHgAH5XU/oVy9UR/Anj6r+tG5CRmkNVcqSKEPmBU05WtN/jxJCFZBXf6HumzWC9ydE4qstO3TxQ==", - "license": "MIT", - "dependencies": { - "@codemirror/state": "^0.20.0", - "style-mod": "^4.0.0", - "w3c-keyname": "^2.2.4" - } - }, - "node_modules/@codemirror/basic-setup/node_modules/@lezer/highlight": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-0.16.0.tgz", - "integrity": "sha512-iE5f4flHlJ1g1clOStvXNLbORJoiW4Kytso6ubfYzHnaNo/eo5SKhxs4wv/rtvwZQeZrK3we8S9SyA7OGOoRKQ==", - "license": "MIT", - "dependencies": { "@lezer/common": "^0.16.0" } }, - "node_modules/@codemirror/basic-setup/node_modules/@lezer/lr": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-0.16.3.tgz", - "integrity": "sha512-pau7um4eAw94BEuuShUIeQDTf3k4Wt6oIUOYxMmkZgDHdqtIcxWND4LRxi8nI9KuT4I1bXQv67BCapkxt7Ywqw==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^0.16.0" - } - }, - "node_modules/@codemirror/commands": { + "node_modules/@codemirror/basic-setup/node_modules/@codemirror/commands": { "version": "0.20.0", "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-0.20.0.tgz", "integrity": "sha512-v9L5NNVA+A9R6zaFvaTbxs30kc69F6BkOoiEbeFw4m4I0exmDEKBILN6mK+GksJtvTzGBxvhAPlVFTdQW8GB7Q==", @@ -307,7 +230,7 @@ "@lezer/common": "^0.16.0" } }, - "node_modules/@codemirror/commands/node_modules/@codemirror/language": { + "node_modules/@codemirror/basic-setup/node_modules/@codemirror/language": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-0.20.2.tgz", "integrity": "sha512-WB3Bnuusw0xhVvhBocieYKwJm04SOk5bPoOEYksVHKHcGHFOaYaw+eZVxR4gIqMMcGzOIUil0FsCmFk8yrhHpw==", @@ -321,13 +244,24 @@ "style-mod": "^4.0.0" } }, - "node_modules/@codemirror/commands/node_modules/@codemirror/state": { + "node_modules/@codemirror/basic-setup/node_modules/@codemirror/search": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-0.20.1.tgz", + "integrity": "sha512-ROe6gRboQU5E4z6GAkNa2kxhXqsGNbeLEisbvzbOeB7nuDYXUZ70vGIgmqPu0tB+1M3F9yWk6W8k2vrFpJaD4Q==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^0.20.0", + "@codemirror/view": "^0.20.0", + "crelt": "^1.0.5" + } + }, + "node_modules/@codemirror/basic-setup/node_modules/@codemirror/state": { "version": "0.20.1", "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-0.20.1.tgz", "integrity": "sha512-ms0tlV5A02OK0pFvTtSUGMLkoarzh1F8mr6jy1cD7ucSC2X/VLHtQCxfhdSEGqTYlQF2hoZtmLv+amqhdgbwjQ==", "license": "MIT" }, - "node_modules/@codemirror/commands/node_modules/@codemirror/view": { + "node_modules/@codemirror/basic-setup/node_modules/@codemirror/view": { "version": "0.20.7", "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-0.20.7.tgz", "integrity": "sha512-pqEPCb9QFTOtHgAH5XU/oVy9UR/Anj6r+tG5CRmkNVcqSKEPmBU05WtN/jxJCFZBXf6HumzWC9ydE4qstO3TxQ==", @@ -338,7 +272,7 @@ "w3c-keyname": "^2.2.4" } }, - "node_modules/@codemirror/commands/node_modules/@lezer/highlight": { + "node_modules/@codemirror/basic-setup/node_modules/@lezer/highlight": { "version": "0.16.0", "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-0.16.0.tgz", "integrity": "sha512-iE5f4flHlJ1g1clOStvXNLbORJoiW4Kytso6ubfYzHnaNo/eo5SKhxs4wv/rtvwZQeZrK3we8S9SyA7OGOoRKQ==", @@ -347,7 +281,7 @@ "@lezer/common": "^0.16.0" } }, - "node_modules/@codemirror/commands/node_modules/@lezer/lr": { + "node_modules/@codemirror/basic-setup/node_modules/@lezer/lr": { "version": "0.16.3", "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-0.16.3.tgz", "integrity": "sha512-pau7um4eAw94BEuuShUIeQDTf3k4Wt6oIUOYxMmkZgDHdqtIcxWND4LRxi8nI9KuT4I1bXQv67BCapkxt7Ywqw==", @@ -356,6 +290,24 @@ "@lezer/common": "^0.16.0" } }, + "node_modules/@codemirror/commands": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.10.2.tgz", + "integrity": "sha512-vvX1fsih9HledO1c9zdotZYUZnE4xV0m6i3m25s5DIfXofuprk6cRcLUZvSk3CASUbwjQX21tOGbkY2BH8TpnQ==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.4.0", + "@codemirror/view": "^6.27.0", + "@lezer/common": "^1.1.0" + } + }, + "node_modules/@codemirror/commands/node_modules/@lezer/common": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.5.1.tgz", + "integrity": "sha512-6YRVG9vBkaY7p1IVxL4s44n5nUnaNnGM2/AckNgYOnxTG2kWh1vR8BMxPseWPjRNpb5VtXnMpeYAEAADoRV1Iw==", + "license": "MIT" + }, "node_modules/@codemirror/lang-css": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/@codemirror/lang-css/-/lang-css-6.3.1.tgz", @@ -369,18 +321,6 @@ "@lezer/css": "^1.1.7" } }, - "node_modules/@codemirror/lang-css/node_modules/@codemirror/autocomplete": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.0.tgz", - "integrity": "sha512-bOwvTOIJcG5FVo5gUUupiwYh8MioPLQ4UcqbcRf7UQ98X90tCa9E1kZ3Z7tqwpZxYyOvh1YTYbmZE9RTfTp5hg==", - "license": "MIT", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.17.0", - "@lezer/common": "^1.0.0" - } - }, "node_modules/@codemirror/lang-css/node_modules/@lezer/common": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.5.1.tgz", @@ -404,18 +344,6 @@ "@lezer/html": "^1.3.12" } }, - "node_modules/@codemirror/lang-html/node_modules/@codemirror/autocomplete": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.0.tgz", - "integrity": "sha512-bOwvTOIJcG5FVo5gUUupiwYh8MioPLQ4UcqbcRf7UQ98X90tCa9E1kZ3Z7tqwpZxYyOvh1YTYbmZE9RTfTp5hg==", - "license": "MIT", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.17.0", - "@lezer/common": "^1.0.0" - } - }, "node_modules/@codemirror/lang-html/node_modules/@lezer/common": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.5.1.tgz", @@ -437,18 +365,6 @@ "@lezer/javascript": "^1.0.0" } }, - "node_modules/@codemirror/lang-javascript/node_modules/@codemirror/autocomplete": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.0.tgz", - "integrity": "sha512-bOwvTOIJcG5FVo5gUUupiwYh8MioPLQ4UcqbcRf7UQ98X90tCa9E1kZ3Z7tqwpZxYyOvh1YTYbmZE9RTfTp5hg==", - "license": "MIT", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.17.0", - "@lezer/common": "^1.0.0" - } - }, "node_modules/@codemirror/lang-javascript/node_modules/@codemirror/lint": { "version": "6.9.4", "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.9.4.tgz", @@ -481,18 +397,6 @@ "@lezer/markdown": "^1.0.0" } }, - "node_modules/@codemirror/lang-markdown/node_modules/@codemirror/autocomplete": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.0.tgz", - "integrity": "sha512-bOwvTOIJcG5FVo5gUUupiwYh8MioPLQ4UcqbcRf7UQ98X90tCa9E1kZ3Z7tqwpZxYyOvh1YTYbmZE9RTfTp5hg==", - "license": "MIT", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.17.0", - "@lezer/common": "^1.0.0" - } - }, "node_modules/@codemirror/lang-markdown/node_modules/@lezer/common": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.5.1.tgz", @@ -548,33 +452,16 @@ } }, "node_modules/@codemirror/search": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-0.20.1.tgz", - "integrity": "sha512-ROe6gRboQU5E4z6GAkNa2kxhXqsGNbeLEisbvzbOeB7nuDYXUZ70vGIgmqPu0tB+1M3F9yWk6W8k2vrFpJaD4Q==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.6.0.tgz", + "integrity": "sha512-koFuNXcDvyyotWcgOnZGmY7LZqEOXZaaxD/j6n18TCLx2/9HieZJ5H6hs1g8FiRxBD0DNfs0nXn17g872RmYdw==", "license": "MIT", "dependencies": { - "@codemirror/state": "^0.20.0", - "@codemirror/view": "^0.20.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.37.0", "crelt": "^1.0.5" } }, - "node_modules/@codemirror/search/node_modules/@codemirror/state": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-0.20.1.tgz", - "integrity": "sha512-ms0tlV5A02OK0pFvTtSUGMLkoarzh1F8mr6jy1cD7ucSC2X/VLHtQCxfhdSEGqTYlQF2hoZtmLv+amqhdgbwjQ==", - "license": "MIT" - }, - "node_modules/@codemirror/search/node_modules/@codemirror/view": { - "version": "0.20.7", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-0.20.7.tgz", - "integrity": "sha512-pqEPCb9QFTOtHgAH5XU/oVy9UR/Anj6r+tG5CRmkNVcqSKEPmBU05WtN/jxJCFZBXf6HumzWC9ydE4qstO3TxQ==", - "license": "MIT", - "dependencies": { - "@codemirror/state": "^0.20.0", - "style-mod": "^4.0.0", - "w3c-keyname": "^2.2.4" - } - }, "node_modules/@codemirror/state": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.5.4.tgz", @@ -2644,30 +2531,6 @@ "integrity": "sha512-h6Xhj+ZsWh/DTNE3xMfRv9edufchsVVwPED7wSGMeEdoYk/UtCZmwRGH0ZZQkr43aNVF3tWGLZJGT+cAeYgUIg==", "license": "BSD" }, - "node_modules/codemirror/node_modules/@codemirror/autocomplete": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.0.tgz", - "integrity": "sha512-bOwvTOIJcG5FVo5gUUupiwYh8MioPLQ4UcqbcRf7UQ98X90tCa9E1kZ3Z7tqwpZxYyOvh1YTYbmZE9RTfTp5hg==", - "license": "MIT", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.17.0", - "@lezer/common": "^1.0.0" - } - }, - "node_modules/codemirror/node_modules/@codemirror/commands": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.10.2.tgz", - "integrity": "sha512-vvX1fsih9HledO1c9zdotZYUZnE4xV0m6i3m25s5DIfXofuprk6cRcLUZvSk3CASUbwjQX21tOGbkY2BH8TpnQ==", - "license": "MIT", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.4.0", - "@codemirror/view": "^6.27.0", - "@lezer/common": "^1.1.0" - } - }, "node_modules/codemirror/node_modules/@codemirror/lint": { "version": "6.9.4", "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.9.4.tgz", @@ -2679,23 +2542,6 @@ "crelt": "^1.0.5" } }, - "node_modules/codemirror/node_modules/@codemirror/search": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.6.0.tgz", - "integrity": "sha512-koFuNXcDvyyotWcgOnZGmY7LZqEOXZaaxD/j6n18TCLx2/9HieZJ5H6hs1g8FiRxBD0DNfs0nXn17g872RmYdw==", - "license": "MIT", - "dependencies": { - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.37.0", - "crelt": "^1.0.5" - } - }, - "node_modules/codemirror/node_modules/@lezer/common": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.5.1.tgz", - "integrity": "sha512-6YRVG9vBkaY7p1IVxL4s44n5nUnaNnGM2/AckNgYOnxTG2kWh1vR8BMxPseWPjRNpb5VtXnMpeYAEAADoRV1Iw==", - "license": "MIT" - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", diff --git a/package.json b/package.json index 51ec381..d090900 100644 --- a/package.json +++ b/package.json @@ -12,9 +12,12 @@ "format": "prettier --write ." }, "dependencies": { + "@codemirror/autocomplete": "^6.20.0", "@codemirror/basic-setup": "^0.20.0", + "@codemirror/commands": "^6.10.1", "@codemirror/lang-markdown": "^6.5.0", "@codemirror/language": "^6.12.1", + "@codemirror/search": "^6.6.0", "@codemirror/state": "^6.5.4", "@codemirror/view": "^6.39.14", "@sveltejs/kit": "^2.0.0", diff --git a/src/lib/components/CodeEditor.svelte b/src/lib/components/CodeEditor.svelte index a035e06..5d8250c 100644 --- a/src/lib/components/CodeEditor.svelte +++ b/src/lib/components/CodeEditor.svelte @@ -1,8 +1,10 @@ diff --git a/src/lib/services/git/repo-manager.ts b/src/lib/services/git/repo-manager.ts index cbf4d61..4d602c7 100644 --- a/src/lib/services/git/repo-manager.ts +++ b/src/lib/services/git/repo-manager.ts @@ -124,7 +124,7 @@ export class RepoManager { const isNewRepo = !repoExists; if (isNewRepo && !isExistingRepo) { const { getCachedUserLevel } = await import('../security/user-level-cache.js'); - const { hasUnlimitedAccess } = await import('../utils/user-access.js'); + const { hasUnlimitedAccess } = await import('../../utils/user-access.js'); const userLevel = getCachedUserLevel(event.pubkey); if (!hasUnlimitedAccess(userLevel?.level)) { throw new Error(`Repository creation requires unlimited access. User has level: ${userLevel?.level || 'none'}`); @@ -533,7 +533,7 @@ export class RepoManager { // For private repos, require owner to have unlimited access to prevent unauthorized creation if (!isPublic) { const { getCachedUserLevel } = await import('../security/user-level-cache.js'); - const { hasUnlimitedAccess } = await import('../utils/user-access.js'); + const { hasUnlimitedAccess } = await import('../../utils/user-access.js'); const userLevel = getCachedUserLevel(announcementEvent.pubkey); if (!hasUnlimitedAccess(userLevel?.level)) { logger.warn({ diff --git a/src/lib/services/messaging/event-forwarder.ts b/src/lib/services/messaging/event-forwarder.ts index b401cbb..f1e0892 100644 --- a/src/lib/services/messaging/event-forwarder.ts +++ b/src/lib/services/messaging/event-forwarder.ts @@ -621,7 +621,7 @@ export async function forwardEventIfEnabled( try { // Early returns for eligibility checks const cached = getCachedUserLevel(userPubkeyHex); - const { hasUnlimitedAccess } = await import('../utils/user-access.js'); + const { hasUnlimitedAccess } = await import('../../utils/user-access.js'); if (!hasUnlimitedAccess(cached?.level)) { return; } diff --git a/src/lib/services/messaging/preferences-storage.server.ts b/src/lib/services/messaging/preferences-storage.server.ts index 272889e..a43d728 100644 --- a/src/lib/services/messaging/preferences-storage.server.ts +++ b/src/lib/services/messaging/preferences-storage.server.ts @@ -44,7 +44,7 @@ const LOOKUP_SECRET = process.env.MESSAGING_LOOKUP_SECRET; const isMessagingConfigured = !!(ENCRYPTION_KEY && SALT_ENCRYPTION_KEY && LOOKUP_SECRET); if (!isMessagingConfigured) { - logger.warn('Messaging preferences storage is not configured. Missing environment variables: MESSAGING_PREFS_ENCRYPTION_KEY, MESSAGING_SALT_ENCRYPTION_KEY, MESSAGING_LOOKUP_SECRET'); + logger.info('Messaging preferences storage is disabled (optional feature). To enable, set environment variables: MESSAGING_PREFS_ENCRYPTION_KEY, MESSAGING_SALT_ENCRYPTION_KEY, MESSAGING_LOOKUP_SECRET'); } interface StoredPreferences { @@ -213,7 +213,7 @@ export async function storePreferences( // Verify user has unlimited access const cached = getCachedUserLevel(userPubkeyHex); - const { hasUnlimitedAccess } = await import('../utils/user-access.js'); + const { hasUnlimitedAccess } = await import('../../utils/user-access.js'); if (!hasUnlimitedAccess(cached?.level)) { throw new Error('Messaging forwarding requires unlimited access'); } diff --git a/src/lib/services/nostr/repo-polling.ts b/src/lib/services/nostr/repo-polling.ts index 8ae5d9c..02f12c1 100644 --- a/src/lib/services/nostr/repo-polling.ts +++ b/src/lib/services/nostr/repo-polling.ts @@ -167,7 +167,7 @@ export class RepoPollingService { // This prevents spam and abuse if (!isExistingRepo) { const userLevel = getCachedUserLevel(event.pubkey); - const { hasUnlimitedAccess } = await import('../utils/user-access.js'); + const { hasUnlimitedAccess } = await import('../../utils/user-access.js'); if (!hasUnlimitedAccess(userLevel?.level)) { logger.warn({ eventId: event.id, diff --git a/src/routes/repos/[npub]/[repo]/+page.svelte b/src/routes/repos/[npub]/[repo]/+page.svelte index addcd89..874d62b 100644 --- a/src/routes/repos/[npub]/[repo]/+page.svelte +++ b/src/routes/repos/[npub]/[repo]/+page.svelte @@ -1595,6 +1595,17 @@ files = await response.json(); currentPath = path; + + // Auto-load README if we're in the root directory and no file is currently selected + if (path === '' && !currentFile) { + const readmeFile = findReadmeFile(files); + if (readmeFile) { + // Small delay to ensure UI is ready + setTimeout(() => { + loadFile(readmeFile.path); + }, 100); + } + } } catch (err) { error = err instanceof Error ? err.message : 'Failed to load files'; console.error('Error loading files:', err); @@ -1603,6 +1614,43 @@ } } + // Helper function to find README file in file list + function findReadmeFile(fileList: Array<{ name: string; path: string; type: 'file' | 'directory' }>): { name: string; path: string; type: 'file' | 'directory' } | null { + // Priority order for README files (most common first) + const readmeExtensions = ['md', 'markdown', 'txt', 'adoc', 'asciidoc', 'rst', 'org']; + + // First, try to find README with extensions (prioritized order) + for (const ext of readmeExtensions) { + const readmeFile = fileList.find(file => + file.type === 'file' && + file.name.toLowerCase() === `readme.${ext}` + ); + if (readmeFile) { + return readmeFile; + } + } + + // Then check for README without extension + const readmeNoExt = fileList.find(file => + file.type === 'file' && + file.name.toLowerCase() === 'readme' + ); + if (readmeNoExt) { + return readmeNoExt; + } + + // Finally, check for any file starting with "readme." (case-insensitive) + const readmeAny = fileList.find(file => + file.type === 'file' && + file.name.toLowerCase().startsWith('readme.') + ); + if (readmeAny) { + return readmeAny; + } + + return null; + } + async function loadFile(filePath: string) { loading = true; error = null; @@ -1894,7 +1942,15 @@ headers: buildApiHeaders() }); if (response.ok) { - commits = await response.json(); + const data = await response.json(); + // Normalize commits: API-based commits use 'sha', local commits use 'hash' + commits = data.map((commit: any) => ({ + hash: commit.hash || commit.sha || '', + message: commit.message || 'No message', + author: commit.author || 'Unknown', + date: commit.date || new Date().toISOString(), + files: commit.files || [] + })).filter((commit: any) => commit.hash); // Filter out commits without hash } } catch (err) { error = err instanceof Error ? err.message : 'Failed to load commit history'; @@ -1907,8 +1963,11 @@ loadingCommits = true; error = null; try { - const parentHash = commits.find(c => c.hash === commitHash) - ? commits[commits.findIndex(c => c.hash === commitHash) + 1]?.hash || `${commitHash}^` + // Normalize commit hash (handle both 'hash' and 'sha' properties) + const getCommitHash = (c: any) => c.hash || c.sha || ''; + const commitIndex = commits.findIndex(c => getCommitHash(c) === commitHash); + const parentHash = commitIndex >= 0 + ? (commits[commitIndex + 1] ? getCommitHash(commits[commitIndex + 1]) : `${commitHash}^`) : `${commitHash}^`; const response = await fetch(`/api/repos/${npub}/${repo}/diff?from=${parentHash}&to=${commitHash}`, { @@ -2505,16 +2564,19 @@ {:else} {/if} @@ -2538,13 +2600,16 @@ {:else} {/if}