oh-my-opencode 5.0.0-beta.3 → 5.0.0-beta.30
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 +22572 -20322
- 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 +22190 -19917
- 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/features/team-mode/tools/messaging-fallback-wake.d.ts +15 -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/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 +12573 -6957
- 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 +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/tool-description.d.ts +3 -1
- package/dist/tools/delegate-task/types.d.ts +3 -0
- package/dist/tui.d.ts +12 -0
- package/dist/tui.js +11480 -11512
- package/package.json +42 -36
- package/packages/git-bash-mcp/dist/cli.js +5 -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 +66 -13
- package/packages/lsp-core/src/lsp/client-wrapper.ts +95 -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 +1 -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-max-clients.test.ts +151 -0
- package/packages/lsp-core/src/lsp/manager.ts +34 -1
- 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 +1 -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 +645 -296
- package/packages/lsp-daemon/dist/client.d.ts +10 -0
- package/packages/lsp-daemon/dist/client.js +605 -253
- 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 +609 -262
- 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 +564 -217
- package/packages/lsp-tools-mcp/dist/lsp/manager.js +115 -92
- package/packages/lsp-tools-mcp/dist/mcp.js +566 -219
- package/packages/lsp-tools-mcp/dist/request-context.js +12 -13
- package/packages/lsp-tools-mcp/dist/tools.js +571 -227
- 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 +293 -116
- package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +245 -84
- 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 +596 -267
- 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 +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-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 +24 -14
- 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/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-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/cli-entrypoint.test.ts +26 -2
- 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/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/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/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +0 -28
- package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +0 -17
- package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +0 -17
- package/packages/omo-codex/plugin/skills/data-scientist/references/common-scenarios.md +0 -176
- package/packages/omo-codex/plugin/skills/data-scientist/references/execution-templates.md +0 -197
- package/packages/omo-codex/plugin/skills/data-scientist/references/integration-patterns.md +0 -153
- package/packages/omo-codex/plugin/skills/data-scientist/references/performance-benchmarks.md +0 -37
- package/packages/omo-codex/plugin/skills/start-work/agents/openai.yaml +0 -2
- package/packages/omo-codex/plugin/test/aggregate-skills.test.mjs +0 -92
- package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +0 -314
- package/packages/omo-codex/plugin/test/ulw-plan-scope-contract.test.mjs +0 -24
- package/packages/shared-skills/skills/data-scientist/references/common-scenarios.md +0 -176
- package/packages/shared-skills/skills/data-scientist/references/execution-templates.md +0 -197
- package/packages/shared-skills/skills/data-scientist/references/integration-patterns.md +0 -153
- package/packages/shared-skills/skills/data-scientist/references/performance-benchmarks.md +0 -37
- /package/dist/hooks/{start-work → ulw-execute}/context-info-formatters.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/explicit-plan-context.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/notepad-scaffold.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/parse-user-request.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/plan-discovery-context.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/plan-selection.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/session-plan-affinity.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/work-initializer.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/worktree-block.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/worktree-detector.d.ts +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/.gitattributes +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/CHANGELOG.md +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/LICENSE +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/plan-checklist.ts +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/types.ts +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-completed.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-mixed-platforms.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-single-codex-work.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-all-done.md +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-scaffold.md +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-with-nested-checkboxes.md +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-with-unchecked.md +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/tsconfig.build.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/tsconfig.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/vitest.config.ts +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Publish oh-my-opencode to npm via GitHub Actions workflow
|
|
3
|
-
argument-hint: <patch|minor|major>
|
|
3
|
+
argument-hint: <patch|minor|major|explicit-semver>
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
|
|
@@ -54,15 +54,16 @@ This contract applies to the slash-command copies (`.agents/command/publish.md`,
|
|
|
54
54
|
|
|
55
55
|
## CRITICAL: ARGUMENT REQUIREMENT
|
|
56
56
|
|
|
57
|
-
**You MUST receive
|
|
57
|
+
**You MUST receive one release selector from the user.** Valid options:
|
|
58
58
|
- `patch`: Bug fixes, backward-compatible (1.1.7 → 1.1.8)
|
|
59
59
|
- `minor`: New features, backward-compatible (1.1.7 → 1.2.0)
|
|
60
60
|
- `major`: Breaking changes (1.1.7 → 2.0.0)
|
|
61
|
+
- An explicit valid semantic version, including a prerelease such as `5.0.0-beta.9`
|
|
61
62
|
|
|
62
|
-
**If the user did not provide a
|
|
63
|
-
> "To proceed with deployment,
|
|
63
|
+
**If the user did not provide a release selector, STOP IMMEDIATELY and ask:**
|
|
64
|
+
> "To proceed with deployment, specify `patch`, `minor`, `major`, or an explicit semantic version such as `5.0.0-beta.9`."
|
|
64
65
|
|
|
65
|
-
|
|
66
|
+
Reject any other value. Do not infer or repair malformed versions.
|
|
66
67
|
|
|
67
68
|
---
|
|
68
69
|
|
|
@@ -72,7 +73,7 @@ This contract applies to the slash-command copies (`.agents/command/publish.md`,
|
|
|
72
73
|
|
|
73
74
|
```
|
|
74
75
|
[
|
|
75
|
-
{ "id": "confirm-
|
|
76
|
+
{ "id": "confirm-release-input", "content": "Confirm release selector with user (patch/minor/major or explicit semver)", "status": "in_progress", "priority": "high" },
|
|
76
77
|
{ "id": "check-uncommitted", "content": "Check for uncommitted changes and commit if needed", "status": "pending", "priority": "high" },
|
|
77
78
|
{ "id": "sync-remote", "content": "Sync with remote (pull --rebase && push if unpushed commits)", "status": "pending", "priority": "high" },
|
|
78
79
|
{ "id": "run-workflow", "content": "Trigger GitHub Actions publish workflow", "status": "pending", "priority": "high" },
|
|
@@ -92,9 +93,23 @@ This contract applies to the slash-command copies (`.agents/command/publish.md`,
|
|
|
92
93
|
|
|
93
94
|
---
|
|
94
95
|
|
|
95
|
-
## STEP 1: CONFIRM
|
|
96
|
+
## STEP 1: CONFIRM AND CLASSIFY THE RELEASE SELECTOR
|
|
96
97
|
|
|
97
|
-
If the user already
|
|
98
|
+
If the user already supplied the selector in the command argument or message, that IS the confirmation. Parse it exactly once:
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
RELEASE_INPUT="${ARGUMENTS}"
|
|
102
|
+
if [[ "$RELEASE_INPUT" =~ ^(patch|minor|major)$ ]]; then
|
|
103
|
+
RELEASE_KIND=bump
|
|
104
|
+
elif [[ "$RELEASE_INPUT" =~ ^([0-9]+\.){2}[0-9]+(-[0-9A-Za-z]+(\.[0-9A-Za-z]+)*)?$ ]]; then
|
|
105
|
+
RELEASE_KIND=version
|
|
106
|
+
else
|
|
107
|
+
echo "Invalid release selector: $RELEASE_INPUT" >&2
|
|
108
|
+
exit 1
|
|
109
|
+
fi
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Only ask and wait when no selector was provided.
|
|
98
113
|
|
|
99
114
|
---
|
|
100
115
|
|
|
@@ -125,16 +140,29 @@ This ensures the GitHub Actions workflow runs on the latest code including all l
|
|
|
125
140
|
|
|
126
141
|
## STEP 3: TRIGGER GITHUB ACTIONS WORKFLOW
|
|
127
142
|
|
|
128
|
-
|
|
129
|
-
```bash
|
|
130
|
-
gh workflow run publish -f bump={bump_type}
|
|
131
|
-
```
|
|
143
|
+
Dispatch from `dev`, pass bump selectors through `bump`, and pass exact versions through `version`. The required `bump` input remains `patch` for explicit-version dispatches but is ignored by the workflow because `version` takes precedence.
|
|
132
144
|
|
|
133
|
-
Wait 3 seconds, then get the run ID:
|
|
134
145
|
```bash
|
|
135
|
-
|
|
146
|
+
if [ "$RELEASE_KIND" = bump ]; then
|
|
147
|
+
RUN_URL="$(gh workflow run publish.yml --ref dev -f "bump=${RELEASE_INPUT}")"
|
|
148
|
+
else
|
|
149
|
+
RUN_URL="$(gh workflow run publish.yml --ref dev -f bump=patch -f "version=${RELEASE_INPUT}")"
|
|
150
|
+
fi
|
|
151
|
+
|
|
152
|
+
if ! [[ "$RUN_URL" =~ ^https://github.com/code-yeongyu/oh-my-openagent/actions/runs/[0-9]+$ ]]; then
|
|
153
|
+
echo "Publish dispatch did not return an exact workflow run URL: $RUN_URL" >&2
|
|
154
|
+
exit 1
|
|
155
|
+
fi
|
|
156
|
+
RUN_ID="${RUN_URL##*/}"
|
|
157
|
+
if ! [[ "$RUN_ID" =~ ^[0-9]+$ ]]; then
|
|
158
|
+
echo "Publish dispatch returned an invalid run ID: $RUN_ID" >&2
|
|
159
|
+
exit 1
|
|
160
|
+
fi
|
|
161
|
+
gh run view "${RUN_ID}" --json databaseId,status,url --jq '{databaseId,status,url}'
|
|
136
162
|
```
|
|
137
163
|
|
|
164
|
+
The returned run ID owns this release attempt. Never replace it with a latest-run lookup.
|
|
165
|
+
|
|
138
166
|
---
|
|
139
167
|
|
|
140
168
|
## STEP 4: WAIT FOR WORKFLOW COMPLETION
|
|
@@ -150,14 +178,14 @@ The publish run is a single workflow with sequential stages. Expected timeline (
|
|
|
150
178
|
|
|
151
179
|
Poll job-level status every 30 seconds and report stage transitions to the user:
|
|
152
180
|
```bash
|
|
153
|
-
gh run view {
|
|
181
|
+
gh run view "${RUN_ID}" --json status,conclusion,jobs --jq '{status, conclusion, stage: ([.jobs[] | select(.status=="in_progress") | .name] | join(", "))}'
|
|
154
182
|
```
|
|
155
183
|
|
|
156
184
|
**IMPORTANT: Use polling loop, NOT sleep commands.** Use the waiting time to draft the enhanced release summary (Step 6) — do not sit idle, and do not start any review activity.
|
|
157
185
|
|
|
158
186
|
If conclusion is `failure`, show error and stop:
|
|
159
187
|
```bash
|
|
160
|
-
gh run view {
|
|
188
|
+
gh run view "${RUN_ID}" --log-failed
|
|
161
189
|
```
|
|
162
190
|
|
|
163
191
|
---
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: publish
|
|
3
|
-
description: "Publish oh-my-opencode to npm by triggering the GitHub Actions publish workflow and verifying its artifacts. Ship-only: never runs pre-publish-review or re-reviews merged code unless the user explicitly asks. Argument: <patch|minor|major>. Triggers: publish, release, deploy, npm publish."
|
|
3
|
+
description: "Publish oh-my-opencode to npm by triggering the GitHub Actions publish workflow and verifying its artifacts. Ship-only: never runs pre-publish-review or re-reviews merged code unless the user explicitly asks. Argument: <patch|minor|major|explicit-semver>. Triggers: publish, release, deploy, npm publish."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
You are the release manager for oh-my-opencode. Execute the FULL publish workflow from start to finish.
|
|
@@ -53,15 +53,16 @@ This contract applies to the slash-command copies (`.agents/command/publish.md`,
|
|
|
53
53
|
|
|
54
54
|
## CRITICAL: ARGUMENT REQUIREMENT
|
|
55
55
|
|
|
56
|
-
**You MUST receive
|
|
56
|
+
**You MUST receive one release selector from the user.** Valid options:
|
|
57
57
|
- `patch`: Bug fixes, backward-compatible (1.1.7 → 1.1.8)
|
|
58
58
|
- `minor`: New features, backward-compatible (1.1.7 → 1.2.0)
|
|
59
59
|
- `major`: Breaking changes (1.1.7 → 2.0.0)
|
|
60
|
+
- An explicit valid semantic version, including a prerelease such as `5.0.0-beta.9`
|
|
60
61
|
|
|
61
|
-
**If the user did not provide a
|
|
62
|
-
> "To proceed with deployment,
|
|
62
|
+
**If the user did not provide a release selector, STOP IMMEDIATELY and ask:**
|
|
63
|
+
> "To proceed with deployment, specify `patch`, `minor`, `major`, or an explicit semantic version such as `5.0.0-beta.9`."
|
|
63
64
|
|
|
64
|
-
|
|
65
|
+
Reject any other value. Do not infer or repair malformed versions.
|
|
65
66
|
|
|
66
67
|
---
|
|
67
68
|
|
|
@@ -71,7 +72,7 @@ This contract applies to the slash-command copies (`.agents/command/publish.md`,
|
|
|
71
72
|
|
|
72
73
|
```
|
|
73
74
|
[
|
|
74
|
-
{ "id": "confirm-
|
|
75
|
+
{ "id": "confirm-release-input", "content": "Confirm release selector with user (patch/minor/major or explicit semver)", "status": "in_progress", "priority": "high" },
|
|
75
76
|
{ "id": "check-uncommitted", "content": "Check for uncommitted changes and commit if needed", "status": "pending", "priority": "high" },
|
|
76
77
|
{ "id": "sync-remote", "content": "Sync with remote (pull --rebase && push if unpushed commits)", "status": "pending", "priority": "high" },
|
|
77
78
|
{ "id": "run-workflow", "content": "Trigger GitHub Actions publish workflow", "status": "pending", "priority": "high" },
|
|
@@ -91,9 +92,23 @@ This contract applies to the slash-command copies (`.agents/command/publish.md`,
|
|
|
91
92
|
|
|
92
93
|
---
|
|
93
94
|
|
|
94
|
-
## STEP 1: CONFIRM
|
|
95
|
+
## STEP 1: CONFIRM AND CLASSIFY THE RELEASE SELECTOR
|
|
95
96
|
|
|
96
|
-
If the user already
|
|
97
|
+
If the user already supplied the selector in the command argument or message, that IS the confirmation. Parse it exactly once:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
RELEASE_INPUT="${ARGUMENTS}"
|
|
101
|
+
if [[ "$RELEASE_INPUT" =~ ^(patch|minor|major)$ ]]; then
|
|
102
|
+
RELEASE_KIND=bump
|
|
103
|
+
elif [[ "$RELEASE_INPUT" =~ ^([0-9]+\.){2}[0-9]+(-[0-9A-Za-z]+(\.[0-9A-Za-z]+)*)?$ ]]; then
|
|
104
|
+
RELEASE_KIND=version
|
|
105
|
+
else
|
|
106
|
+
echo "Invalid release selector: $RELEASE_INPUT" >&2
|
|
107
|
+
exit 1
|
|
108
|
+
fi
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Only ask and wait when no selector was provided.
|
|
97
112
|
|
|
98
113
|
---
|
|
99
114
|
|
|
@@ -124,16 +139,29 @@ This ensures the GitHub Actions workflow runs on the latest code including all l
|
|
|
124
139
|
|
|
125
140
|
## STEP 3: TRIGGER GITHUB ACTIONS WORKFLOW
|
|
126
141
|
|
|
127
|
-
|
|
128
|
-
```bash
|
|
129
|
-
gh workflow run publish -f bump={bump_type}
|
|
130
|
-
```
|
|
142
|
+
Dispatch from `dev`, pass bump selectors through `bump`, and pass exact versions through `version`. The required `bump` input remains `patch` for explicit-version dispatches but is ignored by the workflow because `version` takes precedence.
|
|
131
143
|
|
|
132
|
-
Wait 3 seconds, then get the run ID:
|
|
133
144
|
```bash
|
|
134
|
-
|
|
145
|
+
if [ "$RELEASE_KIND" = bump ]; then
|
|
146
|
+
RUN_URL="$(gh workflow run publish.yml --ref dev -f "bump=${RELEASE_INPUT}")"
|
|
147
|
+
else
|
|
148
|
+
RUN_URL="$(gh workflow run publish.yml --ref dev -f bump=patch -f "version=${RELEASE_INPUT}")"
|
|
149
|
+
fi
|
|
150
|
+
|
|
151
|
+
if ! [[ "$RUN_URL" =~ ^https://github.com/code-yeongyu/oh-my-openagent/actions/runs/[0-9]+$ ]]; then
|
|
152
|
+
echo "Publish dispatch did not return an exact workflow run URL: $RUN_URL" >&2
|
|
153
|
+
exit 1
|
|
154
|
+
fi
|
|
155
|
+
RUN_ID="${RUN_URL##*/}"
|
|
156
|
+
if ! [[ "$RUN_ID" =~ ^[0-9]+$ ]]; then
|
|
157
|
+
echo "Publish dispatch returned an invalid run ID: $RUN_ID" >&2
|
|
158
|
+
exit 1
|
|
159
|
+
fi
|
|
160
|
+
gh run view "${RUN_ID}" --json databaseId,status,url --jq '{databaseId,status,url}'
|
|
135
161
|
```
|
|
136
162
|
|
|
163
|
+
The returned run ID owns this release attempt. Never replace it with a latest-run lookup.
|
|
164
|
+
|
|
137
165
|
---
|
|
138
166
|
|
|
139
167
|
## STEP 4: WAIT FOR WORKFLOW COMPLETION
|
|
@@ -149,14 +177,14 @@ The publish run is a single workflow with sequential stages. Expected timeline (
|
|
|
149
177
|
|
|
150
178
|
Poll job-level status every 30 seconds and report stage transitions to the user:
|
|
151
179
|
```bash
|
|
152
|
-
gh run view {
|
|
180
|
+
gh run view "${RUN_ID}" --json status,conclusion,jobs --jq '{status, conclusion, stage: ([.jobs[] | select(.status=="in_progress") | .name] | join(", "))}'
|
|
153
181
|
```
|
|
154
182
|
|
|
155
183
|
**IMPORTANT: Use polling loop, NOT sleep commands.** Use the waiting time to draft the enhanced release summary (Step 6) — do not sit idle, and do not start any review activity.
|
|
156
184
|
|
|
157
185
|
If conclusion is `failure`, show error and stop:
|
|
158
186
|
```bash
|
|
159
|
-
gh run view {
|
|
187
|
+
gh run view "${RUN_ID}" --log-failed
|
|
160
188
|
```
|
|
161
189
|
|
|
162
190
|
---
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: senpi-qa
|
|
3
|
+
description: "QA the omo Senpi adapter (packages/omo-senpi, packages/senpi-task) against the REAL senpi binary in strict isolation, and write every artifact to the one canonical evidence path .omo/evidence/omo-senpi-adapter/<slug>/. The live drivers under packages/omo-senpi/scripts/qa/ create their own isolated SENPI_CODING_AGENT_DIR and ignore the caller's, so the real ~/.senpi/agent is never written. Ships scripts/resolve-evidence-dir.mjs, which is the ONLY sanctioned way to pick an evidence directory: it rejects traversal, separators, absolute paths, and stray roots such as local-ignore/qa-evidence. Use whenever someone changes anything under packages/omo-senpi or packages/senpi-task, or wants to QA, smoke-test, verify, or debug the Senpi adapter, the task/team engine, the DAG, task RPC, or skill delivery. Triggers: senpi qa, qa senpi, senpi-qa, test senpi adapter, verify senpi task, senpi task e2e, senpi team e2e, task dag qa, live senpi driver, senpi evidence path."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Senpi QA
|
|
7
|
+
|
|
8
|
+
QA the omo Senpi adapter (`packages/omo-senpi/`) and the task engine
|
|
9
|
+
(`packages/senpi-task/`) by driving the REAL `senpi` binary. Unit tests never
|
|
10
|
+
count as live QA here: `bun run test:senpi` is the package gate, the drivers in
|
|
11
|
+
`packages/omo-senpi/scripts/qa/` are the harness proof.
|
|
12
|
+
|
|
13
|
+
## Golden rules
|
|
14
|
+
|
|
15
|
+
- **Evidence lives at exactly one path.** Every artifact goes under
|
|
16
|
+
`.omo/evidence/omo-senpi-adapter/<slug>/`. Pick it with
|
|
17
|
+
`scripts/resolve-evidence-dir.mjs` and nothing else — a hand-typed path is how
|
|
18
|
+
runs end up somewhere like `local-ignore/qa-evidence/`, which no reviewer reads
|
|
19
|
+
and the PR cannot cite.
|
|
20
|
+
- **The real agent dir stays untouched.** The live drivers build their own
|
|
21
|
+
isolated `SENPI_CODING_AGENT_DIR` and deliberately IGNORE a caller-provided
|
|
22
|
+
one, so `~/.senpi/agent` is never used as the sandbox. Report the driver's
|
|
23
|
+
`realSenpiUntouched` / changed-path fields and the isolated agent-dir path;
|
|
24
|
+
treat a whole-directory digest as supporting evidence, not proof by itself.
|
|
25
|
+
- **No binary means SKIP, not silence.** When `senpi` is absent the live drivers
|
|
26
|
+
report `SKIP` or `FAIL` in their final JSON rather than degrading to the real
|
|
27
|
+
home. A `SKIP` is not a pass — say so in the evidence README.
|
|
28
|
+
- **The captured JSON is the evidence.** No file on disk means the QA did not
|
|
29
|
+
happen, which means no commit and no push.
|
|
30
|
+
|
|
31
|
+
## Resolve the evidence directory first
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
ev="$(node .agents/skills/senpi-qa/scripts/resolve-evidence-dir.mjs \
|
|
35
|
+
--repo-root "$(git rev-parse --show-toplevel)" --slug <YYYYMMDD>-<short-slug>)"
|
|
36
|
+
mkdir -p "$ev"
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
The resolver returns an absolute path and creates nothing, so the caller decides
|
|
40
|
+
when the directory appears. A slug is ONE relative segment of lowercase letters,
|
|
41
|
+
digits, and hyphens (`20260820-senpi-qa-contract`). Separators, `.`/`..`,
|
|
42
|
+
traversal, absolute paths, and a non-git root are rejected with a non-zero exit
|
|
43
|
+
and a message naming the offending slug.
|
|
44
|
+
|
|
45
|
+
## Router: pick your case
|
|
46
|
+
|
|
47
|
+
| You changed… | Run | Proves |
|
|
48
|
+
|---|---|---|
|
|
49
|
+
| Any adapter code, as the fast precondition | `node packages/omo-senpi/scripts/qa/drive.mjs --self-test` | the driver + isolation harness itself works |
|
|
50
|
+
| Adapter wiring reaching a live session | `node packages/omo-senpi/scripts/qa/drive.mjs` | a real senpi run with the plugin loaded, isolated agent dir, and no attributed real-home changes |
|
|
51
|
+
| Task lifecycle (single + batch) | `SENPI_BIN="$(command -v senpi)" node packages/omo-senpi/scripts/qa/task-e2e.mjs` | live task start/stream/terminal states |
|
|
52
|
+
| Team delivery, shutdown, reclaim, restart recovery | `SENPI_BIN="$(command -v senpi)" node packages/omo-senpi/scripts/qa/team-e2e.mjs` | injection delivery and exactly-once recovery |
|
|
53
|
+
| Task RPC driver scripts | `node packages/omo-senpi/scripts/qa/task-rpc-e2e.mjs --self-test` | the RPC surface contract |
|
|
54
|
+
| Skill delivery into a task | `SENPI_BIN="$(command -v senpi)" node packages/omo-senpi/scripts/qa/task-load-skills-e2e.mjs` | skills reach the child |
|
|
55
|
+
| Continuation behavior | `node packages/omo-senpi/scripts/qa/probe-continuation.mjs` | turns continue as expected |
|
|
56
|
+
| DAG state machine / runners | `bun test packages/senpi-task` | unit + chaos invariants (NOT live proof) |
|
|
57
|
+
|
|
58
|
+
Point a driver's output at the resolved directory, e.g.:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
TASK_E2E_OUT_DIR="$ev/live-task-dag" SENPI_BIN="$(command -v senpi)" \
|
|
62
|
+
node packages/omo-senpi/scripts/qa/task-e2e.mjs
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Package gate
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
tsgo --noEmit -p packages/omo-senpi/tsconfig.json
|
|
69
|
+
bun run test:senpi
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Write the evidence README
|
|
73
|
+
|
|
74
|
+
Every run leaves `$ev/README.md` a reviewer can read without rerunning anything.
|
|
75
|
+
The required sections are the repo-wide evidence rules in the root
|
|
76
|
+
[`AGENTS.md`](../../../AGENTS.md) (what was tested / observed / why it is enough /
|
|
77
|
+
what was omitted). For Senpi, record the driver's changed-path/isolation fields
|
|
78
|
+
and sandbox agent-dir path. Some drivers report sandbox paths without removing
|
|
79
|
+
them; the caller must delete every task-owned sandbox and verify child PIDs are
|
|
80
|
+
terminal before writing the cleanup receipt.
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// resolve-evidence-dir.mjs - pick the canonical evidence directory for a live Senpi QA run.
|
|
3
|
+
//
|
|
4
|
+
// Live Senpi QA artifacts belong under .omo/evidence/omo-senpi-adapter/<slug>/ and nowhere else.
|
|
5
|
+
// That path is the repository-standard location every reviewer and AGENTS.md rule points at, so a
|
|
6
|
+
// hand-typed alternative (local-ignore/qa-evidence/..., a temp dir, a traversal) silently strands
|
|
7
|
+
// the evidence where the PR cannot cite it. Resolving through this script makes the path a checked
|
|
8
|
+
// contract instead of a convention.
|
|
9
|
+
//
|
|
10
|
+
// The resolver COMPUTES and VALIDATES only; creating the directory stays the caller's decision, so
|
|
11
|
+
// a rejected slug never leaves a stray directory behind.
|
|
12
|
+
//
|
|
13
|
+
// node resolve-evidence-dir.mjs --repo-root "$(git rev-parse --show-toplevel)" --slug 20260820-my-run
|
|
14
|
+
//
|
|
15
|
+
// Prints the absolute path to stdout. Exit 0 iff the root is a git worktree and the slug is safe.
|
|
16
|
+
import { existsSync, realpathSync } from "node:fs"
|
|
17
|
+
import { join, resolve } from "node:path"
|
|
18
|
+
import { fileURLToPath } from "node:url"
|
|
19
|
+
|
|
20
|
+
export const EVIDENCE_RELATIVE_ROOT = join(".omo", "evidence", "omo-senpi-adapter")
|
|
21
|
+
|
|
22
|
+
// One relative segment: lowercase alphanumerics joined by single hyphens. This is what makes the
|
|
23
|
+
// path predictable - it also rejects every separator, traversal, and absolute form outright, since
|
|
24
|
+
// none of them can match.
|
|
25
|
+
const SAFE_SLUG = /^[a-z0-9]+(?:-[a-z0-9]+)*$/
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* @param {{ repoRoot: string, slug: string }} input
|
|
29
|
+
* @returns {string} absolute evidence directory; NOT created
|
|
30
|
+
*/
|
|
31
|
+
export function resolveEvidenceDir({ repoRoot, slug }) {
|
|
32
|
+
if (typeof repoRoot !== "string" || repoRoot.length === 0) {
|
|
33
|
+
throw new Error("repoRoot must be a non-empty path to a git worktree")
|
|
34
|
+
}
|
|
35
|
+
if (!existsSync(join(repoRoot, ".git"))) {
|
|
36
|
+
throw new Error(`repoRoot is not a git worktree: ${repoRoot}`)
|
|
37
|
+
}
|
|
38
|
+
if (typeof slug !== "string" || !SAFE_SLUG.test(slug)) {
|
|
39
|
+
throw new Error(
|
|
40
|
+
`slug must be one lowercase alphanumeric-and-hyphen segment (got ${JSON.stringify(slug)}); ` +
|
|
41
|
+
`evidence lives under ${EVIDENCE_RELATIVE_ROOT}/<slug>`,
|
|
42
|
+
)
|
|
43
|
+
}
|
|
44
|
+
return resolve(repoRoot, EVIDENCE_RELATIVE_ROOT, slug)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const isDirectRun =
|
|
48
|
+
process.argv[1] !== undefined &&
|
|
49
|
+
existsSync(process.argv[1]) &&
|
|
50
|
+
realpathSync(process.argv[1]) === realpathSync(fileURLToPath(import.meta.url))
|
|
51
|
+
|
|
52
|
+
if (isDirectRun) {
|
|
53
|
+
const args = process.argv.slice(2)
|
|
54
|
+
const read = (flag) => {
|
|
55
|
+
const at = args.indexOf(flag)
|
|
56
|
+
return at === -1 ? undefined : args[at + 1]
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
const dir = resolveEvidenceDir({ repoRoot: read("--repo-root") ?? process.cwd(), slug: read("--slug") })
|
|
60
|
+
process.stdout.write(`${dir}\n`)
|
|
61
|
+
} catch (error) {
|
|
62
|
+
process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`)
|
|
63
|
+
process.exit(1)
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { afterEach, describe, expect, test } from "bun:test"
|
|
2
|
+
import { spawnSync } from "node:child_process"
|
|
3
|
+
import { existsSync, mkdirSync, mkdtempSync, rmSync, symlinkSync } from "node:fs"
|
|
4
|
+
import { tmpdir } from "node:os"
|
|
5
|
+
import { join, relative } from "node:path"
|
|
6
|
+
import { fileURLToPath, pathToFileURL } from "node:url"
|
|
7
|
+
|
|
8
|
+
import { EVIDENCE_RELATIVE_ROOT, resolveEvidenceDir } from "./resolve-evidence-dir.mjs"
|
|
9
|
+
|
|
10
|
+
const cleanupRoots = []
|
|
11
|
+
const cliPath = fileURLToPath(new URL("./resolve-evidence-dir.mjs", import.meta.url))
|
|
12
|
+
|
|
13
|
+
afterEach(() => {
|
|
14
|
+
for (const root of cleanupRoots.splice(0)) rmSync(root, { recursive: true, force: true })
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
function makeGitRoot() {
|
|
18
|
+
const root = mkdtempSync(join(tmpdir(), "senpi-qa-evidence-"))
|
|
19
|
+
cleanupRoots.push(root)
|
|
20
|
+
mkdirSync(join(root, ".git"))
|
|
21
|
+
return root
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
describe("resolveEvidenceDir", () => {
|
|
25
|
+
test("#given a git worktree and a safe slug #when resolved #then it returns the canonical adapter evidence directory", () => {
|
|
26
|
+
// given
|
|
27
|
+
const repoRoot = makeGitRoot()
|
|
28
|
+
|
|
29
|
+
// when
|
|
30
|
+
const resolved = resolveEvidenceDir({ repoRoot, slug: "20260820-senpi-qa-contract" })
|
|
31
|
+
|
|
32
|
+
// then
|
|
33
|
+
expect(resolved).toBe(join(repoRoot, ".omo", "evidence", "omo-senpi-adapter", "20260820-senpi-qa-contract"))
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
test("#given a relative git worktree path #when resolved #then it still returns an absolute evidence directory", () => {
|
|
37
|
+
// given
|
|
38
|
+
const repoRoot = makeGitRoot()
|
|
39
|
+
const relativeRoot = relative(process.cwd(), repoRoot)
|
|
40
|
+
|
|
41
|
+
// when
|
|
42
|
+
const resolved = resolveEvidenceDir({ repoRoot: relativeRoot, slug: "20260820-relative-root" })
|
|
43
|
+
|
|
44
|
+
// then
|
|
45
|
+
expect(resolved).toBe(join(repoRoot, ".omo", "evidence", "omo-senpi-adapter", "20260820-relative-root"))
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
test("#given a resolved evidence path #when the resolver returns #then it has created no directory", () => {
|
|
49
|
+
// given
|
|
50
|
+
const repoRoot = makeGitRoot()
|
|
51
|
+
|
|
52
|
+
// when
|
|
53
|
+
const resolved = resolveEvidenceDir({ repoRoot, slug: "20260820-senpi-qa-contract" })
|
|
54
|
+
|
|
55
|
+
// then
|
|
56
|
+
expect(existsSync(resolved)).toBe(false)
|
|
57
|
+
expect(existsSync(join(repoRoot, ".omo"))).toBe(false)
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
test("#given the adapter evidence root #when it is the declared relative root #then it stays under .omo/evidence", () => {
|
|
61
|
+
// given / when / then
|
|
62
|
+
expect(EVIDENCE_RELATIVE_ROOT).toBe(join(".omo", "evidence", "omo-senpi-adapter"))
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
test("#given an unsafe slug #when resolved #then it is rejected before any path is produced", () => {
|
|
66
|
+
// given
|
|
67
|
+
const repoRoot = makeGitRoot()
|
|
68
|
+
const unsafeSlugs = [
|
|
69
|
+
"",
|
|
70
|
+
" ",
|
|
71
|
+
".",
|
|
72
|
+
"..",
|
|
73
|
+
"../escape",
|
|
74
|
+
"nested/slug",
|
|
75
|
+
"nested\\slug",
|
|
76
|
+
"/absolute",
|
|
77
|
+
join(repoRoot, "absolute"),
|
|
78
|
+
"local-ignore/qa-evidence/20260819-senpi",
|
|
79
|
+
"..%2Fescape",
|
|
80
|
+
"-leading-hyphen",
|
|
81
|
+
"trailing-hyphen-",
|
|
82
|
+
"Upper-Case",
|
|
83
|
+
"under_score",
|
|
84
|
+
]
|
|
85
|
+
|
|
86
|
+
// when / then
|
|
87
|
+
for (const slug of unsafeSlugs) {
|
|
88
|
+
expect(() => resolveEvidenceDir({ repoRoot, slug }), `must reject ${JSON.stringify(slug)}`).toThrow()
|
|
89
|
+
}
|
|
90
|
+
})
|
|
91
|
+
|
|
92
|
+
test("#given a directory that is not a git worktree #when resolved #then it is rejected", () => {
|
|
93
|
+
// given
|
|
94
|
+
const notARepo = mkdtempSync(join(tmpdir(), "senpi-qa-not-git-"))
|
|
95
|
+
cleanupRoots.push(notARepo)
|
|
96
|
+
|
|
97
|
+
// when / then
|
|
98
|
+
expect(() => resolveEvidenceDir({ repoRoot: notARepo, slug: "20260820-senpi-qa-contract" })).toThrow(/git/i)
|
|
99
|
+
})
|
|
100
|
+
|
|
101
|
+
test("#given a rejected slug #when the error surfaces #then it names the offending slug for the operator", () => {
|
|
102
|
+
// given
|
|
103
|
+
const repoRoot = makeGitRoot()
|
|
104
|
+
|
|
105
|
+
// when / then
|
|
106
|
+
expect(() => resolveEvidenceDir({ repoRoot, slug: "local-ignore/qa-evidence/x" })).toThrow(
|
|
107
|
+
/local-ignore\/qa-evidence\/x/,
|
|
108
|
+
)
|
|
109
|
+
})
|
|
110
|
+
|
|
111
|
+
test("#given the documented Node CLI #when valid and invalid slugs run #then stdout and exit codes enforce the contract", () => {
|
|
112
|
+
// given
|
|
113
|
+
const repoRoot = makeGitRoot()
|
|
114
|
+
|
|
115
|
+
// when
|
|
116
|
+
const valid = spawnSync("node", [cliPath, "--repo-root", repoRoot, "--slug", "20260820-node-cli"], {
|
|
117
|
+
encoding: "utf8",
|
|
118
|
+
})
|
|
119
|
+
const invalid = spawnSync(
|
|
120
|
+
"node",
|
|
121
|
+
[cliPath, "--repo-root", repoRoot, "--slug", "local-ignore/qa-evidence/x"],
|
|
122
|
+
{ encoding: "utf8" },
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
// then
|
|
126
|
+
expect(valid.status).toBe(0)
|
|
127
|
+
expect(valid.stdout.trim()).toBe(join(repoRoot, EVIDENCE_RELATIVE_ROOT, "20260820-node-cli"))
|
|
128
|
+
expect(invalid.status).toBe(1)
|
|
129
|
+
expect(invalid.stderr).toContain("local-ignore/qa-evidence/x")
|
|
130
|
+
})
|
|
131
|
+
|
|
132
|
+
test("#given a symlink to the documented Node CLI #when invoked #then the entrypoint still enforces the contract", () => {
|
|
133
|
+
// given
|
|
134
|
+
const repoRoot = makeGitRoot()
|
|
135
|
+
const symlinkPath = join(repoRoot, "resolve-evidence-dir.mjs")
|
|
136
|
+
symlinkSync(cliPath, symlinkPath)
|
|
137
|
+
|
|
138
|
+
// when
|
|
139
|
+
const result = spawnSync(
|
|
140
|
+
"node",
|
|
141
|
+
[symlinkPath, "--repo-root", repoRoot, "--slug", "20260820-symlink-cli"],
|
|
142
|
+
{ encoding: "utf8" },
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
// then
|
|
146
|
+
expect(result.status).toBe(0)
|
|
147
|
+
expect(result.stdout.trim()).toBe(join(repoRoot, EVIDENCE_RELATIVE_ROOT, "20260820-symlink-cli"))
|
|
148
|
+
})
|
|
149
|
+
|
|
150
|
+
test("#given an embedding runner with a missing argv path #when the module is imported #then exports still load", () => {
|
|
151
|
+
// given
|
|
152
|
+
const missingEntrypoint = join(tmpdir(), `missing-senpi-qa-entrypoint-${process.pid}.mjs`)
|
|
153
|
+
const moduleUrl = pathToFileURL(cliPath).href
|
|
154
|
+
|
|
155
|
+
// when
|
|
156
|
+
const result = spawnSync(
|
|
157
|
+
"node",
|
|
158
|
+
[
|
|
159
|
+
"--input-type=module",
|
|
160
|
+
"--eval",
|
|
161
|
+
`process.argv[1] = ${JSON.stringify(missingEntrypoint)}; await import(${JSON.stringify(moduleUrl)})`,
|
|
162
|
+
],
|
|
163
|
+
{ encoding: "utf8" },
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
// then
|
|
167
|
+
expect(result.status).toBe(0)
|
|
168
|
+
expect(result.stdout).toBe("")
|
|
169
|
+
expect(result.stderr).toBe("")
|
|
170
|
+
})
|
|
171
|
+
})
|
|
@@ -196,12 +196,20 @@ while true:
|
|
|
196
196
|
|
|
197
197
|
### Gate A: CI Checks
|
|
198
198
|
|
|
199
|
-
CI is the fastest feedback loop.
|
|
199
|
+
CI is the fastest feedback loop. Subscribe to its completion via `monitor` — never block a model round-trip on `gh pr checks --watch`.
|
|
200
200
|
|
|
201
|
-
```
|
|
202
|
-
#
|
|
203
|
-
#
|
|
204
|
-
|
|
201
|
+
```
|
|
202
|
+
# Subscribe to CI completion — the monitor event wakes the session when checks finish.
|
|
203
|
+
# Do NOT use `gh pr checks --watch` as a blocking tool call; it burns a full model
|
|
204
|
+
# round-trip (~29s) on every poll. Instead, register a monitor and end the turn:
|
|
205
|
+
monitor({
|
|
206
|
+
description: "CI completion for PR $PR_NUMBER",
|
|
207
|
+
command: "gh pr checks $PR_NUMBER --watch --fail-fast",
|
|
208
|
+
filter: "completed|fail|cancel"
|
|
209
|
+
})
|
|
210
|
+
# → end turn; the monitor's matching line arrives as an injected event.
|
|
211
|
+
# For a single midpoint status peek (at most once), use:
|
|
212
|
+
# gh pr checks "$PR_NUMBER" # one-shot, no --watch
|
|
205
213
|
```
|
|
206
214
|
|
|
207
215
|
**On failure**: Get the failed run logs to understand what broke:
|
|
@@ -243,20 +251,21 @@ fi
|
|
|
243
251
|
|
|
244
252
|
**On issues**: Cubic's review body contains structured issue descriptions. Parse them, determine which are valid (some may be false positives), and fix the valid ones per the iteration discipline below.
|
|
245
253
|
|
|
246
|
-
Cubic reviews are triggered automatically on PR updates. After pushing a fix,
|
|
254
|
+
Cubic reviews are triggered automatically on PR updates. After pushing a fix, subscribe to the new review arriving — never spin a `for _ in $(seq 1 30)` polling loop that burns model round-trips.
|
|
247
255
|
|
|
248
|
-
```
|
|
249
|
-
#
|
|
250
|
-
#
|
|
256
|
+
```
|
|
257
|
+
# Subscribe to a NEW Cubic review after push. The monitor exits when a review
|
|
258
|
+
# newer than PUSH_TIME appears, or times out (quota exhausted → Gate B SKIPPED).
|
|
251
259
|
PUSH_TIME=$(date -u +%Y-%m-%dT%H:%M:%SZ)
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
#
|
|
259
|
-
|
|
260
|
+
monitor({
|
|
261
|
+
description: "Cubic review for PR $PR_NUMBER",
|
|
262
|
+
command: "LATEST=$(gh api repos/${REPO}/pulls/${PR_NUMBER}/reviews --jq '[.[] | select(.user.login == "cubic-dev-ai[bot]")] | last | .submitted_at // empty'); [ -n \"$LATEST\" ] && [ \"$LATEST\" > \"$PUSH_TIME\" ] && echo NEW_REVIEW || echo WAITING",
|
|
263
|
+
filter: "NEW_REVIEW",
|
|
264
|
+
timeout_ms: 600000 # 10 min bound — if no review arrives, Gate B is SKIPPED (quota exhausted)
|
|
265
|
+
})
|
|
266
|
+
# → end turn; if the monitor times out without NEW_REVIEW, treat Gate B as SKIPPED.
|
|
267
|
+
# For a single midpoint peek (at most once), use:
|
|
268
|
+
# gh api "repos/${REPO}/pulls/${PR_NUMBER}/reviews" --jq '[.[] | select(.user.login == "cubic-dev-ai[bot]")] | last | .submitted_at'
|
|
260
269
|
```
|
|
261
270
|
|
|
262
271
|
### Iteration discipline
|
|
@@ -292,13 +301,18 @@ gh pr merge "$PR_NUMBER" --merge --auto --delete-branch
|
|
|
292
301
|
# are green, fall back to a direct merge: gh pr merge "$PR_NUMBER" --merge --delete-branch
|
|
293
302
|
```
|
|
294
303
|
|
|
295
|
-
Then
|
|
304
|
+
Then subscribe to the merge completing — never block a model round-trip on an `until [ ... MERGED ]` polling loop:
|
|
296
305
|
|
|
297
|
-
```
|
|
298
|
-
#
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
306
|
+
```
|
|
307
|
+
# Subscribe to merge completion. The monitor exits when gh pr view returns MERGED.
|
|
308
|
+
monitor({
|
|
309
|
+
description: "Merge completion for PR $PR_NUMBER",
|
|
310
|
+
command: "[ \"$(gh pr view $PR_NUMBER --json state -q .state)\" = \"MERGED\" ] && echo MERGED || echo WAITING",
|
|
311
|
+
filter: "MERGED",
|
|
312
|
+
timeout_ms: 1800000 # 30 min bound for auto-merge to land after all gates pass
|
|
313
|
+
})
|
|
314
|
+
# → end turn; the MERGED event wakes the session for the cleanup step.
|
|
315
|
+
# If the monitor times out, check merge state once: gh pr view "$PR_NUMBER" --json state -q .state
|
|
302
316
|
```
|
|
303
317
|
|
|
304
318
|
If the user opted out of merging, skip the merge but STILL run the cleanup below: the worktree is removed either way.
|