oh-my-opencode 5.1.38 → 5.1.40

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 (70) hide show
  1. package/dist/cli/index.js +206 -187
  2. package/dist/cli-node/index.js +206 -187
  3. package/dist/index.js +183 -171
  4. package/dist/skills/browser/runtime/omowright/manifest.json +1 -1
  5. package/dist/skills/git-master/SKILL.md +1 -1
  6. package/dist/skills/ulw-plan/SKILL.md +1 -1
  7. package/dist/skills/ulw-plan/references/full-workflow.md +5 -4
  8. package/dist/tui.js +29 -22
  9. package/package.json +15 -14
  10. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  11. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +8 -2
  12. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  13. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  14. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  15. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  16. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  17. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  18. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  19. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  20. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
  21. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  22. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  23. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  24. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  25. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  26. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  27. package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +157 -151
  28. package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +157 -151
  29. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  30. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  31. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  32. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  33. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +1 -1
  34. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +5 -4
  35. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
  36. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  37. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
  38. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  39. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  40. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  41. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  42. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  43. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  44. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  45. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  46. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
  47. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  48. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  49. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  50. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  51. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  52. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  53. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  54. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  55. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  56. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  57. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  58. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  59. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  60. package/packages/omo-codex/plugin/package-lock.json +12 -12
  61. package/packages/omo-codex/plugin/package.json +1 -1
  62. package/packages/omo-codex/plugin/skills/browser/runtime/omowright/manifest.json +1 -1
  63. package/packages/omo-codex/plugin/skills/git-master/SKILL.md +1 -1
  64. package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +1 -1
  65. package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +5 -4
  66. package/packages/omo-codex/scripts/install-dist/install-local.mjs +179 -168
  67. package/packages/shared-skills/skills/browser/runtime/omowright/manifest.json +1 -1
  68. package/packages/shared-skills/skills/git-master/SKILL.md +1 -1
  69. package/packages/shared-skills/skills/ulw-plan/SKILL.md +1 -1
  70. package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +5 -4
package/dist/index.js CHANGED
@@ -84955,14 +84955,20 @@ var OmoComputerSettingsSchema = OmoComputerSettingsLayerSchema;
84955
84955
 
84956
84956
  // packages/omo-config-core/src/schema/git-master.ts
84957
84957
  import * as z6 from "zod";
84958
+ var GIT_ENV_ASSIGNMENT_PATTERN = /^(?:[A-Za-z_][A-Za-z0-9_]*=[A-Za-z0-9_-]*)(?: [A-Za-z_][A-Za-z0-9_]*=[A-Za-z0-9_-]*)*$/;
84959
+ var GitEnvPrefixSchema = z6.string().refine((value) => value === "" || GIT_ENV_ASSIGNMENT_PATTERN.test(value), {
84960
+ message: 'git_env_prefix must be empty or use shell-safe env assignments like "GIT_MASTER=1"'
84961
+ });
84958
84962
  var OmoGitMasterSettingsShape = {
84959
84963
  commit_footer: z6.union([z6.boolean(), z6.string()]),
84960
- include_co_authored_by: z6.boolean()
84964
+ include_co_authored_by: z6.boolean(),
84965
+ git_env_prefix: GitEnvPrefixSchema
84961
84966
  };
84962
84967
  var OmoGitMasterSettingsLayerSchema = z6.object(OmoGitMasterSettingsShape).partial().strict();
84963
84968
  var OmoGitMasterSettingsSchema = OmoGitMasterSettingsLayerSchema.extend({
84964
84969
  commit_footer: z6.union([z6.boolean(), z6.string()]).default(false),
84965
- include_co_authored_by: z6.boolean().default(false)
84970
+ include_co_authored_by: z6.boolean().default(false),
84971
+ git_env_prefix: GitEnvPrefixSchema.default("GIT_MASTER=1")
84966
84972
  }).strict();
84967
84973
 
84968
84974
  // packages/omo-config-core/src/schema/harness.ts
@@ -87797,7 +87803,7 @@ init_src();
87797
87803
  // package.json
87798
87804
  var package_default = {
87799
87805
  name: "oh-my-opencode",
87800
- version: "5.1.38",
87806
+ version: "5.1.40",
87801
87807
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
87802
87808
  main: "./dist/index.js",
87803
87809
  types: "dist/index.d.ts",
@@ -87974,7 +87980,7 @@ var package_default = {
87974
87980
  },
87975
87981
  devDependencies: {
87976
87982
  "@clack/prompts": "^1.8.1",
87977
- "@code-yeongyu/senpi": "2026.10.19",
87983
+ "@code-yeongyu/senpi": "2026.10.19-2",
87978
87984
  "@modelcontextprotocol/sdk": "^1.30.0",
87979
87985
  "@oh-my-opencode/agents-md-core": "workspace:*",
87980
87986
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
@@ -88015,6 +88021,7 @@ var package_default = {
88015
88021
  "@opentui/core": "^0.5.11",
88016
88022
  "@opentui/keymap": "^0.5.11",
88017
88023
  "@types/js-yaml": "^4.0.9",
88024
+ "@types/node": "26.6.2",
88018
88025
  "@types/picomatch": "^4.0.3",
88019
88026
  "@typescript/native-preview": "7.0.0-dev.20260707.2",
88020
88027
  "@typescript/typescript6": "6.0.2",
@@ -88034,18 +88041,18 @@ var package_default = {
88034
88041
  typescript: "^7.0.2"
88035
88042
  },
88036
88043
  optionalDependencies: {
88037
- "oh-my-opencode-darwin-arm64": "5.1.38",
88038
- "oh-my-opencode-darwin-x64": "5.1.38",
88039
- "oh-my-opencode-darwin-x64-baseline": "5.1.38",
88040
- "oh-my-opencode-linux-arm64": "5.1.38",
88041
- "oh-my-opencode-linux-arm64-musl": "5.1.38",
88042
- "oh-my-opencode-linux-x64": "5.1.38",
88043
- "oh-my-opencode-linux-x64-baseline": "5.1.38",
88044
- "oh-my-opencode-linux-x64-musl": "5.1.38",
88045
- "oh-my-opencode-linux-x64-musl-baseline": "5.1.38",
88046
- "oh-my-opencode-windows-arm64": "5.1.38",
88047
- "oh-my-opencode-windows-x64": "5.1.38",
88048
- "oh-my-opencode-windows-x64-baseline": "5.1.38"
88044
+ "oh-my-opencode-darwin-arm64": "5.1.40",
88045
+ "oh-my-opencode-darwin-x64": "5.1.40",
88046
+ "oh-my-opencode-darwin-x64-baseline": "5.1.40",
88047
+ "oh-my-opencode-linux-arm64": "5.1.40",
88048
+ "oh-my-opencode-linux-arm64-musl": "5.1.40",
88049
+ "oh-my-opencode-linux-x64": "5.1.40",
88050
+ "oh-my-opencode-linux-x64-baseline": "5.1.40",
88051
+ "oh-my-opencode-linux-x64-musl": "5.1.40",
88052
+ "oh-my-opencode-linux-x64-musl-baseline": "5.1.40",
88053
+ "oh-my-opencode-windows-arm64": "5.1.40",
88054
+ "oh-my-opencode-windows-x64": "5.1.40",
88055
+ "oh-my-opencode-windows-x64-baseline": "5.1.40"
88049
88056
  },
88050
88057
  overrides: {
88051
88058
  hono: "^4.13.8",
@@ -88762,13 +88769,13 @@ var GoalConfigSchema = z32.object({
88762
88769
  });
88763
88770
  // packages/skills-loader-core/src/config/git-env-prefix.ts
88764
88771
  import { z as z33 } from "zod";
88765
- var GIT_ENV_ASSIGNMENT_PATTERN = /^(?:[A-Za-z_][A-Za-z0-9_]*=[A-Za-z0-9_-]*)(?: [A-Za-z_][A-Za-z0-9_]*=[A-Za-z0-9_-]*)*$/;
88772
+ var GIT_ENV_ASSIGNMENT_PATTERN2 = /^(?:[A-Za-z_][A-Za-z0-9_]*=[A-Za-z0-9_-]*)(?: [A-Za-z_][A-Za-z0-9_]*=[A-Za-z0-9_-]*)*$/;
88766
88773
  var GIT_ENV_PREFIX_VALIDATION_MESSAGE = 'git_env_prefix must be empty or use shell-safe env assignments like "GIT_MASTER=1"';
88767
88774
  function isValidGitEnvPrefix(value) {
88768
88775
  if (value === "") {
88769
88776
  return true;
88770
88777
  }
88771
- return GIT_ENV_ASSIGNMENT_PATTERN.test(value);
88778
+ return GIT_ENV_ASSIGNMENT_PATTERN2.test(value);
88772
88779
  }
88773
88780
  function assertValidGitEnvPrefix(value) {
88774
88781
  if (!isValidGitEnvPrefix(value)) {
@@ -88776,13 +88783,13 @@ function assertValidGitEnvPrefix(value) {
88776
88783
  }
88777
88784
  return value;
88778
88785
  }
88779
- var GitEnvPrefixSchema = z33.string().refine(isValidGitEnvPrefix, { message: GIT_ENV_PREFIX_VALIDATION_MESSAGE }).default("GIT_MASTER=1");
88786
+ var GitEnvPrefixSchema2 = z33.string().refine(isValidGitEnvPrefix, { message: GIT_ENV_PREFIX_VALIDATION_MESSAGE }).default("GIT_MASTER=1");
88780
88787
  // packages/omo-opencode/src/config/schema/git-master.ts
88781
88788
  import { z as z34 } from "zod";
88782
88789
  var GitMasterConfigSchema = z34.object({
88783
88790
  commit_footer: z34.union([z34.boolean(), z34.string()]).default(false),
88784
88791
  include_co_authored_by: z34.boolean().default(false),
88785
- git_env_prefix: GitEnvPrefixSchema
88792
+ git_env_prefix: GitEnvPrefixSchema2
88786
88793
  });
88787
88794
  // packages/omo-opencode/src/config/schema/hooks.ts
88788
88795
  import { z as z35 } from "zod";
@@ -178794,6 +178801,157 @@ function getTelemetryHost(env = process.env, defaultHost = DEFAULT_POSTHOG_HOST)
178794
178801
  return env["POSTHOG_HOST"]?.trim() || defaultHost;
178795
178802
  }
178796
178803
 
178804
+ // packages/telemetry-core/src/machine-id.ts
178805
+ import { createHash as createHash8 } from "crypto";
178806
+ import os6 from "os";
178807
+ function getDefaultTelemetryOsProvider() {
178808
+ return os6;
178809
+ }
178810
+ function getTelemetryDistinctId(machineIdPrefix, osProvider = getDefaultTelemetryOsProvider()) {
178811
+ return createHash8("sha256").update(`${machineIdPrefix}${osProvider.hostname()}`).digest("hex");
178812
+ }
178813
+
178814
+ // packages/telemetry-core/src/injected-client.ts
178815
+ var NO_OP_CLIENT = {
178816
+ enabled: false,
178817
+ trackActive: () => {
178818
+ return;
178819
+ },
178820
+ flush: async () => {
178821
+ return;
178822
+ },
178823
+ shutdown: async () => {
178824
+ return;
178825
+ }
178826
+ };
178827
+ function isTelemetryClientEnabled(input) {
178828
+ const env = input.env ?? process.env;
178829
+ return !shouldDisableTelemetry({ env, productEnvPrefix: input.product.productEnvPrefix }) && hasTelemetryApiKey(env, input.product.defaultApiKey);
178830
+ }
178831
+ function createTelemetryClient(input) {
178832
+ if (!isTelemetryClientEnabled(input)) {
178833
+ return NO_OP_CLIENT;
178834
+ }
178835
+ const transport = createTransport(input);
178836
+ if (transport === null) {
178837
+ return NO_OP_CLIENT;
178838
+ }
178839
+ const sharedProperties = getSharedProperties(input);
178840
+ return {
178841
+ enabled: true,
178842
+ trackActive: ({ dayUTC, distinctId, reason }) => {
178843
+ try {
178844
+ transport.capture({
178845
+ distinctId,
178846
+ event: input.product.eventName,
178847
+ properties: {
178848
+ ...sharedProperties,
178849
+ $process_person_profile: false,
178850
+ day_utc: dayUTC,
178851
+ reason
178852
+ }
178853
+ });
178854
+ } catch (error) {
178855
+ input.diagnostics?.({
178856
+ event: "telemetry_capture_failed",
178857
+ source: input.source,
178858
+ error,
178859
+ errorKind: error instanceof Error ? "error" : "non_error"
178860
+ });
178861
+ }
178862
+ },
178863
+ flush: async () => {
178864
+ if (transport.flush === undefined) {
178865
+ return;
178866
+ }
178867
+ await transport.flush();
178868
+ },
178869
+ shutdown: async () => {
178870
+ try {
178871
+ await transport.shutdown();
178872
+ } catch (error) {
178873
+ input.diagnostics?.({
178874
+ event: "telemetry_shutdown_failed",
178875
+ source: input.source,
178876
+ error,
178877
+ errorKind: error instanceof Error ? "error" : "non_error"
178878
+ });
178879
+ }
178880
+ }
178881
+ };
178882
+ }
178883
+ function createTransport(input) {
178884
+ const env = input.env ?? process.env;
178885
+ const factory = input.transportFactory;
178886
+ try {
178887
+ return factory(getTelemetryApiKey(env, input.product.defaultApiKey), {
178888
+ enableExceptionAutocapture: false,
178889
+ enableLocalEvaluation: false,
178890
+ strictLocalEvaluation: true,
178891
+ disableRemoteConfig: true,
178892
+ flushAt: 1,
178893
+ flushInterval: 0,
178894
+ host: getTelemetryHost(env, input.product.defaultHost),
178895
+ disableGeoip: input.product.disableGeoip ?? false,
178896
+ ...input.product.transportOptions
178897
+ });
178898
+ } catch (error) {
178899
+ input.diagnostics?.({
178900
+ event: "telemetry_posthog_init_failed",
178901
+ source: input.source,
178902
+ error,
178903
+ errorKind: error instanceof Error ? "error" : "non_error"
178904
+ });
178905
+ return null;
178906
+ }
178907
+ }
178908
+ function getSharedProperties(input) {
178909
+ const osProvider = input.osProvider ?? getDefaultTelemetryOsProvider();
178910
+ const cpuInfo = getSafeCpuInfo(osProvider, input);
178911
+ return {
178912
+ platform: input.product.platform,
178913
+ product_name: input.product.productName,
178914
+ package_name: input.product.packageName,
178915
+ package_version: input.product.packageVersion,
178916
+ runtime: "bun",
178917
+ runtime_version: process.versions.bun ?? process.version,
178918
+ source: input.source,
178919
+ $os: osProvider.platform(),
178920
+ $os_version: osProvider.release(),
178921
+ os_arch: osProvider.arch(),
178922
+ os_type: osProvider.type(),
178923
+ cpu_count: cpuInfo.count,
178924
+ cpu_model: cpuInfo.model,
178925
+ total_memory_gb: Math.round(osProvider.totalmem() / 1024 / 1024 / 1024),
178926
+ locale: Intl.DateTimeFormat().resolvedOptions().locale,
178927
+ timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
178928
+ shell: process.env.SHELL,
178929
+ ci: Boolean(process.env.CI),
178930
+ terminal: process.env.TERM_PROGRAM,
178931
+ ...input.product.additionalProperties
178932
+ };
178933
+ }
178934
+ function getSafeCpuInfo(osProvider, input) {
178935
+ try {
178936
+ const cpuInfo = osProvider.cpus();
178937
+ return {
178938
+ count: cpuInfo.length,
178939
+ model: cpuInfo[0]?.model
178940
+ };
178941
+ } catch (error) {
178942
+ input.diagnostics?.({
178943
+ event: "telemetry_cpu_info_unavailable",
178944
+ source: "shared",
178945
+ error,
178946
+ errorKind: error instanceof Error ? "error" : "non_error"
178947
+ });
178948
+ return {
178949
+ count: 0,
178950
+ model: undefined
178951
+ };
178952
+ }
178953
+ }
178954
+
178797
178955
  // node_modules/.bun/posthog-node@5.52.4/node_modules/posthog-node/dist/extensions/error-tracking/modifiers/module.node.mjs
178798
178956
  import { dirname as dirname51, posix as posix12, sep as sep4 } from "path";
178799
178957
  function createModulerModifier() {
@@ -187860,30 +188018,7 @@ class PostHog extends PostHogBackendClient {
187860
188018
  }
187861
188019
  }
187862
188020
 
187863
- // packages/telemetry-core/src/machine-id.ts
187864
- import { createHash as createHash8 } from "crypto";
187865
- import os6 from "os";
187866
- function getDefaultTelemetryOsProvider() {
187867
- return os6;
187868
- }
187869
- function getTelemetryDistinctId(machineIdPrefix, osProvider = getDefaultTelemetryOsProvider()) {
187870
- return createHash8("sha256").update(`${machineIdPrefix}${osProvider.hostname()}`).digest("hex");
187871
- }
187872
-
187873
- // packages/telemetry-core/src/posthog-client.ts
187874
- var NO_OP_CLIENT = {
187875
- enabled: false,
187876
- trackActive: () => {
187877
- return;
187878
- },
187879
- flush: async () => {
187880
- return;
187881
- },
187882
- shutdown: async () => {
187883
- return;
187884
- }
187885
- };
187886
-
188021
+ // packages/telemetry-core/src/posthog-transport.ts
187887
188022
  class PostHogTelemetryTransport {
187888
188023
  #client;
187889
188024
  constructor(apiKey, options) {
@@ -187902,132 +188037,9 @@ class PostHogTelemetryTransport {
187902
188037
  function createDefaultPostHogTransport(apiKey, options) {
187903
188038
  return new PostHogTelemetryTransport(apiKey, options);
187904
188039
  }
187905
- function isTelemetryClientEnabled(input) {
187906
- const env = input.env ?? process.env;
187907
- return !shouldDisableTelemetry({ env, productEnvPrefix: input.product.productEnvPrefix }) && hasTelemetryApiKey(env, input.product.defaultApiKey);
187908
- }
187909
- function createTelemetryClient(input) {
187910
- if (!isTelemetryClientEnabled(input)) {
187911
- return NO_OP_CLIENT;
187912
- }
187913
- const transport = createTransport(input);
187914
- if (transport === null) {
187915
- return NO_OP_CLIENT;
187916
- }
187917
- const sharedProperties = getSharedProperties(input);
187918
- return {
187919
- enabled: true,
187920
- trackActive: ({ dayUTC, distinctId, reason }) => {
187921
- try {
187922
- transport.capture({
187923
- distinctId,
187924
- event: input.product.eventName,
187925
- properties: {
187926
- ...sharedProperties,
187927
- $process_person_profile: false,
187928
- day_utc: dayUTC,
187929
- reason
187930
- }
187931
- });
187932
- } catch (error) {
187933
- input.diagnostics?.({
187934
- event: "telemetry_capture_failed",
187935
- source: input.source,
187936
- error,
187937
- errorKind: error instanceof Error ? "error" : "non_error"
187938
- });
187939
- }
187940
- },
187941
- flush: async () => {
187942
- if (transport.flush === undefined) {
187943
- return;
187944
- }
187945
- await transport.flush();
187946
- },
187947
- shutdown: async () => {
187948
- try {
187949
- await transport.shutdown();
187950
- } catch (error) {
187951
- input.diagnostics?.({
187952
- event: "telemetry_shutdown_failed",
187953
- source: input.source,
187954
- error,
187955
- errorKind: error instanceof Error ? "error" : "non_error"
187956
- });
187957
- }
187958
- }
187959
- };
187960
- }
187961
- function createTransport(input) {
187962
- const env = input.env ?? process.env;
187963
- const factory = input.transportFactory ?? createDefaultPostHogTransport;
187964
- try {
187965
- return factory(getTelemetryApiKey(env, input.product.defaultApiKey), {
187966
- enableExceptionAutocapture: false,
187967
- enableLocalEvaluation: false,
187968
- strictLocalEvaluation: true,
187969
- disableRemoteConfig: true,
187970
- flushAt: 1,
187971
- flushInterval: 0,
187972
- host: getTelemetryHost(env, input.product.defaultHost),
187973
- disableGeoip: input.product.disableGeoip ?? false,
187974
- ...input.product.transportOptions
187975
- });
187976
- } catch (error) {
187977
- input.diagnostics?.({
187978
- event: "telemetry_posthog_init_failed",
187979
- source: input.source,
187980
- error,
187981
- errorKind: error instanceof Error ? "error" : "non_error"
187982
- });
187983
- return null;
187984
- }
187985
- }
187986
- function getSharedProperties(input) {
187987
- const osProvider = input.osProvider ?? getDefaultTelemetryOsProvider();
187988
- const cpuInfo = getSafeCpuInfo(osProvider, input);
187989
- return {
187990
- platform: input.product.platform,
187991
- product_name: input.product.productName,
187992
- package_name: input.product.packageName,
187993
- package_version: input.product.packageVersion,
187994
- runtime: "bun",
187995
- runtime_version: process.versions.bun ?? process.version,
187996
- source: input.source,
187997
- $os: osProvider.platform(),
187998
- $os_version: osProvider.release(),
187999
- os_arch: osProvider.arch(),
188000
- os_type: osProvider.type(),
188001
- cpu_count: cpuInfo.count,
188002
- cpu_model: cpuInfo.model,
188003
- total_memory_gb: Math.round(osProvider.totalmem() / 1024 / 1024 / 1024),
188004
- locale: Intl.DateTimeFormat().resolvedOptions().locale,
188005
- timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
188006
- shell: process.env.SHELL,
188007
- ci: Boolean(process.env.CI),
188008
- terminal: process.env.TERM_PROGRAM,
188009
- ...input.product.additionalProperties
188010
- };
188011
- }
188012
- function getSafeCpuInfo(osProvider, input) {
188013
- try {
188014
- const cpuInfo = osProvider.cpus();
188015
- return {
188016
- count: cpuInfo.length,
188017
- model: cpuInfo[0]?.model
188018
- };
188019
- } catch (error) {
188020
- input.diagnostics?.({
188021
- event: "telemetry_cpu_info_unavailable",
188022
- source: "shared",
188023
- error,
188024
- errorKind: error instanceof Error ? "error" : "non_error"
188025
- });
188026
- return {
188027
- count: 0,
188028
- model: undefined
188029
- };
188030
- }
188040
+ // packages/telemetry-core/src/posthog-client.ts
188041
+ function createTelemetryClient2(input) {
188042
+ return createTelemetryClient({ ...input, transportFactory: input.transportFactory ?? createDefaultPostHogTransport });
188031
188043
  }
188032
188044
 
188033
188045
  // packages/omo-opencode/src/shared/posthog-activity-state.ts
@@ -188154,7 +188166,7 @@ function createPostHogClient(source, options = {}) {
188154
188166
  if (shouldDisablePostHog(env, options.configEnabled)) {
188155
188167
  return NO_OP_POSTHOG;
188156
188168
  }
188157
- const client = createTelemetryClient({
188169
+ const client = createTelemetryClient2({
188158
188170
  diagnostics: logTelemetryDiagnostic,
188159
188171
  env: createCoreCompatibleTelemetryEnv(env),
188160
188172
  osProvider: resolveOsProvider(),
@@ -5,5 +5,5 @@
5
5
  "index.js": "d67d3a847fe0bbc43e824feded48b280890d31879538309e671cd5f671133995",
6
6
  "page-bundle.js": "bfd51e8383cf47200d57387bbbed258bce5a3a3d00c38fc108034d2888e23f0c"
7
7
  },
8
- "stagedAtUtc": "2026-10-19T10:07:35.689Z"
8
+ "stagedAtUtc": "2026-10-20T14:10:33.341Z"
9
9
  }
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: git-master
3
- description: "Handles git work: atomic commits, rebase, squash, blame, bisect, reflog, and history questions. Use whenever a task needs a commit or a git-history investigation; skip for ordinary code edits."
3
+ description: "MUST USE for ANY git operations: atomic commits, rebase/squash/fixup, and history search (blame, bisect, log -S, reflog). Load it before running git yourself, or pass load_skills=['git-master'] to the task that commits. Triggers: 'commit', 'rebase', 'squash', 'who wrote', 'when was X added', 'find the commit that'."
4
4
  ---
5
5
 
6
6
  # Git Master
@@ -34,7 +34,7 @@ Example opening (adapt the wording, keep every commitment):
34
34
 
35
35
  ## INTENT ROUTING - pick ONE intent reference
36
36
 
37
- **Review modifiers are a gate trigger, not a style cue.** If the user says "high accuracy", "ultra high accuracy", "고정밀", "deep review", or equivalent - in ANY turn, even appended to a follow-up question and even after the plan already exists - set `review_required: true` in the draft: the dual high-accuracy review (native `momus` + the independent Oracle review) is now REQUIRED before handoff, and if the plan already exists you run it this same turn. The review runs under the bounded convergence contract in `full-workflow.md`: a 5-round cap (unlimited only on explicit user request), evidence-backed blocker eligibility, and approval-with-notes counting as approval. Answering the current question more carefully does NOT satisfy it. This does NOT choose CLEAR/UNCLEAR and does NOT suppress interview.
37
+ **Review modifiers are a gate trigger, not a style cue.** If the user says "high accuracy", "ultra high accuracy", "고정밀", "deep review", or equivalent - in ANY turn, even appended to a follow-up question and even after the plan already exists - set `review_required: true` in the draft: the dual high-accuracy review (native `momus` + the independent Oracle review) is now REQUIRED before handoff, and if the plan already exists you run it this same turn. The review runs under the bounded convergence contract in `full-workflow.md`: convergence-bounded rounds (another round only while the previous one raised a new blocker-eligible finding or closed a ledger blocker; a round with neither that still does not approve stops the review), evidence-backed blocker eligibility, and approval-with-notes counting as approval. Answering the current question more carefully does NOT satisfy it. This does NOT choose CLEAR/UNCLEAR and does NOT suppress interview.
38
38
 
39
39
  After grounding, make ONE judgment, record `intent: clear|unclear` plus `review_required`, **ANNOUNCE both to the user in one line**, then load ONE intent reference (you ALSO read `references/full-workflow.md` for the shared mechanics - see below). The test keys on whether the desired **OUTCOME** is clear, NOT on request length. This verdict line and the opening announcement above are the two mandatory user-visible signals of a planning session - it tells the user whether they will be interviewed and whether high-accuracy review is already requested; never skip either.
40
40
 
@@ -214,14 +214,15 @@ Every reviewer prompt must carry this intake contract with all angle-bracket val
214
214
  The first action must open the literal workspace root as a directory descriptor, then traverse `.omo`, `plans`, and the final target with descriptor-relative no-follow opens, `fstat` each ancestor as a directory and the final descriptor as a regular file, and hash all bytes read from that same final descriptor. If the platform cannot guarantee this chain, or any path/runtime/launch/receipt/digest check drifts, return `INCONCLUSIVE` before reviewing. Echo the literal workspace, runtime home, target, digest, round, and launch ID; the parent separately matches the completion envelope to the persisted session/process receipt. Never search or use another artifact.
215
215
 
216
216
  ### Bounded convergence (the review must terminate)
217
- Review rounds are capped at 5 (unlimited only on explicit user request), and an approval whose only remaining items are notes counts as approval. A finding may BLOCK only when it names at least one `blocker_eligibility` category below with its concrete evidence - an IS row no todo closes, no QA scenario proves, or the approach cannot reach for the named user is such a category; every other finding - speculative durability, replay/crash-recovery, schema, CLI-parsing, state-machine, or hardening concerns the accepted scope never required - is recorded as a non-blocking note and becomes implementation/test work, never plan expansion. After round 1 the blocker ledger FREEZES: later rounds verify accepted ledger blockers, regressions introduced by fixes, and new findings that pass eligibility - they never rediscover the plan from scratch. Fixes apply the smallest edit that resolves the cited blocker; neither reviews nor fixes grow the plan's scope. Every reviewer prompt carries this convergence contract alongside the intake contract. On cap exhaustion without approval: STOP, report outstanding blockers, ask the user - continue / accept / adjust.
217
+ Review continues until unconditional approval, but a further round runs only while the previous round made progress: it raised at least one NEW blocker-eligible finding (one not already in the ledger and not a restatement of a closed blocker), or it confirmed at least one ledger blocker closed. A round that does neither and still does not approve ends the review: stop, report the outstanding blockers, and ask the user. This is the non-convergence guard, so there is no fixed round count; it terminates because the ledger is frozen after round 1, so every closure shrinks it. An approval whose only remaining items are notes counts as approval. A finding may BLOCK only when it names at least one `blocker_eligibility` category below with its concrete evidence - an IS row no todo closes, no QA scenario proves, or the approach cannot reach for the named user is such a category; every other finding - speculative durability, replay/crash-recovery, schema, CLI-parsing, state-machine, or hardening concerns the accepted scope never required - is recorded as a non-blocking note and becomes implementation/test work, never plan expansion. After round 1 the blocker ledger FREEZES: later rounds verify accepted ledger blockers, regressions introduced by fixes, and new findings that pass eligibility - they never rediscover the plan from scratch. Fixes apply the smallest edit that resolves the cited blocker; neither reviews nor fixes grow the plan's scope. Every reviewer prompt carries this convergence contract alongside the intake contract. On cap exhaustion without approval: STOP, report outstanding blockers, ask the user - continue / accept / adjust.
218
218
 
219
219
  <!-- ulw-plan-review-convergence-contract -->
220
220
  ```json
221
221
  {
222
- "max_rounds": 5,
223
- "max_rounds_override": "explicit_user_request_only",
224
- "on_cap_reached": "stop_report_outstanding_blockers_ask_user",
222
+ "max_rounds": null,
223
+ "continue_while": "previous_round_raised_new_blocker_eligible_finding_or_closed_ledger_blocker",
224
+ "stop_on": "round_without_new_blocker_eligible_finding_or_ledger_blocker_closure",
225
+ "on_stop_without_approval": "stop_report_outstanding_blockers_ask_user",
225
226
  "blocker_eligibility": [
226
227
  "explicit_requirement_or_accepted_decision",
227
228
  "existing_failing_regression",
package/dist/tui.js CHANGED
@@ -70075,17 +70075,23 @@ var init_computer = __esm(() => {
70075
70075
  });
70076
70076
 
70077
70077
  // packages/omo-config-core/src/schema/git-master.ts
70078
- var OmoGitMasterSettingsShape, OmoGitMasterSettingsLayerSchema, OmoGitMasterSettingsSchema;
70078
+ var GIT_ENV_ASSIGNMENT_PATTERN, GitEnvPrefixSchema, OmoGitMasterSettingsShape, OmoGitMasterSettingsLayerSchema, OmoGitMasterSettingsSchema;
70079
70079
  var init_git_master = __esm(() => {
70080
70080
  init_zod();
70081
+ GIT_ENV_ASSIGNMENT_PATTERN = /^(?:[A-Za-z_][A-Za-z0-9_]*=[A-Za-z0-9_-]*)(?: [A-Za-z_][A-Za-z0-9_]*=[A-Za-z0-9_-]*)*$/;
70082
+ GitEnvPrefixSchema = string2().refine((value) => value === "" || GIT_ENV_ASSIGNMENT_PATTERN.test(value), {
70083
+ message: 'git_env_prefix must be empty or use shell-safe env assignments like "GIT_MASTER=1"'
70084
+ });
70081
70085
  OmoGitMasterSettingsShape = {
70082
70086
  commit_footer: union([boolean2(), string2()]),
70083
- include_co_authored_by: boolean2()
70087
+ include_co_authored_by: boolean2(),
70088
+ git_env_prefix: GitEnvPrefixSchema
70084
70089
  };
70085
70090
  OmoGitMasterSettingsLayerSchema = object(OmoGitMasterSettingsShape).partial().strict();
70086
70091
  OmoGitMasterSettingsSchema = OmoGitMasterSettingsLayerSchema.extend({
70087
70092
  commit_footer: union([boolean2(), string2()]).default(false),
70088
- include_co_authored_by: boolean2().default(false)
70093
+ include_co_authored_by: boolean2().default(false),
70094
+ git_env_prefix: GitEnvPrefixSchema.default("GIT_MASTER=1")
70089
70095
  }).strict();
70090
70096
  });
70091
70097
 
@@ -72632,13 +72638,13 @@ function isValidGitEnvPrefix(value) {
72632
72638
  if (value === "") {
72633
72639
  return true;
72634
72640
  }
72635
- return GIT_ENV_ASSIGNMENT_PATTERN.test(value);
72641
+ return GIT_ENV_ASSIGNMENT_PATTERN2.test(value);
72636
72642
  }
72637
- var GIT_ENV_ASSIGNMENT_PATTERN, GIT_ENV_PREFIX_VALIDATION_MESSAGE = 'git_env_prefix must be empty or use shell-safe env assignments like "GIT_MASTER=1"', GitEnvPrefixSchema;
72643
+ var GIT_ENV_ASSIGNMENT_PATTERN2, GIT_ENV_PREFIX_VALIDATION_MESSAGE = 'git_env_prefix must be empty or use shell-safe env assignments like "GIT_MASTER=1"', GitEnvPrefixSchema2;
72638
72644
  var init_git_env_prefix = __esm(() => {
72639
72645
  init_zod();
72640
- GIT_ENV_ASSIGNMENT_PATTERN = /^(?:[A-Za-z_][A-Za-z0-9_]*=[A-Za-z0-9_-]*)(?: [A-Za-z_][A-Za-z0-9_]*=[A-Za-z0-9_-]*)*$/;
72641
- GitEnvPrefixSchema = string2().refine(isValidGitEnvPrefix, { message: GIT_ENV_PREFIX_VALIDATION_MESSAGE }).default("GIT_MASTER=1");
72646
+ GIT_ENV_ASSIGNMENT_PATTERN2 = /^(?:[A-Za-z_][A-Za-z0-9_]*=[A-Za-z0-9_-]*)(?: [A-Za-z_][A-Za-z0-9_]*=[A-Za-z0-9_-]*)*$/;
72647
+ GitEnvPrefixSchema2 = string2().refine(isValidGitEnvPrefix, { message: GIT_ENV_PREFIX_VALIDATION_MESSAGE }).default("GIT_MASTER=1");
72642
72648
  });
72643
72649
 
72644
72650
  // packages/omo-opencode/src/config/schema/git-env-prefix.ts
@@ -72654,7 +72660,7 @@ var init_git_master2 = __esm(() => {
72654
72660
  GitMasterConfigSchema = object({
72655
72661
  commit_footer: union([boolean2(), string2()]).default(false),
72656
72662
  include_co_authored_by: boolean2().default(false),
72657
- git_env_prefix: GitEnvPrefixSchema
72663
+ git_env_prefix: GitEnvPrefixSchema2
72658
72664
  });
72659
72665
  });
72660
72666
 
@@ -75008,7 +75014,7 @@ init_shared();
75008
75014
  // package.json
75009
75015
  var package_default = {
75010
75016
  name: "oh-my-opencode",
75011
- version: "5.1.38",
75017
+ version: "5.1.40",
75012
75018
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
75013
75019
  main: "./dist/index.js",
75014
75020
  types: "dist/index.d.ts",
@@ -75185,7 +75191,7 @@ var package_default = {
75185
75191
  },
75186
75192
  devDependencies: {
75187
75193
  "@clack/prompts": "^1.8.1",
75188
- "@code-yeongyu/senpi": "2026.10.19",
75194
+ "@code-yeongyu/senpi": "2026.10.19-2",
75189
75195
  "@modelcontextprotocol/sdk": "^1.30.0",
75190
75196
  "@oh-my-opencode/agents-md-core": "workspace:*",
75191
75197
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
@@ -75226,6 +75232,7 @@ var package_default = {
75226
75232
  "@opentui/core": "^0.5.11",
75227
75233
  "@opentui/keymap": "^0.5.11",
75228
75234
  "@types/js-yaml": "^4.0.9",
75235
+ "@types/node": "26.6.2",
75229
75236
  "@types/picomatch": "^4.0.3",
75230
75237
  "@typescript/native-preview": "7.0.0-dev.20260707.2",
75231
75238
  "@typescript/typescript6": "6.0.2",
@@ -75245,18 +75252,18 @@ var package_default = {
75245
75252
  typescript: "^7.0.2"
75246
75253
  },
75247
75254
  optionalDependencies: {
75248
- "oh-my-opencode-darwin-arm64": "5.1.38",
75249
- "oh-my-opencode-darwin-x64": "5.1.38",
75250
- "oh-my-opencode-darwin-x64-baseline": "5.1.38",
75251
- "oh-my-opencode-linux-arm64": "5.1.38",
75252
- "oh-my-opencode-linux-arm64-musl": "5.1.38",
75253
- "oh-my-opencode-linux-x64": "5.1.38",
75254
- "oh-my-opencode-linux-x64-baseline": "5.1.38",
75255
- "oh-my-opencode-linux-x64-musl": "5.1.38",
75256
- "oh-my-opencode-linux-x64-musl-baseline": "5.1.38",
75257
- "oh-my-opencode-windows-arm64": "5.1.38",
75258
- "oh-my-opencode-windows-x64": "5.1.38",
75259
- "oh-my-opencode-windows-x64-baseline": "5.1.38"
75255
+ "oh-my-opencode-darwin-arm64": "5.1.40",
75256
+ "oh-my-opencode-darwin-x64": "5.1.40",
75257
+ "oh-my-opencode-darwin-x64-baseline": "5.1.40",
75258
+ "oh-my-opencode-linux-arm64": "5.1.40",
75259
+ "oh-my-opencode-linux-arm64-musl": "5.1.40",
75260
+ "oh-my-opencode-linux-x64": "5.1.40",
75261
+ "oh-my-opencode-linux-x64-baseline": "5.1.40",
75262
+ "oh-my-opencode-linux-x64-musl": "5.1.40",
75263
+ "oh-my-opencode-linux-x64-musl-baseline": "5.1.40",
75264
+ "oh-my-opencode-windows-arm64": "5.1.40",
75265
+ "oh-my-opencode-windows-x64": "5.1.40",
75266
+ "oh-my-opencode-windows-x64-baseline": "5.1.40"
75260
75267
  },
75261
75268
  overrides: {
75262
75269
  hono: "^4.13.8",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-opencode",
3
- "version": "5.1.38",
3
+ "version": "5.1.40",
4
4
  "description": "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
5
5
  "main": "./dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -177,7 +177,7 @@
177
177
  },
178
178
  "devDependencies": {
179
179
  "@clack/prompts": "^1.8.1",
180
- "@code-yeongyu/senpi": "2026.10.19",
180
+ "@code-yeongyu/senpi": "2026.10.19-2",
181
181
  "@modelcontextprotocol/sdk": "^1.30.0",
182
182
  "@oh-my-opencode/agents-md-core": "workspace:*",
183
183
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
@@ -218,6 +218,7 @@
218
218
  "@opentui/core": "^0.5.11",
219
219
  "@opentui/keymap": "^0.5.11",
220
220
  "@types/js-yaml": "^4.0.9",
221
+ "@types/node": "26.6.2",
221
222
  "@types/picomatch": "^4.0.3",
222
223
  "@typescript/native-preview": "7.0.0-dev.20260707.2",
223
224
  "@typescript/typescript6": "6.0.2",
@@ -237,18 +238,18 @@
237
238
  "typescript": "^7.0.2"
238
239
  },
239
240
  "optionalDependencies": {
240
- "oh-my-opencode-darwin-arm64": "5.1.38",
241
- "oh-my-opencode-darwin-x64": "5.1.38",
242
- "oh-my-opencode-darwin-x64-baseline": "5.1.38",
243
- "oh-my-opencode-linux-arm64": "5.1.38",
244
- "oh-my-opencode-linux-arm64-musl": "5.1.38",
245
- "oh-my-opencode-linux-x64": "5.1.38",
246
- "oh-my-opencode-linux-x64-baseline": "5.1.38",
247
- "oh-my-opencode-linux-x64-musl": "5.1.38",
248
- "oh-my-opencode-linux-x64-musl-baseline": "5.1.38",
249
- "oh-my-opencode-windows-arm64": "5.1.38",
250
- "oh-my-opencode-windows-x64": "5.1.38",
251
- "oh-my-opencode-windows-x64-baseline": "5.1.38"
241
+ "oh-my-opencode-darwin-arm64": "5.1.40",
242
+ "oh-my-opencode-darwin-x64": "5.1.40",
243
+ "oh-my-opencode-darwin-x64-baseline": "5.1.40",
244
+ "oh-my-opencode-linux-arm64": "5.1.40",
245
+ "oh-my-opencode-linux-arm64-musl": "5.1.40",
246
+ "oh-my-opencode-linux-x64": "5.1.40",
247
+ "oh-my-opencode-linux-x64-baseline": "5.1.40",
248
+ "oh-my-opencode-linux-x64-musl": "5.1.40",
249
+ "oh-my-opencode-linux-x64-musl-baseline": "5.1.40",
250
+ "oh-my-opencode-windows-arm64": "5.1.40",
251
+ "oh-my-opencode-windows-x64": "5.1.40",
252
+ "oh-my-opencode-windows-x64-baseline": "5.1.40"
252
253
  },
253
254
  "overrides": {
254
255
  "hono": "^4.13.8",