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
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
textField,
|
|
11
11
|
} from "./quality-gate-fields.js";
|
|
12
12
|
import { adversarialVerdict, codeQualityStatusField, passedVerdict } from "./quality-gate-verdicts.js";
|
|
13
|
+
import { reviewerRolesFor, type UlwLoopToolkitSurface } from "./surface.js";
|
|
13
14
|
import type {
|
|
14
15
|
UlwLoopManualQaArtifactKind,
|
|
15
16
|
UlwLoopManualQaArtifactRef,
|
|
@@ -17,12 +18,6 @@ import type {
|
|
|
17
18
|
UlwLoopQualityGate,
|
|
18
19
|
} from "./types.js";
|
|
19
20
|
|
|
20
|
-
const REVIEWER_ROLES = {
|
|
21
|
-
codeReview: "lazycodex-code-reviewer",
|
|
22
|
-
manualQa: "lazycodex-qa-executor",
|
|
23
|
-
gateReview: "lazycodex-gate-reviewer",
|
|
24
|
-
} as const;
|
|
25
|
-
|
|
26
21
|
export {
|
|
27
22
|
classifyExternalAuthorizationBlocker,
|
|
28
23
|
clearGoalBlockerFields,
|
|
@@ -36,12 +31,13 @@ export interface QualityGateFs {
|
|
|
36
31
|
}
|
|
37
32
|
|
|
38
33
|
export interface ValidateQualityGateOptions {
|
|
39
|
-
readonly repoRoot
|
|
40
|
-
readonly fs
|
|
34
|
+
readonly repoRoot?: string;
|
|
35
|
+
readonly fs?: QualityGateFs;
|
|
41
36
|
readonly currentAttemptDir?: string;
|
|
37
|
+
readonly reviewerSurface?: UlwLoopToolkitSurface;
|
|
42
38
|
}
|
|
43
39
|
|
|
44
|
-
function reviewerRoleField
|
|
40
|
+
function reviewerRoleField(value: unknown, expected: string, field: string): string {
|
|
45
41
|
const actual = textField(value, field);
|
|
46
42
|
if (actual !== expected) invalid(`${field} must be ${expected}.`, field);
|
|
47
43
|
return expected;
|
|
@@ -91,11 +87,11 @@ function artifactCompatible(surface: UlwLoopManualQaSurface, kind: UlwLoopManual
|
|
|
91
87
|
}
|
|
92
88
|
|
|
93
89
|
function checkFile(path: string, field: string, opts?: ValidateQualityGateOptions): void {
|
|
94
|
-
if (opts === undefined) return;
|
|
90
|
+
if (opts?.repoRoot === undefined || opts.fs === undefined) return;
|
|
95
91
|
const absolute = resolve(opts.repoRoot, path);
|
|
96
92
|
if (!opts.fs.existsSync(absolute)) invalid(`${field} must point to an existing artifact.`, field);
|
|
97
93
|
if (opts.fs.statSync(absolute).size <= 0) invalid(`${field} must point to a non-empty artifact.`, field);
|
|
98
|
-
if (opts.currentAttemptDir !== undefined) {
|
|
94
|
+
if (opts.currentAttemptDir !== undefined && opts.repoRoot !== undefined) {
|
|
99
95
|
const attemptRoot = resolve(opts.repoRoot, opts.currentAttemptDir);
|
|
100
96
|
if (!isWithinAttemptDir(absolute, attemptRoot))
|
|
101
97
|
invalid(
|
|
@@ -143,6 +139,7 @@ function referencedArtifacts(
|
|
|
143
139
|
}
|
|
144
140
|
|
|
145
141
|
export function validateQualityGate(input: unknown, opts?: ValidateQualityGateOptions): UlwLoopQualityGate {
|
|
142
|
+
const reviewerRoles = reviewerRolesFor(opts?.reviewerSurface ?? "lazycodex");
|
|
146
143
|
const gate = section(input, "qualityGate");
|
|
147
144
|
const codeReview = section(gate["codeReview"], "codeReview");
|
|
148
145
|
const manualQa = section(gate["manualQa"], "manualQa");
|
|
@@ -163,7 +160,7 @@ export function validateQualityGate(input: unknown, opts?: ValidateQualityGateOp
|
|
|
163
160
|
checkFile(gateReportPath, "gateReview.reportPath", opts);
|
|
164
161
|
return {
|
|
165
162
|
codeReview: {
|
|
166
|
-
by: reviewerRoleField(codeReview["by"],
|
|
163
|
+
by: reviewerRoleField(codeReview["by"], reviewerRoles.codeReview, "codeReview.by"),
|
|
167
164
|
recommendation: literal(codeReview["recommendation"], "APPROVE", "codeReview.recommendation"),
|
|
168
165
|
codeQualityStatus: codeQualityStatusField(codeReview["codeQualityStatus"], "codeReview.codeQualityStatus"),
|
|
169
166
|
reportPath: codeReportPath,
|
|
@@ -171,7 +168,7 @@ export function validateQualityGate(input: unknown, opts?: ValidateQualityGateOp
|
|
|
171
168
|
blockers: emptyBlockers(codeReview["blockers"], "codeReview.blockers"),
|
|
172
169
|
},
|
|
173
170
|
manualQa: {
|
|
174
|
-
by: reviewerRoleField(manualQa["by"],
|
|
171
|
+
by: reviewerRoleField(manualQa["by"], reviewerRoles.manualQa, "manualQa.by"),
|
|
175
172
|
status: literal(manualQa["status"], "passed", "manualQa.status"),
|
|
176
173
|
evidence: textField(manualQa["evidence"], "manualQa.evidence"),
|
|
177
174
|
surfaceEvidence,
|
|
@@ -179,7 +176,7 @@ export function validateQualityGate(input: unknown, opts?: ValidateQualityGateOp
|
|
|
179
176
|
artifactRefs,
|
|
180
177
|
},
|
|
181
178
|
gateReview: {
|
|
182
|
-
by: reviewerRoleField(gateReview["by"],
|
|
179
|
+
by: reviewerRoleField(gateReview["by"], reviewerRoles.gateReview, "gateReview.by"),
|
|
183
180
|
recommendation: literal(gateReview["recommendation"], "APPROVE", "gateReview.recommendation"),
|
|
184
181
|
reportPath: gateReportPath,
|
|
185
182
|
evidence: textField(gateReview["evidence"], "gateReview.evidence"),
|
|
@@ -5,6 +5,7 @@ import type { PreToolUsePayload } from "./codex-hook.js";
|
|
|
5
5
|
import { parsePreToolUsePayload } from "./codex-hook.js";
|
|
6
6
|
import { isFinalRunCompletionCandidate } from "./goal-status.js";
|
|
7
7
|
import { ulwLoopAttemptEvidenceDir, ulwLoopDir } from "./paths.js";
|
|
8
|
+
import { GATE_REVIEWER_AGENT_NAMES } from "./surface.js";
|
|
8
9
|
import type { UlwLoopPlan } from "./types.js";
|
|
9
10
|
|
|
10
11
|
// spawn_agent = v1; collaborationspawn_agent = the delimiter-free flattened v2
|
|
@@ -12,7 +13,7 @@ import type { UlwLoopPlan } from "./types.js";
|
|
|
12
13
|
// dotted token observed live in the task-1 probe (hook-tool-tokens.txt).
|
|
13
14
|
const SPAWN_TOOL_TOKENS = new Set(["spawn_agent", "collaborationspawn_agent", "collaboration.spawn_agent"]);
|
|
14
15
|
const DEFAULT_FANOUT_LIMIT = 60;
|
|
15
|
-
const GATE_MESSAGE_PATTERN = /lazycodex-gate-reviewer|final gate review/i;
|
|
16
|
+
const GATE_MESSAGE_PATTERN = /lazycodex-gate-reviewer|omo-senpi-gate-reviewer|final gate review/i;
|
|
16
17
|
|
|
17
18
|
export function applySpawnGuards(payload: PreToolUsePayload): string {
|
|
18
19
|
if (payload.hook_event_name !== "PreToolUse" || !SPAWN_TOOL_TOKENS.has(payload.tool_name)) return "";
|
|
@@ -77,7 +78,7 @@ function isGateReviewerSpawn(toolInput: unknown): boolean {
|
|
|
77
78
|
if (typeof toolInput !== "object" || toolInput === null) return false;
|
|
78
79
|
const record = toolInput as Record<string, unknown>;
|
|
79
80
|
const agentType = record["agent_type"];
|
|
80
|
-
if (typeof agentType === "string") return agentType
|
|
81
|
+
if (typeof agentType === "string") return GATE_REVIEWER_AGENT_NAMES.has(agentType);
|
|
81
82
|
const message = record["message"];
|
|
82
83
|
return typeof message === "string" && GATE_MESSAGE_PATTERN.test(message);
|
|
83
84
|
}
|
|
@@ -10,7 +10,7 @@ import type { UlwLoopItem, UlwLoopPlan } from "./types.js";
|
|
|
10
10
|
|
|
11
11
|
const RESUME_CAP = 2;
|
|
12
12
|
|
|
13
|
-
// Mirrors
|
|
13
|
+
// Mirrors ulw-execute-continuation's context-pressure bail-out: injecting a
|
|
14
14
|
// resume directive into an already-overflowing context makes things worse.
|
|
15
15
|
const CONTEXT_PRESSURE_MARKERS = [
|
|
16
16
|
"context compacted",
|
|
@@ -136,7 +136,7 @@ function readCounter(counterPath: string): { count: number; ledgerLineCount: num
|
|
|
136
136
|
}
|
|
137
137
|
}
|
|
138
138
|
|
|
139
|
-
// Local ~10-LOC approximation of
|
|
139
|
+
// Local ~10-LOC approximation of ulw-execute-continuation's boulder check (no
|
|
140
140
|
// cross-component import allowed): any continuable work for this session means
|
|
141
141
|
// that hook owns the Stop event, so this one stays silent.
|
|
142
142
|
function boulderContinuationWillFire(cwd: string, sessionId: string): boolean {
|
|
@@ -168,7 +168,7 @@ function transcriptShowsContextPressure(transcriptPath: string): boolean {
|
|
|
168
168
|
}
|
|
169
169
|
}
|
|
170
170
|
|
|
171
|
-
//
|
|
171
|
+
// ulw-execute-continuation owns an active Boulder plan until its final gate marks
|
|
172
172
|
// the work complete, including the zero-remaining checklist state.
|
|
173
173
|
function boulderPlanHasChecklist(cwd: string, entry: Record<string, unknown>): boolean {
|
|
174
174
|
const activePlan = entry["active_plan"];
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
|
|
5
|
+
// The agent toolkit ships on two surfaces: the LazyCodex (Codex CLI) plugin runs the component
|
|
6
|
+
// bundle directly, while omo-senpi stages the same bundle through stage-agent-toolkit.mjs. The
|
|
7
|
+
// reviewer identities the final quality gate enforces differ per surface, so the staging script
|
|
8
|
+
// bakes a `surface.json` marker next to the staged bundle and this module resolves it. Without a
|
|
9
|
+
// marker (the Codex layout) the surface stays "lazycodex".
|
|
10
|
+
export type UlwLoopToolkitSurface = "lazycodex" | "omo-senpi";
|
|
11
|
+
|
|
12
|
+
export interface UlwLoopReviewerRoles {
|
|
13
|
+
readonly codeReview: string;
|
|
14
|
+
readonly manualQa: string;
|
|
15
|
+
readonly gateReview: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export const REVIEWER_ROLES_BY_SURFACE: Readonly<Record<UlwLoopToolkitSurface, UlwLoopReviewerRoles>> = {
|
|
19
|
+
lazycodex: {
|
|
20
|
+
codeReview: "lazycodex-code-reviewer",
|
|
21
|
+
manualQa: "lazycodex-qa-executor",
|
|
22
|
+
gateReview: "lazycodex-gate-reviewer",
|
|
23
|
+
},
|
|
24
|
+
"omo-senpi": {
|
|
25
|
+
codeReview: "omo-senpi-code-reviewer",
|
|
26
|
+
manualQa: "omo-senpi-qa-executor",
|
|
27
|
+
gateReview: "omo-senpi-gate-reviewer",
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export const GATE_REVIEWER_AGENT_NAMES: ReadonlySet<string> = new Set(
|
|
32
|
+
Object.values(REVIEWER_ROLES_BY_SURFACE).map((roles) => roles.gateReview),
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
export function reviewerRolesFor(surface: UlwLoopToolkitSurface): UlwLoopReviewerRoles {
|
|
36
|
+
return REVIEWER_ROLES_BY_SURFACE[surface];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export const SURFACE_MARKER_FILENAME = "surface.json";
|
|
40
|
+
const SURFACE_ENV_KEY = "OMO_AGENT_TOOLKIT_SURFACE";
|
|
41
|
+
|
|
42
|
+
function parseSurface(value: unknown): UlwLoopToolkitSurface | null {
|
|
43
|
+
return value === "lazycodex" || value === "omo-senpi" ? value : null;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface ResolveToolkitSurfaceOptions {
|
|
47
|
+
readonly env?: Readonly<Record<string, string | undefined>>;
|
|
48
|
+
readonly entryDir?: string;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Resolution order: explicit env override (tests, doctor probes) -> staged surface.json marker
|
|
52
|
+
// sitting next to the running bundle -> lazycodex default. The marker is distribution-baked, so a
|
|
53
|
+
// malformed marker falls back to the default instead of crashing checkpoint validation; the env
|
|
54
|
+
// override remains available to force the intended surface on a damaged install.
|
|
55
|
+
export function resolveToolkitSurface(options?: ResolveToolkitSurfaceOptions): UlwLoopToolkitSurface {
|
|
56
|
+
const env = options?.env ?? process.env;
|
|
57
|
+
const fromEnv = parseSurface(env[SURFACE_ENV_KEY]);
|
|
58
|
+
if (fromEnv !== null) return fromEnv;
|
|
59
|
+
const entryDir = options?.entryDir ?? dirname(fileURLToPath(import.meta.url));
|
|
60
|
+
const markerPath = join(entryDir, SURFACE_MARKER_FILENAME);
|
|
61
|
+
return readMarkerSurface(markerPath) ?? "lazycodex";
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function readMarkerSurface(markerPath: string): UlwLoopToolkitSurface | null {
|
|
65
|
+
try {
|
|
66
|
+
if (!existsSync(markerPath)) return null;
|
|
67
|
+
const parsed = JSON.parse(readFileSync(markerPath, "utf8")) as Record<string, unknown>;
|
|
68
|
+
return parseSurface(parsed["surface"]);
|
|
69
|
+
} catch (error) {
|
|
70
|
+
if (error instanceof Error) return null;
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -31,7 +31,6 @@ describe("checkpointAndContinue", () => {
|
|
|
31
31
|
});
|
|
32
32
|
|
|
33
33
|
expect(result.next).toMatchObject({ resumed: false, goal: { id: "G002", status: "in_progress" } });
|
|
34
|
-
expect(result.next && "instruction" in result.next ? result.next.instruction.text : "").toContain("Goal: G002");
|
|
35
34
|
expect((await readUlwLoopPlan(repo)).activeGoalId).toBe("G002");
|
|
36
35
|
});
|
|
37
36
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { writeFile } from "node:fs/promises";
|
|
2
|
-
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
3
3
|
|
|
4
4
|
import { checkpointUlwLoop } from "../src/checkpoint.js";
|
|
5
5
|
import { ulwLoopBriefPath } from "../src/paths.js";
|
|
@@ -7,6 +7,49 @@ import { startNextUlwLoop } from "../src/plan-crud.js";
|
|
|
7
7
|
import { criterion, expectCode, goal, passGoal, plan, repoWith, snapshot } from "./fixtures/checkpoint-builders.js";
|
|
8
8
|
import { MISSING_ARTIFACT_PATH, qualityGateJson } from "./fixtures/quality-gate-builder.js";
|
|
9
9
|
|
|
10
|
+
describe("checkpointUlwLoop final story surface resolution", () => {
|
|
11
|
+
afterEach(() => {
|
|
12
|
+
delete process.env["OMO_AGENT_TOOLKIT_SURFACE"];
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it("#given the omo-senpi surface #when the gate names omo-senpi reviewers #then the final story completes", async () => {
|
|
16
|
+
process.env["OMO_AGENT_TOOLKIT_SURFACE"] = "omo-senpi";
|
|
17
|
+
const repo = await repoWith(
|
|
18
|
+
plan([passGoal("G001", { status: "complete" }), passGoal("G002")], { activeGoalId: "G002" }),
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
const result = await checkpointUlwLoop(repo, {
|
|
22
|
+
goalId: "G002",
|
|
23
|
+
status: "complete",
|
|
24
|
+
evidence: "final work complete and validation passed",
|
|
25
|
+
codexGoalJson: snapshot("complete"),
|
|
26
|
+
qualityGateJson: await qualityGateJson(repo, undefined, "G001-finished", "omo-senpi"),
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
expect(result.aggregateCompletion?.status).toBe("complete");
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it("#given the omo-senpi surface #when the gate names lazycodex reviewers #then the final story is rejected", async () => {
|
|
33
|
+
process.env["OMO_AGENT_TOOLKIT_SURFACE"] = "omo-senpi";
|
|
34
|
+
const repo = await repoWith(
|
|
35
|
+
plan([passGoal("G001", { status: "complete" }), passGoal("G002")], { activeGoalId: "G002" }),
|
|
36
|
+
);
|
|
37
|
+
const gateJson = await qualityGateJson(repo);
|
|
38
|
+
|
|
39
|
+
await expectCode(
|
|
40
|
+
() =>
|
|
41
|
+
checkpointUlwLoop(repo, {
|
|
42
|
+
goalId: "G002",
|
|
43
|
+
status: "complete",
|
|
44
|
+
evidence: "final work complete and validation passed",
|
|
45
|
+
codexGoalJson: snapshot("complete"),
|
|
46
|
+
qualityGateJson: gateJson,
|
|
47
|
+
}),
|
|
48
|
+
"ULW_LOOP_QUALITY_GATE_INVALID",
|
|
49
|
+
);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
|
|
10
53
|
describe("checkpointUlwLoop final story", () => {
|
|
11
54
|
it("requires quality-gate-json for the final goal complete", async () => {
|
|
12
55
|
const repo = await repoWith(
|
|
@@ -13,6 +13,7 @@ let err: string[];
|
|
|
13
13
|
let originalCodexSessionId: string | undefined;
|
|
14
14
|
let originalCodexThreadId: string | undefined;
|
|
15
15
|
let originalOmoSessionId: string | undefined;
|
|
16
|
+
let originalPiSessionId: string | undefined;
|
|
16
17
|
|
|
17
18
|
beforeEach(async () => {
|
|
18
19
|
testDir = await mkdtemp(join(tmpdir(), "ug-cli-create-goals-"));
|
|
@@ -21,9 +22,11 @@ beforeEach(async () => {
|
|
|
21
22
|
originalCodexSessionId = process.env["CODEX_SESSION_ID"];
|
|
22
23
|
originalCodexThreadId = process.env["CODEX_THREAD_ID"];
|
|
23
24
|
originalOmoSessionId = process.env["OMO_ULW_LOOP_SESSION_ID"];
|
|
25
|
+
originalPiSessionId = process.env["PI_SESSION_ID"];
|
|
24
26
|
delete process.env["CODEX_SESSION_ID"];
|
|
25
27
|
delete process.env["CODEX_THREAD_ID"];
|
|
26
28
|
delete process.env["OMO_ULW_LOOP_SESSION_ID"];
|
|
29
|
+
delete process.env["PI_SESSION_ID"];
|
|
27
30
|
vi.spyOn(process, "cwd").mockReturnValue(testDir);
|
|
28
31
|
vi.spyOn(process.stdout, "write").mockImplementation((chunk: string | Uint8Array): boolean => {
|
|
29
32
|
out.push(chunk.toString());
|
|
@@ -43,6 +46,8 @@ afterEach(async () => {
|
|
|
43
46
|
else process.env["CODEX_THREAD_ID"] = originalCodexThreadId;
|
|
44
47
|
if (originalOmoSessionId === undefined) delete process.env["OMO_ULW_LOOP_SESSION_ID"];
|
|
45
48
|
else process.env["OMO_ULW_LOOP_SESSION_ID"] = originalOmoSessionId;
|
|
49
|
+
if (originalPiSessionId === undefined) delete process.env["PI_SESSION_ID"];
|
|
50
|
+
else process.env["PI_SESSION_ID"] = originalPiSessionId;
|
|
46
51
|
await rm(testDir, { recursive: true, force: true });
|
|
47
52
|
});
|
|
48
53
|
|
|
@@ -182,6 +187,26 @@ describe("ulwLoopCommand create-goals", () => {
|
|
|
182
187
|
expect(await readFile(join(testDir, ".omo/ulw-loop/manual-456/goals.json"), "utf8")).toContain("Manual scoped");
|
|
183
188
|
});
|
|
184
189
|
|
|
190
|
+
it("#given two Senpi sessions in one cwd #when each reads ulw-loop state #then only the owner sees its run", async () => {
|
|
191
|
+
process.env["PI_SESSION_ID"] = "session-A";
|
|
192
|
+
expect(await ulwLoopCommand(["create-goals", "--brief", "- Session A run", "--json"])).toBe(0);
|
|
193
|
+
resetOutput();
|
|
194
|
+
|
|
195
|
+
process.env["PI_SESSION_ID"] = "session-B";
|
|
196
|
+
expect(await ulwLoopCommand(["status", "--json"])).toBe(1);
|
|
197
|
+
expect(stdoutJson()).toMatchObject({ ok: false, error: { code: "ULW_LOOP_PLAN_MISSING" } });
|
|
198
|
+
resetOutput();
|
|
199
|
+
|
|
200
|
+
process.env["PI_SESSION_ID"] = "session-A";
|
|
201
|
+
expect(await ulwLoopCommand(["status", "--json"])).toBe(0);
|
|
202
|
+
expect(stdoutJson()).toMatchObject({
|
|
203
|
+
plan: {
|
|
204
|
+
goalsPath: ".omo/ulw-loop/session-A/goals.json",
|
|
205
|
+
goals: [{ title: "Session A run" }],
|
|
206
|
+
},
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
|
|
185
210
|
it("#given a valueless --session-id #when creating goals #then it fails and writes no plan", async () => {
|
|
186
211
|
const code = await ulwLoopCommand(["create-goals", "--session-id", "--brief", "- Alpha"]);
|
|
187
212
|
|
|
@@ -91,12 +91,36 @@ describe("dist/cli.js entrypoint dispatch", () => {
|
|
|
91
91
|
expect(result.code).toBe(1);
|
|
92
92
|
});
|
|
93
93
|
|
|
94
|
-
it("#given the top-level entrypoint #when invoked with 'help' #then prints usage and exits 0", async () => {
|
|
94
|
+
it("#given the top-level entrypoint #when invoked with 'help' #then prints the merged hook and subcommand usage and exits 0", async () => {
|
|
95
95
|
const result = await runCli(["help"]);
|
|
96
96
|
|
|
97
97
|
expect(result.code).toBe(0);
|
|
98
98
|
expect(result.stdout).toContain("Usage:");
|
|
99
|
-
expect(result.stdout).toContain("
|
|
99
|
+
expect(result.stdout).toContain("hook user-prompt-submit");
|
|
100
|
+
expect(result.stdout).toContain("create-goals");
|
|
101
|
+
expect(result.stdout).toContain("complete-goals");
|
|
102
|
+
expect(result.stdout).toContain("record-review-blockers");
|
|
103
|
+
expect(result.stdout).not.toContain("for ulw-loop subcommands");
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it("#given the staged router strips nothing #when invoked with 'ulw-loop help' #then prints the same merged help text", async () => {
|
|
107
|
+
const bare = await runCli(["help"]);
|
|
108
|
+
const nested = await runCli(["ulw-loop", "help"]);
|
|
109
|
+
|
|
110
|
+
expect(nested.code).toBe(0);
|
|
111
|
+
expect(nested.stdout.trim()).toBe(bare.stdout.trim());
|
|
112
|
+
expect(nested.stdout).toContain("hook user-prompt-submit");
|
|
113
|
+
expect(nested.stdout).toContain("record-review-blockers");
|
|
114
|
+
expect(nested.stdout).not.toContain("for ulw-loop subcommands");
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
it("#given a subcommand with required args #when invoked with 'create-goals --help' #then prints its usage and exits 0", async () => {
|
|
118
|
+
const result = await runCli(["create-goals", "--help"]);
|
|
119
|
+
|
|
120
|
+
expect(result.code).toBe(0);
|
|
121
|
+
expect(result.stdout).toContain("Usage:");
|
|
122
|
+
expect(result.stdout).toContain("create-goals");
|
|
123
|
+
expect(`${result.stdout}${result.stderr}`).not.toContain("Missing brief text");
|
|
100
124
|
});
|
|
101
125
|
|
|
102
126
|
it("#given a command outside the ulw-loop vocabulary #when invoked with 'frobnicate' #then fails as unknown command", async () => {
|
|
@@ -6,6 +6,7 @@ import type { UlwLoopItem, UlwLoopPlan, UlwLoopSuccessCriterion } from "../src/t
|
|
|
6
6
|
|
|
7
7
|
const NOW = "2026-05-23T00:00:00.000Z";
|
|
8
8
|
const FINAL_REVIEW_ROLES = ["lazycodex-code-reviewer", "lazycodex-qa-executor", "lazycodex-gate-reviewer"] as const;
|
|
9
|
+
const SENPI_REVIEW_ROLES = ["omo-senpi-code-reviewer", "omo-senpi-qa-executor", "omo-senpi-gate-reviewer"] as const;
|
|
9
10
|
const QUALITY_GATE_SECTIONS = ["codeReview", "manualQa", "gateReview", "iteration", "criteriaCoverage"] as const;
|
|
10
11
|
|
|
11
12
|
function makeCriterion(overrides: Partial<UlwLoopSuccessCriterion> = {}): UlwLoopSuccessCriterion {
|
|
@@ -94,6 +95,30 @@ describe("buildCodexGoalInstruction aggregate mode", () => {
|
|
|
94
95
|
expect(text).toContain("checkpoint");
|
|
95
96
|
});
|
|
96
97
|
|
|
98
|
+
it("#given a final story on the omo-senpi surface #when rendering instructions #then names the omo-senpi reviewers only", () => {
|
|
99
|
+
const { text } = buildCodexGoalInstruction({
|
|
100
|
+
plan: makePlan({ codexGoalMode: "aggregate" }),
|
|
101
|
+
goal: makeGoal(),
|
|
102
|
+
isFinal: true,
|
|
103
|
+
surface: "omo-senpi",
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
expectTextToContainAll(text, SENPI_REVIEW_ROLES);
|
|
107
|
+
for (const role of FINAL_REVIEW_ROLES) expect(text).not.toContain(role);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
it("#given a final story with the explicit lazycodex surface #when rendering instructions #then keeps the lazycodex reviewers", () => {
|
|
111
|
+
const { text } = buildCodexGoalInstruction({
|
|
112
|
+
plan: makePlan({ codexGoalMode: "aggregate" }),
|
|
113
|
+
goal: makeGoal(),
|
|
114
|
+
isFinal: true,
|
|
115
|
+
surface: "lazycodex",
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
expectTextToContainAll(text, FINAL_REVIEW_ROLES);
|
|
119
|
+
for (const role of SENPI_REVIEW_ROLES) expect(text).not.toContain(role);
|
|
120
|
+
});
|
|
121
|
+
|
|
97
122
|
it("#given a scoped plan #when rendering final commands #then includes the session id option", () => {
|
|
98
123
|
const { text } = buildCodexGoalInstruction({
|
|
99
124
|
plan: makePlan({
|
|
@@ -113,9 +138,9 @@ describe("buildCodexGoalInstruction aggregate mode", () => {
|
|
|
113
138
|
|
|
114
139
|
describe("buildCodexGoalInstruction per_story mode", () => {
|
|
115
140
|
it("uses the goal's own objective for create_goal", () => {
|
|
116
|
-
const goal = makeGoal({ objective: "
|
|
141
|
+
const goal = makeGoal({ objective: "per-story-objective-sentinel" });
|
|
117
142
|
const { text } = buildCodexGoalInstruction({ plan: makePlan({ codexGoalMode: "per_story" }), goal });
|
|
118
|
-
expect(text).toContain("
|
|
143
|
+
expect(text).toContain("per-story-objective-sentinel");
|
|
119
144
|
});
|
|
120
145
|
});
|
|
121
146
|
|
|
@@ -24,6 +24,24 @@ describe("parseCodexGoalSnapshot", () => {
|
|
|
24
24
|
expect(snapshot.status).toBe("active");
|
|
25
25
|
});
|
|
26
26
|
|
|
27
|
+
it("reads the objective from a title-bearing ulw-loop status goal", () => {
|
|
28
|
+
// given
|
|
29
|
+
const payload = {
|
|
30
|
+
id: "G002-goal-2-senpi-repo-audit-determine-wh",
|
|
31
|
+
title: "Audit the Senpi repository",
|
|
32
|
+
status: "in_progress",
|
|
33
|
+
successCriteria: [],
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
// when
|
|
37
|
+
const snapshot = parseCodexGoalSnapshot(payload);
|
|
38
|
+
|
|
39
|
+
// then
|
|
40
|
+
expect(snapshot.available).toBe(true);
|
|
41
|
+
expect(snapshot.objective).toBe("Audit the Senpi repository");
|
|
42
|
+
expect(snapshot.status).toBe("active");
|
|
43
|
+
});
|
|
44
|
+
|
|
27
45
|
it("ignores remaining token budget fields from goal snapshots", () => {
|
|
28
46
|
// given
|
|
29
47
|
const payload = { goal: { objective: "X", status: "active" }, remainingTokens: 123 };
|
|
@@ -242,7 +242,6 @@ describe("applyPreToolUseGoalBudgetGuard", () => {
|
|
|
242
242
|
permissionDecision: "deny",
|
|
243
243
|
},
|
|
244
244
|
});
|
|
245
|
-
expect(parsed.hookSpecificOutput.permissionDecisionReason).toContain("objective only");
|
|
246
245
|
expect(parsed.hookSpecificOutput.permissionDecisionReason).toContain("token_budget");
|
|
247
246
|
expect(parsed.hookSpecificOutput.permissionDecisionReason).toContain("unlimited");
|
|
248
247
|
expect(parsed.hookSpecificOutput.permissionDecisionReason).toContain("update_goal");
|
|
@@ -258,7 +257,6 @@ describe("applyPreToolUseGoalBudgetGuard", () => {
|
|
|
258
257
|
// then
|
|
259
258
|
const parsed = JSON.parse(output);
|
|
260
259
|
expect(parsed.hookSpecificOutput.permissionDecision).toBe("deny");
|
|
261
|
-
expect(parsed.hookSpecificOutput.permissionDecisionReason).toContain("objective only");
|
|
262
260
|
expect(parsed.hookSpecificOutput.permissionDecisionReason).toContain("update_goal");
|
|
263
261
|
});
|
|
264
262
|
|
|
@@ -272,7 +270,6 @@ describe("applyPreToolUseGoalBudgetGuard", () => {
|
|
|
272
270
|
// then
|
|
273
271
|
const parsed = JSON.parse(output);
|
|
274
272
|
expect(parsed.hookSpecificOutput.permissionDecision).toBe("deny");
|
|
275
|
-
expect(parsed.hookSpecificOutput.permissionDecisionReason).toContain("objective only");
|
|
276
273
|
});
|
|
277
274
|
|
|
278
275
|
it("#given create_goal omits token_budget #when PreToolUse runs #then it stays silent", () => {
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { mkdir, writeFile } from "node:fs/promises";
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
|
|
4
|
+
import { reviewerRolesFor, type UlwLoopToolkitSurface } from "../../src/surface.js";
|
|
5
|
+
|
|
4
6
|
// v2 evidence layout: artifacts must live inside the goal's current attempt dir
|
|
5
7
|
export function qaDirFor(goalId: string, attempt = 1, sessionId = "session"): string {
|
|
6
8
|
return `.omo/evidence/ulw/${sessionId}/${goalId}/a${attempt}`;
|
|
@@ -25,13 +27,15 @@ export async function qualityGateJson(
|
|
|
25
27
|
repoRoot: string,
|
|
26
28
|
cliArtifactPath?: string,
|
|
27
29
|
goalId = "G001-finished",
|
|
30
|
+
surface: UlwLoopToolkitSurface = "lazycodex",
|
|
28
31
|
): Promise<string> {
|
|
32
|
+
const roles = reviewerRolesFor(surface);
|
|
29
33
|
const qaDir = qaDirFor(goalId);
|
|
30
34
|
await writeQualityGateArtifacts(repoRoot, qaDir);
|
|
31
35
|
const cliPath = cliArtifactPath ?? `${qaDir}/cli-pass.txt`;
|
|
32
36
|
return JSON.stringify({
|
|
33
37
|
codeReview: {
|
|
34
|
-
by:
|
|
38
|
+
by: roles.codeReview,
|
|
35
39
|
recommendation: "APPROVE",
|
|
36
40
|
codeQualityStatus: "CLEAR",
|
|
37
41
|
reportPath: `${qaDir}/code-review.md`,
|
|
@@ -39,7 +43,7 @@ export async function qualityGateJson(
|
|
|
39
43
|
blockers: [],
|
|
40
44
|
},
|
|
41
45
|
manualQa: {
|
|
42
|
-
by:
|
|
46
|
+
by: roles.manualQa,
|
|
43
47
|
status: "passed",
|
|
44
48
|
evidence: "Ran CLI checkpoint validation with artifact-backed evidence.",
|
|
45
49
|
surfaceEvidence: [
|
|
@@ -78,7 +82,7 @@ export async function qualityGateJson(
|
|
|
78
82
|
],
|
|
79
83
|
},
|
|
80
84
|
gateReview: {
|
|
81
|
-
by:
|
|
85
|
+
by: roles.gateReview,
|
|
82
86
|
recommendation: "APPROVE",
|
|
83
87
|
reportPath: `${qaDir}/gate-review.md`,
|
|
84
88
|
evidence: "Verified all criteria and artifact evidence.",
|
|
@@ -24,9 +24,7 @@ type ShellResult = {
|
|
|
24
24
|
};
|
|
25
25
|
|
|
26
26
|
function bootstrapScriptFrom(text: string): string {
|
|
27
|
-
const
|
|
28
|
-
expect(heading).toBeGreaterThanOrEqual(0);
|
|
29
|
-
const blockStart = text.indexOf("```sh\n", heading);
|
|
27
|
+
const blockStart = text.indexOf("```sh\n");
|
|
30
28
|
expect(blockStart).toBeGreaterThanOrEqual(0);
|
|
31
29
|
const codeStart = blockStart + "```sh\n".length;
|
|
32
30
|
const blockEnd = text.indexOf("\n```", codeStart);
|
|
@@ -90,7 +88,8 @@ describe("hooks/hooks.json", () => {
|
|
|
90
88
|
const hooks = await readJson("hooks/hooks.json") as Record<string, unknown>;
|
|
91
89
|
const events = (hooks["hooks"] as Record<string, unknown>)["UserPromptSubmit"] as readonly Record<string, unknown>[];
|
|
92
90
|
expect(events.length).toBeGreaterThan(0);
|
|
93
|
-
const command = (
|
|
91
|
+
const command = (events[0]?.["hooks"] as readonly Record<string, unknown>[] | undefined)?.[0]?.["command"];
|
|
92
|
+
expect(command).toEqual(expect.any(String));
|
|
94
93
|
expect(command).toContain(`$${"{PLUGIN_ROOT}"}`);
|
|
95
94
|
expect(command).toContain("dist/cli.js");
|
|
96
95
|
expect(command).toContain("hook user-prompt-submit");
|
|
@@ -129,9 +128,7 @@ describe("skills/ulw-loop/SKILL.md", () => {
|
|
|
129
128
|
const text = await readText("skills/ulw-loop/agents/openai.yaml");
|
|
130
129
|
|
|
131
130
|
expect(text).toContain('display_name: "(OmO) ulw-loop"');
|
|
132
|
-
expect(text).not.toContain("ulw-loop / ulw-loop");
|
|
133
131
|
expect(text).toContain('short_description: "Goal-like ultrawork loop for systematic decomposition"');
|
|
134
|
-
expect(text).toContain("Use $ulw-loop");
|
|
135
132
|
});
|
|
136
133
|
|
|
137
134
|
it("#given Codex dollar hinting #when querying ulw-loop #then ulw-loop remains discoverable as an alias", async () => {
|
|
@@ -172,7 +169,7 @@ describe("skills/ulw-loop/SKILL.md", () => {
|
|
|
172
169
|
].join("\n"),
|
|
173
170
|
);
|
|
174
171
|
|
|
175
|
-
const result = await runShell(`${bootstrap}\n
|
|
172
|
+
const result = await runShell(`${bootstrap}\n"$ULW_LOOP_NODE" "$ULW_LOOP_CLI" ulw-loop status --json`, {
|
|
176
173
|
...process.env,
|
|
177
174
|
CODEX_HOME: codexHome,
|
|
178
175
|
HOME: home,
|
|
@@ -181,7 +178,6 @@ describe("skills/ulw-loop/SKILL.md", () => {
|
|
|
181
178
|
|
|
182
179
|
expect(result.code).toBe(0);
|
|
183
180
|
expect(result.stdout).toContain('"source":"cached-ulw-loop"');
|
|
184
|
-
expect(result.stderr).not.toContain("unknown command");
|
|
185
181
|
} finally {
|
|
186
182
|
await rm(root, { recursive: true, force: true });
|
|
187
183
|
}
|
|
@@ -189,27 +185,7 @@ describe("skills/ulw-loop/SKILL.md", () => {
|
|
|
189
185
|
|
|
190
186
|
});
|
|
191
187
|
|
|
192
|
-
describe("
|
|
193
|
-
it("every source file stays at or under 250 pure LOC", async () => {
|
|
194
|
-
const files = [
|
|
195
|
-
"src/types.ts", "src/paths.ts", "src/plan-io.ts", "src/plan-crud.ts", "src/goal-status.ts",
|
|
196
|
-
"src/evidence.ts", "src/quality-gate.ts", "src/quality-gate-verdicts.ts", "src/checkpoint.ts", "src/review-blockers.ts",
|
|
197
|
-
"src/stop-resume-hook.ts", "src/spawn-guard.ts",
|
|
198
|
-
"src/steering.ts", "src/codex-goal-instruction.ts", "src/codex-goal-snapshot.ts", "src/codex-hook.ts",
|
|
199
|
-
"src/cli.ts", "src/cli-arg-parser.ts", "src/cli-output.ts", "src/cli-steering.ts", "src/cli-commands.ts",
|
|
200
|
-
];
|
|
201
|
-
for (const file of files) {
|
|
202
|
-
const text = await readText(file);
|
|
203
|
-
const pure = text.split("\n").filter((line) => {
|
|
204
|
-
const trimmed = line.trim();
|
|
205
|
-
return trimmed.length > 0 && !trimmed.startsWith("//");
|
|
206
|
-
}).length;
|
|
207
|
-
expect(pure, `${file} pure LOC`).toBeLessThanOrEqual(250);
|
|
208
|
-
}
|
|
209
|
-
});
|
|
210
|
-
});
|
|
211
|
-
|
|
212
|
-
describe("README implementation contract", () => {
|
|
188
|
+
describe("README implementation contract", () => {
|
|
213
189
|
it("#given the README #when subcommands are inspected #then every implemented CLI subcommand is documented", async () => {
|
|
214
190
|
const readme = await readText("README.md");
|
|
215
191
|
|
|
@@ -218,14 +194,6 @@ describe("README implementation contract", () => {
|
|
|
218
194
|
}
|
|
219
195
|
});
|
|
220
196
|
|
|
221
|
-
it("#given the README #when stale scaffold language is checked #then it is absent", async () => {
|
|
222
|
-
const readme = await readText("README.md");
|
|
223
|
-
|
|
224
|
-
expect(readme).not.toMatch(/scaffold only/i);
|
|
225
|
-
expect(readme).not.toMatch(/Wave 1/i);
|
|
226
|
-
expect(readme).not.toMatch(/lands in later waves/i);
|
|
227
|
-
});
|
|
228
|
-
|
|
229
197
|
it("#given the README #when hooks are described #then both hook channels are documented", async () => {
|
|
230
198
|
const readme = await readText("README.md");
|
|
231
199
|
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
isWithinAttemptDir,
|
|
8
8
|
normalizeUlwLoopSessionId,
|
|
9
9
|
repoRelative,
|
|
10
|
+
resolveUlwLoopSessionIdFromEnv,
|
|
10
11
|
ulwLoopBriefPath,
|
|
11
12
|
ulwLoopDir,
|
|
12
13
|
ulwLoopGoalsPath,
|
|
@@ -25,6 +26,14 @@ describe("ulwLoopDir(repo)", () => {
|
|
|
25
26
|
});
|
|
26
27
|
});
|
|
27
28
|
|
|
29
|
+
describe("resolveUlwLoopSessionIdFromEnv", () => {
|
|
30
|
+
it("#given a Senpi session env #when resolving scope #then uses the current Pi session id", () => {
|
|
31
|
+
expect(resolveUlwLoopSessionIdFromEnv({ PI_SESSION_ID: "01a00baf-feed-7f4d-a4a9-b8345c67cf72" })).toBe(
|
|
32
|
+
"01a00baf-feed-7f4d-a4a9-b8345c67cf72",
|
|
33
|
+
);
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
|
|
28
37
|
describe("ulw-loop*Path helpers", () => {
|
|
29
38
|
it("compose artifact filenames under ulwLoopDir", () => {
|
|
30
39
|
// when/then
|