fix: address remaining Cubic review issues - READMEs, workflows, agent prompts, templates

This commit is contained in:
YeonGyu-Kim
2026-03-18 13:36:03 +09:00
parent 26cc073048
commit f612f4f692
13 changed files with 98 additions and 71 deletions
+3
View File
@@ -1,5 +1,6 @@
name: Question or Discussion
description: Ask a question or start a discussion about oh-my-openagent
title: "[Question]: "
labels: ["question", "needs-triage"]
body:
- type: markdown
@@ -52,7 +53,9 @@ body:
label: Doctor Output (Optional)
description: |
If your question is about configuration or setup, run `bunx oh-my-openagent doctor` and paste the output.
placeholder: |
Paste the output of: bunx oh-my-openagent doctor
(Optional for questions)
render: shell
- type: dropdown
+1
View File
@@ -24,6 +24,7 @@ jobs:
with:
path-to-signatures: 'signatures/cla.json'
path-to-document: 'https://github.com/code-yeongyu/oh-my-openagent/blob/master/CLA.md'
branch: 'dev'
allowlist: code-yeongyu,bot*,dependabot*,github-actions*,*[bot],sisyphus-dev-ai,web-flow
custom-notsigned-prcomment: |
Thank you for your contribution! Before we can merge this PR, we need you to sign our [Contributor License Agreement (CLA)](https://github.com/code-yeongyu/oh-my-openagent/blob/master/CLA.md).
+4 -27
View File
@@ -229,14 +229,15 @@ jobs:
if [ -n "${{ steps.version.outputs.dist_tag }}" ]; then
TAG_ARG="--tag ${{ steps.version.outputs.dist_tag }}"
fi
npm publish --access public --provenance $TAG_ARG
env:
NODE_AUTH_TOKEN: ${{ secrets.NODE_AUTH_TOKEN }}
NPM_CONFIG_PROVENANCE: true
- name: Publish oh-my-opencode (alias)
if: steps.check.outputs.skip != 'true'
run: |
# Update package name to oh-my-opencode
jq '.name = "oh-my-opencode"' package.json > tmp.json && mv tmp.json package.json
# Update package name/bin to oh-my-opencode alias
jq '.name = "oh-my-opencode" | .bin = {"oh-my-opencode": "bin/oh-my-openagent.js"}' package.json > tmp.json && mv tmp.json package.json
# Update optionalDependencies to use oh-my-opencode naming
jq '.optionalDependencies = {
@@ -258,37 +259,13 @@ jobs:
TAG_ARG="--tag ${{ steps.version.outputs.dist_tag }}"
fi
npm publish --access public --provenance $TAG_ARG || echo "oh-my-opencode alias publish may have failed (package may already exist)"
# Update package name to oh-my-openagent
jq '.name = "oh-my-openagent"' package.json > tmp.json && mv tmp.json package.json
# Update optionalDependencies to use oh-my-openagent naming
jq '.optionalDependencies = {
"oh-my-openagent-darwin-arm64": "${{ steps.version.outputs.version }}",
"oh-my-openagent-darwin-x64": "${{ steps.version.outputs.version }}",
"oh-my-openagent-darwin-x64-baseline": "${{ steps.version.outputs.version }}",
"oh-my-openagent-linux-arm64": "${{ steps.version.outputs.version }}",
"oh-my-openagent-linux-arm64-musl": "${{ steps.version.outputs.version }}",
"oh-my-openagent-linux-x64": "${{ steps.version.outputs.version }}",
"oh-my-openagent-linux-x64-baseline": "${{ steps.version.outputs.version }}",
"oh-my-openagent-linux-x64-musl": "${{ steps.version.outputs.version }}",
"oh-my-openagent-linux-x64-musl-baseline": "${{ steps.version.outputs.version }}",
"oh-my-openagent-windows-x64": "${{ steps.version.outputs.version }}",
"oh-my-openagent-windows-x64-baseline": "${{ steps.version.outputs.version }}"
}' package.json > tmp.json && mv tmp.json package.json
TAG_ARG=""
if [ -n "${{ steps.version.outputs.dist_tag }}" ]; then
TAG_ARG="--tag ${{ steps.version.outputs.dist_tag }}"
fi
npm publish --access public --provenance $TAG_ARG || echo "oh-my-openagent publish may have failed (package may already exist)"
env:
NODE_AUTH_TOKEN: ${{ secrets.NODE_AUTH_TOKEN }}
NPM_CONFIG_PROVENANCE: true
- name: Restore package.json
if: steps.check.outputs.skip != 'true'
run: |
# Restore original package name
jq '.name = "oh-my-opencode"' package.json > tmp.json && mv tmp.json package.json
git checkout -- package.json
trigger-platform:
runs-on: ubuntu-latest
+1 -1
View File
@@ -29,7 +29,7 @@
<div align="center">
[![GitHub Release](https://img.shields.io/github/v/release/code-yeongyu/oh-my-openagent?color=369eff&labelColor=black&logo=github&style=flat-square)](https://github.com/code-yeongyu/oh-my-openagent/releases)
https://www.npmjs.com/package/oh-my-openagent
[![npm downloads](https://img.shields.io/endpoint?url=https%3A%2F%2Fohmyopenagent.com%2Fapi%2Fnpm-downloads&style=flat-square)](https://www.npmjs.com/package/oh-my-openagent)
[![GitHub Contributors](https://img.shields.io/github/contributors/code-yeongyu/oh-my-openagent?color=c4f042&labelColor=black&style=flat-square)](https://github.com/code-yeongyu/oh-my-openagent/graphs/contributors)
[![GitHub Forks](https://img.shields.io/github/forks/code-yeongyu/oh-my-openagent?color=8ae8ff&labelColor=black&style=flat-square)](https://github.com/code-yeongyu/oh-my-openagent/network/members)
[![GitHub Stars](https://img.shields.io/github/stars/code-yeongyu/oh-my-openagent?color=ffcb47&labelColor=black&style=flat-square)](https://github.com/code-yeongyu/oh-my-openagent/stargazers)
+2 -2
View File
@@ -15,9 +15,9 @@
<div align="center">
[![Oh My OpenCode](./.github/assets/hero.jpg)](https://github.com/code-yeongyu/oh-my-openagent#oh-my-openagent)
[![Oh My OpenCode](./.github/assets/hero.jpg)](https://github.com/code-yeongyu/oh-my-openagent#oh-my-opencode)
[![Preview](./.github/assets/omo.png)](https://github.com/code-yeongyu/oh-my-openagent#oh-my-openagent)
[![Preview](./.github/assets/omo.png)](https://github.com/code-yeongyu/oh-my-openagent#oh-my-opencode)
</div>
+1 -1
View File
@@ -34,7 +34,7 @@
<div align="center">
[![GitHub Release](https://img.shields.io/github/v/release/code-yeongyu/oh-my-openagent?color=369eff&labelColor=black&logo=github&style=flat-square)](https://github.com/code-yeongyu/oh-my-openagent/releases)
https://www.npmjs.com/package/oh-my-openagent
[![npm downloads](https://img.shields.io/endpoint?url=https%3A%2F%2Fohmyopenagent.com%2Fapi%2Fnpm-downloads&style=flat-square)](https://www.npmjs.com/package/oh-my-openagent)
[![GitHub Contributors](https://img.shields.io/github/contributors/code-yeongyu/oh-my-openagent?color=c4f042&labelColor=black&style=flat-square)](https://github.com/code-yeongyu/oh-my-openagent/graphs/contributors)
[![GitHub Forks](https://img.shields.io/github/forks/code-yeongyu/oh-my-openagent?color=8ae8ff&labelColor=black&style=flat-square)](https://github.com/code-yeongyu/oh-my-openagent/network/members)
[![GitHub Stars](https://img.shields.io/github/stars/code-yeongyu/oh-my-openagent?color=ffcb47&labelColor=black&style=flat-square)](https://github.com/code-yeongyu/oh-my-openagent/stargazers)
+1 -1
View File
@@ -34,7 +34,7 @@ After you install it, you can read this [overview guide](./overview.md) to under
> curl -fsSL https://raw.githubusercontent.com/code-yeongyu/oh-my-openagent/refs/heads/dev/docs/guide/installation.md
> ```
If you're an LLM Agent helping set up oh-my-openagent, Welcome! You'll now help your user to install the best agent harness, OhMyOpenCode. Tell user this with greetings, with test 'oMoMoMoMo...'
If you're an LLM Agent helping set up oh-my-openagent, Welcome! You'll now help your user to install the best agent harness, OhMyOpenAgent. Tell user this with greetings, with test 'oMoMoMoMo...'
follow these steps:
+1 -2
View File
@@ -17,8 +17,7 @@ export function buildGpt53CodexSisyphusJuniorPrompt(
const verificationText = useTaskSystem
? "All tasks marked completed"
: "All todos marked completed"
const prompt = `You are Sisyphus-Junior — a focused task executor from OhMyOpenAgent.
You are Sisyphus-Junior — a focused task executor from OhMyOpenAgent.
const prompt = `You are Sisyphus-Junior — a focused task executor from OhMyOpenAgent.
## Identity
+1 -2
View File
@@ -18,8 +18,7 @@ export function buildGptSisyphusJuniorPrompt(
const verificationText = useTaskSystem
? "All tasks marked completed"
: "All todos marked completed"
const prompt = `You are Sisyphus-Junior — a focused task executor from OhMyOpenAgent.
You are Sisyphus-Junior — a focused task executor from OhMyOpenAgent.
const prompt = `You are Sisyphus-Junior — a focused task executor from OhMyOpenAgent.
## Identity
+15 -7
View File
@@ -3,14 +3,18 @@ import { join } from "node:path"
import { OhMyOpenAgentConfigSchema } from "../../../config"
import { detectConfigFile, getOpenCodeConfigDir, parseJsonc } from "../../../shared"
import { CHECK_IDS, CHECK_NAMES, PACKAGE_NAME } from "../constants"
import { CHECK_IDS, CHECK_NAMES, PACKAGE_NAMES } from "../constants"
import type { CheckResult, DoctorIssue } from "../types"
import { loadAvailableModelsFromCache } from "./model-resolution-cache"
import { getModelResolutionInfoWithOverrides } from "./model-resolution"
import type { OmoConfig } from "./model-resolution-types"
const USER_CONFIG_BASE = join(getOpenCodeConfigDir({ binary: "opencode" }), PACKAGE_NAME)
const PROJECT_CONFIG_BASE = join(process.cwd(), ".opencode", PACKAGE_NAME)
const USER_CONFIG_BASES = PACKAGE_NAMES.map((packageName) =>
join(getOpenCodeConfigDir({ binary: "opencode" }), packageName)
)
const PROJECT_CONFIG_BASES = PACKAGE_NAMES.map((packageName) =>
join(process.cwd(), ".opencode", packageName)
)
interface ConfigValidationResult {
exists: boolean
@@ -21,11 +25,15 @@ interface ConfigValidationResult {
}
function findConfigPath(): string | null {
const projectConfig = detectConfigFile(PROJECT_CONFIG_BASE)
if (projectConfig.format !== "none") return projectConfig.path
for (const projectConfigBase of PROJECT_CONFIG_BASES) {
const projectConfig = detectConfigFile(projectConfigBase)
if (projectConfig.format !== "none") return projectConfig.path
}
const userConfig = detectConfigFile(USER_CONFIG_BASE)
if (userConfig.format !== "none") return userConfig.path
for (const userConfigBase of USER_CONFIG_BASES) {
const userConfig = detectConfigFile(userConfigBase)
if (userConfig.format !== "none") return userConfig.path
}
return null
}
@@ -1,34 +1,44 @@
import { PLUGIN_NAME } from "../../../shared/plugin-identity"
import {
CONFIG_BASENAME,
LEGACY_CONFIG_BASENAME,
} from "../../../shared/plugin-identity"
import { readFileSync } from "node:fs"
import { join } from "node:path"
import { detectConfigFile, getOpenCodeConfigPaths, parseJsonc } from "../../../shared"
import type { OmoConfig } from "./model-resolution-types"
const PACKAGE_NAME = PLUGIN_NAME
const USER_CONFIG_BASE = join(
getOpenCodeConfigPaths({ binary: "opencode", version: null }).configDir,
PACKAGE_NAME
)
const PROJECT_CONFIG_BASE = join(process.cwd(), ".opencode", PACKAGE_NAME)
const USER_CONFIG_BASES = [
join(getOpenCodeConfigPaths({ binary: "opencode", version: null }).configDir, CONFIG_BASENAME),
join(getOpenCodeConfigPaths({ binary: "opencode", version: null }).configDir, LEGACY_CONFIG_BASENAME),
] as const
const PROJECT_CONFIG_BASES = [
join(process.cwd(), ".opencode", CONFIG_BASENAME),
join(process.cwd(), ".opencode", LEGACY_CONFIG_BASENAME),
] as const
export function loadOmoConfig(): OmoConfig | null {
const projectDetected = detectConfigFile(PROJECT_CONFIG_BASE)
if (projectDetected.format !== "none") {
try {
const content = readFileSync(projectDetected.path, "utf-8")
return parseJsonc<OmoConfig>(content)
} catch {
return null
for (const projectConfigBase of PROJECT_CONFIG_BASES) {
const projectDetected = detectConfigFile(projectConfigBase)
if (projectDetected.format !== "none") {
try {
const content = readFileSync(projectDetected.path, "utf-8")
return parseJsonc<OmoConfig>(content)
} catch {
return null
}
}
}
const userDetected = detectConfigFile(USER_CONFIG_BASE)
if (userDetected.format !== "none") {
try {
const content = readFileSync(userDetected.path, "utf-8")
return parseJsonc<OmoConfig>(content)
} catch {
return null
for (const userConfigBase of USER_CONFIG_BASES) {
const userDetected = detectConfigFile(userConfigBase)
if (userDetected.format !== "none") {
try {
const content = readFileSync(userDetected.path, "utf-8")
return parseJsonc<OmoConfig>(content)
} catch {
return null
}
}
}
+35 -6
View File
@@ -4,7 +4,7 @@ import { join } from "node:path"
import { getLatestVersion } from "../../../hooks/auto-update-checker/checker"
import { extractChannel } from "../../../hooks/auto-update-checker"
import { PACKAGE_NAME } from "../constants"
import { PACKAGE_NAME, PACKAGE_NAMES } from "../constants"
import { getOpenCodeCacheDir, getOpenCodeConfigPaths, parseJsonc } from "../../../shared"
interface PackageJsonShape {
@@ -12,6 +12,18 @@ interface PackageJsonShape {
dependencies?: Record<string, string>
}
interface CandidateLocation {
cacheDir: string
cachePackagePath: string
nodeModulesDir: string
}
interface CandidateSelection {
cacheDir: string
cachePackagePath: string
installedPackagePath: string
}
export interface LoadedVersionInfo {
cacheDir: string
cachePackagePath: string
@@ -56,27 +68,44 @@ function normalizeVersion(value: string | undefined): string | null {
export function getLoadedPluginVersion(): LoadedVersionInfo {
const configPaths = getOpenCodeConfigPaths({ binary: "opencode" })
const cacheDir = resolveOpenCodeCacheDir()
const candidates = [
const candidates: CandidateLocation[] = [
{
cacheDir: configPaths.configDir,
cachePackagePath: configPaths.packageJson,
installedPackagePath: join(configPaths.configDir, "node_modules", PACKAGE_NAME, "package.json"),
nodeModulesDir: join(configPaths.configDir, "node_modules"),
},
{
cacheDir,
cachePackagePath: join(cacheDir, "package.json"),
installedPackagePath: join(cacheDir, "node_modules", PACKAGE_NAME, "package.json"),
nodeModulesDir: join(cacheDir, "node_modules"),
},
]
const selectedCandidate = candidates.find((candidate) => existsSync(candidate.installedPackagePath)) ?? candidates[0]
const resolvedCandidates: CandidateSelection[] = candidates.map((candidate) => {
const installedPackagePath =
PACKAGE_NAMES.map((packageName) => join(candidate.nodeModulesDir, packageName, "package.json")).find((path) =>
existsSync(path)
) ?? join(candidate.nodeModulesDir, PACKAGE_NAME, "package.json")
return {
cacheDir: candidate.cacheDir,
cachePackagePath: candidate.cachePackagePath,
installedPackagePath,
}
})
const selectedCandidate = resolvedCandidates.find((candidate) => existsSync(candidate.installedPackagePath)) ?? resolvedCandidates[0]
const { cacheDir: selectedDir, cachePackagePath, installedPackagePath } = selectedCandidate
const cachePackage = readPackageJson(cachePackagePath)
const installedPackage = readPackageJson(installedPackagePath)
const expectedVersion = normalizeVersion(cachePackage?.dependencies?.[PACKAGE_NAME])
const expectedVersion = normalizeVersion(
PACKAGE_NAMES.map((packageName) => cachePackage?.dependencies?.[packageName]).find(
(version): version is string => typeof version === "string"
)
)
const loadedVersion = normalizeVersion(installedPackage?.version)
return {
+2 -1
View File
@@ -1,4 +1,4 @@
import { PLUGIN_NAME } from "../../shared/plugin-identity"
import { LEGACY_PLUGIN_NAME, PLUGIN_NAME } from "../../shared/plugin-identity"
import color from "picocolors"
export const SYMBOLS = {
@@ -40,5 +40,6 @@ export const EXIT_CODES = {
export const MIN_OPENCODE_VERSION = "1.0.150"
export const PACKAGE_NAME = PLUGIN_NAME
export const PACKAGE_NAMES = [PLUGIN_NAME, LEGACY_PLUGIN_NAME] as const
export const OPENCODE_BINARIES = ["opencode", "opencode-desktop"] as const