lazycodex-ai 5.0.0-beta.49 → 5.0.0-beta.50

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 (108) hide show
  1. package/dist/cli/index.js +4682 -14969
  2. package/dist/cli-node/index.js +4727 -15014
  3. package/package.json +1 -1
  4. package/packages/lsp-daemon/dist/cli.js +181 -181
  5. package/packages/lsp-daemon/dist/client.js +232 -232
  6. package/packages/lsp-daemon/dist/index.js +132 -132
  7. package/packages/lsp-tools-mcp/dist/cli.js +103 -101
  8. package/packages/lsp-tools-mcp/dist/lsp/manager.js +14 -14
  9. package/packages/lsp-tools-mcp/dist/mcp.js +129 -129
  10. package/packages/lsp-tools-mcp/dist/tools.js +47 -47
  11. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  12. package/packages/omo-codex/plugin/README.md +4 -0
  13. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +151 -102
  14. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  15. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  16. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  17. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  18. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  19. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  20. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/AGENTS.md +2 -2
  21. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/directive.md +2 -0
  22. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/cli.js +35 -24
  23. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/codex-hook.js +31 -21
  24. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/types.d.ts +3 -0
  25. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  26. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  27. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/src/codex-hook.ts +31 -23
  28. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/src/types.ts +3 -0
  29. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/cli.test.ts +1 -1
  30. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/codex-hook.test.ts +133 -7
  31. package/packages/omo-codex/plugin/components/lcx/skills/lcx-doctor/SKILL.md +3 -1
  32. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +3 -3
  33. package/packages/omo-codex/plugin/components/lsp/dist/cli.js +298 -298
  34. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  35. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  36. package/packages/omo-codex/plugin/components/rules/README.md +2 -0
  37. package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-6.md +123 -0
  38. package/packages/omo-codex/plugin/components/rules/dist/cli.js +38 -30
  39. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  40. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  41. package/packages/omo-codex/plugin/components/rules/src/post-compact-budget.ts +6 -0
  42. package/packages/omo-codex/plugin/components/rules/test/hephaestus-model-variant.test.ts +38 -2
  43. package/packages/omo-codex/plugin/components/rules/test/post-compact-budget.test.ts +24 -0
  44. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  45. package/packages/omo-codex/plugin/components/teammode/package.json +2 -2
  46. package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +66 -357
  47. package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +66 -358
  48. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  49. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  50. package/packages/omo-codex/plugin/components/ultrawork/README.md +2 -0
  51. package/packages/omo-codex/plugin/components/ultrawork/agents/explorer.toml +1 -1
  52. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-clone-fidelity-reviewer.toml +1 -1
  53. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-code-reviewer.toml +1 -1
  54. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-gate-reviewer.toml +1 -1
  55. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-qa-executor.toml +1 -1
  56. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-high.toml +1 -1
  57. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-low.toml +1 -1
  58. package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-medium.toml +1 -1
  59. package/packages/omo-codex/plugin/components/ultrawork/agents/librarian.toml +1 -1
  60. package/packages/omo-codex/plugin/components/ultrawork/agents/metis.toml +1 -1
  61. package/packages/omo-codex/plugin/components/ultrawork/agents/momus.toml +1 -1
  62. package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +1 -1
  63. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  64. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  65. package/packages/omo-codex/plugin/components/ulw-execute-continuation/dist/cli.js +3 -3
  66. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
  67. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  68. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +63 -63
  69. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
  70. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  71. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  72. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  73. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  74. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  75. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  76. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  77. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  78. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
  79. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  80. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  81. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  82. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  83. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  84. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  85. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  86. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  87. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  88. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  89. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  90. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  91. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  92. package/packages/omo-codex/plugin/model-catalog.json +16 -7
  93. package/packages/omo-codex/plugin/package-lock.json +16 -16
  94. package/packages/omo-codex/plugin/package.json +1 -1
  95. package/packages/omo-codex/plugin/scripts/migrate-codex-config/catalog.mjs +16 -7
  96. package/packages/omo-codex/plugin/scripts/migrate-codex-config/multi-agent-v2-guard.mjs +8 -4
  97. package/packages/omo-codex/plugin/scripts/migrate-codex-config/subagent-limit-guard.mjs +18 -90
  98. package/packages/omo-codex/plugin/scripts/migrate-codex-config/toml-section-editor.mjs +1 -1
  99. package/packages/omo-codex/plugin/shared/package.json +1 -1
  100. package/packages/omo-codex/plugin/skills/lcx-doctor/SKILL.md +3 -1
  101. package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +12 -12
  102. package/packages/omo-codex/plugin/test/aggregate-model-catalog.test.mjs +14 -4
  103. package/packages/omo-codex/plugin/test/auto-update.test.mjs +4 -4
  104. package/packages/omo-codex/plugin/test/component-hook-contract-cases.mjs +25 -1
  105. package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +35 -35
  106. package/packages/omo-codex/plugin/test/multi-agent-v2-regression.test.mjs +1 -1
  107. package/packages/omo-codex/plugin/test/subagent-limit-migration.test.mjs +107 -15
  108. package/packages/omo-codex/scripts/install-dist/install-local.mjs +318 -569
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook session-start",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.0.0-beta.49) Recording Session Telemetry"
10
+ "statusMessage": "(OmO 5.0.0-beta.50) Recording Session Telemetry"
11
11
  }
12
12
  ]
13
13
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-telemetry",
3
- "version": "5.0.0-beta.49",
3
+ "version": "5.0.0-beta.50",
4
4
  "description": "Codex plugin component that emits omo-codex anonymous daily-active telemetry on SessionStart.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -4,6 +4,8 @@ Codex plugin that injects a compact orchestration directive (the **ultrawork** p
4
4
 
5
5
  Bundled Codex agent role TOMLs in `agents/` are installed into `CODEX_HOME/agents/` by the omo-codex installer (`linkCachedPluginAgents`, in `src/cli/install-codex/link-cached-plugin-agents.ts`). Install-time writes regular file copies on every platform. For the public `sisyphuslabs` marketplace, those files are copied from Codex's local installed-marketplace snapshot so they keep resolving after Codex prunes old plugin-cache versions or temporary marketplace state. There is no runtime Python hook.
6
6
 
7
+ All 12 bundled agent TOMLs set `model = "gpt-6-astra"`; each role keeps its own `model_reasoning_effort` (explorer and librarian `low`, the gate reviewer `low`, the code reviewer and `lazycodex-worker-high` `medium`, the rest `high`). When a user has customized an installed agent's effort, the installer keeps that effort while moving the model to `gpt-6-astra` (`src/install/managed-agent-reasoning-defaults.ts`).
8
+
7
9
  ## What the injected directive enforces
8
10
 
9
11
  | Mandate | Behavior |
@@ -1,7 +1,7 @@
1
1
  name = "explorer"
2
2
  description = "Codebase search specialist for Codex sessions. Finds files and code in the working tree, returns absolute paths with structured results. Read-only."
3
3
  nickname_candidates = ["Explorer"]
4
- model = "gpt-5.6-luna"
4
+ model = "gpt-6-astra"
5
5
  model_reasoning_effort = "low"
6
6
  service_tier = "fast"
7
7
 
@@ -1,7 +1,7 @@
1
1
  name = "lazycodex-clone-fidelity-reviewer"
2
2
  description = "Read-only LazyCodex clone / design-system fidelity reviewer. Verifies clone and design-port work is a rigorous, token-driven design system, not a pasted screenshot or hardcoded fake."
3
3
  nickname_candidates = ["Clone Fidelity Reviewer"]
4
- model = "gpt-5.6-terra"
4
+ model = "gpt-6-astra"
5
5
  model_reasoning_effort = "high"
6
6
 
7
7
  developer_instructions = """
@@ -1,7 +1,7 @@
1
1
  name = "lazycodex-code-reviewer"
2
2
  description = "Read-only LazyCodex code-quality reviewer. Audits diffs, tests, and risk with strict artifact-backed findings."
3
3
  nickname_candidates = ["Code Reviewer"]
4
- model = "gpt-5.6-terra"
4
+ model = "gpt-6-astra"
5
5
  model_reasoning_effort = "medium"
6
6
 
7
7
  developer_instructions = """
@@ -1,7 +1,7 @@
1
1
  name = "lazycodex-gate-reviewer"
2
2
  description = "Read-only LazyCodex gate reviewer. Re-audits executor, code review, and QA artifacts before final approval."
3
3
  nickname_candidates = ["Gate Reviewer"]
4
- model = "gpt-5.6-sol"
4
+ model = "gpt-6-astra"
5
5
  model_reasoning_effort = "low"
6
6
 
7
7
  developer_instructions = """
@@ -1,7 +1,7 @@
1
1
  name = "lazycodex-qa-executor"
2
2
  description = "LazyCodex manual QA executor. Runs real scenarios and records artifact-backed surface evidence."
3
3
  nickname_candidates = ["QA Executor"]
4
- model = "gpt-5.6-luna"
4
+ model = "gpt-6-astra"
5
5
  model_reasoning_effort = "high"
6
6
 
7
7
  developer_instructions = """
@@ -1,7 +1,7 @@
1
1
  name = "lazycodex-worker-high"
2
2
  description = "LazyCodex high-difficulty implementation worker, sized for LARGE changes: a new module or abstraction, a cross-module refactor, concurrency/security/migration work, or any real, complex, big problem that has ONE clear goal. Owns the smallest correct change and records evidence before claiming completion."
3
3
  nickname_candidates = ["High Worker"]
4
- model = "gpt-5.6-sol"
4
+ model = "gpt-6-astra"
5
5
  model_reasoning_effort = "medium"
6
6
 
7
7
  developer_instructions = """
@@ -1,7 +1,7 @@
1
1
  name = "lazycodex-worker-low"
2
2
  description = "LazyCodex low-difficulty implementation worker, sized for SMALL changes: single-spot fixes, boilerplate, config/copy changes, and pattern-following edits confined to one file. Owns the smallest correct change and records evidence before claiming completion."
3
3
  nickname_candidates = ["Low Worker"]
4
- model = "gpt-5.6-luna"
4
+ model = "gpt-6-astra"
5
5
  model_reasoning_effort = "high"
6
6
 
7
7
  developer_instructions = """
@@ -1,7 +1,7 @@
1
1
  name = "lazycodex-worker-medium"
2
2
  description = "LazyCodex medium-difficulty implementation worker, sized for MID-SIZED changes: a standard feature inside existing layers, touching a few files along established patterns. Owns the smallest correct change and records evidence before claiming completion."
3
3
  nickname_candidates = ["Medium Worker"]
4
- model = "gpt-5.6-terra"
4
+ model = "gpt-6-astra"
5
5
  model_reasoning_effort = "high"
6
6
 
7
7
  developer_instructions = """
@@ -1,7 +1,7 @@
1
1
  name = "librarian"
2
2
  description = "External open-source codebase and documentation researcher. Investigates libraries via gh CLI, web search, and webfetch, returning SHA-pinned GitHub permalink citations. Read-only."
3
3
  nickname_candidates = ["Librarian"]
4
- model = "gpt-5.6-luna"
4
+ model = "gpt-6-astra"
5
5
  model_reasoning_effort = "low"
6
6
  service_tier = "fast"
7
7
 
@@ -1,7 +1,7 @@
1
1
  name = "metis"
2
2
  description = "Pre-planning analyst. Detects contradictions, ambiguity, missing constraints, and execution risks in a draft plan or request before the planner commits. Read-only."
3
3
  nickname_candidates = ["Analyst"]
4
- model = "gpt-5.6-sol"
4
+ model = "gpt-6-astra"
5
5
  model_reasoning_effort = "high"
6
6
 
7
7
  developer_instructions = """
@@ -1,7 +1,7 @@
1
1
  name = "momus"
2
2
  description = "Deep plan reviewer. Verifies a work plan is executable: references exist, tasks are startable, QA scenarios are concrete. Runs at High and may take a long time; callers must wait for its terminal result instead of cancelling or duplicating it. Issues OKAY, ITERATE, or REJECT. Read-only."
3
3
  nickname_candidates = ["Reviewer"]
4
- model = "gpt-5.6-terra"
4
+ model = "gpt-6-astra"
5
5
  model_reasoning_effort = "high"
6
6
 
7
7
  developer_instructions = """
@@ -1,7 +1,7 @@
1
1
  name = "plan"
2
2
  description = "Strategic planning consultant for work with unresolved design uncertainty after discovery. Produces one executable plan; never implements. Writes the plan to .omo/plans/<slug>.md."
3
3
  nickname_candidates = ["Planner"]
4
- model = "gpt-5.6-sol"
4
+ model = "gpt-6-astra"
5
5
  model_reasoning_effort = "high"
6
6
 
7
7
  developer_instructions = """
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook user-prompt-submit",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.0.0-beta.49) Checking Ultrawork Trigger"
10
+ "statusMessage": "(OmO 5.0.0-beta.50) Checking Ultrawork Trigger"
11
11
  }
12
12
  ]
13
13
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-ultrawork",
3
- "version": "5.0.0-beta.49",
3
+ "version": "5.0.0-beta.50",
4
4
  "description": "Codex plugin that injects the ultrawork orchestration directive and ships LazyCodex planning, review, QA, and gate agent roles.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -422,13 +422,13 @@ function parseHookInput(raw) {
422
422
  }
423
423
  }
424
424
  function readStdin() {
425
- return new Promise((resolve2) => {
425
+ return new Promise((resolve) => {
426
426
  let data = "";
427
427
  processStdin.setEncoding("utf8");
428
428
  processStdin.on("data", (chunk) => {
429
429
  data += chunk;
430
430
  });
431
- processStdin.once("error", () => resolve2(data));
432
- processStdin.once("end", () => resolve2(data));
431
+ processStdin.once("error", () => resolve(data));
432
+ processStdin.once("end", () => resolve(data));
433
433
  });
434
434
  }
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/ulw-execute-continuation/dist/cli.js\" hook stop",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.0.0-beta.49) Checking Ulw-Execute Continuation"
10
+ "statusMessage": "(OmO 5.0.0-beta.50) Checking Ulw-Execute Continuation"
11
11
  }
12
12
  ]
13
13
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-ulw-execute-continuation",
3
- "version": "5.0.0-beta.49",
3
+ "version": "5.0.0-beta.50",
4
4
  "description": "Codex Stop hook continuation injector for omo-codex ulw-execute plans.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -2788,7 +2788,7 @@ var text3 = (value, key) => {
2788
2788
  const candidate = read2(value, key);
2789
2789
  return isText(candidate) ? candidate.trim() : undefined;
2790
2790
  };
2791
- var isModel2 = (value) => typeof value === "string" && ULW_LOOP_SUCCESS_CRITERION_USER_MODELS.some((model2) => model2 === value);
2791
+ var isModel2 = (value) => typeof value === "string" && ULW_LOOP_SUCCESS_CRITERION_USER_MODELS.some((model) => model === value);
2792
2792
  var after = (proposal) => {
2793
2793
  const candidate = read2(proposal, "after");
2794
2794
  return typeof candidate === "object" && candidate !== null && !Array.isArray(candidate) ? candidate : undefined;
@@ -2863,8 +2863,8 @@ function reviseCriterion(plan, proposal, now) {
2863
2863
  const current = target?.successCriteria[index];
2864
2864
  if (target === undefined || current === undefined)
2865
2865
  return;
2866
- const model2 = read2(proposal, "userModel");
2867
- target.successCriteria[index] = { ...current, scenario: text3(proposal, "scenario") ?? current.scenario, expectedEvidence: text3(proposal, "expectedEvidence") ?? current.expectedEvidence, userModel: isModel2(model2) ? model2 : current.userModel };
2866
+ const model = read2(proposal, "userModel");
2867
+ target.successCriteria[index] = { ...current, scenario: text3(proposal, "scenario") ?? current.scenario, expectedEvidence: text3(proposal, "expectedEvidence") ?? current.expectedEvidence, userModel: isModel2(model) ? model : current.userModel };
2868
2868
  target.updatedAt = now;
2869
2869
  }
2870
2870
 
@@ -2873,19 +2873,19 @@ function buildSteeringPlanSnapshot(plan, changedGoalIds) {
2873
2873
  const snapshot = {
2874
2874
  updatedAt: plan.updatedAt,
2875
2875
  goalCount: plan.goals.length,
2876
- goalIds: plan.goals.map((goal2) => goal2.id),
2877
- goals: plan.goals.filter((goal2) => changedGoalIds.has(goal2.id))
2876
+ goalIds: plan.goals.map((goal) => goal.id),
2877
+ goals: plan.goals.filter((goal) => changedGoalIds.has(goal.id))
2878
2878
  };
2879
2879
  return plan.activeGoalId === undefined ? snapshot : { ...snapshot, activeGoalId: plan.activeGoalId };
2880
2880
  }
2881
- function changedGoalIdsBetween(before, after2) {
2882
- const beforeById = new Map(before.goals.map((goal2) => [goal2.id, goal2]));
2881
+ function changedGoalIdsBetween(before, after) {
2882
+ const beforeById = new Map(before.goals.map((goal) => [goal.id, goal]));
2883
2883
  const changed = new Set;
2884
- for (const goal2 of after2.goals) {
2885
- const prior = beforeById.get(goal2.id);
2886
- if (prior === undefined || JSON.stringify(prior) !== JSON.stringify(goal2))
2887
- changed.add(goal2.id);
2888
- beforeById.delete(goal2.id);
2884
+ for (const goal of after.goals) {
2885
+ const prior = beforeById.get(goal.id);
2886
+ if (prior === undefined || JSON.stringify(prior) !== JSON.stringify(goal))
2887
+ changed.add(goal.id);
2888
+ beforeById.delete(goal.id);
2889
2889
  }
2890
2890
  for (const id of beforeById.keys())
2891
2891
  changed.add(id);
@@ -2905,7 +2905,7 @@ var text4 = (value, key) => {
2905
2905
  };
2906
2906
  var isKind2 = (value) => typeof value === "string" && ULW_LOOP_STEERING_MUTATION_KINDS.some((kind) => kind === value);
2907
2907
  var isSource2 = (value) => typeof value === "string" && SOURCES2.some((source) => source === value);
2908
- var isModel3 = (value) => typeof value === "string" && ULW_LOOP_SUCCESS_CRITERION_USER_MODELS.some((model2) => model2 === value);
2908
+ var isModel3 = (value) => typeof value === "string" && ULW_LOOP_SUCCESS_CRITERION_USER_MODELS.some((model) => model === value);
2909
2909
  var texts = (value, key) => {
2910
2910
  const candidate = read3(value, key);
2911
2911
  return Array.isArray(candidate) && candidate.every((item) => typeof item === "string") ? candidate : [];
@@ -3046,10 +3046,10 @@ function validateCriterion(plan, proposal, reasons) {
3046
3046
  reasons.push("revise_criterion requires goalId");
3047
3047
  else if (criterionId === undefined || target.successCriteria.every((item) => item.id !== criterionId))
3048
3048
  reasons.push("revise_criterion requires criterionId");
3049
- const model2 = read3(proposal, "userModel");
3050
- if (read3(proposal, "scenario") === undefined && read3(proposal, "expectedEvidence") === undefined && model2 === undefined)
3049
+ const model = read3(proposal, "userModel");
3050
+ if (read3(proposal, "scenario") === undefined && read3(proposal, "expectedEvidence") === undefined && model === undefined)
3051
3051
  reasons.push("revise_criterion requires update");
3052
- if (model2 !== undefined && !isModel3(model2))
3052
+ if (model !== undefined && !isModel3(model))
3053
3053
  reasons.push("invalid userModel");
3054
3054
  }
3055
3055
  function applySteeringMutation(plan, proposal, audit) {
@@ -3076,8 +3076,8 @@ function applySteeringMutation(plan, proposal, audit) {
3076
3076
  function isProposal(value) {
3077
3077
  return isPlain2(value) && isKind2(read3(value, "kind")) && isSource2(read3(value, "source")) && isText2(read3(value, "evidence")) && isText2(read3(value, "rationale"));
3078
3078
  }
3079
- function parseUlwLoopSteeringDirective(text5) {
3080
- const match = /(?:^|\s)(?:OMO_ULW_LOOP_STEER|omo\.ulw-loop\.steer|omo ulw-loop steer|omo-agent-toolkit ulw-loop steer):\s*([\s\S]+)$/u.exec(text5);
3079
+ function parseUlwLoopSteeringDirective(text) {
3080
+ const match = /(?:^|\s)(?:OMO_ULW_LOOP_STEER|omo\.ulw-loop\.steer|omo ulw-loop steer|omo-agent-toolkit ulw-loop steer):\s*([\s\S]+)$/u.exec(text);
3081
3081
  if (match?.[1] === undefined)
3082
3082
  return null;
3083
3083
  try {
@@ -3162,16 +3162,16 @@ async function prepareBatch(repoRoot, plan, proposals, scope) {
3162
3162
  const key = proposal.idempotencyKey ?? proposal.promptSignature;
3163
3163
  const prior = key === undefined ? undefined : await findAcceptedSteeringLedgerEntry(repoRoot, key, scope);
3164
3164
  if (prior?.steering !== undefined) {
3165
- const result2 = { accepted: true, deduped: true, audit: { ...prior.steering, deduped: true }, rejectedReasons: [] };
3166
- items.push({ kind: "deduped", result: result2 });
3167
- results.push(result2);
3165
+ const result = { accepted: true, deduped: true, audit: { ...prior.steering, deduped: true }, rejectedReasons: [] };
3166
+ items.push({ kind: "deduped", result });
3167
+ results.push(result);
3168
3168
  continue;
3169
3169
  }
3170
3170
  const audit = validateUlwLoopSteeringProposal(current, proposal);
3171
3171
  if (!audit.invariant.accepted) {
3172
- const result2 = { accepted: false, deduped: false, audit, rejectedReasons: audit.invariant.rejectedReasons };
3173
- items.push({ kind: "deduped", result: result2 });
3174
- results.push(result2);
3172
+ const result = { accepted: false, deduped: false, audit, rejectedReasons: audit.invariant.rejectedReasons };
3173
+ items.push({ kind: "deduped", result });
3174
+ results.push(result);
3175
3175
  continue;
3176
3176
  }
3177
3177
  const next = applySteeringMutation(current, proposal, audit);
@@ -3238,7 +3238,7 @@ ledger: ${plan.ledgerPath}
3238
3238
  async function status(repoRoot, json, scope) {
3239
3239
  const plan = await readUlwLoopPlan(repoRoot, scope);
3240
3240
  if (json) {
3241
- const active = plan.goals.find((goal3) => goal3.id === plan.activeGoalId);
3241
+ const active = plan.goals.find((goal) => goal.id === plan.activeGoalId);
3242
3242
  const currentAttemptDir = plan.evidenceLayoutVersion === 2 && active ? ulwLoopAttemptEvidenceDir(active.id, active.attempt, scope) : undefined;
3243
3243
  printJson({
3244
3244
  ok: true,
@@ -3281,9 +3281,9 @@ async function steer(repoRoot, argv, json, scope) {
3281
3281
  const proposals = await parseSteeringProposals(argv);
3282
3282
  const single = proposals[0];
3283
3283
  if (single !== undefined && proposals.length === 1 && readValue(argv, "--proposals-json") === undefined) {
3284
- const result2 = await steerUlwLoop(repoRoot, single, scope);
3285
- printSteerResult(result2, json);
3286
- return result2.accepted ? 0 : 1;
3284
+ const result = await steerUlwLoop(repoRoot, single, scope);
3285
+ printSteerResult(result, json);
3286
+ return result.accepted ? 0 : 1;
3287
3287
  }
3288
3288
  const result = await steerUlwLoopBatch(repoRoot, proposals, scope);
3289
3289
  printSteerBatchResult(result, json);
@@ -3302,12 +3302,12 @@ async function addGoal(repoRoot, argv, json, scope) {
3302
3302
  }
3303
3303
  async function criteria(repoRoot, argv, json, scope) {
3304
3304
  const goalId = required4(argv, "--goal-id");
3305
- const goal3 = findGoal3(await readUlwLoopPlan(repoRoot, scope), goalId);
3305
+ const goal = findGoal3(await readUlwLoopPlan(repoRoot, scope), goalId);
3306
3306
  if (json)
3307
- printJson({ ok: true, goalId: goal3.id, criteria: goal3.successCriteria });
3307
+ printJson({ ok: true, goalId: goal.id, criteria: goal.successCriteria });
3308
3308
  else {
3309
- process.stdout.write(`criteria for ${goal3.id}:
3310
- ${goal3.successCriteria.map(formatCriterionForCli).join(`
3309
+ process.stdout.write(`criteria for ${goal.id}:
3310
+ ${goal.successCriteria.map(formatCriterionForCli).join(`
3311
3311
  `)}
3312
3312
  `);
3313
3313
  }
@@ -3361,9 +3361,9 @@ function required4(argv, flag) {
3361
3361
  throw new UlwLoopError(`Missing ${flag}.`, "ULW_LOOP_ARGUMENT_MISSING", { details: { flag } });
3362
3362
  }
3363
3363
  function findGoal3(plan, goalId) {
3364
- const goal3 = plan.goals.find((candidate) => candidate.id === goalId);
3365
- if (goal3 !== undefined)
3366
- return goal3;
3364
+ const goal = plan.goals.find((candidate) => candidate.id === goalId);
3365
+ if (goal !== undefined)
3366
+ return goal;
3367
3367
  throw new UlwLoopError(`Unknown ulw-loop id: ${goalId}.`, "ULW_LOOP_GOAL_NOT_FOUND", { details: { goalId } });
3368
3368
  }
3369
3369
 
@@ -3460,13 +3460,13 @@ function sessionIdFlagPresent(argv) {
3460
3460
  }
3461
3461
  function commandScope(repoRoot, argv) {
3462
3462
  if (sessionIdFlagPresent(argv)) {
3463
- const sessionId2 = readValue(argv, SESSION_ID_FLAG)?.trim();
3464
- if (!sessionId2) {
3463
+ const sessionId = readValue(argv, SESSION_ID_FLAG)?.trim();
3464
+ if (!sessionId) {
3465
3465
  throw new UlwLoopError(sessionIdRequiredMessage(SESSION_ID_FLAG), "ULW_LOOP_SESSION_ID_REQUIRED", {
3466
3466
  details: { flag: SESSION_ID_FLAG }
3467
3467
  });
3468
3468
  }
3469
- return { sessionId: sessionId2 };
3469
+ return { sessionId };
3470
3470
  }
3471
3471
  const sessionId = resolveUlwLoopSessionIdFromEnv();
3472
3472
  if (sessionId !== null)
@@ -3755,14 +3755,14 @@ function optionalString(value) {
3755
3755
  return value === undefined || typeof value === "string";
3756
3756
  }
3757
3757
  function readAll(stdin) {
3758
- return new Promise((resolve4, reject) => {
3758
+ return new Promise((resolve, reject) => {
3759
3759
  let data = "";
3760
3760
  stdin.setEncoding("utf8");
3761
3761
  stdin.on("data", (chunk) => {
3762
3762
  data += chunk instanceof Buffer ? chunk.toString() : String(chunk);
3763
3763
  });
3764
3764
  stdin.once("error", reject);
3765
- stdin.once("end", () => resolve4(data));
3765
+ stdin.once("end", () => resolve(data));
3766
3766
  });
3767
3767
  }
3768
3768
 
@@ -3872,16 +3872,16 @@ function consumeReviewSpawnBudget(payload, plan, stateDir) {
3872
3872
  const agentType = reviewAgentType(payload.tool_input);
3873
3873
  if (agentType === null)
3874
3874
  return null;
3875
- const goal3 = plan.goals.find((candidate) => candidate.id === plan.activeGoalId) ?? plan.goals.find((candidate) => isFinalRunCompletionCandidate(plan, candidate));
3876
- if (goal3 === undefined)
3875
+ const goal = plan.goals.find((candidate) => candidate.id === plan.activeGoalId) ?? plan.goals.find((candidate) => isFinalRunCompletionCandidate(plan, candidate));
3876
+ if (goal === undefined)
3877
3877
  return null;
3878
3878
  const counterPath = join3(stateDir, "review-spawn-counts.json");
3879
3879
  const limit = reviewSpawnLimit();
3880
3880
  const counts = readCounts(counterPath);
3881
- const key = `${agentType}:${goal3.id}:a${goal3.attempt}`;
3881
+ const key = `${agentType}:${goal.id}:a${goal.attempt}`;
3882
3882
  const count = (counts[key] ?? 0) + 1;
3883
3883
  if (count > limit)
3884
- return `ulw-loop reviewer no-progress cap reached (${agentType} ${count}/${limit}) for ${goal3.id} attempt ${goal3.attempt}. Consolidate existing review findings, or checkpoint and start a new attempt after concrete progress.`;
3884
+ return `ulw-loop reviewer no-progress cap reached (${agentType} ${count}/${limit}) for ${goal.id} attempt ${goal.attempt}. Consolidate existing review findings, or checkpoint and start a new attempt after concrete progress.`;
3885
3885
  counts[key] = count;
3886
3886
  atomicWriteJson(counterPath, counts);
3887
3887
  return null;
@@ -3889,23 +3889,23 @@ function consumeReviewSpawnBudget(payload, plan, stateDir) {
3889
3889
  function missingGateArtifact(payload, plan) {
3890
3890
  if (!isGateReviewerSpawn(payload.tool_input))
3891
3891
  return null;
3892
- const goal3 = plan.goals.find((candidate) => isFinalRunCompletionCandidate(plan, candidate));
3893
- if (goal3 === undefined || goal3.status === "complete")
3892
+ const goal = plan.goals.find((candidate) => isFinalRunCompletionCandidate(plan, candidate));
3893
+ if (goal === undefined || goal.status === "complete")
3894
3894
  return null;
3895
- if (!goal3.successCriteria.every((criterion) => criterion.status === "pass"))
3895
+ if (!goal.successCriteria.every((criterion) => criterion.status === "pass"))
3896
3896
  return null;
3897
3897
  const scope = { sessionId: payload.session_id };
3898
- const requiredArtifacts = [`${goal3.id}-manual-qa.md`];
3898
+ const requiredArtifacts = [`${goal.id}-manual-qa.md`];
3899
3899
  if (plan.evidenceLayoutVersion === 2) {
3900
- const attemptDir = ulwLoopAttemptEvidenceDir(goal3.id, goal3.attempt, scope);
3900
+ const attemptDir = ulwLoopAttemptEvidenceDir(goal.id, goal.attempt, scope);
3901
3901
  for (const name of requiredArtifacts) {
3902
- const relative2 = `${attemptDir}/${name}`;
3903
- if (!isNonEmptyFile(join3(payload.cwd, relative2)))
3904
- return relative2;
3902
+ const relative = `${attemptDir}/${name}`;
3903
+ if (!isNonEmptyFile(join3(payload.cwd, relative)))
3904
+ return relative;
3905
3905
  }
3906
3906
  return null;
3907
3907
  }
3908
- const manualQa = `.omo/evidence/${goal3.id}-manual-qa.md`;
3908
+ const manualQa = `.omo/evidence/${goal.id}-manual-qa.md`;
3909
3909
  return isNonEmptyFile(join3(payload.cwd, manualQa)) ? null : manualQa;
3910
3910
  }
3911
3911
  function isGateReviewerSpawn(toolInput) {
@@ -4066,14 +4066,14 @@ function runStopResumeHook(input) {
4066
4066
  const plan = readPlan2(join4(stateDir, "goals.json"));
4067
4067
  if (plan === null || plan.aggregateCompletion?.status === "complete")
4068
4068
  return "";
4069
- const goal3 = resumableGoal(plan);
4070
- if (goal3 === undefined)
4069
+ const goal = resumableGoal(plan);
4070
+ if (goal === undefined)
4071
4071
  return "";
4072
- if (!consumeResumeBudgetLocked(ulwLoopStateLockPath(payload.cwd, scope), stateDir, goal3.id))
4072
+ if (!consumeResumeBudgetLocked(ulwLoopStateLockPath(payload.cwd, scope), stateDir, goal.id))
4073
4073
  return "";
4074
4074
  const output = {
4075
4075
  decision: "block",
4076
- reason: renderResumeDirective(plan, goal3, payload.session_id)
4076
+ reason: renderResumeDirective(plan, goal, payload.session_id)
4077
4077
  };
4078
4078
  return JSON.stringify(output);
4079
4079
  }
@@ -4091,13 +4091,13 @@ async function runStopResumeHookCli(stdin, stdout) {
4091
4091
  }
4092
4092
  }
4093
4093
  function resumableGoal(plan) {
4094
- const active = plan.goals.find((goal3) => goal3.id === plan.activeGoalId);
4094
+ const active = plan.goals.find((goal) => goal.id === plan.activeGoalId);
4095
4095
  if (active !== undefined && isResumableStatus(active.status))
4096
4096
  return active;
4097
- return plan.goals.find((goal3) => isResumableStatus(goal3.status));
4097
+ return plan.goals.find((goal) => isResumableStatus(goal.status));
4098
4098
  }
4099
- function isResumableStatus(status2) {
4100
- return status2 === "pending" || status2 === "in_progress";
4099
+ function isResumableStatus(status) {
4100
+ return status === "pending" || status === "in_progress";
4101
4101
  }
4102
4102
  function consumeResumeBudgetLocked(lockPath, stateDir, goalId) {
4103
4103
  try {
@@ -4127,11 +4127,11 @@ function consumeResumeBudget(stateDir, goalId) {
4127
4127
  function isInsideDir(dir, candidate) {
4128
4128
  return candidate.startsWith(resolve4(dir) + sep2);
4129
4129
  }
4130
- function renderResumeDirective(plan, goal3, sessionId) {
4130
+ function renderResumeDirective(plan, goal, sessionId) {
4131
4131
  const normalized = normalizeUlwLoopSessionId(sessionId);
4132
4132
  const option = normalized !== null && plan.goalsPath.includes(`/${normalized}/`) ? ` --session-id ${normalized}` : "";
4133
4133
  return [
4134
- `The ulw-loop run in this session still has unfinished goals (next: ${goal3.id} — ${goal3.title}).`,
4134
+ `The ulw-loop run in this session still has unfinished goals (next: ${goal.id} — ${goal.title}).`,
4135
4135
  "The turn ended before the loop completed. Resume it now:",
4136
4136
  `1. Run \`omo-agent-toolkit ulw-loop status${option} --json\` to reload the plan, the active goal, and currentAttemptDir.`,
4137
4137
  "2. Continue the active goal's remaining success criteria, recording evidence with record-evidence.",
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook user-prompt-submit --with-ultrawork",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.0.0-beta.49) Checking Ulw-Loop Steering"
10
+ "statusMessage": "(OmO 5.0.0-beta.50) Checking Ulw-Loop Steering"
11
11
  }
12
12
  ]
13
13
  }
@@ -20,7 +20,7 @@
20
20
  "type": "command",
21
21
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use-spawn",
22
22
  "timeout": 5,
23
- "statusMessage": "(OmO 5.0.0-beta.49) Recording Spawn Admission"
23
+ "statusMessage": "(OmO 5.0.0-beta.50) Recording Spawn Admission"
24
24
  }
25
25
  ]
26
26
  }
@@ -33,7 +33,7 @@
33
33
  "type": "command",
34
34
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook pre-tool-use",
35
35
  "timeout": 5,
36
- "statusMessage": "(OmO 5.0.0-beta.49) Enforcing Unlimited Ulw-Loop Budget"
36
+ "statusMessage": "(OmO 5.0.0-beta.50) Enforcing Unlimited Ulw-Loop Budget"
37
37
  }
38
38
  ]
39
39
  },
@@ -44,7 +44,7 @@
44
44
  "type": "command",
45
45
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook pre-tool-use-spawn",
46
46
  "timeout": 5,
47
- "statusMessage": "(OmO 5.0.0-beta.49) Guarding Ulw-Loop Spawns"
47
+ "statusMessage": "(OmO 5.0.0-beta.50) Guarding Ulw-Loop Spawns"
48
48
  }
49
49
  ]
50
50
  }
@@ -56,7 +56,7 @@
56
56
  "type": "command",
57
57
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook stop",
58
58
  "timeout": 10,
59
- "statusMessage": "(OmO 5.0.0-beta.49) Checking Ulw-Loop Resume"
59
+ "statusMessage": "(OmO 5.0.0-beta.50) Checking Ulw-Loop Resume"
60
60
  }
61
61
  ]
62
62
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-ulw-loop",
3
- "version": "5.0.0-beta.49",
3
+ "version": "5.0.0-beta.50",
4
4
  "description": "Codex plugin: durable repo-native multi-goal orchestration with embedded success criteria and observable evidence audit.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/git-bash/dist/cli.js\" hook post-compact",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.0.0-beta.49) Resetting Git Bash MCP Reminder",
10
+ "statusMessage": "(OmO 5.0.0-beta.50) Resetting Git Bash MCP Reminder",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\git-bash\\dist\\cli.js\" hook post-compact"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/lsp/dist/cli.js\" hook post-compact",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.0.0-beta.49) Resetting LSP Diagnostics Cache",
10
+ "statusMessage": "(OmO 5.0.0-beta.50) Resetting LSP Diagnostics Cache",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\lsp\\dist\\cli.js\" hook post-compact"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/rules/dist/cli.js\" hook post-compact",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.0.0-beta.49) Resetting Project Rule Cache",
10
+ "statusMessage": "(OmO 5.0.0-beta.50) Resetting Project Rule Cache",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\rules\\dist\\cli.js\" hook post-compact"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/comment-checker/dist/cli.js\" hook post-tool-use",
9
9
  "timeout": 30,
10
- "statusMessage": "(OmO 5.0.0-beta.49) Checking Comments",
10
+ "statusMessage": "(OmO 5.0.0-beta.50) Checking Comments",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\comment-checker\\dist\\cli.js\" hook post-tool-use"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/lsp/dist/cli.js\" hook post-tool-use",
9
9
  "timeout": 60,
10
- "statusMessage": "(OmO 5.0.0-beta.49) Checking LSP Diagnostics",
10
+ "statusMessage": "(OmO 5.0.0-beta.50) Checking LSP Diagnostics",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\lsp\\dist\\cli.js\" hook post-tool-use"
12
12
  }
13
13
  ],
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/components/teammode/dist/cli.js\" hook post-tool-use",
10
10
  "timeout": 10,
11
- "statusMessage": "(OmO 5.0.0-beta.49) Checking Thread Title Hygiene",
11
+ "statusMessage": "(OmO 5.0.0-beta.50) Checking Thread Title Hygiene",
12
12
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\teammode\\dist\\cli.js\" hook post-tool-use"
13
13
  }
14
14
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/rules/dist/cli.js\" hook post-tool-use",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.0.0-beta.49) Matching Project Rules",
10
+ "statusMessage": "(OmO 5.0.0-beta.50) Matching Project Rules",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\rules\\dist\\cli.js\" hook post-tool-use"
12
12
  }
13
13
  ],