cedarstalking with keyboard shortcuts
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat: use greptiles comments

+25 -101
+1
.gitignore
··· 1 1 node_modules/ 2 2 dist/ 3 3 .DS_Store 4 + assets/auth-browser-bin
+17 -6
LICENSE.md
··· 1 - # The O'Saasy License 1 + MIT License 2 2 3 - Copyright © `2026` `Kieran Klukas` 3 + Copyright (c) 2026 Kieran Klukas 4 4 5 - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 5 + Permission is hereby granted, free of charge, to any person obtaining a copy 6 + of this software and associated documentation files (the "Software"), to deal 7 + in the Software without restriction, including without limitation the rights 8 + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 + copies of the Software, and to permit persons to whom the Software is 10 + furnished to do so, subject to the following conditions: 6 11 7 - The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 - No licensee or downstream recipient may use the Software (including any modified or derivative versions) to directly compete with the original Licensor by offering it to third parties as a hosted, managed, or Software-as-a-Service (SaaS) product or cloud service where the primary value of the service is the functionality of the Software itself. 12 + The above copyright notice and this permission notice shall be included in all 13 + copies or substantial portions of the Software. 9 14 10 - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 15 + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 + SOFTWARE.
assets/auth-browser-bin

This is a binary file and will not be displayed.

+2 -1
assets/auth-browser.swift
··· 101 101 102 102 self.didComplete = true 103 103 let cookieStr = site.map { "\($0.name)=\($0.value)" }.joined(separator: "; ") 104 - try? cookieStr.write(toFile: self.config.cookieFile, atomically: true, encoding: .utf8) 104 + // Write non-atomically so the pre-created 0o600 permissions are preserved. 105 + try? cookieStr.write(toFile: self.config.cookieFile, atomically: false, encoding: .utf8) 105 106 self.log("auth complete, wrote cookie") 106 107 NSApp.terminate(nil) 107 108 }
-92
package-lock.json
··· 10 10 "@raycast/api": "^1.104.9" 11 11 }, 12 12 "devDependencies": { 13 - "@raycast/utils": "^1.17.0", 14 13 "@types/node": "^22.13.10", 15 14 "@types/react": "^19.0.10", 16 15 "typescript": "^5.8.2" ··· 863 862 "csstype": "^3.0.2" 864 863 } 865 864 }, 866 - "node_modules/@raycast/utils": { 867 - "version": "1.19.1", 868 - "dev": true, 869 - "license": "MIT", 870 - "dependencies": { 871 - "cross-fetch": "^3.1.6", 872 - "dequal": "^2.0.3", 873 - "object-hash": "^3.0.0", 874 - "signal-exit": "^4.0.2", 875 - "stream-chain": "^2.2.5", 876 - "stream-json": "^1.8.0" 877 - }, 878 - "peerDependencies": { 879 - "@raycast/api": ">=1.69.0" 880 - } 881 - }, 882 865 "node_modules/@types/node": { 883 866 "version": "22.19.15", 884 867 "devOptional": true, ··· 1004 987 "version": "1.1.4", 1005 988 "license": "MIT" 1006 989 }, 1007 - "node_modules/cross-fetch": { 1008 - "version": "3.2.0", 1009 - "dev": true, 1010 - "license": "MIT", 1011 - "dependencies": { 1012 - "node-fetch": "^2.7.0" 1013 - } 1014 - }, 1015 990 "node_modules/csstype": { 1016 991 "version": "3.2.3", 1017 992 "license": "MIT" ··· 1029 1004 "supports-color": { 1030 1005 "optional": true 1031 1006 } 1032 - } 1033 - }, 1034 - "node_modules/dequal": { 1035 - "version": "2.0.3", 1036 - "dev": true, 1037 - "license": "MIT", 1038 - "engines": { 1039 - "node": ">=6" 1040 1007 } 1041 1008 }, 1042 1009 "node_modules/ejs": { ··· 1276 1243 "node": "^18.17.0 || >=20.5.0" 1277 1244 } 1278 1245 }, 1279 - "node_modules/node-fetch": { 1280 - "version": "2.7.0", 1281 - "dev": true, 1282 - "license": "MIT", 1283 - "dependencies": { 1284 - "whatwg-url": "^5.0.0" 1285 - }, 1286 - "engines": { 1287 - "node": "4.x || >=6.0.0" 1288 - }, 1289 - "peerDependencies": { 1290 - "encoding": "^0.1.0" 1291 - }, 1292 - "peerDependenciesMeta": { 1293 - "encoding": { 1294 - "optional": true 1295 - } 1296 - } 1297 - }, 1298 - "node_modules/object-hash": { 1299 - "version": "3.0.0", 1300 - "dev": true, 1301 - "license": "MIT", 1302 - "engines": { 1303 - "node": ">= 6" 1304 - } 1305 - }, 1306 1246 "node_modules/picocolors": { 1307 1247 "version": "1.1.1", 1308 1248 "license": "ISC" ··· 1348 1288 "url": "https://github.com/sponsors/isaacs" 1349 1289 } 1350 1290 }, 1351 - "node_modules/stream-chain": { 1352 - "version": "2.2.5", 1353 - "dev": true, 1354 - "license": "BSD-3-Clause" 1355 - }, 1356 - "node_modules/stream-json": { 1357 - "version": "1.9.1", 1358 - "dev": true, 1359 - "license": "BSD-3-Clause", 1360 - "dependencies": { 1361 - "stream-chain": "^2.2.5" 1362 - } 1363 - }, 1364 1291 "node_modules/string-width": { 1365 1292 "version": "4.2.3", 1366 1293 "license": "MIT", ··· 1410 1337 "url": "https://github.com/sponsors/SuperchupuDev" 1411 1338 } 1412 1339 }, 1413 - "node_modules/tr46": { 1414 - "version": "0.0.3", 1415 - "dev": true, 1416 - "license": "MIT" 1417 - }, 1418 1340 "node_modules/type-fest": { 1419 1341 "version": "0.21.3", 1420 1342 "license": "(MIT OR CC0-1.0)", ··· 1441 1363 "version": "6.21.0", 1442 1364 "devOptional": true, 1443 1365 "license": "MIT" 1444 - }, 1445 - "node_modules/webidl-conversions": { 1446 - "version": "3.0.1", 1447 - "dev": true, 1448 - "license": "BSD-2-Clause" 1449 - }, 1450 - "node_modules/whatwg-url": { 1451 - "version": "5.0.0", 1452 - "dev": true, 1453 - "license": "MIT", 1454 - "dependencies": { 1455 - "tr46": "~0.0.3", 1456 - "webidl-conversions": "^3.0.0" 1457 - } 1458 1366 }, 1459 1367 "node_modules/widest-line": { 1460 1368 "version": "3.1.0",
+1 -1
package.json
··· 33 33 "@raycast/api": "^1.104.9" 34 34 }, 35 35 "devDependencies": { 36 - "@raycast/utils": "^1.17.0", 37 36 "@types/node": "^22.13.10", 38 37 "@types/react": "^19.0.10", 39 38 "typescript": "^5.8.2" 40 39 }, 41 40 "scripts": { 41 + "prebuild": "swiftc -O assets/auth-browser.swift -target arm64-apple-macos13 -o /tmp/cedarstalk-auth-arm64 && swiftc -O assets/auth-browser.swift -target x86_64-apple-macos13 -o /tmp/cedarstalk-auth-x86_64 && lipo -create -output assets/auth-browser-bin /tmp/cedarstalk-auth-arm64 /tmp/cedarstalk-auth-x86_64 && codesign --sign - --force assets/auth-browser-bin", 42 42 "build": "ray build", 43 43 "dev": "ray develop", 44 44 "fix-lint": "ray lint --fix",
+3
src/auth.ts
··· 52 52 // Write config before launch — Swift reads this instead of using --args 53 53 await unlink(COOKIE_FILE).catch(() => {}); 54 54 await unlink(LOG_FILE).catch(() => {}); 55 + // Pre-create with owner-only permissions so the cookie is never world-readable. 56 + // Swift writes non-atomically to preserve these permissions. 57 + await writeFile(COOKIE_FILE, "", { mode: 0o600 }); 55 58 await writeFile(CONFIG_FILE, JSON.stringify({ signInUrl, cookieFile: COOKIE_FILE, logFile: LOG_FILE })); 56 59 57 60 await new Promise<void>((resolve, reject) => {
+1 -1
src/search-directory.tsx
··· 564 564 // ─── Main command ────────────────────────────────────────────────────────── 565 565 566 566 export default function SearchDirectory() { 567 - const { demoMode: demo } = getPreferenceValues<{ demoMode: boolean }>(); 567 + const { demoMode: demo } = getPreferenceValues<Preferences.SearchDirectory>(); 568 568 const [authState, setAuthState] = useState<AuthState>({ kind: "loading" }); 569 569 const [query, setQuery] = useState(""); 570 570 const [filter, setFilter] = useState("");