- Remove all sync functions from command loader (async now default) - Remove sync load functions from skill loader (async now default) - Add resolveSymlinkAsync to file-utils.ts - Update all callers to use async versions: - config-handler.ts - index.ts - tools/slashcommand/tools.ts - tools/skill/tools.ts - hooks/auto-slash-command/executor.ts - loader.test.ts - All 607 tests pass, build succeeds Generated with assistance of 🤖 [OhMyOpenCode](https://github.com/code-yeongyu/oh-my-opencode)
41 lines
1.1 KiB
TypeScript
41 lines
1.1 KiB
TypeScript
import { lstatSync, readlinkSync } from "fs"
|
|
import { promises as fs } from "fs"
|
|
import { resolve } from "path"
|
|
|
|
export function isMarkdownFile(entry: { name: string; isFile: () => boolean }): boolean {
|
|
return !entry.name.startsWith(".") && entry.name.endsWith(".md") && entry.isFile()
|
|
}
|
|
|
|
export function isSymbolicLink(filePath: string): boolean {
|
|
try {
|
|
return lstatSync(filePath, { throwIfNoEntry: false })?.isSymbolicLink() ?? false
|
|
} catch {
|
|
return false
|
|
}
|
|
}
|
|
|
|
export function resolveSymlink(filePath: string): string {
|
|
try {
|
|
const stats = lstatSync(filePath, { throwIfNoEntry: false })
|
|
if (stats?.isSymbolicLink()) {
|
|
return resolve(filePath, "..", readlinkSync(filePath))
|
|
}
|
|
return filePath
|
|
} catch {
|
|
return filePath
|
|
}
|
|
}
|
|
|
|
export async function resolveSymlinkAsync(filePath: string): Promise<string> {
|
|
try {
|
|
const stats = await fs.lstat(filePath)
|
|
if (stats.isSymbolicLink()) {
|
|
const linkTarget = await fs.readlink(filePath)
|
|
return resolve(filePath, "..", linkTarget)
|
|
}
|
|
return filePath
|
|
} catch {
|
|
return filePath
|
|
}
|
|
}
|