oh-my-opencode 5.0.0-beta.26 → 5.0.0-beta.28

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.
Files changed (112) hide show
  1. package/dist/cli/config-manager/parse-opencode-config-file.d.ts +2 -1
  2. package/dist/cli/doctor/checks/system-plugin.d.ts +4 -3
  3. package/dist/cli/index.js +59 -45
  4. package/dist/cli-node/index.js +82 -45
  5. package/dist/hooks/todo-continuation-enforcer/types.d.ts +1 -0
  6. package/dist/index.js +53 -28
  7. package/dist/shared/index.d.ts +1 -0
  8. package/dist/shared/legacy-plugin-warning.d.ts +2 -1
  9. package/dist/shared/plugin-entry-migrator.d.ts +4 -3
  10. package/dist/shared/plugin-entry-shape.d.ts +6 -0
  11. package/dist/skills/data-scientist/SKILL.md +99 -239
  12. package/dist/skills/data-scientist/references/execution-surfaces.md +91 -0
  13. package/dist/skills/data-scientist/references/placement.md +74 -0
  14. package/dist/skills/data-scientist/references/polars-lane.md +95 -0
  15. package/dist/skills/data-scientist/references/uv-setup.md +1 -1
  16. package/dist/skills/data-scientist/references/visualization.md +64 -0
  17. package/dist/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
  18. package/dist/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
  19. package/dist/skills/ulw-research/SKILL.md +3 -1
  20. package/dist/tui.d.ts +12 -0
  21. package/dist/tui.js +3 -3
  22. package/package.json +15 -15
  23. package/packages/lsp-core/src/request-context.test.ts +29 -0
  24. package/packages/lsp-core/src/request-context.ts +1 -1
  25. package/packages/lsp-daemon/dist/cli.js +1 -1
  26. package/packages/lsp-daemon/dist/client.js +1 -1
  27. package/packages/lsp-daemon/dist/index.js +1 -1
  28. package/packages/lsp-tools-mcp/dist/cli.js +1 -1
  29. package/packages/lsp-tools-mcp/dist/mcp.js +1 -1
  30. package/packages/lsp-tools-mcp/dist/request-context.js +1 -1
  31. package/packages/lsp-tools-mcp/dist/tools.js +1 -1
  32. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  33. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  34. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  35. package/packages/omo-codex/plugin/components/codegraph/package.json +1 -1
  36. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  37. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  38. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  39. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  40. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  41. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  42. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
  43. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  44. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  45. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  46. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  47. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  48. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  49. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  50. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  51. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  52. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  53. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +2 -2
  54. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  55. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
  56. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  57. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  58. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  59. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  60. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +1 -1
  61. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  62. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  63. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  64. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  65. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  66. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  67. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  68. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  69. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  70. package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +1 -1
  71. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  72. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  73. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  74. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  75. package/packages/omo-codex/plugin/hooks/subagent-stop-checking-ulw-execute-continuation.json +1 -1
  76. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  77. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  78. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  79. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  80. package/packages/omo-codex/plugin/package-lock.json +13 -13
  81. package/packages/omo-codex/plugin/package.json +1 -1
  82. package/packages/omo-codex/plugin/skills/data-scientist/SKILL.md +99 -239
  83. package/packages/omo-codex/plugin/skills/data-scientist/references/execution-surfaces.md +91 -0
  84. package/packages/omo-codex/plugin/skills/data-scientist/references/placement.md +74 -0
  85. package/packages/omo-codex/plugin/skills/data-scientist/references/polars-lane.md +95 -0
  86. package/packages/omo-codex/plugin/skills/data-scientist/references/uv-setup.md +1 -1
  87. package/packages/omo-codex/plugin/skills/data-scientist/references/visualization.md +64 -0
  88. package/packages/omo-codex/plugin/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
  89. package/packages/omo-codex/plugin/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
  90. package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +3 -1
  91. package/packages/omo-codex/scripts/install-dist/install-local.mjs +2 -2
  92. package/packages/shared-skills/skills/data-scientist/SKILL.md +99 -239
  93. package/packages/shared-skills/skills/data-scientist/references/execution-surfaces.md +91 -0
  94. package/packages/shared-skills/skills/data-scientist/references/placement.md +74 -0
  95. package/packages/shared-skills/skills/data-scientist/references/polars-lane.md +95 -0
  96. package/packages/shared-skills/skills/data-scientist/references/uv-setup.md +1 -1
  97. package/packages/shared-skills/skills/data-scientist/references/visualization.md +64 -0
  98. package/packages/shared-skills/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
  99. package/packages/shared-skills/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
  100. package/packages/shared-skills/skills/ulw-research/SKILL.md +3 -1
  101. package/dist/skills/data-scientist/references/common-scenarios.md +0 -176
  102. package/dist/skills/data-scientist/references/execution-templates.md +0 -197
  103. package/dist/skills/data-scientist/references/integration-patterns.md +0 -153
  104. package/dist/skills/data-scientist/references/performance-benchmarks.md +0 -37
  105. package/packages/omo-codex/plugin/skills/data-scientist/references/common-scenarios.md +0 -176
  106. package/packages/omo-codex/plugin/skills/data-scientist/references/execution-templates.md +0 -197
  107. package/packages/omo-codex/plugin/skills/data-scientist/references/integration-patterns.md +0 -153
  108. package/packages/omo-codex/plugin/skills/data-scientist/references/performance-benchmarks.md +0 -37
  109. package/packages/shared-skills/skills/data-scientist/references/common-scenarios.md +0 -176
  110. package/packages/shared-skills/skills/data-scientist/references/execution-templates.md +0 -197
  111. package/packages/shared-skills/skills/data-scientist/references/integration-patterns.md +0 -153
  112. package/packages/shared-skills/skills/data-scientist/references/performance-benchmarks.md +0 -37
@@ -1,9 +1,10 @@
1
+ import { type PluginEntry } from "../../shared";
1
2
  interface ParseConfigResult {
2
3
  config: OpenCodeConfig | null;
3
4
  error?: string;
4
5
  }
5
6
  export interface OpenCodeConfig {
6
- plugin?: string[];
7
+ plugin?: PluginEntry[];
7
8
  [key: string]: unknown;
8
9
  }
9
10
  export declare function parseOpenCodeConfigFileWithError(path: string): ParseConfigResult;
@@ -1,14 +1,15 @@
1
+ import { type PluginEntry } from "../../../shared";
1
2
  export interface PluginInfo {
2
3
  registered: boolean;
3
4
  configPath: string | null;
4
- entry: string | null;
5
+ entry: PluginEntry | null;
5
6
  isPinned: boolean;
6
7
  pinnedVersion: string | null;
7
8
  isLocalDev: boolean;
8
9
  }
9
10
  declare function detectConfigPath(): string | null;
10
- declare function findPluginEntry(entries: string[]): {
11
- entry: string;
11
+ declare function findPluginEntry(entries: PluginEntry[]): {
12
+ entry: PluginEntry;
12
13
  isLocalDev: boolean;
13
14
  } | null;
14
15
  export declare function getPluginInfo(): PluginInfo;
package/dist/cli/index.js CHANGED
@@ -54,7 +54,7 @@ var package_default;
54
54
  var init_package = __esm(() => {
55
55
  package_default = {
56
56
  name: "oh-my-opencode",
57
- version: "5.0.0-beta.26",
57
+ version: "5.0.0-beta.28",
58
58
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
59
59
  main: "./dist/index.js",
60
60
  types: "dist/index.d.ts",
@@ -235,7 +235,7 @@ var init_package = __esm(() => {
235
235
  zod: "^4.4.3"
236
236
  },
237
237
  devDependencies: {
238
- "@code-yeongyu/senpi": "2026.8.28-2",
238
+ "@code-yeongyu/senpi": "2026.8.30",
239
239
  "@oh-my-opencode/agents-md-core": "workspace:*",
240
240
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
241
241
  "@oh-my-opencode/boulder-state": "workspace:*",
@@ -276,18 +276,18 @@ var init_package = __esm(() => {
276
276
  typescript: "^7.0.2"
277
277
  },
278
278
  optionalDependencies: {
279
- "oh-my-opencode-darwin-arm64": "5.0.0-beta.26",
280
- "oh-my-opencode-darwin-x64": "5.0.0-beta.26",
281
- "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.26",
282
- "oh-my-opencode-linux-arm64": "5.0.0-beta.26",
283
- "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.26",
284
- "oh-my-opencode-linux-x64": "5.0.0-beta.26",
285
- "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.26",
286
- "oh-my-opencode-linux-x64-musl": "5.0.0-beta.26",
287
- "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.26",
288
- "oh-my-opencode-windows-arm64": "5.0.0-beta.26",
289
- "oh-my-opencode-windows-x64": "5.0.0-beta.26",
290
- "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.26"
279
+ "oh-my-opencode-darwin-arm64": "5.0.0-beta.28",
280
+ "oh-my-opencode-darwin-x64": "5.0.0-beta.28",
281
+ "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.28",
282
+ "oh-my-opencode-linux-arm64": "5.0.0-beta.28",
283
+ "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.28",
284
+ "oh-my-opencode-linux-x64": "5.0.0-beta.28",
285
+ "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.28",
286
+ "oh-my-opencode-linux-x64-musl": "5.0.0-beta.28",
287
+ "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.28",
288
+ "oh-my-opencode-windows-arm64": "5.0.0-beta.28",
289
+ "oh-my-opencode-windows-x64": "5.0.0-beta.28",
290
+ "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.28"
291
291
  },
292
292
  overrides: {
293
293
  "@earendil-works/pi-agent-core": "0.84.2",
@@ -305,7 +305,7 @@ var init_package = __esm(() => {
305
305
  "@code-yeongyu/comment-checker"
306
306
  ],
307
307
  patchedDependencies: {
308
- "@code-yeongyu/senpi@2026.8.28-2": "patches/@code-yeongyu%2Fsenpi@2026.8.28-2.patch"
308
+ "@code-yeongyu/senpi@2026.8.30": "patches/@code-yeongyu%2Fsenpi@2026.8.30.patch"
309
309
  }
310
310
  };
311
311
  });
@@ -84204,6 +84204,17 @@ var init_session_category_registry = __esm(() => {
84204
84204
  sessionCategoryMap = new Map;
84205
84205
  });
84206
84206
 
84207
+ // packages/omo-opencode/src/shared/plugin-entry-shape.ts
84208
+ function isPluginTupleEntry(entry) {
84209
+ return Array.isArray(entry) && typeof entry[0] === "string";
84210
+ }
84211
+ function getPluginEntryName(entry) {
84212
+ return isPluginTupleEntry(entry) ? entry[0] : entry;
84213
+ }
84214
+ function withPluginEntryName(entry, name) {
84215
+ return isPluginTupleEntry(entry) ? [name, entry[1]] : name;
84216
+ }
84217
+
84207
84218
  // packages/omo-opencode/src/shared/legacy-plugin-warning.ts
84208
84219
  var init_legacy_plugin_warning = __esm(() => {
84209
84220
  init_jsonc_parser2();
@@ -84669,13 +84680,14 @@ function getConfigTargets() {
84669
84680
  });
84670
84681
  }
84671
84682
  function isSourceOmoPluginEntry(plugin) {
84672
- const normalized = plugin.toLowerCase().replaceAll("\\", "/");
84683
+ const normalized = getPluginEntryName(plugin).toLowerCase().replaceAll("\\", "/");
84673
84684
  if (!normalized.startsWith("file://"))
84674
84685
  return false;
84675
84686
  return /\/(omo(?:-[^/]*)?|oh-my-opencode|oh-my-openagent)\/(src|dist)\/index\.(ts|js)$/.test(normalized);
84676
84687
  }
84677
84688
  function isPackageOmoPluginEntry(plugin) {
84678
- return plugin === PLUGIN_NAME || plugin.startsWith(`${PLUGIN_NAME}@`) || plugin === LEGACY_PLUGIN_NAME || plugin.startsWith(`${LEGACY_PLUGIN_NAME}@`);
84689
+ const name = getPluginEntryName(plugin);
84690
+ return name === PLUGIN_NAME || name.startsWith(`${PLUGIN_NAME}@`) || name === LEGACY_PLUGIN_NAME || name.startsWith(`${LEGACY_PLUGIN_NAME}@`);
84679
84691
  }
84680
84692
  function isOurPlugin(plugin) {
84681
84693
  return isPackageOmoPluginEntry(plugin) || isSourceOmoPluginEntry(plugin);
@@ -84697,6 +84709,9 @@ function choosePluginEntry(params) {
84697
84709
  if (params.preferredSourceEntry) {
84698
84710
  return params.preferredSourceEntry;
84699
84711
  }
84712
+ if (params.existingEntry) {
84713
+ return withPluginEntryName(params.existingEntry, params.fallbackEntry);
84714
+ }
84700
84715
  return params.fallbackEntry;
84701
84716
  }
84702
84717
  function writePluginEntryToTarget(params) {
@@ -84730,7 +84745,7 @@ function writePluginEntryToTarget(params) {
84730
84745
  preferredSourceEntry
84731
84746
  });
84732
84747
  if (existingEntry && !preferredSourceEntry) {
84733
- const installedVersion = extractVersionFromPluginEntry(existingEntry);
84748
+ const installedVersion = extractVersionFromPluginEntry(getPluginEntryName(existingEntry));
84734
84749
  const compatibility = checkVersionCompatibility(installedVersion, currentVersion);
84735
84750
  if (!compatibility.canUpgrade) {
84736
84751
  return {
@@ -84753,20 +84768,12 @@ function writePluginEntryToTarget(params) {
84753
84768
  config3.plugin = normalizedPlugins;
84754
84769
  if (target.format === "jsonc") {
84755
84770
  const content = readFileSync8(target.path, "utf-8");
84756
- const pluginArrayRegex = /((?:"plugin"|plugin)\s*:\s*)\[([\s\S]*?)\]/;
84757
- const match = content.match(pluginArrayRegex);
84758
- if (match) {
84759
- const formattedPlugins = normalizedPlugins.map((p) => `"${p}"`).join(`,
84760
- `);
84761
- const newContent = content.replace(pluginArrayRegex, `$1[
84762
- ${formattedPlugins}
84763
- ]`);
84764
- writeFileSync5(target.path, newContent);
84765
- } else {
84766
- const newContent = content.replace(/(\{)/, `$1
84767
- "plugin": ["${nextPluginEntry}"],`);
84768
- writeFileSync5(target.path, newContent);
84769
- }
84771
+ const edits = modify(content, ["plugin"], normalizedPlugins, {
84772
+ formattingOptions: { insertSpaces: true, tabSize: 2, eol: `
84773
+ ` },
84774
+ getInsertionIndex: () => 0
84775
+ });
84776
+ writeFileSync5(target.path, applyEdits(content, edits));
84770
84777
  } else {
84771
84778
  writeFileSync5(target.path, JSON.stringify(config3, null, 2) + `
84772
84779
  `);
@@ -84811,6 +84818,7 @@ async function addPluginToOpenCodeConfig(currentVersion) {
84811
84818
  return primaryResult ?? { success: true, configPath: primaryTarget.path };
84812
84819
  }
84813
84820
  var init_add_plugin_to_opencode_config = __esm(() => {
84821
+ init_main();
84814
84822
  init_shared();
84815
84823
  init_backup_config();
84816
84824
  init_config_context();
@@ -86340,10 +86348,12 @@ function detectProvidersFromOmoConfig() {
86340
86348
  }
86341
86349
  }
86342
86350
  function isOurPlugin2(plugin) {
86343
- return plugin === PLUGIN_NAME || plugin.startsWith(`${PLUGIN_NAME}@`) || plugin === LEGACY_PLUGIN_NAME || plugin.startsWith(`${LEGACY_PLUGIN_NAME}@`);
86351
+ const name = getPluginEntryName(plugin);
86352
+ return name === PLUGIN_NAME || name.startsWith(`${PLUGIN_NAME}@`) || name === LEGACY_PLUGIN_NAME || name.startsWith(`${LEGACY_PLUGIN_NAME}@`);
86344
86353
  }
86345
86354
  function findOurPluginEntry2(plugins) {
86346
- return plugins.find(isOurPlugin2) ?? null;
86355
+ const entry = plugins.find(isOurPlugin2);
86356
+ return entry === undefined ? null : getPluginEntryName(entry);
86347
86357
  }
86348
86358
  function detectCurrentConfig() {
86349
86359
  const result = {
@@ -94390,7 +94400,7 @@ var package_default2;
94390
94400
  var init_package2 = __esm(() => {
94391
94401
  package_default2 = {
94392
94402
  name: "@oh-my-opencode/omo-codex",
94393
- version: "5.0.0-beta.26",
94403
+ version: "5.0.0-beta.28",
94394
94404
  type: "module",
94395
94405
  private: true,
94396
94406
  description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
@@ -110035,14 +110045,15 @@ function detectConfigPath() {
110035
110045
  return null;
110036
110046
  }
110037
110047
  function parsePluginVersion(entry) {
110038
- if (entry.startsWith(`${PLUGIN_NAME}@`)) {
110039
- const value = entry.slice(PLUGIN_NAME.length + 1);
110048
+ const name = getPluginEntryName(entry);
110049
+ if (name.startsWith(`${PLUGIN_NAME}@`)) {
110050
+ const value = name.slice(PLUGIN_NAME.length + 1);
110040
110051
  if (!value || value === "latest")
110041
110052
  return null;
110042
110053
  return value;
110043
110054
  }
110044
- if (entry.startsWith(`${LEGACY_PLUGIN_NAME}@`)) {
110045
- const value = entry.slice(LEGACY_PLUGIN_NAME.length + 1);
110055
+ if (name.startsWith(`${LEGACY_PLUGIN_NAME}@`)) {
110056
+ const value = name.slice(LEGACY_PLUGIN_NAME.length + 1);
110046
110057
  if (!value || value === "latest")
110047
110058
  return null;
110048
110059
  return value;
@@ -110051,13 +110062,14 @@ function parsePluginVersion(entry) {
110051
110062
  }
110052
110063
  function findPluginEntry2(entries) {
110053
110064
  for (const entry of entries) {
110054
- if (entry === PLUGIN_NAME || entry.startsWith(`${PLUGIN_NAME}@`)) {
110065
+ const name = getPluginEntryName(entry);
110066
+ if (name === PLUGIN_NAME || name.startsWith(`${PLUGIN_NAME}@`)) {
110055
110067
  return { entry, isLocalDev: false };
110056
110068
  }
110057
- if (entry === LEGACY_PLUGIN_NAME || entry.startsWith(`${LEGACY_PLUGIN_NAME}@`)) {
110069
+ if (name === LEGACY_PLUGIN_NAME || name.startsWith(`${LEGACY_PLUGIN_NAME}@`)) {
110058
110070
  return { entry, isLocalDev: false };
110059
110071
  }
110060
- if (entry.startsWith("file://") && (entry.includes(PLUGIN_NAME) || entry.includes(LEGACY_PLUGIN_NAME))) {
110072
+ if (name.startsWith("file://") && (name.includes(PLUGIN_NAME) || name.includes(LEGACY_PLUGIN_NAME))) {
110061
110073
  return { entry, isLocalDev: true };
110062
110074
  }
110063
110075
  }
@@ -110379,13 +110391,14 @@ async function checkSystem(deps = defaultDeps6) {
110379
110391
  });
110380
110392
  }
110381
110393
  if (pluginInfo.entry && !pluginInfo.isLocalDev) {
110382
- const isLegacyName = pluginInfo.entry === LEGACY_PLUGIN_NAME || pluginInfo.entry.startsWith(`${LEGACY_PLUGIN_NAME}@`);
110394
+ const entryName = getPluginEntryName(pluginInfo.entry);
110395
+ const isLegacyName = entryName === LEGACY_PLUGIN_NAME || entryName.startsWith(`${LEGACY_PLUGIN_NAME}@`);
110383
110396
  if (isLegacyName) {
110384
- const suggestedEntry = pluginInfo.entry.replace(LEGACY_PLUGIN_NAME, PLUGIN_NAME);
110397
+ const suggestedEntry = entryName.replace(LEGACY_PLUGIN_NAME, PLUGIN_NAME);
110385
110398
  issues.push({
110386
110399
  title: "Using legacy package name",
110387
110400
  description: `Your opencode.json references "${LEGACY_PLUGIN_NAME}" which has been renamed to "${PLUGIN_NAME}". The old name may stop working in a future release.`,
110388
- fix: `Update your opencode.json plugin entry: "${pluginInfo.entry}" \u2192 "${suggestedEntry}"`,
110401
+ fix: `Update your opencode.json plugin entry: "${entryName}" \u2192 "${suggestedEntry}"`,
110389
110402
  severity: "warning",
110390
110403
  affects: ["plugin loading"]
110391
110404
  });
@@ -111405,6 +111418,7 @@ function createLspMcpConfig(options = {}) {
111405
111418
  enabled: resolvedCommand.exists,
111406
111419
  cwd,
111407
111420
  environment: {
111421
+ LSP_TOOLS_MCP_CWD: cwd,
111408
111422
  LSP_TOOLS_MCP_PROJECT_CONFIG: PROJECT_LSP_CONFIGS.map((configPath) => resolve23(cwd, configPath)).join(delimiter3),
111409
111423
  LSP_TOOLS_MCP_USER_CONFIG: resolve23(configDir, "lsp.json"),
111410
111424
  LSP_TOOLS_MCP_INSTALL_DECISIONS: resolve23(configDir, "lsp-install-decisions.json"),
@@ -55,7 +55,7 @@ var package_default;
55
55
  var init_package = __esm(() => {
56
56
  package_default = {
57
57
  name: "oh-my-opencode",
58
- version: "5.0.0-beta.26",
58
+ version: "5.0.0-beta.28",
59
59
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
60
60
  main: "./dist/index.js",
61
61
  types: "dist/index.d.ts",
@@ -236,7 +236,7 @@ var init_package = __esm(() => {
236
236
  zod: "^4.4.3"
237
237
  },
238
238
  devDependencies: {
239
- "@code-yeongyu/senpi": "2026.8.28-2",
239
+ "@code-yeongyu/senpi": "2026.8.30",
240
240
  "@oh-my-opencode/agents-md-core": "workspace:*",
241
241
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
242
242
  "@oh-my-opencode/boulder-state": "workspace:*",
@@ -277,18 +277,18 @@ var init_package = __esm(() => {
277
277
  typescript: "^7.0.2"
278
278
  },
279
279
  optionalDependencies: {
280
- "oh-my-opencode-darwin-arm64": "5.0.0-beta.26",
281
- "oh-my-opencode-darwin-x64": "5.0.0-beta.26",
282
- "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.26",
283
- "oh-my-opencode-linux-arm64": "5.0.0-beta.26",
284
- "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.26",
285
- "oh-my-opencode-linux-x64": "5.0.0-beta.26",
286
- "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.26",
287
- "oh-my-opencode-linux-x64-musl": "5.0.0-beta.26",
288
- "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.26",
289
- "oh-my-opencode-windows-arm64": "5.0.0-beta.26",
290
- "oh-my-opencode-windows-x64": "5.0.0-beta.26",
291
- "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.26"
280
+ "oh-my-opencode-darwin-arm64": "5.0.0-beta.28",
281
+ "oh-my-opencode-darwin-x64": "5.0.0-beta.28",
282
+ "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.28",
283
+ "oh-my-opencode-linux-arm64": "5.0.0-beta.28",
284
+ "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.28",
285
+ "oh-my-opencode-linux-x64": "5.0.0-beta.28",
286
+ "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.28",
287
+ "oh-my-opencode-linux-x64-musl": "5.0.0-beta.28",
288
+ "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.28",
289
+ "oh-my-opencode-windows-arm64": "5.0.0-beta.28",
290
+ "oh-my-opencode-windows-x64": "5.0.0-beta.28",
291
+ "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.28"
292
292
  },
293
293
  overrides: {
294
294
  "@earendil-works/pi-agent-core": "0.84.2",
@@ -306,7 +306,7 @@ var init_package = __esm(() => {
306
306
  "@code-yeongyu/comment-checker"
307
307
  ],
308
308
  patchedDependencies: {
309
- "@code-yeongyu/senpi@2026.8.28-2": "patches/@code-yeongyu%2Fsenpi@2026.8.28-2.patch"
309
+ "@code-yeongyu/senpi@2026.8.30": "patches/@code-yeongyu%2Fsenpi@2026.8.30.patch"
310
310
  }
311
311
  };
312
312
  });
@@ -84205,6 +84205,17 @@ var init_session_category_registry = __esm(() => {
84205
84205
  sessionCategoryMap = new Map;
84206
84206
  });
84207
84207
 
84208
+ // packages/omo-opencode/src/shared/plugin-entry-shape.ts
84209
+ function isPluginTupleEntry(entry) {
84210
+ return Array.isArray(entry) && typeof entry[0] === "string";
84211
+ }
84212
+ function getPluginEntryName(entry) {
84213
+ return isPluginTupleEntry(entry) ? entry[0] : entry;
84214
+ }
84215
+ function withPluginEntryName(entry, name) {
84216
+ return isPluginTupleEntry(entry) ? [name, entry[1]] : name;
84217
+ }
84218
+
84208
84219
  // packages/omo-opencode/src/shared/legacy-plugin-warning.ts
84209
84220
  var init_legacy_plugin_warning = __esm(() => {
84210
84221
  init_jsonc_parser2();
@@ -84213,6 +84224,29 @@ var init_legacy_plugin_warning = __esm(() => {
84213
84224
  });
84214
84225
 
84215
84226
  // node_modules/jsonc-parser/lib/esm/main.js
84227
+ function modify2(text, path7, value, options) {
84228
+ return setProperty(text, path7, value, options);
84229
+ }
84230
+ function applyEdits2(text, edits) {
84231
+ let sortedEdits = edits.slice(0).sort((a, b) => {
84232
+ const diff = a.offset - b.offset;
84233
+ if (diff === 0) {
84234
+ return a.length - b.length;
84235
+ }
84236
+ return diff;
84237
+ });
84238
+ let lastModifiedOffset = text.length;
84239
+ for (let i = sortedEdits.length - 1;i >= 0; i--) {
84240
+ let e = sortedEdits[i];
84241
+ if (e.offset + e.length <= lastModifiedOffset) {
84242
+ text = applyEdit(text, e);
84243
+ } else {
84244
+ throw new Error("Overlapping edit");
84245
+ }
84246
+ lastModifiedOffset = e.offset;
84247
+ }
84248
+ return text;
84249
+ }
84216
84250
  var ScanError2, SyntaxKind2, ParseErrorCode2;
84217
84251
  var init_main2 = __esm(() => {
84218
84252
  init_format();
@@ -84725,13 +84759,14 @@ function getConfigTargets() {
84725
84759
  });
84726
84760
  }
84727
84761
  function isSourceOmoPluginEntry(plugin) {
84728
- const normalized = plugin.toLowerCase().replaceAll("\\", "/");
84762
+ const normalized = getPluginEntryName(plugin).toLowerCase().replaceAll("\\", "/");
84729
84763
  if (!normalized.startsWith("file://"))
84730
84764
  return false;
84731
84765
  return /\/(omo(?:-[^/]*)?|oh-my-opencode|oh-my-openagent)\/(src|dist)\/index\.(ts|js)$/.test(normalized);
84732
84766
  }
84733
84767
  function isPackageOmoPluginEntry(plugin) {
84734
- return plugin === PLUGIN_NAME || plugin.startsWith(`${PLUGIN_NAME}@`) || plugin === LEGACY_PLUGIN_NAME || plugin.startsWith(`${LEGACY_PLUGIN_NAME}@`);
84768
+ const name = getPluginEntryName(plugin);
84769
+ return name === PLUGIN_NAME || name.startsWith(`${PLUGIN_NAME}@`) || name === LEGACY_PLUGIN_NAME || name.startsWith(`${LEGACY_PLUGIN_NAME}@`);
84735
84770
  }
84736
84771
  function isOurPlugin(plugin) {
84737
84772
  return isPackageOmoPluginEntry(plugin) || isSourceOmoPluginEntry(plugin);
@@ -84753,6 +84788,9 @@ function choosePluginEntry(params) {
84753
84788
  if (params.preferredSourceEntry) {
84754
84789
  return params.preferredSourceEntry;
84755
84790
  }
84791
+ if (params.existingEntry) {
84792
+ return withPluginEntryName(params.existingEntry, params.fallbackEntry);
84793
+ }
84756
84794
  return params.fallbackEntry;
84757
84795
  }
84758
84796
  function writePluginEntryToTarget(params) {
@@ -84786,7 +84824,7 @@ function writePluginEntryToTarget(params) {
84786
84824
  preferredSourceEntry
84787
84825
  });
84788
84826
  if (existingEntry && !preferredSourceEntry) {
84789
- const installedVersion = extractVersionFromPluginEntry(existingEntry);
84827
+ const installedVersion = extractVersionFromPluginEntry(getPluginEntryName(existingEntry));
84790
84828
  const compatibility = checkVersionCompatibility(installedVersion, currentVersion);
84791
84829
  if (!compatibility.canUpgrade) {
84792
84830
  return {
@@ -84809,20 +84847,12 @@ function writePluginEntryToTarget(params) {
84809
84847
  config3.plugin = normalizedPlugins;
84810
84848
  if (target.format === "jsonc") {
84811
84849
  const content = readFileSync8(target.path, "utf-8");
84812
- const pluginArrayRegex = /((?:"plugin"|plugin)\s*:\s*)\[([\s\S]*?)\]/;
84813
- const match = content.match(pluginArrayRegex);
84814
- if (match) {
84815
- const formattedPlugins = normalizedPlugins.map((p) => `"${p}"`).join(`,
84816
- `);
84817
- const newContent = content.replace(pluginArrayRegex, `$1[
84818
- ${formattedPlugins}
84819
- ]`);
84820
- writeFileSync5(target.path, newContent);
84821
- } else {
84822
- const newContent = content.replace(/(\{)/, `$1
84823
- "plugin": ["${nextPluginEntry}"],`);
84824
- writeFileSync5(target.path, newContent);
84825
- }
84850
+ const edits = modify2(content, ["plugin"], normalizedPlugins, {
84851
+ formattingOptions: { insertSpaces: true, tabSize: 2, eol: `
84852
+ ` },
84853
+ getInsertionIndex: () => 0
84854
+ });
84855
+ writeFileSync5(target.path, applyEdits2(content, edits));
84826
84856
  } else {
84827
84857
  writeFileSync5(target.path, JSON.stringify(config3, null, 2) + `
84828
84858
  `);
@@ -84867,6 +84897,7 @@ async function addPluginToOpenCodeConfig(currentVersion) {
84867
84897
  return primaryResult ?? { success: true, configPath: primaryTarget.path };
84868
84898
  }
84869
84899
  var init_add_plugin_to_opencode_config = __esm(() => {
84900
+ init_main2();
84870
84901
  init_shared();
84871
84902
  init_backup_config();
84872
84903
  init_config_context();
@@ -86396,10 +86427,12 @@ function detectProvidersFromOmoConfig() {
86396
86427
  }
86397
86428
  }
86398
86429
  function isOurPlugin2(plugin) {
86399
- return plugin === PLUGIN_NAME || plugin.startsWith(`${PLUGIN_NAME}@`) || plugin === LEGACY_PLUGIN_NAME || plugin.startsWith(`${LEGACY_PLUGIN_NAME}@`);
86430
+ const name = getPluginEntryName(plugin);
86431
+ return name === PLUGIN_NAME || name.startsWith(`${PLUGIN_NAME}@`) || name === LEGACY_PLUGIN_NAME || name.startsWith(`${LEGACY_PLUGIN_NAME}@`);
86400
86432
  }
86401
86433
  function findOurPluginEntry2(plugins) {
86402
- return plugins.find(isOurPlugin2) ?? null;
86434
+ const entry = plugins.find(isOurPlugin2);
86435
+ return entry === undefined ? null : getPluginEntryName(entry);
86403
86436
  }
86404
86437
  function detectCurrentConfig() {
86405
86438
  const result = {
@@ -94446,7 +94479,7 @@ var package_default2;
94446
94479
  var init_package2 = __esm(() => {
94447
94480
  package_default2 = {
94448
94481
  name: "@oh-my-opencode/omo-codex",
94449
- version: "5.0.0-beta.26",
94482
+ version: "5.0.0-beta.28",
94450
94483
  type: "module",
94451
94484
  private: true,
94452
94485
  description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
@@ -110091,14 +110124,15 @@ function detectConfigPath() {
110091
110124
  return null;
110092
110125
  }
110093
110126
  function parsePluginVersion(entry) {
110094
- if (entry.startsWith(`${PLUGIN_NAME}@`)) {
110095
- const value = entry.slice(PLUGIN_NAME.length + 1);
110127
+ const name = getPluginEntryName(entry);
110128
+ if (name.startsWith(`${PLUGIN_NAME}@`)) {
110129
+ const value = name.slice(PLUGIN_NAME.length + 1);
110096
110130
  if (!value || value === "latest")
110097
110131
  return null;
110098
110132
  return value;
110099
110133
  }
110100
- if (entry.startsWith(`${LEGACY_PLUGIN_NAME}@`)) {
110101
- const value = entry.slice(LEGACY_PLUGIN_NAME.length + 1);
110134
+ if (name.startsWith(`${LEGACY_PLUGIN_NAME}@`)) {
110135
+ const value = name.slice(LEGACY_PLUGIN_NAME.length + 1);
110102
110136
  if (!value || value === "latest")
110103
110137
  return null;
110104
110138
  return value;
@@ -110107,13 +110141,14 @@ function parsePluginVersion(entry) {
110107
110141
  }
110108
110142
  function findPluginEntry2(entries) {
110109
110143
  for (const entry of entries) {
110110
- if (entry === PLUGIN_NAME || entry.startsWith(`${PLUGIN_NAME}@`)) {
110144
+ const name = getPluginEntryName(entry);
110145
+ if (name === PLUGIN_NAME || name.startsWith(`${PLUGIN_NAME}@`)) {
110111
110146
  return { entry, isLocalDev: false };
110112
110147
  }
110113
- if (entry === LEGACY_PLUGIN_NAME || entry.startsWith(`${LEGACY_PLUGIN_NAME}@`)) {
110148
+ if (name === LEGACY_PLUGIN_NAME || name.startsWith(`${LEGACY_PLUGIN_NAME}@`)) {
110114
110149
  return { entry, isLocalDev: false };
110115
110150
  }
110116
- if (entry.startsWith("file://") && (entry.includes(PLUGIN_NAME) || entry.includes(LEGACY_PLUGIN_NAME))) {
110151
+ if (name.startsWith("file://") && (name.includes(PLUGIN_NAME) || name.includes(LEGACY_PLUGIN_NAME))) {
110117
110152
  return { entry, isLocalDev: true };
110118
110153
  }
110119
110154
  }
@@ -110435,13 +110470,14 @@ async function checkSystem(deps = defaultDeps6) {
110435
110470
  });
110436
110471
  }
110437
110472
  if (pluginInfo.entry && !pluginInfo.isLocalDev) {
110438
- const isLegacyName = pluginInfo.entry === LEGACY_PLUGIN_NAME || pluginInfo.entry.startsWith(`${LEGACY_PLUGIN_NAME}@`);
110473
+ const entryName = getPluginEntryName(pluginInfo.entry);
110474
+ const isLegacyName = entryName === LEGACY_PLUGIN_NAME || entryName.startsWith(`${LEGACY_PLUGIN_NAME}@`);
110439
110475
  if (isLegacyName) {
110440
- const suggestedEntry = pluginInfo.entry.replace(LEGACY_PLUGIN_NAME, PLUGIN_NAME);
110476
+ const suggestedEntry = entryName.replace(LEGACY_PLUGIN_NAME, PLUGIN_NAME);
110441
110477
  issues.push({
110442
110478
  title: "Using legacy package name",
110443
110479
  description: `Your opencode.json references "${LEGACY_PLUGIN_NAME}" which has been renamed to "${PLUGIN_NAME}". The old name may stop working in a future release.`,
110444
- fix: `Update your opencode.json plugin entry: "${pluginInfo.entry}" → "${suggestedEntry}"`,
110480
+ fix: `Update your opencode.json plugin entry: "${entryName}" → "${suggestedEntry}"`,
110445
110481
  severity: "warning",
110446
110482
  affects: ["plugin loading"]
110447
110483
  });
@@ -111461,6 +111497,7 @@ function createLspMcpConfig(options = {}) {
111461
111497
  enabled: resolvedCommand.exists,
111462
111498
  cwd,
111463
111499
  environment: {
111500
+ LSP_TOOLS_MCP_CWD: cwd,
111464
111501
  LSP_TOOLS_MCP_PROJECT_CONFIG: PROJECT_LSP_CONFIGS.map((configPath) => resolve23(cwd, configPath)).join(delimiter3),
111465
111502
  LSP_TOOLS_MCP_USER_CONFIG: resolve23(configDir, "lsp.json"),
111466
111503
  LSP_TOOLS_MCP_INSTALL_DECISIONS: resolve23(configDir, "lsp-install-decisions.json"),
@@ -61,6 +61,7 @@ export interface MessageInfo {
61
61
  };
62
62
  providerID?: string;
63
63
  modelID?: string;
64
+ variant?: string;
64
65
  tools?: Record<string, ToolPermission>;
65
66
  }
66
67
  export interface MessageWithInfo {