oh-my-opencode 5.0.0-beta.3 → 5.0.0-beta.31
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.
- package/.agents/command/publish.md +44 -16
- package/.agents/skills/publish/SKILL.md +44 -16
- package/.agents/skills/senpi-qa/SKILL.md +80 -0
- package/.agents/skills/senpi-qa/scripts/resolve-evidence-dir.mjs +65 -0
- package/.agents/skills/senpi-qa/scripts/resolve-evidence-dir.test.mjs +171 -0
- package/.agents/skills/work-with-pr/SKILL.md +37 -23
- package/.opencode/command/publish.md +44 -16
- package/.opencode/skills/work-with-pr/SKILL.md +37 -23
- package/README.ja.md +25 -21
- package/README.ko.md +25 -21
- package/README.md +38 -23
- package/README.ru.md +24 -20
- package/README.zh-cn.md +25 -21
- package/dist/agents/atlas/agent.d.ts +0 -1
- package/dist/agents/sisyphus/grok-4.d.ts +20 -0
- package/dist/agents/sisyphus/index.d.ts +2 -0
- package/dist/agents/sisyphus-agent-config.d.ts +6 -0
- package/dist/agents/sisyphus-agent-factory.d.ts +1 -1
- package/dist/agents/sisyphus-runtime-prompt-reconciler.d.ts +15 -4
- package/dist/agents/types.d.ts +2 -2
- package/dist/cli/config-manager/parse-opencode-config-file.d.ts +2 -1
- package/dist/cli/doctor/checks/system-plugin.d.ts +4 -3
- package/dist/cli/fallback-lane-policy.d.ts +1 -0
- package/dist/cli/index.js +22601 -20302
- package/dist/cli/install-codex/install-codex-test-fixtures.d.ts +1 -1
- package/dist/cli/run/on-complete-hook.d.ts +2 -0
- package/dist/cli/runtime-commands.d.ts +1 -1
- package/dist/cli/worktree-sweep/classify.d.ts +16 -0
- package/dist/cli/worktree-sweep/format.d.ts +8 -0
- package/dist/cli/worktree-sweep/git.d.ts +19 -0
- package/dist/cli/worktree-sweep/index.d.ts +7 -0
- package/dist/cli/worktree-sweep/options.d.ts +2 -0
- package/dist/cli/worktree-sweep/parse-worktree-list.d.ts +8 -0
- package/dist/cli/worktree-sweep/sweep.d.ts +2 -0
- package/dist/cli/worktree-sweep/types.d.ts +65 -0
- package/dist/cli/worktree-sweep/worktree-sweep.d.ts +2 -0
- package/dist/cli-node/index.js +22219 -19897
- package/dist/config/schema/background-task.d.ts +1 -0
- package/dist/config/schema/commands.d.ts +1 -1
- package/dist/config/schema/hooks.d.ts +1 -1
- package/dist/config/schema/oh-my-opencode-config.d.ts +5 -1
- package/dist/config/schema/ulw-execute.d.ts +5 -0
- package/dist/config/validate.d.ts +2 -0
- package/dist/create-hooks.d.ts +3 -1
- package/dist/features/background-agent/constants.d.ts +0 -7
- package/dist/features/background-agent/manager.d.ts +2 -1
- package/dist/features/background-agent/parent-wake-dispatched-tracker.d.ts +0 -1
- package/dist/features/background-agent/subagent-spawn-limits.d.ts +8 -0
- package/dist/features/btw-side/btw-command-draft.d.ts +7 -0
- package/dist/features/btw-side/context-injector.d.ts +15 -0
- package/dist/features/btw-side/index.d.ts +8 -0
- package/dist/features/btw-side/metadata.d.ts +15 -0
- package/dist/features/btw-side/parent-context-budget.d.ts +9 -0
- package/dist/features/btw-side/server-session-registry.d.ts +8 -0
- package/dist/features/btw-side/tui-adoption-cache.d.ts +13 -0
- package/dist/features/btw-side/tui-adoption-guard.d.ts +5 -0
- package/dist/features/btw-side/tui-controller-types.d.ts +68 -0
- package/dist/features/btw-side/tui-controller.d.ts +19 -0
- package/dist/features/btw-side/tui-escape-return.d.ts +12 -0
- package/dist/features/btw-side/tui-keymap.d.ts +17 -0
- package/dist/features/btw-side/tui-parent-validator.d.ts +6 -0
- package/dist/features/btw-side/tui-picker-options.d.ts +20 -0
- package/dist/features/btw-side/tui-picker.d.ts +9 -0
- package/dist/features/btw-side/tui-prompt-queue.d.ts +8 -0
- package/dist/features/btw-side/tui-session-bridge.d.ts +11 -0
- package/dist/features/btw-side/tui-session-catalog.d.ts +35 -0
- package/dist/features/btw-side/tui-side-removal.d.ts +11 -0
- package/dist/features/btw-side/tui-side-start.d.ts +9 -0
- package/dist/features/btw-side/tui-wiring.d.ts +8 -0
- package/dist/features/builtin-commands/templates/ulw-execute.d.ts +1 -0
- package/dist/features/builtin-commands/types.d.ts +1 -1
- package/dist/features/opengateway-provider/index.d.ts +13 -0
- package/dist/features/task-toast-manager/manager.d.ts +0 -24
- package/dist/features/team-mode/tools/messaging-fallback-wake.d.ts +15 -0
- package/dist/hooks/anthropic-context-window-limit-recovery/message-storage-directory.d.ts +0 -3
- package/dist/hooks/anthropic-context-window-limit-recovery/state.d.ts +1 -0
- package/dist/hooks/anthropic-context-window-limit-recovery/storage/empty-messages.d.ts +0 -1
- package/dist/hooks/atlas/atlas-hook.d.ts +1 -0
- package/dist/hooks/atlas/atlas-lifecycle-store.d.ts +50 -0
- package/dist/hooks/atlas/event-handler.d.ts +1 -0
- package/dist/hooks/atlas/final-wave-approval-gate.test-support.d.ts +50 -0
- package/dist/hooks/atlas/system-reminder-templates.d.ts +0 -1
- package/dist/hooks/atlas/tool-execute-before.d.ts +3 -0
- package/dist/hooks/atlas/types.d.ts +1 -0
- package/dist/hooks/claude-code-hooks/session-hook-state.d.ts +1 -0
- package/dist/hooks/claude-code-hooks/stop.d.ts +2 -0
- package/dist/hooks/claude-code-hooks/todo.d.ts +0 -1
- package/dist/hooks/claude-code-hooks/transcript.d.ts +2 -0
- package/dist/hooks/fsync-skip-warning/index.d.ts +4 -0
- package/dist/hooks/hashline-edit-diff-enhancer/hook.d.ts +1 -0
- package/dist/hooks/hashline-edit-diff-enhancer/pending-captures.d.ts +13 -0
- package/dist/hooks/index.d.ts +1 -1
- package/dist/hooks/keyword-detector/hook.d.ts +7 -0
- package/dist/hooks/keyword-detector/ultrawork/source-detector.d.ts +0 -1
- package/dist/hooks/model-fallback/hook.d.ts +1 -1
- package/dist/hooks/prometheus-md-only/agent-resolution.d.ts +2 -2
- package/dist/hooks/runtime-fallback/chat-message-handler.d.ts +2 -0
- package/dist/hooks/runtime-fallback/retry-model-payload.d.ts +1 -0
- package/dist/hooks/runtime-fallback/runtime-model-settings.d.ts +6 -0
- package/dist/hooks/runtime-fallback/session-status-handler.d.ts +1 -1
- package/dist/hooks/runtime-fallback/types.d.ts +3 -1
- package/dist/hooks/sisyphus-junior-notepad/constants.d.ts +1 -1
- package/dist/hooks/todo-continuation-enforcer/types.d.ts +1 -0
- package/dist/hooks/{start-work → ulw-execute}/context-info-builder.d.ts +1 -1
- package/dist/hooks/{start-work → ulw-execute}/index.d.ts +1 -1
- package/dist/hooks/ulw-execute/ulw-execute-hook.d.ts +23 -0
- package/dist/index.js +12989 -7152
- package/dist/oh-my-opencode.schema.json +20 -2
- package/dist/plugin/chat-message/types.d.ts +3 -3
- package/dist/plugin/chat-message/ulw-execute-message.d.ts +5 -0
- package/dist/plugin/event-session-lifecycle.d.ts +1 -0
- package/dist/plugin/hooks/create-core-hooks.d.ts +2 -1
- package/dist/plugin/hooks/create-session-hooks.d.ts +2 -2
- package/dist/plugin/hooks/create-transform-hooks.d.ts +2 -0
- package/dist/plugin/messages-transform.d.ts +1 -0
- package/dist/plugin-dispose.d.ts +3 -0
- package/dist/shared/agent-tool-restrictions.d.ts +0 -1
- package/dist/shared/index.d.ts +2 -0
- package/dist/shared/legacy-plugin-warning.d.ts +2 -1
- package/dist/shared/normalize-sdk-response.d.ts +1 -0
- package/dist/shared/plugin-entry-migrator.d.ts +4 -3
- package/dist/shared/plugin-entry-shape.d.ts +6 -0
- package/dist/shared/runtime-fallback-retry-marker.d.ts +16 -0
- package/dist/shared/shell-env.d.ts +1 -1
- package/dist/skills/ast-grep/AGENTS.md +51 -0
- package/dist/skills/coding-agent-sessions/AGENTS.md +62 -0
- package/dist/skills/coding-agent-sessions/SKILL.md +3 -2
- package/dist/skills/coding-agent-sessions/references/all-platforms.md +1 -1
- package/dist/skills/coding-agent-sessions/references/senpi.md +4 -4
- package/dist/skills/coding-agent-sessions/scripts/agent_sessions/pi_family.py +1 -1
- package/dist/skills/data-scientist/SKILL.md +99 -239
- package/dist/skills/data-scientist/references/execution-surfaces.md +91 -0
- package/dist/skills/data-scientist/references/placement.md +74 -0
- package/dist/skills/data-scientist/references/polars-lane.md +95 -0
- package/dist/skills/data-scientist/references/uv-setup.md +1 -1
- package/dist/skills/data-scientist/references/visualization.md +64 -0
- package/dist/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
- package/dist/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
- package/dist/skills/debugging/SKILL.md +2 -0
- package/dist/skills/debugging/references/methodology/00-setup.md +12 -0
- package/dist/skills/debugging/references/methodology/02-investigate.md +21 -0
- package/dist/skills/debugging/references/runtimes/go.md +15 -1
- package/dist/skills/debugging/references/runtimes/native-binary.md +38 -0
- package/dist/skills/debugging/references/runtimes/node.md +25 -0
- package/dist/skills/debugging/references/runtimes/python.md +13 -0
- package/dist/skills/debugging/references/runtimes/rust.md +41 -0
- package/dist/skills/debugging/references/scripts/dap.mjs +267 -0
- package/dist/skills/debugging/references/scripts/dap.test.ts +86 -0
- package/dist/skills/debugging/references/scripts/fixture-adapter.mjs +59 -0
- package/dist/skills/debugging/references/tools/dap.md +103 -0
- package/dist/skills/debugging/references/tools/frida.md +193 -0
- package/dist/skills/frontend/SKILL.md +11 -7
- package/dist/skills/frontend/references/design/_INDEX.md +1 -0
- package/dist/skills/frontend/references/design/print-paged-media.md +76 -0
- package/dist/skills/frontend/references/design/stylegallery.md +80 -0
- package/dist/skills/frontend/references/designpowers/README.md +1 -1
- package/dist/skills/frontend/references/designpowers/lane-a-direction.md +1 -1
- package/dist/skills/frontend/references/designpowers/lane-b-execution.md +11 -11
- package/dist/skills/frontend/references/designpowers/lane-d-memory.md +3 -3
- package/dist/skills/frontend/references/designpowers/orchestration.md +1 -1
- package/dist/skills/frontend/references/designpowers/routing.md +5 -5
- package/dist/skills/review-work/SKILL.md +3 -3
- package/dist/skills/ultimate-browsing/ATTRIBUTION.md +37 -10
- package/dist/skills/ultimate-browsing/SKILL.md +2 -0
- package/dist/skills/ultimate-browsing/engine/AGENTS.md +179 -0
- package/dist/skills/ultimate-browsing/engine/templates/package.json +1 -1
- package/dist/skills/ultimate-browsing/references/chrome-stealth.md +13 -11
- package/dist/skills/{start-work → ulw-execute}/SKILL.md +9 -8
- package/dist/skills/ulw-plan/SKILL.md +6 -6
- package/dist/skills/ulw-plan/references/full-workflow.md +31 -7
- package/dist/skills/ulw-plan/references/intent-clear.md +2 -1
- package/dist/skills/ulw-plan/references/intent-unclear.md +5 -5
- package/dist/skills/ulw-research/SKILL.md +4 -2
- package/dist/skills/visual-qa/AGENTS.md +58 -0
- package/dist/skills/visual-qa/SKILL.md +3 -2
- package/dist/tools/delegate-task/builtin-categories.d.ts +1 -0
- package/dist/tools/delegate-task/builtin-category-definition.d.ts +1 -0
- package/dist/tools/delegate-task/sync-session-cleanup.d.ts +3 -0
- package/dist/tools/delegate-task/sync-session-poller.d.ts +1 -0
- package/dist/tools/delegate-task/tool-description.d.ts +3 -1
- package/dist/tools/delegate-task/types.d.ts +4 -0
- package/dist/tui.d.ts +12 -0
- package/dist/tui.js +11522 -11501
- package/package.json +42 -36
- package/packages/git-bash-mcp/dist/cli.js +6 -1
- package/packages/git-bash-mcp/package.json +1 -1
- package/packages/lsp-core/src/index.ts +1 -0
- package/packages/lsp-core/src/lsp/client-diagnostics-concurrency.integration.test.ts +44 -0
- package/packages/lsp-core/src/lsp/client-diagnostics-freshness.integration.test.ts +0 -28
- package/packages/lsp-core/src/lsp/client-wrapper-outside-cwd.test.ts +78 -0
- package/packages/lsp-core/src/lsp/client-wrapper.test.ts +163 -13
- package/packages/lsp-core/src/lsp/client-wrapper.ts +110 -23
- package/packages/lsp-core/src/lsp/client.ts +26 -0
- package/packages/lsp-core/src/lsp/connection.ts +16 -0
- package/packages/lsp-core/src/lsp/constants.ts +6 -0
- package/packages/lsp-core/src/lsp/errors.ts +15 -0
- package/packages/lsp-core/src/lsp/format-document.test.ts +143 -0
- package/packages/lsp-core/src/lsp/format-document.ts +90 -0
- package/packages/lsp-core/src/lsp/manager-lifecycle.test.ts +262 -0
- package/packages/lsp-core/src/lsp/manager-max-clients.test.ts +151 -0
- package/packages/lsp-core/src/lsp/manager.ts +138 -12
- package/packages/lsp-core/src/lsp/outside-context-workspace.ts +33 -0
- package/packages/lsp-core/src/lsp/server-definitions.ts +29 -0
- package/packages/lsp-core/src/lsp/server-installation.test.ts +376 -0
- package/packages/lsp-core/src/lsp/server-installation.ts +200 -27
- package/packages/lsp-core/src/lsp/server-resolution-local-binary.test.ts +170 -0
- package/packages/lsp-core/src/lsp/server-resolution.ts +18 -5
- package/packages/lsp-core/src/lsp/transport.ts +9 -0
- package/packages/lsp-core/src/lsp/types.ts +8 -0
- package/packages/lsp-core/src/lsp/workspace-edit-adversarial.test.ts +20 -1
- package/packages/lsp-core/src/lsp/workspace-markers.ts +18 -0
- package/packages/lsp-core/src/mcp.ts +3 -0
- package/packages/lsp-core/src/request-context.test.ts +29 -0
- package/packages/lsp-core/src/request-context.ts +1 -1
- package/packages/lsp-core/src/tool-surface.test.ts +13 -1
- package/packages/lsp-core/src/tools/definitions.ts +14 -0
- package/packages/lsp-core/src/tools/diagnostics.ts +3 -3
- package/packages/lsp-core/src/tools/format.test.ts +56 -0
- package/packages/lsp-core/src/tools/format.ts +56 -0
- package/packages/lsp-core/src/tools/index.ts +1 -0
- package/packages/lsp-core/src/tools/navigation.ts +4 -2
- package/packages/lsp-core/src/tools/rename.ts +4 -2
- package/packages/lsp-core/src/tools/symbols.ts +1 -1
- package/packages/lsp-core/src/tools/types.ts +10 -0
- package/packages/lsp-daemon/dist/cli.js +752 -307
- package/packages/lsp-daemon/dist/client.d.ts +10 -0
- package/packages/lsp-daemon/dist/client.js +712 -264
- package/packages/lsp-daemon/dist/daemon-client.d.ts +1 -0
- package/packages/lsp-daemon/dist/daemon-client.js +3 -0
- package/packages/lsp-daemon/dist/ensure-daemon.js +1 -0
- package/packages/lsp-daemon/dist/index.js +716 -273
- package/packages/lsp-daemon/dist/proxy.js +3 -0
- package/packages/lsp-daemon/dist/version-reap.js +1 -1
- package/packages/lsp-daemon/package.json +1 -1
- package/packages/lsp-tools-mcp/dist/cli.js +671 -228
- package/packages/lsp-tools-mcp/dist/lsp/manager.js +207 -103
- package/packages/lsp-tools-mcp/dist/mcp.js +673 -230
- package/packages/lsp-tools-mcp/dist/request-context.js +12 -13
- package/packages/lsp-tools-mcp/dist/tools.js +677 -238
- package/packages/omo-codex/THIRD-PARTY-NOTICES.md +4 -4
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +4 -4
- package/packages/omo-codex/plugin/AGENTS.md +47 -0
- package/packages/omo-codex/plugin/README.md +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +34 -33
- package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/src/hook.ts +1 -0
- package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +323 -117
- package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +275 -85
- package/packages/omo-codex/plugin/components/codegraph/package.json +4 -4
- package/packages/omo-codex/plugin/components/codegraph/src/mcp-bridge.ts +1 -0
- package/packages/omo-codex/plugin/components/codegraph/src/mcp-unavailable.ts +12 -0
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-hook-runtime.ts +1 -0
- package/packages/omo-codex/plugin/components/codegraph/test/serve-unavailable-idle.test.ts +47 -0
- package/packages/omo-codex/plugin/components/comment-checker/AGENTS.md +9 -0
- package/packages/omo-codex/plugin/components/comment-checker/biome.json +2 -2
- package/packages/omo-codex/plugin/components/comment-checker/dist/cli.js +2 -1
- package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/package.json +5 -5
- package/packages/omo-codex/plugin/components/comment-checker/src/apply-patch.ts +2 -8
- package/packages/omo-codex/plugin/components/comment-checker/src/core.ts +1 -2
- package/packages/omo-codex/plugin/components/comment-checker/src/request-extractor.ts +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/src/runner.ts +1 -0
- package/packages/omo-codex/plugin/components/git-bash/AGENTS.md +1 -1
- package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/git-bash/package.json +3 -4
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/biome.json +2 -2
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/cli.js +1 -5
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/codex-hook.js +1 -5
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +5 -5
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/src/codex-hook.ts +1 -5
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/codex-hook.test.ts +4 -21
- package/packages/omo-codex/plugin/components/lsp/AGENTS.md +30 -15
- package/packages/omo-codex/plugin/components/lsp/biome.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +4 -4
- package/packages/omo-codex/plugin/components/lsp/dist/cli.js +702 -278
- package/packages/omo-codex/plugin/components/lsp/dist/daemon-cli-path.js +1 -1
- package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/package.json +5 -5
- package/packages/omo-codex/plugin/components/lsp/src/cli.ts +1 -1
- package/packages/omo-codex/plugin/components/lsp/src/codex-hook.ts +1 -1
- package/packages/omo-codex/plugin/components/lsp/src/daemon-cli-path.ts +1 -5
- package/packages/omo-codex/plugin/components/lsp/test/codex-hook-unavailable.test.ts +6 -7
- package/packages/omo-codex/plugin/components/lsp/test/codex-hook.test.ts +1 -2
- package/packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts +11 -1
- package/packages/omo-codex/plugin/components/rules/AGENTS.md +12 -0
- package/packages/omo-codex/plugin/components/rules/biome.json +2 -2
- package/packages/omo-codex/plugin/components/rules/dist/cli.js +60 -45
- package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/rules/package.json +7 -7
- package/packages/omo-codex/plugin/components/rules/src/config.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/src/persistent-cache.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/src/post-compact-budget.ts +9 -5
- package/packages/omo-codex/plugin/components/rules/src/rules-engine-factory.ts +1 -4
- package/packages/omo-codex/plugin/components/rules/src/static-injection.ts +4 -9
- package/packages/omo-codex/plugin/components/rules/test/bundled-rules-priority.test.ts +11 -16
- package/packages/omo-codex/plugin/components/rules/test/bundled-rules.test.ts +17 -25
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-budget.test.ts +9 -7
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-context.test.ts +0 -6
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-dedup.test.ts +6 -4
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-directive.test.ts +12 -9
- package/packages/omo-codex/plugin/components/rules/test/codex-hook.test.ts +28 -37
- package/packages/omo-codex/plugin/components/rules/test/dynamic-target-fingerprints.test.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/test/engine.test.ts +7 -4
- package/packages/omo-codex/plugin/components/rules/test/finder.test.ts +2 -3
- package/packages/omo-codex/plugin/components/rules/test/formatter.test.ts +39 -72
- package/packages/omo-codex/plugin/components/rules/test/hephaestus-model-variant.test.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/test/hook-output.test.ts +2 -3
- package/packages/omo-codex/plugin/components/rules/test/matcher.test.ts +2 -3
- package/packages/omo-codex/plugin/components/rules/test/package-smoke.test.ts +1 -1
- package/packages/omo-codex/plugin/components/rules/test/parser.test.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/test/post-compact-budget.test.ts +5 -6
- package/packages/omo-codex/plugin/components/rules/test/rules-engine-consumption.test.ts +3 -6
- package/packages/omo-codex/plugin/components/rules/test/scanner.test.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/test/sources.test.ts +2 -5
- package/packages/omo-codex/plugin/components/rules/test/windows-git-bash-bundled-rule.test.ts +2 -17
- package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/package.json +5 -5
- package/packages/omo-codex/plugin/components/teammode/test/thread-title-hook.test.ts +3 -9
- package/packages/omo-codex/plugin/components/telemetry/AGENTS.md +8 -0
- package/packages/omo-codex/plugin/components/telemetry/biome.json +2 -2
- package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +2463 -437
- package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +2467 -441
- package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/package.json +5 -5
- package/packages/omo-codex/plugin/components/telemetry/src/codex-hook.ts +1 -4
- package/packages/omo-codex/plugin/components/telemetry/src/posthog.ts +4 -14
- package/packages/omo-codex/plugin/components/telemetry/src/product-identity.ts +1 -1
- package/packages/omo-codex/plugin/components/telemetry/test/diagnostics.test.ts +2 -5
- package/packages/omo-codex/plugin/components/ultrawork/AGENTS.md +5 -0
- package/packages/omo-codex/plugin/components/ultrawork/biome.json +2 -2
- package/packages/omo-codex/plugin/components/ultrawork/directive.md +13 -1
- package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/package.json +5 -5
- package/packages/omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md +13 -1
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +6 -6
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +31 -7
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-clear.md +2 -1
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-unclear.md +5 -5
- package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook-trigger-policy.test.ts +9 -1
- package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +0 -136
- package/packages/omo-codex/plugin/components/ultrawork/test/skill-pointer.test.ts +0 -2
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/AGENTS.md +5 -4
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/NOTICE +1 -1
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/README.md +5 -5
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/biome.json +2 -2
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/directive.md +6 -6
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/dist/cli.js +12 -12
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +28 -0
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/package.json +12 -12
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/boulder-reader.ts +1 -1
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/cli.ts +1 -1
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/codex-hook.ts +3 -3
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/directive.ts +1 -1
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/index.ts +1 -1
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/boulder-reader.test.ts +3 -3
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/cli.test.ts +1 -4
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/codex-hook.test.ts +8 -22
- package/packages/omo-codex/plugin/components/ulw-loop/AGENTS.md +17 -0
- package/packages/omo-codex/plugin/components/ulw-loop/CHANGELOG.md +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/biome.json +2 -2
- package/packages/omo-codex/plugin/components/ulw-loop/directive.md +13 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.js +2 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-commands.js +5 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.d.ts +2 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.js +11 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +124 -68
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.d.ts +2 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.js +9 -6
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.js +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.js +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.d.ts +4 -2
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.js +7 -10
- package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.js +3 -2
- package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.js +3 -3
- package/packages/omo-codex/plugin/components/ulw-loop/dist/surface.d.ts +15 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/surface.js +50 -0
- package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +5 -5
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +3 -2
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/define-goal.md +108 -0
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint.ts +2 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli-commands.ts +5 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli-output.ts +13 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli.ts +3 -5
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +16 -5
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-snapshot.ts +3 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-hook.ts +3 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/paths.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate.ts +11 -14
- package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-guard.ts +3 -2
- package/packages/omo-codex/plugin/components/ulw-loop/src/stop-resume-hook.ts +3 -3
- package/packages/omo-codex/plugin/components/ulw-loop/src/surface.ts +73 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-continuation.test.ts +0 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-final.test.ts +44 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-create-goals.test.ts +25 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-entrypoint.test.ts +26 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-instruction.test.ts +27 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-snapshot.test.ts +18 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/codex-hook.test.ts +0 -3
- package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/quality-gate-builder.ts +7 -3
- package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +5 -37
- package/packages/omo-codex/plugin/components/ulw-loop/test/paths.test.ts +9 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-roles.test.ts +45 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/spawn-guard.test.ts +20 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/steering.test.ts +8 -5
- package/packages/omo-codex/plugin/components/ulw-loop/test/stop-resume-hook.test.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/surface.test.ts +74 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/ultrawork-directive.test.ts +4 -5
- package/packages/omo-codex/plugin/components/ulw-loop/vitest.config.ts +1 -0
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +17 -0
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-checking-ulw-execute-continuation.json +17 -0
- package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/model-catalog.json +3 -3
- package/packages/omo-codex/plugin/package-lock.json +681 -395
- package/packages/omo-codex/plugin/package.json +2 -2
- package/packages/omo-codex/plugin/scripts/AGENTS.md +40 -0
- package/packages/omo-codex/plugin/scripts/auto-update-plan.mjs +1 -1
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/catalog.mjs +3 -3
- package/packages/omo-codex/plugin/scripts/sync-skills.mjs +11 -11
- package/packages/omo-codex/plugin/shared/package.json +3 -4
- package/packages/omo-codex/plugin/skills/ast-grep/AGENTS.md +51 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/AGENTS.md +62 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/SKILL.md +3 -2
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/all-platforms.md +1 -1
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/senpi.md +4 -4
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/pi_family.py +1 -1
- package/packages/omo-codex/plugin/skills/data-scientist/SKILL.md +99 -239
- package/packages/omo-codex/plugin/skills/data-scientist/references/execution-surfaces.md +91 -0
- package/packages/omo-codex/plugin/skills/data-scientist/references/placement.md +74 -0
- package/packages/omo-codex/plugin/skills/data-scientist/references/polars-lane.md +95 -0
- package/packages/omo-codex/plugin/skills/data-scientist/references/uv-setup.md +1 -1
- package/packages/omo-codex/plugin/skills/data-scientist/references/visualization.md +64 -0
- package/packages/omo-codex/plugin/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
- package/packages/omo-codex/plugin/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
- package/packages/omo-codex/plugin/skills/debugging/SKILL.md +2 -0
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/00-setup.md +12 -0
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/02-investigate.md +21 -0
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/go.md +15 -1
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/native-binary.md +38 -0
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/node.md +25 -0
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/python.md +13 -0
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/rust.md +41 -0
- package/packages/omo-codex/plugin/skills/debugging/references/scripts/dap.mjs +267 -0
- package/packages/omo-codex/plugin/skills/debugging/references/scripts/fixture-adapter.mjs +59 -0
- package/packages/omo-codex/plugin/skills/debugging/references/tools/dap.md +103 -0
- package/packages/omo-codex/plugin/skills/debugging/references/tools/frida.md +193 -0
- package/packages/omo-codex/plugin/skills/frontend/SKILL.md +11 -7
- package/packages/omo-codex/plugin/skills/frontend/references/design/_INDEX.md +1 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/print-paged-media.md +76 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/stylegallery.md +80 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/README.md +1 -1
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-a-direction.md +1 -1
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-b-execution.md +11 -11
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-d-memory.md +3 -3
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/orchestration.md +1 -1
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/routing.md +5 -5
- package/packages/omo-codex/plugin/skills/review-work/SKILL.md +4 -4
- package/packages/omo-codex/plugin/skills/ultimate-browsing/ATTRIBUTION.md +37 -10
- package/packages/omo-codex/plugin/skills/ultimate-browsing/SKILL.md +2 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/AGENTS.md +179 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/package.json +1 -1
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/chrome-stealth.md +13 -11
- package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +13 -1
- package/packages/omo-codex/plugin/skills/{start-work → ulw-execute}/SKILL.md +12 -11
- package/packages/omo-codex/plugin/skills/ulw-execute/agents/openai.yaml +2 -0
- package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +3 -2
- package/packages/omo-codex/plugin/skills/ulw-loop/references/define-goal.md +108 -0
- package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +1 -0
- package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +6 -6
- package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +31 -7
- package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-clear.md +2 -1
- package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-unclear.md +5 -5
- package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +4 -2
- package/packages/omo-codex/plugin/skills/visual-qa/AGENTS.md +58 -0
- package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +3 -2
- package/packages/omo-codex/plugin/test/AGENTS.md +47 -0
- package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +19 -173
- package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +8 -28
- package/packages/omo-codex/plugin/test/aggregate-manifest.test.mjs +1 -1
- package/packages/omo-codex/plugin/test/aggregate-model-catalog.test.mjs +1 -1
- package/packages/omo-codex/plugin/test/aggregate-plugin-fixture.mjs +175 -13
- package/packages/omo-codex/plugin/test/aggregate.test.mjs +78 -2
- package/packages/omo-codex/plugin/test/auto-update-release-notes.test.mjs +19 -33
- package/packages/omo-codex/plugin/test/auto-update.test.mjs +2 -2
- package/packages/omo-codex/plugin/test/component-bin-names.test.mjs +2 -2
- package/packages/omo-codex/plugin/test/component-bundled-cli.test.mjs +1 -1
- package/packages/omo-codex/plugin/test/component-hook-contract-cases.mjs +2 -2
- package/packages/omo-codex/plugin/test/hook-status-message.test.mjs +4 -4
- package/packages/omo-codex/plugin/test/lcx-contribute-bug-fix-template.test.mjs +21 -27
- package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +8 -8
- package/packages/omo-codex/plugin/test/scaffold-plan.test.mjs +0 -36
- package/packages/omo-codex/plugin/test/sync-skills-codex-compatibility.test.mjs +101 -0
- package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +12 -12
- package/packages/omo-codex/plugin/test/sync-skills.test.mjs +1 -119
- package/packages/omo-codex/plugin/test/teammode-archive-ambiguity.test.mjs +0 -40
- package/packages/omo-codex/plugin/test/teammode-communication.test.mjs +6 -62
- package/packages/omo-codex/plugin/test/teammode-thread-links.test.mjs +3 -36
- package/packages/omo-codex/plugin/test/teammode-transport.test.mjs +0 -44
- package/packages/omo-codex/plugin/test/teammode-worktree.test.mjs +2 -6
- package/packages/omo-codex/plugin/test/ultrawork-skill-pointer.test.mjs +0 -3
- package/packages/omo-codex/plugin/test/ulw-plan-review-state-contract.test.mjs +0 -3
- package/packages/omo-codex/scripts/AGENTS.md +36 -0
- package/packages/omo-codex/scripts/install-config-reasoning.test.mjs +2 -2
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +2637 -549
- package/packages/omo-codex/scripts/install-lazycodex-version-stamp.test.mjs +7 -2
- package/packages/shared-skills/skills/ast-grep/AGENTS.md +51 -0
- package/packages/shared-skills/skills/coding-agent-sessions/AGENTS.md +62 -0
- package/packages/shared-skills/skills/coding-agent-sessions/SKILL.md +3 -2
- package/packages/shared-skills/skills/coding-agent-sessions/references/all-platforms.md +1 -1
- package/packages/shared-skills/skills/coding-agent-sessions/references/senpi.md +4 -4
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/pi_family.py +1 -1
- package/packages/shared-skills/skills/data-scientist/SKILL.md +99 -239
- package/packages/shared-skills/skills/data-scientist/references/execution-surfaces.md +91 -0
- package/packages/shared-skills/skills/data-scientist/references/placement.md +74 -0
- package/packages/shared-skills/skills/data-scientist/references/polars-lane.md +95 -0
- package/packages/shared-skills/skills/data-scientist/references/uv-setup.md +1 -1
- package/packages/shared-skills/skills/data-scientist/references/visualization.md +64 -0
- package/packages/shared-skills/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
- package/packages/shared-skills/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
- package/packages/shared-skills/skills/debugging/SKILL.md +2 -0
- package/packages/shared-skills/skills/debugging/references/methodology/00-setup.md +12 -0
- package/packages/shared-skills/skills/debugging/references/methodology/02-investigate.md +21 -0
- package/packages/shared-skills/skills/debugging/references/runtimes/go.md +15 -1
- package/packages/shared-skills/skills/debugging/references/runtimes/native-binary.md +38 -0
- package/packages/shared-skills/skills/debugging/references/runtimes/node.md +25 -0
- package/packages/shared-skills/skills/debugging/references/runtimes/python.md +13 -0
- package/packages/shared-skills/skills/debugging/references/runtimes/rust.md +41 -0
- package/packages/shared-skills/skills/debugging/references/scripts/dap.mjs +267 -0
- package/packages/shared-skills/skills/debugging/references/scripts/dap.test.ts +86 -0
- package/packages/shared-skills/skills/debugging/references/scripts/fixture-adapter.mjs +59 -0
- package/packages/shared-skills/skills/debugging/references/tools/dap.md +103 -0
- package/packages/shared-skills/skills/debugging/references/tools/frida.md +193 -0
- package/packages/shared-skills/skills/frontend/SKILL.md +11 -7
- package/packages/shared-skills/skills/frontend/references/design/_INDEX.md +1 -0
- package/packages/shared-skills/skills/frontend/references/design/print-paged-media.md +76 -0
- package/packages/shared-skills/skills/frontend/references/design/stylegallery.md +80 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/README.md +1 -1
- package/packages/shared-skills/skills/frontend/references/designpowers/lane-a-direction.md +1 -1
- package/packages/shared-skills/skills/frontend/references/designpowers/lane-b-execution.md +11 -11
- package/packages/shared-skills/skills/frontend/references/designpowers/lane-d-memory.md +3 -3
- package/packages/shared-skills/skills/frontend/references/designpowers/orchestration.md +1 -1
- package/packages/shared-skills/skills/frontend/references/designpowers/routing.md +5 -5
- package/packages/shared-skills/skills/review-work/SKILL.md +3 -3
- package/packages/shared-skills/skills/ultimate-browsing/ATTRIBUTION.md +37 -10
- package/packages/shared-skills/skills/ultimate-browsing/SKILL.md +2 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/AGENTS.md +179 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/templates/package.json +1 -1
- package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +13 -11
- package/packages/shared-skills/skills/{start-work → ulw-execute}/SKILL.md +9 -8
- package/packages/shared-skills/skills/ulw-plan/SKILL.md +6 -6
- package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +31 -7
- package/packages/shared-skills/skills/ulw-plan/references/intent-clear.md +2 -1
- package/packages/shared-skills/skills/ulw-plan/references/intent-unclear.md +5 -5
- package/packages/shared-skills/skills/ulw-research/SKILL.md +4 -2
- package/packages/shared-skills/skills/visual-qa/AGENTS.md +58 -0
- package/packages/shared-skills/skills/visual-qa/SKILL.md +3 -2
- package/script/qa/web-terminal-visual-qa.mjs +2 -0
- package/script/qa/xterm-live-terminal.mjs +18 -2
- package/dist/config/schema/start-work.d.ts +0 -5
- package/dist/features/builtin-commands/templates/start-work.d.ts +0 -1
- package/dist/hooks/ralph-loop/completion-promise-detector-test-input.d.ts +0 -11
- package/dist/hooks/ralph-loop/loop-session-recovery.d.ts +0 -7
- package/dist/hooks/start-work/start-work-hook.d.ts +0 -23
- package/dist/plugin/chat-message/start-work-message.d.ts +0 -5
- package/dist/skills/data-scientist/references/common-scenarios.md +0 -176
- package/dist/skills/data-scientist/references/execution-templates.md +0 -197
- package/dist/skills/data-scientist/references/integration-patterns.md +0 -153
- package/dist/skills/data-scientist/references/performance-benchmarks.md +0 -37
- package/dist/tools/call-omo-agent/background-agent-executor.d.ts +0 -5
- package/dist/tools/call-omo-agent/message-storage-directory.d.ts +0 -1
- package/dist/tools/delegate-task/model-string-parser.d.ts +0 -1
- package/packages/lsp-tools-mcp/dist/lsp/cleanup-errors.d.ts +0 -1
- package/packages/lsp-tools-mcp/dist/lsp/constants.d.ts +0 -1
- package/packages/lsp-tools-mcp/dist/lsp/language-mappings.d.ts +0 -1
- package/packages/lsp-tools-mcp/dist/lsp/process-signal-cleanup.d.ts +0 -1
- package/packages/lsp-tools-mcp/dist/missing-dependency-result.d.ts +0 -1
- package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +0 -28
- package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +0 -17
- package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +0 -17
- package/packages/omo-codex/plugin/skills/data-scientist/references/common-scenarios.md +0 -176
- package/packages/omo-codex/plugin/skills/data-scientist/references/execution-templates.md +0 -197
- package/packages/omo-codex/plugin/skills/data-scientist/references/integration-patterns.md +0 -153
- package/packages/omo-codex/plugin/skills/data-scientist/references/performance-benchmarks.md +0 -37
- package/packages/omo-codex/plugin/skills/start-work/agents/openai.yaml +0 -2
- package/packages/omo-codex/plugin/test/aggregate-skills.test.mjs +0 -92
- package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +0 -314
- package/packages/omo-codex/plugin/test/ulw-plan-scope-contract.test.mjs +0 -24
- package/packages/shared-skills/skills/data-scientist/references/common-scenarios.md +0 -176
- package/packages/shared-skills/skills/data-scientist/references/execution-templates.md +0 -197
- package/packages/shared-skills/skills/data-scientist/references/integration-patterns.md +0 -153
- package/packages/shared-skills/skills/data-scientist/references/performance-benchmarks.md +0 -37
- /package/dist/hooks/{start-work → ulw-execute}/context-info-formatters.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/explicit-plan-context.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/notepad-scaffold.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/parse-user-request.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/plan-discovery-context.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/plan-selection.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/session-plan-affinity.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/work-initializer.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/worktree-block.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/worktree-detector.d.ts +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/.gitattributes +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/CHANGELOG.md +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/LICENSE +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/plan-checklist.ts +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/types.ts +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-completed.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-mixed-platforms.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-single-codex-work.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-all-done.md +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-scaffold.md +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-with-nested-checkboxes.md +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-with-unchecked.md +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/tsconfig.build.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/tsconfig.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/vitest.config.ts +0 -0
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { UlwLoopCodexGoalMode, UlwLoopPlan } from "./types.js";
|
|
2
|
-
export declare const ULW_LOOP_HELP = "Usage:\n omo-agent-toolkit ulw-loop create-goals --brief \"...\" [--brief-file <path>] [--from-stdin] [--codex-goal-mode aggregate|per_story] [--validation-batch-json <json-or-path>] [--force] [--json]\n omo-agent-toolkit ulw-loop status [--json]\n omo-agent-toolkit ulw-loop complete-goals [--retry-failed] [--json]\n omo-agent-toolkit ulw-loop criteria --goal-id <id> [--json]\n omo-agent-toolkit ulw-loop record-evidence --goal-id <id> --criterion-id <id> --status pass|fail|blocked --evidence \"...\" [--notes \"...\"] [--json]\n omo-agent-toolkit ulw-loop checkpoint --goal-id <id> --status complete|failed|blocked --evidence \"...\" --codex-goal-json <...> [--quality-gate-json <...>] [--no-advance] [--json]\n omo-agent-toolkit ulw-loop steer --kind <kind> ... --evidence \"...\" --rationale \"...\" [--proposals-json <json-or-path>] [--json]\n omo-agent-toolkit ulw-loop add-goal --title \"...\" --objective \"...\" [--json]\n omo-agent-toolkit ulw-loop record-review-blockers --goal-id <id> --title \"...\" --objective \"...\" --evidence \"...\" --codex-goal-json <...> [--json]\n\nAll subcommands accept [--session-id <id>] to isolate state under .omo/ulw-loop/<id>/; without it, Codex session env is used when present.";
|
|
2
|
+
export declare const ULW_LOOP_HELP = "Usage:\n omo-agent-toolkit hook user-prompt-submit [--with-ultrawork] (Codex UserPromptSubmit hook)\n omo-agent-toolkit help | --help | -h (this message)\n omo-agent-toolkit ulw-loop help\n omo-agent-toolkit ulw-loop create-goals --brief \"...\" [--brief-file <path>] [--from-stdin] [--codex-goal-mode aggregate|per_story] [--validation-batch-json <json-or-path>] [--force] [--json]\n omo-agent-toolkit ulw-loop status [--json]\n omo-agent-toolkit ulw-loop complete-goals [--retry-failed] [--json]\n omo-agent-toolkit ulw-loop criteria --goal-id <id> [--json]\n omo-agent-toolkit ulw-loop record-evidence --goal-id <id> --criterion-id <id> --status pass|fail|blocked --evidence \"...\" [--notes \"...\"] [--json]\n omo-agent-toolkit ulw-loop checkpoint --goal-id <id> --status complete|failed|blocked --evidence \"...\" --codex-goal-json <...> [--quality-gate-json <...>] [--no-advance] [--json]\n omo-agent-toolkit ulw-loop steer --kind <kind> ... --evidence \"...\" --rationale \"...\" [--proposals-json <json-or-path>] [--json]\n omo-agent-toolkit ulw-loop add-goal --title \"...\" --objective \"...\" [--json]\n omo-agent-toolkit ulw-loop record-review-blockers --goal-id <id> --title \"...\" --objective \"...\" --evidence \"...\" --codex-goal-json <...> [--json]\n\nAll subcommands accept [--session-id <id>] to isolate state under .omo/ulw-loop/<id>/; without it, Codex session env is used when present.\nEvery subcommand accepts --help | -h to print its own usage line.";
|
|
3
|
+
export declare function subcommandHelp(subcommand: string): string;
|
|
3
4
|
export declare function printJson(value: unknown): void;
|
|
4
5
|
export declare function printJsonError(error: unknown): void;
|
|
5
6
|
export declare function printStatus(plan: UlwLoopPlan): void;
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { UlwLoopError } from "./types.js";
|
|
2
2
|
export const ULW_LOOP_HELP = `Usage:
|
|
3
|
+
omo-agent-toolkit hook user-prompt-submit [--with-ultrawork] (Codex UserPromptSubmit hook)
|
|
4
|
+
omo-agent-toolkit help | --help | -h (this message)
|
|
5
|
+
omo-agent-toolkit ulw-loop help
|
|
3
6
|
omo-agent-toolkit ulw-loop create-goals --brief "..." [--brief-file <path>] [--from-stdin] [--codex-goal-mode aggregate|per_story] [--validation-batch-json <json-or-path>] [--force] [--json]
|
|
4
7
|
omo-agent-toolkit ulw-loop status [--json]
|
|
5
8
|
omo-agent-toolkit ulw-loop complete-goals [--retry-failed] [--json]
|
|
@@ -10,7 +13,14 @@ export const ULW_LOOP_HELP = `Usage:
|
|
|
10
13
|
omo-agent-toolkit ulw-loop add-goal --title "..." --objective "..." [--json]
|
|
11
14
|
omo-agent-toolkit ulw-loop record-review-blockers --goal-id <id> --title "..." --objective "..." --evidence "..." --codex-goal-json <...> [--json]
|
|
12
15
|
|
|
13
|
-
All subcommands accept [--session-id <id>] to isolate state under .omo/ulw-loop/<id>/; without it, Codex session env is used when present
|
|
16
|
+
All subcommands accept [--session-id <id>] to isolate state under .omo/ulw-loop/<id>/; without it, Codex session env is used when present.
|
|
17
|
+
Every subcommand accepts --help | -h to print its own usage line.`;
|
|
18
|
+
export function subcommandHelp(subcommand) {
|
|
19
|
+
const lines = ULW_LOOP_HELP.split("\n").filter((line) => line.trimStart().startsWith(`omo-agent-toolkit ulw-loop ${subcommand}`));
|
|
20
|
+
if (lines.length === 0)
|
|
21
|
+
return ULW_LOOP_HELP;
|
|
22
|
+
return ["Usage:", ...lines].join("\n");
|
|
23
|
+
}
|
|
14
24
|
export function printJson(value) {
|
|
15
25
|
process.stdout.write(`${JSON.stringify(value, null, 2)}\n`);
|
|
16
26
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
// packages/omo-codex/plugin/components/ulw-loop/src/checkpoint.ts
|
|
4
|
-
import { existsSync as
|
|
4
|
+
import { existsSync as existsSync4, statSync } from "node:fs";
|
|
5
5
|
import { readFile as readFile5 } from "node:fs/promises";
|
|
6
6
|
import { resolve as resolve3 } from "node:path";
|
|
7
7
|
|
|
@@ -33,8 +33,6 @@ var ULW_LOOP_SUCCESS_CRITERION_USER_MODELS = [
|
|
|
33
33
|
];
|
|
34
34
|
// packages/omo-codex/plugin/components/ulw-loop/src/runtime.ts
|
|
35
35
|
class UlwLoopError extends Error {
|
|
36
|
-
code;
|
|
37
|
-
details;
|
|
38
36
|
constructor(message, code, opts) {
|
|
39
37
|
super(message, opts?.cause === undefined ? undefined : { cause: opts.cause });
|
|
40
38
|
this.name = "UlwLoopError";
|
|
@@ -48,7 +46,7 @@ function iso() {
|
|
|
48
46
|
return new Date().toISOString();
|
|
49
47
|
}
|
|
50
48
|
// packages/omo-codex/plugin/components/ulw-loop/src/paths.ts
|
|
51
|
-
var SESSION_ENV_KEYS = ["OMO_ULW_LOOP_SESSION_ID", "CODEX_SESSION_ID", "CODEX_THREAD_ID"];
|
|
49
|
+
var SESSION_ENV_KEYS = ["OMO_ULW_LOOP_SESSION_ID", "CODEX_SESSION_ID", "CODEX_THREAD_ID", "PI_SESSION_ID"];
|
|
52
50
|
function normalizeUlwLoopSessionId(sessionId) {
|
|
53
51
|
const trimmed = sessionId?.trim();
|
|
54
52
|
if (!trimmed)
|
|
@@ -302,7 +300,7 @@ function parseCodexGoalSnapshot(value) {
|
|
|
302
300
|
return { available: false, raw: value };
|
|
303
301
|
}
|
|
304
302
|
const goal = safeObject(goalValue);
|
|
305
|
-
const objective = safeString(goal["objective"] ?? goal["goal"] ?? goal["description"] ?? root["objective"]);
|
|
303
|
+
const objective = safeString(goal["objective"] ?? goal["goal"] ?? goal["description"] ?? goal["title"] ?? root["objective"] ?? root["title"]);
|
|
306
304
|
const status = normalizeStatus(goal["status"] ?? root["status"]);
|
|
307
305
|
return {
|
|
308
306
|
available: Boolean(objective || status !== "unknown"),
|
|
@@ -650,6 +648,53 @@ function adversarialVerdict(row, field) {
|
|
|
650
648
|
invalid(`${field} must be passed or not_applicable with a reason.`, field);
|
|
651
649
|
}
|
|
652
650
|
|
|
651
|
+
// packages/omo-codex/plugin/components/ulw-loop/src/surface.ts
|
|
652
|
+
import { existsSync as existsSync3, readFileSync } from "node:fs";
|
|
653
|
+
import { dirname, join as join2 } from "node:path";
|
|
654
|
+
import { fileURLToPath } from "node:url";
|
|
655
|
+
var REVIEWER_ROLES_BY_SURFACE = {
|
|
656
|
+
lazycodex: {
|
|
657
|
+
codeReview: "lazycodex-code-reviewer",
|
|
658
|
+
manualQa: "lazycodex-qa-executor",
|
|
659
|
+
gateReview: "lazycodex-gate-reviewer"
|
|
660
|
+
},
|
|
661
|
+
"omo-senpi": {
|
|
662
|
+
codeReview: "omo-senpi-code-reviewer",
|
|
663
|
+
manualQa: "omo-senpi-qa-executor",
|
|
664
|
+
gateReview: "omo-senpi-gate-reviewer"
|
|
665
|
+
}
|
|
666
|
+
};
|
|
667
|
+
var GATE_REVIEWER_AGENT_NAMES = new Set(Object.values(REVIEWER_ROLES_BY_SURFACE).map((roles) => roles.gateReview));
|
|
668
|
+
function reviewerRolesFor(surface) {
|
|
669
|
+
return REVIEWER_ROLES_BY_SURFACE[surface];
|
|
670
|
+
}
|
|
671
|
+
var SURFACE_MARKER_FILENAME = "surface.json";
|
|
672
|
+
var SURFACE_ENV_KEY = "OMO_AGENT_TOOLKIT_SURFACE";
|
|
673
|
+
function parseSurface(value) {
|
|
674
|
+
return value === "lazycodex" || value === "omo-senpi" ? value : null;
|
|
675
|
+
}
|
|
676
|
+
function resolveToolkitSurface(options) {
|
|
677
|
+
const env = options?.env ?? process.env;
|
|
678
|
+
const fromEnv = parseSurface(env[SURFACE_ENV_KEY]);
|
|
679
|
+
if (fromEnv !== null)
|
|
680
|
+
return fromEnv;
|
|
681
|
+
const entryDir = options?.entryDir ?? dirname(fileURLToPath(import.meta.url));
|
|
682
|
+
const markerPath = join2(entryDir, SURFACE_MARKER_FILENAME);
|
|
683
|
+
return readMarkerSurface(markerPath) ?? "lazycodex";
|
|
684
|
+
}
|
|
685
|
+
function readMarkerSurface(markerPath) {
|
|
686
|
+
try {
|
|
687
|
+
if (!existsSync3(markerPath))
|
|
688
|
+
return null;
|
|
689
|
+
const parsed = JSON.parse(readFileSync(markerPath, "utf8"));
|
|
690
|
+
return parseSurface(parsed["surface"]);
|
|
691
|
+
} catch (error) {
|
|
692
|
+
if (error instanceof Error)
|
|
693
|
+
return null;
|
|
694
|
+
throw error;
|
|
695
|
+
}
|
|
696
|
+
}
|
|
697
|
+
|
|
653
698
|
// packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-blockers.ts
|
|
654
699
|
var BLOCKER_FIELD_KEYS = "blocker blockerSignature blockerEvidence blockerOccurrences blockedAt".split(" ");
|
|
655
700
|
var URL_PATTERN = /https?:\/\/\S+/g;
|
|
@@ -693,11 +738,6 @@ function clearGoalBlockerFields(goal) {
|
|
|
693
738
|
}
|
|
694
739
|
|
|
695
740
|
// packages/omo-codex/plugin/components/ulw-loop/src/quality-gate.ts
|
|
696
|
-
var REVIEWER_ROLES = {
|
|
697
|
-
codeReview: "lazycodex-code-reviewer",
|
|
698
|
-
manualQa: "lazycodex-qa-executor",
|
|
699
|
-
gateReview: "lazycodex-gate-reviewer"
|
|
700
|
-
};
|
|
701
741
|
function reviewerRoleField(value, expected, field) {
|
|
702
742
|
const actual = textField(value, field);
|
|
703
743
|
if (actual !== expected)
|
|
@@ -731,14 +771,14 @@ function artifactCompatible(surface, kind) {
|
|
|
731
771
|
}
|
|
732
772
|
}
|
|
733
773
|
function checkFile(path, field, opts) {
|
|
734
|
-
if (opts === undefined)
|
|
774
|
+
if (opts?.repoRoot === undefined || opts.fs === undefined)
|
|
735
775
|
return;
|
|
736
776
|
const absolute = resolve2(opts.repoRoot, path);
|
|
737
777
|
if (!opts.fs.existsSync(absolute))
|
|
738
778
|
invalid(`${field} must point to an existing artifact.`, field);
|
|
739
779
|
if (opts.fs.statSync(absolute).size <= 0)
|
|
740
780
|
invalid(`${field} must point to a non-empty artifact.`, field);
|
|
741
|
-
if (opts.currentAttemptDir !== undefined) {
|
|
781
|
+
if (opts.currentAttemptDir !== undefined && opts.repoRoot !== undefined) {
|
|
742
782
|
const attemptRoot = resolve2(opts.repoRoot, opts.currentAttemptDir);
|
|
743
783
|
if (!isWithinAttemptDir(absolute, attemptRoot))
|
|
744
784
|
invalid(`${field} (${path}) must point to an artifact from the current attempt (${opts.currentAttemptDir}).`, field);
|
|
@@ -777,6 +817,7 @@ function referencedArtifacts(value, field, byId) {
|
|
|
777
817
|
});
|
|
778
818
|
}
|
|
779
819
|
function validateQualityGate(input, opts) {
|
|
820
|
+
const reviewerRoles = reviewerRolesFor(opts?.reviewerSurface ?? "lazycodex");
|
|
780
821
|
const gate = section(input, "qualityGate");
|
|
781
822
|
const codeReview = section(gate["codeReview"], "codeReview");
|
|
782
823
|
const manualQa = section(gate["manualQa"], "manualQa");
|
|
@@ -797,7 +838,7 @@ function validateQualityGate(input, opts) {
|
|
|
797
838
|
checkFile(gateReportPath, "gateReview.reportPath", opts);
|
|
798
839
|
return {
|
|
799
840
|
codeReview: {
|
|
800
|
-
by: reviewerRoleField(codeReview["by"],
|
|
841
|
+
by: reviewerRoleField(codeReview["by"], reviewerRoles.codeReview, "codeReview.by"),
|
|
801
842
|
recommendation: literal(codeReview["recommendation"], "APPROVE", "codeReview.recommendation"),
|
|
802
843
|
codeQualityStatus: codeQualityStatusField(codeReview["codeQualityStatus"], "codeReview.codeQualityStatus"),
|
|
803
844
|
reportPath: codeReportPath,
|
|
@@ -805,7 +846,7 @@ function validateQualityGate(input, opts) {
|
|
|
805
846
|
blockers: emptyBlockers(codeReview["blockers"], "codeReview.blockers")
|
|
806
847
|
},
|
|
807
848
|
manualQa: {
|
|
808
|
-
by: reviewerRoleField(manualQa["by"],
|
|
849
|
+
by: reviewerRoleField(manualQa["by"], reviewerRoles.manualQa, "manualQa.by"),
|
|
809
850
|
status: literal(manualQa["status"], "passed", "manualQa.status"),
|
|
810
851
|
evidence: textField(manualQa["evidence"], "manualQa.evidence"),
|
|
811
852
|
surfaceEvidence,
|
|
@@ -813,7 +854,7 @@ function validateQualityGate(input, opts) {
|
|
|
813
854
|
artifactRefs
|
|
814
855
|
},
|
|
815
856
|
gateReview: {
|
|
816
|
-
by: reviewerRoleField(gateReview["by"],
|
|
857
|
+
by: reviewerRoleField(gateReview["by"], reviewerRoles.gateReview, "gateReview.by"),
|
|
817
858
|
recommendation: literal(gateReview["recommendation"], "APPROVE", "gateReview.recommendation"),
|
|
818
859
|
reportPath: gateReportPath,
|
|
819
860
|
evidence: textField(gateReview["evidence"], "gateReview.evidence"),
|
|
@@ -1086,7 +1127,7 @@ function fail(message, code = "ULW_LOOP_VALIDATION_BATCH_INVALID") {
|
|
|
1086
1127
|
}
|
|
1087
1128
|
|
|
1088
1129
|
// packages/omo-codex/plugin/components/ulw-loop/src/checkpoint.ts
|
|
1089
|
-
var QUALITY_GATE_FS = { existsSync:
|
|
1130
|
+
var QUALITY_GATE_FS = { existsSync: existsSync4, statSync };
|
|
1090
1131
|
function ulwLoopFail2(message, code) {
|
|
1091
1132
|
throw new UlwLoopError(message, code);
|
|
1092
1133
|
}
|
|
@@ -1112,7 +1153,7 @@ async function readJsonInput2(raw, repoRoot) {
|
|
|
1112
1153
|
throw error;
|
|
1113
1154
|
}
|
|
1114
1155
|
const path = resolve3(repoRoot, trimmed);
|
|
1115
|
-
if (!
|
|
1156
|
+
if (!existsSync4(path))
|
|
1116
1157
|
return ulwLoopFail2("Quality gate JSON is neither valid JSON nor a readable path.", "ulw_loop_json_input_invalid");
|
|
1117
1158
|
try {
|
|
1118
1159
|
return JSON.parse(await readFile5(path, "utf8"));
|
|
@@ -1224,6 +1265,7 @@ async function checkpointUlwLoop(repoRoot, args, scope) {
|
|
|
1224
1265
|
qualityGate = validateQualityGate(await readJsonInput2(args.qualityGateJson, repoRoot), {
|
|
1225
1266
|
repoRoot,
|
|
1226
1267
|
fs: QUALITY_GATE_FS,
|
|
1268
|
+
reviewerSurface: resolveToolkitSurface(),
|
|
1227
1269
|
...plan.evidenceLayoutVersion === 2 ? { currentAttemptDir: ulwLoopAttemptEvidenceDir(goal.id, goal.attempt, scope) } : {}
|
|
1228
1270
|
});
|
|
1229
1271
|
requireBatchGate(plan, goal, qualityGate);
|
|
@@ -1254,6 +1296,9 @@ async function checkpointUlwLoop(repoRoot, args, scope) {
|
|
|
1254
1296
|
|
|
1255
1297
|
// packages/omo-codex/plugin/components/ulw-loop/src/cli-output.ts
|
|
1256
1298
|
var ULW_LOOP_HELP = `Usage:
|
|
1299
|
+
omo-agent-toolkit hook user-prompt-submit [--with-ultrawork] (Codex UserPromptSubmit hook)
|
|
1300
|
+
omo-agent-toolkit help | --help | -h (this message)
|
|
1301
|
+
omo-agent-toolkit ulw-loop help
|
|
1257
1302
|
omo-agent-toolkit ulw-loop create-goals --brief "..." [--brief-file <path>] [--from-stdin] [--codex-goal-mode aggregate|per_story] [--validation-batch-json <json-or-path>] [--force] [--json]
|
|
1258
1303
|
omo-agent-toolkit ulw-loop status [--json]
|
|
1259
1304
|
omo-agent-toolkit ulw-loop complete-goals [--retry-failed] [--json]
|
|
@@ -1264,7 +1309,16 @@ var ULW_LOOP_HELP = `Usage:
|
|
|
1264
1309
|
omo-agent-toolkit ulw-loop add-goal --title "..." --objective "..." [--json]
|
|
1265
1310
|
omo-agent-toolkit ulw-loop record-review-blockers --goal-id <id> --title "..." --objective "..." --evidence "..." --codex-goal-json <...> [--json]
|
|
1266
1311
|
|
|
1267
|
-
All subcommands accept [--session-id <id>] to isolate state under .omo/ulw-loop/<id>/; without it, Codex session env is used when present
|
|
1312
|
+
All subcommands accept [--session-id <id>] to isolate state under .omo/ulw-loop/<id>/; without it, Codex session env is used when present.
|
|
1313
|
+
Every subcommand accepts --help | -h to print its own usage line.`;
|
|
1314
|
+
function subcommandHelp(subcommand) {
|
|
1315
|
+
const lines = ULW_LOOP_HELP.split(`
|
|
1316
|
+
`).filter((line) => line.trimStart().startsWith(`omo-agent-toolkit ulw-loop ${subcommand}`));
|
|
1317
|
+
if (lines.length === 0)
|
|
1318
|
+
return ULW_LOOP_HELP;
|
|
1319
|
+
return ["Usage:", ...lines].join(`
|
|
1320
|
+
`);
|
|
1321
|
+
}
|
|
1268
1322
|
function printJson(value) {
|
|
1269
1323
|
process.stdout.write(`${JSON.stringify(value, null, 2)}
|
|
1270
1324
|
`);
|
|
@@ -1335,12 +1389,13 @@ function buildCodexGoalInstruction(args) {
|
|
|
1335
1389
|
const mode = codexGoalMode(args.plan);
|
|
1336
1390
|
const createGoal = buildCreateGoalPayload(args.plan, args.goal);
|
|
1337
1391
|
const isFinal = args.isFinal ?? isFinalRunCompletionCandidate(args.plan, args.goal);
|
|
1338
|
-
|
|
1392
|
+
const surface = args.surface ?? resolveToolkitSurface();
|
|
1393
|
+
return { text: buildText(mode, args.plan, args.goal, createGoal, isFinal, surface), json: createGoal };
|
|
1339
1394
|
}
|
|
1340
1395
|
function buildCreateGoalPayload(plan, goal) {
|
|
1341
1396
|
return { objective: expectedCodexObjective(plan, goal) };
|
|
1342
1397
|
}
|
|
1343
|
-
function buildText(mode, plan, goal, createGoal, isFinal) {
|
|
1398
|
+
function buildText(mode, plan, goal, createGoal, isFinal, surface) {
|
|
1344
1399
|
return joinLines([
|
|
1345
1400
|
mode === "aggregate" ? "UlwLoop aggregate-goal handoff" : "UlwLoop active-goal handoff",
|
|
1346
1401
|
`Mode: ${mode}`,
|
|
@@ -1357,7 +1412,7 @@ function buildText(mode, plan, goal, createGoal, isFinal) {
|
|
|
1357
1412
|
"- Goals are unlimited. Do not add numeric limits.",
|
|
1358
1413
|
...modeConstraintLines(mode, isFinal),
|
|
1359
1414
|
...evidenceLayoutLines(plan),
|
|
1360
|
-
finalSection(plan, goal, isFinal, mode === "aggregate"),
|
|
1415
|
+
finalSection(plan, goal, isFinal, mode === "aggregate", surface),
|
|
1361
1416
|
...checkpointLines(plan, mode),
|
|
1362
1417
|
"",
|
|
1363
1418
|
"create_goal payload:",
|
|
@@ -1409,7 +1464,8 @@ function evidenceLayoutLines(plan) {
|
|
|
1409
1464
|
"- Evidence layout v2: write every artifact for the active goal (QA matrix, review reports, receipts) under the current attempt directory — read currentAttemptDir from `omo-agent-toolkit ulw-loop status --json` (.omo/evidence/ulw/<session>/<goalId>/a<attempt>). The final checkpoint rejects quality-gate artifacts outside that directory."
|
|
1410
1465
|
];
|
|
1411
1466
|
}
|
|
1412
|
-
function finalSection(plan, goal, isFinal, aggregate) {
|
|
1467
|
+
function finalSection(plan, goal, isFinal, aggregate, surface) {
|
|
1468
|
+
const roles = reviewerRolesFor(surface);
|
|
1413
1469
|
if (!isFinal)
|
|
1414
1470
|
return "- This is not the final ulw-loop story; do not run the final reviewer/manual-QA/gate-review quality gate yet.";
|
|
1415
1471
|
const option = sessionOption(plan);
|
|
@@ -1419,8 +1475,8 @@ function finalSection(plan, goal, isFinal, aggregate) {
|
|
|
1419
1475
|
"Final story — run mandatory quality gate before update_goal:",
|
|
1420
1476
|
"- Run targeted verification for changed behavior.",
|
|
1421
1477
|
"- Confirm every manualQa artifact path exists and has non-zero size.",
|
|
1422
|
-
|
|
1423
|
-
|
|
1478
|
+
`- First spawn ${roles.codeReview} and ${roles.manualQa} in parallel (fork_context: false on the v1 surface; fork_turns: "none" on v2). Include the original brief, goal objectives, desired user-visible outcome, diff, and evidence; wait for BOTH to return and confirm their report artifacts exist on disk (code-review report + manualQa matrix).`,
|
|
1479
|
+
`- Only then spawn ${roles.gateReview} (same fork settings), passing those artifact paths.`,
|
|
1424
1480
|
"- Require clean codeReview, manualQa, gateReview, iteration, and criteriaCoverage. criteriaCoverage must summarize originalIntent, desiredOutcome, and userOutcomeReview; counts alone are not approval.",
|
|
1425
1481
|
"- On a reviewer REJECT, fix only the cited blockers, rerun the affected verification/Manual-QA, and re-review the delta at most TWICE; if blockers remain, record them and surface to the user.",
|
|
1426
1482
|
"- If codeQualityStatus is WATCH, include the WATCH notes verbatim in your final user-facing message.",
|
|
@@ -1444,7 +1500,7 @@ function joinLines(lines) {
|
|
|
1444
1500
|
}
|
|
1445
1501
|
|
|
1446
1502
|
// packages/omo-codex/plugin/components/ulw-loop/src/plan-crud.ts
|
|
1447
|
-
import { existsSync as
|
|
1503
|
+
import { existsSync as existsSync5 } from "node:fs";
|
|
1448
1504
|
import { mkdir as mkdir2, writeFile as writeFile2 } from "node:fs/promises";
|
|
1449
1505
|
|
|
1450
1506
|
// packages/omo-codex/plugin/components/ulw-loop/src/plan-goal-factory.ts
|
|
@@ -1554,7 +1610,7 @@ function clearGoalBlockerFields2(goal) {
|
|
|
1554
1610
|
}
|
|
1555
1611
|
async function createUlwLoopPlan(repoRoot, args, scope) {
|
|
1556
1612
|
return withUlwLoopMutationLock(repoRoot, scope, async () => {
|
|
1557
|
-
if (!args.force &&
|
|
1613
|
+
if (!args.force && existsSync5(ulwLoopGoalsPath(repoRoot, scope))) {
|
|
1558
1614
|
const existing = await readUlwLoopPlan(repoRoot, scope);
|
|
1559
1615
|
if (isUlwLoopDone(existing))
|
|
1560
1616
|
throw completedPlanExistsError(scope);
|
|
@@ -2722,6 +2778,11 @@ async function ulwLoopCommand(argv) {
|
|
|
2722
2778
|
`);
|
|
2723
2779
|
return 1;
|
|
2724
2780
|
}
|
|
2781
|
+
if (command !== "help" && (hasFlag(rest, "--help") || hasFlag(rest, "-h"))) {
|
|
2782
|
+
process.stdout.write(`${subcommandHelp(command)}
|
|
2783
|
+
`);
|
|
2784
|
+
return 0;
|
|
2785
|
+
}
|
|
2725
2786
|
switch (command) {
|
|
2726
2787
|
case "help":
|
|
2727
2788
|
process.stdout.write(`${ULW_LOOP_HELP}
|
|
@@ -2787,11 +2848,11 @@ function commandScope(argv) {
|
|
|
2787
2848
|
}
|
|
2788
2849
|
|
|
2789
2850
|
// packages/omo-codex/plugin/components/ulw-loop/src/ultrawork-directive.ts
|
|
2790
|
-
import { readFileSync as
|
|
2851
|
+
import { readFileSync as readFileSync3 } from "node:fs";
|
|
2791
2852
|
|
|
2792
2853
|
// packages/omo-codex/plugin/components/ulw-loop/src/ultrawork-skill-pointer.ts
|
|
2793
|
-
import { existsSync as
|
|
2794
|
-
import { fileURLToPath } from "node:url";
|
|
2854
|
+
import { existsSync as existsSync6, readFileSync as readFileSync2 } from "node:fs";
|
|
2855
|
+
import { fileURLToPath as fileURLToPath2 } from "node:url";
|
|
2795
2856
|
var ULTRAWORK_SKILL_POINTER_TEMPLATE = `<ultrawork-mode>
|
|
2796
2857
|
ULTRAWORK MODE IS ACTIVE FOR THIS TASK.
|
|
2797
2858
|
|
|
@@ -2822,16 +2883,16 @@ Do not start the requested work until all three steps are complete.
|
|
|
2822
2883
|
`;
|
|
2823
2884
|
var ULTRAWORK_SKILL_PATH_PLACEHOLDER = "{{ULTRAWORK_SKILL_PATH}}";
|
|
2824
2885
|
var ULTRAWORK_SKILL_FILE_URL = new URL("../../../skills/ultrawork/SKILL.md", import.meta.url);
|
|
2825
|
-
var ULTRAWORK_DIRECTIVE =
|
|
2886
|
+
var ULTRAWORK_DIRECTIVE = readFileSync2(new URL("../directive.md", import.meta.url), "utf8");
|
|
2826
2887
|
function resolveUltraworkSkillFilePath() {
|
|
2827
|
-
return
|
|
2888
|
+
return fileURLToPath2(ULTRAWORK_SKILL_FILE_URL);
|
|
2828
2889
|
}
|
|
2829
2890
|
function buildUltraworkSkillPointer(skillFilePath) {
|
|
2830
2891
|
return ULTRAWORK_SKILL_POINTER_TEMPLATE.replace(ULTRAWORK_SKILL_PATH_PLACEHOLDER, skillFilePath);
|
|
2831
2892
|
}
|
|
2832
2893
|
function buildUltraworkAdditionalContext(options = {}) {
|
|
2833
2894
|
const skillFilePath = options.skillFilePath === undefined ? resolveUltraworkSkillFilePath() : options.skillFilePath;
|
|
2834
|
-
if (skillFilePath !== null &&
|
|
2895
|
+
if (skillFilePath !== null && existsSync6(skillFilePath)) {
|
|
2835
2896
|
return buildUltraworkSkillPointer(skillFilePath);
|
|
2836
2897
|
}
|
|
2837
2898
|
return ULTRAWORK_DIRECTIVE;
|
|
@@ -2885,7 +2946,7 @@ function hasUltraworkDirectiveAlreadyInTranscript(transcriptPath) {
|
|
|
2885
2946
|
return false;
|
|
2886
2947
|
}
|
|
2887
2948
|
function readTranscriptTail(transcriptPath) {
|
|
2888
|
-
const rawTranscript =
|
|
2949
|
+
const rawTranscript = readFileSync3(transcriptPath);
|
|
2889
2950
|
return rawTranscript.subarray(Math.max(0, rawTranscript.byteLength - TRANSCRIPT_SEARCH_BYTES)).toString("utf8");
|
|
2890
2951
|
}
|
|
2891
2952
|
function isUltraworkPrompt(prompt) {
|
|
@@ -3078,16 +3139,16 @@ function readAll(stdin) {
|
|
|
3078
3139
|
}
|
|
3079
3140
|
|
|
3080
3141
|
// packages/omo-codex/plugin/components/ulw-loop/src/spawn-guard.ts
|
|
3081
|
-
import { existsSync as
|
|
3082
|
-
import { join as
|
|
3142
|
+
import { existsSync as existsSync7, readdirSync, readFileSync as readFileSync4, statSync as statSync2, writeFileSync } from "node:fs";
|
|
3143
|
+
import { join as join3 } from "node:path";
|
|
3083
3144
|
var SPAWN_TOOL_TOKENS = new Set(["spawn_agent", "collaborationspawn_agent", "collaboration.spawn_agent"]);
|
|
3084
3145
|
var DEFAULT_FANOUT_LIMIT = 60;
|
|
3085
|
-
var GATE_MESSAGE_PATTERN = /lazycodex-gate-reviewer|final gate review/i;
|
|
3146
|
+
var GATE_MESSAGE_PATTERN = /lazycodex-gate-reviewer|omo-senpi-gate-reviewer|final gate review/i;
|
|
3086
3147
|
function applySpawnGuards(payload) {
|
|
3087
3148
|
if (payload.hook_event_name !== "PreToolUse" || !SPAWN_TOOL_TOKENS.has(payload.tool_name))
|
|
3088
3149
|
return "";
|
|
3089
3150
|
const stateDir = ulwLoopDir(payload.cwd, { sessionId: payload.session_id });
|
|
3090
|
-
const plan = readPlan(
|
|
3151
|
+
const plan = readPlan(join3(stateDir, "goals.json"));
|
|
3091
3152
|
if (plan === null)
|
|
3092
3153
|
return "";
|
|
3093
3154
|
const fanOutDenial = consumeFanOutBudget(stateDir);
|
|
@@ -3115,7 +3176,7 @@ async function runSpawnGuardCli(stdin, stdout) {
|
|
|
3115
3176
|
}
|
|
3116
3177
|
}
|
|
3117
3178
|
function consumeFanOutBudget(stateDir) {
|
|
3118
|
-
const counterPath =
|
|
3179
|
+
const counterPath = join3(stateDir, "spawn-count.json");
|
|
3119
3180
|
const count = readCount(counterPath) + 1;
|
|
3120
3181
|
writeFileSync(counterPath, JSON.stringify({ count }));
|
|
3121
3182
|
const limit = fanOutLimit();
|
|
@@ -3136,15 +3197,15 @@ function missingGateArtifact(payload, plan) {
|
|
|
3136
3197
|
const attemptDir = ulwLoopAttemptEvidenceDir(goal3.id, goal3.attempt, scope);
|
|
3137
3198
|
for (const name of [`${goal3.id}-code-review.md`, `${goal3.id}-manual-qa.md`]) {
|
|
3138
3199
|
const relative2 = `${attemptDir}/${name}`;
|
|
3139
|
-
if (!isNonEmptyFile(
|
|
3200
|
+
if (!isNonEmptyFile(join3(payload.cwd, relative2)))
|
|
3140
3201
|
return relative2;
|
|
3141
3202
|
}
|
|
3142
3203
|
return null;
|
|
3143
3204
|
}
|
|
3144
3205
|
const flatReport = `.omo/evidence/${goal3.id}-code-review.md`;
|
|
3145
|
-
if (!isNonEmptyFile(
|
|
3206
|
+
if (!isNonEmptyFile(join3(payload.cwd, flatReport)))
|
|
3146
3207
|
return flatReport;
|
|
3147
|
-
if (!hasOtherEvidenceFile(
|
|
3208
|
+
if (!hasOtherEvidenceFile(join3(payload.cwd, ".omo", "evidence"), `${goal3.id}-code-review.md`))
|
|
3148
3209
|
return `.omo/evidence/<any manual-QA artifact besides ${goal3.id}-code-review.md>`;
|
|
3149
3210
|
return null;
|
|
3150
3211
|
}
|
|
@@ -3154,7 +3215,7 @@ function isGateReviewerSpawn(toolInput) {
|
|
|
3154
3215
|
const record = toolInput;
|
|
3155
3216
|
const agentType = record["agent_type"];
|
|
3156
3217
|
if (typeof agentType === "string")
|
|
3157
|
-
return agentType
|
|
3218
|
+
return GATE_REVIEWER_AGENT_NAMES.has(agentType);
|
|
3158
3219
|
const message = record["message"];
|
|
3159
3220
|
return typeof message === "string" && GATE_MESSAGE_PATTERN.test(message);
|
|
3160
3221
|
}
|
|
@@ -3178,7 +3239,7 @@ function fanOutLimit() {
|
|
|
3178
3239
|
}
|
|
3179
3240
|
function isNonEmptyFile(path) {
|
|
3180
3241
|
try {
|
|
3181
|
-
return
|
|
3242
|
+
return existsSync7(path) && statSync2(path).size > 0;
|
|
3182
3243
|
} catch (error) {
|
|
3183
3244
|
if (error instanceof Error)
|
|
3184
3245
|
return false;
|
|
@@ -3187,7 +3248,7 @@ function isNonEmptyFile(path) {
|
|
|
3187
3248
|
}
|
|
3188
3249
|
function hasOtherEvidenceFile(evidenceDir, excludedName) {
|
|
3189
3250
|
try {
|
|
3190
|
-
return readdirSync(evidenceDir).some((name) => name !== excludedName && isNonEmptyFile(
|
|
3251
|
+
return readdirSync(evidenceDir).some((name) => name !== excludedName && isNonEmptyFile(join3(evidenceDir, name)));
|
|
3191
3252
|
} catch (error) {
|
|
3192
3253
|
if (error instanceof Error)
|
|
3193
3254
|
return false;
|
|
@@ -3196,7 +3257,7 @@ function hasOtherEvidenceFile(evidenceDir, excludedName) {
|
|
|
3196
3257
|
}
|
|
3197
3258
|
function readCount(counterPath) {
|
|
3198
3259
|
try {
|
|
3199
|
-
const parsed = JSON.parse(
|
|
3260
|
+
const parsed = JSON.parse(readFileSync4(counterPath, "utf8"));
|
|
3200
3261
|
return typeof parsed["count"] === "number" && parsed["count"] >= 0 ? parsed["count"] : 0;
|
|
3201
3262
|
} catch (error) {
|
|
3202
3263
|
if (error instanceof Error)
|
|
@@ -3206,7 +3267,7 @@ function readCount(counterPath) {
|
|
|
3206
3267
|
}
|
|
3207
3268
|
function readPlan(goalsPath) {
|
|
3208
3269
|
try {
|
|
3209
|
-
return JSON.parse(
|
|
3270
|
+
return JSON.parse(readFileSync4(goalsPath, "utf8"));
|
|
3210
3271
|
} catch (error) {
|
|
3211
3272
|
if (error instanceof Error)
|
|
3212
3273
|
return null;
|
|
@@ -3215,8 +3276,8 @@ function readPlan(goalsPath) {
|
|
|
3215
3276
|
}
|
|
3216
3277
|
|
|
3217
3278
|
// packages/omo-codex/plugin/components/ulw-loop/src/stop-resume-hook.ts
|
|
3218
|
-
import { existsSync as
|
|
3219
|
-
import { isAbsolute as isAbsolute2, join as
|
|
3279
|
+
import { existsSync as existsSync8, readFileSync as readFileSync5, writeFileSync as writeFileSync2 } from "node:fs";
|
|
3280
|
+
import { isAbsolute as isAbsolute2, join as join4, resolve as resolve4, sep as sep2 } from "node:path";
|
|
3220
3281
|
var RESUME_CAP = 2;
|
|
3221
3282
|
var CONTEXT_PRESSURE_MARKERS2 = [
|
|
3222
3283
|
"context compacted",
|
|
@@ -3236,7 +3297,7 @@ function runStopResumeHook(input) {
|
|
|
3236
3297
|
if (boulderContinuationWillFire(payload.cwd, payload.session_id))
|
|
3237
3298
|
return "";
|
|
3238
3299
|
const stateDir = ulwLoopDir(payload.cwd, { sessionId: payload.session_id });
|
|
3239
|
-
const plan = readPlan2(
|
|
3300
|
+
const plan = readPlan2(join4(stateDir, "goals.json"));
|
|
3240
3301
|
if (plan === null || plan.aggregateCompletion?.status === "complete")
|
|
3241
3302
|
return "";
|
|
3242
3303
|
const goal3 = resumableGoal(plan);
|
|
@@ -3273,7 +3334,7 @@ function isResumableStatus(status2) {
|
|
|
3273
3334
|
return status2 === "pending" || status2 === "in_progress";
|
|
3274
3335
|
}
|
|
3275
3336
|
function consumeResumeBudget(stateDir, goalId) {
|
|
3276
|
-
const ledgerLineCount = countLedgerLines(
|
|
3337
|
+
const ledgerLineCount = countLedgerLines(join4(stateDir, "ledger.jsonl"));
|
|
3277
3338
|
const counterPath = resolve4(stateDir, `auto-resume-${goalId}.json`);
|
|
3278
3339
|
const stuckPath = resolve4(stateDir, `auto-resume-${goalId}.stuck`);
|
|
3279
3340
|
if (!isInsideDir(stateDir, counterPath) || !isInsideDir(stateDir, stuckPath))
|
|
@@ -3306,7 +3367,7 @@ function renderResumeDirective(plan, goal3, sessionId) {
|
|
|
3306
3367
|
}
|
|
3307
3368
|
function readPlan2(goalsPath) {
|
|
3308
3369
|
try {
|
|
3309
|
-
return JSON.parse(
|
|
3370
|
+
return JSON.parse(readFileSync5(goalsPath, "utf8"));
|
|
3310
3371
|
} catch (error) {
|
|
3311
3372
|
if (error instanceof Error)
|
|
3312
3373
|
return null;
|
|
@@ -3315,7 +3376,7 @@ function readPlan2(goalsPath) {
|
|
|
3315
3376
|
}
|
|
3316
3377
|
function countLedgerLines(ledgerPath) {
|
|
3317
3378
|
try {
|
|
3318
|
-
return
|
|
3379
|
+
return readFileSync5(ledgerPath, "utf8").split(`
|
|
3319
3380
|
`).filter(Boolean).length;
|
|
3320
3381
|
} catch (error) {
|
|
3321
3382
|
if (error instanceof Error)
|
|
@@ -3325,9 +3386,9 @@ function countLedgerLines(ledgerPath) {
|
|
|
3325
3386
|
}
|
|
3326
3387
|
function readCounter(counterPath) {
|
|
3327
3388
|
try {
|
|
3328
|
-
if (!
|
|
3389
|
+
if (!existsSync8(counterPath))
|
|
3329
3390
|
return null;
|
|
3330
|
-
const parsed = JSON.parse(
|
|
3391
|
+
const parsed = JSON.parse(readFileSync5(counterPath, "utf8"));
|
|
3331
3392
|
if (typeof parsed["count"] !== "number" || typeof parsed["ledgerLineCount"] !== "number")
|
|
3332
3393
|
return null;
|
|
3333
3394
|
return { count: parsed["count"], ledgerLineCount: parsed["ledgerLineCount"] };
|
|
@@ -3339,7 +3400,7 @@ function readCounter(counterPath) {
|
|
|
3339
3400
|
}
|
|
3340
3401
|
function boulderContinuationWillFire(cwd, sessionId) {
|
|
3341
3402
|
try {
|
|
3342
|
-
const raw = JSON.parse(
|
|
3403
|
+
const raw = JSON.parse(readFileSync5(join4(cwd, ".omo", "boulder.json"), "utf8"));
|
|
3343
3404
|
const works = raw["works"];
|
|
3344
3405
|
const entries = typeof works === "object" && works !== null ? Object.values(works) : [raw];
|
|
3345
3406
|
return entries.some((work) => {
|
|
@@ -3358,7 +3419,7 @@ function boulderContinuationWillFire(cwd, sessionId) {
|
|
|
3358
3419
|
}
|
|
3359
3420
|
function transcriptShowsContextPressure(transcriptPath) {
|
|
3360
3421
|
try {
|
|
3361
|
-
const transcript =
|
|
3422
|
+
const transcript = readFileSync5(transcriptPath, "utf8").toLowerCase();
|
|
3362
3423
|
return CONTEXT_PRESSURE_MARKERS2.some((marker) => transcript.includes(marker));
|
|
3363
3424
|
} catch (error) {
|
|
3364
3425
|
if (error instanceof Error)
|
|
@@ -3370,12 +3431,12 @@ function boulderPlanHasChecklist(cwd, entry) {
|
|
|
3370
3431
|
const activePlan = entry["active_plan"];
|
|
3371
3432
|
if (typeof activePlan !== "string" || activePlan.trim().length === 0)
|
|
3372
3433
|
return false;
|
|
3373
|
-
const planPath = isAbsolute2(activePlan) ? activePlan :
|
|
3434
|
+
const planPath = isAbsolute2(activePlan) ? activePlan : join4(cwd, activePlan);
|
|
3374
3435
|
const worktree = entry["worktree_path"];
|
|
3375
|
-
const candidates = typeof worktree === "string" && worktree.trim().length > 0 && !isAbsolute2(activePlan) ? [
|
|
3436
|
+
const candidates = typeof worktree === "string" && worktree.trim().length > 0 && !isAbsolute2(activePlan) ? [join4(isAbsolute2(worktree) ? worktree : join4(cwd, worktree), activePlan), planPath] : [planPath];
|
|
3376
3437
|
for (const candidate of candidates) {
|
|
3377
3438
|
try {
|
|
3378
|
-
return
|
|
3439
|
+
return readFileSync5(candidate, "utf8").split(/\r?\n/).some((line) => line.startsWith("- [ ] ") || line.startsWith("- [x] ") || line.startsWith("- [X] "));
|
|
3379
3440
|
} catch (error) {
|
|
3380
3441
|
if (!(error instanceof Error))
|
|
3381
3442
|
throw error;
|
|
@@ -3400,18 +3461,12 @@ function parseStopPayload(value) {
|
|
|
3400
3461
|
}
|
|
3401
3462
|
|
|
3402
3463
|
// packages/omo-codex/plugin/components/ulw-loop/src/cli.ts
|
|
3403
|
-
var TOP_LEVEL_HELP = `Usage:
|
|
3404
|
-
omo-agent-toolkit ulw-loop <subcommand> [args]
|
|
3405
|
-
omo-agent-toolkit hook user-prompt-submit [--with-ultrawork] (Codex UserPromptSubmit hook)
|
|
3406
|
-
omo-agent-toolkit help | --help | -h (this message)
|
|
3407
|
-
|
|
3408
|
-
Run \`omo-agent-toolkit ulw-loop help\` for ulw-loop subcommands.
|
|
3409
|
-
`;
|
|
3410
3464
|
async function main() {
|
|
3411
3465
|
const argv = process.argv.slice(2);
|
|
3412
3466
|
const command = argv[0];
|
|
3413
3467
|
if (command === undefined || command === "help" || command === "--help" || command === "-h") {
|
|
3414
|
-
process.stdout.write(
|
|
3468
|
+
process.stdout.write(`${ULW_LOOP_HELP}
|
|
3469
|
+
`);
|
|
3415
3470
|
return 0;
|
|
3416
3471
|
}
|
|
3417
3472
|
if (command === "ulw-loop")
|
|
@@ -3443,7 +3498,8 @@ async function main() {
|
|
|
3443
3498
|
if (isUlwLoopSubcommand(command))
|
|
3444
3499
|
return ulwLoopCommand(argv);
|
|
3445
3500
|
process.stderr.write(`[omo] unknown command: ${command}
|
|
3446
|
-
${
|
|
3501
|
+
${ULW_LOOP_HELP}
|
|
3502
|
+
`);
|
|
3447
3503
|
return 1;
|
|
3448
3504
|
}
|
|
3449
3505
|
main().then((code) => {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type UlwLoopToolkitSurface } from "./surface.js";
|
|
1
2
|
import type { UlwLoopItem, UlwLoopPlan } from "./types.js";
|
|
2
3
|
export interface CodexCreateGoalPayload {
|
|
3
4
|
readonly objective: string;
|
|
@@ -10,4 +11,5 @@ export declare function buildCodexGoalInstruction(args: {
|
|
|
10
11
|
readonly plan: UlwLoopPlan;
|
|
11
12
|
readonly goal: UlwLoopItem;
|
|
12
13
|
readonly isFinal?: boolean;
|
|
14
|
+
readonly surface?: UlwLoopToolkitSurface;
|
|
13
15
|
}): UlwLoopGoalInstruction;
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
// biome-ignore-all format: long agent-facing instruction strings are intentionally stable.
|
|
2
2
|
import { codexGoalMode, expectedCodexObjective, isEssentialCriterion, isFinalRunCompletionCandidate, } from "./goal-status.js";
|
|
3
|
+
import { resolveToolkitSurface, reviewerRolesFor } from "./surface.js";
|
|
3
4
|
export function buildCodexGoalInstruction(args) {
|
|
4
5
|
const mode = codexGoalMode(args.plan);
|
|
5
6
|
const createGoal = buildCreateGoalPayload(args.plan, args.goal);
|
|
6
7
|
const isFinal = args.isFinal ?? isFinalRunCompletionCandidate(args.plan, args.goal);
|
|
7
|
-
|
|
8
|
+
const surface = args.surface ?? resolveToolkitSurface();
|
|
9
|
+
return { text: buildText(mode, args.plan, args.goal, createGoal, isFinal, surface), json: createGoal };
|
|
8
10
|
}
|
|
9
11
|
function buildCreateGoalPayload(plan, goal) {
|
|
10
12
|
return { objective: expectedCodexObjective(plan, goal) };
|
|
11
13
|
}
|
|
12
|
-
function buildText(mode, plan, goal, createGoal, isFinal) {
|
|
14
|
+
function buildText(mode, plan, goal, createGoal, isFinal, surface) {
|
|
13
15
|
return joinLines([
|
|
14
16
|
mode === "aggregate" ? "UlwLoop aggregate-goal handoff" : "UlwLoop active-goal handoff",
|
|
15
17
|
`Mode: ${mode}`,
|
|
@@ -26,7 +28,7 @@ function buildText(mode, plan, goal, createGoal, isFinal) {
|
|
|
26
28
|
"- Goals are unlimited. Do not add numeric limits.",
|
|
27
29
|
...modeConstraintLines(mode, isFinal),
|
|
28
30
|
...evidenceLayoutLines(plan),
|
|
29
|
-
finalSection(plan, goal, isFinal, mode === "aggregate"),
|
|
31
|
+
finalSection(plan, goal, isFinal, mode === "aggregate", surface),
|
|
30
32
|
...checkpointLines(plan, mode),
|
|
31
33
|
"",
|
|
32
34
|
"create_goal payload:",
|
|
@@ -80,7 +82,8 @@ function evidenceLayoutLines(plan) {
|
|
|
80
82
|
"- Evidence layout v2: write every artifact for the active goal (QA matrix, review reports, receipts) under the current attempt directory — read currentAttemptDir from `omo-agent-toolkit ulw-loop status --json` (.omo/evidence/ulw/<session>/<goalId>/a<attempt>). The final checkpoint rejects quality-gate artifacts outside that directory.",
|
|
81
83
|
];
|
|
82
84
|
}
|
|
83
|
-
function finalSection(plan, goal, isFinal, aggregate) {
|
|
85
|
+
function finalSection(plan, goal, isFinal, aggregate, surface) {
|
|
86
|
+
const roles = reviewerRolesFor(surface);
|
|
84
87
|
if (!isFinal)
|
|
85
88
|
return "- This is not the final ulw-loop story; do not run the final reviewer/manual-QA/gate-review quality gate yet.";
|
|
86
89
|
const option = sessionOption(plan);
|
|
@@ -90,8 +93,8 @@ function finalSection(plan, goal, isFinal, aggregate) {
|
|
|
90
93
|
"Final story — run mandatory quality gate before update_goal:",
|
|
91
94
|
"- Run targeted verification for changed behavior.",
|
|
92
95
|
"- Confirm every manualQa artifact path exists and has non-zero size.",
|
|
93
|
-
|
|
94
|
-
|
|
96
|
+
`- First spawn ${roles.codeReview} and ${roles.manualQa} in parallel (fork_context: false on the v1 surface; fork_turns: "none" on v2). Include the original brief, goal objectives, desired user-visible outcome, diff, and evidence; wait for BOTH to return and confirm their report artifacts exist on disk (code-review report + manualQa matrix).`,
|
|
97
|
+
`- Only then spawn ${roles.gateReview} (same fork settings), passing those artifact paths.`,
|
|
95
98
|
"- Require clean codeReview, manualQa, gateReview, iteration, and criteriaCoverage. criteriaCoverage must summarize originalIntent, desiredOutcome, and userOutcomeReview; counts alone are not approval.",
|
|
96
99
|
"- On a reviewer REJECT, fix only the cited blockers, rerun the affected verification/Manual-QA, and re-review the delta at most TWICE; if blockers remain, record them and surface to the user.",
|
|
97
100
|
"- If codeQualityStatus is WATCH, include the WATCH notes verbatim in your final user-facing message.",
|
|
@@ -31,7 +31,7 @@ export function parseCodexGoalSnapshot(value) {
|
|
|
31
31
|
return { available: false, raw: value };
|
|
32
32
|
}
|
|
33
33
|
const goal = safeObject(goalValue);
|
|
34
|
-
const objective = safeString(goal["objective"] ?? goal["goal"] ?? goal["description"] ?? root["objective"]);
|
|
34
|
+
const objective = safeString(goal["objective"] ?? goal["goal"] ?? goal["description"] ?? goal["title"] ?? root["objective"] ?? root["title"]);
|
|
35
35
|
const status = normalizeStatus(goal["status"] ?? root["status"]);
|
|
36
36
|
return {
|
|
37
37
|
available: Boolean(objective || status !== "unknown"),
|