oh-my-opencode 4.15.0 → 4.16.0
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/dist/cli/doctor/checks/tui-plugin-config.d.ts +4 -4
- package/dist/cli/index.js +1149 -1040
- package/dist/cli/install-senpi/index.d.ts +1 -0
- package/dist/cli/run/poll-for-completion.d.ts +4 -0
- package/dist/cli/run/session-resolver.d.ts +1 -0
- package/dist/cli/senpi-platform-flag.d.ts +4 -0
- package/dist/cli/types.d.ts +2 -1
- package/dist/cli-node/index.js +1149 -1040
- package/dist/features/background-agent/manager.d.ts +16 -0
- package/dist/hooks/anthropic-context-window-limit-recovery/aggressive-truncation-strategy.d.ts +1 -0
- package/dist/index.js +1334 -1146
- package/dist/skills/debugging/references/methodology/06-fix.md +6 -0
- package/dist/skills/frontend/ATTRIBUTION.md +13 -3
- package/dist/skills/frontend/SKILL.md +8 -3
- package/dist/skills/frontend/references/design/README.md +1 -1
- package/dist/skills/frontend/references/design/_INDEX.md +1 -1
- package/dist/skills/frontend/references/design/lazyweb.md +77 -0
- package/dist/skills/frontend/references/design/stitch-design-example.md +121 -0
- package/dist/skills/frontend/references/designpowers/EVIDENCE.md +10 -2
- package/dist/skills/frontend/references/designpowers/UPSTREAM.md +1 -1
- package/dist/skills/programming/SKILL.md +10 -1
- package/dist/skills/programming/references/logging.md +91 -0
- package/dist/skills/ulw-plan/SKILL.md +5 -5
- package/dist/skills/ulw-plan/references/full-workflow.md +7 -7
- package/dist/skills/ulw-plan/references/intent-unclear.md +3 -3
- package/dist/skills/ulw-research/ATTRIBUTION.md +2 -2
- package/dist/skills/ulw-research/SKILL.md +28 -7
- package/dist/tools/skill/description-formatter.d.ts +1 -0
- package/dist/tools/skill/description-formatter.test-support.d.ts +9 -0
- package/dist/tools/skill/zauc-mocks-skill-tools/test-support.d.ts +25 -0
- package/dist/tui.js +121 -419
- package/package.json +32 -15
- package/packages/git-bash-mcp/dist/cli.js +2 -2
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/AGENTS.md +55 -0
- package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +212 -117
- package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
- package/packages/omo-codex/plugin/components/codegraph/AGENTS.md +51 -0
- package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +936 -248
- package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +233 -135
- package/packages/omo-codex/plugin/components/codegraph/package.json +1 -1
- package/packages/omo-codex/plugin/components/codegraph/src/cache-gc.ts +29 -0
- package/packages/omo-codex/plugin/components/codegraph/src/cli.ts +13 -0
- package/packages/omo-codex/plugin/components/codegraph/src/hook-sweep.ts +25 -0
- package/packages/omo-codex/plugin/components/codegraph/src/hook-types.ts +3 -1
- package/packages/omo-codex/plugin/components/codegraph/src/hook.ts +30 -1
- package/packages/omo-codex/plugin/components/codegraph/src/serve.ts +16 -2
- package/packages/omo-codex/plugin/components/codegraph/src/sweep-cli.ts +80 -0
- package/packages/omo-codex/plugin/components/codegraph/test/cache-gc.test.ts +34 -0
- package/packages/omo-codex/plugin/components/codegraph/test/hook-exclusion.test.ts +107 -0
- package/packages/omo-codex/plugin/components/codegraph/test/hook-registration.test.ts +26 -0
- package/packages/omo-codex/plugin/components/codegraph/test/hook-sweep.test.ts +29 -0
- package/packages/omo-codex/plugin/components/codegraph/test/hook.test.ts +8 -21
- package/packages/omo-codex/plugin/components/codegraph/test/mcp-bridge-fixtures.ts +108 -0
- package/packages/omo-codex/plugin/components/codegraph/test/serve-built-wrapper.test.ts +76 -0
- package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge.test.ts +17 -111
- package/packages/omo-codex/plugin/components/codegraph/test/serve-provision.test.ts +1 -1
- package/packages/omo-codex/plugin/components/codegraph/test/serve.test.ts +45 -67
- package/packages/omo-codex/plugin/components/codegraph/test/sweep-cli.test.ts +56 -0
- package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
- package/packages/omo-codex/plugin/components/git-bash/AGENTS.md +31 -0
- package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/AGENTS.md +45 -0
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
- package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
- package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus.md +37 -102
- package/packages/omo-codex/plugin/components/rules/package.json +1 -1
- package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/AGENTS.md +46 -0
- package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +6 -0
- package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +6 -0
- package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/AGENTS.md +5 -2
- package/packages/omo-codex/plugin/components/ultrawork/CHANGELOG.md +2 -0
- package/packages/omo-codex/plugin/components/ultrawork/README.md +3 -3
- package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +51 -2
- package/packages/omo-codex/plugin/components/ultrawork/package.json +2 -1
- package/packages/omo-codex/plugin/components/ultrawork/scripts/sync-directive.mjs +14 -1
- package/packages/omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md +380 -0
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +5 -2
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +4 -4
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-unclear.md +2 -2
- package/packages/omo-codex/plugin/components/ultrawork/src/codex-hook.ts +5 -3
- package/packages/omo-codex/plugin/components/ultrawork/src/skill-pointer.ts +56 -0
- package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +4 -4
- package/packages/omo-codex/plugin/components/ultrawork/test/directive-source.test.ts +12 -0
- package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +1 -0
- package/packages/omo-codex/plugin/components/ultrawork/test/skill-pointer.test.ts +82 -0
- package/packages/omo-codex/plugin/components/ulw-loop/CHANGELOG.md +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +56 -5
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-hook.d.ts +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-hook.js +5 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/ultrawork-directive.d.ts +2 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/ultrawork-directive.js +5 -3
- package/packages/omo-codex/plugin/components/ulw-loop/dist/ultrawork-skill-pointer.d.ts +7 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/ultrawork-skill-pointer.js +46 -0
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-hook.ts +5 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/ultrawork-directive.ts +9 -3
- package/packages/omo-codex/plugin/components/ulw-loop/src/ultrawork-skill-pointer.ts +55 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/ultrawork-directive.test.ts +49 -0
- 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/auto-update-plan.mjs +147 -2
- package/packages/omo-codex/plugin/scripts/auto-update-release-notes.mjs +33 -0
- package/packages/omo-codex/plugin/scripts/auto-update.mjs +48 -10
- package/packages/omo-codex/plugin/scripts/build-components.mjs +63 -17
- package/packages/omo-codex/plugin/scripts/materialize-shared-upstreams.mjs +10 -3
- package/packages/omo-codex/plugin/scripts/sync-skills.mjs +19 -0
- package/packages/omo-codex/plugin/shared/test/config-loader.test.ts +18 -0
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/06-fix.md +6 -0
- package/packages/omo-codex/plugin/skills/frontend/ATTRIBUTION.md +13 -3
- package/packages/omo-codex/plugin/skills/frontend/SKILL.md +8 -3
- package/packages/omo-codex/plugin/skills/frontend/references/design/README.md +1 -1
- package/packages/omo-codex/plugin/skills/frontend/references/design/_INDEX.md +1 -1
- package/packages/omo-codex/plugin/skills/frontend/references/design/lazyweb.md +77 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/stitch-design-example.md +121 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/EVIDENCE.md +10 -2
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/UPSTREAM.md +1 -1
- package/packages/omo-codex/plugin/skills/programming/SKILL.md +10 -1
- package/packages/omo-codex/plugin/skills/programming/references/logging.md +91 -0
- package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +380 -0
- package/packages/omo-codex/plugin/skills/ultrawork/agents/openai.yaml +2 -0
- package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +1 -1
- package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +5 -2
- package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +4 -4
- package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-unclear.md +2 -2
- package/packages/omo-codex/plugin/skills/ulw-research/ATTRIBUTION.md +2 -2
- package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +31 -10
- package/packages/omo-codex/plugin/test/auto-update-release-notes.test.mjs +32 -0
- package/packages/omo-codex/plugin/test/auto-update.test.mjs +153 -3
- package/packages/omo-codex/plugin/test/install-time-build-runtime.test.mjs +1 -1
- package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +20 -1
- package/packages/omo-codex/plugin/test/sync-skills.test.mjs +39 -10
- package/packages/omo-codex/plugin/test/ultrawork-skill-pointer.test.mjs +56 -0
- package/packages/omo-codex/plugin/test/ulw-research-epistemic-contract.test.mjs +98 -0
- package/packages/omo-codex/plugin/test/ulw-research-skill-contract.test.mjs +25 -7
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +612 -4193
- package/packages/shared-skills/skills/debugging/references/methodology/06-fix.md +6 -0
- package/packages/shared-skills/skills/frontend/ATTRIBUTION.md +13 -3
- package/packages/shared-skills/skills/frontend/SKILL.md +8 -3
- package/packages/shared-skills/skills/frontend/references/design/README.md +1 -1
- package/packages/shared-skills/skills/frontend/references/design/_INDEX.md +1 -1
- package/packages/shared-skills/skills/frontend/references/design/lazyweb.md +77 -0
- package/packages/shared-skills/skills/frontend/references/design/stitch-design-example.md +121 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/EVIDENCE.md +10 -2
- package/packages/shared-skills/skills/frontend/references/designpowers/UPSTREAM.md +1 -1
- package/packages/shared-skills/skills/programming/SKILL.md +10 -1
- package/packages/shared-skills/skills/programming/references/logging.md +91 -0
- package/packages/shared-skills/skills/ulw-plan/SKILL.md +5 -5
- package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +7 -7
- package/packages/shared-skills/skills/ulw-plan/references/intent-unclear.md +3 -3
- package/packages/shared-skills/skills/ulw-research/ATTRIBUTION.md +2 -2
- package/packages/shared-skills/skills/ulw-research/SKILL.md +28 -7
- package/packages/omo-codex/plugin/skills/ultraresearch/SKILL.md +0 -10
- package/packages/omo-codex/plugin/skills/ultraresearch/agents/openai.yaml +0 -2
- /package/dist/skills/frontend/references/designpowers/vendor/skills/accessible-content/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/adaptive-interfaces/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/cognitive-accessibility/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/design-debate/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/design-debt-tracker/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/design-handoff/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/design-md/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/design-retrospective/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/design-review/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/design-system-alignment/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/designpowers-critique/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/heuristic-evaluation/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/inclusive-personas/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/inspiration-scouting/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/interaction-design/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/motion-choreography/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/research-planning/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/responsive-patterns/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/synthetic-user-testing/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/taste-feedback/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/taste-report/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/token-architecture/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/ui-composition/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/usability-testing/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/verification-before-shipping/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/voice-and-tone/{SKILL.md → reference.md} +0 -0
- /package/dist/skills/frontend/references/designpowers/vendor/skills/writing-design-plans/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/accessible-content/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/adaptive-interfaces/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/cognitive-accessibility/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-debate/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-debt-tracker/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-handoff/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-md/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-retrospective/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-review/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-system-alignment/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/designpowers-critique/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/heuristic-evaluation/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/inclusive-personas/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/inspiration-scouting/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/interaction-design/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/motion-choreography/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/research-planning/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/responsive-patterns/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/synthetic-user-testing/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/taste-feedback/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/taste-report/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/token-architecture/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/ui-composition/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/usability-testing/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/verification-before-shipping/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/voice-and-tone/{SKILL.md → reference.md} +0 -0
- /package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/writing-design-plans/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/accessible-content/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/adaptive-interfaces/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/cognitive-accessibility/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-debate/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-debt-tracker/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-handoff/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-md/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-retrospective/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-review/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-system-alignment/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/designpowers-critique/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/heuristic-evaluation/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/inclusive-personas/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/inspiration-scouting/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/interaction-design/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/motion-choreography/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/research-planning/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/responsive-patterns/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/synthetic-user-testing/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/taste-feedback/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/taste-report/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/token-architecture/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/ui-composition/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/usability-testing/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/verification-before-shipping/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/voice-and-tone/{SKILL.md → reference.md} +0 -0
- /package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/writing-design-plans/{SKILL.md → reference.md} +0 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
|
|
5
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
6
|
+
|
|
7
|
+
import { runUserPromptSubmitHook } from "../src/codex-hook.js";
|
|
8
|
+
import { ULTRAWORK_DIRECTIVE } from "../src/directive.js";
|
|
9
|
+
import { buildUltraworkAdditionalContext, buildUltraworkSkillPointer } from "../src/skill-pointer.js";
|
|
10
|
+
import { parseHookOutput } from "./codex-hook-test-helpers.js";
|
|
11
|
+
|
|
12
|
+
const POINTER_MAX_BYTES = 4096;
|
|
13
|
+
const tempDirectories: string[] = [];
|
|
14
|
+
|
|
15
|
+
function makeTempDirectory(): string {
|
|
16
|
+
const directory = mkdtempSync(join(tmpdir(), "ultrawork-skill-"));
|
|
17
|
+
tempDirectories.push(directory);
|
|
18
|
+
return directory;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function writeSkillFile(): string {
|
|
22
|
+
const skillFilePath = join(makeTempDirectory(), "SKILL.md");
|
|
23
|
+
writeFileSync(skillFilePath, "---\nname: ultrawork\n---\n\n<ultrawork-mode>\ndirective body\n</ultrawork-mode>\n");
|
|
24
|
+
return skillFilePath;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
afterEach(() => {
|
|
28
|
+
for (const directory of tempDirectories.splice(0)) {
|
|
29
|
+
rmSync(directory, { recursive: true, force: true });
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
describe("ultrawork skill pointer", () => {
|
|
34
|
+
it("#given an existing skill file #when context is built #then emits the compact pointer with the absolute path", () => {
|
|
35
|
+
// given
|
|
36
|
+
const skillFilePath = writeSkillFile();
|
|
37
|
+
|
|
38
|
+
// when
|
|
39
|
+
const context = buildUltraworkAdditionalContext({ skillFilePath });
|
|
40
|
+
|
|
41
|
+
// then
|
|
42
|
+
expect(context).toBe(buildUltraworkSkillPointer(skillFilePath));
|
|
43
|
+
expect(context.startsWith("<ultrawork-mode>")).toBe(true);
|
|
44
|
+
expect(context).toContain(skillFilePath);
|
|
45
|
+
expect(context).toContain("First user-visible line this turn MUST be exactly:");
|
|
46
|
+
expect(context).toContain("create_goal");
|
|
47
|
+
expect(context).not.toContain("Tier triage");
|
|
48
|
+
expect(Buffer.byteLength(context, "utf8")).toBeLessThan(POINTER_MAX_BYTES);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it("#given a missing skill file #when context is built #then falls back to the full directive", () => {
|
|
52
|
+
// given
|
|
53
|
+
const missingSkillFilePath = join(makeTempDirectory(), "SKILL.md");
|
|
54
|
+
|
|
55
|
+
// when
|
|
56
|
+
const context = buildUltraworkAdditionalContext({ skillFilePath: missingSkillFilePath });
|
|
57
|
+
|
|
58
|
+
// then
|
|
59
|
+
expect(context).toBe(ULTRAWORK_DIRECTIVE);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it("#given a null skill path #when context is built #then falls back to the full directive", () => {
|
|
63
|
+
expect(buildUltraworkAdditionalContext({ skillFilePath: null })).toBe(ULTRAWORK_DIRECTIVE);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it("#given the hook runs with a skill file #when prompt is ulw #then hook JSON carries the pointer", () => {
|
|
67
|
+
// given
|
|
68
|
+
const skillFilePath = writeSkillFile();
|
|
69
|
+
|
|
70
|
+
// when
|
|
71
|
+
const output = runUserPromptSubmitHook(
|
|
72
|
+
{ hook_event_name: "UserPromptSubmit", prompt: "ulw this change" },
|
|
73
|
+
{ skillFilePath },
|
|
74
|
+
);
|
|
75
|
+
const parsed = parseHookOutput(output);
|
|
76
|
+
|
|
77
|
+
// then
|
|
78
|
+
expect(parsed.hookSpecificOutput.hookEventName).toBe("UserPromptSubmit");
|
|
79
|
+
expect(parsed.hookSpecificOutput.additionalContext).toMatch(/^<ultrawork-mode>/);
|
|
80
|
+
expect(parsed.hookSpecificOutput.additionalContext).toContain(skillFilePath);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
## [0.1.0] - unreleased
|
|
4
4
|
|
|
5
|
+
- Standalone ultrawork injection (`--with-ultrawork`) now emits the same compact bootstrap pointer as the ultrawork component (opener mandate, `create_goal` with `objective` only, read the bundled `ultrawork` skill at a runtime-resolved absolute path), falling back to the full bundled directive when the plugin skills tree is absent. Keeps the injected payload below Codex App's hook-output truncation budget (code-yeongyu/oh-my-openagent#5828).
|
|
5
6
|
- Initial scaffold of codex-ulw-loop plugin.
|
|
6
7
|
- Per-Criterion Cycle: `EXECUTE` is now **EXECUTE-AS-SCENARIO** — the agent must run the Manual-QA channel scenario the criterion named (HTTP call / tmux / browser use / computer use; see new `## Manual-QA channels` section). Inserted a new **CLEAN (PAIRED, NEVER SKIP)** step that tears down every QA-spawned process / `tmux` session / browser context / container / port / temp dir before recording evidence; the cleanup receipt is embedded in the `--evidence` string. Missing receipt → record BLOCKED, not PASS. Added Constraint #13 and a Stop Rule for leftover state.
|
|
7
8
|
- New top-level **`## Manual-QA channels`** section explicitly enumerates the four channels (HTTP call, tmux, Browser use, Computer use) with concrete commands and required artifacts. Goal section now declares **TESTS ALONE NEVER PROVE DONE**: a green test suite is supporting evidence, never completion proof. Criterion-refinement step 2 requires each criterion to name its channel up front.
|
|
@@ -2270,8 +2270,57 @@ function commandScope(argv) {
|
|
|
2270
2270
|
}
|
|
2271
2271
|
|
|
2272
2272
|
// components/ulw-loop/src/ultrawork-directive.ts
|
|
2273
|
-
import { readFileSync } from "node:fs";
|
|
2273
|
+
import { readFileSync as readFileSync2 } from "node:fs";
|
|
2274
|
+
|
|
2275
|
+
// components/ulw-loop/src/ultrawork-skill-pointer.ts
|
|
2276
|
+
import { existsSync as existsSync5, readFileSync } from "node:fs";
|
|
2277
|
+
import { fileURLToPath } from "node:url";
|
|
2278
|
+
var ULTRAWORK_SKILL_POINTER_TEMPLATE = `<ultrawork-mode>
|
|
2279
|
+
ULTRAWORK MODE IS ACTIVE FOR THIS TASK.
|
|
2280
|
+
|
|
2281
|
+
MANDATORY BOOTSTRAP: do all three steps, in order, before anything else.
|
|
2282
|
+
|
|
2283
|
+
1. First user-visible line this turn MUST be exactly:
|
|
2284
|
+
\`ULTRAWORK MODE ENABLED!\`
|
|
2285
|
+
|
|
2286
|
+
2. Call \`create_goal\` NOW with \`objective\` set to the user's request.
|
|
2287
|
+
Send \`objective\` only: no \`status\`, no budget fields. If the
|
|
2288
|
+
\`create_goal\` tool is unavailable, open your reply with a binding
|
|
2289
|
+
\`# Goal\` block instead. Never skip this step.
|
|
2290
|
+
|
|
2291
|
+
3. Read the FULL ultrawork directive NOW, before any other tool call,
|
|
2292
|
+
plan, or edit. It is the \`ultrawork\` skill, stored at:
|
|
2293
|
+
|
|
2294
|
+
{{ULTRAWORK_SKILL_PATH}}
|
|
2295
|
+
|
|
2296
|
+
Read the whole file. If a read result comes back truncated, keep
|
|
2297
|
+
reading the remaining line ranges until you have seen every line.
|
|
2298
|
+
Every rule in that file is binding for this entire task: no
|
|
2299
|
+
compromise, no summarizing from memory, no skipping. If the file does
|
|
2300
|
+
not exist, tell the user the omo ultrawork skill is missing and
|
|
2301
|
+
continue with steps 1 and 2 plus evidence-bound execution.
|
|
2302
|
+
|
|
2303
|
+
Do not start the requested work until all three steps are complete.
|
|
2304
|
+
</ultrawork-mode>
|
|
2305
|
+
`;
|
|
2306
|
+
var ULTRAWORK_SKILL_PATH_PLACEHOLDER = "{{ULTRAWORK_SKILL_PATH}}";
|
|
2307
|
+
var ULTRAWORK_SKILL_FILE_URL = new URL("../../../skills/ultrawork/SKILL.md", import.meta.url);
|
|
2274
2308
|
var ULTRAWORK_DIRECTIVE = readFileSync(new URL("../directive.md", import.meta.url), "utf8");
|
|
2309
|
+
function resolveUltraworkSkillFilePath() {
|
|
2310
|
+
return fileURLToPath(ULTRAWORK_SKILL_FILE_URL);
|
|
2311
|
+
}
|
|
2312
|
+
function buildUltraworkSkillPointer(skillFilePath) {
|
|
2313
|
+
return ULTRAWORK_SKILL_POINTER_TEMPLATE.replace(ULTRAWORK_SKILL_PATH_PLACEHOLDER, skillFilePath);
|
|
2314
|
+
}
|
|
2315
|
+
function buildUltraworkAdditionalContext(options = {}) {
|
|
2316
|
+
const skillFilePath = options.skillFilePath === undefined ? resolveUltraworkSkillFilePath() : options.skillFilePath;
|
|
2317
|
+
if (skillFilePath !== null && existsSync5(skillFilePath)) {
|
|
2318
|
+
return buildUltraworkSkillPointer(skillFilePath);
|
|
2319
|
+
}
|
|
2320
|
+
return ULTRAWORK_DIRECTIVE;
|
|
2321
|
+
}
|
|
2322
|
+
|
|
2323
|
+
// components/ulw-loop/src/ultrawork-directive.ts
|
|
2275
2324
|
var ULTRAWORK_CURRENT_PROMPT_PATTERN = /(?:ultrawork|ulw)/i;
|
|
2276
2325
|
var ULTRAWORK_DIRECTIVE_MARKER = "<ultrawork-mode>";
|
|
2277
2326
|
var TRANSCRIPT_SEARCH_BYTES = 512000;
|
|
@@ -2284,14 +2333,14 @@ var CONTEXT_PRESSURE_MARKERS = [
|
|
|
2284
2333
|
"your input exceeds the context window",
|
|
2285
2334
|
"long threads and multiple compactions"
|
|
2286
2335
|
];
|
|
2287
|
-
function buildUltraworkDirectiveOutput(input) {
|
|
2336
|
+
function buildUltraworkDirectiveOutput(input, options = {}) {
|
|
2288
2337
|
if (isContextPressureRecoveryPrompt(input.prompt))
|
|
2289
2338
|
return "";
|
|
2290
2339
|
if (hasUltraworkDirectiveAlreadyInTranscript(input.transcript_path))
|
|
2291
2340
|
return "";
|
|
2292
2341
|
if (isContextPressureTranscript(input.transcript_path))
|
|
2293
2342
|
return "";
|
|
2294
|
-
return isUltraworkPrompt(input.prompt) ? formatAdditionalContextOutput(
|
|
2343
|
+
return isUltraworkPrompt(input.prompt) ? formatAdditionalContextOutput(buildUltraworkAdditionalContext(options)) : "";
|
|
2295
2344
|
}
|
|
2296
2345
|
function hasUltraworkDirectiveAlreadyInTranscript(transcriptPath) {
|
|
2297
2346
|
if (transcriptPath === undefined || transcriptPath === null)
|
|
@@ -2319,7 +2368,7 @@ function hasUltraworkDirectiveAlreadyInTranscript(transcriptPath) {
|
|
|
2319
2368
|
return false;
|
|
2320
2369
|
}
|
|
2321
2370
|
function readTranscriptTail(transcriptPath) {
|
|
2322
|
-
const rawTranscript =
|
|
2371
|
+
const rawTranscript = readFileSync2(transcriptPath);
|
|
2323
2372
|
return rawTranscript.subarray(Math.max(0, rawTranscript.byteLength - TRANSCRIPT_SEARCH_BYTES)).toString("utf8");
|
|
2324
2373
|
}
|
|
2325
2374
|
function isUltraworkPrompt(prompt) {
|
|
@@ -2409,7 +2458,9 @@ async function applyUserPromptUlwLoopSteering(payload, options = {}) {
|
|
|
2409
2458
|
if (proposal === null) {
|
|
2410
2459
|
if (hasSteeringDirectiveMarker(payload.prompt))
|
|
2411
2460
|
return "";
|
|
2412
|
-
|
|
2461
|
+
if (!options.includeUltraworkDirective)
|
|
2462
|
+
return "";
|
|
2463
|
+
return options.ultraworkSkillFilePath === undefined ? buildUltraworkDirectiveOutput(payload) : buildUltraworkDirectiveOutput(payload, { skillFilePath: options.ultraworkSkillFilePath });
|
|
2413
2464
|
}
|
|
2414
2465
|
const result = await steerUlwLoop(payload.cwd, proposal, payloadScope(payload));
|
|
2415
2466
|
if (!result.accepted)
|
|
@@ -10,6 +10,7 @@ export interface UserPromptSubmitPayload {
|
|
|
10
10
|
}
|
|
11
11
|
export interface UserPromptSubmitHookOptions {
|
|
12
12
|
readonly includeUltraworkDirective?: boolean;
|
|
13
|
+
readonly ultraworkSkillFilePath?: string | null;
|
|
13
14
|
}
|
|
14
15
|
export interface PreToolUsePayload {
|
|
15
16
|
readonly cwd: string;
|
|
@@ -36,7 +36,11 @@ export async function applyUserPromptUlwLoopSteering(payload, options = {}) {
|
|
|
36
36
|
if (proposal === null) {
|
|
37
37
|
if (hasSteeringDirectiveMarker(payload.prompt))
|
|
38
38
|
return "";
|
|
39
|
-
|
|
39
|
+
if (!options.includeUltraworkDirective)
|
|
40
|
+
return "";
|
|
41
|
+
return options.ultraworkSkillFilePath === undefined
|
|
42
|
+
? buildUltraworkDirectiveOutput(payload)
|
|
43
|
+
: buildUltraworkDirectiveOutput(payload, { skillFilePath: options.ultraworkSkillFilePath });
|
|
40
44
|
}
|
|
41
45
|
const result = await steerUlwLoop(payload.cwd, proposal, payloadScope(payload));
|
|
42
46
|
if (!result.accepted)
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { type UltraworkAdditionalContextOptions } from "./ultrawork-skill-pointer.js";
|
|
1
2
|
export interface UltraworkDirectiveInput {
|
|
2
3
|
readonly prompt: string;
|
|
3
4
|
readonly transcript_path?: string | null;
|
|
4
5
|
}
|
|
5
|
-
export declare function buildUltraworkDirectiveOutput(input: UltraworkDirectiveInput): string;
|
|
6
|
+
export declare function buildUltraworkDirectiveOutput(input: UltraworkDirectiveInput, options?: UltraworkAdditionalContextOptions): string;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { readFileSync } from "node:fs";
|
|
2
|
-
|
|
2
|
+
import { buildUltraworkAdditionalContext } from "./ultrawork-skill-pointer.js";
|
|
3
3
|
const ULTRAWORK_CURRENT_PROMPT_PATTERN = /(?:ultrawork|ulw)/i;
|
|
4
4
|
const ULTRAWORK_DIRECTIVE_MARKER = "<ultrawork-mode>";
|
|
5
5
|
const TRANSCRIPT_SEARCH_BYTES = 512_000;
|
|
@@ -12,14 +12,16 @@ const CONTEXT_PRESSURE_MARKERS = [
|
|
|
12
12
|
"your input exceeds the context window",
|
|
13
13
|
"long threads and multiple compactions",
|
|
14
14
|
];
|
|
15
|
-
export function buildUltraworkDirectiveOutput(input) {
|
|
15
|
+
export function buildUltraworkDirectiveOutput(input, options = {}) {
|
|
16
16
|
if (isContextPressureRecoveryPrompt(input.prompt))
|
|
17
17
|
return "";
|
|
18
18
|
if (hasUltraworkDirectiveAlreadyInTranscript(input.transcript_path))
|
|
19
19
|
return "";
|
|
20
20
|
if (isContextPressureTranscript(input.transcript_path))
|
|
21
21
|
return "";
|
|
22
|
-
return isUltraworkPrompt(input.prompt)
|
|
22
|
+
return isUltraworkPrompt(input.prompt)
|
|
23
|
+
? formatAdditionalContextOutput(buildUltraworkAdditionalContext(options))
|
|
24
|
+
: "";
|
|
23
25
|
}
|
|
24
26
|
function hasUltraworkDirectiveAlreadyInTranscript(transcriptPath) {
|
|
25
27
|
if (transcriptPath === undefined || transcriptPath === null)
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const ULTRAWORK_SKILL_POINTER_TEMPLATE = "<ultrawork-mode>\nULTRAWORK MODE IS ACTIVE FOR THIS TASK.\n\nMANDATORY BOOTSTRAP: do all three steps, in order, before anything else.\n\n1. First user-visible line this turn MUST be exactly:\n`ULTRAWORK MODE ENABLED!`\n\n2. Call `create_goal` NOW with `objective` set to the user's request.\nSend `objective` only: no `status`, no budget fields. If the\n`create_goal` tool is unavailable, open your reply with a binding\n`# Goal` block instead. Never skip this step.\n\n3. Read the FULL ultrawork directive NOW, before any other tool call,\nplan, or edit. It is the `ultrawork` skill, stored at:\n\n{{ULTRAWORK_SKILL_PATH}}\n\nRead the whole file. If a read result comes back truncated, keep\nreading the remaining line ranges until you have seen every line.\nEvery rule in that file is binding for this entire task: no\ncompromise, no summarizing from memory, no skipping. If the file does\nnot exist, tell the user the omo ultrawork skill is missing and\ncontinue with steps 1 and 2 plus evidence-bound execution.\n\nDo not start the requested work until all three steps are complete.\n</ultrawork-mode>\n";
|
|
2
|
+
export interface UltraworkAdditionalContextOptions {
|
|
3
|
+
readonly skillFilePath?: string | null;
|
|
4
|
+
}
|
|
5
|
+
export declare function resolveUltraworkSkillFilePath(): string;
|
|
6
|
+
export declare function buildUltraworkSkillPointer(skillFilePath: string): string;
|
|
7
|
+
export declare function buildUltraworkAdditionalContext(options?: UltraworkAdditionalContextOptions): string;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
export const ULTRAWORK_SKILL_POINTER_TEMPLATE = `<ultrawork-mode>
|
|
4
|
+
ULTRAWORK MODE IS ACTIVE FOR THIS TASK.
|
|
5
|
+
|
|
6
|
+
MANDATORY BOOTSTRAP: do all three steps, in order, before anything else.
|
|
7
|
+
|
|
8
|
+
1. First user-visible line this turn MUST be exactly:
|
|
9
|
+
\`ULTRAWORK MODE ENABLED!\`
|
|
10
|
+
|
|
11
|
+
2. Call \`create_goal\` NOW with \`objective\` set to the user's request.
|
|
12
|
+
Send \`objective\` only: no \`status\`, no budget fields. If the
|
|
13
|
+
\`create_goal\` tool is unavailable, open your reply with a binding
|
|
14
|
+
\`# Goal\` block instead. Never skip this step.
|
|
15
|
+
|
|
16
|
+
3. Read the FULL ultrawork directive NOW, before any other tool call,
|
|
17
|
+
plan, or edit. It is the \`ultrawork\` skill, stored at:
|
|
18
|
+
|
|
19
|
+
{{ULTRAWORK_SKILL_PATH}}
|
|
20
|
+
|
|
21
|
+
Read the whole file. If a read result comes back truncated, keep
|
|
22
|
+
reading the remaining line ranges until you have seen every line.
|
|
23
|
+
Every rule in that file is binding for this entire task: no
|
|
24
|
+
compromise, no summarizing from memory, no skipping. If the file does
|
|
25
|
+
not exist, tell the user the omo ultrawork skill is missing and
|
|
26
|
+
continue with steps 1 and 2 plus evidence-bound execution.
|
|
27
|
+
|
|
28
|
+
Do not start the requested work until all three steps are complete.
|
|
29
|
+
</ultrawork-mode>
|
|
30
|
+
`;
|
|
31
|
+
const ULTRAWORK_SKILL_PATH_PLACEHOLDER = "{{ULTRAWORK_SKILL_PATH}}";
|
|
32
|
+
const ULTRAWORK_SKILL_FILE_URL = new URL("../../../skills/ultrawork/SKILL.md", import.meta.url);
|
|
33
|
+
const ULTRAWORK_DIRECTIVE = readFileSync(new URL("../directive.md", import.meta.url), "utf8");
|
|
34
|
+
export function resolveUltraworkSkillFilePath() {
|
|
35
|
+
return fileURLToPath(ULTRAWORK_SKILL_FILE_URL);
|
|
36
|
+
}
|
|
37
|
+
export function buildUltraworkSkillPointer(skillFilePath) {
|
|
38
|
+
return ULTRAWORK_SKILL_POINTER_TEMPLATE.replace(ULTRAWORK_SKILL_PATH_PLACEHOLDER, skillFilePath);
|
|
39
|
+
}
|
|
40
|
+
export function buildUltraworkAdditionalContext(options = {}) {
|
|
41
|
+
const skillFilePath = options.skillFilePath === undefined ? resolveUltraworkSkillFilePath() : options.skillFilePath;
|
|
42
|
+
if (skillFilePath !== null && existsSync(skillFilePath)) {
|
|
43
|
+
return buildUltraworkSkillPointer(skillFilePath);
|
|
44
|
+
}
|
|
45
|
+
return ULTRAWORK_DIRECTIVE;
|
|
46
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@code-yeongyu/codex-ulw-loop",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.16.0",
|
|
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",
|
package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md
CHANGED
|
@@ -127,7 +127,7 @@ Gather context BEFORE planning with parallel `explorer` / `librarian` workers pl
|
|
|
127
127
|
First survey available skills: read every loosely-relevant skill's description, deliberately choose which this work uses, and prefer applying genuinely-relevant skills over working raw.
|
|
128
128
|
Then run tier triage per goal — rigor (LIGHT/HEAVY below) and shape (`delivery` default, or `research` when the deliverable is a cited answer, not an artifact) — and record both in an `annotate_ledger` steering entry. Default is LIGHT — a narrow change inside existing layers. Take HEAVY only on a fact you can point to: a new module / abstraction / domain model; auth, security, or session; an external integration; a DB schema or migration; concurrency, transaction boundaries, or cache invalidation; a cross-domain refactor; or the user signaled care or demanded review. When unsure, take HEAVY; upgrade the moment a HEAVY fact surfaces, never downgrade mid-run.
|
|
129
129
|
HEAVY goals: spawn the `plan` agent with the gathered context, follow its wave ordering and parallel grouping exactly, and run the verification it specifies; carry 3+ successCriteria covering happy path, edge, regression, and adversarial risk. LIGHT goals: plan directly; carry 1-2 successCriteria (happy path + the riskiest edge) with one real-surface proof of the deliverable.
|
|
130
|
-
Research-shape goals change the cycle: BEFORE each investigation, read this goal's prior ledger findings and open hypotheses, then extend them — never re-investigate an answered question (the ledger is your research notebook). Record findings via `annotate_ledger` with their source (`file:line`, command output, doc URL) as `--evidence`. Track hypotheses as `HYPOTHESIS[id]: <claim> | status: open`, flipped to `confirmed`/`refuted` only on an observed source. A research criterion passes on a cited answer — skip QA-channel, cleanup, and commit, but keep source-observability (never "looks correct"). Keep hypotheses inside the user's stated question; a scope-widening one is an `add_subgoal` proposal you surface, never silent creep. For a `research`-shape goal you MAY load `ulw-research`
|
|
130
|
+
Research-shape goals change the cycle: BEFORE each investigation, read this goal's prior ledger findings and open hypotheses, then extend them — never re-investigate an answered question (the ledger is your research notebook). Record findings via `annotate_ledger` with their source (`file:line`, command output, doc URL) as `--evidence`. Track hypotheses as `HYPOTHESIS[id]: <claim> | status: open`, flipped to `confirmed`/`refuted` only on an observed source. A research criterion passes on a cited answer — skip QA-channel, cleanup, and commit, but keep source-observability (never "looks correct"). Keep hypotheses inside the user's stated question; a scope-widening one is an `add_subgoal` proposal you surface, never silent creep. For a `research`-shape goal you MAY load `ulw-research` without hesitation — otherwise explicit-request-only, a research-shape goal IS that explicit demand. Research-only: never for a `delivery` goal. It composes with the librarian routing above — `ulw-research` for saturation (many parallel sources, recursive expansion), a single `librarian` for one lookup.
|
|
131
131
|
For each criterion, define upfront: `id`, exact `scenario` (tool + inputs + binary pass/fail), `expectedEvidence` artifact path, adversarial classes, stop condition, and Manual-QA channel. Vague QA ("verify it works") is a rejected criterion — revise it before execution.
|
|
132
132
|
For optimization work, capture baseline speed before changes plus behavior/regression proof. Every attempt records speed, behavior/regression, and the keep/revert/iterate decision.
|
|
133
133
|
A criterion's adversarial classes are the ultraqa classes a fact about the change triggers: malformed input, prompt injection, cancel/resume, stale state, dirty worktree, hung or long commands, flaky tests, misleading success output, repeated interruptions. Record untriggered classes as not-applicable in one line.
|
|
@@ -15,6 +15,7 @@ export interface UserPromptSubmitPayload {
|
|
|
15
15
|
|
|
16
16
|
export interface UserPromptSubmitHookOptions {
|
|
17
17
|
readonly includeUltraworkDirective?: boolean;
|
|
18
|
+
readonly ultraworkSkillFilePath?: string | null;
|
|
18
19
|
}
|
|
19
20
|
|
|
20
21
|
export interface PreToolUsePayload {
|
|
@@ -74,7 +75,10 @@ export async function applyUserPromptUlwLoopSteering(
|
|
|
74
75
|
const proposal = parseUlwLoopSteeringDirective(payload.prompt);
|
|
75
76
|
if (proposal === null) {
|
|
76
77
|
if (hasSteeringDirectiveMarker(payload.prompt)) return "";
|
|
77
|
-
|
|
78
|
+
if (!options.includeUltraworkDirective) return "";
|
|
79
|
+
return options.ultraworkSkillFilePath === undefined
|
|
80
|
+
? buildUltraworkDirectiveOutput(payload)
|
|
81
|
+
: buildUltraworkDirectiveOutput(payload, { skillFilePath: options.ultraworkSkillFilePath });
|
|
78
82
|
}
|
|
79
83
|
const result = await steerUlwLoop(payload.cwd, proposal, payloadScope(payload));
|
|
80
84
|
if (!result.accepted) return "";
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { readFileSync } from "node:fs";
|
|
2
2
|
|
|
3
|
+
import { buildUltraworkAdditionalContext, type UltraworkAdditionalContextOptions } from "./ultrawork-skill-pointer.js";
|
|
4
|
+
|
|
3
5
|
export interface UltraworkDirectiveInput {
|
|
4
6
|
readonly prompt: string;
|
|
5
7
|
readonly transcript_path?: string | null;
|
|
@@ -12,7 +14,6 @@ interface UserPromptSubmitHookOutput {
|
|
|
12
14
|
};
|
|
13
15
|
}
|
|
14
16
|
|
|
15
|
-
const ULTRAWORK_DIRECTIVE = readFileSync(new URL("../directive.md", import.meta.url), "utf8");
|
|
16
17
|
const ULTRAWORK_CURRENT_PROMPT_PATTERN = /(?:ultrawork|ulw)/i;
|
|
17
18
|
const ULTRAWORK_DIRECTIVE_MARKER = "<ultrawork-mode>";
|
|
18
19
|
const TRANSCRIPT_SEARCH_BYTES = 512_000;
|
|
@@ -26,11 +27,16 @@ const CONTEXT_PRESSURE_MARKERS = [
|
|
|
26
27
|
"long threads and multiple compactions",
|
|
27
28
|
] as const;
|
|
28
29
|
|
|
29
|
-
export function buildUltraworkDirectiveOutput(
|
|
30
|
+
export function buildUltraworkDirectiveOutput(
|
|
31
|
+
input: UltraworkDirectiveInput,
|
|
32
|
+
options: UltraworkAdditionalContextOptions = {},
|
|
33
|
+
): string {
|
|
30
34
|
if (isContextPressureRecoveryPrompt(input.prompt)) return "";
|
|
31
35
|
if (hasUltraworkDirectiveAlreadyInTranscript(input.transcript_path)) return "";
|
|
32
36
|
if (isContextPressureTranscript(input.transcript_path)) return "";
|
|
33
|
-
return isUltraworkPrompt(input.prompt)
|
|
37
|
+
return isUltraworkPrompt(input.prompt)
|
|
38
|
+
? formatAdditionalContextOutput(buildUltraworkAdditionalContext(options))
|
|
39
|
+
: "";
|
|
34
40
|
}
|
|
35
41
|
|
|
36
42
|
function hasUltraworkDirectiveAlreadyInTranscript(transcriptPath: string | null | undefined): boolean {
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
|
|
4
|
+
export const ULTRAWORK_SKILL_POINTER_TEMPLATE = `<ultrawork-mode>
|
|
5
|
+
ULTRAWORK MODE IS ACTIVE FOR THIS TASK.
|
|
6
|
+
|
|
7
|
+
MANDATORY BOOTSTRAP: do all three steps, in order, before anything else.
|
|
8
|
+
|
|
9
|
+
1. First user-visible line this turn MUST be exactly:
|
|
10
|
+
\`ULTRAWORK MODE ENABLED!\`
|
|
11
|
+
|
|
12
|
+
2. Call \`create_goal\` NOW with \`objective\` set to the user's request.
|
|
13
|
+
Send \`objective\` only: no \`status\`, no budget fields. If the
|
|
14
|
+
\`create_goal\` tool is unavailable, open your reply with a binding
|
|
15
|
+
\`# Goal\` block instead. Never skip this step.
|
|
16
|
+
|
|
17
|
+
3. Read the FULL ultrawork directive NOW, before any other tool call,
|
|
18
|
+
plan, or edit. It is the \`ultrawork\` skill, stored at:
|
|
19
|
+
|
|
20
|
+
{{ULTRAWORK_SKILL_PATH}}
|
|
21
|
+
|
|
22
|
+
Read the whole file. If a read result comes back truncated, keep
|
|
23
|
+
reading the remaining line ranges until you have seen every line.
|
|
24
|
+
Every rule in that file is binding for this entire task: no
|
|
25
|
+
compromise, no summarizing from memory, no skipping. If the file does
|
|
26
|
+
not exist, tell the user the omo ultrawork skill is missing and
|
|
27
|
+
continue with steps 1 and 2 plus evidence-bound execution.
|
|
28
|
+
|
|
29
|
+
Do not start the requested work until all three steps are complete.
|
|
30
|
+
</ultrawork-mode>
|
|
31
|
+
`;
|
|
32
|
+
|
|
33
|
+
const ULTRAWORK_SKILL_PATH_PLACEHOLDER = "{{ULTRAWORK_SKILL_PATH}}";
|
|
34
|
+
const ULTRAWORK_SKILL_FILE_URL = new URL("../../../skills/ultrawork/SKILL.md", import.meta.url);
|
|
35
|
+
const ULTRAWORK_DIRECTIVE = readFileSync(new URL("../directive.md", import.meta.url), "utf8");
|
|
36
|
+
|
|
37
|
+
export interface UltraworkAdditionalContextOptions {
|
|
38
|
+
readonly skillFilePath?: string | null;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function resolveUltraworkSkillFilePath(): string {
|
|
42
|
+
return fileURLToPath(ULTRAWORK_SKILL_FILE_URL);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function buildUltraworkSkillPointer(skillFilePath: string): string {
|
|
46
|
+
return ULTRAWORK_SKILL_POINTER_TEMPLATE.replace(ULTRAWORK_SKILL_PATH_PLACEHOLDER, skillFilePath);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function buildUltraworkAdditionalContext(options: UltraworkAdditionalContextOptions = {}): string {
|
|
50
|
+
const skillFilePath = options.skillFilePath === undefined ? resolveUltraworkSkillFilePath() : options.skillFilePath;
|
|
51
|
+
if (skillFilePath !== null && existsSync(skillFilePath)) {
|
|
52
|
+
return buildUltraworkSkillPointer(skillFilePath);
|
|
53
|
+
}
|
|
54
|
+
return ULTRAWORK_DIRECTIVE;
|
|
55
|
+
}
|
|
@@ -61,4 +61,53 @@ describe("standalone ultrawork directive injection", () => {
|
|
|
61
61
|
|
|
62
62
|
expect(ulwLoopDirective).toBe(ultraworkDirective);
|
|
63
63
|
});
|
|
64
|
+
|
|
65
|
+
it("#given an existing ultrawork skill file #when standalone injection runs #then emits the compact skill pointer", async () => {
|
|
66
|
+
const skillFilePath = join(await mkdtemp(join(tmpdir(), "ug-skill-")), "SKILL.md");
|
|
67
|
+
await writeFile(
|
|
68
|
+
skillFilePath,
|
|
69
|
+
"---\nname: ultrawork\n---\n\n<ultrawork-mode>\ndirective body\n</ultrawork-mode>\n",
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
const output = await applyUserPromptUlwLoopSteering(payload("ulw this change", "/tmp"), {
|
|
73
|
+
includeUltraworkDirective: true,
|
|
74
|
+
ultraworkSkillFilePath: skillFilePath,
|
|
75
|
+
});
|
|
76
|
+
const parsed = JSON.parse(output);
|
|
77
|
+
const context = parsed.hookSpecificOutput.additionalContext;
|
|
78
|
+
|
|
79
|
+
expect(context).toMatch(/^<ultrawork-mode>/);
|
|
80
|
+
expect(context).toContain(skillFilePath);
|
|
81
|
+
expect(context).toContain("create_goal");
|
|
82
|
+
expect(context).not.toContain("Tier triage");
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it("#given a missing ultrawork skill file #when standalone injection runs #then falls back to the full directive", async () => {
|
|
86
|
+
const missingSkillFilePath = join(await mkdtemp(join(tmpdir(), "ug-skill-")), "SKILL.md");
|
|
87
|
+
|
|
88
|
+
const output = await applyUserPromptUlwLoopSteering(payload("ulw this change", "/tmp"), {
|
|
89
|
+
includeUltraworkDirective: true,
|
|
90
|
+
ultraworkSkillFilePath: missingSkillFilePath,
|
|
91
|
+
});
|
|
92
|
+
const parsed = JSON.parse(output);
|
|
93
|
+
|
|
94
|
+
expect(parsed.hookSpecificOutput.additionalContext).toContain("Tier triage");
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it("#given the ulw-loop pointer template #when compared to ultrawork #then the copy stays byte-identical", async () => {
|
|
98
|
+
const ulwLoopPointerSource = await readFile(
|
|
99
|
+
new URL("../src/ultrawork-skill-pointer.ts", import.meta.url),
|
|
100
|
+
"utf8",
|
|
101
|
+
);
|
|
102
|
+
const ultraworkPointerSource = await readFile(
|
|
103
|
+
new URL("../../ultrawork/src/skill-pointer.ts", import.meta.url),
|
|
104
|
+
"utf8",
|
|
105
|
+
);
|
|
106
|
+
const templatePattern = /export const ULTRAWORK_SKILL_POINTER_TEMPLATE = `[\s\S]*?`;\n/;
|
|
107
|
+
const ulwLoopTemplate = ulwLoopPointerSource.match(templatePattern)?.[0];
|
|
108
|
+
const ultraworkTemplate = ultraworkPointerSource.match(templatePattern)?.[0];
|
|
109
|
+
|
|
110
|
+
expect(ulwLoopTemplate).toBeDefined();
|
|
111
|
+
expect(ulwLoopTemplate).toBe(ultraworkTemplate);
|
|
112
|
+
});
|
|
64
113
|
});
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sisyphuslabs/omo-codex-plugin",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.16.0",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@sisyphuslabs/omo-codex-plugin",
|
|
9
|
-
"version": "4.
|
|
9
|
+
"version": "4.16.0",
|
|
10
10
|
"workspaces": [
|
|
11
11
|
"components/codegraph",
|
|
12
12
|
"components/comment-checker",
|
|
@@ -93,7 +93,7 @@
|
|
|
93
93
|
},
|
|
94
94
|
"components/codegraph": {
|
|
95
95
|
"name": "@sisyphuslabs/codex-codegraph",
|
|
96
|
-
"version": "4.
|
|
96
|
+
"version": "4.16.0",
|
|
97
97
|
"bin": {
|
|
98
98
|
"omo-codegraph": "dist/cli.js"
|
|
99
99
|
},
|
|
@@ -112,7 +112,7 @@
|
|
|
112
112
|
},
|
|
113
113
|
"components/comment-checker": {
|
|
114
114
|
"name": "@code-yeongyu/codex-comment-checker",
|
|
115
|
-
"version": "4.
|
|
115
|
+
"version": "4.16.0",
|
|
116
116
|
"license": "MIT",
|
|
117
117
|
"bin": {
|
|
118
118
|
"omo-comment-checker": "dist/cli.js"
|
|
@@ -133,7 +133,7 @@
|
|
|
133
133
|
},
|
|
134
134
|
"components/git-bash": {
|
|
135
135
|
"name": "@sisyphuslabs/codex-git-bash-hook",
|
|
136
|
-
"version": "4.
|
|
136
|
+
"version": "4.16.0",
|
|
137
137
|
"bin": {
|
|
138
138
|
"omo-git-bash-hook": "dist/cli.js"
|
|
139
139
|
},
|
|
@@ -148,7 +148,7 @@
|
|
|
148
148
|
},
|
|
149
149
|
"components/lazycodex-executor-verify": {
|
|
150
150
|
"name": "@code-yeongyu/codex-lazycodex-executor-verify",
|
|
151
|
-
"version": "4.
|
|
151
|
+
"version": "4.16.0",
|
|
152
152
|
"license": "MIT",
|
|
153
153
|
"bin": {
|
|
154
154
|
"lazycodex-executor-verify": "dist/cli.js"
|
|
@@ -165,7 +165,7 @@
|
|
|
165
165
|
},
|
|
166
166
|
"components/lsp": {
|
|
167
167
|
"name": "@code-yeongyu/codex-lsp",
|
|
168
|
-
"version": "4.
|
|
168
|
+
"version": "4.16.0",
|
|
169
169
|
"license": "MIT",
|
|
170
170
|
"dependencies": {
|
|
171
171
|
"@code-yeongyu/lsp-daemon": "file:../../../../lsp-daemon"
|
|
@@ -185,7 +185,7 @@
|
|
|
185
185
|
},
|
|
186
186
|
"components/rules": {
|
|
187
187
|
"name": "@code-yeongyu/codex-rules",
|
|
188
|
-
"version": "4.
|
|
188
|
+
"version": "4.16.0",
|
|
189
189
|
"license": "MIT",
|
|
190
190
|
"dependencies": {
|
|
191
191
|
"picomatch": "^4.0.3"
|
|
@@ -207,7 +207,7 @@
|
|
|
207
207
|
},
|
|
208
208
|
"components/start-work-continuation": {
|
|
209
209
|
"name": "@code-yeongyu/codex-start-work-continuation",
|
|
210
|
-
"version": "4.
|
|
210
|
+
"version": "4.16.0",
|
|
211
211
|
"license": "MIT",
|
|
212
212
|
"bin": {
|
|
213
213
|
"omo-start-work-continuation": "dist/cli.js"
|
|
@@ -224,7 +224,7 @@
|
|
|
224
224
|
},
|
|
225
225
|
"components/teammode": {
|
|
226
226
|
"name": "@sisyphuslabs/codex-teammode",
|
|
227
|
-
"version": "4.
|
|
227
|
+
"version": "4.16.0",
|
|
228
228
|
"devDependencies": {
|
|
229
229
|
"@types/node": "^25.9.3",
|
|
230
230
|
"bun-types": "^1.3.1",
|
|
@@ -237,7 +237,7 @@
|
|
|
237
237
|
},
|
|
238
238
|
"components/telemetry": {
|
|
239
239
|
"name": "@code-yeongyu/codex-telemetry",
|
|
240
|
-
"version": "4.
|
|
240
|
+
"version": "4.16.0",
|
|
241
241
|
"license": "MIT",
|
|
242
242
|
"bin": {
|
|
243
243
|
"omo-telemetry": "dist/cli.js"
|
|
@@ -255,7 +255,7 @@
|
|
|
255
255
|
},
|
|
256
256
|
"components/ultrawork": {
|
|
257
257
|
"name": "@code-yeongyu/codex-ultrawork",
|
|
258
|
-
"version": "4.
|
|
258
|
+
"version": "4.16.0",
|
|
259
259
|
"license": "MIT",
|
|
260
260
|
"bin": {
|
|
261
261
|
"omo-ultrawork": "dist/cli.js"
|
|
@@ -273,7 +273,7 @@
|
|
|
273
273
|
},
|
|
274
274
|
"components/ulw-loop": {
|
|
275
275
|
"name": "@code-yeongyu/codex-ulw-loop",
|
|
276
|
-
"version": "4.
|
|
276
|
+
"version": "4.16.0",
|
|
277
277
|
"license": "MIT",
|
|
278
278
|
"bin": {
|
|
279
279
|
"omo-ulw-loop": "dist/cli.js",
|