oh-my-opencode 5.0.0-beta.2 → 5.0.0-beta.21
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/fallback-lane-policy.d.ts +1 -0
- package/dist/cli/index.js +23057 -20893
- 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 +23093 -20929
- 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 +4 -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/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/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/index.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/{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 +11724 -6355
- package/dist/oh-my-opencode.schema.json +15 -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/shared/index.d.ts +1 -0
- package/dist/shared/normalize-sdk-response.d.ts +1 -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/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 +1 -1
- 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/tool-description.d.ts +3 -1
- package/dist/tui.js +8824 -8906
- package/package.json +38 -35
- package/packages/git-bash-mcp/dist/cli.js +5 -1
- package/packages/git-bash-mcp/package.json +1 -1
- 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 +66 -13
- package/packages/lsp-core/src/lsp/client-wrapper.ts +70 -18
- package/packages/lsp-core/src/lsp/outside-context-workspace.ts +33 -0
- package/packages/lsp-core/src/lsp/workspace-edit-adversarial.test.ts +20 -1
- package/packages/lsp-core/src/lsp/workspace-markers.ts +1 -0
- package/packages/lsp-core/src/tools/diagnostics.ts +3 -3
- 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-daemon/dist/cli.js +246 -185
- package/packages/lsp-daemon/dist/client.js +222 -164
- package/packages/lsp-daemon/dist/ensure-daemon.js +1 -0
- package/packages/lsp-daemon/dist/index.js +236 -177
- package/packages/lsp-daemon/dist/version-reap.js +1 -1
- package/packages/lsp-tools-mcp/dist/cli.js +198 -136
- package/packages/lsp-tools-mcp/dist/lsp/manager.js +62 -92
- package/packages/lsp-tools-mcp/dist/mcp.js +200 -138
- package/packages/lsp-tools-mcp/dist/request-context.js +11 -12
- package/packages/lsp-tools-mcp/dist/tools.js +204 -146
- 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 +32 -31
- 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 +224 -81
- package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +224 -82
- 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/session-start-hook-runtime.ts +1 -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 +217 -171
- 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 +57 -42
- 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 +6 -2
- 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 +1 -2
- 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 +2433 -422
- package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +2437 -426
- 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 +16 -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/cli.js +2 -4
- 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/stop-resume-hook.js +3 -3
- 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/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/stop-resume-hook.ts +3 -3
- package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-continuation.test.ts +0 -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/codex-goal-instruction.test.ts +2 -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/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/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/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/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/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/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 +1 -1
- 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-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/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/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-dist/install-local.mjs +2601 -528
- 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/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 +1 -1
- 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/start-work/start-work-hook.d.ts +0 -23
- package/dist/plugin/chat-message/start-work-message.d.ts +0 -5
- package/dist/tools/call-omo-agent/background-agent-executor.d.ts +0 -5
- 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/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/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
|
@@ -42,9 +42,7 @@ describe("ultrawork skill pointer", () => {
|
|
|
42
42
|
expect(context).toBe(buildUltraworkSkillPointer(skillFilePath));
|
|
43
43
|
expect(context.startsWith("<ultrawork-mode>")).toBe(true);
|
|
44
44
|
expect(context).toContain(skillFilePath);
|
|
45
|
-
expect(context).toContain("First user-visible line this turn MUST be exactly:");
|
|
46
45
|
expect(context).toContain("create_goal");
|
|
47
|
-
expect(context).not.toContain("Tier triage");
|
|
48
46
|
expect(Buffer.byteLength(context, "utf8")).toBeLessThan(POINTER_MAX_BYTES);
|
|
49
47
|
});
|
|
50
48
|
|
|
@@ -31,16 +31,17 @@ Conventions for human contributors and AI agents working on this repository.
|
|
|
31
31
|
|
|
32
32
|
## Layout
|
|
33
33
|
|
|
34
|
-
- `src/boulder-reader.ts`: reads `.omo/boulder.json`, resolves the active work for the session, re-exports `getPlanChecklist`/`PlanChecklist` from `plan-checklist.ts`. `readContinuationState` returns null
|
|
34
|
+
- `src/boulder-reader.ts`: reads `.omo/boulder.json`, resolves the active work for the session, re-exports `getPlanChecklist`/`PlanChecklist` from `plan-checklist.ts`. `readContinuationState` returns null in four cases: `boulder.json` is missing or unparseable, no work matches the session, the work status is not continuable (only `active` and `paused` continue - `completed`/`abandoned` stop), or `checklist.total === 0`.
|
|
35
35
|
- `src/plan-checklist.ts`: `PlanChecklist` (`completed`/`remaining`/`total`/`nextTaskLabel`) and `getPlanChecklist`/`parsePlanChecklist`. Counts structured `## TODOs` rows (`N. <title>`) and `## Final Verification Wave` rows (`F<number>. <title>`); falls back to simple top-level `- [ ]`/`- [x]` checkboxes. Skips fenced blocks and respects `#`/`##` section boundaries.
|
|
36
|
-
- `src/codex-hook.ts`: Stop/SubagentStop hook; fills `REMAINING_COUNT
|
|
36
|
+
- `src/codex-hook.ts`: Stop/SubagentStop hook; fills nine placeholders into `directive.md` - `PLAN_NAME`, `PLAN_PATH`, `BOULDER_PATH`, `REMAINING_COUNT`, `TOTAL_COUNT`, `NEXT_TASK_LABEL`, `WORKTREE_BLOCK`, `LEDGER_PATH`, `SESSION_ID`. `WORKTREE_BLOCK` renders empty when the work has no worktree. When `remaining === 0`, `nextTaskLabel` is null and renders as "none (final gate pending)".
|
|
37
|
+
- **Context-pressure suppression:** the hook reads `input.transcript_path` through the injected `ReadonlyFileSystem` and returns `""` (no continuation) when the transcript carries any context-pressure marker (`context compacted`, `context_length_exceeded`, `context_too_large`, `codex ran out of room in the model's context window`, and related phrasings). This is the safety valve against an infinite continuation loop once the context window is exhausted; it is pinned by a `#given context-window pressure` test.
|
|
37
38
|
- `directive.md`: directive template with placeholders, applied per invocation.
|
|
38
39
|
|
|
39
40
|
## Build and Hooks
|
|
40
41
|
|
|
41
42
|
- Build output goes to `dist/`.
|
|
42
43
|
- `hooks/hooks.json` registers Codex `Stop` and `SubagentStop` hooks.
|
|
43
|
-
- Hook commands run `node ${PLUGIN_ROOT}/components/
|
|
44
|
+
- Hook commands run `node ${PLUGIN_ROOT}/components/ulw-execute-continuation/dist/cli.js hook stop` and `node ${PLUGIN_ROOT}/components/ulw-execute-continuation/dist/cli.js hook subagent-stop`.
|
|
44
45
|
|
|
45
46
|
## Constraints
|
|
46
47
|
|
|
@@ -48,5 +49,5 @@ Conventions for human contributors and AI agents working on this repository.
|
|
|
48
49
|
- Never make a network call from the hook.
|
|
49
50
|
- Keep the directive in `directive.md`. Do not inline it into TypeScript files.
|
|
50
51
|
- The hook only continues sessions listed in `.omo/boulder.json` as `codex:<session_id>`.
|
|
51
|
-
- The hook yields no output when `last_assistant_message` starts with `<
|
|
52
|
+
- The hook yields no output when `last_assistant_message` starts with `<ulw-execute-blocked-external>`, or when that marker is the second line immediately after the mandatory `ULTRAWORK MODE ENABLED!` opener, so a conclusive external blocker can end the turn. Reject the marker everywhere else.
|
|
52
53
|
- The hook continues while the plan has a readable top-level checklist (`total > 0`). A fully-checked plan still blocks Stop until the final gate runs and the Boulder work is marked completed; an unreadable or empty checklist yields no output.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# codex-
|
|
1
|
+
# codex-ulw-execute-continuation
|
|
2
2
|
|
|
3
|
-
Codex Stop-hook continuation injector for the omo-codex `
|
|
3
|
+
Codex Stop-hook continuation injector for the omo-codex `ulw-execute` skill.
|
|
4
4
|
|
|
5
5
|
It reads `.omo/boulder.json` in the hook payload `cwd`, resolves the active work, inspects the active plan's top-level checklist, and emits Codex Stop-hook JSON while the plan still has unchecked tasks or its final review/debugging gate remains pending:
|
|
6
6
|
|
|
@@ -8,13 +8,13 @@ It reads `.omo/boulder.json` in the hook payload `cwd`, resolves the active work
|
|
|
8
8
|
{"decision":"block","reason":"<directive>"}
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
-
The `reason` is loaded from `directive.md` on every invocation and filled with current plan state. The hook returns no output when `stop_hook_active` is `true`, when `last_assistant_message` starts with `<
|
|
11
|
+
The `reason` is loaded from `directive.md` on every invocation and filled with current plan state. The hook returns no output when `stop_hook_active` is `true`, when `last_assistant_message` starts with `<ulw-execute-blocked-external>` (or places it immediately after the mandatory `ULTRAWORK MODE ENABLED!` opener), when no active Boulder work exists, when the work is completed, when the active work is not tied to `codex:<session_id>`, or when the plan has no readable top-level checklist. An active plan whose checklist is fully checked still blocks Stop until the final gate runs and Boulder is marked completed.
|
|
12
12
|
|
|
13
13
|
## External blocker escape hatch
|
|
14
14
|
|
|
15
|
-
A plan can stall on something no amount of retrying fixes: a missing credential, missing hardware, a revoked authorization, an unavailable third-party service. `directive.md` instructs the agent to write `<
|
|
15
|
+
A plan can stall on something no amount of retrying fixes: a missing credential, missing hardware, a revoked authorization, an unavailable third-party service. `directive.md` instructs the agent to write `<ulw-execute-blocked-external>` as the entire first line of its answer in that case, or as the entire second line when ultrawork's mandatory opener occupies the first. The hook recognizes those structural forms and lets the turn end so the user can act, instead of continuing the same unchanged external-state check forever. Merely discussing the marker later in an answer still continues the plan.
|
|
16
16
|
|
|
17
|
-
This pairs with the `
|
|
17
|
+
This pairs with the `ulw-execute` skill at `plugin/skills/ulw-execute/SKILL.md`. That skill writes `.omo/boulder.json` with Codex session ids prefixed as `codex:` so the hook can continue only its own active Codex session.
|
|
18
18
|
|
|
19
19
|
## Counted plan checkboxes
|
|
20
20
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$schema": "https://biomejs.dev/schemas/2.
|
|
2
|
+
"$schema": "https://biomejs.dev/schemas/2.5.9/schema.json",
|
|
3
3
|
"linter": {
|
|
4
4
|
"enabled": true,
|
|
5
5
|
"rules": {
|
|
6
|
-
"
|
|
6
|
+
"preset": "recommended",
|
|
7
7
|
"style": {
|
|
8
8
|
"noDefaultExport": "error",
|
|
9
9
|
"noEnum": "error",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<
|
|
1
|
+
<ulw-execute-continuation>
|
|
2
2
|
|
|
3
3
|
You are mid-flight on a Prometheus work plan; this turn is an automatic continuation. Do NOT ask whether to continue — the contract is auto-continue until every top-level checkbox is `- [x]`.
|
|
4
4
|
|
|
@@ -17,8 +17,8 @@ You are mid-flight on a Prometheus work plan; this turn is an automatic continua
|
|
|
17
17
|
|
|
18
18
|
1. Read `{{PLAN_PATH}}` AND `{{LEDGER_PATH}}` first — they are the only sources of truth for what remains and what evidence exists; do not trust your memory of prior turns.
|
|
19
19
|
2. When the remaining count is `0`, skip checkbox execution and perform the Final gate now. Otherwise, pick the FIRST unchecked top-level checkbox in `## TODOs` or `## Final Verification Wave`. Ignore nested checkboxes under Acceptance Criteria / Evidence / Definition of Done.
|
|
20
|
-
3. Follow the `
|
|
21
|
-
4. Apply the checkbox's tier from its ledger entry, or classify it now per the
|
|
20
|
+
3. Follow the `ulw-execute` skill in full. The skill is already loaded from your earlier turn — re-read its file at `packages/omo-codex/plugin/skills/ulw-execute/SKILL.md` if you have lost context.
|
|
21
|
+
4. Apply the checkbox's tier from its ledger entry, or classify it now per the ulw-execute skill: LIGHT (default — a narrow change inside existing layers) needs one real-surface proof of the deliverable, with auxiliary surfaces first-class for CLI- or data-shaped work, and only trigger-mapped adversarial classes; HEAVY (new module/abstraction, auth/security, external integration, schema/migration, concurrency, cross-domain refactor, care signals) takes the full per-criterion regime. When unsure, take HEAVY; never downgrade.
|
|
22
22
|
5. Decompose the checkbox into atomic sub-tasks. Dispatch them in PARALLEL via `multi_agent_v1.spawn_agent` calls in this same response unless a sub-task has a NAMED blocking dependency (input from another sub-task or shared file). Use `fork_context: false` unless full history is truly required. Put role and specialty instructions inside `message`. Flat `spawn_agent` requiring `task_name` instead (`multi_agent_v2`)? Add `"task_name"`, use `fork_turns: "none"`, `wait_agent` takes only `timeout_ms`, finished agents end on their own.
|
|
23
23
|
6. Every sub-task message MUST be self-contained, executable, not a context handoff: start with `TASK: <imperative assignment>`, then name `DELIVERABLE`, `SCOPE`, and `VERIFY`. It must include all 7 sections and a Manual-QA channel with exact invocation (`curl`, `send-keys`, `browser:control-in-app-browser` action, `page.click`) and PASS/FAIL observable, plus ultraqa classes, artifact, and cleanup receipt. Channels: HTTP (`curl -i`); terminal/TUI (`send-keys` for boot smoke; xterm.js web terminal for color/visual evidence, never `tmux capture-pane`); browser (Codex: `browser:control-in-app-browser` first unless auth/persistent profile needed; else Chrome/agent-browser); computer use.
|
|
24
24
|
7. Treat every worker DoneClaim as untrusted input. Run independent AdversarialVerify before any checkbox can become FullyDone; `confirmed` is the only pass verdict, while `false-positive`, `needs-fix`, and `needs-human-review` loop back to the executor with exact feedback.
|
|
@@ -32,7 +32,7 @@ You are mid-flight on a Prometheus work plan; this turn is an automatic continua
|
|
|
32
32
|
- No `--dry-run` as evidence. No "should work". No "tests pass" as completion proof.
|
|
33
33
|
- TUI visual evidence MUST render through the real xterm.js web terminal, never `tmux capture-pane`: run `node script/qa/web-terminal-visual-qa.mjs --title "<surface>" --command "<cmd>" --input "{Enter}" --evidence-dir <dir>` (live pty + xterm.js in Chrome; `--from-file <capture>` replays a raw stream), then cite `terminal.png`, `terminal.txt`, and `metadata.json`.
|
|
34
34
|
- No `as any` / `@ts-ignore` / `@ts-expect-error`. No deleting failing tests.
|
|
35
|
-
- Probe every ultraqa adversarial class whose trigger fact holds (malformed input, prompt injection, cancel/resume, stale state, dirty worktree, hung or long commands, flaky tests, misleading success output, repeated interruptions — trigger map in the
|
|
35
|
+
- Probe every ultraqa adversarial class whose trigger fact holds (malformed input, prompt injection, cancel/resume, stale state, dirty worktree, hung or long commands, flaky tests, misleading success output, repeated interruptions — trigger map in the ulw-execute skill) and capture the observable for each. A clean happy-path artifact alone is NOT a PASS when an applicable class went unprobed; record skipped classes with a one-line not-applicable reason.
|
|
36
36
|
- Cleanup receipt is mandatory. Register each QA teardown (scripts, tmux, browser contexts, PIDs, ports, containers, temp dirs) as a todo when it spawns, then execute it. Leftover QA state = BLOCKED, not PASS.
|
|
37
37
|
- The worktree path (if set in boulder.json) governs every file edit and command. Do not stray into the main repo.
|
|
38
38
|
- PR or branch implementation/review/merge work requires a task-owned git worktree. Treat the main worktree as read-only context.
|
|
@@ -45,7 +45,7 @@ Before completion, satisfy all five `review-work` lanes and a `debugging` runtim
|
|
|
45
45
|
# Stop conditions for THIS turn
|
|
46
46
|
|
|
47
47
|
- A top-level checkbox flipped to `- [x]` after the 5-phase QA gate (Phase 1 read, Phase 2 automated, Phase 3 channel scenario, Phase 4 adversarial-class probing, Phase 5 gate decision). Then the Stop hook will re-evaluate; if more checkboxes remain you will be continued again.
|
|
48
|
-
- A conclusive external blocker only the user or external state can clear (missing hardware, credential, authorization, or an unavailable service) → after ONE authoritative check, stop retrying and stop reviewer dispatch. Write `<
|
|
48
|
+
- A conclusive external blocker only the user or external state can clear (missing hardware, credential, authorization, or an unavailable service) → after ONE authoritative check, stop retrying and stop reviewer dispatch. Write `<ulw-execute-blocked-external>` as the entire first line of your answer, then state the exact blocker and the observable condition that resumes the work. If ultrawork requires `ULTRAWORK MODE ENABLED!` as the first line, put the blocker marker alone on the second line instead. The Stop hook recognizes both forms and lets this turn end.
|
|
49
49
|
- 3 same-failure cycles on one agent-controllable sub-task → escalate via `multi_agent_v1.spawn_agent({"message":"TASK: act as a rigorous reviewer. DELIVERABLE: diagnose the repeated sub-task failure and recommend the next safe action. VERIFY: cite the failing evidence.","fork_context":false})` and stop dispatch.
|
|
50
50
|
- Safety boundary (destructive command, secret exfiltration, production write) → stop and surface a safe substitute.
|
|
51
51
|
- All top-level checkboxes `- [x]` AND the Global Review and Debugging Gate passed → print the ORCHESTRATION COMPLETE block and end.
|
|
@@ -57,4 +57,4 @@ Before completion, satisfy all five `review-work` lanes and a `debugging` runtim
|
|
|
57
57
|
|
|
58
58
|
Begin now. If no checkbox remains, run the Final gate; otherwise pick the next checkbox, dispatch the parallel sub-agents, verify, mark, continue.
|
|
59
59
|
|
|
60
|
-
</
|
|
60
|
+
</ulw-execute-continuation>
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
// components/
|
|
3
|
+
// components/ulw-execute-continuation/src/cli.ts
|
|
4
4
|
import { readFileSync as readFileSync4 } from "node:fs";
|
|
5
5
|
import { stdin as processStdin, stdout as processStdout } from "node:process";
|
|
6
6
|
|
|
7
|
-
// components/
|
|
7
|
+
// components/ulw-execute-continuation/src/boulder-reader.ts
|
|
8
8
|
import { existsSync as existsSync2, readFileSync as readFileSync2 } from "node:fs";
|
|
9
9
|
import { isAbsolute, join, relative, resolve } from "node:path";
|
|
10
10
|
|
|
11
|
-
// components/
|
|
11
|
+
// components/ulw-execute-continuation/src/plan-checklist.ts
|
|
12
12
|
import { existsSync, readFileSync } from "node:fs";
|
|
13
13
|
var TODO_HEADING_PATTERN = /^##[ \t]+TODOs(?:[ \t]+#+)?[ \t]*$/i;
|
|
14
14
|
var FINAL_VERIFICATION_HEADING_PATTERN = /^##[ \t]+Final Verification Wave(?:[ \t]+#+)?[ \t]*$/i;
|
|
@@ -153,7 +153,7 @@ function emptyChecklist() {
|
|
|
153
153
|
return { completed: 0, remaining: 0, total: 0, nextTaskLabel: null };
|
|
154
154
|
}
|
|
155
155
|
|
|
156
|
-
// components/
|
|
156
|
+
// components/ulw-execute-continuation/src/boulder-reader.ts
|
|
157
157
|
var SESSION_ID_PREFIX_PATTERN = /^(codex|opencode):/;
|
|
158
158
|
function readContinuationState(cwd, sessionId) {
|
|
159
159
|
const boulderPath = getBoulderFilePath(cwd);
|
|
@@ -171,7 +171,7 @@ function readContinuationState(cwd, sessionId) {
|
|
|
171
171
|
planName: work.planName,
|
|
172
172
|
planPath,
|
|
173
173
|
boulderPath,
|
|
174
|
-
ledgerPath: join(cwd, ".omo", "
|
|
174
|
+
ledgerPath: join(cwd, ".omo", "ulw-execute", "ledger.jsonl"),
|
|
175
175
|
worktreePath: work.worktreePath ?? null,
|
|
176
176
|
checklist
|
|
177
177
|
};
|
|
@@ -297,11 +297,11 @@ function isRecord(value) {
|
|
|
297
297
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
298
298
|
}
|
|
299
299
|
|
|
300
|
-
// components/
|
|
300
|
+
// components/ulw-execute-continuation/src/directive.ts
|
|
301
301
|
import { readFileSync as readFileSync3 } from "node:fs";
|
|
302
|
-
var
|
|
302
|
+
var ULW_EXECUTE_CONTINUATION_DIRECTIVE = readFileSync3(new URL("../directive.md", import.meta.url), "utf8");
|
|
303
303
|
|
|
304
|
-
// components/
|
|
304
|
+
// components/ulw-execute-continuation/src/codex-hook.ts
|
|
305
305
|
function runStopHook(input, fs) {
|
|
306
306
|
if (!isStopInput(input))
|
|
307
307
|
return "";
|
|
@@ -333,13 +333,13 @@ function renderDirective(state, sessionId) {
|
|
|
333
333
|
LEDGER_PATH: state.ledgerPath,
|
|
334
334
|
SESSION_ID: sessionId
|
|
335
335
|
};
|
|
336
|
-
let rendered =
|
|
336
|
+
let rendered = ULW_EXECUTE_CONTINUATION_DIRECTIVE;
|
|
337
337
|
for (const [placeholder, value] of Object.entries(replacements)) {
|
|
338
338
|
rendered = rendered.replaceAll(`{{${placeholder}}}`, value);
|
|
339
339
|
}
|
|
340
340
|
return rendered;
|
|
341
341
|
}
|
|
342
|
-
var EXTERNAL_BLOCKER_MARKER = "<
|
|
342
|
+
var EXTERNAL_BLOCKER_MARKER = "<ulw-execute-blocked-external>";
|
|
343
343
|
var ULTRAWORK_OPENER = "ULTRAWORK MODE ENABLED!";
|
|
344
344
|
function hasAllowedExternalBlockerMarker(lastAssistantMessage) {
|
|
345
345
|
if (lastAssistantMessage === undefined)
|
|
@@ -387,7 +387,7 @@ function isRecord2(value) {
|
|
|
387
387
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
388
388
|
}
|
|
389
389
|
|
|
390
|
-
// components/
|
|
390
|
+
// components/ulw-execute-continuation/src/cli.ts
|
|
391
391
|
var nodeFileSystem = {
|
|
392
392
|
readFileSync(path, encoding) {
|
|
393
393
|
return readFileSync4(path, encoding);
|
|
@@ -398,7 +398,7 @@ var subcommand = process.argv[3];
|
|
|
398
398
|
if (command === "hook" && (subcommand === "stop" || subcommand === "subagent-stop")) {
|
|
399
399
|
await runHookCli();
|
|
400
400
|
} else {
|
|
401
|
-
process.stderr.write(`Usage: omo-
|
|
401
|
+
process.stderr.write(`Usage: omo-ulw-execute-continuation hook <stop|subagent-stop>
|
|
402
402
|
`);
|
|
403
403
|
process.exitCode = 1;
|
|
404
404
|
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"hooks": {
|
|
3
|
+
"Stop": [
|
|
4
|
+
{
|
|
5
|
+
"hooks": [
|
|
6
|
+
{
|
|
7
|
+
"type": "command",
|
|
8
|
+
"command": "node \"${PLUGIN_ROOT}/components/ulw-execute-continuation/dist/cli.js\" hook stop",
|
|
9
|
+
"timeout": 10,
|
|
10
|
+
"statusMessage": "(OmO 5.0.0-beta.21) Checking Ulw-Execute Continuation"
|
|
11
|
+
}
|
|
12
|
+
]
|
|
13
|
+
}
|
|
14
|
+
],
|
|
15
|
+
"SubagentStop": [
|
|
16
|
+
{
|
|
17
|
+
"hooks": [
|
|
18
|
+
{
|
|
19
|
+
"type": "command",
|
|
20
|
+
"command": "node \"${PLUGIN_ROOT}/components/ulw-execute-continuation/dist/cli.js\" hook subagent-stop",
|
|
21
|
+
"timeout": 10,
|
|
22
|
+
"statusMessage": "(OmO 5.0.0-beta.21) Checking Ulw-Execute Continuation"
|
|
23
|
+
}
|
|
24
|
+
]
|
|
25
|
+
}
|
|
26
|
+
]
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -1,28 +1,28 @@
|
|
|
1
1
|
{
|
|
2
|
-
"name": "@code-yeongyu/codex-
|
|
3
|
-
"version": "5.0.0-beta.
|
|
4
|
-
"description": "Codex Stop hook continuation injector for omo-codex
|
|
2
|
+
"name": "@code-yeongyu/codex-ulw-execute-continuation",
|
|
3
|
+
"version": "5.0.0-beta.21",
|
|
4
|
+
"description": "Codex Stop hook continuation injector for omo-codex ulw-execute plans.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"packageManager": "npm@11.12.1",
|
|
7
7
|
"license": "MIT",
|
|
8
|
-
"homepage": "https://github.com/code-yeongyu/codex-
|
|
8
|
+
"homepage": "https://github.com/code-yeongyu/codex-ulw-execute-continuation",
|
|
9
9
|
"repository": {
|
|
10
10
|
"type": "git",
|
|
11
|
-
"url": "git+https://github.com/code-yeongyu/codex-
|
|
11
|
+
"url": "git+https://github.com/code-yeongyu/codex-ulw-execute-continuation.git"
|
|
12
12
|
},
|
|
13
13
|
"bugs": {
|
|
14
|
-
"url": "https://github.com/code-yeongyu/codex-
|
|
14
|
+
"url": "https://github.com/code-yeongyu/codex-ulw-execute-continuation/issues"
|
|
15
15
|
},
|
|
16
16
|
"keywords": [
|
|
17
17
|
"codex",
|
|
18
18
|
"codex-plugin",
|
|
19
|
-
"
|
|
19
|
+
"ulw-execute",
|
|
20
20
|
"continuation",
|
|
21
21
|
"hooks",
|
|
22
22
|
"boulder"
|
|
23
23
|
],
|
|
24
24
|
"bin": {
|
|
25
|
-
"omo-
|
|
25
|
+
"omo-ulw-execute-continuation": "./dist/cli.js"
|
|
26
26
|
},
|
|
27
27
|
"scripts": {
|
|
28
28
|
"build": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\" && bun build src/cli.ts --target node --format esm --outfile dist/cli.js",
|
|
@@ -42,10 +42,10 @@
|
|
|
42
42
|
"NOTICE"
|
|
43
43
|
],
|
|
44
44
|
"devDependencies": {
|
|
45
|
-
"@biomejs/biome": "2.
|
|
46
|
-
"@types/node": "^
|
|
47
|
-
"typescript": "^
|
|
48
|
-
"vitest": "^4.1.
|
|
45
|
+
"@biomejs/biome": "2.5.9",
|
|
46
|
+
"@types/node": "^26.2.0",
|
|
47
|
+
"typescript": "^7.0.2",
|
|
48
|
+
"vitest": "^4.1.11"
|
|
49
49
|
},
|
|
50
50
|
"engines": {
|
|
51
51
|
"node": ">=20.0.0"
|
|
@@ -50,7 +50,7 @@ export function readContinuationState(cwd: string, sessionId: string): Continuat
|
|
|
50
50
|
planName: work.planName,
|
|
51
51
|
planPath,
|
|
52
52
|
boulderPath,
|
|
53
|
-
ledgerPath: join(cwd, ".omo", "
|
|
53
|
+
ledgerPath: join(cwd, ".omo", "ulw-execute", "ledger.jsonl"),
|
|
54
54
|
worktreePath: work.worktreePath ?? null,
|
|
55
55
|
checklist,
|
|
56
56
|
};
|
|
@@ -17,7 +17,7 @@ const subcommand = process.argv[3];
|
|
|
17
17
|
if (command === "hook" && (subcommand === "stop" || subcommand === "subagent-stop")) {
|
|
18
18
|
await runHookCli();
|
|
19
19
|
} else {
|
|
20
|
-
process.stderr.write("Usage: omo-
|
|
20
|
+
process.stderr.write("Usage: omo-ulw-execute-continuation hook <stop|subagent-stop>\n");
|
|
21
21
|
process.exitCode = 1;
|
|
22
22
|
}
|
|
23
23
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { ContinuationState } from "./boulder-reader.js";
|
|
2
2
|
import { readContinuationState } from "./boulder-reader.js";
|
|
3
|
-
import {
|
|
3
|
+
import { ULW_EXECUTE_CONTINUATION_DIRECTIVE } from "./directive.js";
|
|
4
4
|
import type { ReadonlyFileSystem, StopHookEventName, StopHookOutput, StopInput } from "./types.js";
|
|
5
5
|
|
|
6
6
|
export function runStopHook(input: unknown, fs: ReadonlyFileSystem): string {
|
|
@@ -33,14 +33,14 @@ function renderDirective(state: ContinuationState, sessionId: string): string {
|
|
|
33
33
|
LEDGER_PATH: state.ledgerPath,
|
|
34
34
|
SESSION_ID: sessionId,
|
|
35
35
|
} as const;
|
|
36
|
-
let rendered =
|
|
36
|
+
let rendered = ULW_EXECUTE_CONTINUATION_DIRECTIVE;
|
|
37
37
|
for (const [placeholder, value] of Object.entries(replacements)) {
|
|
38
38
|
rendered = rendered.replaceAll(`{{${placeholder}}}`, value);
|
|
39
39
|
}
|
|
40
40
|
return rendered;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
const EXTERNAL_BLOCKER_MARKER = "<
|
|
43
|
+
const EXTERNAL_BLOCKER_MARKER = "<ulw-execute-blocked-external>";
|
|
44
44
|
const ULTRAWORK_OPENER = "ULTRAWORK MODE ENABLED!";
|
|
45
45
|
|
|
46
46
|
// The marker alone is not enough to end the turn. `directive.md` requires the exact blocker and
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export type { ContinuationState, PlanChecklist } from "./boulder-reader.js";
|
|
2
2
|
export { readContinuationState } from "./boulder-reader.js";
|
|
3
3
|
export { runStopHook } from "./codex-hook.js";
|
|
4
|
-
export {
|
|
4
|
+
export { ULW_EXECUTE_CONTINUATION_DIRECTIVE } from "./directive.js";
|
|
5
5
|
export type { ReadonlyFileSystem, StopHookEventName, StopHookOutput, StopInput } from "./types.js";
|
|
@@ -11,7 +11,7 @@ afterEach(() => {
|
|
|
11
11
|
for (const root of cleanupRoots.splice(0)) rmSync(root, { recursive: true, force: true });
|
|
12
12
|
});
|
|
13
13
|
|
|
14
|
-
describe("
|
|
14
|
+
describe("ulw-execute plan checklist consumption", () => {
|
|
15
15
|
it("#given scaffold headings and canonical numbered rows #when parsed #then structured totals and next label match", () => {
|
|
16
16
|
// given
|
|
17
17
|
const planPath = createPlan(SCAFFOLD_PLAN_MARKDOWN);
|
|
@@ -242,7 +242,7 @@ describe("start-work plan checklist consumption", () => {
|
|
|
242
242
|
});
|
|
243
243
|
});
|
|
244
244
|
|
|
245
|
-
describe("
|
|
245
|
+
describe("ulw-execute boulder state reader", () => {
|
|
246
246
|
it("#given active codex work with remaining checklist #when state is read #then continuation fields match baseline", () => {
|
|
247
247
|
// given
|
|
248
248
|
const workspace = createWorkspace({
|
|
@@ -258,7 +258,7 @@ describe("start-work boulder state reader", () => {
|
|
|
258
258
|
planName: "launch-plan",
|
|
259
259
|
planPath: join(workspace, ".omo", "plans", "plan.md"),
|
|
260
260
|
boulderPath: join(workspace, ".omo", "boulder.json"),
|
|
261
|
-
ledgerPath: join(workspace, ".omo", "
|
|
261
|
+
ledgerPath: join(workspace, ".omo", "ulw-execute", "ledger.jsonl"),
|
|
262
262
|
worktreePath: null,
|
|
263
263
|
checklist: {
|
|
264
264
|
completed: 2,
|
|
@@ -12,7 +12,7 @@ afterEach(() => {
|
|
|
12
12
|
for (const root of cleanupRoots.splice(0)) rmSync(root, { recursive: true, force: true });
|
|
13
13
|
});
|
|
14
14
|
|
|
15
|
-
describe("
|
|
15
|
+
describe("ulw-execute continuation CLI", () => {
|
|
16
16
|
it("#given valid Stop stdin #when CLI runs #then stdout contains block JSON", () => {
|
|
17
17
|
// given
|
|
18
18
|
const cwd = createWorkspace(["codex:s1"]);
|
|
@@ -26,9 +26,6 @@ describe("start-work continuation CLI", () => {
|
|
|
26
26
|
expect(result.status).toBe(0);
|
|
27
27
|
const output = parseStopHookOutput(result.stdout);
|
|
28
28
|
expect(output.decision).toBe("block");
|
|
29
|
-
expect(output.reason).toContain("Remaining top-level checkboxes: `2` of `4`");
|
|
30
|
-
expect(output.reason).toContain("Next incomplete task: `1. Implement checklist parser parity`");
|
|
31
|
-
expect(output.reason).toContain("Your session id in boulder.json: `codex:s1`");
|
|
32
29
|
});
|
|
33
30
|
|
|
34
31
|
it("#given valid SubagentStop stdin #when CLI runs #then stdout contains block JSON", () => {
|
|
@@ -14,7 +14,7 @@ afterEach(() => {
|
|
|
14
14
|
for (const root of cleanupRoots.splice(0)) rmSync(root, { recursive: true, force: true });
|
|
15
15
|
});
|
|
16
16
|
|
|
17
|
-
describe("
|
|
17
|
+
describe("ulw-execute Stop hook", () => {
|
|
18
18
|
it("#given stop hook is already active #when hook runs #then returns empty output", () => {
|
|
19
19
|
// given
|
|
20
20
|
const fs = createMemoryFs();
|
|
@@ -58,16 +58,7 @@ describe("start-work Stop hook", () => {
|
|
|
58
58
|
const output = runStopHook(createStopInput(workspace), fs);
|
|
59
59
|
|
|
60
60
|
// then
|
|
61
|
-
|
|
62
|
-
expect(parsed.decision).toBe("block");
|
|
63
|
-
expect(parsed.reason).toContain("- Plan: `launch-plan`");
|
|
64
|
-
expect(parsed.reason).toContain(`- Plan file: \`${join(workspace, ".omo", "plans", "plan.md")}\``);
|
|
65
|
-
expect(parsed.reason).toContain(`- Boulder state: \`${join(workspace, ".omo", "boulder.json")}\``);
|
|
66
|
-
expect(parsed.reason).toContain("- Remaining top-level checkboxes: `2` of `4`");
|
|
67
|
-
expect(parsed.reason).toContain("- Next incomplete task: `1. Implement checklist parser parity`");
|
|
68
|
-
expect(parsed.reason).toContain("- Worktree: `/tmp/worktree`");
|
|
69
|
-
expect(parsed.reason).toContain(`- Ledger: \`${join(workspace, ".omo", "start-work", "ledger.jsonl")}\``);
|
|
70
|
-
expect(parsed.reason).toContain("- Your session id in boulder.json: `codex:sess_abc`");
|
|
61
|
+
expect(parseBlockOutput(output).decision).toBe("block");
|
|
71
62
|
});
|
|
72
63
|
|
|
73
64
|
it("#given active codex work and an external-blocker marker #when hook runs #then returns empty output", () => {
|
|
@@ -80,7 +71,7 @@ describe("start-work Stop hook", () => {
|
|
|
80
71
|
const input = {
|
|
81
72
|
...createStopInput(workspace),
|
|
82
73
|
last_assistant_message: [
|
|
83
|
-
"<
|
|
74
|
+
"<ulw-execute-blocked-external>",
|
|
84
75
|
"Blocker: the staging deploy credential is missing.",
|
|
85
76
|
"Resume when a valid credential is provisioned.",
|
|
86
77
|
].join("\n"),
|
|
@@ -104,7 +95,7 @@ describe("start-work Stop hook", () => {
|
|
|
104
95
|
...createStopInput(workspace),
|
|
105
96
|
last_assistant_message: [
|
|
106
97
|
"ULTRAWORK MODE ENABLED!",
|
|
107
|
-
"<
|
|
98
|
+
"<ulw-execute-blocked-external>",
|
|
108
99
|
"Blocker: the staging deploy credential is missing.",
|
|
109
100
|
].join("\n"),
|
|
110
101
|
};
|
|
@@ -127,7 +118,7 @@ describe("start-work Stop hook", () => {
|
|
|
127
118
|
const fs = createMemoryFs();
|
|
128
119
|
const input = {
|
|
129
120
|
...createStopInput(workspace),
|
|
130
|
-
last_assistant_message: "<
|
|
121
|
+
last_assistant_message: "<ulw-execute-blocked-external>",
|
|
131
122
|
};
|
|
132
123
|
|
|
133
124
|
// when
|
|
@@ -146,7 +137,7 @@ describe("start-work Stop hook", () => {
|
|
|
146
137
|
const fs = createMemoryFs();
|
|
147
138
|
const input = {
|
|
148
139
|
...createStopInput(workspace),
|
|
149
|
-
last_assistant_message: ["ULTRAWORK MODE ENABLED!", "<
|
|
140
|
+
last_assistant_message: ["ULTRAWORK MODE ENABLED!", "<ulw-execute-blocked-external>", " "].join("\n"),
|
|
150
141
|
};
|
|
151
142
|
|
|
152
143
|
// when
|
|
@@ -165,7 +156,7 @@ describe("start-work Stop hook", () => {
|
|
|
165
156
|
const fs = createMemoryFs();
|
|
166
157
|
const input = {
|
|
167
158
|
...createStopInput(workspace),
|
|
168
|
-
last_assistant_message: ["Next turn I may need to emit", "<
|
|
159
|
+
last_assistant_message: ["Next turn I may need to emit", "<ulw-execute-blocked-external>"].join("\n"),
|
|
169
160
|
};
|
|
170
161
|
|
|
171
162
|
// when
|
|
@@ -187,12 +178,7 @@ describe("start-work Stop hook", () => {
|
|
|
187
178
|
const output = runStopHook(createStopInput(workspace), fs);
|
|
188
179
|
|
|
189
180
|
// then
|
|
190
|
-
|
|
191
|
-
expect(parsed.decision).toBe("block");
|
|
192
|
-
expect(parsed.reason).toContain("- Remaining top-level checkboxes: `0` of `1`");
|
|
193
|
-
expect(parsed.reason).toContain("- Next incomplete task: `none (final gate pending)`");
|
|
194
|
-
expect(parsed.reason).toContain("When the remaining count is `0`, skip checkbox execution");
|
|
195
|
-
expect(parsed.reason).toContain("re-read the ledger record and verify the exact lane/SHA pair");
|
|
181
|
+
expect(parseBlockOutput(output).decision).toBe("block");
|
|
196
182
|
});
|
|
197
183
|
|
|
198
184
|
it("#given context-window pressure in transcript #when hook runs #then it does not inject continuation text", () => {
|
|
@@ -42,7 +42,23 @@ Conventions for human contributors and AI agents working on this repository.
|
|
|
42
42
|
- CLI commands use the `omo-agent-toolkit ulw-loop` form.
|
|
43
43
|
- Do not use any alternate legacy CLI alias anywhere.
|
|
44
44
|
|
|
45
|
+
## Layout
|
|
46
|
+
|
|
47
|
+
- `src/cli.ts`: bin entry (`omo-ulw-loop`, `ulw`, `ulw-loop` all map to `dist/cli.js`); documented invocation form `omo-agent-toolkit ulw-loop <subcommand>`.
|
|
48
|
+
- `src/cli-commands.ts`: subcommand dispatch (`ULW_LOOP_SUBCOMMANDS`, `ulwLoopCommand`, flag/value readers).
|
|
49
|
+
- `src/plan-io.ts`: plan persistence, append-only `ledger.jsonl`, `withUlwLoopMutationLock`.
|
|
50
|
+
- `src/quality-gate.ts` (266 LOC), `src/checkpoint.ts` (260), `src/steering.ts` (227): state-transition hotspots (evidence containment, checkpoint reconciliation, steering mutations).
|
|
51
|
+
- `src/codex-hook.ts`: UserPromptSubmit steering injection + `create_goal` budget guard.
|
|
52
|
+
- `src/spawn-guard.ts`, `src/stop-resume-hook.ts`: spawn guards, Stop auto-resume.
|
|
53
|
+
- `src/ultrawork-skill-pointer.ts`: byte-identical mirror of ultrawork's pointer (pinned by `plugin/test/ultrawork-skill-pointer.test.mjs`).
|
|
54
|
+
- `directive.md`: runtime-read directive (never inlined into TypeScript).
|
|
55
|
+
|
|
45
56
|
## Build and Hooks
|
|
46
57
|
|
|
47
58
|
- Build output goes to `dist/`.
|
|
48
59
|
- `hooks/hooks.json` wires `hook user-prompt-submit --with-ultrawork` (UserPromptSubmit), `hook pre-tool-use` (create_goal budget), `hook pre-tool-use-spawn` (spawn guards), and `hook stop` (auto-resume).
|
|
60
|
+
|
|
61
|
+
## Commands
|
|
62
|
+
|
|
63
|
+
- `npm test` (vitest --run) / `npm run test:watch`; focused: `bunx vitest run test/<file>.test.ts`
|
|
64
|
+
- `npm run typecheck` / `npm run lint` / `npm run build` (`tsc -p tsconfig.build.json`) / `npm run check`
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
- Bundled `directive.md` picks up the ultrawork test-proportionality change: the execution-loop PIN step asks for characterization pins only when refactoring behavior whose regressions the change could hide. Stays byte-identical to `prompts-core/ultrawork/codex.md` and the ultrawork component's `directive.md`.
|
|
6
6
|
|
|
7
|
-
- **Hooks:** new `Stop` hook auto-resumes a turn that died with unfinished goals (defers to
|
|
7
|
+
- **Hooks:** new `Stop` hook auto-resumes a turn that died with unfinished goals (defers to ulw-execute-continuation while its plan has remaining tasks, bails under context pressure, and caps at two resumes without ledger movement via a separate `.stuck` marker). New `PreToolUse` spawn guard adds a per-session fan-out cap (`OMO_SPAWN_FANOUT_LIMIT`, default 60) and denies final gate-reviewer spawns while the reviewer artifacts the gate audits are missing.
|
|
8
8
|
|
|
9
9
|
- **Memory:** steering ledger entries no longer embed the full plan four times (`before`/`after` at both the audit and entry level). Accepted steers now record a compact `UlwLoopSteeringPlanSnapshot` (plan counters + only the goals the mutation touched), shrinking a measured real-world entry from 189KB to 7.8KB (~24x) and ending quadratic `ledger.jsonl` growth over long runs.
|
|
10
10
|
- **Memory:** steering dedup (`--idempotency-key` / `promptSignature`) streams the ledger line-by-line with a substring pre-filter instead of `JSON.parse`-ing every entry into memory; dedup returns strip legacy full-plan `before`/`after` payloads from re-surfaced audits. `readSteeringLedgerEntries` streams too.
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$schema": "https://biomejs.dev/schemas/2.
|
|
2
|
+
"$schema": "https://biomejs.dev/schemas/2.5.9/schema.json",
|
|
3
3
|
"linter": {
|
|
4
4
|
"enabled": true,
|
|
5
5
|
"rules": {
|
|
6
|
-
"
|
|
6
|
+
"preset": "recommended",
|
|
7
7
|
"style": {
|
|
8
8
|
"noDefaultExport": "error",
|
|
9
9
|
"noEnum": "error",
|
|
@@ -66,7 +66,13 @@ exercises the surface; capture the artifact.
|
|
|
66
66
|
if Chrome is not available, download and use agent-browser
|
|
67
67
|
(https://github.com/vercel-labs/agent-browser). Capture action
|
|
68
68
|
log + screenshot path. Never downgrade to a non-browser surface
|
|
69
|
-
for a browser-facing criterion.
|
|
69
|
+
for a browser-facing criterion. NEVER clear cookies, cache, or
|
|
70
|
+
site data (`Network.clearBrowserCookies`, `Storage.clearCookies`,
|
|
71
|
+
`chrome.browsingData.remove`, "clear browsing data") on the user's
|
|
72
|
+
real/main browser profile — it wipes their logged-in state. If you
|
|
73
|
+
need that profile's login state, clone it first (`rsync -a
|
|
74
|
+
<profile>/ <tmp-clone>/`) and launch Chrome / agent-browser against
|
|
75
|
+
the clone as the user-data-dir; run any clearing there only.
|
|
70
76
|
4. Computer use — when the surface is a desktop/GUI app rather than a
|
|
71
77
|
page, drive it via OS-level automation (a computer-use agent,
|
|
72
78
|
AppleScript, xdotool, etc.) against the running app; capture
|
|
@@ -126,6 +132,12 @@ exactly `objective`; do not include `status`. Only when no goal tool
|
|
|
126
132
|
exists on this surface, open your reply with a `# Goal` block treated
|
|
127
133
|
as binding. Goals are unlimited; never invent a numeric budget or
|
|
128
134
|
limit.
|
|
135
|
+
Check `get_goal` first: continue a matching active goal instead of
|
|
136
|
+
duplicating one; surface a conflicting one. Write the objective
|
|
137
|
+
outcome-first: the concrete thing that will be TRUE when done (an
|
|
138
|
+
outcome, never an activity), the named deliverable surfaces, and
|
|
139
|
+
explicit scope bounds — a vague objective produces vague criteria,
|
|
140
|
+
and vague criteria cannot be proven.
|
|
129
141
|
The criteria MUST list, upfront:
|
|
130
142
|
- The user-visible deliverable in one line, and the tier with its
|
|
131
143
|
justification.
|
|
@@ -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"),
|
|
@@ -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"),
|