oh-my-opencode 4.8.1 → 4.9.1

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 (509) hide show
  1. package/dist/agents/prometheus/system-prompt.d.ts +1 -1
  2. package/dist/agents/sisyphus/claude-fable-5.d.ts +19 -0
  3. package/dist/agents/sisyphus/claude-opus-4-7.d.ts +3 -1
  4. package/dist/agents/sisyphus/claude-opus-4-8.d.ts +19 -0
  5. package/dist/agents/sisyphus/index.d.ts +4 -0
  6. package/dist/agents/types.d.ts +2 -2
  7. package/dist/cli/doctor/checks/codex.d.ts +1 -0
  8. package/dist/cli/doctor/checks/dependencies.d.ts +2 -2
  9. package/dist/cli/doctor/checks/tools-gh.d.ts +8 -1
  10. package/dist/cli/doctor/index.d.ts +1 -0
  11. package/dist/cli/doctor/types.d.ts +2 -0
  12. package/dist/cli/index.js +1908 -787
  13. package/dist/cli/install-codex/codex-config-permissions.d.ts +1 -1
  14. package/dist/cli/install-codex/codex-config-plugins.d.ts +1 -0
  15. package/dist/cli/install-codex/codex-config-toml.d.ts +1 -0
  16. package/dist/cli/install-codex/codex-installer-bin-dir.d.ts +8 -0
  17. package/dist/cli/install-codex/install-codex.d.ts +1 -8
  18. package/dist/cli/install-codex/lsp-daemon-reaper.d.ts +5 -0
  19. package/dist/cli/sparkshell-condense.d.ts +10 -0
  20. package/dist/cli/sparkshell-parse.d.ts +3 -0
  21. package/dist/cli/sparkshell-session-context.d.ts +20 -0
  22. package/dist/cli/sparkshell-spark.d.ts +23 -0
  23. package/dist/cli/sparkshell.d.ts +8 -1
  24. package/dist/cli-node/index.js +92564 -0
  25. package/dist/config/schema/agent-names.d.ts +2 -0
  26. package/dist/config/schema/hooks.d.ts +0 -2
  27. package/dist/config/schema/keyword-detector.d.ts +0 -6
  28. package/dist/config/schema/oh-my-opencode-config.d.ts +2 -4
  29. package/dist/create-hooks.d.ts +0 -2
  30. package/dist/features/background-agent/parent-wake-dedupe.d.ts +2 -0
  31. package/dist/features/background-agent/parent-wake-flush-runner.d.ts +2 -0
  32. package/dist/features/background-agent/parent-wake-prompt-dispatch.d.ts +1 -0
  33. package/dist/features/background-agent/parent-wake-session-history.d.ts +4 -0
  34. package/dist/features/background-agent/parent-wake-session-inspector.d.ts +1 -0
  35. package/dist/features/builtin-commands/templates/handoff.d.ts +1 -1
  36. package/dist/features/builtin-skills/index.d.ts +1 -1
  37. package/dist/features/builtin-skills/skills.d.ts +4 -0
  38. package/dist/features/opencode-runtime-skills/source-server.d.ts +16 -1
  39. package/dist/features/opencode-skill-loader/skill-definition-record.d.ts +2 -0
  40. package/dist/features/team-mode/tools/lifecycle-test-fixture.d.ts +2 -0
  41. package/dist/features/team-mode/types.d.ts +1 -0
  42. package/dist/features/tmux-subagent/failed-readiness-cache.d.ts +28 -0
  43. package/dist/features/tmux-subagent/manager.d.ts +1 -9
  44. package/dist/features/tmux-subagent/resolve-server-url.d.ts +3 -0
  45. package/dist/hooks/anthropic-context-window-limit-recovery/executor.d.ts +1 -1
  46. package/dist/hooks/index.d.ts +0 -1
  47. package/dist/hooks/keyword-detector/constants.d.ts +0 -4
  48. package/dist/hooks/keyword-detector/ultrawork/source-detector.d.ts +1 -1
  49. package/dist/index.js +9001 -1795
  50. package/dist/oh-my-opencode.schema.json +2 -4
  51. package/dist/plugin/chat-params.d.ts +1 -8
  52. package/dist/plugin/hooks/create-core-hooks.d.ts +0 -2
  53. package/dist/plugin/hooks/create-session-hooks.d.ts +0 -2
  54. package/dist/plugin/hooks/create-transform-hooks.d.ts +1 -2
  55. package/dist/plugin/messages-transform.d.ts +0 -1
  56. package/dist/shared/model-availability.d.ts +10 -2
  57. package/dist/shared/module-resolution-failure.d.ts +7 -0
  58. package/package.json +25 -18
  59. package/packages/ast-grep-mcp/dist/cli.js +2 -10
  60. package/packages/git-bash-mcp/dist/cli.js +11 -4
  61. package/packages/lsp-daemon/dist/cli.d.ts +2 -0
  62. package/packages/lsp-daemon/dist/cli.js +3711 -0
  63. package/packages/lsp-daemon/dist/daemon-client.d.ts +19 -0
  64. package/packages/lsp-daemon/dist/daemon-client.js +114 -0
  65. package/packages/lsp-daemon/dist/daemon-server.d.ts +12 -0
  66. package/packages/lsp-daemon/dist/daemon-server.js +106 -0
  67. package/packages/lsp-daemon/dist/ensure-daemon.d.ts +21 -0
  68. package/packages/lsp-daemon/dist/ensure-daemon.js +97 -0
  69. package/packages/lsp-daemon/dist/index.d.ts +5 -0
  70. package/packages/lsp-daemon/dist/index.js +3573 -0
  71. package/packages/lsp-daemon/dist/lock.d.ts +7 -0
  72. package/packages/lsp-daemon/dist/lock.js +61 -0
  73. package/packages/lsp-daemon/dist/package.json +6 -0
  74. package/packages/lsp-daemon/dist/paths.d.ts +11 -0
  75. package/packages/lsp-daemon/dist/paths.js +49 -0
  76. package/packages/lsp-daemon/dist/proxy.d.ts +10 -0
  77. package/packages/lsp-daemon/dist/proxy.js +61 -0
  78. package/packages/lsp-daemon/dist/request-routing.d.ts +9 -0
  79. package/packages/lsp-daemon/dist/request-routing.js +44 -0
  80. package/packages/lsp-daemon/dist/run-daemon.d.ts +1 -0
  81. package/packages/lsp-daemon/dist/run-daemon.js +11 -0
  82. package/packages/lsp-daemon/dist/socket-jsonrpc.d.ts +5 -0
  83. package/packages/lsp-daemon/dist/socket-jsonrpc.js +25 -0
  84. package/packages/lsp-daemon/package.json +38 -0
  85. package/packages/lsp-tools-mcp/dist/cli.js +0 -0
  86. package/packages/lsp-tools-mcp/dist/lsp/client-wrapper.js +40 -17
  87. package/packages/lsp-tools-mcp/dist/lsp/client.js +11 -9
  88. package/packages/lsp-tools-mcp/dist/lsp/config-loader.js +5 -5
  89. package/packages/lsp-tools-mcp/dist/lsp/directory-diagnostics.js +5 -3
  90. package/packages/lsp-tools-mcp/dist/lsp/effective-extension.d.ts +1 -0
  91. package/packages/lsp-tools-mcp/dist/lsp/effective-extension.js +8 -0
  92. package/packages/lsp-tools-mcp/dist/lsp/infer-extension.js +3 -2
  93. package/packages/lsp-tools-mcp/dist/lsp/language-mappings.js +1 -0
  94. package/packages/lsp-tools-mcp/dist/lsp/server-definitions.js +12 -0
  95. package/packages/lsp-tools-mcp/dist/lsp/server-install-state.d.ts +12 -0
  96. package/packages/lsp-tools-mcp/dist/lsp/server-install-state.js +51 -0
  97. package/packages/lsp-tools-mcp/dist/lsp/workspace-edit.js +2 -1
  98. package/packages/lsp-tools-mcp/dist/request-context.d.ts +7 -0
  99. package/packages/lsp-tools-mcp/dist/request-context.js +14 -0
  100. package/packages/lsp-tools-mcp/dist/tools.js +44 -1
  101. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +46 -33
  102. package/packages/omo-codex/plugin/.mcp.json +1 -1
  103. package/packages/omo-codex/plugin/components/comment-checker/dist/apply-patch.d.ts +7 -0
  104. package/packages/omo-codex/plugin/components/comment-checker/dist/apply-patch.js +173 -0
  105. package/packages/omo-codex/plugin/components/comment-checker/dist/cli.d.ts +2 -0
  106. package/packages/omo-codex/plugin/components/comment-checker/dist/cli.js +10 -0
  107. package/packages/omo-codex/plugin/components/comment-checker/dist/codex-hook.d.ts +22 -0
  108. package/packages/omo-codex/plugin/components/comment-checker/dist/codex-hook.js +165 -0
  109. package/packages/omo-codex/plugin/components/comment-checker/dist/core-values.d.ts +1 -0
  110. package/packages/omo-codex/plugin/components/comment-checker/dist/core-values.js +1 -0
  111. package/packages/omo-codex/plugin/components/comment-checker/dist/core.d.ts +5 -0
  112. package/packages/omo-codex/plugin/components/comment-checker/dist/core.js +4 -0
  113. package/packages/omo-codex/plugin/components/comment-checker/dist/hook-input.d.ts +6 -0
  114. package/packages/omo-codex/plugin/components/comment-checker/dist/hook-input.js +10 -0
  115. package/packages/omo-codex/plugin/components/comment-checker/dist/record.d.ts +2 -0
  116. package/packages/omo-codex/plugin/components/comment-checker/dist/record.js +11 -0
  117. package/packages/omo-codex/plugin/components/comment-checker/dist/request-extractor.d.ts +3 -0
  118. package/packages/omo-codex/plugin/components/comment-checker/dist/request-extractor.js +104 -0
  119. package/packages/omo-codex/plugin/components/comment-checker/dist/runner.d.ts +26 -0
  120. package/packages/omo-codex/plugin/components/comment-checker/dist/runner.js +144 -0
  121. package/packages/omo-codex/plugin/components/comment-checker/dist/types.d.ts +43 -0
  122. package/packages/omo-codex/plugin/components/comment-checker/dist/types.js +1 -0
  123. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  124. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  125. package/packages/omo-codex/plugin/components/git-bash/dist/cli.d.ts +2 -0
  126. package/packages/omo-codex/plugin/components/git-bash/dist/cli.js +29 -0
  127. package/packages/omo-codex/plugin/components/git-bash/dist/codex-hook.d.ts +28 -0
  128. package/packages/omo-codex/plugin/components/git-bash/dist/codex-hook.js +137 -0
  129. package/packages/omo-codex/plugin/components/git-bash/dist/index.d.ts +1 -0
  130. package/packages/omo-codex/plugin/components/git-bash/dist/index.js +1 -0
  131. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  132. package/packages/omo-codex/plugin/components/git-bash/package.json +5 -2
  133. package/packages/omo-codex/plugin/components/lsp/.mcp.json +1 -1
  134. package/packages/omo-codex/plugin/components/lsp/dist/cli.d.ts +2 -0
  135. package/packages/omo-codex/plugin/components/lsp/dist/cli.js +42 -0
  136. package/packages/omo-codex/plugin/components/lsp/dist/codex-hook-cli.d.ts +2 -0
  137. package/packages/omo-codex/plugin/components/lsp/dist/codex-hook-cli.js +40 -0
  138. package/packages/omo-codex/plugin/components/lsp/dist/codex-hook.d.ts +16 -0
  139. package/packages/omo-codex/plugin/components/lsp/dist/codex-hook.js +180 -0
  140. package/packages/omo-codex/plugin/components/lsp/dist/lsp-session-state.d.ts +12 -0
  141. package/packages/omo-codex/plugin/components/lsp/dist/lsp-session-state.js +95 -0
  142. package/packages/omo-codex/plugin/components/lsp/dist/mutated-file-paths.d.ts +6 -0
  143. package/packages/omo-codex/plugin/components/lsp/dist/mutated-file-paths.js +79 -0
  144. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  145. package/packages/omo-codex/plugin/components/lsp/package.json +7 -7
  146. package/packages/omo-codex/plugin/components/lsp/scripts/build-lsp-daemon.mjs +68 -0
  147. package/packages/omo-codex/plugin/components/lsp/scripts/build-lsp-tools.mjs +45 -22
  148. package/packages/omo-codex/plugin/components/lsp/src/cli.ts +1 -1
  149. package/packages/omo-codex/plugin/components/lsp/src/codex-hook-cli.ts +1 -1
  150. package/packages/omo-codex/plugin/components/lsp/src/codex-hook.ts +6 -2
  151. package/packages/omo-codex/plugin/components/lsp/src/lsp-session-state.ts +4 -0
  152. package/packages/omo-codex/plugin/components/lsp/test/codex-hook-unavailable.test.ts +68 -0
  153. package/packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts +8 -20
  154. package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus.md +69 -96
  155. package/packages/omo-codex/plugin/components/rules/dist/cli.d.ts +2 -0
  156. package/packages/omo-codex/plugin/components/rules/dist/cli.js +118 -0
  157. package/packages/omo-codex/plugin/components/rules/dist/codex-hook-options.d.ts +5 -0
  158. package/packages/omo-codex/plugin/components/rules/dist/codex-hook-options.js +1 -0
  159. package/packages/omo-codex/plugin/components/rules/dist/codex-hook.d.ts +47 -0
  160. package/packages/omo-codex/plugin/components/rules/dist/codex-hook.js +127 -0
  161. package/packages/omo-codex/plugin/components/rules/dist/config.d.ts +2 -0
  162. package/packages/omo-codex/plugin/components/rules/dist/config.js +100 -0
  163. package/packages/omo-codex/plugin/components/rules/dist/context-pressure.d.ts +2 -0
  164. package/packages/omo-codex/plugin/components/rules/dist/context-pressure.js +26 -0
  165. package/packages/omo-codex/plugin/components/rules/dist/debug-log.d.ts +8 -0
  166. package/packages/omo-codex/plugin/components/rules/dist/debug-log.js +36 -0
  167. package/packages/omo-codex/plugin/components/rules/dist/dynamic-target-fingerprints.d.ts +7 -0
  168. package/packages/omo-codex/plugin/components/rules/dist/dynamic-target-fingerprints.js +65 -0
  169. package/packages/omo-codex/plugin/components/rules/dist/event-budget.d.ts +3 -0
  170. package/packages/omo-codex/plugin/components/rules/dist/event-budget.js +14 -0
  171. package/packages/omo-codex/plugin/components/rules/dist/hook-output.d.ts +2 -0
  172. package/packages/omo-codex/plugin/components/rules/dist/hook-output.js +24 -0
  173. package/packages/omo-codex/plugin/components/rules/dist/path-utils.d.ts +4 -0
  174. package/packages/omo-codex/plugin/components/rules/dist/path-utils.js +24 -0
  175. package/packages/omo-codex/plugin/components/rules/dist/persistent-cache.d.ts +13 -0
  176. package/packages/omo-codex/plugin/components/rules/dist/persistent-cache.js +172 -0
  177. package/packages/omo-codex/plugin/components/rules/dist/post-compact-budget.d.ts +6 -0
  178. package/packages/omo-codex/plugin/components/rules/dist/post-compact-budget.js +74 -0
  179. package/packages/omo-codex/plugin/components/rules/dist/post-compact-claim.d.ts +4 -0
  180. package/packages/omo-codex/plugin/components/rules/dist/post-compact-claim.js +6 -0
  181. package/packages/omo-codex/plugin/components/rules/dist/post-compact-directive.d.ts +1 -0
  182. package/packages/omo-codex/plugin/components/rules/dist/post-compact-directive.js +32 -0
  183. package/packages/omo-codex/plugin/components/rules/dist/post-compact-state.d.ts +13 -0
  184. package/packages/omo-codex/plugin/components/rules/dist/post-compact-state.js +29 -0
  185. package/packages/omo-codex/plugin/components/rules/dist/rules/cache.d.ts +9 -0
  186. package/packages/omo-codex/plugin/components/rules/dist/rules/cache.js +51 -0
  187. package/packages/omo-codex/plugin/components/rules/dist/rules/constants.d.ts +70 -0
  188. package/packages/omo-codex/plugin/components/rules/dist/rules/constants.js +101 -0
  189. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-dynamic-cache.d.ts +5 -0
  190. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-dynamic-cache.js +60 -0
  191. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-dynamic-loader.d.ts +6 -0
  192. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-dynamic-loader.js +61 -0
  193. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-loader.d.ts +7 -0
  194. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-loader.js +60 -0
  195. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-paths.d.ts +11 -0
  196. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-paths.js +75 -0
  197. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-static-loader.d.ts +6 -0
  198. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-static-loader.js +29 -0
  199. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-types.d.ts +44 -0
  200. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-types.js +1 -0
  201. package/packages/omo-codex/plugin/components/rules/dist/rules/engine.d.ts +5 -0
  202. package/packages/omo-codex/plugin/components/rules/dist/rules/engine.js +85 -0
  203. package/packages/omo-codex/plugin/components/rules/dist/rules/errors.d.ts +6 -0
  204. package/packages/omo-codex/plugin/components/rules/dist/rules/errors.js +12 -0
  205. package/packages/omo-codex/plugin/components/rules/dist/rules/finder-cache.d.ts +14 -0
  206. package/packages/omo-codex/plugin/components/rules/dist/rules/finder-cache.js +51 -0
  207. package/packages/omo-codex/plugin/components/rules/dist/rules/finder-paths.d.ts +6 -0
  208. package/packages/omo-codex/plugin/components/rules/dist/rules/finder-paths.js +33 -0
  209. package/packages/omo-codex/plugin/components/rules/dist/rules/finder-sources.d.ts +5 -0
  210. package/packages/omo-codex/plugin/components/rules/dist/rules/finder-sources.js +40 -0
  211. package/packages/omo-codex/plugin/components/rules/dist/rules/finder.d.ts +28 -0
  212. package/packages/omo-codex/plugin/components/rules/dist/rules/finder.js +146 -0
  213. package/packages/omo-codex/plugin/components/rules/dist/rules/formatter.d.ts +7 -0
  214. package/packages/omo-codex/plugin/components/rules/dist/rules/formatter.js +112 -0
  215. package/packages/omo-codex/plugin/components/rules/dist/rules/matcher.d.ts +18 -0
  216. package/packages/omo-codex/plugin/components/rules/dist/rules/matcher.js +93 -0
  217. package/packages/omo-codex/plugin/components/rules/dist/rules/ordering.d.ts +3 -0
  218. package/packages/omo-codex/plugin/components/rules/dist/rules/ordering.js +27 -0
  219. package/packages/omo-codex/plugin/components/rules/dist/rules/parser-frontmatter.d.ts +7 -0
  220. package/packages/omo-codex/plugin/components/rules/dist/rules/parser-frontmatter.js +30 -0
  221. package/packages/omo-codex/plugin/components/rules/dist/rules/parser-yaml.d.ts +2 -0
  222. package/packages/omo-codex/plugin/components/rules/dist/rules/parser-yaml.js +237 -0
  223. package/packages/omo-codex/plugin/components/rules/dist/rules/parser.d.ts +3 -0
  224. package/packages/omo-codex/plugin/components/rules/dist/rules/parser.js +31 -0
  225. package/packages/omo-codex/plugin/components/rules/dist/rules/plugin-root.d.ts +1 -0
  226. package/packages/omo-codex/plugin/components/rules/dist/rules/plugin-root.js +48 -0
  227. package/packages/omo-codex/plugin/components/rules/dist/rules/project-root.d.ts +1 -0
  228. package/packages/omo-codex/plugin/components/rules/dist/rules/project-root.js +23 -0
  229. package/packages/omo-codex/plugin/components/rules/dist/rules/scanner.d.ts +14 -0
  230. package/packages/omo-codex/plugin/components/rules/dist/rules/scanner.js +111 -0
  231. package/packages/omo-codex/plugin/components/rules/dist/rules/sources.d.ts +3 -0
  232. package/packages/omo-codex/plugin/components/rules/dist/rules/sources.js +9 -0
  233. package/packages/omo-codex/plugin/components/rules/dist/rules/truncator.d.ts +18 -0
  234. package/packages/omo-codex/plugin/components/rules/dist/rules/truncator.js +59 -0
  235. package/packages/omo-codex/plugin/components/rules/dist/rules/types.d.ts +126 -0
  236. package/packages/omo-codex/plugin/components/rules/dist/rules/types.js +8 -0
  237. package/packages/omo-codex/plugin/components/rules/dist/rules-engine-factory.d.ts +6 -0
  238. package/packages/omo-codex/plugin/components/rules/dist/rules-engine-factory.js +20 -0
  239. package/packages/omo-codex/plugin/components/rules/dist/session-state-lock.d.ts +3 -0
  240. package/packages/omo-codex/plugin/components/rules/dist/session-state-lock.js +41 -0
  241. package/packages/omo-codex/plugin/components/rules/dist/sparkshell-awareness.d.ts +10 -0
  242. package/packages/omo-codex/plugin/components/rules/dist/sparkshell-awareness.js +90 -0
  243. package/packages/omo-codex/plugin/components/rules/dist/static-injection.d.ts +3 -0
  244. package/packages/omo-codex/plugin/components/rules/dist/static-injection.js +128 -0
  245. package/packages/omo-codex/plugin/components/rules/dist/tool-paths.d.ts +6 -0
  246. package/packages/omo-codex/plugin/components/rules/dist/tool-paths.js +168 -0
  247. package/packages/omo-codex/plugin/components/rules/dist/transcript-rule-filter.d.ts +4 -0
  248. package/packages/omo-codex/plugin/components/rules/dist/transcript-rule-filter.js +49 -0
  249. package/packages/omo-codex/plugin/components/rules/dist/transcript-search.d.ts +4 -0
  250. package/packages/omo-codex/plugin/components/rules/dist/transcript-search.js +91 -0
  251. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  252. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  253. package/packages/omo-codex/plugin/components/rules/src/codex-hook.ts +4 -2
  254. package/packages/omo-codex/plugin/components/rules/src/config.ts +13 -0
  255. package/packages/omo-codex/plugin/components/rules/src/event-budget.ts +17 -0
  256. package/packages/omo-codex/plugin/components/rules/src/persistent-cache.ts +4 -1
  257. package/packages/omo-codex/plugin/components/rules/src/post-compact-directive.ts +39 -0
  258. package/packages/omo-codex/plugin/components/rules/src/rules/constants.ts +16 -0
  259. package/packages/omo-codex/plugin/components/rules/src/rules/engine.ts +8 -0
  260. package/packages/omo-codex/plugin/components/rules/src/rules/types.ts +4 -0
  261. package/packages/omo-codex/plugin/components/rules/src/sparkshell-awareness.ts +53 -4
  262. package/packages/omo-codex/plugin/components/rules/src/static-injection.ts +127 -7
  263. package/packages/omo-codex/plugin/components/rules/src/transcript-rule-filter.ts +9 -1
  264. package/packages/omo-codex/plugin/components/rules/test/bundled-rules.test.ts +4 -2
  265. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-budget.test.ts +7 -2
  266. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-context.test.ts +9 -9
  267. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-dedup.test.ts +10 -4
  268. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-directive.test.ts +241 -0
  269. package/packages/omo-codex/plugin/components/rules/test/event-budget.test.ts +168 -0
  270. package/packages/omo-codex/plugin/components/rules/test/post-compact-budget.test.ts +4 -0
  271. package/packages/omo-codex/plugin/components/rules/test/sparkshell-awareness.test.ts +86 -3
  272. package/packages/omo-codex/plugin/components/start-work-continuation/directive.md +15 -15
  273. package/packages/omo-codex/plugin/components/start-work-continuation/dist/boulder-reader.d.ts +16 -0
  274. package/packages/omo-codex/plugin/components/start-work-continuation/dist/boulder-reader.js +146 -0
  275. package/packages/omo-codex/plugin/components/start-work-continuation/dist/cli.d.ts +2 -0
  276. package/packages/omo-codex/plugin/components/start-work-continuation/dist/cli.js +49 -0
  277. package/packages/omo-codex/plugin/components/start-work-continuation/dist/codex-hook.d.ts +2 -0
  278. package/packages/omo-codex/plugin/components/start-work-continuation/dist/codex-hook.js +80 -0
  279. package/packages/omo-codex/plugin/components/start-work-continuation/dist/directive.d.ts +1 -0
  280. package/packages/omo-codex/plugin/components/start-work-continuation/dist/directive.js +2 -0
  281. package/packages/omo-codex/plugin/components/start-work-continuation/dist/index.d.ts +5 -0
  282. package/packages/omo-codex/plugin/components/start-work-continuation/dist/index.js +3 -0
  283. package/packages/omo-codex/plugin/components/start-work-continuation/dist/types.d.ts +20 -0
  284. package/packages/omo-codex/plugin/components/start-work-continuation/dist/types.js +1 -0
  285. package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +2 -2
  286. package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
  287. package/packages/omo-codex/plugin/components/start-work-continuation/test/codex-hook.test.ts +24 -2
  288. package/packages/omo-codex/plugin/components/telemetry/dist/atomic-write.d.ts +1 -0
  289. package/packages/omo-codex/plugin/components/telemetry/dist/atomic-write.js +18 -0
  290. package/packages/omo-codex/plugin/components/telemetry/dist/cli.d.ts +2 -0
  291. package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +62 -0
  292. package/packages/omo-codex/plugin/components/telemetry/dist/codex-hook.d.ts +15 -0
  293. package/packages/omo-codex/plugin/components/telemetry/dist/codex-hook.js +42 -0
  294. package/packages/omo-codex/plugin/components/telemetry/dist/data-path.d.ts +10 -0
  295. package/packages/omo-codex/plugin/components/telemetry/dist/data-path.js +35 -0
  296. package/packages/omo-codex/plugin/components/telemetry/dist/diagnostics.d.ts +12 -0
  297. package/packages/omo-codex/plugin/components/telemetry/dist/diagnostics.js +108 -0
  298. package/packages/omo-codex/plugin/components/telemetry/dist/env-flags.d.ts +4 -0
  299. package/packages/omo-codex/plugin/components/telemetry/dist/env-flags.js +31 -0
  300. package/packages/omo-codex/plugin/components/telemetry/dist/posthog-activity-state.d.ts +8 -0
  301. package/packages/omo-codex/plugin/components/telemetry/dist/posthog-activity-state.js +68 -0
  302. package/packages/omo-codex/plugin/components/telemetry/dist/posthog.d.ts +21 -0
  303. package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +133 -0
  304. package/packages/omo-codex/plugin/components/telemetry/dist/product-identity.d.ts +8 -0
  305. package/packages/omo-codex/plugin/components/telemetry/dist/product-identity.js +29 -0
  306. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  307. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  308. package/packages/omo-codex/plugin/components/ultrawork/agents/explorer.toml +5 -13
  309. package/packages/omo-codex/plugin/components/ultrawork/agents/librarian.toml +61 -185
  310. package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +1 -1
  311. package/packages/omo-codex/plugin/components/ultrawork/directive.md +122 -117
  312. package/packages/omo-codex/plugin/components/ultrawork/dist/cli.d.ts +2 -0
  313. package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +48 -0
  314. package/packages/omo-codex/plugin/components/ultrawork/dist/codex-hook.d.ts +7 -0
  315. package/packages/omo-codex/plugin/components/ultrawork/dist/codex-hook.js +122 -0
  316. package/packages/omo-codex/plugin/components/ultrawork/dist/directive.d.ts +1 -0
  317. package/packages/omo-codex/plugin/components/ultrawork/dist/directive.js +2 -0
  318. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  319. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  320. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +20 -11
  321. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +17 -11
  322. package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +2 -5
  323. package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +0 -71
  324. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.d.ts +16 -0
  325. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.js +200 -0
  326. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-arg-parser.d.ts +17 -0
  327. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-arg-parser.js +97 -0
  328. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-commands.d.ts +4 -0
  329. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-commands.js +183 -0
  330. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.d.ts +6 -0
  331. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.js +55 -0
  332. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-steering.d.ts +12 -0
  333. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-steering.js +145 -0
  334. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.d.ts +2 -0
  335. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +39 -0
  336. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.d.ts +13 -0
  337. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.js +100 -0
  338. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.d.ts +26 -0
  339. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.js +97 -0
  340. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-hook.d.ts +28 -0
  341. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-hook.js +145 -0
  342. package/packages/omo-codex/plugin/components/ulw-loop/dist/command-types.d.ts +34 -0
  343. package/packages/omo-codex/plugin/components/ulw-loop/dist/command-types.js +1 -0
  344. package/packages/omo-codex/plugin/components/ulw-loop/dist/constants.d.ts +16 -0
  345. package/packages/omo-codex/plugin/components/ulw-loop/dist/constants.js +41 -0
  346. package/packages/omo-codex/plugin/components/ulw-loop/dist/domain-types.d.ts +95 -0
  347. package/packages/omo-codex/plugin/components/ulw-loop/dist/domain-types.js +1 -0
  348. package/packages/omo-codex/plugin/components/ulw-loop/dist/evidence.d.ts +31 -0
  349. package/packages/omo-codex/plugin/components/ulw-loop/dist/evidence.js +119 -0
  350. package/packages/omo-codex/plugin/components/ulw-loop/dist/goal-status.d.ts +12 -0
  351. package/packages/omo-codex/plugin/components/ulw-loop/dist/goal-status.js +69 -0
  352. package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.d.ts +16 -0
  353. package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.js +59 -0
  354. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-crud.d.ts +48 -0
  355. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-crud.js +119 -0
  356. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.d.ts +8 -0
  357. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.js +89 -0
  358. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.d.ts +6 -0
  359. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.js +123 -0
  360. package/packages/omo-codex/plugin/components/ulw-loop/dist/review-blockers.d.ts +16 -0
  361. package/packages/omo-codex/plugin/components/ulw-loop/dist/review-blockers.js +70 -0
  362. package/packages/omo-codex/plugin/components/ulw-loop/dist/runtime.d.ts +10 -0
  363. package/packages/omo-codex/plugin/components/ulw-loop/dist/runtime.js +13 -0
  364. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-types.d.ts +63 -0
  365. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-types.js +1 -0
  366. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering.d.ts +6 -0
  367. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering.js +292 -0
  368. package/packages/omo-codex/plugin/components/ulw-loop/dist/types.d.ts +5 -0
  369. package/packages/omo-codex/plugin/components/ulw-loop/dist/types.js +5 -0
  370. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +2 -2
  371. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  372. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +14 -14
  373. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +24 -25
  374. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-commands.ts +17 -3
  375. package/packages/omo-codex/plugin/components/ulw-loop/src/cli.ts +2 -1
  376. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +1 -1
  377. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-entrypoint.test.ts +95 -0
  378. package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +0 -96
  379. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate.test.ts +23 -0
  380. package/packages/omo-codex/plugin/components/ulw-loop/test/skill-contract.test.ts +46 -0
  381. package/packages/omo-codex/plugin/hooks/hooks.json +16 -16
  382. package/packages/omo-codex/plugin/package-lock.json +10 -9
  383. package/packages/omo-codex/plugin/package.json +27 -26
  384. package/packages/omo-codex/plugin/scripts/auto-update.mjs +64 -15
  385. package/packages/omo-codex/plugin/scripts/build-bundled-mcp-runtimes.mjs +16 -0
  386. package/packages/omo-codex/plugin/scripts/migrate-codex-config/multi-agent-v2-guard.mjs +82 -18
  387. package/packages/omo-codex/plugin/scripts/migrate-codex-config.mjs +2 -2
  388. package/packages/omo-codex/plugin/scripts/sync-skills.mjs +23 -11
  389. package/packages/omo-codex/plugin/scripts/sync-version.mjs +94 -0
  390. package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +9 -9
  391. package/packages/omo-codex/plugin/skills/lcx-contribute-bug-fix/SKILL.md +16 -1
  392. package/packages/omo-codex/plugin/skills/lcx-doctor/SKILL.md +93 -0
  393. package/packages/omo-codex/plugin/skills/lcx-doctor/agents/openai.yaml +11 -0
  394. package/packages/omo-codex/plugin/skills/lcx-report-bug/SKILL.md +17 -13
  395. package/packages/omo-codex/plugin/skills/lsp-setup/SKILL.md +139 -0
  396. package/packages/omo-codex/plugin/skills/lsp-setup/references/bash/README.md +60 -0
  397. package/packages/omo-codex/plugin/skills/lsp-setup/references/c-cpp/README.md +61 -0
  398. package/packages/omo-codex/plugin/skills/lsp-setup/references/csharp/README.md +71 -0
  399. package/packages/omo-codex/plugin/skills/lsp-setup/references/dart/README.md +48 -0
  400. package/packages/omo-codex/plugin/skills/lsp-setup/references/elixir/README.md +51 -0
  401. package/packages/omo-codex/plugin/skills/lsp-setup/references/go/README.md +57 -0
  402. package/packages/omo-codex/plugin/skills/lsp-setup/references/haskell/README.md +57 -0
  403. package/packages/omo-codex/plugin/skills/lsp-setup/references/java/README.md +57 -0
  404. package/packages/omo-codex/plugin/skills/lsp-setup/references/julia/README.md +60 -0
  405. package/packages/omo-codex/plugin/skills/lsp-setup/references/kotlin/README.md +59 -0
  406. package/packages/omo-codex/plugin/skills/lsp-setup/references/lua/README.md +66 -0
  407. package/packages/omo-codex/plugin/skills/lsp-setup/references/php/README.md +62 -0
  408. package/packages/omo-codex/plugin/skills/lsp-setup/references/python/README.md +71 -0
  409. package/packages/omo-codex/plugin/skills/lsp-setup/references/ruby/README.md +53 -0
  410. package/packages/omo-codex/plugin/skills/lsp-setup/references/rust/README.md +59 -0
  411. package/packages/omo-codex/plugin/skills/lsp-setup/references/swift/README.md +51 -0
  412. package/packages/omo-codex/plugin/skills/lsp-setup/references/terraform/README.md +62 -0
  413. package/packages/omo-codex/plugin/skills/lsp-setup/references/typescript/README.md +77 -0
  414. package/packages/omo-codex/plugin/skills/lsp-setup/references/yaml/README.md +70 -0
  415. package/packages/omo-codex/plugin/skills/lsp-setup/references/zig/README.md +49 -0
  416. package/packages/omo-codex/plugin/skills/lsp-setup/scripts/detect-lsp.ts +210 -0
  417. package/packages/omo-codex/plugin/skills/lsp-setup/scripts/lsp-server-table.ts +177 -0
  418. package/packages/omo-codex/plugin/skills/lsp-setup/scripts/tsconfig.json +17 -0
  419. package/packages/omo-codex/plugin/skills/lsp-setup/scripts/verify-lsp.ts +147 -0
  420. package/packages/omo-codex/plugin/skills/refactor/SKILL.md +9 -9
  421. package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +10 -10
  422. package/packages/omo-codex/plugin/skills/review-work/SKILL.md +20 -22
  423. package/packages/omo-codex/plugin/skills/start-work/SKILL.md +38 -61
  424. package/packages/omo-codex/plugin/skills/ultraresearch/SKILL.md +135 -677
  425. package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +14 -14
  426. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +24 -25
  427. package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +20 -11
  428. package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +17 -11
  429. package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +9 -9
  430. package/packages/omo-codex/plugin/test/aggregate-build.test.mjs +2 -1
  431. package/packages/omo-codex/plugin/test/aggregate-mcp.test.mjs +1 -1
  432. package/packages/omo-codex/plugin/test/aggregate-plugin-fixture.mjs +5 -5
  433. package/packages/omo-codex/plugin/test/aggregate-skills.test.mjs +6 -6
  434. package/packages/omo-codex/plugin/test/auto-update-restart-notice.test.mjs +194 -0
  435. package/packages/omo-codex/plugin/test/auto-update.test.mjs +17 -0
  436. package/packages/omo-codex/plugin/test/lcx-bug-skills.test.mjs +15 -44
  437. package/packages/omo-codex/plugin/test/lsp-prebuild-layouts.test.mjs +140 -0
  438. package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +189 -7
  439. package/packages/omo-codex/plugin/test/start-work-skill.test.mjs +9 -31
  440. package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +68 -4
  441. package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +119 -0
  442. package/packages/omo-codex/plugin/test/sync-skills.test.mjs +11 -112
  443. package/packages/omo-codex/plugin/test/sync-version.test.mjs +68 -0
  444. package/packages/omo-codex/plugin/test/ultraresearch-skill-contract.test.mjs +126 -0
  445. package/packages/omo-codex/plugin/test/ulw-plan-skill.test.mjs +2 -2
  446. package/packages/omo-codex/scripts/install/bin-dir.mjs +20 -0
  447. package/packages/omo-codex/scripts/install/bin-links.mjs +43 -6
  448. package/packages/omo-codex/scripts/install/cache.mjs +4 -0
  449. package/packages/omo-codex/scripts/install/config.mjs +4 -4
  450. package/packages/omo-codex/scripts/install/delegated-command.mjs +5 -1
  451. package/packages/omo-codex/scripts/install/git-bash-mcp-env.mjs +28 -0
  452. package/packages/omo-codex/scripts/install/git-bash.mjs +12 -4
  453. package/packages/omo-codex/scripts/install/git-bash.test.mjs +39 -4
  454. package/packages/omo-codex/scripts/install/hook-targets.mjs +46 -0
  455. package/packages/omo-codex/scripts/install/multi-agent-v2-config.mjs +12 -2
  456. package/packages/omo-codex/scripts/install/process.mjs +1 -0
  457. package/packages/omo-codex/scripts/install-bin-links.test.mjs +131 -3
  458. package/packages/omo-codex/scripts/install-config-git-bash.test.mjs +91 -0
  459. package/packages/omo-codex/scripts/install-config.test.mjs +50 -44
  460. package/packages/omo-codex/scripts/install-delegated-command.test.mjs +78 -0
  461. package/packages/omo-codex/scripts/install-git-bash-mcp-env.test.mjs +93 -0
  462. package/packages/omo-codex/scripts/install-hook-targets.test.mjs +100 -0
  463. package/packages/omo-codex/scripts/install-lazycodex-version-stamp.test.mjs +3 -1
  464. package/packages/omo-codex/scripts/install-local.mjs +7 -18
  465. package/packages/omo-codex/scripts/install-local.test.mjs +34 -1
  466. package/packages/shared-skills/skills/lcx-contribute-bug-fix/SKILL.md +16 -1
  467. package/packages/shared-skills/skills/lcx-doctor/SKILL.md +93 -0
  468. package/packages/shared-skills/skills/lcx-doctor/agents/openai.yaml +11 -0
  469. package/packages/shared-skills/skills/lcx-report-bug/SKILL.md +17 -13
  470. package/packages/shared-skills/skills/lsp-setup/SKILL.md +139 -0
  471. package/packages/shared-skills/skills/lsp-setup/references/bash/README.md +60 -0
  472. package/packages/shared-skills/skills/lsp-setup/references/c-cpp/README.md +61 -0
  473. package/packages/shared-skills/skills/lsp-setup/references/csharp/README.md +71 -0
  474. package/packages/shared-skills/skills/lsp-setup/references/dart/README.md +48 -0
  475. package/packages/shared-skills/skills/lsp-setup/references/elixir/README.md +51 -0
  476. package/packages/shared-skills/skills/lsp-setup/references/go/README.md +57 -0
  477. package/packages/shared-skills/skills/lsp-setup/references/haskell/README.md +57 -0
  478. package/packages/shared-skills/skills/lsp-setup/references/java/README.md +57 -0
  479. package/packages/shared-skills/skills/lsp-setup/references/julia/README.md +60 -0
  480. package/packages/shared-skills/skills/lsp-setup/references/kotlin/README.md +59 -0
  481. package/packages/shared-skills/skills/lsp-setup/references/lua/README.md +66 -0
  482. package/packages/shared-skills/skills/lsp-setup/references/php/README.md +62 -0
  483. package/packages/shared-skills/skills/lsp-setup/references/python/README.md +71 -0
  484. package/packages/shared-skills/skills/lsp-setup/references/ruby/README.md +53 -0
  485. package/packages/shared-skills/skills/lsp-setup/references/rust/README.md +59 -0
  486. package/packages/shared-skills/skills/lsp-setup/references/swift/README.md +51 -0
  487. package/packages/shared-skills/skills/lsp-setup/references/terraform/README.md +62 -0
  488. package/packages/shared-skills/skills/lsp-setup/references/typescript/README.md +77 -0
  489. package/packages/shared-skills/skills/lsp-setup/references/yaml/README.md +70 -0
  490. package/packages/shared-skills/skills/lsp-setup/references/zig/README.md +49 -0
  491. package/packages/shared-skills/skills/lsp-setup/scripts/detect-lsp.ts +210 -0
  492. package/packages/shared-skills/skills/lsp-setup/scripts/lsp-server-table.ts +177 -0
  493. package/packages/shared-skills/skills/lsp-setup/scripts/tsconfig.json +17 -0
  494. package/packages/shared-skills/skills/lsp-setup/scripts/verify-lsp.ts +147 -0
  495. package/packages/shared-skills/skills/remove-ai-slops/SKILL.md +1 -1
  496. package/packages/shared-skills/skills/review-work/SKILL.md +10 -14
  497. package/packages/shared-skills/skills/start-work/SKILL.md +30 -59
  498. package/packages/shared-skills/skills/ultraresearch/SKILL.md +126 -667
  499. package/dist/hooks/anthropic-effort/hook.d.ts +0 -26
  500. package/dist/hooks/anthropic-effort/index.d.ts +0 -1
  501. package/dist/hooks/keyword-detector/analyze/default.d.ts +0 -12
  502. package/dist/hooks/keyword-detector/analyze/index.d.ts +0 -1
  503. package/dist/hooks/keyword-detector/search/default.d.ts +0 -12
  504. package/dist/hooks/keyword-detector/search/index.d.ts +0 -1
  505. package/dist/hooks/thinking-block-validator/hook.d.ts +0 -12
  506. package/dist/hooks/thinking-block-validator/index.d.ts +0 -1
  507. package/packages/omo-codex/plugin/components/ultrawork/test/directive-contract.test.ts +0 -18
  508. package/packages/omo-codex/plugin/test/global-review-debug-gate.test.mjs +0 -29
  509. package/packages/omo-codex/plugin/test/subagent-guidance.test.mjs +0 -151
@@ -0,0 +1,13 @@
1
+ export type PostCompactPendingKind = "static" | "dynamic";
2
+ export interface PostCompactPendingState {
3
+ static?: boolean;
4
+ dynamic?: boolean;
5
+ }
6
+ export interface PostCompactStateFields {
7
+ readonly postCompactPending?: PostCompactPendingState;
8
+ readonly postCompactRecovering?: PostCompactPendingState;
9
+ readonly compacted?: boolean;
10
+ }
11
+ export declare function postCompactKindState(kinds: ReadonlySet<PostCompactPendingKind>): PostCompactPendingState | undefined;
12
+ export declare function postCompactPendingKinds(state: PostCompactStateFields): Set<PostCompactPendingKind>;
13
+ export declare function postCompactRecoveringKinds(state: PostCompactStateFields): Set<PostCompactPendingKind>;
@@ -0,0 +1,29 @@
1
+ export function postCompactKindState(kinds) {
2
+ if (kinds.size === 0) {
3
+ return undefined;
4
+ }
5
+ return {
6
+ ...(kinds.has("static") ? { static: true } : {}),
7
+ ...(kinds.has("dynamic") ? { dynamic: true } : {}),
8
+ };
9
+ }
10
+ export function postCompactPendingKinds(state) {
11
+ const pendingKinds = new Set();
12
+ if (state.compacted === true || state.postCompactPending?.static === true) {
13
+ pendingKinds.add("static");
14
+ }
15
+ if (state.compacted === true || state.postCompactPending?.dynamic === true) {
16
+ pendingKinds.add("dynamic");
17
+ }
18
+ return pendingKinds;
19
+ }
20
+ export function postCompactRecoveringKinds(state) {
21
+ const recoveringKinds = new Set();
22
+ if (state.postCompactRecovering?.static === true) {
23
+ recoveringKinds.add("static");
24
+ }
25
+ if (state.postCompactRecovering?.dynamic === true) {
26
+ recoveringKinds.add("dynamic");
27
+ }
28
+ return recoveringKinds;
29
+ }
@@ -0,0 +1,9 @@
1
+ import type { LoadedRule, SessionState } from "./types.js";
2
+ export declare function createSessionState(cwd?: string): SessionState;
3
+ export declare function staticDedupKey(cwd: string, rulePath: string, contentHash: string): string;
4
+ export declare function dynamicDedupKey(rulePath: string, contentHash: string): string;
5
+ export declare function markStaticInjected(state: SessionState, rule: LoadedRule): boolean;
6
+ export declare function markDynamicInjected(state: SessionState, rule: LoadedRule): boolean;
7
+ export declare function isStaticInjected(state: SessionState, rule: LoadedRule): boolean;
8
+ export declare function isDynamicInjected(state: SessionState, rule: LoadedRule): boolean;
9
+ export declare function clearSession(state: SessionState): void;
@@ -0,0 +1,51 @@
1
+ const DYNAMIC_SESSION_KEY = "__pi-rules-session__";
2
+ export function createSessionState(cwd) {
3
+ return {
4
+ cwd,
5
+ staticDedup: new Set(),
6
+ dynamicDedup: new Map(),
7
+ dynamicTargetFingerprints: new Map(),
8
+ loadedRules: [],
9
+ diagnostics: [],
10
+ };
11
+ }
12
+ export function staticDedupKey(cwd, rulePath, contentHash) {
13
+ return `${cwd}::${rulePath}::${contentHash}`;
14
+ }
15
+ export function dynamicDedupKey(rulePath, contentHash) {
16
+ return `${rulePath}::${contentHash}`;
17
+ }
18
+ export function markStaticInjected(state, rule) {
19
+ const key = staticDedupKey(state.cwd ?? "", rule.realPath, rule.contentHash);
20
+ if (state.staticDedup.has(key)) {
21
+ return false;
22
+ }
23
+ state.staticDedup.add(key);
24
+ return true;
25
+ }
26
+ export function markDynamicInjected(state, rule) {
27
+ let keys = state.dynamicDedup.get(DYNAMIC_SESSION_KEY);
28
+ if (keys === undefined) {
29
+ keys = new Set();
30
+ state.dynamicDedup.set(DYNAMIC_SESSION_KEY, keys);
31
+ }
32
+ const key = dynamicDedupKey(rule.realPath, rule.contentHash);
33
+ if (keys.has(key)) {
34
+ return false;
35
+ }
36
+ keys.add(key);
37
+ return true;
38
+ }
39
+ export function isStaticInjected(state, rule) {
40
+ return state.staticDedup.has(staticDedupKey(state.cwd ?? "", rule.realPath, rule.contentHash));
41
+ }
42
+ export function isDynamicInjected(state, rule) {
43
+ return state.dynamicDedup.get(DYNAMIC_SESSION_KEY)?.has(dynamicDedupKey(rule.realPath, rule.contentHash)) === true;
44
+ }
45
+ export function clearSession(state) {
46
+ state.staticDedup.clear();
47
+ state.dynamicDedup.clear();
48
+ state.dynamicTargetFingerprints.clear();
49
+ state.loadedRules.length = 0;
50
+ state.diagnostics.length = 0;
51
+ }
@@ -0,0 +1,70 @@
1
+ import type { RuleSource } from "./types.js";
2
+ /**
3
+ * Project root marker files / directories used by `findProjectRoot`.
4
+ * Walks UP from cwd until any of these is found in the directory.
5
+ */
6
+ export declare const PROJECT_MARKERS: readonly string[];
7
+ /**
8
+ * Project rule subdirectories. First tuple element is the parent dir under
9
+ * the project root, second is the subdir scanned recursively.
10
+ */
11
+ export declare const PROJECT_RULE_SUBDIRS: ReadonlyArray<readonly [string, string]>;
12
+ /**
13
+ * Single-file project rules (always apply, frontmatter optional).
14
+ */
15
+ export declare const PROJECT_SINGLE_FILES: readonly string[];
16
+ /**
17
+ * User-home rule directories.
18
+ */
19
+ export declare const USER_HOME_RULE_SUBDIRS: readonly string[];
20
+ /**
21
+ * User-home single-file rules. The first one to exist wins per "first-match" semantics.
22
+ */
23
+ export declare const USER_HOME_SINGLE_FILES: readonly string[];
24
+ /**
25
+ * Bundled plugin rule directory relative to the rules component root.
26
+ */
27
+ export declare const BUNDLED_RULE_SUBDIR = "bundled-rules";
28
+ /**
29
+ * File extensions accepted as rule files in scanned directories.
30
+ */
31
+ export declare const RULE_FILE_EXTENSIONS: readonly string[];
32
+ /**
33
+ * Per-rule source priority for deterministic ordering. Lower = earlier.
34
+ */
35
+ export declare const SOURCE_PRIORITY: ReadonlyMap<RuleSource, number>;
36
+ /**
37
+ * Distance value assigned to global / user-home rules.
38
+ */
39
+ export declare const GLOBAL_DISTANCE = 9999;
40
+ /**
41
+ * Per-rule body character cap (default).
42
+ */
43
+ export declare const DEFAULT_MAX_RULE_CHARS = 12000;
44
+ export declare const DEFAULT_MAX_SCAN_FILES = 1000;
45
+ /**
46
+ * Total injected chars per tool result (default).
47
+ */
48
+ export declare const DEFAULT_MAX_RESULT_CHARS = 40000;
49
+ export declare const DEFAULT_POST_COMPACT_MAX_RULE_CHARS = 3500;
50
+ export declare const DEFAULT_POST_COMPACT_MAX_RESULT_CHARS = 4000;
51
+ /**
52
+ * Per-rule / total caps for dynamic (PostToolUse) injection. Kept far below the
53
+ * static defaults so mid-session rule matches stay lightweight.
54
+ */
55
+ export declare const DEFAULT_DYNAMIC_MAX_RULE_CHARS = 4000;
56
+ export declare const DEFAULT_DYNAMIC_MAX_RESULT_CHARS = 10000;
57
+ /**
58
+ * Per-rule / total caps for UserPromptSubmit static injection. SessionStart
59
+ * keeps the full budget; prompt-time stragglers inject at a reduced size.
60
+ */
61
+ export declare const DEFAULT_PROMPT_MAX_RULE_CHARS = 6000;
62
+ export declare const DEFAULT_PROMPT_MAX_RESULT_CHARS = 16000;
63
+ /**
64
+ * Truncation marker template. `{path}` is replaced with the relative path.
65
+ */
66
+ export declare const TRUNCATION_NOTICE = "\n\n[Truncated. Full: {path}]";
67
+ /**
68
+ * Directories excluded by the recursive scanner regardless of glob settings.
69
+ */
70
+ export declare const SCANNER_EXCLUDED_DIRS: readonly string[];
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Project root marker files / directories used by `findProjectRoot`.
3
+ * Walks UP from cwd until any of these is found in the directory.
4
+ */
5
+ export const PROJECT_MARKERS = [
6
+ ".git",
7
+ "pnpm-workspace.yaml",
8
+ "package.json",
9
+ "pyproject.toml",
10
+ "Cargo.toml",
11
+ "go.mod",
12
+ ".venv",
13
+ ];
14
+ /**
15
+ * Project rule subdirectories. First tuple element is the parent dir under
16
+ * the project root, second is the subdir scanned recursively.
17
+ */
18
+ export const PROJECT_RULE_SUBDIRS = [
19
+ [".omo", "rules"],
20
+ [".claude", "rules"],
21
+ [".cursor", "rules"],
22
+ [".github", "instructions"],
23
+ ];
24
+ /**
25
+ * Single-file project rules (always apply, frontmatter optional).
26
+ */
27
+ export const PROJECT_SINGLE_FILES = [".github/copilot-instructions.md", "CONTEXT.md"];
28
+ /**
29
+ * User-home rule directories.
30
+ */
31
+ export const USER_HOME_RULE_SUBDIRS = [".omo/rules", ".opencode/rules", ".claude/rules"];
32
+ /**
33
+ * User-home single-file rules. The first one to exist wins per "first-match" semantics.
34
+ */
35
+ export const USER_HOME_SINGLE_FILES = [];
36
+ /**
37
+ * Bundled plugin rule directory relative to the rules component root.
38
+ */
39
+ export const BUNDLED_RULE_SUBDIR = "bundled-rules";
40
+ /**
41
+ * File extensions accepted as rule files in scanned directories.
42
+ */
43
+ export const RULE_FILE_EXTENSIONS = [".md", ".mdc"];
44
+ /**
45
+ * Per-rule source priority for deterministic ordering. Lower = earlier.
46
+ */
47
+ export const SOURCE_PRIORITY = new Map([
48
+ [".omo/rules", 0],
49
+ [".claude/rules", 1],
50
+ [".cursor/rules", 2],
51
+ [".github/instructions", 3],
52
+ [".github/copilot-instructions.md", 4],
53
+ ["CONTEXT.md", 7],
54
+ ["~/.omo/rules", 100],
55
+ ["~/.opencode/rules", 101],
56
+ ["~/.claude/rules", 102],
57
+ ["plugin-bundled", 200],
58
+ ]);
59
+ /**
60
+ * Distance value assigned to global / user-home rules.
61
+ */
62
+ export const GLOBAL_DISTANCE = 9999;
63
+ /**
64
+ * Per-rule body character cap (default).
65
+ */
66
+ export const DEFAULT_MAX_RULE_CHARS = 12000;
67
+ export const DEFAULT_MAX_SCAN_FILES = 1000;
68
+ /**
69
+ * Total injected chars per tool result (default).
70
+ */
71
+ export const DEFAULT_MAX_RESULT_CHARS = 40000;
72
+ export const DEFAULT_POST_COMPACT_MAX_RULE_CHARS = 3500;
73
+ export const DEFAULT_POST_COMPACT_MAX_RESULT_CHARS = 4000;
74
+ /**
75
+ * Per-rule / total caps for dynamic (PostToolUse) injection. Kept far below the
76
+ * static defaults so mid-session rule matches stay lightweight.
77
+ */
78
+ export const DEFAULT_DYNAMIC_MAX_RULE_CHARS = 4000;
79
+ export const DEFAULT_DYNAMIC_MAX_RESULT_CHARS = 10000;
80
+ /**
81
+ * Per-rule / total caps for UserPromptSubmit static injection. SessionStart
82
+ * keeps the full budget; prompt-time stragglers inject at a reduced size.
83
+ */
84
+ export const DEFAULT_PROMPT_MAX_RULE_CHARS = 6000;
85
+ export const DEFAULT_PROMPT_MAX_RESULT_CHARS = 16000;
86
+ /**
87
+ * Truncation marker template. `{path}` is replaced with the relative path.
88
+ */
89
+ export const TRUNCATION_NOTICE = "\n\n[Truncated. Full: {path}]";
90
+ /**
91
+ * Directories excluded by the recursive scanner regardless of glob settings.
92
+ */
93
+ export const SCANNER_EXCLUDED_DIRS = [
94
+ "node_modules",
95
+ ".git",
96
+ "dist",
97
+ "build",
98
+ ".turbo",
99
+ ".next",
100
+ "coverage",
101
+ ];
@@ -0,0 +1,5 @@
1
+ import type { CandidateDiscoveryCache, DynamicMatchCache, EngineDeps } from "./engine-types.js";
2
+ import type { matchRule } from "./matcher.js";
3
+ import type { LoadedRule, MatchReason, RuleCandidate } from "./types.js";
4
+ export declare function matchDynamicRuleCached(cache: DynamicMatchCache, projectRoot: string | null, targetFile: string, candidate: RuleCandidate, loadedRule: LoadedRule, matchRuleImpl: typeof matchRule): MatchReason | null;
5
+ export declare function findSortedCandidatesCached(cache: CandidateDiscoveryCache, findCandidates: EngineDeps["findCandidates"], options: Parameters<EngineDeps["findCandidates"]>[0]): RuleCandidate[];
@@ -0,0 +1,60 @@
1
+ import { dirname, resolve } from "node:path";
2
+ import { pathBasesForTarget, toPosixPath } from "./engine-paths.js";
3
+ import { sortCandidates } from "./ordering.js";
4
+ const MAX_DYNAMIC_MATCH_CACHE_ENTRIES = 4096;
5
+ export function matchDynamicRuleCached(cache, projectRoot, targetFile, candidate, loadedRule, matchRuleImpl) {
6
+ const cacheKey = dynamicMatchCacheKey(projectRoot, targetFile, candidate, loadedRule.contentHash);
7
+ if (cache.has(cacheKey)) {
8
+ const cachedReason = cache.get(cacheKey) ?? null;
9
+ cache.delete(cacheKey);
10
+ cache.set(cacheKey, cachedReason);
11
+ return cachedReason;
12
+ }
13
+ const matchResult = matchRuleImpl({
14
+ frontmatter: loadedRule.frontmatter,
15
+ isSingleFile: candidate.isSingleFile,
16
+ pathBases: pathBasesForTarget(projectRoot, targetFile, candidate),
17
+ });
18
+ const reason = matchResult.matched ? matchResult.reason : null;
19
+ setDynamicMatchCacheEntry(cache, cacheKey, reason);
20
+ return reason;
21
+ }
22
+ export function findSortedCandidatesCached(cache, findCandidates, options) {
23
+ const cacheKey = candidateDiscoveryCacheKey(options);
24
+ const cached = cache.get(cacheKey);
25
+ if (cached !== undefined) {
26
+ return cached;
27
+ }
28
+ const candidates = sortCandidates(findCandidates(options));
29
+ cache.set(cacheKey, candidates);
30
+ return candidates;
31
+ }
32
+ function setDynamicMatchCacheEntry(cache, cacheKey, reason) {
33
+ if (cache.size >= MAX_DYNAMIC_MATCH_CACHE_ENTRIES) {
34
+ const oldestCacheKey = cache.keys().next().value;
35
+ if (oldestCacheKey !== undefined) {
36
+ cache.delete(oldestCacheKey);
37
+ }
38
+ }
39
+ cache.set(cacheKey, reason);
40
+ }
41
+ function dynamicMatchCacheKey(projectRoot, targetFile, candidate, contentHash) {
42
+ return [
43
+ projectRoot ?? "",
44
+ toPosixPath(resolve(targetFile)),
45
+ candidate.realPath,
46
+ candidate.relativePath,
47
+ candidate.source,
48
+ candidate.isGlobal ? "global" : "project",
49
+ candidate.isSingleFile ? "single" : "multi",
50
+ String(candidate.distance),
51
+ contentHash,
52
+ ].join("\0");
53
+ }
54
+ function candidateDiscoveryCacheKey(options) {
55
+ return [
56
+ options.projectRoot ?? "",
57
+ options.targetFile === null ? "" : dirname(resolve(options.targetFile)),
58
+ ...[...(options.disabledSources ?? [])].sort(),
59
+ ].join("\0");
60
+ }
@@ -0,0 +1,6 @@
1
+ import type { DynamicMatchCache, EngineDeps } from "./engine-types.js";
2
+ import type { LoadedRule, PiRulesConfig, RuleDiagnostic } from "./types.js";
3
+ export declare function loadDynamicCandidates(config: PiRulesConfig, deps: EngineDeps, cwd: string, targetPaths: ReadonlyArray<string>, dynamicMatchCache: DynamicMatchCache): {
4
+ rules: LoadedRule[];
5
+ diagnostics: RuleDiagnostic[];
6
+ };
@@ -0,0 +1,61 @@
1
+ import { findSortedCandidatesCached, matchDynamicRuleCached } from "./engine-dynamic-cache.js";
2
+ import { loadCandidate, ruleDedupKey } from "./engine-loader.js";
3
+ import { isSameOrChildPath } from "./engine-paths.js";
4
+ import { createRuleDiscoveryCache } from "./finder.js";
5
+ import { matchRule } from "./matcher.js";
6
+ import { sortCandidates } from "./ordering.js";
7
+ import { disabledSourcesFromConfig } from "./sources.js";
8
+ export function loadDynamicCandidates(config, deps, cwd, targetPaths, dynamicMatchCache) {
9
+ const rules = [];
10
+ const diagnostics = [];
11
+ const seenRules = new Set();
12
+ const loadedRuleContent = new Map();
13
+ const projectMembership = new Map();
14
+ const disabledSources = disabledSourcesFromConfig(config);
15
+ const discoveryCache = createRuleDiscoveryCache();
16
+ const candidateDiscoveryCache = new Map();
17
+ const cwdProjectRoot = deps.findProjectRoot(cwd);
18
+ for (const targetFile of uniqueStrings(targetPaths)) {
19
+ const projectRoot = cwdProjectRoot !== null && isSameOrChildPath(targetFile, cwdProjectRoot)
20
+ ? cwdProjectRoot
21
+ : deps.findProjectRoot(targetFile);
22
+ const findOptions = {
23
+ projectRoot,
24
+ targetFile,
25
+ cache: discoveryCache,
26
+ };
27
+ if (disabledSources !== undefined) {
28
+ findOptions.disabledSources = disabledSources;
29
+ }
30
+ const candidates = findSortedCandidatesCached(candidateDiscoveryCache, deps.findCandidates, findOptions);
31
+ for (const candidate of candidates) {
32
+ const loadedRule = loadCandidate(candidate, deps, diagnostics, projectRoot, loadedRuleContent, projectMembership);
33
+ if (loadedRule === null) {
34
+ continue;
35
+ }
36
+ const matchReason = matchDynamicRuleCached(dynamicMatchCache, projectRoot, targetFile, candidate, loadedRule, deps.matchRule ?? matchRule);
37
+ if (matchReason === null) {
38
+ continue;
39
+ }
40
+ const dedupKey = ruleDedupKey(loadedRule);
41
+ if (seenRules.has(dedupKey)) {
42
+ continue;
43
+ }
44
+ seenRules.add(dedupKey);
45
+ rules.push({ ...loadedRule, matchReason });
46
+ }
47
+ }
48
+ return { rules: sortCandidates(rules), diagnostics };
49
+ }
50
+ function uniqueStrings(values) {
51
+ const uniqueValues = [];
52
+ const seenValues = new Set();
53
+ for (const value of values) {
54
+ if (seenValues.has(value)) {
55
+ continue;
56
+ }
57
+ seenValues.add(value);
58
+ uniqueValues.push(value);
59
+ }
60
+ return uniqueValues;
61
+ }
@@ -0,0 +1,7 @@
1
+ import type { CandidateProjectMembership, EngineDeps, LoadedRuleContent } from "./engine-types.js";
2
+ import type { LoadedRule, MatchReason, RuleCandidate, RuleDiagnostic } from "./types.js";
3
+ export declare function loadCandidate(candidate: RuleCandidate, deps: EngineDeps, diagnostics: RuleDiagnostic[], projectRoot: string | null, loadedRuleContent?: Map<string, LoadedRuleContent | null>, projectMembership?: CandidateProjectMembership): (LoadedRule & {
4
+ matchReason: MatchReason;
5
+ }) | null;
6
+ export declare function ruleDedupKey(rule: LoadedRule): string;
7
+ export declare function staticMatchReason(rule: LoadedRule): MatchReason | null;
@@ -0,0 +1,60 @@
1
+ import { isCandidateWithinProjectCached } from "./engine-paths.js";
2
+ import { hashContent } from "./matcher.js";
3
+ import { parseRule } from "./parser.js";
4
+ export function loadCandidate(candidate, deps, diagnostics, projectRoot, loadedRuleContent, projectMembership) {
5
+ if (!isCandidateWithinProjectCached(candidate, projectRoot, projectMembership)) {
6
+ diagnostics.push({
7
+ severity: "warning",
8
+ source: candidate.path,
9
+ message: "Rule file resolves outside project root",
10
+ });
11
+ return null;
12
+ }
13
+ const cachedContent = loadedRuleContent?.get(candidate.realPath);
14
+ if (cachedContent !== undefined) {
15
+ return loadedRuleFromContent(candidate, cachedContent, diagnostics);
16
+ }
17
+ const content = deps.readFile(candidate.path);
18
+ if (content === null) {
19
+ loadedRuleContent?.set(candidate.realPath, null);
20
+ diagnostics.push({ severity: "warning", source: candidate.path, message: "Unable to read rule file" });
21
+ return null;
22
+ }
23
+ const parsed = parseRule(content);
24
+ const loadedContent = {
25
+ frontmatter: parsed.frontmatter,
26
+ body: parsed.body,
27
+ contentHash: hashContent(content),
28
+ ...(parsed.diagnostic === undefined ? {} : { diagnostic: parsed.diagnostic }),
29
+ };
30
+ loadedRuleContent?.set(candidate.realPath, loadedContent);
31
+ return loadedRuleFromContent(candidate, loadedContent, diagnostics);
32
+ }
33
+ export function ruleDedupKey(rule) {
34
+ return `${rule.realPath}::${rule.contentHash}`;
35
+ }
36
+ export function staticMatchReason(rule) {
37
+ if (rule.frontmatter.alwaysApply === true) {
38
+ return "alwaysApply";
39
+ }
40
+ if (rule.isSingleFile) {
41
+ return "single-file";
42
+ }
43
+ return null;
44
+ }
45
+ function loadedRuleFromContent(candidate, content, diagnostics) {
46
+ if (content === null) {
47
+ diagnostics.push({ severity: "warning", source: candidate.path, message: "Unable to read rule file" });
48
+ return null;
49
+ }
50
+ if (content.diagnostic !== undefined) {
51
+ diagnostics.push({ severity: "warning", source: candidate.path, message: content.diagnostic });
52
+ }
53
+ return {
54
+ ...candidate,
55
+ frontmatter: content.frontmatter,
56
+ body: content.body,
57
+ contentHash: content.contentHash,
58
+ matchReason: { kind: "no-match" },
59
+ };
60
+ }
@@ -0,0 +1,11 @@
1
+ import type { CandidateProjectMembership } from "./engine-types.js";
2
+ import type { RuleCandidate } from "./types.js";
3
+ export declare function isCandidateWithinProjectCached(candidate: RuleCandidate, projectRoot: string | null, projectMembership: CandidateProjectMembership | undefined): boolean;
4
+ export declare function isSameOrChildPath(childPath: string, parentPath: string): boolean;
5
+ export declare function isRootSingleFile(candidate: RuleCandidate): boolean;
6
+ export declare function pathBasesForTarget(projectRoot: string | null, targetFile: string, candidate: RuleCandidate): {
7
+ projectRelative: string;
8
+ scopeRelative?: string;
9
+ basename: string;
10
+ };
11
+ export declare function toPosixPath(path: string): string;
@@ -0,0 +1,75 @@
1
+ import { realpathSync } from "node:fs";
2
+ import { basename, dirname, isAbsolute, join, relative, resolve } from "node:path";
3
+ import { PROJECT_SINGLE_FILES } from "./constants.js";
4
+ const ROOT_SINGLE_FILE_SOURCES = new Set(PROJECT_SINGLE_FILES.filter((source) => !source.includes("/")));
5
+ export function isCandidateWithinProjectCached(candidate, projectRoot, projectMembership) {
6
+ if (projectMembership === undefined) {
7
+ return isCandidateWithinProject(candidate, projectRoot);
8
+ }
9
+ const cacheKey = `${projectRoot ?? ""}\0${candidate.realPath}`;
10
+ const cached = projectMembership.get(cacheKey);
11
+ if (cached !== undefined) {
12
+ return cached;
13
+ }
14
+ const isWithinProject = isCandidateWithinProject(candidate, projectRoot);
15
+ projectMembership.set(cacheKey, isWithinProject);
16
+ return isWithinProject;
17
+ }
18
+ export function isSameOrChildPath(childPath, parentPath) {
19
+ const childRelativePath = relative(parentPath, resolve(childPath));
20
+ return childRelativePath === "" || (!childRelativePath.startsWith("..") && !isAbsolute(childRelativePath));
21
+ }
22
+ export function isRootSingleFile(candidate) {
23
+ return candidate.distance === 0 && candidate.isSingleFile && ROOT_SINGLE_FILE_SOURCES.has(candidate.source);
24
+ }
25
+ export function pathBasesForTarget(projectRoot, targetFile, candidate) {
26
+ const targetBasename = basename(targetFile);
27
+ if (projectRoot === null) {
28
+ return { projectRelative: targetBasename, basename: targetBasename };
29
+ }
30
+ const projectRelative = toPosixPath(relative(projectRoot, targetFile));
31
+ const scopeDirectory = scopeDirectoryForCandidate(projectRoot, candidate);
32
+ if (scopeDirectory === null) {
33
+ return { projectRelative, basename: targetBasename };
34
+ }
35
+ return {
36
+ projectRelative,
37
+ scopeRelative: toPosixPath(relative(scopeDirectory, targetFile)),
38
+ basename: targetBasename,
39
+ };
40
+ }
41
+ export function toPosixPath(path) {
42
+ return path.replaceAll("\\", "/");
43
+ }
44
+ function isCandidateWithinProject(candidate, projectRoot) {
45
+ if (candidate.isGlobal) {
46
+ return true;
47
+ }
48
+ if (projectRoot === null) {
49
+ return false;
50
+ }
51
+ const relativeRealPath = relative(realPathOrResolved(projectRoot), realPathOrResolved(candidate.realPath));
52
+ return relativeRealPath === "" || (!relativeRealPath.startsWith("..") && !isAbsolute(relativeRealPath));
53
+ }
54
+ function realPathOrResolved(path) {
55
+ try {
56
+ return realpathSync.native(path);
57
+ }
58
+ catch {
59
+ return resolve(path);
60
+ }
61
+ }
62
+ function scopeDirectoryForCandidate(projectRoot, candidate) {
63
+ if (candidate.isGlobal) {
64
+ return null;
65
+ }
66
+ if (candidate.isSingleFile) {
67
+ return dirname(candidate.path);
68
+ }
69
+ const sourceIndex = candidate.relativePath.indexOf(candidate.source);
70
+ if (sourceIndex === -1) {
71
+ return projectRoot;
72
+ }
73
+ const scopeRelativeDirectory = candidate.relativePath.slice(0, sourceIndex).replace(/\/$/, "");
74
+ return scopeRelativeDirectory.length === 0 ? projectRoot : join(projectRoot, scopeRelativeDirectory);
75
+ }
@@ -0,0 +1,6 @@
1
+ import type { EngineDeps } from "./engine-types.js";
2
+ import type { LoadedRule, RuleCandidate, RuleDiagnostic } from "./types.js";
3
+ export declare function loadStaticCandidates(candidates: ReadonlyArray<RuleCandidate>, deps: EngineDeps, projectRoot: string | null): {
4
+ rules: LoadedRule[];
5
+ diagnostics: RuleDiagnostic[];
6
+ };
@@ -0,0 +1,29 @@
1
+ import { loadCandidate, staticMatchReason } from "./engine-loader.js";
2
+ import { isRootSingleFile } from "./engine-paths.js";
3
+ import { sortCandidates } from "./ordering.js";
4
+ export function loadStaticCandidates(candidates, deps, projectRoot) {
5
+ const rules = [];
6
+ const diagnostics = [];
7
+ let rootSingleFileSelected = false;
8
+ for (const candidate of sortCandidates(candidates)) {
9
+ if (isDedupedRootSingleFile(candidate, rootSingleFileSelected)) {
10
+ continue;
11
+ }
12
+ const loadedRule = loadCandidate(candidate, deps, diagnostics, projectRoot);
13
+ if (loadedRule === null) {
14
+ continue;
15
+ }
16
+ const matchReason = staticMatchReason(loadedRule);
17
+ if (matchReason === null) {
18
+ continue;
19
+ }
20
+ if (isRootSingleFile(candidate)) {
21
+ rootSingleFileSelected = true;
22
+ }
23
+ rules.push({ ...loadedRule, matchReason });
24
+ }
25
+ return { rules: sortCandidates(rules), diagnostics };
26
+ }
27
+ function isDedupedRootSingleFile(candidate, rootSingleFileSelected) {
28
+ return rootSingleFileSelected && isRootSingleFile(candidate);
29
+ }
@@ -0,0 +1,44 @@
1
+ import type { RuleDiscoveryCache } from "./finder.js";
2
+ import type { matchRule } from "./matcher.js";
3
+ import type { LoadedRule, MatchReason, PiRulesConfig, RuleCandidate, RuleDiagnostic, SessionState } from "./types.js";
4
+ export interface LoadedRuleContent {
5
+ frontmatter: LoadedRule["frontmatter"];
6
+ body: string;
7
+ contentHash: string;
8
+ diagnostic?: string;
9
+ }
10
+ export type CandidateProjectMembership = Map<string, boolean>;
11
+ export type CandidateDiscoveryCache = Map<string, RuleCandidate[]>;
12
+ export type DynamicMatchCache = Map<string, MatchReason | null>;
13
+ export interface EngineDeps {
14
+ findCandidates: (options: {
15
+ projectRoot: string | null;
16
+ targetFile: string | null;
17
+ homeDir?: string;
18
+ disabledSources?: ReadonlySet<string>;
19
+ skipUserHome?: boolean;
20
+ cache?: RuleDiscoveryCache;
21
+ }) => RuleCandidate[];
22
+ readFile: (path: string) => string | null;
23
+ findProjectRoot: (startPath: string) => string | null;
24
+ matchRule?: typeof matchRule;
25
+ }
26
+ export interface Engine {
27
+ state: SessionState;
28
+ config: PiRulesConfig;
29
+ loadStaticRules(cwd: string): {
30
+ rules: LoadedRule[];
31
+ diagnostics: RuleDiagnostic[];
32
+ };
33
+ loadDynamicRules(cwd: string, targetPaths: ReadonlyArray<string>): {
34
+ rules: LoadedRule[];
35
+ diagnostics: RuleDiagnostic[];
36
+ };
37
+ formatStatic(rules: ReadonlyArray<LoadedRule>): string;
38
+ formatDynamic(rules: ReadonlyArray<LoadedRule>, target: string): string;
39
+ resetSession(cwd?: string): void;
40
+ isStaticInjected(rule: LoadedRule): boolean;
41
+ isDynamicInjected(rule: LoadedRule): boolean;
42
+ markStaticInjected(rule: LoadedRule): boolean;
43
+ markDynamicInjected(rule: LoadedRule): boolean;
44
+ }
@@ -0,0 +1,5 @@
1
+ import type { Engine, EngineDeps } from "./engine-types.js";
2
+ import type { PiRulesConfig } from "./types.js";
3
+ export type { Engine, EngineDeps } from "./engine-types.js";
4
+ export declare function defaultConfig(): PiRulesConfig;
5
+ export declare function createEngine(config: PiRulesConfig, deps: EngineDeps): Engine;