oh-my-opencode 3.15.1 → 3.15.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,24 @@
1
- /** GPT-5.4 optimized Hephaestus prompt */
1
+ /**
2
+ * GPT-5.4 optimized Hephaestus prompt - entropy-reduced rewrite.
3
+ *
4
+ * Design principles (aligned with OpenAI GPT-5.4 prompting guidance):
5
+ * - Personality/tone at position 1 for strong tonal priming
6
+ * - Prose-based instructions; no FORBIDDEN/MUST/NEVER rhetoric
7
+ * - 3 targeted prompt blocks: tool_persistence, dig_deeper, dependency_checks
8
+ * - GPT-5.4 follows instructions well - trust it, fewer threats needed
9
+ * - Conflicts eliminated: no "every 30s" + "be concise" contradiction
10
+ * - Each concern appears in exactly one section
11
+ *
12
+ * Architecture (XML-tagged blocks, consistent with Sisyphus GPT-5.4):
13
+ * 1. <identity> - Role, personality/tone, autonomy, scope
14
+ * 2. <intent> - Intent mapping, complexity classification, ambiguity protocol
15
+ * 3. <explore> - Tool selection, tool_persistence, dig_deeper, dependency_checks, parallelism
16
+ * 4. <constraints> - Hard blocks + anti-patterns (after explore, before execution)
17
+ * 5. <execution> - 5-step workflow, verification, failure recovery, completion check
18
+ * 6. <tracking> - Todo/task discipline
19
+ * 7. <progress> - Update style with examples
20
+ * 8. <delegation> - Category+skills, prompt structure, session continuity, oracle
21
+ * 9. <communication> - Output format, tone guidance
22
+ */
2
23
  import type { AvailableAgent, AvailableTool, AvailableSkill, AvailableCategory } from "../dynamic-agent-prompt-builder";
3
24
  export declare function buildHephaestusPrompt(availableAgents?: AvailableAgent[], availableTools?: AvailableTool[], availableSkills?: AvailableSkill[], availableCategories?: AvailableCategory[], useTaskSystem?: boolean): string;
package/dist/cli/index.js CHANGED
@@ -6360,7 +6360,7 @@ function getOpenCodeConfigPaths(options) {
6360
6360
  configJson: join4(configDir, "opencode.json"),
6361
6361
  configJsonc: join4(configDir, "opencode.jsonc"),
6362
6362
  packageJson: join4(configDir, "package.json"),
6363
- omoConfig: join4(configDir, "oh-my-opencode.json")
6363
+ omoConfig: join4(configDir, `${CONFIG_BASENAME}.json`)
6364
6364
  };
6365
6365
  }
6366
6366
  var TAURI_APP_IDENTIFIER = "ai.opencode.desktop", TAURI_APP_IDENTIFIER_DEV = "ai.opencode.desktop.dev";
@@ -48620,6 +48620,7 @@ var init_hook_loader = __esm(() => {
48620
48620
  });
48621
48621
 
48622
48622
  // src/features/claude-code-plugin-loader/loader.ts
48623
+ var cachedPluginComponentsByKey;
48623
48624
  var init_loader = __esm(() => {
48624
48625
  init_logger();
48625
48626
  init_discovery();
@@ -48634,6 +48635,7 @@ var init_loader = __esm(() => {
48634
48635
  init_agent_loader();
48635
48636
  init_mcp_server_loader();
48636
48637
  init_hook_loader();
48638
+ cachedPluginComponentsByKey = new Map;
48637
48639
  });
48638
48640
 
48639
48641
  // src/features/claude-code-plugin-loader/index.ts
@@ -48764,6 +48766,10 @@ function getConfigJsonc() {
48764
48766
  return getConfigContext().paths.configJsonc;
48765
48767
  }
48766
48768
  function getOmoConfigPath() {
48769
+ const configDir = getConfigContext().paths.configDir;
48770
+ const detected = detectPluginConfigFile(configDir);
48771
+ if (detected.format !== "none")
48772
+ return detected.path;
48767
48773
  return getConfigContext().paths.omoConfig;
48768
48774
  }
48769
48775
  var configContext = null;
@@ -49636,7 +49642,16 @@ function getWindowsAppdataDir() {
49636
49642
  return null;
49637
49643
  return process.env.APPDATA ?? path4.join(os3.homedir(), "AppData", "Roaming");
49638
49644
  }
49639
- var PACKAGE_NAME = "oh-my-openagent", NPM_REGISTRY_URL, NPM_FETCH_TIMEOUT = 5000, CACHE_ROOT_DIR, CACHE_DIR, VERSION_FILE, USER_CONFIG_DIR, USER_OPENCODE_CONFIG, USER_OPENCODE_CONFIG_JSONC, INSTALLED_PACKAGE_JSON;
49645
+ function getUserConfigDir() {
49646
+ return getOpenCodeConfigDir({ binary: "opencode" });
49647
+ }
49648
+ function getUserOpencodeConfig() {
49649
+ return path4.join(getUserConfigDir(), "opencode.json");
49650
+ }
49651
+ function getUserOpencodeConfigJsonc() {
49652
+ return path4.join(getUserConfigDir(), "opencode.jsonc");
49653
+ }
49654
+ var PACKAGE_NAME = "oh-my-openagent", NPM_REGISTRY_URL, NPM_FETCH_TIMEOUT = 5000, CACHE_ROOT_DIR, CACHE_DIR, VERSION_FILE, INSTALLED_PACKAGE_JSON;
49640
49655
  var init_constants3 = __esm(() => {
49641
49656
  init_data_path();
49642
49657
  init_opencode_config_dir();
@@ -49644,9 +49659,6 @@ var init_constants3 = __esm(() => {
49644
49659
  CACHE_ROOT_DIR = getOpenCodeCacheDir();
49645
49660
  CACHE_DIR = path4.join(CACHE_ROOT_DIR, "packages");
49646
49661
  VERSION_FILE = path4.join(CACHE_ROOT_DIR, "version");
49647
- USER_CONFIG_DIR = getOpenCodeConfigDir({ binary: "opencode" });
49648
- USER_OPENCODE_CONFIG = path4.join(USER_CONFIG_DIR, "opencode.json");
49649
- USER_OPENCODE_CONFIG_JSONC = path4.join(USER_CONFIG_DIR, "opencode.jsonc");
49650
49662
  INSTALLED_PACKAGE_JSON = path4.join(CACHE_DIR, "node_modules", PACKAGE_NAME, "package.json");
49651
49663
  });
49652
49664
 
@@ -49654,17 +49666,18 @@ var init_constants3 = __esm(() => {
49654
49666
  import * as os4 from "os";
49655
49667
  import * as path5 from "path";
49656
49668
  function getConfigPaths(directory) {
49669
+ const userConfigDir = getUserConfigDir();
49657
49670
  const paths = [
49658
49671
  path5.join(directory, ".opencode", "opencode.json"),
49659
49672
  path5.join(directory, ".opencode", "opencode.jsonc"),
49660
- USER_OPENCODE_CONFIG,
49661
- USER_OPENCODE_CONFIG_JSONC
49673
+ getUserOpencodeConfig(),
49674
+ getUserOpencodeConfigJsonc()
49662
49675
  ];
49663
49676
  if (process.platform === "win32") {
49664
49677
  const crossPlatformDir = path5.join(os4.homedir(), ".config");
49665
49678
  const appdataDir = getWindowsAppdataDir();
49666
49679
  if (appdataDir) {
49667
- const alternateDir = USER_CONFIG_DIR === crossPlatformDir ? appdataDir : crossPlatformDir;
49680
+ const alternateDir = userConfigDir === crossPlatformDir ? appdataDir : crossPlatformDir;
49668
49681
  const alternateConfig = path5.join(alternateDir, "opencode", "opencode.json");
49669
49682
  const alternateConfigJsonc = path5.join(alternateDir, "opencode", "opencode.jsonc");
49670
49683
  if (!paths.includes(alternateConfig)) {
@@ -50121,8 +50134,9 @@ function removeFromBunLock(packageName) {
50121
50134
  }
50122
50135
  function invalidatePackage(packageName = PACKAGE_NAME) {
50123
50136
  try {
50137
+ const userConfigDir = getUserConfigDir();
50124
50138
  const pkgDirs = [
50125
- path9.join(USER_CONFIG_DIR, "node_modules", packageName),
50139
+ path9.join(userConfigDir, "node_modules", packageName),
50126
50140
  path9.join(CACHE_DIR, "node_modules", packageName)
50127
50141
  ];
50128
50142
  let packageRemoved = false;
@@ -50583,7 +50597,7 @@ var {
50583
50597
  // package.json
50584
50598
  var package_default = {
50585
50599
  name: "oh-my-opencode",
50586
- version: "3.15.1",
50600
+ version: "3.15.2",
50587
50601
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
50588
50602
  main: "./dist/index.js",
50589
50603
  types: "dist/index.d.ts",
@@ -50661,17 +50675,17 @@ var package_default = {
50661
50675
  typescript: "^5.7.3"
50662
50676
  },
50663
50677
  optionalDependencies: {
50664
- "oh-my-opencode-darwin-arm64": "3.15.1",
50665
- "oh-my-opencode-darwin-x64": "3.15.1",
50666
- "oh-my-opencode-darwin-x64-baseline": "3.15.1",
50667
- "oh-my-opencode-linux-arm64": "3.15.1",
50668
- "oh-my-opencode-linux-arm64-musl": "3.15.1",
50669
- "oh-my-opencode-linux-x64": "3.15.1",
50670
- "oh-my-opencode-linux-x64-baseline": "3.15.1",
50671
- "oh-my-opencode-linux-x64-musl": "3.15.1",
50672
- "oh-my-opencode-linux-x64-musl-baseline": "3.15.1",
50673
- "oh-my-opencode-windows-x64": "3.15.1",
50674
- "oh-my-opencode-windows-x64-baseline": "3.15.1"
50678
+ "oh-my-opencode-darwin-arm64": "3.15.2",
50679
+ "oh-my-opencode-darwin-x64": "3.15.2",
50680
+ "oh-my-opencode-darwin-x64-baseline": "3.15.2",
50681
+ "oh-my-opencode-linux-arm64": "3.15.2",
50682
+ "oh-my-opencode-linux-arm64-musl": "3.15.2",
50683
+ "oh-my-opencode-linux-x64": "3.15.2",
50684
+ "oh-my-opencode-linux-x64-baseline": "3.15.2",
50685
+ "oh-my-opencode-linux-x64-musl": "3.15.2",
50686
+ "oh-my-opencode-linux-x64-musl-baseline": "3.15.2",
50687
+ "oh-my-opencode-windows-x64": "3.15.2",
50688
+ "oh-my-opencode-windows-x64-baseline": "3.15.2"
50675
50689
  },
50676
50690
  overrides: {
50677
50691
  "@opencode-ai/sdk": "^1.2.24"
@@ -66662,7 +66676,7 @@ function mergeConfigs(base, override) {
66662
66676
  function loadPluginConfig(directory, ctx) {
66663
66677
  const configDir = getOpenCodeConfigDir({ binary: "opencode" });
66664
66678
  const userDetected = detectPluginConfigFile(configDir);
66665
- let userConfigPath = userDetected.format !== "none" ? userDetected.path : path3.join(configDir, "oh-my-opencode.json");
66679
+ let userConfigPath = userDetected.format !== "none" ? userDetected.path : path3.join(configDir, `${CONFIG_BASENAME}.json`);
66666
66680
  if (userDetected.legacyPath) {
66667
66681
  log("Canonical plugin config detected alongside legacy config. Remove the legacy file to avoid confusion.", {
66668
66682
  canonicalPath: userDetected.path,
@@ -66670,12 +66684,15 @@ function loadPluginConfig(directory, ctx) {
66670
66684
  });
66671
66685
  }
66672
66686
  if (userDetected.format !== "none" && path3.basename(userDetected.path).startsWith(LEGACY_CONFIG_BASENAME)) {
66673
- migrateLegacyConfigFile(userDetected.path);
66674
- userConfigPath = path3.join(path3.dirname(userDetected.path), `${CONFIG_BASENAME}${path3.extname(userDetected.path)}`);
66687
+ const migrated = migrateLegacyConfigFile(userDetected.path);
66688
+ const canonicalPath = path3.join(path3.dirname(userDetected.path), `${CONFIG_BASENAME}${path3.extname(userDetected.path)}`);
66689
+ if (migrated || fs3.existsSync(canonicalPath)) {
66690
+ userConfigPath = canonicalPath;
66691
+ }
66675
66692
  }
66676
66693
  const projectBasePath = path3.join(directory, ".opencode");
66677
66694
  const projectDetected = detectPluginConfigFile(projectBasePath);
66678
- let projectConfigPath = projectDetected.format !== "none" ? projectDetected.path : path3.join(projectBasePath, "oh-my-opencode.json");
66695
+ let projectConfigPath = projectDetected.format !== "none" ? projectDetected.path : path3.join(projectBasePath, `${CONFIG_BASENAME}.json`);
66679
66696
  if (projectDetected.legacyPath) {
66680
66697
  log("Canonical plugin config detected alongside legacy config. Remove the legacy file to avoid confusion.", {
66681
66698
  canonicalPath: projectDetected.path,
@@ -66683,8 +66700,11 @@ function loadPluginConfig(directory, ctx) {
66683
66700
  });
66684
66701
  }
66685
66702
  if (projectDetected.format !== "none" && path3.basename(projectDetected.path).startsWith(LEGACY_CONFIG_BASENAME)) {
66686
- migrateLegacyConfigFile(projectDetected.path);
66687
- projectConfigPath = path3.join(path3.dirname(projectDetected.path), `${CONFIG_BASENAME}${path3.extname(projectDetected.path)}`);
66703
+ const projectMigrated = migrateLegacyConfigFile(projectDetected.path);
66704
+ const canonicalProjectPath = path3.join(path3.dirname(projectDetected.path), `${CONFIG_BASENAME}${path3.extname(projectDetected.path)}`);
66705
+ if (projectMigrated || fs3.existsSync(canonicalProjectPath)) {
66706
+ projectConfigPath = canonicalProjectPath;
66707
+ }
66688
66708
  }
66689
66709
  const userConfig = loadConfigFromPath(userConfigPath, ctx);
66690
66710
  let config2 = userConfig ?? OhMyOpenCodeConfigSchema.parse({});
@@ -69798,7 +69818,6 @@ init_model_capabilities();
69798
69818
  init_shared();
69799
69819
  import { readFileSync as readFileSync24 } from "fs";
69800
69820
  import { join as join24 } from "path";
69801
- var USER_CONFIG_DIR2 = getOpenCodeConfigPaths({ binary: "opencode", version: null }).configDir;
69802
69821
  var PROJECT_CONFIG_DIR = join24(process.cwd(), ".opencode");
69803
69822
  function loadOmoConfig() {
69804
69823
  const projectDetected = detectPluginConfigFile(PROJECT_CONFIG_DIR);
@@ -69810,7 +69829,8 @@ function loadOmoConfig() {
69810
69829
  return null;
69811
69830
  }
69812
69831
  }
69813
- const userDetected = detectPluginConfigFile(USER_CONFIG_DIR2);
69832
+ const userConfigDir = getOpenCodeConfigDir({ binary: "opencode" });
69833
+ const userDetected = detectPluginConfigFile(userConfigDir);
69814
69834
  if (userDetected.format !== "none") {
69815
69835
  try {
69816
69836
  const content = readFileSync24(userDetected.path, "utf-8");
@@ -70021,13 +70041,13 @@ async function checkModels() {
70021
70041
  }
70022
70042
 
70023
70043
  // src/cli/doctor/checks/config.ts
70024
- var USER_CONFIG_DIR3 = getOpenCodeConfigDir({ binary: "opencode" });
70025
70044
  var PROJECT_CONFIG_DIR2 = join26(process.cwd(), ".opencode");
70026
70045
  function findConfigPath() {
70027
70046
  const projectConfig = detectPluginConfigFile(PROJECT_CONFIG_DIR2);
70028
70047
  if (projectConfig.format !== "none")
70029
70048
  return projectConfig.path;
70030
- const userConfig = detectPluginConfigFile(USER_CONFIG_DIR3);
70049
+ const userConfigDir = getOpenCodeConfigDir({ binary: "opencode" });
70050
+ const userConfig = detectPluginConfigFile(userConfigDir);
70031
70051
  if (userConfig.format !== "none")
70032
70052
  return userConfig.path;
70033
70053
  return null;
@@ -4,6 +4,7 @@ export declare function isTmuxIntegrationEnabled(pluginConfig: {
4
4
  enabled?: boolean;
5
5
  } | undefined;
6
6
  }): boolean;
7
+ export declare function isInteractiveBashEnabled(which?: (binary: string) => string | null): boolean;
7
8
  export declare function createRuntimeTmuxConfig(pluginConfig: {
8
9
  tmux?: OhMyOpenCodeConfig["tmux"];
9
10
  }): TmuxConfig;
@@ -1,6 +1,9 @@
1
1
  import type { BackgroundTask, LaunchInput, ResumeInput } from "./types";
2
2
  import type { OpencodeClient, OnSubagentSessionCreated, QueueItem } from "./constants";
3
3
  import type { ConcurrencyManager } from "./concurrency";
4
+ export declare const FALLBACK_AGENT = "general";
5
+ export declare function isAgentNotFoundError(error: unknown): boolean;
6
+ export declare function buildFallbackBody(originalBody: Record<string, unknown>, fallbackAgent: string): Record<string, unknown>;
4
7
  export interface SpawnerContext {
5
8
  client: OpencodeClient;
6
9
  directory: string;
@@ -1,2 +1,3 @@
1
- import type { PluginLoadResult, PluginLoaderOptions } from "./types";
1
+ import type { PluginManifest, PluginLoadResult, PluginLoaderOptions } from "./types";
2
+ export declare function loadPluginManifest(installPath: string): PluginManifest | null;
2
3
  export declare function discoverInstalledPlugins(options?: PluginLoaderOptions): PluginLoadResult;
@@ -17,4 +17,5 @@ export interface PluginComponentsResult {
17
17
  plugins: LoadedPlugin[];
18
18
  errors: PluginLoadError[];
19
19
  }
20
+ export declare function clearPluginComponentsCache(): void;
20
21
  export declare function loadAllPluginComponents(options?: PluginLoaderOptions): Promise<PluginComponentsResult>;
@@ -204,6 +204,16 @@ export interface ClaudeSettings {
204
204
  * Plugin loader options
205
205
  */
206
206
  export interface PluginLoaderOptions {
207
+ /**
208
+ * Override the plugins home directory for testing.
209
+ * If not provided, uses CLAUDE_PLUGINS_HOME env var or ~/.claude/plugins
210
+ */
211
+ pluginsHomeOverride?: string;
212
+ /**
213
+ * Override plugin manifest loading for testing.
214
+ * Return null to force plugin name derivation from the plugin key.
215
+ */
216
+ loadPluginManifestOverride?: (installPath: string) => PluginManifest | null;
207
217
  /**
208
218
  * Override enabled plugins from oh-my-opencode config.
209
219
  * Key format: "pluginName@marketplace" (e.g., "shell-scripting@claude-code-workflows")
@@ -5,7 +5,7 @@ export declare const CACHE_ROOT_DIR: string;
5
5
  export declare const CACHE_DIR: string;
6
6
  export declare const VERSION_FILE: string;
7
7
  export declare function getWindowsAppdataDir(): string | null;
8
- export declare const USER_CONFIG_DIR: string;
9
- export declare const USER_OPENCODE_CONFIG: string;
10
- export declare const USER_OPENCODE_CONFIG_JSONC: string;
8
+ export declare function getUserConfigDir(): string;
9
+ export declare function getUserOpencodeConfig(): string;
10
+ export declare function getUserOpencodeConfigJsonc(): string;
11
11
  export declare const INSTALLED_PACKAGE_JSON: string;