lazycodex-ai 5.1.13 → 5.1.15

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 (69) hide show
  1. package/dist/cli/index.js +18 -17
  2. package/dist/cli-node/index.js +18 -17
  3. package/package.json +1 -1
  4. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  5. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  6. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  7. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  8. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  9. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  10. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  11. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  12. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  13. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +4 -4
  14. package/packages/omo-codex/plugin/components/lsp/dist/cli.js +33 -19
  15. package/packages/omo-codex/plugin/components/lsp/dist/codex-hook.js +27 -17
  16. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  17. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  18. package/packages/omo-codex/plugin/components/lsp/src/codex-hook.ts +36 -18
  19. package/packages/omo-codex/plugin/components/lsp/test/codex-hook-not-installed.test.ts +203 -0
  20. package/packages/omo-codex/plugin/components/rules/CHANGELOG.md +1 -0
  21. package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-6.md +1 -1
  22. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  23. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  24. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  25. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  26. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  27. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  28. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  29. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  30. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
  31. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  32. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
  33. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  34. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  35. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  36. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  37. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  38. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  39. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  40. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  41. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
  42. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  43. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  44. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  45. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  46. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  47. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  48. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  49. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  50. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  51. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  52. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  53. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  54. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  55. package/packages/omo-codex/plugin/package-lock.json +12 -12
  56. package/packages/omo-codex/plugin/package.json +1 -1
  57. package/packages/omo-codex/plugin/skills/browser/SKILL.md +26 -2
  58. package/packages/omo-codex/plugin/skills/browser/references/commands.md +10 -1
  59. package/packages/omo-codex/plugin/skills/browser/references/install.md +7 -0
  60. package/packages/omo-codex/plugin/skills/browser/runtime/omowright/manifest.json +1 -1
  61. package/packages/omo-codex/plugin/skills/browser/scripts/browser-engine-guard.mjs +506 -0
  62. package/packages/omo-codex/plugin/skills/browser/scripts/omowright.mjs +29 -2
  63. package/packages/omo-codex/scripts/install-dist/install-local.mjs +2 -2
  64. package/packages/shared-skills/skills/browser/SKILL.md +26 -2
  65. package/packages/shared-skills/skills/browser/references/commands.md +10 -1
  66. package/packages/shared-skills/skills/browser/references/install.md +7 -0
  67. package/packages/shared-skills/skills/browser/runtime/omowright/manifest.json +1 -1
  68. package/packages/shared-skills/skills/browser/scripts/browser-engine-guard.mjs +506 -0
  69. package/packages/shared-skills/skills/browser/scripts/omowright.mjs +29 -2
package/dist/cli/index.js CHANGED
@@ -64,7 +64,7 @@ var package_default;
64
64
  var init_package = __esm(() => {
65
65
  package_default = {
66
66
  name: "oh-my-opencode",
67
- version: "5.1.13",
67
+ version: "5.1.15",
68
68
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
69
69
  main: "./dist/index.js",
70
70
  types: "dist/index.d.ts",
@@ -241,7 +241,7 @@ var init_package = __esm(() => {
241
241
  },
242
242
  devDependencies: {
243
243
  "@clack/prompts": "^1.8.1",
244
- "@code-yeongyu/senpi": "2026.10.3",
244
+ "@code-yeongyu/senpi": "2026.10.6",
245
245
  "@modelcontextprotocol/sdk": "^1.30.0",
246
246
  "@oh-my-opencode/agents-md-core": "workspace:*",
247
247
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
@@ -299,18 +299,18 @@ var init_package = __esm(() => {
299
299
  typescript: "^7.0.2"
300
300
  },
301
301
  optionalDependencies: {
302
- "oh-my-opencode-darwin-arm64": "5.1.13",
303
- "oh-my-opencode-darwin-x64": "5.1.13",
304
- "oh-my-opencode-darwin-x64-baseline": "5.1.13",
305
- "oh-my-opencode-linux-arm64": "5.1.13",
306
- "oh-my-opencode-linux-arm64-musl": "5.1.13",
307
- "oh-my-opencode-linux-x64": "5.1.13",
308
- "oh-my-opencode-linux-x64-baseline": "5.1.13",
309
- "oh-my-opencode-linux-x64-musl": "5.1.13",
310
- "oh-my-opencode-linux-x64-musl-baseline": "5.1.13",
311
- "oh-my-opencode-windows-arm64": "5.1.13",
312
- "oh-my-opencode-windows-x64": "5.1.13",
313
- "oh-my-opencode-windows-x64-baseline": "5.1.13"
302
+ "oh-my-opencode-darwin-arm64": "5.1.15",
303
+ "oh-my-opencode-darwin-x64": "5.1.15",
304
+ "oh-my-opencode-darwin-x64-baseline": "5.1.15",
305
+ "oh-my-opencode-linux-arm64": "5.1.15",
306
+ "oh-my-opencode-linux-arm64-musl": "5.1.15",
307
+ "oh-my-opencode-linux-x64": "5.1.15",
308
+ "oh-my-opencode-linux-x64-baseline": "5.1.15",
309
+ "oh-my-opencode-linux-x64-musl": "5.1.15",
310
+ "oh-my-opencode-linux-x64-musl-baseline": "5.1.15",
311
+ "oh-my-opencode-windows-arm64": "5.1.15",
312
+ "oh-my-opencode-windows-x64": "5.1.15",
313
+ "oh-my-opencode-windows-x64-baseline": "5.1.15"
314
314
  },
315
315
  overrides: {
316
316
  hono: "^4.13.8",
@@ -9493,7 +9493,7 @@ You are working on tasks that don't fit specific categories but require moderate
9493
9493
  </Category_Context>`, UNSPECIFIED_LOW_CATEGORY_CALLER_GUIDANCE = `<Selection_Gate>Use only when no specialist category fits, effort is moderate, and scope stays within a few files/modules. Prefer any matching specialist category.</Selection_Gate>
9494
9494
  <Caller_Warning>Provide explicit must-do steps, forbidden scope, and concrete success criteria.</Caller_Warning>`, UNSPECIFIED_HIGH_CATEGORY_PROMPT_APPEND = `<Category_Context>
9495
9495
  You are working on tasks that don't fit specific categories but require substantial effort.
9496
- </Category_Context>`, UNSPECIFIED_HIGH_CATEGORY_CALLER_GUIDANCE = `<Selection_Gate>Use only when no specialist category fits and substantial effort spans systems/modules with broad impact. Use unspecified-low for contained moderate work.</Selection_Gate>`, DEEP_LOW_CATEGORY_CALLER_GUIDANCE = `<Selection_Gate>Route here when one subsystem plus its callers holds the mechanism and the evidence, once read, leaves one right answer. Wide but mechanical work belongs here or in a quick batch. When unsure, choose deep-low: a misrouted child returns \`ESCALATE: deep-high\` after one cheap attempt; re-spawn the same brief as deep-high with its findings.</Selection_Gate>`, DEEP_HIGH_CATEGORY_CALLER_GUIDANCE = `<Selection_Gate>Route here only when you can name the decision evidence cannot settle: a trade-off with no single right answer, a contract change crossing a package or process boundary, a mechanism with no in-repo pattern to copy, or correctness argued from invariants rather than observed in a test. Wide scope with easy decisions is deep-low or unspecified-high; reasoning as the deliverable is ultrabrain.</Selection_Gate>`, DEEP_LOW_GATE_MODELS, DEEP_HIGH_GATE_MODEL = "gpt-6-astra", OPENAI_CATEGORIES;
9496
+ </Category_Context>`, UNSPECIFIED_HIGH_CATEGORY_CALLER_GUIDANCE = `<Selection_Gate>Use only when no specialist category fits and substantial effort spans systems/modules with broad impact. Use unspecified-low for contained moderate work.</Selection_Gate>`, DEEP_LOW_CATEGORY_CALLER_GUIDANCE = `<Selection_Gate>Of the two deep lanes this is the default: the child settles its decisions from what it reads. When unsure, choose deep-low; a misrouted child returns \`ESCALATE: deep-high\` after one cheap attempt, and you re-spawn the same brief as deep-high with its findings.</Selection_Gate>`, DEEP_HIGH_CATEGORY_CALLER_GUIDANCE = `<Selection_Gate>Route here only when you can name the decision evidence cannot settle: a trade-off with no single right answer, a contract change crossing a package or process boundary, a mechanism with no in-repo pattern to copy, or correctness argued from invariants rather than observed in a test. Wide scope with easy decisions is deep-low or unspecified-high; reasoning as the deliverable is ultrabrain.</Selection_Gate>`, DEEP_LOW_GATE_MODELS, DEEP_HIGH_GATE_MODEL = "gpt-6-astra", OPENAI_CATEGORIES;
9497
9497
  var init_openai_categories = __esm(() => {
9498
9498
  init_types();
9499
9499
  DEEP_LOW_GATE_MODELS = ["gpt-6.1-sol", "gpt-6.1-sol-fast", "gpt-5.6-sol-fast", "gpt-5.6-sol"];
@@ -9508,7 +9508,7 @@ var init_openai_categories = __esm(() => {
9508
9508
  {
9509
9509
  name: "deep-low",
9510
9510
  config: { model: "openai/gpt-6.1-sol", variant: "medium" },
9511
- description: "Default deep lane: one goal, one deliverable, decisions the child can settle from what it reads. **3D graphics, computer/browser use, CAPTCHA, multimodal, backend, logic, and algorithm work is routed here.** Multiple goals fan out as parallel calls.",
9511
+ description: "Default deep lane: one goal, one deliverable, decisions the child can settle from what it reads; preferred over deep-high for 3D graphics, computer/browser use, CAPTCHA, multimodal, backend, logic, and algorithm work. Multiple goals fan out as parallel calls.",
9512
9512
  callerGuidance: DEEP_LOW_CATEGORY_CALLER_GUIDANCE,
9513
9513
  promptAppend: DEEP_LOW_CATEGORY_PROMPT_APPEND,
9514
9514
  resolvePromptAppend: resolveDeepLowCategoryPromptAppend,
@@ -89369,7 +89369,7 @@ var package_default2;
89369
89369
  var init_package2 = __esm(() => {
89370
89370
  package_default2 = {
89371
89371
  name: "@oh-my-opencode/omo-codex",
89372
- version: "5.1.13",
89372
+ version: "5.1.15",
89373
89373
  type: "module",
89374
89374
  private: true,
89375
89375
  description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
@@ -98698,6 +98698,7 @@ var REQUIRED_PLUGIN_ARTIFACTS = [
98698
98698
  join63("extensions", "omo.js"),
98699
98699
  join63("extensions", "omo-task.js"),
98700
98700
  join63("extensions", "omo-computer-use.js"),
98701
+ join63("extensions", "omo-memory-doctor.js"),
98701
98702
  join63("extensions", "assets.generated.json"),
98702
98703
  join63("extensions", "omo-member.js"),
98703
98704
  join63("extensions", "memory-run-supervisor.mjs"),
@@ -65,7 +65,7 @@ var package_default;
65
65
  var init_package = __esm(() => {
66
66
  package_default = {
67
67
  name: "oh-my-opencode",
68
- version: "5.1.13",
68
+ version: "5.1.15",
69
69
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
70
70
  main: "./dist/index.js",
71
71
  types: "dist/index.d.ts",
@@ -242,7 +242,7 @@ var init_package = __esm(() => {
242
242
  },
243
243
  devDependencies: {
244
244
  "@clack/prompts": "^1.8.1",
245
- "@code-yeongyu/senpi": "2026.10.3",
245
+ "@code-yeongyu/senpi": "2026.10.6",
246
246
  "@modelcontextprotocol/sdk": "^1.30.0",
247
247
  "@oh-my-opencode/agents-md-core": "workspace:*",
248
248
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
@@ -300,18 +300,18 @@ var init_package = __esm(() => {
300
300
  typescript: "^7.0.2"
301
301
  },
302
302
  optionalDependencies: {
303
- "oh-my-opencode-darwin-arm64": "5.1.13",
304
- "oh-my-opencode-darwin-x64": "5.1.13",
305
- "oh-my-opencode-darwin-x64-baseline": "5.1.13",
306
- "oh-my-opencode-linux-arm64": "5.1.13",
307
- "oh-my-opencode-linux-arm64-musl": "5.1.13",
308
- "oh-my-opencode-linux-x64": "5.1.13",
309
- "oh-my-opencode-linux-x64-baseline": "5.1.13",
310
- "oh-my-opencode-linux-x64-musl": "5.1.13",
311
- "oh-my-opencode-linux-x64-musl-baseline": "5.1.13",
312
- "oh-my-opencode-windows-arm64": "5.1.13",
313
- "oh-my-opencode-windows-x64": "5.1.13",
314
- "oh-my-opencode-windows-x64-baseline": "5.1.13"
303
+ "oh-my-opencode-darwin-arm64": "5.1.15",
304
+ "oh-my-opencode-darwin-x64": "5.1.15",
305
+ "oh-my-opencode-darwin-x64-baseline": "5.1.15",
306
+ "oh-my-opencode-linux-arm64": "5.1.15",
307
+ "oh-my-opencode-linux-arm64-musl": "5.1.15",
308
+ "oh-my-opencode-linux-x64": "5.1.15",
309
+ "oh-my-opencode-linux-x64-baseline": "5.1.15",
310
+ "oh-my-opencode-linux-x64-musl": "5.1.15",
311
+ "oh-my-opencode-linux-x64-musl-baseline": "5.1.15",
312
+ "oh-my-opencode-windows-arm64": "5.1.15",
313
+ "oh-my-opencode-windows-x64": "5.1.15",
314
+ "oh-my-opencode-windows-x64-baseline": "5.1.15"
315
315
  },
316
316
  overrides: {
317
317
  hono: "^4.13.8",
@@ -9494,7 +9494,7 @@ You are working on tasks that don't fit specific categories but require moderate
9494
9494
  </Category_Context>`, UNSPECIFIED_LOW_CATEGORY_CALLER_GUIDANCE = `<Selection_Gate>Use only when no specialist category fits, effort is moderate, and scope stays within a few files/modules. Prefer any matching specialist category.</Selection_Gate>
9495
9495
  <Caller_Warning>Provide explicit must-do steps, forbidden scope, and concrete success criteria.</Caller_Warning>`, UNSPECIFIED_HIGH_CATEGORY_PROMPT_APPEND = `<Category_Context>
9496
9496
  You are working on tasks that don't fit specific categories but require substantial effort.
9497
- </Category_Context>`, UNSPECIFIED_HIGH_CATEGORY_CALLER_GUIDANCE = `<Selection_Gate>Use only when no specialist category fits and substantial effort spans systems/modules with broad impact. Use unspecified-low for contained moderate work.</Selection_Gate>`, DEEP_LOW_CATEGORY_CALLER_GUIDANCE = `<Selection_Gate>Route here when one subsystem plus its callers holds the mechanism and the evidence, once read, leaves one right answer. Wide but mechanical work belongs here or in a quick batch. When unsure, choose deep-low: a misrouted child returns \`ESCALATE: deep-high\` after one cheap attempt; re-spawn the same brief as deep-high with its findings.</Selection_Gate>`, DEEP_HIGH_CATEGORY_CALLER_GUIDANCE = `<Selection_Gate>Route here only when you can name the decision evidence cannot settle: a trade-off with no single right answer, a contract change crossing a package or process boundary, a mechanism with no in-repo pattern to copy, or correctness argued from invariants rather than observed in a test. Wide scope with easy decisions is deep-low or unspecified-high; reasoning as the deliverable is ultrabrain.</Selection_Gate>`, DEEP_LOW_GATE_MODELS, DEEP_HIGH_GATE_MODEL = "gpt-6-astra", OPENAI_CATEGORIES;
9497
+ </Category_Context>`, UNSPECIFIED_HIGH_CATEGORY_CALLER_GUIDANCE = `<Selection_Gate>Use only when no specialist category fits and substantial effort spans systems/modules with broad impact. Use unspecified-low for contained moderate work.</Selection_Gate>`, DEEP_LOW_CATEGORY_CALLER_GUIDANCE = `<Selection_Gate>Of the two deep lanes this is the default: the child settles its decisions from what it reads. When unsure, choose deep-low; a misrouted child returns \`ESCALATE: deep-high\` after one cheap attempt, and you re-spawn the same brief as deep-high with its findings.</Selection_Gate>`, DEEP_HIGH_CATEGORY_CALLER_GUIDANCE = `<Selection_Gate>Route here only when you can name the decision evidence cannot settle: a trade-off with no single right answer, a contract change crossing a package or process boundary, a mechanism with no in-repo pattern to copy, or correctness argued from invariants rather than observed in a test. Wide scope with easy decisions is deep-low or unspecified-high; reasoning as the deliverable is ultrabrain.</Selection_Gate>`, DEEP_LOW_GATE_MODELS, DEEP_HIGH_GATE_MODEL = "gpt-6-astra", OPENAI_CATEGORIES;
9498
9498
  var init_openai_categories = __esm(() => {
9499
9499
  init_types();
9500
9500
  DEEP_LOW_GATE_MODELS = ["gpt-6.1-sol", "gpt-6.1-sol-fast", "gpt-5.6-sol-fast", "gpt-5.6-sol"];
@@ -9509,7 +9509,7 @@ var init_openai_categories = __esm(() => {
9509
9509
  {
9510
9510
  name: "deep-low",
9511
9511
  config: { model: "openai/gpt-6.1-sol", variant: "medium" },
9512
- description: "Default deep lane: one goal, one deliverable, decisions the child can settle from what it reads. **3D graphics, computer/browser use, CAPTCHA, multimodal, backend, logic, and algorithm work is routed here.** Multiple goals fan out as parallel calls.",
9512
+ description: "Default deep lane: one goal, one deliverable, decisions the child can settle from what it reads; preferred over deep-high for 3D graphics, computer/browser use, CAPTCHA, multimodal, backend, logic, and algorithm work. Multiple goals fan out as parallel calls.",
9513
9513
  callerGuidance: DEEP_LOW_CATEGORY_CALLER_GUIDANCE,
9514
9514
  promptAppend: DEEP_LOW_CATEGORY_PROMPT_APPEND,
9515
9515
  resolvePromptAppend: resolveDeepLowCategoryPromptAppend,
@@ -89448,7 +89448,7 @@ var package_default2;
89448
89448
  var init_package2 = __esm(() => {
89449
89449
  package_default2 = {
89450
89450
  name: "@oh-my-opencode/omo-codex",
89451
- version: "5.1.13",
89451
+ version: "5.1.15",
89452
89452
  type: "module",
89453
89453
  private: true,
89454
89454
  description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
@@ -98777,6 +98777,7 @@ var REQUIRED_PLUGIN_ARTIFACTS = [
98777
98777
  join63("extensions", "omo.js"),
98778
98778
  join63("extensions", "omo-task.js"),
98779
98779
  join63("extensions", "omo-computer-use.js"),
98780
+ join63("extensions", "omo-memory-doctor.js"),
98780
98781
  join63("extensions", "assets.generated.json"),
98781
98782
  join63("extensions", "omo-member.js"),
98782
98783
  join63("extensions", "memory-run-supervisor.mjs"),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lazycodex-ai",
3
- "version": "5.1.13",
3
+ "version": "5.1.15",
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",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omo",
3
- "version": "5.1.13",
3
+ "version": "5.1.15",
4
4
  "description": "One Codex plugin namespace for Yeongyu's local Codex components.",
5
5
  "author": {
6
6
  "name": "Yeongyu Kim",
@@ -8,7 +8,7 @@
8
8
  "command": "node \"${PLUGIN_ROOT}/components/bootstrap/dist/cli.js\" hook session-start",
9
9
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\bootstrap.ps1\"",
10
10
  "timeout": 30,
11
- "statusMessage": "(OmO 5.1.13) Checking Bootstrap Provisioning"
11
+ "statusMessage": "(OmO 5.1.15) Checking Bootstrap Provisioning"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-bootstrap",
3
- "version": "5.1.13",
3
+ "version": "5.1.15",
4
4
  "description": "Codex SessionStart bootstrap component that provisions LazyCodex runtime dependencies from a detached worker.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use",
10
10
  "timeout": 30,
11
- "statusMessage": "(OmO 5.1.13) Checking Comments"
11
+ "statusMessage": "(OmO 5.1.15) Checking Comments"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-comment-checker",
3
- "version": "5.1.13",
3
+ "version": "5.1.15",
4
4
  "description": "Codex plugin that runs comment-checker after edit-like PostToolUse hooks.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook pre-tool-use",
10
10
  "timeout": 5,
11
- "statusMessage": "(OmO 5.1.13) Recommending Git Bash MCP"
11
+ "statusMessage": "(OmO 5.1.15) Recommending Git Bash MCP"
12
12
  }
13
13
  ]
14
14
  }
@@ -20,7 +20,7 @@
20
20
  "type": "command",
21
21
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-compact",
22
22
  "timeout": 5,
23
- "statusMessage": "(OmO 5.1.13) Resetting Git Bash MCP Reminder"
23
+ "statusMessage": "(OmO 5.1.15) Resetting Git Bash MCP Reminder"
24
24
  }
25
25
  ]
26
26
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-git-bash-hook",
3
- "version": "5.1.13",
3
+ "version": "5.1.15",
4
4
  "description": "Codex hook component that reminds Windows sessions to prefer the OMO git_bash MCP.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/components/lazycodex-executor-verify/dist/cli.js\" hook subagent-stop",
10
10
  "timeout": 10,
11
- "statusMessage": "(OmO 5.1.13) Verifying LazyCodex Executor Evidence"
11
+ "statusMessage": "(OmO 5.1.15) Verifying LazyCodex Executor Evidence"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-lazycodex-executor-verify",
3
- "version": "5.1.13",
3
+ "version": "5.1.15",
4
4
  "description": "Codex SubagentStop evidence verifier for LazyCodex executor completions.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "version": "5.1.13",
4
- "inputDigest": "sha256:1987f296d40fe07041a3d11da647afb8018ce55fed91453f9ed0c42fa6523d38",
3
+ "version": "5.1.15",
4
+ "inputDigest": "sha256:2a033aeb4eca6b2e5d55f0053c9cc5ab6a9708cfd06c7024eb7924de056bd8b3",
5
5
  "outputs": [
6
6
  {
7
7
  "path": "cli.d.ts",
@@ -9,7 +9,7 @@
9
9
  },
10
10
  {
11
11
  "path": "cli.js",
12
- "sha256": "d793d83fb82b1fafe52e619f545c5195398498d1f95f15d84904fe3d0a20befe"
12
+ "sha256": "f2776c0f9c2a893136e9e8e36c2e086172f10c0ab3566a730cff4443b712f956"
13
13
  },
14
14
  {
15
15
  "path": "codex-hook-cli.d.ts",
@@ -25,7 +25,7 @@
25
25
  },
26
26
  {
27
27
  "path": "codex-hook.js",
28
- "sha256": "9a4f53b980521752f603c9a46de8001294c1b964a31f7945eb48ecdae4bf12ac"
28
+ "sha256": "6e054189fe9efc941916d3469f1342344aadc20215c91fa6209e2f98139d6ed5"
29
29
  },
30
30
  {
31
31
  "path": "daemon-cli-path.d.ts",
@@ -5958,7 +5958,11 @@ async function collectPostEditDiagnostics(input) {
5958
5958
  observations.push({ filePath: result.filePath, kind: "not_configured" });
5959
5959
  break;
5960
5960
  case "block":
5961
- blocks.push({ filePath: result.filePath, diagnostics: classification.diagnostics });
5961
+ blocks.push({ filePath: result.filePath, diagnostics: classification.diagnostics, blocking: true });
5962
+ observations.push({ filePath: result.filePath, kind: "block" });
5963
+ break;
5964
+ case "guidance":
5965
+ blocks.push({ filePath: result.filePath, diagnostics: classification.text, blocking: false });
5962
5966
  observations.push({ filePath: result.filePath, kind: "block" });
5963
5967
  break;
5964
5968
  default: {
@@ -6020,7 +6024,7 @@ function normalizeDiagnosticsOutcome(outcome) {
6020
6024
  return outcome;
6021
6025
  }
6022
6026
  function classifyNotInstalled(guidance) {
6023
- return guidance === undefined ? { kind: "not_installed" } : { kind: "block", diagnostics: guidance };
6027
+ return guidance === undefined ? { kind: "not_installed" } : { kind: "guidance", text: guidance };
6024
6028
  }
6025
6029
  function normalizeDiagnosticsText(text) {
6026
6030
  return text.trim();
@@ -6277,22 +6281,33 @@ async function runLspDiagnosticsText(filePath) {
6277
6281
  return postEditOutcomeFromDaemonResult(result);
6278
6282
  }
6279
6283
  function postEditOutcomeFromDaemonResult(result) {
6280
- const availability = notConfiguredAvailability(result.details);
6281
- if (availability !== undefined)
6282
- return { kind: "not_configured", extension: availability.extension };
6283
- return result.content.map((block) => block.text).join(`
6284
+ const text = result.content.map((block) => block.text).join(`
6284
6285
  `);
6286
+ const availability = availabilityDetails2(result.details);
6287
+ if (availability === undefined)
6288
+ return text;
6289
+ if (availability["kind"] === "not_configured") {
6290
+ const extension = availability["extension"];
6291
+ return typeof extension === "string" && extension.length > 0 ? { kind: "not_configured", extension } : text;
6292
+ }
6293
+ if (availability["kind"] === "not_installed")
6294
+ return notInstalledOutcome(availability, text) ?? text;
6295
+ return text;
6285
6296
  }
6286
- function notConfiguredAvailability(details) {
6297
+ function availabilityDetails2(details) {
6287
6298
  if (!isRecord11(details))
6288
6299
  return;
6289
6300
  const availability = details["availability"];
6290
- if (!isRecord11(availability))
6291
- return;
6292
- if (availability["kind"] !== "not_configured")
6301
+ return isRecord11(availability) ? availability : undefined;
6302
+ }
6303
+ function notInstalledOutcome(availability, text) {
6304
+ const serverId = availability["serverId"];
6305
+ const installDecisionTool = availability["installDecisionTool"];
6306
+ if (typeof serverId !== "string" || serverId.length === 0 || typeof installDecisionTool !== "boolean")
6293
6307
  return;
6294
- const extension = availability["extension"];
6295
- return typeof extension === "string" && extension.length > 0 ? { extension } : undefined;
6308
+ const decision = availability["decision"];
6309
+ const base = { kind: "not_installed", serverId, installDecisionTool, text };
6310
+ return decision === "declined" || decision === "allowed" ? { ...base, decision } : base;
6296
6311
  }
6297
6312
  function codexLspRequestContext(env = process.env, cwd = process.cwd()) {
6298
6313
  const canonicalCwd = realpathSync7(resolve11(cwd));
@@ -6320,14 +6335,13 @@ async function runLspPostToolUseHook(input, runDiagnostics = runLspDiagnosticsTe
6320
6335
 
6321
6336
  `);
6322
6337
  const reason = limitHookText(rawReason, hookFeedbackLimit(input.transcript_path));
6323
- const output = {
6324
- decision: "block",
6325
- reason,
6326
- hookSpecificOutput: {
6327
- hookEventName: "PostToolUse",
6328
- additionalContext: reason
6329
- }
6338
+ const context = {
6339
+ hookSpecificOutput: { hookEventName: "PostToolUse", additionalContext: reason }
6330
6340
  };
6341
+ if (!blocks.some((block) => block.blocking))
6342
+ return `${JSON.stringify(context)}
6343
+ `;
6344
+ const output = { decision: "block", reason, ...context };
6331
6345
  return `${JSON.stringify(output)}
6332
6346
  `;
6333
6347
  }
@@ -27,21 +27,32 @@ export async function runLspDiagnosticsText(filePath) {
27
27
  return postEditOutcomeFromDaemonResult(result);
28
28
  }
29
29
  function postEditOutcomeFromDaemonResult(result) {
30
- const availability = notConfiguredAvailability(result.details);
31
- if (availability !== undefined)
32
- return { kind: "not_configured", extension: availability.extension };
33
- return result.content.map((block) => block.text).join("\n");
30
+ const text = result.content.map((block) => block.text).join("\n");
31
+ const availability = availabilityDetails(result.details);
32
+ if (availability === undefined)
33
+ return text;
34
+ if (availability["kind"] === "not_configured") {
35
+ const extension = availability["extension"];
36
+ return typeof extension === "string" && extension.length > 0 ? { kind: "not_configured", extension } : text;
37
+ }
38
+ if (availability["kind"] === "not_installed")
39
+ return notInstalledOutcome(availability, text) ?? text;
40
+ return text;
34
41
  }
35
- function notConfiguredAvailability(details) {
42
+ function availabilityDetails(details) {
36
43
  if (!isRecord(details))
37
44
  return undefined;
38
45
  const availability = details["availability"];
39
- if (!isRecord(availability))
40
- return undefined;
41
- if (availability["kind"] !== "not_configured")
46
+ return isRecord(availability) ? availability : undefined;
47
+ }
48
+ function notInstalledOutcome(availability, text) {
49
+ const serverId = availability["serverId"];
50
+ const installDecisionTool = availability["installDecisionTool"];
51
+ if (typeof serverId !== "string" || serverId.length === 0 || typeof installDecisionTool !== "boolean")
42
52
  return undefined;
43
- const extension = availability["extension"];
44
- return typeof extension === "string" && extension.length > 0 ? { extension } : undefined;
53
+ const decision = availability["decision"];
54
+ const base = { kind: "not_installed", serverId, installDecisionTool, text };
55
+ return decision === "declined" || decision === "allowed" ? { ...base, decision } : base;
45
56
  }
46
57
  export function codexLspRequestContext(env = process.env, cwd = process.cwd()) {
47
58
  const canonicalCwd = realpathSync(resolve(cwd));
@@ -67,14 +78,13 @@ export async function runLspPostToolUseHook(input, runDiagnostics = runLspDiagno
67
78
  return "";
68
79
  const rawReason = blocks.map(formatDiagnosticBlock).join("\n\n");
69
80
  const reason = limitHookText(rawReason, hookFeedbackLimit(input.transcript_path));
70
- const output = {
71
- decision: "block",
72
- reason,
73
- hookSpecificOutput: {
74
- hookEventName: "PostToolUse",
75
- additionalContext: reason,
76
- },
81
+ const context = {
82
+ hookSpecificOutput: { hookEventName: "PostToolUse", additionalContext: reason },
77
83
  };
84
+ // Missing-server guidance alone is a note for the model; only real diagnostics block the edit.
85
+ if (!blocks.some((block) => block.blocking))
86
+ return `${JSON.stringify(context)}\n`;
87
+ const output = { decision: "block", reason, ...context };
78
88
  return `${JSON.stringify(output)}\n`;
79
89
  }
80
90
  export async function runLspPostCompactHook(input) {
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use",
10
10
  "timeout": 60,
11
- "statusMessage": "(OmO 5.1.13) Checking LSP Diagnostics"
11
+ "statusMessage": "(OmO 5.1.15) Checking LSP Diagnostics"
12
12
  }
13
13
  ]
14
14
  }
@@ -21,7 +21,7 @@
21
21
  "type": "command",
22
22
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-compact",
23
23
  "timeout": 5,
24
- "statusMessage": "(OmO 5.1.13) Resetting LSP Diagnostics Cache"
24
+ "statusMessage": "(OmO 5.1.15) Resetting LSP Diagnostics Cache"
25
25
  }
26
26
  ]
27
27
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-lsp",
3
- "version": "5.1.13",
3
+ "version": "5.1.15",
4
4
  "description": "Codex plugin that exposes Language Server Protocol tools and post-edit diagnostics.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -35,17 +35,21 @@ export interface CodexPostCompactInput {
35
35
  interface DiagnosticBlock {
36
36
  filePath: string;
37
37
  diagnostics: string;
38
+ blocking: boolean;
38
39
  }
39
40
 
40
- interface PostToolUseHookOutput {
41
- decision: "block";
42
- reason: string;
41
+ interface PostToolUseHookContext {
43
42
  hookSpecificOutput: {
44
43
  hookEventName: "PostToolUse";
45
44
  additionalContext: string;
46
45
  };
47
46
  }
48
47
 
48
+ interface PostToolUseHookOutput extends PostToolUseHookContext {
49
+ decision: "block";
50
+ reason: string;
51
+ }
52
+
49
53
  const DIAGNOSTIC_START_PATTERN = /(?:error|warning|information|hint)\[[^\]\r\n]+\] \(\d+\) at \d+:\d+:/g;
50
54
  const DIAGNOSTIC_CHUNK_PATTERN = /^(?:error|warning|information|hint)\[[^\]\r\n]+\] \(\d+\) at \d+:\d+:/;
51
55
  const DEFAULT_MAX_HOOK_FEEDBACK_CHARS = 8000;
@@ -70,18 +74,34 @@ function postEditOutcomeFromDaemonResult(result: {
70
74
  readonly content: readonly { readonly type: string; readonly text?: string }[];
71
75
  readonly details?: unknown;
72
76
  }): PostEditDiagnosticsOutcome {
73
- const availability = notConfiguredAvailability(result.details);
74
- if (availability !== undefined) return { kind: "not_configured", extension: availability.extension };
75
- return result.content.map((block) => block.text).join("\n");
77
+ const text = result.content.map((block) => block.text).join("\n");
78
+ const availability = availabilityDetails(result.details);
79
+ if (availability === undefined) return text;
80
+ if (availability["kind"] === "not_configured") {
81
+ const extension = availability["extension"];
82
+ return typeof extension === "string" && extension.length > 0 ? { kind: "not_configured", extension } : text;
83
+ }
84
+ if (availability["kind"] === "not_installed") return notInstalledOutcome(availability, text) ?? text;
85
+ return text;
76
86
  }
77
87
 
78
- function notConfiguredAvailability(details: unknown): { readonly extension: string } | undefined {
88
+ function availabilityDetails(details: unknown): Record<string, unknown> | undefined {
79
89
  if (!isRecord(details)) return undefined;
80
90
  const availability = details["availability"];
81
- if (!isRecord(availability)) return undefined;
82
- if (availability["kind"] !== "not_configured") return undefined;
83
- const extension = availability["extension"];
84
- return typeof extension === "string" && extension.length > 0 ? { extension } : undefined;
91
+ return isRecord(availability) ? availability : undefined;
92
+ }
93
+
94
+ function notInstalledOutcome(
95
+ availability: Record<string, unknown>,
96
+ text: string,
97
+ ): PostEditDiagnosticsOutcome | undefined {
98
+ const serverId = availability["serverId"];
99
+ const installDecisionTool = availability["installDecisionTool"];
100
+ if (typeof serverId !== "string" || serverId.length === 0 || typeof installDecisionTool !== "boolean")
101
+ return undefined;
102
+ const decision = availability["decision"];
103
+ const base = { kind: "not_installed", serverId, installDecisionTool, text } as const;
104
+ return decision === "declined" || decision === "allowed" ? { ...base, decision } : base;
85
105
  }
86
106
 
87
107
  export function codexLspRequestContext(
@@ -116,14 +136,12 @@ export async function runLspPostToolUseHook(
116
136
 
117
137
  const rawReason = blocks.map(formatDiagnosticBlock).join("\n\n");
118
138
  const reason = limitHookText(rawReason, hookFeedbackLimit(input.transcript_path));
119
- const output: PostToolUseHookOutput = {
120
- decision: "block",
121
- reason,
122
- hookSpecificOutput: {
123
- hookEventName: "PostToolUse",
124
- additionalContext: reason,
125
- },
139
+ const context: PostToolUseHookContext = {
140
+ hookSpecificOutput: { hookEventName: "PostToolUse", additionalContext: reason },
126
141
  };
142
+ // Missing-server guidance alone is a note for the model; only real diagnostics block the edit.
143
+ if (!blocks.some((block) => block.blocking)) return `${JSON.stringify(context)}\n`;
144
+ const output: PostToolUseHookOutput = { decision: "block", reason, ...context };
127
145
  return `${JSON.stringify(output)}\n`;
128
146
  }
129
147