lazycodex-ai 5.0.0-beta.4 → 5.0.0-beta.42
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 +25 -21
- package/README.ko.md +25 -21
- package/README.md +38 -23
- package/README.ru.md +24 -20
- package/README.zh-cn.md +25 -21
- package/dist/cli/config-manager/parse-opencode-config-file.d.ts +2 -1
- package/dist/cli/doctor/checks/system-plugin.d.ts +4 -3
- package/dist/cli/fallback-lane-policy.d.ts +1 -0
- package/dist/cli/index.js +67006 -64814
- package/dist/cli/install-codex/install-codex-test-fixtures.d.ts +1 -1
- package/dist/cli/run/on-complete-hook.d.ts +2 -0
- package/dist/cli/runtime-commands.d.ts +1 -1
- package/dist/cli/worktree-sweep/classify.d.ts +16 -0
- package/dist/cli/worktree-sweep/format.d.ts +8 -0
- package/dist/cli/worktree-sweep/git.d.ts +19 -0
- package/dist/cli/worktree-sweep/index.d.ts +7 -0
- package/dist/cli/worktree-sweep/options.d.ts +2 -0
- package/dist/cli/worktree-sweep/parse-worktree-list.d.ts +8 -0
- package/dist/cli/worktree-sweep/sweep.d.ts +2 -0
- package/dist/cli/worktree-sweep/types.d.ts +65 -0
- package/dist/cli/worktree-sweep/worktree-sweep.d.ts +2 -0
- package/dist/cli-node/index.js +67283 -65068
- package/package.json +9 -9
- package/packages/git-bash-mcp/dist/cli.js +6 -1
- package/packages/lsp-daemon/dist/cli.js +804 -329
- package/packages/lsp-daemon/dist/client.d.ts +10 -0
- package/packages/lsp-daemon/dist/client.js +764 -286
- package/packages/lsp-daemon/dist/daemon-client.d.ts +1 -0
- package/packages/lsp-daemon/dist/daemon-client.js +3 -0
- package/packages/lsp-daemon/dist/ensure-daemon.js +1 -0
- package/packages/lsp-daemon/dist/index.js +768 -295
- package/packages/lsp-daemon/dist/proxy.js +3 -0
- package/packages/lsp-daemon/dist/version-reap.js +1 -1
- package/packages/lsp-daemon/package.json +1 -1
- package/packages/lsp-tools-mcp/dist/cli.js +723 -250
- package/packages/lsp-tools-mcp/dist/lsp/manager.js +259 -125
- package/packages/lsp-tools-mcp/dist/mcp.js +725 -252
- package/packages/lsp-tools-mcp/dist/request-context.js +12 -13
- package/packages/lsp-tools-mcp/dist/tools.js +729 -260
- package/packages/lsp-tools-mcp/package.json +1 -1
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +4 -6
- package/packages/omo-codex/plugin/.mcp.json +0 -6
- package/packages/omo-codex/plugin/AGENTS.md +47 -0
- package/packages/omo-codex/plugin/README.md +2 -2
- package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +45 -49
- package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/src/hook.ts +1 -0
- package/packages/omo-codex/plugin/components/comment-checker/AGENTS.md +9 -0
- package/packages/omo-codex/plugin/components/comment-checker/biome.json +2 -2
- package/packages/omo-codex/plugin/components/comment-checker/dist/cli.js +2 -1
- package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/package.json +5 -5
- package/packages/omo-codex/plugin/components/comment-checker/src/apply-patch.ts +2 -8
- package/packages/omo-codex/plugin/components/comment-checker/src/core.ts +1 -2
- package/packages/omo-codex/plugin/components/comment-checker/src/request-extractor.ts +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/src/runner.ts +1 -0
- package/packages/omo-codex/plugin/components/git-bash/AGENTS.md +1 -1
- package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/git-bash/package.json +3 -4
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/biome.json +2 -2
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/cli.js +1 -5
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/codex-hook.js +1 -5
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +5 -5
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/src/codex-hook.ts +1 -5
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/codex-hook.test.ts +4 -21
- package/packages/omo-codex/plugin/components/lcx/skills/lcx-doctor/SKILL.md +1 -1
- package/packages/omo-codex/plugin/components/lsp/AGENTS.md +30 -15
- package/packages/omo-codex/plugin/components/lsp/biome.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +4 -4
- package/packages/omo-codex/plugin/components/lsp/dist/cli.js +752 -300
- package/packages/omo-codex/plugin/components/lsp/dist/daemon-cli-path.js +1 -1
- package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/package.json +5 -5
- package/packages/omo-codex/plugin/components/lsp/src/cli.ts +1 -1
- package/packages/omo-codex/plugin/components/lsp/src/codex-hook.ts +1 -1
- package/packages/omo-codex/plugin/components/lsp/src/daemon-cli-path.ts +1 -5
- package/packages/omo-codex/plugin/components/lsp/test/codex-hook-unavailable.test.ts +6 -7
- package/packages/omo-codex/plugin/components/lsp/test/codex-hook.test.ts +1 -2
- package/packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts +11 -1
- package/packages/omo-codex/plugin/components/rules/AGENTS.md +12 -0
- package/packages/omo-codex/plugin/components/rules/biome.json +2 -2
- package/packages/omo-codex/plugin/components/rules/dist/cli.js +60 -45
- package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/rules/package.json +7 -7
- package/packages/omo-codex/plugin/components/rules/src/config.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/src/persistent-cache.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/src/post-compact-budget.ts +9 -5
- package/packages/omo-codex/plugin/components/rules/src/rules-engine-factory.ts +1 -4
- package/packages/omo-codex/plugin/components/rules/src/static-injection.ts +4 -9
- package/packages/omo-codex/plugin/components/rules/test/bundled-rules-priority.test.ts +11 -16
- package/packages/omo-codex/plugin/components/rules/test/bundled-rules.test.ts +17 -25
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-budget.test.ts +9 -7
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-context.test.ts +0 -6
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-dedup.test.ts +6 -4
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-directive.test.ts +12 -9
- package/packages/omo-codex/plugin/components/rules/test/codex-hook.test.ts +28 -37
- package/packages/omo-codex/plugin/components/rules/test/dynamic-target-fingerprints.test.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/test/engine.test.ts +7 -4
- package/packages/omo-codex/plugin/components/rules/test/finder.test.ts +2 -3
- package/packages/omo-codex/plugin/components/rules/test/formatter.test.ts +39 -72
- package/packages/omo-codex/plugin/components/rules/test/hephaestus-model-variant.test.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/test/hook-output.test.ts +2 -3
- package/packages/omo-codex/plugin/components/rules/test/matcher.test.ts +2 -3
- package/packages/omo-codex/plugin/components/rules/test/package-smoke.test.ts +1 -1
- package/packages/omo-codex/plugin/components/rules/test/parser.test.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/test/post-compact-budget.test.ts +5 -6
- package/packages/omo-codex/plugin/components/rules/test/rules-engine-consumption.test.ts +3 -6
- package/packages/omo-codex/plugin/components/rules/test/scanner.test.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/test/sources.test.ts +2 -5
- package/packages/omo-codex/plugin/components/rules/test/windows-git-bash-bundled-rule.test.ts +2 -17
- package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/package.json +5 -5
- package/packages/omo-codex/plugin/components/teammode/test/thread-title-hook.test.ts +4 -10
- package/packages/omo-codex/plugin/components/telemetry/AGENTS.md +8 -0
- package/packages/omo-codex/plugin/components/telemetry/biome.json +2 -2
- package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +2463 -437
- package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +2467 -441
- package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/package.json +5 -5
- package/packages/omo-codex/plugin/components/telemetry/src/codex-hook.ts +1 -4
- package/packages/omo-codex/plugin/components/telemetry/src/posthog.ts +4 -14
- package/packages/omo-codex/plugin/components/telemetry/src/product-identity.ts +1 -1
- package/packages/omo-codex/plugin/components/telemetry/test/diagnostics.test.ts +2 -5
- package/packages/omo-codex/plugin/components/ultrawork/AGENTS.md +10 -4
- package/packages/omo-codex/plugin/components/ultrawork/biome.json +2 -2
- package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +489 -4
- package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/package.json +5 -6
- package/packages/omo-codex/plugin/components/ultrawork/scripts/sync-directive.mjs +30 -14
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +6 -7
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +31 -7
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-clear.md +2 -1
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-unclear.md +5 -5
- package/packages/omo-codex/plugin/components/ultrawork/src/directive-content.ts +4 -0
- package/packages/omo-codex/plugin/components/ultrawork/src/directive.ts +5 -2
- package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook-trigger-policy.test.ts +9 -1
- package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +0 -136
- package/packages/omo-codex/plugin/components/ultrawork/test/directive-source.test.ts +14 -8
- package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +12 -1
- package/packages/omo-codex/plugin/components/ultrawork/test/skill-pointer.test.ts +0 -2
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/AGENTS.md +2 -2
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/NOTICE +1 -1
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/README.md +5 -5
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/biome.json +2 -2
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/directive.md +6 -6
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/dist/cli.js +12 -12
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +28 -0
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/package.json +12 -12
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/boulder-reader.ts +1 -1
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/cli.ts +1 -1
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/codex-hook.ts +3 -3
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/directive.ts +1 -1
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/index.ts +1 -1
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/boulder-reader.test.ts +3 -3
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/cli.test.ts +1 -4
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/codex-hook.test.ts +8 -22
- package/packages/omo-codex/plugin/components/ulw-loop/AGENTS.md +19 -0
- package/packages/omo-codex/plugin/components/ulw-loop/CHANGELOG.md +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/README.md +12 -1
- package/packages/omo-codex/plugin/components/ulw-loop/biome.json +2 -2
- package/packages/omo-codex/plugin/components/ulw-loop/directive.md +15 -3
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-codex-validation.d.ts +12 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-codex-validation.js +45 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-continuation.js +9 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-reconciliation.d.ts +15 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-reconciliation.js +15 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-template.d.ts +8 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-template.js +120 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.js +40 -39
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-commands.js +7 -2
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.d.ts +2 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.js +12 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-subcommands.js +2 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +958 -342
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.d.ts +2 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.js +27 -6
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.d.ts +13 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.js +15 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/domain-types.d.ts +17 -9
- package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.js +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.js +17 -2
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-missing-recovery.d.ts +13 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-missing-recovery.js +19 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-aggregate.d.ts +7 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-aggregate.js +9 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-artifacts.d.ts +12 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-artifacts.js +104 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-fields.d.ts +13 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-fields.js +65 -9
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-verdicts.js +5 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.d.ts +4 -2
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.js +69 -111
- package/packages/omo-codex/plugin/components/ulw-loop/dist/review-blockers.js +4 -2
- package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.js +185 -14
- package/packages/omo-codex/plugin/components/ulw-loop/dist/status-next-actions.d.ts +6 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/status-next-actions.js +33 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.js +3 -3
- package/packages/omo-codex/plugin/components/ulw-loop/dist/surface.d.ts +18 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/surface.js +65 -0
- package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +5 -5
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +4 -3
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/define-goal.md +108 -0
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +22 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-codex-validation.ts +81 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-continuation.ts +7 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-reconciliation.ts +31 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-template.ts +134 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint.ts +38 -71
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli-commands.ts +7 -2
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli-output.ts +14 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli-subcommands.ts +2 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli.ts +3 -5
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +34 -5
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-snapshot.ts +26 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-hook.ts +3 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/domain-types.ts +19 -9
- package/packages/omo-codex/plugin/components/ulw-loop/src/paths.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/plan-io.ts +18 -3
- package/packages/omo-codex/plugin/components/ulw-loop/src/plan-missing-recovery.ts +27 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-aggregate.ts +11 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-artifacts.ts +123 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-fields.ts +68 -15
- package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-verdicts.ts +6 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate.ts +82 -131
- package/packages/omo-codex/plugin/components/ulw-loop/src/review-blockers.ts +4 -2
- package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-guard.ts +187 -12
- package/packages/omo-codex/plugin/components/ulw-loop/src/status-next-actions.ts +36 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/stop-resume-hook.ts +3 -3
- package/packages/omo-codex/plugin/components/ulw-loop/src/surface.ts +95 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-continuation.test.ts +0 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-final.test.ts +133 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-template.test.ts +137 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-create-goals.test.ts +25 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-entrypoint.test.ts +26 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-status-next-actions.test.ts +183 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-instruction.test.ts +37 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-snapshot.test.ts +18 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/codex-hook.test.ts +0 -3
- package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/quality-gate-builder.ts +7 -3
- package/packages/omo-codex/plugin/components/ulw-loop/test/guided-recovery.test.ts +105 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +5 -37
- package/packages/omo-codex/plugin/components/ulw-loop/test/paths.test.ts +9 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-aggregate-basics.test.ts +258 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-cap-and-dedupe.test.ts +22 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-poisoning-cascades.test.ts +97 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-roles.test.ts +46 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-senpi-surface.test.ts +131 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-single-report.test.ts +241 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate.test.ts +48 -3
- package/packages/omo-codex/plugin/components/ulw-loop/test/spawn-guard.test.ts +318 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/steering.test.ts +8 -5
- package/packages/omo-codex/plugin/components/ulw-loop/test/stop-resume-hook.test.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/surface.test.ts +74 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/ultrawork-directive.test.ts +13 -8
- package/packages/omo-codex/plugin/components/ulw-loop/vitest.config.ts +1 -0
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-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-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +17 -0
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-checking-ulw-execute-continuation.json +17 -0
- package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/model-catalog.json +3 -3
- package/packages/omo-codex/plugin/package-lock.json +676 -524
- package/packages/omo-codex/plugin/package.json +2 -3
- package/packages/omo-codex/plugin/scripts/AGENTS.md +39 -0
- package/packages/omo-codex/plugin/scripts/auto-update-plan.mjs +1 -2
- package/packages/omo-codex/plugin/scripts/auto-update.mjs +0 -9
- package/packages/omo-codex/plugin/scripts/canonical-ultrawork-directive.mjs +17 -0
- package/packages/omo-codex/plugin/scripts/hook-status-message.mjs +0 -1
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/catalog.mjs +3 -3
- package/packages/omo-codex/plugin/scripts/sync-skills.mjs +42 -31
- package/packages/omo-codex/plugin/shared/package.json +3 -4
- package/packages/omo-codex/plugin/shared/src/config-loader.ts +2 -102
- package/packages/omo-codex/plugin/shared/src/config-migration.ts +0 -1
- package/packages/omo-codex/plugin/shared/test/config-loader.test.ts +41 -130
- package/packages/omo-codex/plugin/skills/ast-grep/AGENTS.md +51 -0
- package/packages/omo-codex/plugin/skills/ast-grep/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/AGENTS.md +62 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/SKILL.md +3 -2
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/all-platforms.md +1 -1
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/senpi.md +4 -4
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/pi_family.py +1 -1
- package/packages/omo-codex/plugin/skills/data-scientist/SKILL.md +99 -239
- package/packages/omo-codex/plugin/skills/data-scientist/references/execution-surfaces.md +91 -0
- package/packages/omo-codex/plugin/skills/data-scientist/references/placement.md +74 -0
- package/packages/omo-codex/plugin/skills/data-scientist/references/polars-lane.md +95 -0
- package/packages/omo-codex/plugin/skills/data-scientist/references/uv-setup.md +1 -1
- package/packages/omo-codex/plugin/skills/data-scientist/references/visualization.md +64 -0
- package/packages/omo-codex/plugin/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
- package/packages/omo-codex/plugin/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
- package/packages/omo-codex/plugin/skills/debugging/SKILL.md +3 -1
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/00-setup.md +12 -0
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/02-investigate.md +21 -0
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/go.md +15 -1
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/native-binary.md +38 -0
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/node.md +25 -0
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/python.md +13 -0
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/rust.md +41 -0
- package/packages/omo-codex/plugin/skills/debugging/references/scripts/dap.mjs +267 -0
- package/packages/omo-codex/plugin/skills/debugging/references/scripts/fixture-adapter.mjs +59 -0
- package/packages/omo-codex/plugin/skills/debugging/references/tools/dap.md +103 -0
- package/packages/omo-codex/plugin/skills/debugging/references/tools/frida.md +193 -0
- package/packages/omo-codex/plugin/skills/frontend/SKILL.md +12 -8
- package/packages/omo-codex/plugin/skills/frontend/references/design/_INDEX.md +1 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/print-paged-media.md +76 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/stylegallery.md +80 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/README.md +1 -1
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-a-direction.md +1 -1
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-b-execution.md +11 -11
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-d-memory.md +3 -3
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/orchestration.md +1 -1
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/routing.md +5 -5
- package/packages/omo-codex/plugin/skills/git-master/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +14 -14
- package/packages/omo-codex/plugin/skills/lcx-doctor/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/lsp-setup/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/programming/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/refactor/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/review-work/SKILL.md +101 -419
- package/packages/omo-codex/plugin/skills/ultimate-browsing/ATTRIBUTION.md +38 -11
- package/packages/omo-codex/plugin/skills/ultimate-browsing/SKILL.md +26 -9
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/AGENTS.md +110 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/package.json +1 -1
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/chrome-stealth.md +23 -18
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/README.md +9 -2
- package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +15 -3
- package/packages/omo-codex/plugin/skills/{start-work → ulw-execute}/SKILL.md +19 -26
- package/packages/omo-codex/plugin/skills/ulw-execute/agents/openai.yaml +2 -0
- package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +4 -3
- package/packages/omo-codex/plugin/skills/ulw-loop/references/define-goal.md +108 -0
- package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +22 -1
- package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +6 -7
- package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +31 -7
- package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-clear.md +2 -1
- package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-unclear.md +5 -5
- package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +8 -3
- package/packages/omo-codex/plugin/skills/visual-qa/AGENTS.md +58 -0
- package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +4 -3
- package/packages/omo-codex/plugin/test/AGENTS.md +47 -0
- package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +19 -173
- package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +9 -48
- package/packages/omo-codex/plugin/test/aggregate-manifest.test.mjs +2 -3
- package/packages/omo-codex/plugin/test/aggregate-mcp.test.mjs +2 -7
- package/packages/omo-codex/plugin/test/aggregate-model-catalog.test.mjs +1 -1
- package/packages/omo-codex/plugin/test/aggregate-plugin-fixture.mjs +175 -13
- package/packages/omo-codex/plugin/test/aggregate.test.mjs +78 -2
- package/packages/omo-codex/plugin/test/auto-update-release-notes.test.mjs +19 -33
- package/packages/omo-codex/plugin/test/auto-update.test.mjs +2 -27
- package/packages/omo-codex/plugin/test/bootstrap-setup.test.mjs +0 -31
- package/packages/omo-codex/plugin/test/canonical-ultrawork-directive.test.mjs +53 -0
- package/packages/omo-codex/plugin/test/component-bin-names.test.mjs +2 -2
- package/packages/omo-codex/plugin/test/component-bundled-cli.test.mjs +1 -51
- package/packages/omo-codex/plugin/test/component-hook-contract-cases.mjs +2 -2
- package/packages/omo-codex/plugin/test/hook-status-message.test.mjs +4 -5
- package/packages/omo-codex/plugin/test/lcx-contribute-bug-fix-template.test.mjs +21 -27
- package/packages/omo-codex/plugin/test/mcp-research-servers.test.mjs +1 -3
- package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +8 -8
- package/packages/omo-codex/plugin/test/scaffold-plan.test.mjs +0 -36
- package/packages/omo-codex/plugin/test/sync-skills-codex-compatibility.test.mjs +101 -0
- package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +24 -14
- package/packages/omo-codex/plugin/test/sync-skills.test.mjs +14 -119
- package/packages/omo-codex/plugin/test/teammode-archive-ambiguity.test.mjs +0 -40
- package/packages/omo-codex/plugin/test/teammode-communication.test.mjs +6 -62
- package/packages/omo-codex/plugin/test/teammode-thread-links.test.mjs +3 -36
- package/packages/omo-codex/plugin/test/teammode-transport.test.mjs +0 -44
- package/packages/omo-codex/plugin/test/teammode-worktree.test.mjs +2 -6
- package/packages/omo-codex/plugin/test/ultrawork-skill-pointer.test.mjs +5 -5
- package/packages/omo-codex/plugin/test/ulw-plan-review-state-contract.test.mjs +0 -3
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +2818 -913
- package/packages/{omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md → prompts-core/prompts/ultrawork/codex.md} +15 -10
- package/packages/shared-skills/package.json +7 -1
- package/packages/shared-skills/skills/ast-grep/AGENTS.md +51 -0
- package/packages/shared-skills/skills/ast-grep/SKILL.md +1 -1
- package/packages/shared-skills/skills/coding-agent-sessions/AGENTS.md +62 -0
- package/packages/shared-skills/skills/coding-agent-sessions/SKILL.md +3 -2
- package/packages/shared-skills/skills/coding-agent-sessions/references/all-platforms.md +1 -1
- package/packages/shared-skills/skills/coding-agent-sessions/references/senpi.md +4 -4
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/pi_family.py +1 -1
- package/packages/shared-skills/skills/data-scientist/SKILL.md +99 -239
- package/packages/shared-skills/skills/data-scientist/references/execution-surfaces.md +91 -0
- package/packages/shared-skills/skills/data-scientist/references/placement.md +74 -0
- package/packages/shared-skills/skills/data-scientist/references/polars-lane.md +95 -0
- package/packages/shared-skills/skills/data-scientist/references/uv-setup.md +1 -1
- package/packages/shared-skills/skills/data-scientist/references/visualization.md +64 -0
- package/packages/shared-skills/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
- package/packages/shared-skills/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
- package/packages/shared-skills/skills/debugging/SKILL.md +3 -1
- package/packages/shared-skills/skills/debugging/references/methodology/00-setup.md +12 -0
- package/packages/shared-skills/skills/debugging/references/methodology/02-investigate.md +21 -0
- package/packages/shared-skills/skills/debugging/references/runtimes/go.md +15 -1
- package/packages/shared-skills/skills/debugging/references/runtimes/native-binary.md +38 -0
- package/packages/shared-skills/skills/debugging/references/runtimes/node.md +25 -0
- package/packages/shared-skills/skills/debugging/references/runtimes/python.md +13 -0
- package/packages/shared-skills/skills/debugging/references/runtimes/rust.md +41 -0
- package/packages/shared-skills/skills/debugging/references/scripts/dap.mjs +267 -0
- package/packages/shared-skills/skills/debugging/references/scripts/dap.test.ts +86 -0
- package/packages/shared-skills/skills/debugging/references/scripts/fixture-adapter.mjs +59 -0
- package/packages/shared-skills/skills/debugging/references/tools/dap.md +103 -0
- package/packages/shared-skills/skills/debugging/references/tools/frida.md +193 -0
- package/packages/shared-skills/skills/frontend/SKILL.md +12 -8
- package/packages/shared-skills/skills/frontend/references/design/_INDEX.md +1 -0
- package/packages/shared-skills/skills/frontend/references/design/print-paged-media.md +76 -0
- package/packages/shared-skills/skills/frontend/references/design/stylegallery.md +80 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/README.md +1 -1
- package/packages/shared-skills/skills/frontend/references/designpowers/lane-a-direction.md +1 -1
- package/packages/shared-skills/skills/frontend/references/designpowers/lane-b-execution.md +11 -11
- package/packages/shared-skills/skills/frontend/references/designpowers/lane-d-memory.md +3 -3
- package/packages/shared-skills/skills/frontend/references/designpowers/orchestration.md +1 -1
- package/packages/shared-skills/skills/frontend/references/designpowers/routing.md +5 -5
- package/packages/shared-skills/skills/git-master/SKILL.md +1 -1
- package/packages/shared-skills/skills/init-deep/SKILL.md +14 -14
- package/packages/shared-skills/skills/lsp-setup/SKILL.md +1 -1
- package/packages/shared-skills/skills/programming/SKILL.md +1 -1
- package/packages/shared-skills/skills/refactor/SKILL.md +1 -1
- package/packages/shared-skills/skills/remove-ai-slops/SKILL.md +1 -1
- package/packages/shared-skills/skills/review-work/SKILL.md +100 -418
- package/packages/shared-skills/skills/ultimate-browsing/ATTRIBUTION.md +38 -11
- package/packages/shared-skills/skills/ultimate-browsing/SKILL.md +26 -9
- package/packages/shared-skills/skills/ultimate-browsing/engine/AGENTS.md +110 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/templates/package.json +1 -1
- package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +23 -18
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/README.md +9 -2
- package/packages/shared-skills/skills/{start-work → ulw-execute}/SKILL.md +17 -16
- package/packages/shared-skills/skills/ulw-plan/SKILL.md +7 -8
- package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +31 -7
- package/packages/shared-skills/skills/ulw-plan/references/intent-clear.md +2 -1
- package/packages/shared-skills/skills/ulw-plan/references/intent-unclear.md +5 -5
- package/packages/shared-skills/skills/ulw-research/SKILL.md +8 -3
- package/packages/shared-skills/skills/visual-qa/AGENTS.md +58 -0
- package/packages/shared-skills/skills/visual-qa/SKILL.md +4 -3
- package/script/qa/web-terminal-visual-qa.mjs +2 -0
- package/script/qa/xterm-live-terminal.mjs +18 -2
- package/packages/lsp-tools-mcp/dist/lsp/cleanup-errors.d.ts +0 -1
- package/packages/lsp-tools-mcp/dist/lsp/constants.d.ts +0 -1
- package/packages/lsp-tools-mcp/dist/lsp/language-mappings.d.ts +0 -1
- package/packages/lsp-tools-mcp/dist/lsp/process-signal-cleanup.d.ts +0 -1
- package/packages/lsp-tools-mcp/dist/missing-dependency-result.d.ts +0 -1
- package/packages/omo-codex/plugin/components/codegraph/AGENTS.md +0 -58
- package/packages/omo-codex/plugin/components/codegraph/NODE-RUNTIME-LICENSES.md +0 -2951
- package/packages/omo-codex/plugin/components/codegraph/NOTICE +0 -16
- package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +0 -12136
- package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +0 -9734
- package/packages/omo-codex/plugin/components/codegraph/package.json +0 -33
- package/packages/omo-codex/plugin/components/codegraph/src/cache-gc.ts +0 -29
- package/packages/omo-codex/plugin/components/codegraph/src/cli.ts +0 -79
- package/packages/omo-codex/plugin/components/codegraph/src/hook-input.ts +0 -33
- package/packages/omo-codex/plugin/components/codegraph/src/hook-sweep.ts +0 -25
- package/packages/omo-codex/plugin/components/codegraph/src/hook-types.ts +0 -131
- package/packages/omo-codex/plugin/components/codegraph/src/hook.ts +0 -258
- package/packages/omo-codex/plugin/components/codegraph/src/mcp-bridge.ts +0 -309
- package/packages/omo-codex/plugin/components/codegraph/src/mcp-unavailable.ts +0 -80
- package/packages/omo-codex/plugin/components/codegraph/src/post-tool-use-hook.ts +0 -34
- package/packages/omo-codex/plugin/components/codegraph/src/serve-invocation.ts +0 -29
- package/packages/omo-codex/plugin/components/codegraph/src/serve.ts +0 -263
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-command.ts +0 -106
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-cooldown.ts +0 -145
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-hook-runtime.ts +0 -21
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-lock.ts +0 -139
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-outcome.ts +0 -15
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-paths.ts +0 -32
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-project.ts +0 -109
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker-result.ts +0 -148
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker.ts +0 -175
- package/packages/omo-codex/plugin/components/codegraph/src/sweep-cli.ts +0 -81
- package/packages/omo-codex/plugin/components/codegraph/test/cache-gc.test.ts +0 -34
- package/packages/omo-codex/plugin/components/codegraph/test/hook-exclusion.test.ts +0 -112
- package/packages/omo-codex/plugin/components/codegraph/test/hook-registration.test.ts +0 -26
- package/packages/omo-codex/plugin/components/codegraph/test/hook-session-start-guard.test.ts +0 -160
- package/packages/omo-codex/plugin/components/codegraph/test/hook-store-upgrade.test.ts +0 -50
- package/packages/omo-codex/plugin/components/codegraph/test/hook-sweep.test.ts +0 -29
- package/packages/omo-codex/plugin/components/codegraph/test/hook.test.ts +0 -320
- package/packages/omo-codex/plugin/components/codegraph/test/mcp-bridge-fixtures.ts +0 -172
- package/packages/omo-codex/plugin/components/codegraph/test/package-runtime.test.ts +0 -91
- package/packages/omo-codex/plugin/components/codegraph/test/provisioned-node-guard.test.ts +0 -100
- package/packages/omo-codex/plugin/components/codegraph/test/serve-built-wrapper.test.ts +0 -76
- package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge-lifecycle.test.ts +0 -133
- package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge.test.ts +0 -245
- package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-facade.test.ts +0 -69
- package/packages/omo-codex/plugin/components/codegraph/test/serve-node-support.test.ts +0 -43
- package/packages/omo-codex/plugin/components/codegraph/test/serve-provision.test.ts +0 -147
- package/packages/omo-codex/plugin/components/codegraph/test/serve-unavailable.test.ts +0 -175
- package/packages/omo-codex/plugin/components/codegraph/test/serve.test.ts +0 -385
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-node-support.test.ts +0 -206
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-project.test.ts +0 -58
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-state.test.ts +0 -104
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-trust-boundary.test.ts +0 -65
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-availability.test.ts +0 -106
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-cooldown.test.ts +0 -116
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-flow.test.ts +0 -258
- package/packages/omo-codex/plugin/components/codegraph/test/sweep-cli.test.ts +0 -56
- package/packages/omo-codex/plugin/components/codegraph/tsconfig.build.json +0 -13
- package/packages/omo-codex/plugin/components/codegraph/tsconfig.json +0 -25
- package/packages/omo-codex/plugin/components/start-work-continuation/LICENSE +0 -21
- package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +0 -28
- package/packages/omo-codex/plugin/components/ultrawork/directive.md +0 -471
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +0 -18
- package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +0 -17
- package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +0 -17
- package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +0 -17
- package/packages/omo-codex/plugin/scripts/migrate-omo-sot/editor.mjs +0 -125
- package/packages/omo-codex/plugin/scripts/migrate-omo-sot/jsonc.mjs +0 -43
- package/packages/omo-codex/plugin/scripts/migrate-omo-sot/scaffold.mjs +0 -29
- package/packages/omo-codex/plugin/scripts/migrate-omo-sot.mjs +0 -121
- package/packages/omo-codex/plugin/skills/data-scientist/references/common-scenarios.md +0 -176
- package/packages/omo-codex/plugin/skills/data-scientist/references/execution-templates.md +0 -197
- package/packages/omo-codex/plugin/skills/data-scientist/references/integration-patterns.md +0 -153
- package/packages/omo-codex/plugin/skills/data-scientist/references/performance-benchmarks.md +0 -37
- package/packages/omo-codex/plugin/skills/start-work/agents/openai.yaml +0 -2
- package/packages/omo-codex/plugin/test/aggregate-skills.test.mjs +0 -92
- package/packages/omo-codex/plugin/test/component-codegraph-mcp-smoke.test.mjs +0 -76
- package/packages/omo-codex/plugin/test/migrate-omo-sot.test.mjs +0 -179
- package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +0 -314
- package/packages/omo-codex/plugin/test/ulw-plan-scope-contract.test.mjs +0 -24
- package/packages/shared-skills/skills/data-scientist/references/common-scenarios.md +0 -176
- package/packages/shared-skills/skills/data-scientist/references/execution-templates.md +0 -197
- package/packages/shared-skills/skills/data-scientist/references/integration-patterns.md +0 -153
- package/packages/shared-skills/skills/data-scientist/references/performance-benchmarks.md +0 -37
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/.gitattributes +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/CHANGELOG.md +0 -0
- /package/packages/omo-codex/plugin/components/{codegraph → ulw-execute-continuation}/LICENSE +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/plan-checklist.ts +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/types.ts +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-completed.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-mixed-platforms.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-single-codex-work.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-all-done.md +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-scaffold.md +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-with-nested-checkboxes.md +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-with-unchecked.md +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/tsconfig.build.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/tsconfig.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/vitest.config.ts +0 -0
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type UlwLoopToolkitSurface } from "./surface.js";
|
|
1
2
|
import type { UlwLoopItem, UlwLoopPlan } from "./types.js";
|
|
2
3
|
export interface CodexCreateGoalPayload {
|
|
3
4
|
readonly objective: string;
|
|
@@ -10,4 +11,5 @@ export declare function buildCodexGoalInstruction(args: {
|
|
|
10
11
|
readonly plan: UlwLoopPlan;
|
|
11
12
|
readonly goal: UlwLoopItem;
|
|
12
13
|
readonly isFinal?: boolean;
|
|
14
|
+
readonly surface?: UlwLoopToolkitSurface;
|
|
13
15
|
}): UlwLoopGoalInstruction;
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
// biome-ignore-all format: long agent-facing instruction strings are intentionally stable.
|
|
2
2
|
import { codexGoalMode, expectedCodexObjective, isEssentialCriterion, isFinalRunCompletionCandidate, } from "./goal-status.js";
|
|
3
|
+
import { resolveToolkitSurface, reviewerRolesFor } from "./surface.js";
|
|
3
4
|
export function buildCodexGoalInstruction(args) {
|
|
4
5
|
const mode = codexGoalMode(args.plan);
|
|
5
6
|
const createGoal = buildCreateGoalPayload(args.plan, args.goal);
|
|
6
7
|
const isFinal = args.isFinal ?? isFinalRunCompletionCandidate(args.plan, args.goal);
|
|
7
|
-
|
|
8
|
+
const surface = args.surface ?? resolveToolkitSurface();
|
|
9
|
+
return { text: buildText(mode, args.plan, args.goal, createGoal, isFinal, surface), json: createGoal };
|
|
8
10
|
}
|
|
9
11
|
function buildCreateGoalPayload(plan, goal) {
|
|
10
12
|
return { objective: expectedCodexObjective(plan, goal) };
|
|
11
13
|
}
|
|
12
|
-
function buildText(mode, plan, goal, createGoal, isFinal) {
|
|
14
|
+
function buildText(mode, plan, goal, createGoal, isFinal, surface) {
|
|
13
15
|
return joinLines([
|
|
14
16
|
mode === "aggregate" ? "UlwLoop aggregate-goal handoff" : "UlwLoop active-goal handoff",
|
|
15
17
|
`Mode: ${mode}`,
|
|
@@ -26,7 +28,7 @@ function buildText(mode, plan, goal, createGoal, isFinal) {
|
|
|
26
28
|
"- Goals are unlimited. Do not add numeric limits.",
|
|
27
29
|
...modeConstraintLines(mode, isFinal),
|
|
28
30
|
...evidenceLayoutLines(plan),
|
|
29
|
-
finalSection(plan, goal, isFinal, mode === "aggregate"),
|
|
31
|
+
finalSection(plan, goal, isFinal, mode === "aggregate", surface),
|
|
30
32
|
...checkpointLines(plan, mode),
|
|
31
33
|
"",
|
|
32
34
|
"create_goal payload:",
|
|
@@ -80,18 +82,21 @@ function evidenceLayoutLines(plan) {
|
|
|
80
82
|
"- 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
83
|
];
|
|
82
84
|
}
|
|
83
|
-
function finalSection(plan, goal, isFinal, aggregate) {
|
|
85
|
+
function finalSection(plan, goal, isFinal, aggregate, surface) {
|
|
86
|
+
const roles = reviewerRolesFor(surface);
|
|
84
87
|
if (!isFinal)
|
|
85
88
|
return "- This is not the final ulw-loop story; do not run the final reviewer/manual-QA/gate-review quality gate yet.";
|
|
86
89
|
const option = sessionOption(plan);
|
|
90
|
+
if (surface === "omo-senpi")
|
|
91
|
+
return senpiFinalSection(plan, goal, aggregate);
|
|
87
92
|
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
93
|
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
94
|
return joinLines([
|
|
90
95
|
"Final story — run mandatory quality gate before update_goal:",
|
|
91
96
|
"- Run targeted verification for changed behavior.",
|
|
92
97
|
"- Confirm every manualQa artifact path exists and has non-zero size.",
|
|
93
|
-
|
|
94
|
-
|
|
98
|
+
`- First spawn ${roles.codeReview} and ${roles.manualQa} in parallel (fork_context: false on the v1 surface; fork_turns: "none" on v2). Include the original brief, goal objectives, desired user-visible outcome, diff, and evidence; wait for BOTH to return and confirm their report artifacts exist on disk (code-review report + manualQa matrix).`,
|
|
99
|
+
`- Only then spawn ${roles.gateReview} (same fork settings), passing those artifact paths.`,
|
|
95
100
|
"- Require clean codeReview, manualQa, gateReview, iteration, and criteriaCoverage. criteriaCoverage must summarize originalIntent, desiredOutcome, and userOutcomeReview; counts alone are not approval.",
|
|
96
101
|
"- On a reviewer REJECT, fix only the cited blockers, rerun the affected verification/Manual-QA, and re-review the delta at most TWICE; if blockers remain, record them and surface to the user.",
|
|
97
102
|
"- If codeQualityStatus is WATCH, include the WATCH notes verbatim in your final user-facing message.",
|
|
@@ -103,6 +108,22 @@ function finalSection(plan, goal, isFinal, aggregate) {
|
|
|
103
108
|
` ${checkpointCommand}`,
|
|
104
109
|
]);
|
|
105
110
|
}
|
|
111
|
+
function senpiFinalSection(plan, goal, aggregate) {
|
|
112
|
+
const option = sessionOption(plan);
|
|
113
|
+
const checkpointCommand = `omo-agent-toolkit ulw-loop checkpoint${option} --goal-id ${goal.id} --status complete --evidence "<manualQa/gateReview evidence>" --codex-goal-json "<fresh complete get_goal JSON or path>" --quality-gate-json "$(omo-agent-toolkit ulw-loop checkpoint${option} --print-template)"`;
|
|
114
|
+
return joinLines([
|
|
115
|
+
"Final story — run the single-reviewer quality gate before update_goal:",
|
|
116
|
+
"- Run manual QA yourself and write the non-empty artifact under currentAttemptDir; set manualQa.by to \"main-session\".",
|
|
117
|
+
'- Spawn exactly one gate reviewer with task(category: "deep").',
|
|
118
|
+
"- If that task fails with any model_unavailable failure, retry with category:unspecified-high, then category:unspecified-low.",
|
|
119
|
+
'- Set gateReview.by to the exact category:<name> literal used for the successful task.',
|
|
120
|
+
'- Build the gate JSON with omo-agent-toolkit ulw-loop checkpoint --print-template, then fill manualQa, gateReview, iteration, and criteriaCoverage.',
|
|
121
|
+
'- Require passed manualQa, approved gateReview, passed iteration, and complete criteriaCoverage before update_goal({status: "complete"}).',
|
|
122
|
+
aggregate
|
|
123
|
+
? `- If the gate is clean, call update_goal({status: "complete"}), call get_goal again, then checkpoint the aggregate story: ${checkpointCommand}`
|
|
124
|
+
: `- If the gate is clean, call update_goal({status: "complete"}), call get_goal again, then checkpoint: ${checkpointCommand}`,
|
|
125
|
+
]);
|
|
126
|
+
}
|
|
106
127
|
function sessionOption(plan) {
|
|
107
128
|
const prefix = ".omo/ulw-loop/";
|
|
108
129
|
const suffix = "/goals.json";
|
|
@@ -24,3 +24,16 @@ export declare function parseCodexGoalSnapshot(value: unknown): CodexGoalSnapsho
|
|
|
24
24
|
export declare function readCodexGoalSnapshotInput(raw: string | undefined, cwd?: string): Promise<CodexGoalSnapshot | null>;
|
|
25
25
|
export declare function reconcileCodexGoalSnapshot(snapshot: CodexGoalSnapshot | null | undefined, options: ReconcileCodexGoalOptions): CodexGoalReconciliation;
|
|
26
26
|
export declare function formatCodexGoalReconciliation(reconciliation: CodexGoalReconciliation): string;
|
|
27
|
+
export interface CodexGoalMismatchRecovery {
|
|
28
|
+
readonly message: string;
|
|
29
|
+
readonly details: {
|
|
30
|
+
readonly expectedObjective: string;
|
|
31
|
+
readonly receivedObjective: string;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* The reconciliation errors normalize whitespace for comparison, which makes the
|
|
36
|
+
* quoted objective unusable as a copy source. Recovery therefore carries the
|
|
37
|
+
* plan's `codexObjective` verbatim so the agent can paste it into `update_goal`.
|
|
38
|
+
*/
|
|
39
|
+
export declare function codexGoalMismatchRecovery(expectedObjective: string, snapshot: CodexGoalSnapshot | null | undefined): CodexGoalMismatchRecovery;
|
|
@@ -31,7 +31,7 @@ export function parseCodexGoalSnapshot(value) {
|
|
|
31
31
|
return { available: false, raw: value };
|
|
32
32
|
}
|
|
33
33
|
const goal = safeObject(goalValue);
|
|
34
|
-
const objective = safeString(goal["objective"] ?? goal["goal"] ?? goal["description"] ?? root["objective"]);
|
|
34
|
+
const objective = safeString(goal["objective"] ?? goal["goal"] ?? goal["description"] ?? goal["title"] ?? root["objective"] ?? root["title"]);
|
|
35
35
|
const status = normalizeStatus(goal["status"] ?? root["status"]);
|
|
36
36
|
return {
|
|
37
37
|
available: Boolean(objective || status !== "unknown"),
|
|
@@ -95,3 +95,17 @@ export function formatCodexGoalReconciliation(reconciliation) {
|
|
|
95
95
|
const parts = [...reconciliation.errors, ...reconciliation.warnings];
|
|
96
96
|
return parts.join(" ");
|
|
97
97
|
}
|
|
98
|
+
/**
|
|
99
|
+
* The reconciliation errors normalize whitespace for comparison, which makes the
|
|
100
|
+
* quoted objective unusable as a copy source. Recovery therefore carries the
|
|
101
|
+
* plan's `codexObjective` verbatim so the agent can paste it into `update_goal`.
|
|
102
|
+
*/
|
|
103
|
+
export function codexGoalMismatchRecovery(expectedObjective, snapshot) {
|
|
104
|
+
const receivedObjective = snapshot?.objective ?? "";
|
|
105
|
+
const message = [
|
|
106
|
+
"Recovery: the Codex goal objective must equal the plan's codexObjective exactly — copy the expected value below into update_goal and re-run get_goal.",
|
|
107
|
+
`expected codexObjective: ${expectedObjective}`,
|
|
108
|
+
`received objective: ${receivedObjective || "(none)"}`,
|
|
109
|
+
].join("\n");
|
|
110
|
+
return { message, details: { expectedObjective, receivedObjective } };
|
|
111
|
+
}
|
|
@@ -89,15 +89,7 @@ export interface UlwLoopManualQaAdversarialCase {
|
|
|
89
89
|
readonly reason?: string;
|
|
90
90
|
readonly artifactRefs: readonly string[];
|
|
91
91
|
}
|
|
92
|
-
|
|
93
|
-
readonly codeReview: {
|
|
94
|
-
readonly by: string;
|
|
95
|
-
readonly recommendation: "APPROVE";
|
|
96
|
-
readonly codeQualityStatus: "CLEAR" | "WATCH";
|
|
97
|
-
readonly reportPath: string;
|
|
98
|
-
readonly evidence: string;
|
|
99
|
-
readonly blockers: readonly [];
|
|
100
|
-
};
|
|
92
|
+
interface UlwLoopQualityGateCommon {
|
|
101
93
|
readonly manualQa: {
|
|
102
94
|
readonly by: string;
|
|
103
95
|
readonly status: "passed";
|
|
@@ -128,6 +120,21 @@ export interface UlwLoopQualityGate {
|
|
|
128
120
|
readonly adversarialClassesCovered: readonly string[];
|
|
129
121
|
};
|
|
130
122
|
}
|
|
123
|
+
export interface UlwLoopQualityGateLazycodex extends UlwLoopQualityGateCommon {
|
|
124
|
+
readonly surface: "lazycodex";
|
|
125
|
+
readonly codeReview: {
|
|
126
|
+
readonly by: string;
|
|
127
|
+
readonly recommendation: "APPROVE";
|
|
128
|
+
readonly codeQualityStatus: "CLEAR" | "WATCH";
|
|
129
|
+
readonly reportPath: string;
|
|
130
|
+
readonly evidence: string;
|
|
131
|
+
readonly blockers: readonly [];
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
export interface UlwLoopQualityGateSenpi extends UlwLoopQualityGateCommon {
|
|
135
|
+
readonly surface: "omo-senpi";
|
|
136
|
+
}
|
|
137
|
+
export type UlwLoopQualityGate = UlwLoopQualityGateLazycodex | UlwLoopQualityGateSenpi;
|
|
131
138
|
export interface UlwLoopLedgerEntry {
|
|
132
139
|
at: string;
|
|
133
140
|
kind: UlwLoopLedgerEventKind;
|
|
@@ -149,3 +156,4 @@ export interface UlwLoopLedgerEntry {
|
|
|
149
156
|
blockerOccurrenceCount?: number;
|
|
150
157
|
requiredExternalDecision?: string;
|
|
151
158
|
}
|
|
159
|
+
export {};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { isAbsolute, join, relative, sep } from "node:path";
|
|
2
2
|
import { ULW_LOOP_BRIEF, ULW_LOOP_DIR, ULW_LOOP_GOALS, ULW_LOOP_LEDGER } from "./types.js";
|
|
3
|
-
const SESSION_ENV_KEYS = ["OMO_ULW_LOOP_SESSION_ID", "CODEX_SESSION_ID", "CODEX_THREAD_ID"];
|
|
3
|
+
const SESSION_ENV_KEYS = ["OMO_ULW_LOOP_SESSION_ID", "CODEX_SESSION_ID", "CODEX_THREAD_ID", "PI_SESSION_ID"];
|
|
4
4
|
export function normalizeUlwLoopSessionId(sessionId) {
|
|
5
5
|
const trimmed = sessionId?.trim();
|
|
6
6
|
if (!trimmed)
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { createReadStream } from "node:fs";
|
|
1
|
+
import { createReadStream, readdirSync } from "node:fs";
|
|
2
2
|
import { appendFile, mkdir, readFile, rename, writeFile } from "node:fs/promises";
|
|
3
3
|
import { createInterface } from "node:readline";
|
|
4
4
|
import { aggregateCodexObjectiveForScope } from "./goal-status.js";
|
|
5
5
|
import { repoRelative, ulwLoopDir, ulwLoopGoalsPath, ulwLoopLedgerPath, ulwLoopRelativeDir, } from "./paths.js";
|
|
6
|
+
import { planMissingRecovery } from "./plan-missing-recovery.js";
|
|
6
7
|
import { iso, ULW_LOOP_DIR, ULW_LOOP_GOALS, ULW_LOOP_LEDGER, UlwLoopError } from "./types.js";
|
|
7
8
|
const LEGACY_OBJECTIVE_PREFIX = `Complete all ulw-loop stories in ${ULW_LOOP_DIR}/${ULW_LOOP_GOALS}: `;
|
|
8
9
|
const LEGACY_OBJECTIVE = `Complete all ulw-loop stories listed in ${ULW_LOOP_DIR}/${ULW_LOOP_GOALS}. Use ${ULW_LOOP_DIR}/${ULW_LOOP_LEDGER} as the durable audit trail.`;
|
|
@@ -47,7 +48,8 @@ export async function readUlwLoopPlan(repoRoot, scope) {
|
|
|
47
48
|
catch (error) {
|
|
48
49
|
if (!hasCode(error, "ENOENT"))
|
|
49
50
|
throw error;
|
|
50
|
-
|
|
51
|
+
const recovery = planMissingRecovery(readSessionDirs(repoRoot));
|
|
52
|
+
throw new UlwLoopError(`No ulw-loop plan found at ${repoRelative(path, repoRoot)}.\n${recovery.message}`, "ULW_LOOP_PLAN_MISSING", { cause: error, ...(recovery.details === undefined ? {} : { details: recovery.details }) });
|
|
51
53
|
}
|
|
52
54
|
const parsed = JSON.parse(raw);
|
|
53
55
|
if (parsed.version !== 1 || !Array.isArray(parsed.goals)) {
|
|
@@ -71,6 +73,19 @@ export async function readUlwLoopPlan(repoRoot, scope) {
|
|
|
71
73
|
}
|
|
72
74
|
return parsed;
|
|
73
75
|
}
|
|
76
|
+
// Session dirs are the only recovery hint that matters when a plan is missing: the
|
|
77
|
+
// caller is almost always scoped to a session whose sibling actually holds the plan.
|
|
78
|
+
function readSessionDirs(repoRoot) {
|
|
79
|
+
try {
|
|
80
|
+
return readdirSync(ulwLoopDir(repoRoot), { withFileTypes: true })
|
|
81
|
+
.filter((entry) => entry.isDirectory())
|
|
82
|
+
.map((entry) => entry.name)
|
|
83
|
+
.sort();
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return [];
|
|
87
|
+
}
|
|
88
|
+
}
|
|
74
89
|
export async function writePlan(repoRoot, plan, scope) {
|
|
75
90
|
await mkdir(ulwLoopDir(repoRoot, scope), { recursive: true });
|
|
76
91
|
const path = ulwLoopGoalsPath(repoRoot, scope);
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare const ULW_LOOP_CREATE_GOALS_COMMAND = "omo-agent-toolkit ulw-loop create-goals --brief \"<brief>\" --json";
|
|
2
|
+
export interface PlanMissingRecovery {
|
|
3
|
+
readonly message: string;
|
|
4
|
+
readonly details?: {
|
|
5
|
+
readonly existingSessionIds: readonly string[];
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* A missing plan is either "never bootstrapped" or "bootstrapped under a different
|
|
10
|
+
* session id"; the recovery text has to answer both without the caller guessing.
|
|
11
|
+
*/
|
|
12
|
+
export declare function planMissingRecovery(existingSessionIds: readonly string[]): PlanMissingRecovery;
|
|
13
|
+
export declare function sessionIdRequiredMessage(flag: string): string;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export const ULW_LOOP_CREATE_GOALS_COMMAND = 'omo-agent-toolkit ulw-loop create-goals --brief "<brief>" --json';
|
|
2
|
+
/**
|
|
3
|
+
* A missing plan is either "never bootstrapped" or "bootstrapped under a different
|
|
4
|
+
* session id"; the recovery text has to answer both without the caller guessing.
|
|
5
|
+
*/
|
|
6
|
+
export function planMissingRecovery(existingSessionIds) {
|
|
7
|
+
const lines = [`Recovery: bootstrap the plan with \`${ULW_LOOP_CREATE_GOALS_COMMAND}\`.`];
|
|
8
|
+
if (existingSessionIds.length === 0)
|
|
9
|
+
return { message: lines.join("\n") };
|
|
10
|
+
lines.push(`Existing ulw-loop session ids under .omo/ulw-loop/: ${existingSessionIds.join(", ")}. Re-run with \`--session-id <id>\` to target one of them.`);
|
|
11
|
+
return { message: lines.join("\n"), details: { existingSessionIds } };
|
|
12
|
+
}
|
|
13
|
+
export function sessionIdRequiredMessage(flag) {
|
|
14
|
+
return [
|
|
15
|
+
`${flag} requires a non-empty value.`,
|
|
16
|
+
"Recovery: subprocess, eval, and hook contexts do not inherit the ulw-loop session env (OMO_ULW_LOOP_SESSION_ID / CODEX_SESSION_ID / CODEX_THREAD_ID / PI_SESSION_ID),",
|
|
17
|
+
`so pass the scope explicitly: \`${flag} <id>\` (for example \`${flag} 01a05b8a-6763-7780-834f-319423b071ce\`).`,
|
|
18
|
+
].join("\n");
|
|
19
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ValidateQualityGateOptions } from "./quality-gate.js";
|
|
2
|
+
/**
|
|
3
|
+
* Compatibility entry point for callers that used the former pre-pass API.
|
|
4
|
+
* Validation is performed by the real parser, which collects defects across
|
|
5
|
+
* every nested field before throwing one aggregate error.
|
|
6
|
+
*/
|
|
7
|
+
export declare function aggregateQualityGateDefects(input: unknown, opts: ValidateQualityGateOptions | undefined): void;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { validateQualityGate } from "./quality-gate.js";
|
|
2
|
+
/**
|
|
3
|
+
* Compatibility entry point for callers that used the former pre-pass API.
|
|
4
|
+
* Validation is performed by the real parser, which collects defects across
|
|
5
|
+
* every nested field before throwing one aggregate error.
|
|
6
|
+
*/
|
|
7
|
+
export function aggregateQualityGateDefects(input, opts) {
|
|
8
|
+
validateQualityGate(input, opts);
|
|
9
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ValidateQualityGateOptions } from "./quality-gate.js";
|
|
2
|
+
import type { UlwLoopManualQaArtifactKind, UlwLoopManualQaArtifactRef, UlwLoopManualQaSurface } from "./types.js";
|
|
3
|
+
export declare const SUPPORTED_SURFACES: readonly UlwLoopManualQaSurface[];
|
|
4
|
+
export declare const SUPPORTED_KINDS: readonly UlwLoopManualQaArtifactKind[];
|
|
5
|
+
export declare function surfaceField(value: unknown, field: string): UlwLoopManualQaSurface;
|
|
6
|
+
export declare function kindField(value: unknown, field: string): UlwLoopManualQaArtifactKind;
|
|
7
|
+
export declare function compatibleKindsFor(surface: UlwLoopManualQaSurface): readonly UlwLoopManualQaArtifactKind[];
|
|
8
|
+
export declare function artifactCompatible(surface: UlwLoopManualQaSurface, kind: UlwLoopManualQaArtifactKind): boolean;
|
|
9
|
+
export declare function checkFile(path: string, field: string, opts?: ValidateQualityGateOptions): void;
|
|
10
|
+
export declare function artifactMap(refs: readonly UlwLoopManualQaArtifactRef[]): Map<string, UlwLoopManualQaArtifactRef>;
|
|
11
|
+
export declare function parseArtifactRefs(value: unknown, opts?: ValidateQualityGateOptions): readonly UlwLoopManualQaArtifactRef[];
|
|
12
|
+
export declare function referencedArtifacts(value: unknown, field: string, byId: ReadonlyMap<string, UlwLoopManualQaArtifactRef>): readonly UlwLoopManualQaArtifactRef[];
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { resolve } from "node:path";
|
|
2
|
+
import { isWithinAttemptDir } from "./paths.js";
|
|
3
|
+
import { invalid, isPoisoned, markPoisonedArtifactKind, section, stringArray, textField, } from "./quality-gate-fields.js";
|
|
4
|
+
export const SUPPORTED_SURFACES = ["cli", "http", "tmux", "browser", "gui", "data"];
|
|
5
|
+
export const SUPPORTED_KINDS = [
|
|
6
|
+
"cli-transcript",
|
|
7
|
+
"log",
|
|
8
|
+
"screenshot",
|
|
9
|
+
"image",
|
|
10
|
+
"http-dump",
|
|
11
|
+
"data-diff",
|
|
12
|
+
];
|
|
13
|
+
const COMPATIBLE_KINDS = {
|
|
14
|
+
cli: ["cli-transcript", "log"],
|
|
15
|
+
tmux: ["cli-transcript", "log"],
|
|
16
|
+
http: ["http-dump"],
|
|
17
|
+
browser: ["screenshot", "image"],
|
|
18
|
+
gui: ["screenshot", "image"],
|
|
19
|
+
data: ["data-diff"],
|
|
20
|
+
};
|
|
21
|
+
function isSupportedSurface(value) {
|
|
22
|
+
return SUPPORTED_SURFACES.some((surface) => surface === value);
|
|
23
|
+
}
|
|
24
|
+
function isSupportedKind(value) {
|
|
25
|
+
return SUPPORTED_KINDS.some((kind) => kind === value);
|
|
26
|
+
}
|
|
27
|
+
export function surfaceField(value, field) {
|
|
28
|
+
if (isSupportedSurface(value))
|
|
29
|
+
return value;
|
|
30
|
+
invalid(`${field} must be a supported manual QA surface (${SUPPORTED_SURFACES.join(", ")}).`, field);
|
|
31
|
+
return "cli";
|
|
32
|
+
}
|
|
33
|
+
export function kindField(value, field) {
|
|
34
|
+
if (isSupportedKind(value))
|
|
35
|
+
return value;
|
|
36
|
+
invalid(`${field} must be a supported artifact kind (${SUPPORTED_KINDS.join(", ")}); review/QA reports belong in codeReview.reportPath or gateReview.reportPath, not artifactRefs.`, field);
|
|
37
|
+
return "log";
|
|
38
|
+
}
|
|
39
|
+
export function compatibleKindsFor(surface) {
|
|
40
|
+
return COMPATIBLE_KINDS[surface];
|
|
41
|
+
}
|
|
42
|
+
export function artifactCompatible(surface, kind) {
|
|
43
|
+
return compatibleKindsFor(surface).includes(kind);
|
|
44
|
+
}
|
|
45
|
+
export function checkFile(path, field, opts) {
|
|
46
|
+
if (opts?.repoRoot === undefined || opts.fs === undefined || isPoisoned(field))
|
|
47
|
+
return;
|
|
48
|
+
const absolute = resolve(opts.repoRoot, path);
|
|
49
|
+
if (!opts.fs.existsSync(absolute)) {
|
|
50
|
+
invalid(`${field} must point to an existing artifact.`, field);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
if (opts.fs.statSync(absolute).size <= 0)
|
|
54
|
+
invalid(`${field} must point to a non-empty artifact.`, field);
|
|
55
|
+
if (opts.currentAttemptDir !== undefined &&
|
|
56
|
+
!isWithinAttemptDir(absolute, resolve(opts.repoRoot, opts.currentAttemptDir)))
|
|
57
|
+
invalid(`${field} (${path}) must point to an artifact from the current attempt (${opts.currentAttemptDir}).`, field);
|
|
58
|
+
}
|
|
59
|
+
export function artifactMap(refs) {
|
|
60
|
+
const byId = new Map();
|
|
61
|
+
for (const ref of refs) {
|
|
62
|
+
if (byId.has(ref.id))
|
|
63
|
+
invalid(`manualQa.artifactRefs contains duplicate ${ref.id}.`, "manualQa.artifactRefs");
|
|
64
|
+
byId.set(ref.id, ref);
|
|
65
|
+
}
|
|
66
|
+
return byId;
|
|
67
|
+
}
|
|
68
|
+
export function parseArtifactRefs(value, opts) {
|
|
69
|
+
if (!Array.isArray(value) || value.length === 0) {
|
|
70
|
+
invalid("manualQa.artifactRefs must not be empty.", "manualQa.artifactRefs");
|
|
71
|
+
return [];
|
|
72
|
+
}
|
|
73
|
+
return value.flatMap((item, index) => {
|
|
74
|
+
const prefix = `manualQa.artifactRefs[${index}]`;
|
|
75
|
+
const ref = section(item, prefix);
|
|
76
|
+
if (isPoisoned(prefix))
|
|
77
|
+
return [];
|
|
78
|
+
const pathField = `${prefix}.path`;
|
|
79
|
+
const idField = `${prefix}.id`;
|
|
80
|
+
const kindFieldName = `${prefix}.kind`;
|
|
81
|
+
const descriptionField = `${prefix}.description`;
|
|
82
|
+
const path = textField(ref["path"], pathField);
|
|
83
|
+
const id = textField(ref["id"], idField);
|
|
84
|
+
const kind = kindField(ref["kind"], kindFieldName);
|
|
85
|
+
if (isPoisoned(kindFieldName))
|
|
86
|
+
markPoisonedArtifactKind(id);
|
|
87
|
+
const description = textField(ref["description"], descriptionField);
|
|
88
|
+
checkFile(path, pathField, opts);
|
|
89
|
+
return [{ id, kind, description, path }];
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
export function referencedArtifacts(value, field, byId) {
|
|
93
|
+
const ids = stringArray(value, field);
|
|
94
|
+
if (isPoisoned(field))
|
|
95
|
+
return [];
|
|
96
|
+
return ids.flatMap((id) => {
|
|
97
|
+
const artifact = byId.get(id);
|
|
98
|
+
if (artifact === undefined) {
|
|
99
|
+
invalid(`${field} references unknown artifact ${id}.`, field);
|
|
100
|
+
return [];
|
|
101
|
+
}
|
|
102
|
+
return [artifact];
|
|
103
|
+
});
|
|
104
|
+
}
|
|
@@ -1,4 +1,15 @@
|
|
|
1
|
-
|
|
1
|
+
type QualityGateDefect = {
|
|
2
|
+
readonly field: string;
|
|
3
|
+
readonly message: string;
|
|
4
|
+
};
|
|
5
|
+
/** A recorded defect poisons only its field; consumers skip dependent checks while preserving valid siblings and entry identity. */
|
|
6
|
+
export declare function withQualityGateCollector<T>(operation: () => T): T;
|
|
7
|
+
export declare function throwQualityGateDefects(defects: readonly QualityGateDefect[]): never;
|
|
8
|
+
export declare function invalid(message: string, field: string): undefined;
|
|
9
|
+
export declare function isPoisoned(field: string): boolean;
|
|
10
|
+
export declare function poisonField(field: string): void;
|
|
11
|
+
export declare function markPoisonedArtifactKind(id: string): void;
|
|
12
|
+
export declare function isPoisonedArtifactKind(id: string): boolean;
|
|
2
13
|
export declare function isRecord(value: unknown): value is Record<string, unknown>;
|
|
3
14
|
export declare function section(value: unknown, field: string): Record<string, unknown>;
|
|
4
15
|
export declare function textField(value: unknown, field: string): string;
|
|
@@ -6,3 +17,4 @@ export declare function numberField(value: unknown, field: string): number;
|
|
|
6
17
|
export declare function stringArray(value: unknown, field: string): readonly string[];
|
|
7
18
|
export declare function emptyBlockers(value: unknown, field: string): readonly [];
|
|
8
19
|
export declare function literal<T extends string | boolean>(value: unknown, expected: T, field: string): T;
|
|
20
|
+
export {};
|
|
@@ -1,39 +1,95 @@
|
|
|
1
1
|
import { UlwLoopError } from "./types.js";
|
|
2
|
-
const PLACEHOLDER_PATTERN = /^(
|
|
2
|
+
const PLACEHOLDER_PATTERN = /^(?:<replace:[^>]+>|placeholder|todo|tbd|n\/a|stub)$/i;
|
|
3
|
+
let activeCollector;
|
|
4
|
+
/** A recorded defect poisons only its field; consumers skip dependent checks while preserving valid siblings and entry identity. */
|
|
5
|
+
export function withQualityGateCollector(operation) {
|
|
6
|
+
const previous = activeCollector;
|
|
7
|
+
const collector = { defects: [], poisonedFields: new Set(), poisonedArtifactKinds: new Set() };
|
|
8
|
+
activeCollector = collector;
|
|
9
|
+
try {
|
|
10
|
+
const result = operation();
|
|
11
|
+
if (collector.defects.length === 0)
|
|
12
|
+
return result;
|
|
13
|
+
throwQualityGateDefects(collector.defects);
|
|
14
|
+
}
|
|
15
|
+
finally {
|
|
16
|
+
activeCollector = previous;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export function throwQualityGateDefects(defects) {
|
|
20
|
+
const uniqueDefects = [
|
|
21
|
+
...new Map(defects.map((defect) => [`${defect.field}\u0000${defect.message}`, defect])).values(),
|
|
22
|
+
];
|
|
23
|
+
const fields = uniqueDefects.slice(0, 25);
|
|
24
|
+
const truncated = uniqueDefects.length > fields.length;
|
|
25
|
+
const message = [
|
|
26
|
+
`Final quality gate has ${fields.length}${truncated ? "+" : ""} validation defects:`,
|
|
27
|
+
...fields.map((item) => `- ${item.field}: ${item.message}`),
|
|
28
|
+
].join("\n");
|
|
29
|
+
throw new UlwLoopError(message, "ULW_LOOP_QUALITY_GATE_INVALID", {
|
|
30
|
+
details: { field: fields[0]?.field, fields, ...(truncated ? { truncated: true } : {}) },
|
|
31
|
+
});
|
|
32
|
+
}
|
|
3
33
|
export function invalid(message, field) {
|
|
4
|
-
|
|
34
|
+
if (activeCollector === undefined)
|
|
35
|
+
throw new UlwLoopError(message, "ULW_LOOP_QUALITY_GATE_INVALID", { details: { field } });
|
|
36
|
+
activeCollector.defects.push({ field, message });
|
|
37
|
+
activeCollector.poisonedFields.add(field);
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
export function isPoisoned(field) {
|
|
41
|
+
return activeCollector?.poisonedFields.has(field) ?? false;
|
|
42
|
+
}
|
|
43
|
+
export function poisonField(field) {
|
|
44
|
+
activeCollector?.poisonedFields.add(field);
|
|
45
|
+
}
|
|
46
|
+
export function markPoisonedArtifactKind(id) {
|
|
47
|
+
activeCollector?.poisonedArtifactKinds.add(id);
|
|
48
|
+
}
|
|
49
|
+
export function isPoisonedArtifactKind(id) {
|
|
50
|
+
return activeCollector?.poisonedArtifactKinds.has(id) ?? false;
|
|
5
51
|
}
|
|
6
52
|
export function isRecord(value) {
|
|
7
53
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
8
54
|
}
|
|
9
55
|
export function section(value, field) {
|
|
10
|
-
|
|
56
|
+
if (isRecord(value))
|
|
57
|
+
return value;
|
|
58
|
+
invalid(`Final quality gate is missing ${field} evidence.`, field);
|
|
59
|
+
return {};
|
|
11
60
|
}
|
|
12
61
|
export function textField(value, field) {
|
|
13
|
-
if (typeof value !== "string" || value.trim() === "")
|
|
62
|
+
if (typeof value !== "string" || value.trim() === "") {
|
|
14
63
|
invalid(`Final quality gate requires non-empty ${field}.`, field);
|
|
64
|
+
return "";
|
|
65
|
+
}
|
|
15
66
|
const trimmed = value.trim();
|
|
16
67
|
if (PLACEHOLDER_PATTERN.test(trimmed))
|
|
17
68
|
invalid(`Final quality gate rejects placeholder ${field}.`, field);
|
|
18
69
|
return trimmed;
|
|
19
70
|
}
|
|
20
71
|
export function numberField(value, field) {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
72
|
+
if (typeof value === "number" && Number.isFinite(value))
|
|
73
|
+
return value;
|
|
74
|
+
invalid(`Final quality gate requires numeric ${field}.`, field);
|
|
75
|
+
return 0;
|
|
24
76
|
}
|
|
25
77
|
export function stringArray(value, field) {
|
|
26
|
-
if (!Array.isArray(value) || value.length === 0)
|
|
27
|
-
|
|
78
|
+
if (!Array.isArray(value) || value.length === 0) {
|
|
79
|
+
invalid(`Final quality gate requires ${field}.`, field);
|
|
80
|
+
return [];
|
|
81
|
+
}
|
|
28
82
|
return value.map((item) => textField(item, field));
|
|
29
83
|
}
|
|
30
84
|
export function emptyBlockers(value, field) {
|
|
31
85
|
if (Array.isArray(value) && value.length === 0)
|
|
32
86
|
return [];
|
|
33
87
|
invalid(`${field} must be empty.`, field);
|
|
88
|
+
return [];
|
|
34
89
|
}
|
|
35
90
|
export function literal(value, expected, field) {
|
|
36
91
|
if (value === expected)
|
|
37
92
|
return expected;
|
|
38
93
|
invalid(`${field} must be ${String(expected)}.`, field);
|
|
94
|
+
return expected;
|
|
39
95
|
}
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import { invalid, literal, textField } from "./quality-gate-fields.js";
|
|
2
2
|
export function passedVerdict(value, field) {
|
|
3
|
-
if (value === "not_applicable")
|
|
3
|
+
if (value === "not_applicable") {
|
|
4
4
|
invalid(`${field} must not be not_applicable.`, field);
|
|
5
|
+
return "passed";
|
|
6
|
+
}
|
|
5
7
|
return literal(value, "passed", field);
|
|
6
8
|
}
|
|
7
9
|
export function codeQualityStatusField(value, field) {
|
|
8
10
|
if (value === "CLEAR" || value === "WATCH")
|
|
9
11
|
return value;
|
|
10
12
|
invalid(`${field} must be CLEAR or WATCH.`, field);
|
|
13
|
+
return "CLEAR";
|
|
11
14
|
}
|
|
12
15
|
export function adversarialVerdict(row, field) {
|
|
13
16
|
const value = row["verdict"];
|
|
@@ -17,4 +20,5 @@ export function adversarialVerdict(row, field) {
|
|
|
17
20
|
return { verdict: "not_applicable", reason: textField(row["reason"], `${field}.reason`) };
|
|
18
21
|
}
|
|
19
22
|
invalid(`${field} must be passed or not_applicable with a reason.`, field);
|
|
23
|
+
return { verdict: "passed" };
|
|
20
24
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type UlwLoopToolkitSurface } from "./surface.js";
|
|
1
2
|
import type { UlwLoopQualityGate } from "./types.js";
|
|
2
3
|
export { classifyExternalAuthorizationBlocker, clearGoalBlockerFields, normalizeBlockerEvidence, sameBlockerOccurrences, } from "./quality-gate-blockers.js";
|
|
3
4
|
export interface QualityGateFs {
|
|
@@ -7,8 +8,9 @@ export interface QualityGateFs {
|
|
|
7
8
|
};
|
|
8
9
|
}
|
|
9
10
|
export interface ValidateQualityGateOptions {
|
|
10
|
-
readonly repoRoot
|
|
11
|
-
readonly fs
|
|
11
|
+
readonly repoRoot?: string;
|
|
12
|
+
readonly fs?: QualityGateFs;
|
|
12
13
|
readonly currentAttemptDir?: string;
|
|
14
|
+
readonly reviewerSurface?: UlwLoopToolkitSurface;
|
|
13
15
|
}
|
|
14
16
|
export declare function validateQualityGate(input: unknown, opts?: ValidateQualityGateOptions): UlwLoopQualityGate;
|