Compare commits

...

2 Commits

Author SHA1 Message Date
Aiden Cline
5fc91fdadc ignore: git slop 2026-02-02 21:32:35 -06:00
Aiden Cline
5eb4080947 tweak: adjust skill tool output to make it more clear which base directory the skill lives in 2026-02-02 00:08:28 -06:00
6 changed files with 45 additions and 48 deletions

View File

@@ -11,7 +11,7 @@ import { createWrapper } from "@parcel/watcher/wrapper"
import { lazy } from "@/util/lazy"
import { withTimeout } from "@/util/timeout"
import type ParcelWatcher from "@parcel/watcher"
import { $ } from "bun"
import { gitText } from "../util/git"
import { Flag } from "@/flag/flag"
import { readdir } from "fs/promises"
@@ -88,11 +88,7 @@ export namespace FileWatcher {
if (sub) subs.push(sub)
}
const vcsDir = await $`git rev-parse --git-dir`
.quiet()
.nothrow()
.cwd(Instance.worktree)
.text()
const vcsDir = await gitText(["rev-parse", "--git-dir"], Instance.worktree)
.then((x) => path.resolve(Instance.worktree, x.trim()))
.catch(() => undefined)
if (vcsDir && !cfgIgnores.includes(".git") && !cfgIgnores.includes(vcsDir)) {

View File

@@ -2,7 +2,7 @@ import z from "zod"
import fs from "fs/promises"
import { Filesystem } from "../util/filesystem"
import path from "path"
import { $ } from "bun"
import { gitText } from "../util/git"
import { Storage } from "../storage/storage"
import { Log } from "../util/log"
import { Flag } from "@/flag/flag"
@@ -55,15 +55,15 @@ export namespace Project {
const { id, sandbox, worktree, vcs } = await iife(async () => {
const matches = Filesystem.up({ targets: [".git"], start: directory })
const git = await matches.next().then((x) => x.value)
const gitdir = await matches.next().then((x) => x.value)
await matches.return()
if (git) {
let sandbox = path.dirname(git)
if (gitdir) {
let sandbox = path.dirname(gitdir)
const gitBinary = Bun.which("git")
// cached id calculation
let id = await Bun.file(path.join(git, "opencode"))
let id = await Bun.file(path.join(gitdir, "opencode"))
.text()
.then((x) => x.trim())
.catch(() => undefined)
@@ -79,11 +79,7 @@ export namespace Project {
// generate id from root commit
if (!id) {
const roots = await $`git rev-list --max-parents=0 --all`
.quiet()
.nothrow()
.cwd(sandbox)
.text()
const roots = await gitText(["rev-list", "--max-parents=0", "--all"], sandbox)
.then((x) =>
x
.split("\n")
@@ -104,7 +100,7 @@ export namespace Project {
id = roots[0]
if (id) {
void Bun.file(path.join(git, "opencode"))
void Bun.file(path.join(gitdir, "opencode"))
.write(id)
.catch(() => undefined)
}
@@ -119,11 +115,7 @@ export namespace Project {
}
}
const top = await $`git rev-parse --show-toplevel`
.quiet()
.nothrow()
.cwd(sandbox)
.text()
const top = await gitText(["rev-parse", "--show-toplevel"], sandbox)
.then((x) => path.resolve(sandbox, x.trim()))
.catch(() => undefined)
@@ -138,11 +130,7 @@ export namespace Project {
sandbox = top
const worktree = await $`git rev-parse --git-common-dir`
.quiet()
.nothrow()
.cwd(sandbox)
.text()
const worktree = await gitText(["rev-parse", "--git-common-dir"], sandbox)
.then((x) => {
const dirname = path.dirname(x.trim())
if (dirname === ".") return sandbox

View File

@@ -1,7 +1,6 @@
import { BusEvent } from "@/bus/bus-event"
import { Bus } from "@/bus"
import { $ } from "bun"
import path from "path"
import { gitText } from "../util/git"
import z from "zod"
import { Log } from "@/util/log"
import { Instance } from "./instance"
@@ -29,11 +28,7 @@ export namespace Vcs {
export type Info = z.infer<typeof Info>
async function currentBranch() {
return $`git rev-parse --abbrev-ref HEAD`
.quiet()
.nothrow()
.cwd(Instance.worktree)
.text()
return gitText(["rev-parse", "--abbrev-ref", "HEAD"], Instance.worktree)
.then((x) => x.trim())
.catch(() => undefined)
}

View File

@@ -5,7 +5,7 @@ import { Global } from "../global"
import { Filesystem } from "../util/filesystem"
import { lazy } from "../util/lazy"
import { Lock } from "../util/lock"
import { $ } from "bun"
import { gitText } from "../util/git"
import { NamedError } from "@opencode-ai/util/error"
import z from "zod"
@@ -45,18 +45,18 @@ export namespace Storage {
}
if (!worktree) continue
if (!(await Filesystem.isDir(worktree))) continue
const [id] = await $`git rev-list --max-parents=0 --all`
.quiet()
.nothrow()
.cwd(worktree)
.text()
const roots = await gitText(["rev-list", "--max-parents=0", "--all"], worktree)
.then((x) =>
x
.split("\n")
.filter(Boolean)
.map((x) => x.trim())
.toSorted(),
? x
.split("\n")
.filter(Boolean)
.map((x) => x.trim())
.toSorted()
: undefined,
)
.catch(() => undefined)
const id = roots?.[0]
if (!id) continue
projectID = id

View File

@@ -64,12 +64,14 @@ export const SkillTool = Tool.define("skill", async (ctx) => {
const content = skill.content
const dir = path.dirname(skill.location)
// Format output similar to plugin pattern
const output = [`## Skill: ${skill.name}`, "", `**Base directory**: ${dir}`, "", content.trim()].join("\n")
return {
title: `Loaded skill: ${skill.name}`,
output,
output: [
`Successfully loaded skill: ${skill.name}`,
`Base directory for this skill: ${dir}`,
"",
content.trim(),
].join("\n"),
metadata: {
name: skill.name,
dir,

View File

@@ -0,0 +1,16 @@
import { $ } from "bun"
function env() {
return {
...process.env,
GIT_TERMINAL_PROMPT: "0",
GIT_ASKPASS: "echo",
GIT_PAGER: "cat",
PAGER: "",
}
}
export async function gitText(args: string[], cwd: string): Promise<string> {
const input = new Response("")
return $`git ${args} < ${input}`.env(env()).cwd(cwd).quiet().nothrow().text()
}