48 lines
1.8 KiB
TypeScript
48 lines
1.8 KiB
TypeScript
export * as ConfigSkillPlugin from "./skill"
|
|
|
|
import path from "path"
|
|
import { Effect } from "effect"
|
|
import { Config } from "../../config"
|
|
import { Global } from "../../global"
|
|
import { Location } from "../../location"
|
|
import { PluginV2 } from "../../plugin"
|
|
import { AbsolutePath } from "../../schema"
|
|
import { SkillV2 } from "../../skill"
|
|
|
|
export const Plugin = PluginV2.define({
|
|
id: PluginV2.ID.make("config-skill"),
|
|
effect: Effect.gen(function* () {
|
|
const config = yield* Config.Service
|
|
const global = yield* Global.Service
|
|
const location = yield* Location.Service
|
|
const skill = yield* SkillV2.Service
|
|
const transform = yield* skill.transform()
|
|
const entries = yield* config.entries()
|
|
const directories = entries.flatMap((entry) => (entry.type === "directory" ? [entry.path] : []))
|
|
const items = entries.flatMap((entry) => (entry.type === "document" ? (entry.info.skills ?? []) : []))
|
|
|
|
yield* transform((editor) => {
|
|
for (const directory of directories) {
|
|
editor.source(
|
|
new SkillV2.DirectorySource({ type: "directory", path: AbsolutePath.make(path.join(directory, "skill")) }),
|
|
)
|
|
editor.source(
|
|
new SkillV2.DirectorySource({ type: "directory", path: AbsolutePath.make(path.join(directory, "skills")) }),
|
|
)
|
|
}
|
|
for (const item of items) {
|
|
if (URL.canParse(item) && /^(https?:)$/.test(new URL(item).protocol)) {
|
|
editor.source(new SkillV2.UrlSource({ type: "url", url: item }))
|
|
continue
|
|
}
|
|
const expanded = item.startsWith("~/") ? path.join(global.home, item.slice(2)) : item
|
|
editor.source(
|
|
new SkillV2.DirectorySource({
|
|
type: "directory",
|
|
path: AbsolutePath.make(path.isAbsolute(expanded) ? expanded : path.join(location.directory, expanded)),
|
|
}),
|
|
)
|
|
}
|
|
})
|
|
}),
|
|
})
|