oh-my-opencode 4.19.4 → 5.0.0-beta.2
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/README.ja.md +1 -1
- package/README.ko.md +1 -1
- package/README.md +6 -5
- package/README.ru.md +1 -1
- package/README.zh-cn.md +1 -1
- package/bin/oh-my-opencode.js +14 -1
- package/bin/oh-my-opencode.test.ts +21 -0
- package/dist/cli/index.js +1452 -703
- package/dist/cli-node/index.js +1452 -703
- package/dist/config/schema/agent-overrides.d.ts +528 -0
- package/dist/config/schema/oh-my-opencode-config.d.ts +495 -0
- package/dist/features/monitor/batcher.d.ts +3 -1
- package/dist/features/monitor/manager-internals.d.ts +1 -0
- package/dist/features/monitor/output-injector-types.d.ts +2 -0
- package/dist/features/monitor/output-injector.d.ts +6 -0
- package/dist/hooks/todo-continuation-enforcer/types.d.ts +1 -0
- package/dist/hooks/todo-continuation-enforcer/unrecoverable-request-error.d.ts +9 -0
- package/dist/hooks/tool-pair-validator/hook.test-support.d.ts +29 -0
- package/dist/hooks/tool-pair-validator/tool-part-ids.d.ts +14 -5
- package/dist/hooks/tool-pair-validator/tool-result-repair.d.ts +4 -3
- package/dist/hooks/tool-pair-validator/types.d.ts +5 -22
- package/dist/index.js +2776 -2240
- package/dist/mcp/lsp.d.ts +1 -0
- package/dist/oh-my-opencode.schema.json +1466 -131
- package/dist/shared/tmux/constants.d.ts +1 -1
- package/dist/skills/ast-grep/SOURCE +1 -1
- package/dist/skills/ast-grep/install.ps1 +2 -2
- package/dist/skills/ast-grep/install.sh +1 -1
- package/dist/skills/ast-grep/references/install.md +2 -2
- package/dist/skills/ast-grep/tests/smoke.sh +1 -1
- package/dist/skills/start-work/SKILL.md +54 -9
- package/dist/skills/ultimate-browsing/SKILL.md +2 -2
- package/dist/skills/ultimate-browsing/engine/__main__.py +8 -1
- package/dist/skills/ultimate-browsing/engine/bias_check.py +11 -0
- package/dist/skills/ultimate-browsing/engine/fetch_chain.py +90 -52
- package/dist/skills/ultimate-browsing/engine/result_schema.py +10 -1
- package/dist/skills/ultimate-browsing/engine/surrogate.py +214 -0
- package/dist/skills/ultimate-browsing/engine/surrogates.yaml +60 -0
- package/dist/skills/ultimate-browsing/engine/tests/fixtures/amp_redirect_stub.html +7 -0
- package/dist/skills/ultimate-browsing/engine/tests/fixtures/search_interstitial.html +19 -0
- package/dist/skills/ultimate-browsing/engine/tests/fixtures/wayback_available.json +1 -0
- package/dist/skills/ultimate-browsing/engine/tests/fixtures/wayback_snapshot.html +1128 -0
- package/dist/skills/ultimate-browsing/engine/tests/test_surrogate.py +252 -0
- package/dist/skills/ultimate-browsing/engine/tests/test_surrogate_validators.py +78 -0
- package/dist/skills/ultimate-browsing/engine/validators.py +46 -0
- package/dist/skills/ultimate-browsing/engine/waf_detector.py +1 -1
- package/dist/skills/ultimate-browsing/engine/waf_profiles.yaml +10 -5
- package/dist/skills/ultimate-browsing/references/agent-reach/social.md +1 -1
- package/dist/skills/ultimate-browsing/references/chrome-stealth.md +13 -11
- package/dist/skills/ultimate-browsing/references/insane-search/README.md +4 -4
- package/dist/skills/ultimate-browsing/references/insane-search/cache-archive.md +51 -50
- package/dist/skills/ultimate-browsing/references/insane-search/fallback.md +1 -1
- package/dist/skills/ultimate-browsing/references/insane-search/jina.md +8 -2
- package/dist/skills/ultimate-browsing/references/insane-search/naver.md +1 -1
- package/dist/skills/ultimate-browsing/references/insane-search/twitter.md +3 -3
- package/dist/skills/ulw-plan/SKILL.md +1 -1
- package/dist/skills/ulw-plan/references/full-workflow.md +3 -3
- package/dist/skills/ulw-plan/scripts/scaffold-plan.mjs +1 -1
- package/dist/skills/ulw-research/SKILL.md +15 -10
- package/dist/tui.js +307 -28
- package/docs/reference/web-terminal-visual-qa.md +1 -1
- package/package.json +27 -19
- package/packages/lsp-core/src/lsp/connection.ts +1 -1
- package/packages/lsp-daemon/dist/cli.js +27 -13
- package/packages/lsp-daemon/dist/client.js +49 -35
- package/packages/lsp-daemon/dist/ensure-daemon.d.ts +1 -0
- package/packages/lsp-daemon/dist/ensure-daemon.js +18 -5
- package/packages/lsp-daemon/dist/index.js +34 -20
- package/packages/lsp-tools-mcp/dist/cli.js +1 -1
- package/packages/lsp-tools-mcp/dist/lsp/manager.js +1 -1
- package/packages/lsp-tools-mcp/dist/mcp.js +1 -1
- package/packages/lsp-tools-mcp/dist/tools.js +1 -1
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +268 -92
- 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/setup.ts +7 -7
- package/packages/omo-codex/plugin/components/bootstrap/src/worker.ts +3 -0
- package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +106 -6
- package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +106 -6
- package/packages/omo-codex/plugin/components/codegraph/package.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/package.json +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 +1 -1
- 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 +1 -1
- package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +3 -3
- package/packages/omo-codex/plugin/components/lsp/dist/cli.js +56 -42
- package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
- package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/rules/package.json +1 -1
- package/packages/omo-codex/plugin/components/start-work-continuation/AGENTS.md +1 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/README.md +5 -1
- package/packages/omo-codex/plugin/components/start-work-continuation/directive.md +2 -1
- package/packages/omo-codex/plugin/components/start-work-continuation/dist/cli.js +18 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
- package/packages/omo-codex/plugin/components/start-work-continuation/src/codex-hook.ts +21 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/test/codex-hook.test.ts +105 -0
- package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/CHANGELOG.md +2 -0
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-code-reviewer.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-gate-reviewer.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-qa-executor.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-high.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-low.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-medium.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +2 -2
- package/packages/omo-codex/plugin/components/ultrawork/directive.md +3 -2
- package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md +3 -2
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +3 -3
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/scripts/scaffold-plan.mjs +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/AGENTS.md +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/CHANGELOG.md +2 -0
- package/packages/omo-codex/plugin/components/ulw-loop/README.md +11 -11
- package/packages/omo-codex/plugin/components/ulw-loop/directive.md +3 -2
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-reconciliation.js +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.d.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.js +9 -9
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-steering.js +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +66 -66
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.js +4 -4
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-hook.js +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-crud.js +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.js +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/steering.js +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.js +2 -2
- package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +3 -3
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +22 -25
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-reconciliation.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli-output.ts +9 -9
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli-steering.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +4 -4
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-hook.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/plan-crud.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/plan-io.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/steering.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/stop-resume-hook.ts +2 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-commands.test.ts +2 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-entrypoint.test.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-helpers.test.ts +2 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-steering-kind-guidance.test.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/codex-hook.test.ts +2 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/quality-gate-builder.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +5 -5
- package/packages/omo-codex/plugin/components/ulw-loop/test/plan-io.test.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-roles.test.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/steering.test.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/stop-resume-hook.test.ts +1 -1
- 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-start-work-continuation.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +1 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/package-lock.json +13 -13
- package/packages/omo-codex/plugin/package.json +1 -1
- package/packages/omo-codex/plugin/scripts/sync-skills.mjs +4 -4
- package/packages/omo-codex/plugin/skills/ast-grep/SOURCE +1 -1
- package/packages/omo-codex/plugin/skills/ast-grep/install.ps1 +2 -2
- package/packages/omo-codex/plugin/skills/ast-grep/install.sh +1 -1
- package/packages/omo-codex/plugin/skills/ast-grep/references/install.md +2 -2
- package/packages/omo-codex/plugin/skills/ast-grep/tests/smoke.sh +1 -1
- package/packages/omo-codex/plugin/skills/start-work/SKILL.md +54 -9
- package/packages/omo-codex/plugin/skills/ultimate-browsing/SKILL.md +2 -2
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/__main__.py +8 -1
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/bias_check.py +11 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/fetch_chain.py +90 -52
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/result_schema.py +10 -1
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/surrogate.py +214 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/surrogates.yaml +60 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/fixtures/amp_redirect_stub.html +7 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/fixtures/search_interstitial.html +19 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/fixtures/wayback_available.json +1 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/fixtures/wayback_snapshot.html +1128 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_surrogate.py +252 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_surrogate_validators.py +78 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/validators.py +46 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/waf_detector.py +1 -1
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/waf_profiles.yaml +10 -5
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/agent-reach/social.md +1 -1
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/chrome-stealth.md +13 -11
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/README.md +4 -4
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/cache-archive.md +51 -50
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/fallback.md +1 -1
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/jina.md +8 -2
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/naver.md +1 -1
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/twitter.md +3 -3
- package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +3 -2
- package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +3 -3
- package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +22 -25
- package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +3 -3
- package/packages/omo-codex/plugin/skills/ulw-plan/scripts/scaffold-plan.mjs +1 -1
- package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +15 -10
- package/packages/omo-codex/plugin/test/bootstrap-binlinks.test.mjs +12 -12
- package/packages/omo-codex/plugin/test/bootstrap-orchestration.test.mjs +36 -4
- package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +1 -1
- package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +4 -4
- package/packages/omo-codex/scripts/install-bin-links.test.mjs +56 -2
- package/packages/omo-codex/scripts/install-delegated-command.test.mjs +6 -6
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +115 -61
- package/packages/omo-codex/scripts/install-local-entrypoint.test.mjs +4 -4
- package/packages/omo-codex/scripts/install-local.test.mjs +5 -2
- package/packages/shared-skills/index.mjs +19 -1
- package/packages/shared-skills/skills/ast-grep/SOURCE +1 -1
- package/packages/shared-skills/skills/ast-grep/install.ps1 +2 -2
- package/packages/shared-skills/skills/ast-grep/install.sh +1 -1
- package/packages/shared-skills/skills/ast-grep/references/install.md +2 -2
- package/packages/shared-skills/skills/ast-grep/tests/smoke.sh +1 -1
- package/packages/shared-skills/skills/start-work/SKILL.md +54 -9
- package/packages/shared-skills/skills/ultimate-browsing/SKILL.md +2 -2
- package/packages/shared-skills/skills/ultimate-browsing/engine/__main__.py +8 -1
- package/packages/shared-skills/skills/ultimate-browsing/engine/bias_check.py +11 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/fetch_chain.py +90 -52
- package/packages/shared-skills/skills/ultimate-browsing/engine/result_schema.py +10 -1
- package/packages/shared-skills/skills/ultimate-browsing/engine/surrogate.py +214 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/surrogates.yaml +60 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/tests/fixtures/amp_redirect_stub.html +7 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/tests/fixtures/search_interstitial.html +19 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/tests/fixtures/wayback_available.json +1 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/tests/fixtures/wayback_snapshot.html +1128 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/tests/test_surrogate.py +252 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/tests/test_surrogate_validators.py +78 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/validators.py +46 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/waf_detector.py +1 -1
- package/packages/shared-skills/skills/ultimate-browsing/engine/waf_profiles.yaml +10 -5
- package/packages/shared-skills/skills/ultimate-browsing/references/agent-reach/social.md +1 -1
- package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +13 -11
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/README.md +4 -4
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/cache-archive.md +51 -50
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/fallback.md +1 -1
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/jina.md +8 -2
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/naver.md +1 -1
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/twitter.md +3 -3
- package/packages/shared-skills/skills/ulw-plan/SKILL.md +1 -1
- package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +3 -3
- package/packages/shared-skills/skills/ulw-plan/scripts/scaffold-plan.mjs +1 -1
- package/packages/shared-skills/skills/ulw-research/SKILL.md +15 -10
- package/postinstall.mjs +6 -0
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
// components/ulw-loop/src/checkpoint.ts
|
|
3
|
+
// packages/omo-codex/plugin/components/ulw-loop/src/checkpoint.ts
|
|
4
4
|
import { existsSync as existsSync3, statSync } from "node:fs";
|
|
5
5
|
import { readFile as readFile5 } from "node:fs/promises";
|
|
6
6
|
import { resolve as resolve3 } from "node:path";
|
|
7
7
|
|
|
8
|
-
// components/ulw-loop/src/checkpoint-reconciliation.ts
|
|
8
|
+
// packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-reconciliation.ts
|
|
9
9
|
import { existsSync } from "node:fs";
|
|
10
10
|
import { readFile } from "node:fs/promises";
|
|
11
11
|
|
|
12
|
-
// components/ulw-loop/src/paths.ts
|
|
12
|
+
// packages/omo-codex/plugin/components/ulw-loop/src/paths.ts
|
|
13
13
|
import { isAbsolute, join, relative, sep } from "node:path";
|
|
14
|
-
// components/ulw-loop/src/constants.ts
|
|
14
|
+
// packages/omo-codex/plugin/components/ulw-loop/src/constants.ts
|
|
15
15
|
var ULW_LOOP_DIR = ".omo/ulw-loop";
|
|
16
16
|
var ULW_LOOP_BRIEF = "brief.md";
|
|
17
17
|
var ULW_LOOP_GOALS = "goals.json";
|
|
@@ -31,7 +31,7 @@ var ULW_LOOP_SUCCESS_CRITERION_USER_MODELS = [
|
|
|
31
31
|
"regression",
|
|
32
32
|
"adversarial"
|
|
33
33
|
];
|
|
34
|
-
// components/ulw-loop/src/runtime.ts
|
|
34
|
+
// packages/omo-codex/plugin/components/ulw-loop/src/runtime.ts
|
|
35
35
|
class UlwLoopError extends Error {
|
|
36
36
|
code;
|
|
37
37
|
details;
|
|
@@ -47,7 +47,7 @@ class UlwLoopError extends Error {
|
|
|
47
47
|
function iso() {
|
|
48
48
|
return new Date().toISOString();
|
|
49
49
|
}
|
|
50
|
-
// components/ulw-loop/src/paths.ts
|
|
50
|
+
// packages/omo-codex/plugin/components/ulw-loop/src/paths.ts
|
|
51
51
|
var SESSION_ENV_KEYS = ["OMO_ULW_LOOP_SESSION_ID", "CODEX_SESSION_ID", "CODEX_THREAD_ID"];
|
|
52
52
|
function normalizeUlwLoopSessionId(sessionId) {
|
|
53
53
|
const trimmed = sessionId?.trim();
|
|
@@ -113,7 +113,7 @@ function isWithinAttemptDir(absolutePath, attemptRoot, pathApi = PLATFORM_PATH_A
|
|
|
113
113
|
return !pathApi.isAbsolute(relativePath);
|
|
114
114
|
}
|
|
115
115
|
|
|
116
|
-
// components/ulw-loop/src/goal-status.ts
|
|
116
|
+
// packages/omo-codex/plugin/components/ulw-loop/src/goal-status.ts
|
|
117
117
|
var ULW_LOOP_AGGREGATE_CODEX_OBJECTIVE = aggregateCodexObjectiveForScope();
|
|
118
118
|
function aggregateCodexObjectiveForScope(scope) {
|
|
119
119
|
return `Complete the durable ulw-loop plan in ${ulwLoopGoalsRelativePath(scope)}, including later accepted/appended stories, under the original brief constraints; use ${ulwLoopLedgerRelativePath(scope)} as the audit trail.`;
|
|
@@ -196,7 +196,7 @@ function hasEssentialCriteriaPass(goal) {
|
|
|
196
196
|
return criteria.length > 0 && criteria.every((criterion) => criterion.status === "pass");
|
|
197
197
|
}
|
|
198
198
|
|
|
199
|
-
// components/ulw-loop/src/checkpoint-reconciliation.ts
|
|
199
|
+
// packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-reconciliation.ts
|
|
200
200
|
function normalizeObjective(value) {
|
|
201
201
|
return value.replace(/\s+/g, " ").trim();
|
|
202
202
|
}
|
|
@@ -256,7 +256,7 @@ async function canReconcileActiveFinalTaskScopedAggregateSnapshot(repoRoot, plan
|
|
|
256
256
|
function buildCompletedLegacyGoalRemediation(goal) {
|
|
257
257
|
return [
|
|
258
258
|
"If get_goal returns a different completed legacy/thread objective, do not repeat --status complete in this thread.",
|
|
259
|
-
`Record a non-terminal blocker with: omo ulw-loop checkpoint --goal-id ${goal.id} --status blocked --evidence "<completed legacy Codex goal blocks create_goal in this thread>" --codex-goal-json "<different completed get_goal JSON or path>".`,
|
|
259
|
+
`Record a non-terminal blocker with: omo-agent-toolkit ulw-loop checkpoint --goal-id ${goal.id} --status blocked --evidence "<completed legacy Codex goal blocks create_goal in this thread>" --codex-goal-json "<different completed get_goal JSON or path>".`,
|
|
260
260
|
"Then continue only from a Codex goal context with no active/completed conflicting goal, in the same repo/worktree, and create the intended goal there."
|
|
261
261
|
].join(" ");
|
|
262
262
|
}
|
|
@@ -267,7 +267,7 @@ function buildTaskScopedAggregateReconciliationHint(goal, final) {
|
|
|
267
267
|
return ` Completed task-scoped aggregate reconciliation requires the checkpoint goal to be the active in-progress OMO goal, evidence that names that active OMO goal id, names .omo/ulw-loop/goals.json or ledger.jsonl, includes completed implementation plus validation/review evidence, and a get_goal objective that maps to the ulw-loop brief/artifact. ${buildCompletedLegacyGoalRemediation(goal)}`;
|
|
268
268
|
}
|
|
269
269
|
|
|
270
|
-
// components/ulw-loop/src/codex-goal-snapshot.ts
|
|
270
|
+
// packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-snapshot.ts
|
|
271
271
|
import { existsSync as existsSync2 } from "node:fs";
|
|
272
272
|
import { readFile as readFile2 } from "node:fs/promises";
|
|
273
273
|
import { resolve } from "node:path";
|
|
@@ -364,7 +364,7 @@ function formatCodexGoalReconciliation(reconciliation) {
|
|
|
364
364
|
return parts.join(" ");
|
|
365
365
|
}
|
|
366
366
|
|
|
367
|
-
// components/ulw-loop/src/plan-io.ts
|
|
367
|
+
// packages/omo-codex/plugin/components/ulw-loop/src/plan-io.ts
|
|
368
368
|
import { createReadStream } from "node:fs";
|
|
369
369
|
import { appendFile, mkdir, readFile as readFile3, rename, writeFile } from "node:fs/promises";
|
|
370
370
|
import { createInterface } from "node:readline";
|
|
@@ -408,7 +408,7 @@ async function readUlwLoopPlan(repoRoot, scope) {
|
|
|
408
408
|
} catch (error) {
|
|
409
409
|
if (!hasCode(error, "ENOENT"))
|
|
410
410
|
throw error;
|
|
411
|
-
throw new UlwLoopError(`No ulw-loop plan found at ${repoRelative(path, repoRoot)}. Run \`omo ulw-loop create-goals ...\` first.`, "ULW_LOOP_PLAN_MISSING", { cause: error });
|
|
411
|
+
throw new UlwLoopError(`No ulw-loop plan found at ${repoRelative(path, repoRoot)}. Run \`omo-agent-toolkit ulw-loop create-goals ...\` first.`, "ULW_LOOP_PLAN_MISSING", { cause: error });
|
|
412
412
|
}
|
|
413
413
|
const parsed = JSON.parse(raw);
|
|
414
414
|
if (parsed.version !== 1 || !Array.isArray(parsed.goals)) {
|
|
@@ -482,7 +482,7 @@ async function findAcceptedSteeringLedgerEntry(repoRoot, key, scope) {
|
|
|
482
482
|
return;
|
|
483
483
|
}
|
|
484
484
|
|
|
485
|
-
// components/ulw-loop/src/evidence.ts
|
|
485
|
+
// packages/omo-codex/plugin/components/ulw-loop/src/evidence.ts
|
|
486
486
|
function ulwLoopFail(message, code, details) {
|
|
487
487
|
throw new UlwLoopError(message, code, { details });
|
|
488
488
|
}
|
|
@@ -588,10 +588,10 @@ function requireEssentialCriteriaPass(goal) {
|
|
|
588
588
|
});
|
|
589
589
|
}
|
|
590
590
|
|
|
591
|
-
// components/ulw-loop/src/quality-gate.ts
|
|
591
|
+
// packages/omo-codex/plugin/components/ulw-loop/src/quality-gate.ts
|
|
592
592
|
import { resolve as resolve2 } from "node:path";
|
|
593
593
|
|
|
594
|
-
// components/ulw-loop/src/quality-gate-fields.ts
|
|
594
|
+
// packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-fields.ts
|
|
595
595
|
var PLACEHOLDER_PATTERN = /^(?:placeholder|todo|tbd|n\/a|stub)$/i;
|
|
596
596
|
function invalid(message, field) {
|
|
597
597
|
throw new UlwLoopError(message, "ULW_LOOP_QUALITY_GATE_INVALID", { details: { field } });
|
|
@@ -629,7 +629,7 @@ function literal(value, expected, field) {
|
|
|
629
629
|
invalid(`${field} must be ${String(expected)}.`, field);
|
|
630
630
|
}
|
|
631
631
|
|
|
632
|
-
// components/ulw-loop/src/quality-gate-verdicts.ts
|
|
632
|
+
// packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-verdicts.ts
|
|
633
633
|
function passedVerdict(value, field) {
|
|
634
634
|
if (value === "not_applicable")
|
|
635
635
|
invalid(`${field} must not be not_applicable.`, field);
|
|
@@ -650,7 +650,7 @@ function adversarialVerdict(row, field) {
|
|
|
650
650
|
invalid(`${field} must be passed or not_applicable with a reason.`, field);
|
|
651
651
|
}
|
|
652
652
|
|
|
653
|
-
// components/ulw-loop/src/quality-gate-blockers.ts
|
|
653
|
+
// packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-blockers.ts
|
|
654
654
|
var BLOCKER_FIELD_KEYS = "blocker blockerSignature blockerEvidence blockerOccurrences blockedAt".split(" ");
|
|
655
655
|
var URL_PATTERN = /https?:\/\/\S+/g;
|
|
656
656
|
var PUNCTUATION_PATTERN = /[`"'()[\]{}:,;]/g;
|
|
@@ -692,7 +692,7 @@ function clearGoalBlockerFields(goal) {
|
|
|
692
692
|
Reflect.deleteProperty(goal, key);
|
|
693
693
|
}
|
|
694
694
|
|
|
695
|
-
// components/ulw-loop/src/quality-gate.ts
|
|
695
|
+
// packages/omo-codex/plugin/components/ulw-loop/src/quality-gate.ts
|
|
696
696
|
var REVIEWER_ROLES = {
|
|
697
697
|
codeReview: "lazycodex-code-reviewer",
|
|
698
698
|
manualQa: "lazycodex-qa-executor",
|
|
@@ -876,7 +876,7 @@ function parseAdversarialCases(value, byId) {
|
|
|
876
876
|
});
|
|
877
877
|
}
|
|
878
878
|
|
|
879
|
-
// components/ulw-loop/src/cli-arg-parser.ts
|
|
879
|
+
// packages/omo-codex/plugin/components/ulw-loop/src/cli-arg-parser.ts
|
|
880
880
|
import { readFile as readFile4 } from "node:fs/promises";
|
|
881
881
|
var VALUE_FLAGS = new Set("--brief --brief-file --session-id --codex-goal-mode --validation-batch-json --goal --goal-id --criterion-id --status --evidence --notes --codex-goal-json --quality-gate-json --kind --rationale --title --objective --target-goal-id --source --after-json --directive-json --directive-file --idempotency-key --proposals-json".split(" "));
|
|
882
882
|
var SUBCOMMANDS = new Set("create-goals status complete-goals criteria record-evidence checkpoint steer add-goal record-review-blockers".split(" "));
|
|
@@ -967,7 +967,7 @@ function parseRecordEvidenceArgs(argv) {
|
|
|
967
967
|
return notes ? { ...result, notes } : result;
|
|
968
968
|
}
|
|
969
969
|
|
|
970
|
-
// components/ulw-loop/src/validation-batch.ts
|
|
970
|
+
// packages/omo-codex/plugin/components/ulw-loop/src/validation-batch.ts
|
|
971
971
|
function isObject(value) {
|
|
972
972
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
973
973
|
}
|
|
@@ -1085,7 +1085,7 @@ function fail(message, code = "ULW_LOOP_VALIDATION_BATCH_INVALID") {
|
|
|
1085
1085
|
throw new UlwLoopError(message, code);
|
|
1086
1086
|
}
|
|
1087
1087
|
|
|
1088
|
-
// components/ulw-loop/src/checkpoint.ts
|
|
1088
|
+
// packages/omo-codex/plugin/components/ulw-loop/src/checkpoint.ts
|
|
1089
1089
|
var QUALITY_GATE_FS = { existsSync: existsSync3, statSync };
|
|
1090
1090
|
function ulwLoopFail2(message, code) {
|
|
1091
1091
|
throw new UlwLoopError(message, code);
|
|
@@ -1252,17 +1252,17 @@ async function checkpointUlwLoop(repoRoot, args, scope) {
|
|
|
1252
1252
|
});
|
|
1253
1253
|
}
|
|
1254
1254
|
|
|
1255
|
-
// components/ulw-loop/src/cli-output.ts
|
|
1255
|
+
// packages/omo-codex/plugin/components/ulw-loop/src/cli-output.ts
|
|
1256
1256
|
var ULW_LOOP_HELP = `Usage:
|
|
1257
|
-
omo ulw-loop create-goals --brief "..." [--brief-file <path>] [--from-stdin] [--codex-goal-mode aggregate|per_story] [--validation-batch-json <json-or-path>] [--force] [--json]
|
|
1258
|
-
omo ulw-loop status [--json]
|
|
1259
|
-
omo ulw-loop complete-goals [--retry-failed] [--json]
|
|
1260
|
-
omo ulw-loop criteria --goal-id <id> [--json]
|
|
1261
|
-
omo ulw-loop record-evidence --goal-id <id> --criterion-id <id> --status pass|fail|blocked --evidence "..." [--notes "..."] [--json]
|
|
1262
|
-
omo ulw-loop checkpoint --goal-id <id> --status complete|failed|blocked --evidence "..." --codex-goal-json <...> [--quality-gate-json <...>] [--no-advance] [--json]
|
|
1263
|
-
omo ulw-loop steer --kind <kind> ... --evidence "..." --rationale "..." [--proposals-json <json-or-path>] [--json]
|
|
1264
|
-
omo ulw-loop add-goal --title "..." --objective "..." [--json]
|
|
1265
|
-
omo ulw-loop record-review-blockers --goal-id <id> --title "..." --objective "..." --evidence "..." --codex-goal-json <...> [--json]
|
|
1257
|
+
omo-agent-toolkit ulw-loop create-goals --brief "..." [--brief-file <path>] [--from-stdin] [--codex-goal-mode aggregate|per_story] [--validation-batch-json <json-or-path>] [--force] [--json]
|
|
1258
|
+
omo-agent-toolkit ulw-loop status [--json]
|
|
1259
|
+
omo-agent-toolkit ulw-loop complete-goals [--retry-failed] [--json]
|
|
1260
|
+
omo-agent-toolkit ulw-loop criteria --goal-id <id> [--json]
|
|
1261
|
+
omo-agent-toolkit ulw-loop record-evidence --goal-id <id> --criterion-id <id> --status pass|fail|blocked --evidence "..." [--notes "..."] [--json]
|
|
1262
|
+
omo-agent-toolkit ulw-loop checkpoint --goal-id <id> --status complete|failed|blocked --evidence "..." --codex-goal-json <...> [--quality-gate-json <...>] [--no-advance] [--json]
|
|
1263
|
+
omo-agent-toolkit ulw-loop steer --kind <kind> ... --evidence "..." --rationale "..." [--proposals-json <json-or-path>] [--json]
|
|
1264
|
+
omo-agent-toolkit ulw-loop add-goal --title "..." --objective "..." [--json]
|
|
1265
|
+
omo-agent-toolkit ulw-loop record-review-blockers --goal-id <id> --title "..." --objective "..." --evidence "..." --codex-goal-json <...> [--json]
|
|
1266
1266
|
|
|
1267
1267
|
All subcommands accept [--session-id <id>] to isolate state under .omo/ulw-loop/<id>/; without it, Codex session env is used when present.`;
|
|
1268
1268
|
function printJson(value) {
|
|
@@ -1330,7 +1330,7 @@ function normalizeCodexGoalMode(value) {
|
|
|
1330
1330
|
throw new UlwLoopError("Invalid --codex-goal-mode; expected aggregate or per_story.", "ULW_LOOP_CODEX_GOAL_MODE_INVALID", { details: { value } });
|
|
1331
1331
|
}
|
|
1332
1332
|
|
|
1333
|
-
// components/ulw-loop/src/codex-goal-instruction.ts
|
|
1333
|
+
// packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts
|
|
1334
1334
|
function buildCodexGoalInstruction(args) {
|
|
1335
1335
|
const mode = codexGoalMode(args.plan);
|
|
1336
1336
|
const createGoal = buildCreateGoalPayload(args.plan, args.goal);
|
|
@@ -1373,7 +1373,7 @@ function modeConstraintLines(mode, isFinal) {
|
|
|
1373
1373
|
];
|
|
1374
1374
|
}
|
|
1375
1375
|
return [
|
|
1376
|
-
"- Codex goal = the whole omo ulw-loop run; OMO G001/G002/etc. = ledger stories.",
|
|
1376
|
+
"- Codex goal = the whole omo-agent-toolkit ulw-loop run; OMO G001/G002/etc. = ledger stories.",
|
|
1377
1377
|
"- First call get_goal. If no active goal exists, call create_goal with the aggregate payload below.",
|
|
1378
1378
|
"- If get_goal reports the same aggregate objective as active, continue this OMO story without creating a new Codex goal.",
|
|
1379
1379
|
"- If a different active or incomplete Codex goal exists, finish/checkpoint that goal before starting this ulw-loop.",
|
|
@@ -1406,15 +1406,15 @@ function evidenceLayoutLines(plan) {
|
|
|
1406
1406
|
if (plan.evidenceLayoutVersion !== 2)
|
|
1407
1407
|
return [];
|
|
1408
1408
|
return [
|
|
1409
|
-
"- Evidence layout v2: write every artifact for the active goal (QA matrix, review reports, receipts) under the current attempt directory — read currentAttemptDir from `omo ulw-loop status --json` (.omo/evidence/ulw/<session>/<goalId>/a<attempt>). The final checkpoint rejects quality-gate artifacts outside that directory."
|
|
1409
|
+
"- Evidence layout v2: write every artifact for the active goal (QA matrix, review reports, receipts) under the current attempt directory — read currentAttemptDir from `omo-agent-toolkit ulw-loop status --json` (.omo/evidence/ulw/<session>/<goalId>/a<attempt>). The final checkpoint rejects quality-gate artifacts outside that directory."
|
|
1410
1410
|
];
|
|
1411
1411
|
}
|
|
1412
1412
|
function finalSection(plan, goal, isFinal, aggregate) {
|
|
1413
1413
|
if (!isFinal)
|
|
1414
1414
|
return "- This is not the final ulw-loop story; do not run the final reviewer/manual-QA/gate-review quality gate yet.";
|
|
1415
1415
|
const option = sessionOption(plan);
|
|
1416
|
-
const blockerCommand = `omo ulw-loop record-review-blockers${option} --goal-id ${goal.id} --title "Resolve final code-review blockers" --objective "<blocker-resolution objective>" --evidence "<review findings>" --codex-goal-json "<active get_goal JSON or path>"`;
|
|
1417
|
-
const checkpointCommand = `omo ulw-loop checkpoint${option} --goal-id ${goal.id} --status complete --evidence "<targeted verification/manualQa/gateReview evidence>" --codex-goal-json "<fresh complete get_goal JSON or path>" --quality-gate-json "<quality gate JSON or path>"`;
|
|
1416
|
+
const blockerCommand = `omo-agent-toolkit ulw-loop record-review-blockers${option} --goal-id ${goal.id} --title "Resolve final code-review blockers" --objective "<blocker-resolution objective>" --evidence "<review findings>" --codex-goal-json "<active get_goal JSON or path>"`;
|
|
1417
|
+
const checkpointCommand = `omo-agent-toolkit ulw-loop checkpoint${option} --goal-id ${goal.id} --status complete --evidence "<targeted verification/manualQa/gateReview evidence>" --codex-goal-json "<fresh complete get_goal JSON or path>" --quality-gate-json "<quality gate JSON or path>"`;
|
|
1418
1418
|
return joinLines([
|
|
1419
1419
|
"Final story — run mandatory quality gate before update_goal:",
|
|
1420
1420
|
"- Run targeted verification for changed behavior.",
|
|
@@ -1443,11 +1443,11 @@ function joinLines(lines) {
|
|
|
1443
1443
|
`);
|
|
1444
1444
|
}
|
|
1445
1445
|
|
|
1446
|
-
// components/ulw-loop/src/plan-crud.ts
|
|
1446
|
+
// packages/omo-codex/plugin/components/ulw-loop/src/plan-crud.ts
|
|
1447
1447
|
import { existsSync as existsSync4 } from "node:fs";
|
|
1448
1448
|
import { mkdir as mkdir2, writeFile as writeFile2 } from "node:fs/promises";
|
|
1449
1449
|
|
|
1450
|
-
// components/ulw-loop/src/plan-goal-factory.ts
|
|
1450
|
+
// packages/omo-codex/plugin/components/ulw-loop/src/plan-goal-factory.ts
|
|
1451
1451
|
function cleanLine(line) {
|
|
1452
1452
|
return line.replace(/^\s*(?:[-*+]\s+|\d+[.)]\s+)/, "").trim();
|
|
1453
1453
|
}
|
|
@@ -1536,7 +1536,7 @@ function appendGoalToPlan(plan, title, objective, now) {
|
|
|
1536
1536
|
return goal;
|
|
1537
1537
|
}
|
|
1538
1538
|
|
|
1539
|
-
// components/ulw-loop/src/plan-crud.ts
|
|
1539
|
+
// packages/omo-codex/plugin/components/ulw-loop/src/plan-crud.ts
|
|
1540
1540
|
function isScheduleEligible(goal) {
|
|
1541
1541
|
return goal.steeringStatus !== "superseded" && goal.steeringStatus !== "blocked";
|
|
1542
1542
|
}
|
|
@@ -1591,7 +1591,7 @@ async function createUlwLoopPlan(repoRoot, args, scope) {
|
|
|
1591
1591
|
function completedPlanExistsError(scope) {
|
|
1592
1592
|
return new UlwLoopError([
|
|
1593
1593
|
`Existing ulw-loop aggregate is already complete at ${ulwLoopGoalsRelativePath(scope)}.`,
|
|
1594
|
-
"Start a new run with `omo ulw-loop create-goals --session-id <new-id> ...` to isolate fresh state.",
|
|
1594
|
+
"Start a new run with `omo-agent-toolkit ulw-loop create-goals --session-id <new-id> ...` to isolate fresh state.",
|
|
1595
1595
|
"Use --force only when you intentionally want to overwrite the completed evidence."
|
|
1596
1596
|
].join(" "), "ULW_LOOP_PLAN_EXISTS_COMPLETE");
|
|
1597
1597
|
}
|
|
@@ -1663,7 +1663,7 @@ function summarizeUlwLoopPlan(plan) {
|
|
|
1663
1663
|
};
|
|
1664
1664
|
}
|
|
1665
1665
|
|
|
1666
|
-
// components/ulw-loop/src/checkpoint-continuation.ts
|
|
1666
|
+
// packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-continuation.ts
|
|
1667
1667
|
async function checkpointAndContinue(repoRoot, args, scope) {
|
|
1668
1668
|
const result = await checkpointUlwLoop(repoRoot, args, scope);
|
|
1669
1669
|
if (args.status !== "complete" || result.aggregateCompletion !== undefined || !args.advance)
|
|
@@ -1726,10 +1726,10 @@ function checkpointStatus(value) {
|
|
|
1726
1726
|
throw new UlwLoopError("Missing or invalid --status; expected complete, failed, or blocked.", "ULW_LOOP_STATUS_INVALID", { details: { status: value } });
|
|
1727
1727
|
}
|
|
1728
1728
|
|
|
1729
|
-
// components/ulw-loop/src/cli-subcommands.ts
|
|
1729
|
+
// packages/omo-codex/plugin/components/ulw-loop/src/cli-subcommands.ts
|
|
1730
1730
|
import { readFile as readFile6 } from "node:fs/promises";
|
|
1731
1731
|
|
|
1732
|
-
// components/ulw-loop/src/cli-steering.ts
|
|
1732
|
+
// packages/omo-codex/plugin/components/ulw-loop/src/cli-steering.ts
|
|
1733
1733
|
var SOURCES = ["user_prompt_submit", "finding", "cli"];
|
|
1734
1734
|
var STEERING_KIND_HELP = [
|
|
1735
1735
|
`Allowed --kind values: ${ULW_LOOP_STEERING_MUTATION_KINDS.join(", ")}`,
|
|
@@ -1741,7 +1741,7 @@ var STEERING_KIND_HELP = [
|
|
|
1741
1741
|
" revise_criterion: --goal-id, --criterion-id, one of --scenario/--expected-evidence/--user-model, --evidence, --rationale",
|
|
1742
1742
|
" annotate_ledger: --evidence, --rationale",
|
|
1743
1743
|
" mark_blocked_superseded: --goal-id, optional --replacements, --evidence, --rationale",
|
|
1744
|
-
'Example: omo ulw-loop steer --kind annotate_ledger --evidence "observed behavior" --rationale "why this changes the plan" --json'
|
|
1744
|
+
'Example: omo-agent-toolkit ulw-loop steer --kind annotate_ledger --evidence "observed behavior" --rationale "why this changes the plan" --json'
|
|
1745
1745
|
].join(`
|
|
1746
1746
|
`);
|
|
1747
1747
|
function isKind(value) {
|
|
@@ -2036,7 +2036,7 @@ function printSteerBatchResult(result, json) {
|
|
|
2036
2036
|
printStatus(result.plan);
|
|
2037
2037
|
}
|
|
2038
2038
|
|
|
2039
|
-
// components/ulw-loop/src/review-blockers.ts
|
|
2039
|
+
// packages/omo-codex/plugin/components/ulw-loop/src/review-blockers.ts
|
|
2040
2040
|
var BLOCKER_FIELDS = "blockedReason blockerSignature blockerOccurrenceCount requiredExternalDecision nonRetriable failedAt failureReason completedAt blocker blockerEvidence blockerOccurrences blockedAt".split(" ");
|
|
2041
2041
|
function ulwLoopError(message, code) {
|
|
2042
2042
|
throw new UlwLoopError(message, code);
|
|
@@ -2102,7 +2102,7 @@ async function recordFinalReviewBlockers(repoRoot, args, scope) {
|
|
|
2102
2102
|
});
|
|
2103
2103
|
}
|
|
2104
2104
|
|
|
2105
|
-
// components/ulw-loop/src/steering-mutations.ts
|
|
2105
|
+
// packages/omo-codex/plugin/components/ulw-loop/src/steering-mutations.ts
|
|
2106
2106
|
var read2 = (value, key) => Object.entries(value).find(([name]) => name === key)?.[1];
|
|
2107
2107
|
var isText = (value) => typeof value === "string" && value.trim().length > 0;
|
|
2108
2108
|
var text3 = (value, key) => {
|
|
@@ -2189,7 +2189,7 @@ function reviseCriterion(plan, proposal, now) {
|
|
|
2189
2189
|
target.updatedAt = now;
|
|
2190
2190
|
}
|
|
2191
2191
|
|
|
2192
|
-
// components/ulw-loop/src/steering-snapshot.ts
|
|
2192
|
+
// packages/omo-codex/plugin/components/ulw-loop/src/steering-snapshot.ts
|
|
2193
2193
|
function buildSteeringPlanSnapshot(plan, changedGoalIds) {
|
|
2194
2194
|
const snapshot = {
|
|
2195
2195
|
updatedAt: plan.updatedAt,
|
|
@@ -2213,7 +2213,7 @@ function changedGoalIdsBetween(before, after2) {
|
|
|
2213
2213
|
return changed;
|
|
2214
2214
|
}
|
|
2215
2215
|
|
|
2216
|
-
// components/ulw-loop/src/steering.ts
|
|
2216
|
+
// packages/omo-codex/plugin/components/ulw-loop/src/steering.ts
|
|
2217
2217
|
var SOURCES2 = ["user_prompt_submit", "finding", "cli"];
|
|
2218
2218
|
var PROTECTED = new Set(["aggregateCompletion", "codexObjective", "codexObjectiveAliases", "originalConstraints", "qualityGate", "status", "completedAt", "completionStatus"]);
|
|
2219
2219
|
var isObject2 = (value) => typeof value === "object" && value !== null;
|
|
@@ -2398,7 +2398,7 @@ function isProposal(value) {
|
|
|
2398
2398
|
return isPlain2(value) && isKind2(read3(value, "kind")) && isSource2(read3(value, "source")) && isText2(read3(value, "evidence")) && isText2(read3(value, "rationale"));
|
|
2399
2399
|
}
|
|
2400
2400
|
function parseUlwLoopSteeringDirective(text5) {
|
|
2401
|
-
const match = /(?:^|\s)(?:OMO_ULW_LOOP_STEER|omo\.ulw-loop\.steer|omo ulw-loop steer):\s*([\s\S]+)$/u.exec(text5);
|
|
2401
|
+
const match = /(?:^|\s)(?:OMO_ULW_LOOP_STEER|omo\.ulw-loop\.steer|omo ulw-loop steer|omo-agent-toolkit ulw-loop steer):\s*([\s\S]+)$/u.exec(text5);
|
|
2402
2402
|
if (match?.[1] === undefined)
|
|
2403
2403
|
return null;
|
|
2404
2404
|
try {
|
|
@@ -2450,7 +2450,7 @@ function ledgerEntry(proposal, audit, at) {
|
|
|
2450
2450
|
return entry;
|
|
2451
2451
|
}
|
|
2452
2452
|
|
|
2453
|
-
// components/ulw-loop/src/steering-batch.ts
|
|
2453
|
+
// packages/omo-codex/plugin/components/ulw-loop/src/steering-batch.ts
|
|
2454
2454
|
async function steerUlwLoopBatch(repoRoot, proposals, scope) {
|
|
2455
2455
|
return withUlwLoopMutationLock(repoRoot, scope, async () => {
|
|
2456
2456
|
const plan = await readUlwLoopPlan(repoRoot, scope);
|
|
@@ -2531,7 +2531,7 @@ function ledgerEntry2(proposal, audit, at) {
|
|
|
2531
2531
|
return entry;
|
|
2532
2532
|
}
|
|
2533
2533
|
|
|
2534
|
-
// components/ulw-loop/src/cli-subcommands.ts
|
|
2534
|
+
// packages/omo-codex/plugin/components/ulw-loop/src/cli-subcommands.ts
|
|
2535
2535
|
async function createGoals(repoRoot, argv, json, scope) {
|
|
2536
2536
|
const briefFile = readValue(argv, "--brief-file");
|
|
2537
2537
|
const brief = readValue(argv, "--brief") ?? (briefFile === undefined ? undefined : await readFile6(briefFile, "utf8")) ?? (hasFlag(argv, "--from-stdin") ? await readStdin() : undefined) ?? positionalText(argv);
|
|
@@ -2687,7 +2687,7 @@ function findGoal3(plan, goalId) {
|
|
|
2687
2687
|
throw new UlwLoopError(`Unknown ulw-loop id: ${goalId}.`, "ULW_LOOP_GOAL_NOT_FOUND", { details: { goalId } });
|
|
2688
2688
|
}
|
|
2689
2689
|
|
|
2690
|
-
// components/ulw-loop/src/cli-commands.ts
|
|
2690
|
+
// packages/omo-codex/plugin/components/ulw-loop/src/cli-commands.ts
|
|
2691
2691
|
var ULW_LOOP_SUBCOMMANDS = [
|
|
2692
2692
|
"help",
|
|
2693
2693
|
"create-goals",
|
|
@@ -2786,10 +2786,10 @@ function commandScope(argv) {
|
|
|
2786
2786
|
return sessionId === null ? undefined : { sessionId };
|
|
2787
2787
|
}
|
|
2788
2788
|
|
|
2789
|
-
// components/ulw-loop/src/ultrawork-directive.ts
|
|
2789
|
+
// packages/omo-codex/plugin/components/ulw-loop/src/ultrawork-directive.ts
|
|
2790
2790
|
import { readFileSync as readFileSync2 } from "node:fs";
|
|
2791
2791
|
|
|
2792
|
-
// components/ulw-loop/src/ultrawork-skill-pointer.ts
|
|
2792
|
+
// packages/omo-codex/plugin/components/ulw-loop/src/ultrawork-skill-pointer.ts
|
|
2793
2793
|
import { existsSync as existsSync5, readFileSync } from "node:fs";
|
|
2794
2794
|
import { fileURLToPath } from "node:url";
|
|
2795
2795
|
var ULTRAWORK_SKILL_POINTER_TEMPLATE = `<ultrawork-mode>
|
|
@@ -2837,7 +2837,7 @@ function buildUltraworkAdditionalContext(options = {}) {
|
|
|
2837
2837
|
return ULTRAWORK_DIRECTIVE;
|
|
2838
2838
|
}
|
|
2839
2839
|
|
|
2840
|
-
// components/ulw-loop/src/ultrawork-directive.ts
|
|
2840
|
+
// packages/omo-codex/plugin/components/ulw-loop/src/ultrawork-directive.ts
|
|
2841
2841
|
var ULTRAWORK_CURRENT_PROMPT_PATTERN = /(?:ultrawork|ulw)/i;
|
|
2842
2842
|
var ULTRAWORK_DIRECTIVE_MARKER = "<ultrawork-mode>";
|
|
2843
2843
|
var TRANSCRIPT_SEARCH_BYTES = 512000;
|
|
@@ -2940,7 +2940,7 @@ function isRecord3(value) {
|
|
|
2940
2940
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
2941
2941
|
}
|
|
2942
2942
|
|
|
2943
|
-
// components/ulw-loop/src/codex-hook.ts
|
|
2943
|
+
// packages/omo-codex/plugin/components/ulw-loop/src/codex-hook.ts
|
|
2944
2944
|
var CREATE_GOAL_TOOL_NAME = "create_goal";
|
|
2945
2945
|
var CREATE_GOAL_PAYLOAD_WARNING = "Use create_goal with objective only. Omit token_budget so the goal stays unlimited, and put lifecycle status changes on update_goal.";
|
|
2946
2946
|
function parseUserPromptSubmitPayload(raw) {
|
|
@@ -2995,7 +2995,7 @@ async function applyUserPromptUlwLoopSteering(payload, options = {}) {
|
|
|
2995
2995
|
}
|
|
2996
2996
|
}
|
|
2997
2997
|
function hasSteeringDirectiveMarker(prompt) {
|
|
2998
|
-
return /(?:^|\s)(?:OMO_ULW_LOOP_STEER|omo\.ulw-loop\.steer|omo ulw-loop steer):/u.test(prompt);
|
|
2998
|
+
return /(?:^|\s)(?:OMO_ULW_LOOP_STEER|omo\.ulw-loop\.steer|omo ulw-loop steer|omo-agent-toolkit ulw-loop steer):/u.test(prompt);
|
|
2999
2999
|
}
|
|
3000
3000
|
function payloadScope(payload) {
|
|
3001
3001
|
return { sessionId: payload.session_id };
|
|
@@ -3077,7 +3077,7 @@ function readAll(stdin) {
|
|
|
3077
3077
|
});
|
|
3078
3078
|
}
|
|
3079
3079
|
|
|
3080
|
-
// components/ulw-loop/src/spawn-guard.ts
|
|
3080
|
+
// packages/omo-codex/plugin/components/ulw-loop/src/spawn-guard.ts
|
|
3081
3081
|
import { existsSync as existsSync6, readdirSync, readFileSync as readFileSync3, statSync as statSync2, writeFileSync } from "node:fs";
|
|
3082
3082
|
import { join as join2 } from "node:path";
|
|
3083
3083
|
var SPAWN_TOOL_TOKENS = new Set(["spawn_agent", "collaborationspawn_agent", "collaboration.spawn_agent"]);
|
|
@@ -3214,7 +3214,7 @@ function readPlan(goalsPath) {
|
|
|
3214
3214
|
}
|
|
3215
3215
|
}
|
|
3216
3216
|
|
|
3217
|
-
// components/ulw-loop/src/stop-resume-hook.ts
|
|
3217
|
+
// packages/omo-codex/plugin/components/ulw-loop/src/stop-resume-hook.ts
|
|
3218
3218
|
import { existsSync as existsSync7, readFileSync as readFileSync4, writeFileSync as writeFileSync2 } from "node:fs";
|
|
3219
3219
|
import { isAbsolute as isAbsolute2, join as join3, resolve as resolve4, sep as sep2 } from "node:path";
|
|
3220
3220
|
var RESUME_CAP = 2;
|
|
@@ -3297,9 +3297,9 @@ function renderResumeDirective(plan, goal3, sessionId) {
|
|
|
3297
3297
|
return [
|
|
3298
3298
|
`The ulw-loop run in this session still has unfinished goals (next: ${goal3.id} — ${goal3.title}).`,
|
|
3299
3299
|
"The turn ended before the loop completed. Resume it now:",
|
|
3300
|
-
`1. Run \`omo ulw-loop status${option} --json\` to reload the plan, the active goal, and currentAttemptDir.`,
|
|
3300
|
+
`1. Run \`omo-agent-toolkit ulw-loop status${option} --json\` to reload the plan, the active goal, and currentAttemptDir.`,
|
|
3301
3301
|
"2. Continue the active goal's remaining success criteria, recording evidence with record-evidence.",
|
|
3302
|
-
`3. Checkpoint through \`omo ulw-loop checkpoint${option}\` when the goal's criteria are proven; a complete checkpoint prints the next goal instruction.`,
|
|
3302
|
+
`3. Checkpoint through \`omo-agent-toolkit ulw-loop checkpoint${option}\` when the goal's criteria are proven; a complete checkpoint prints the next goal instruction.`,
|
|
3303
3303
|
"If the loop is genuinely blocked on the user, checkpoint the goal as blocked with the reason instead."
|
|
3304
3304
|
].join(`
|
|
3305
3305
|
`);
|
|
@@ -3399,13 +3399,13 @@ function parseStopPayload(value) {
|
|
|
3399
3399
|
};
|
|
3400
3400
|
}
|
|
3401
3401
|
|
|
3402
|
-
// components/ulw-loop/src/cli.ts
|
|
3402
|
+
// packages/omo-codex/plugin/components/ulw-loop/src/cli.ts
|
|
3403
3403
|
var TOP_LEVEL_HELP = `Usage:
|
|
3404
|
-
omo ulw-loop <subcommand> [args]
|
|
3405
|
-
omo hook user-prompt-submit [--with-ultrawork] (Codex UserPromptSubmit hook)
|
|
3406
|
-
omo help | --help | -h (this message)
|
|
3404
|
+
omo-agent-toolkit ulw-loop <subcommand> [args]
|
|
3405
|
+
omo-agent-toolkit hook user-prompt-submit [--with-ultrawork] (Codex UserPromptSubmit hook)
|
|
3406
|
+
omo-agent-toolkit help | --help | -h (this message)
|
|
3407
3407
|
|
|
3408
|
-
Run \`omo ulw-loop help\` for ulw-loop subcommands.
|
|
3408
|
+
Run \`omo-agent-toolkit ulw-loop help\` for ulw-loop subcommands.
|
|
3409
3409
|
`;
|
|
3410
3410
|
async function main() {
|
|
3411
3411
|
const argv = process.argv.slice(2);
|
|
@@ -42,7 +42,7 @@ function modeConstraintLines(mode, isFinal) {
|
|
|
42
42
|
];
|
|
43
43
|
}
|
|
44
44
|
return [
|
|
45
|
-
"- Codex goal = the whole omo ulw-loop run; OMO G001/G002/etc. = ledger stories.",
|
|
45
|
+
"- Codex goal = the whole omo-agent-toolkit ulw-loop run; OMO G001/G002/etc. = ledger stories.",
|
|
46
46
|
"- First call get_goal. If no active goal exists, call create_goal with the aggregate payload below.",
|
|
47
47
|
"- If get_goal reports the same aggregate objective as active, continue this OMO story without creating a new Codex goal.",
|
|
48
48
|
"- If a different active or incomplete Codex goal exists, finish/checkpoint that goal before starting this ulw-loop.",
|
|
@@ -77,15 +77,15 @@ function evidenceLayoutLines(plan) {
|
|
|
77
77
|
if (plan.evidenceLayoutVersion !== 2)
|
|
78
78
|
return [];
|
|
79
79
|
return [
|
|
80
|
-
"- Evidence layout v2: write every artifact for the active goal (QA matrix, review reports, receipts) under the current attempt directory — read currentAttemptDir from `omo ulw-loop status --json` (.omo/evidence/ulw/<session>/<goalId>/a<attempt>). The final checkpoint rejects quality-gate artifacts outside that directory.",
|
|
80
|
+
"- Evidence layout v2: write every artifact for the active goal (QA matrix, review reports, receipts) under the current attempt directory — read currentAttemptDir from `omo-agent-toolkit ulw-loop status --json` (.omo/evidence/ulw/<session>/<goalId>/a<attempt>). The final checkpoint rejects quality-gate artifacts outside that directory.",
|
|
81
81
|
];
|
|
82
82
|
}
|
|
83
83
|
function finalSection(plan, goal, isFinal, aggregate) {
|
|
84
84
|
if (!isFinal)
|
|
85
85
|
return "- This is not the final ulw-loop story; do not run the final reviewer/manual-QA/gate-review quality gate yet.";
|
|
86
86
|
const option = sessionOption(plan);
|
|
87
|
-
const blockerCommand = `omo ulw-loop record-review-blockers${option} --goal-id ${goal.id} --title "Resolve final code-review blockers" --objective "<blocker-resolution objective>" --evidence "<review findings>" --codex-goal-json "<active get_goal JSON or path>"`;
|
|
88
|
-
const checkpointCommand = `omo ulw-loop checkpoint${option} --goal-id ${goal.id} --status complete --evidence "<targeted verification/manualQa/gateReview evidence>" --codex-goal-json "<fresh complete get_goal JSON or path>" --quality-gate-json "<quality gate JSON or path>"`;
|
|
87
|
+
const blockerCommand = `omo-agent-toolkit ulw-loop record-review-blockers${option} --goal-id ${goal.id} --title "Resolve final code-review blockers" --objective "<blocker-resolution objective>" --evidence "<review findings>" --codex-goal-json "<active get_goal JSON or path>"`;
|
|
88
|
+
const checkpointCommand = `omo-agent-toolkit ulw-loop checkpoint${option} --goal-id ${goal.id} --status complete --evidence "<targeted verification/manualQa/gateReview evidence>" --codex-goal-json "<fresh complete get_goal JSON or path>" --quality-gate-json "<quality gate JSON or path>"`;
|
|
89
89
|
return joinLines([
|
|
90
90
|
"Final story — run mandatory quality gate before update_goal:",
|
|
91
91
|
"- Run targeted verification for changed behavior.",
|
|
@@ -59,7 +59,7 @@ export async function applyUserPromptUlwLoopSteering(payload, options = {}) {
|
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
61
|
function hasSteeringDirectiveMarker(prompt) {
|
|
62
|
-
return /(?:^|\s)(?:OMO_ULW_LOOP_STEER|omo\.ulw-loop\.steer|omo ulw-loop steer):/u.test(prompt);
|
|
62
|
+
return /(?:^|\s)(?:OMO_ULW_LOOP_STEER|omo\.ulw-loop\.steer|omo ulw-loop steer|omo-agent-toolkit ulw-loop steer):/u.test(prompt);
|
|
63
63
|
}
|
|
64
64
|
function payloadScope(payload) {
|
|
65
65
|
return { sessionId: payload.session_id };
|
|
@@ -59,7 +59,7 @@ export async function createUlwLoopPlan(repoRoot, args, scope) {
|
|
|
59
59
|
function completedPlanExistsError(scope) {
|
|
60
60
|
return new UlwLoopError([
|
|
61
61
|
`Existing ulw-loop aggregate is already complete at ${ulwLoopGoalsRelativePath(scope)}.`,
|
|
62
|
-
"Start a new run with `omo ulw-loop create-goals --session-id <new-id> ...` to isolate fresh state.",
|
|
62
|
+
"Start a new run with `omo-agent-toolkit ulw-loop create-goals --session-id <new-id> ...` to isolate fresh state.",
|
|
63
63
|
"Use --force only when you intentionally want to overwrite the completed evidence.",
|
|
64
64
|
].join(" "), "ULW_LOOP_PLAN_EXISTS_COMPLETE");
|
|
65
65
|
}
|
|
@@ -47,7 +47,7 @@ export async function readUlwLoopPlan(repoRoot, scope) {
|
|
|
47
47
|
catch (error) {
|
|
48
48
|
if (!hasCode(error, "ENOENT"))
|
|
49
49
|
throw error;
|
|
50
|
-
throw new UlwLoopError(`No ulw-loop plan found at ${repoRelative(path, repoRoot)}. Run \`omo ulw-loop create-goals ...\` first.`, "ULW_LOOP_PLAN_MISSING", { cause: error });
|
|
50
|
+
throw new UlwLoopError(`No ulw-loop plan found at ${repoRelative(path, repoRoot)}. Run \`omo-agent-toolkit ulw-loop create-goals ...\` first.`, "ULW_LOOP_PLAN_MISSING", { cause: error });
|
|
51
51
|
}
|
|
52
52
|
const parsed = JSON.parse(raw);
|
|
53
53
|
if (parsed.version !== 1 || !Array.isArray(parsed.goals)) {
|
|
@@ -188,7 +188,7 @@ function isProposal(value) {
|
|
|
188
188
|
return isPlain(value) && isKind(read(value, "kind")) && isSource(read(value, "source")) && isText(read(value, "evidence")) && isText(read(value, "rationale"));
|
|
189
189
|
}
|
|
190
190
|
export function parseUlwLoopSteeringDirective(text) {
|
|
191
|
-
const match = /(?:^|\s)(?:OMO_ULW_LOOP_STEER|omo\.ulw-loop\.steer|omo ulw-loop steer):\s*([\s\S]+)$/u.exec(text);
|
|
191
|
+
const match = /(?:^|\s)(?:OMO_ULW_LOOP_STEER|omo\.ulw-loop\.steer|omo ulw-loop steer|omo-agent-toolkit ulw-loop steer):\s*([\s\S]+)$/u.exec(text);
|
|
192
192
|
if (match?.[1] === undefined)
|
|
193
193
|
return null;
|
|
194
194
|
try {
|
|
@@ -91,9 +91,9 @@ function renderResumeDirective(plan, goal, sessionId) {
|
|
|
91
91
|
return [
|
|
92
92
|
`The ulw-loop run in this session still has unfinished goals (next: ${goal.id} — ${goal.title}).`,
|
|
93
93
|
"The turn ended before the loop completed. Resume it now:",
|
|
94
|
-
`1. Run \`omo ulw-loop status${option} --json\` to reload the plan, the active goal, and currentAttemptDir.`,
|
|
94
|
+
`1. Run \`omo-agent-toolkit ulw-loop status${option} --json\` to reload the plan, the active goal, and currentAttemptDir.`,
|
|
95
95
|
"2. Continue the active goal's remaining success criteria, recording evidence with record-evidence.",
|
|
96
|
-
`3. Checkpoint through \`omo ulw-loop checkpoint${option}\` when the goal's criteria are proven; a complete checkpoint prints the next goal instruction.`,
|
|
96
|
+
`3. Checkpoint through \`omo-agent-toolkit ulw-loop checkpoint${option}\` when the goal's criteria are proven; a complete checkpoint prints the next goal instruction.`,
|
|
97
97
|
"If the loop is genuinely blocked on the user, checkpoint the goal as blocked with the reason instead.",
|
|
98
98
|
].join("\n");
|
|
99
99
|
}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"type": "command",
|
|
8
8
|
"command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook user-prompt-submit --with-ultrawork",
|
|
9
9
|
"timeout": 10,
|
|
10
|
-
"statusMessage": "(OmO
|
|
10
|
+
"statusMessage": "(OmO 5.0.0-beta.2) Checking Ulw-Loop Steering"
|
|
11
11
|
}
|
|
12
12
|
]
|
|
13
13
|
}
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"type": "command",
|
|
21
21
|
"command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook pre-tool-use",
|
|
22
22
|
"timeout": 5,
|
|
23
|
-
"statusMessage": "(OmO
|
|
23
|
+
"statusMessage": "(OmO 5.0.0-beta.2) Enforcing Unlimited Ulw-Loop Budget"
|
|
24
24
|
}
|
|
25
25
|
]
|
|
26
26
|
},
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"type": "command",
|
|
32
32
|
"command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook pre-tool-use-spawn",
|
|
33
33
|
"timeout": 5,
|
|
34
|
-
"statusMessage": "(OmO
|
|
34
|
+
"statusMessage": "(OmO 5.0.0-beta.2) Guarding Ulw-Loop Spawns"
|
|
35
35
|
}
|
|
36
36
|
]
|
|
37
37
|
}
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"type": "command",
|
|
44
44
|
"command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook stop",
|
|
45
45
|
"timeout": 10,
|
|
46
|
-
"statusMessage": "(OmO
|
|
46
|
+
"statusMessage": "(OmO 5.0.0-beta.2) Checking Ulw-Loop Resume"
|
|
47
47
|
}
|
|
48
48
|
]
|
|
49
49
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@code-yeongyu/codex-ulw-loop",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "5.0.0-beta.2",
|
|
4
4
|
"description": "Codex plugin: durable repo-native multi-goal orchestration with embedded success criteria and observable evidence audit.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"packageManager": "npm@11.12.1",
|
|
@@ -20,9 +20,9 @@ This skill is intentionally compact. The full workflow lives in `references/full
|
|
|
20
20
|
## Non-Negotiables
|
|
21
21
|
|
|
22
22
|
- Use the ulw-loop CLI state under `.omo/ulw-loop`; do not hand-edit goal state.
|
|
23
|
-
- Register goals up front (`omo ulw-loop create-goals`, then `create_goal` from the printed handoff) and mirror every atomic step into the live `update_plan` checklist: one ultra-granular step per action, exactly one in_progress, transitions marked the instant they happen.
|
|
24
|
-
- After any compaction or context loss, re-read brief + goals + ledger FIRST plus `omo ulw-loop status --json`, then resume; never re-plan from scratch.
|
|
25
|
-
- If `omo ulw-loop create-goals` says the existing aggregate is already complete, start unrelated new work with a fresh `--session-id <new-id>` instead of steering or forcing the completed default state. Use `--force` only to intentionally overwrite completed evidence.
|
|
23
|
+
- Register goals up front (`omo-agent-toolkit ulw-loop create-goals`, then `create_goal` from the printed handoff) and mirror every atomic step into the live `update_plan` checklist: one ultra-granular step per action, exactly one in_progress, transitions marked the instant they happen.
|
|
24
|
+
- After any compaction or context loss, re-read brief + goals + ledger FIRST plus `omo-agent-toolkit ulw-loop status --json`, then resume; never re-plan from scratch.
|
|
25
|
+
- If `omo-agent-toolkit ulw-loop create-goals` says the existing aggregate is already complete, start unrelated new work with a fresh `--session-id <new-id>` instead of steering or forcing the completed default state. Use `--force` only to intentionally overwrite completed evidence.
|
|
26
26
|
- Every success criterion needs observable evidence from a real surface: a channel (terminal/TUI via the xterm.js web terminal, HTTP, browser, computer-use) or, for CLI- or data-shaped criteria, an auxiliary surface (CLI stdout, DB diff, parsed config dump).
|
|
27
27
|
- Evidence is bound to the tree it was captured at (`git rev-parse --short "HEAD^{tree}"`); it goes stale only when tracked content changes — a rebase or amend that keeps the tree identical keeps it valid. When the tree differs, re-run at the current HEAD and re-record, never relabel or regenerate. Record only after cleanup receipts exist.
|
|
28
28
|
- Delegate code edits, test writes, fixes, and QA execution to right-sized Codex subagents when the workflow requires it.
|