lazycodex-ai 5.0.0-beta.3 → 5.0.0-beta.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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 +22572 -20322
- package/dist/cli/install-codex/install-codex-test-fixtures.d.ts +1 -1
- package/dist/cli/run/on-complete-hook.d.ts +2 -0
- package/dist/cli/runtime-commands.d.ts +1 -1
- package/dist/cli/worktree-sweep/classify.d.ts +16 -0
- package/dist/cli/worktree-sweep/format.d.ts +8 -0
- package/dist/cli/worktree-sweep/git.d.ts +19 -0
- package/dist/cli/worktree-sweep/index.d.ts +7 -0
- package/dist/cli/worktree-sweep/options.d.ts +2 -0
- package/dist/cli/worktree-sweep/parse-worktree-list.d.ts +8 -0
- package/dist/cli/worktree-sweep/sweep.d.ts +2 -0
- package/dist/cli/worktree-sweep/types.d.ts +65 -0
- package/dist/cli/worktree-sweep/worktree-sweep.d.ts +2 -0
- package/dist/cli-node/index.js +22190 -19917
- package/package.json +11 -7
- package/packages/git-bash-mcp/dist/cli.js +5 -1
- package/packages/lsp-daemon/dist/cli.js +645 -296
- package/packages/lsp-daemon/dist/client.d.ts +10 -0
- package/packages/lsp-daemon/dist/client.js +605 -253
- package/packages/lsp-daemon/dist/daemon-client.d.ts +1 -0
- package/packages/lsp-daemon/dist/daemon-client.js +3 -0
- package/packages/lsp-daemon/dist/ensure-daemon.js +1 -0
- package/packages/lsp-daemon/dist/index.js +609 -262
- package/packages/lsp-daemon/dist/version-reap.js +1 -1
- package/packages/lsp-daemon/package.json +1 -1
- package/packages/lsp-tools-mcp/dist/cli.js +564 -217
- package/packages/lsp-tools-mcp/dist/lsp/manager.js +115 -92
- package/packages/lsp-tools-mcp/dist/mcp.js +566 -219
- package/packages/lsp-tools-mcp/dist/request-context.js +12 -13
- package/packages/lsp-tools-mcp/dist/tools.js +571 -227
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +4 -4
- package/packages/omo-codex/plugin/AGENTS.md +47 -0
- package/packages/omo-codex/plugin/README.md +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +34 -33
- package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/src/hook.ts +1 -0
- package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +293 -116
- package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +245 -84
- package/packages/omo-codex/plugin/components/codegraph/package.json +4 -4
- package/packages/omo-codex/plugin/components/codegraph/src/mcp-bridge.ts +1 -0
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-hook-runtime.ts +1 -0
- package/packages/omo-codex/plugin/components/comment-checker/AGENTS.md +9 -0
- package/packages/omo-codex/plugin/components/comment-checker/biome.json +2 -2
- package/packages/omo-codex/plugin/components/comment-checker/dist/cli.js +2 -1
- package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/package.json +5 -5
- package/packages/omo-codex/plugin/components/comment-checker/src/apply-patch.ts +2 -8
- package/packages/omo-codex/plugin/components/comment-checker/src/core.ts +1 -2
- package/packages/omo-codex/plugin/components/comment-checker/src/request-extractor.ts +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/src/runner.ts +1 -0
- package/packages/omo-codex/plugin/components/git-bash/AGENTS.md +1 -1
- package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/git-bash/package.json +3 -4
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/biome.json +2 -2
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/cli.js +1 -5
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/codex-hook.js +1 -5
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +5 -5
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/src/codex-hook.ts +1 -5
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/codex-hook.test.ts +4 -21
- package/packages/omo-codex/plugin/components/lsp/AGENTS.md +30 -15
- package/packages/omo-codex/plugin/components/lsp/biome.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +4 -4
- package/packages/omo-codex/plugin/components/lsp/dist/cli.js +596 -267
- package/packages/omo-codex/plugin/components/lsp/dist/daemon-cli-path.js +1 -1
- package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/package.json +5 -5
- package/packages/omo-codex/plugin/components/lsp/src/cli.ts +1 -1
- package/packages/omo-codex/plugin/components/lsp/src/codex-hook.ts +1 -1
- package/packages/omo-codex/plugin/components/lsp/src/daemon-cli-path.ts +1 -5
- package/packages/omo-codex/plugin/components/lsp/test/codex-hook-unavailable.test.ts +6 -7
- package/packages/omo-codex/plugin/components/lsp/test/codex-hook.test.ts +1 -2
- package/packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts +11 -1
- package/packages/omo-codex/plugin/components/rules/AGENTS.md +12 -0
- package/packages/omo-codex/plugin/components/rules/biome.json +2 -2
- package/packages/omo-codex/plugin/components/rules/dist/cli.js +60 -45
- package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/rules/package.json +7 -7
- package/packages/omo-codex/plugin/components/rules/src/config.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/src/persistent-cache.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/src/post-compact-budget.ts +9 -5
- package/packages/omo-codex/plugin/components/rules/src/rules-engine-factory.ts +1 -4
- package/packages/omo-codex/plugin/components/rules/src/static-injection.ts +4 -9
- package/packages/omo-codex/plugin/components/rules/test/bundled-rules-priority.test.ts +11 -16
- package/packages/omo-codex/plugin/components/rules/test/bundled-rules.test.ts +17 -25
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-budget.test.ts +9 -7
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-context.test.ts +0 -6
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-dedup.test.ts +6 -4
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-directive.test.ts +12 -9
- package/packages/omo-codex/plugin/components/rules/test/codex-hook.test.ts +28 -37
- package/packages/omo-codex/plugin/components/rules/test/dynamic-target-fingerprints.test.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/test/engine.test.ts +7 -4
- package/packages/omo-codex/plugin/components/rules/test/finder.test.ts +2 -3
- package/packages/omo-codex/plugin/components/rules/test/formatter.test.ts +39 -72
- package/packages/omo-codex/plugin/components/rules/test/hephaestus-model-variant.test.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/test/hook-output.test.ts +2 -3
- package/packages/omo-codex/plugin/components/rules/test/matcher.test.ts +2 -3
- package/packages/omo-codex/plugin/components/rules/test/package-smoke.test.ts +1 -1
- package/packages/omo-codex/plugin/components/rules/test/parser.test.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/test/post-compact-budget.test.ts +5 -6
- package/packages/omo-codex/plugin/components/rules/test/rules-engine-consumption.test.ts +3 -6
- package/packages/omo-codex/plugin/components/rules/test/scanner.test.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/test/sources.test.ts +2 -5
- package/packages/omo-codex/plugin/components/rules/test/windows-git-bash-bundled-rule.test.ts +2 -17
- package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/package.json +5 -5
- package/packages/omo-codex/plugin/components/teammode/test/thread-title-hook.test.ts +3 -9
- package/packages/omo-codex/plugin/components/telemetry/AGENTS.md +8 -0
- package/packages/omo-codex/plugin/components/telemetry/biome.json +2 -2
- package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +2463 -437
- package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +2467 -441
- package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/package.json +5 -5
- package/packages/omo-codex/plugin/components/telemetry/src/codex-hook.ts +1 -4
- package/packages/omo-codex/plugin/components/telemetry/src/posthog.ts +4 -14
- package/packages/omo-codex/plugin/components/telemetry/src/product-identity.ts +1 -1
- package/packages/omo-codex/plugin/components/telemetry/test/diagnostics.test.ts +2 -5
- package/packages/omo-codex/plugin/components/ultrawork/AGENTS.md +5 -0
- package/packages/omo-codex/plugin/components/ultrawork/biome.json +2 -2
- package/packages/omo-codex/plugin/components/ultrawork/directive.md +13 -1
- package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/package.json +5 -5
- package/packages/omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md +13 -1
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +6 -6
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +31 -7
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-clear.md +2 -1
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-unclear.md +5 -5
- package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook-trigger-policy.test.ts +9 -1
- package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +0 -136
- package/packages/omo-codex/plugin/components/ultrawork/test/skill-pointer.test.ts +0 -2
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/AGENTS.md +5 -4
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/NOTICE +1 -1
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/README.md +5 -5
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/biome.json +2 -2
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/directive.md +6 -6
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/dist/cli.js +12 -12
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +28 -0
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/package.json +12 -12
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/boulder-reader.ts +1 -1
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/cli.ts +1 -1
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/codex-hook.ts +3 -3
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/directive.ts +1 -1
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/index.ts +1 -1
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/boulder-reader.test.ts +3 -3
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/cli.test.ts +1 -4
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/codex-hook.test.ts +8 -22
- package/packages/omo-codex/plugin/components/ulw-loop/AGENTS.md +16 -0
- package/packages/omo-codex/plugin/components/ulw-loop/CHANGELOG.md +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/biome.json +2 -2
- package/packages/omo-codex/plugin/components/ulw-loop/directive.md +13 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-commands.js +5 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.d.ts +2 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.js +11 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +24 -14
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.js +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.js +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.js +3 -3
- package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +5 -5
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +3 -2
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/define-goal.md +108 -0
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli-commands.ts +5 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli-output.ts +13 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli.ts +3 -5
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-snapshot.ts +3 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-hook.ts +3 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/paths.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/stop-resume-hook.ts +3 -3
- package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-continuation.test.ts +0 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-create-goals.test.ts +25 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-entrypoint.test.ts +26 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-instruction.test.ts +2 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-snapshot.test.ts +18 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/codex-hook.test.ts +0 -3
- package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +5 -37
- package/packages/omo-codex/plugin/components/ulw-loop/test/paths.test.ts +9 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/steering.test.ts +8 -5
- package/packages/omo-codex/plugin/components/ulw-loop/test/stop-resume-hook.test.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/ultrawork-directive.test.ts +4 -5
- package/packages/omo-codex/plugin/components/ulw-loop/vitest.config.ts +1 -0
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +17 -0
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-checking-ulw-execute-continuation.json +17 -0
- package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/model-catalog.json +3 -3
- package/packages/omo-codex/plugin/package-lock.json +681 -395
- package/packages/omo-codex/plugin/package.json +2 -2
- package/packages/omo-codex/plugin/scripts/AGENTS.md +40 -0
- package/packages/omo-codex/plugin/scripts/auto-update-plan.mjs +1 -1
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/catalog.mjs +3 -3
- package/packages/omo-codex/plugin/scripts/sync-skills.mjs +11 -11
- package/packages/omo-codex/plugin/shared/package.json +3 -4
- package/packages/omo-codex/plugin/skills/ast-grep/AGENTS.md +51 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/AGENTS.md +62 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/SKILL.md +3 -2
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/all-platforms.md +1 -1
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/senpi.md +4 -4
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/pi_family.py +1 -1
- package/packages/omo-codex/plugin/skills/data-scientist/SKILL.md +99 -239
- package/packages/omo-codex/plugin/skills/data-scientist/references/execution-surfaces.md +91 -0
- package/packages/omo-codex/plugin/skills/data-scientist/references/placement.md +74 -0
- package/packages/omo-codex/plugin/skills/data-scientist/references/polars-lane.md +95 -0
- package/packages/omo-codex/plugin/skills/data-scientist/references/uv-setup.md +1 -1
- package/packages/omo-codex/plugin/skills/data-scientist/references/visualization.md +64 -0
- package/packages/omo-codex/plugin/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
- package/packages/omo-codex/plugin/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
- package/packages/omo-codex/plugin/skills/debugging/SKILL.md +2 -0
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/00-setup.md +12 -0
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/02-investigate.md +21 -0
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/go.md +15 -1
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/native-binary.md +38 -0
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/node.md +25 -0
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/python.md +13 -0
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/rust.md +41 -0
- package/packages/omo-codex/plugin/skills/debugging/references/scripts/dap.mjs +267 -0
- package/packages/omo-codex/plugin/skills/debugging/references/scripts/fixture-adapter.mjs +59 -0
- package/packages/omo-codex/plugin/skills/debugging/references/tools/dap.md +103 -0
- package/packages/omo-codex/plugin/skills/debugging/references/tools/frida.md +193 -0
- package/packages/omo-codex/plugin/skills/frontend/SKILL.md +11 -7
- package/packages/omo-codex/plugin/skills/frontend/references/design/_INDEX.md +1 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/print-paged-media.md +76 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/stylegallery.md +80 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/README.md +1 -1
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-a-direction.md +1 -1
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-b-execution.md +11 -11
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-d-memory.md +3 -3
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/orchestration.md +1 -1
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/routing.md +5 -5
- package/packages/omo-codex/plugin/skills/review-work/SKILL.md +4 -4
- package/packages/omo-codex/plugin/skills/ultimate-browsing/ATTRIBUTION.md +37 -10
- package/packages/omo-codex/plugin/skills/ultimate-browsing/SKILL.md +2 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/AGENTS.md +179 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/package.json +1 -1
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/chrome-stealth.md +13 -11
- package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +13 -1
- package/packages/omo-codex/plugin/skills/{start-work → ulw-execute}/SKILL.md +12 -11
- package/packages/omo-codex/plugin/skills/ulw-execute/agents/openai.yaml +2 -0
- package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +3 -2
- package/packages/omo-codex/plugin/skills/ulw-loop/references/define-goal.md +108 -0
- package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +1 -0
- package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +6 -6
- package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +31 -7
- package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-clear.md +2 -1
- package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-unclear.md +5 -5
- package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +4 -2
- package/packages/omo-codex/plugin/skills/visual-qa/AGENTS.md +58 -0
- package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +3 -2
- package/packages/omo-codex/plugin/test/AGENTS.md +47 -0
- package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +19 -173
- package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +8 -28
- package/packages/omo-codex/plugin/test/aggregate-manifest.test.mjs +1 -1
- package/packages/omo-codex/plugin/test/aggregate-model-catalog.test.mjs +1 -1
- package/packages/omo-codex/plugin/test/aggregate-plugin-fixture.mjs +175 -13
- package/packages/omo-codex/plugin/test/aggregate.test.mjs +78 -2
- package/packages/omo-codex/plugin/test/auto-update-release-notes.test.mjs +19 -33
- package/packages/omo-codex/plugin/test/auto-update.test.mjs +2 -2
- package/packages/omo-codex/plugin/test/component-bin-names.test.mjs +2 -2
- package/packages/omo-codex/plugin/test/component-bundled-cli.test.mjs +1 -1
- package/packages/omo-codex/plugin/test/component-hook-contract-cases.mjs +2 -2
- package/packages/omo-codex/plugin/test/hook-status-message.test.mjs +4 -4
- package/packages/omo-codex/plugin/test/lcx-contribute-bug-fix-template.test.mjs +21 -27
- package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +8 -8
- package/packages/omo-codex/plugin/test/scaffold-plan.test.mjs +0 -36
- package/packages/omo-codex/plugin/test/sync-skills-codex-compatibility.test.mjs +101 -0
- package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +12 -12
- package/packages/omo-codex/plugin/test/sync-skills.test.mjs +1 -119
- package/packages/omo-codex/plugin/test/teammode-archive-ambiguity.test.mjs +0 -40
- package/packages/omo-codex/plugin/test/teammode-communication.test.mjs +6 -62
- package/packages/omo-codex/plugin/test/teammode-thread-links.test.mjs +3 -36
- package/packages/omo-codex/plugin/test/teammode-transport.test.mjs +0 -44
- package/packages/omo-codex/plugin/test/teammode-worktree.test.mjs +2 -6
- package/packages/omo-codex/plugin/test/ultrawork-skill-pointer.test.mjs +0 -3
- package/packages/omo-codex/plugin/test/ulw-plan-review-state-contract.test.mjs +0 -3
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +2637 -549
- package/packages/shared-skills/skills/ast-grep/AGENTS.md +51 -0
- package/packages/shared-skills/skills/coding-agent-sessions/AGENTS.md +62 -0
- package/packages/shared-skills/skills/coding-agent-sessions/SKILL.md +3 -2
- package/packages/shared-skills/skills/coding-agent-sessions/references/all-platforms.md +1 -1
- package/packages/shared-skills/skills/coding-agent-sessions/references/senpi.md +4 -4
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/pi_family.py +1 -1
- package/packages/shared-skills/skills/data-scientist/SKILL.md +99 -239
- package/packages/shared-skills/skills/data-scientist/references/execution-surfaces.md +91 -0
- package/packages/shared-skills/skills/data-scientist/references/placement.md +74 -0
- package/packages/shared-skills/skills/data-scientist/references/polars-lane.md +95 -0
- package/packages/shared-skills/skills/data-scientist/references/uv-setup.md +1 -1
- package/packages/shared-skills/skills/data-scientist/references/visualization.md +64 -0
- package/packages/shared-skills/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
- package/packages/shared-skills/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
- package/packages/shared-skills/skills/debugging/SKILL.md +2 -0
- package/packages/shared-skills/skills/debugging/references/methodology/00-setup.md +12 -0
- package/packages/shared-skills/skills/debugging/references/methodology/02-investigate.md +21 -0
- package/packages/shared-skills/skills/debugging/references/runtimes/go.md +15 -1
- package/packages/shared-skills/skills/debugging/references/runtimes/native-binary.md +38 -0
- package/packages/shared-skills/skills/debugging/references/runtimes/node.md +25 -0
- package/packages/shared-skills/skills/debugging/references/runtimes/python.md +13 -0
- package/packages/shared-skills/skills/debugging/references/runtimes/rust.md +41 -0
- package/packages/shared-skills/skills/debugging/references/scripts/dap.mjs +267 -0
- package/packages/shared-skills/skills/debugging/references/scripts/dap.test.ts +86 -0
- package/packages/shared-skills/skills/debugging/references/scripts/fixture-adapter.mjs +59 -0
- package/packages/shared-skills/skills/debugging/references/tools/dap.md +103 -0
- package/packages/shared-skills/skills/debugging/references/tools/frida.md +193 -0
- package/packages/shared-skills/skills/frontend/SKILL.md +11 -7
- package/packages/shared-skills/skills/frontend/references/design/_INDEX.md +1 -0
- package/packages/shared-skills/skills/frontend/references/design/print-paged-media.md +76 -0
- package/packages/shared-skills/skills/frontend/references/design/stylegallery.md +80 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/README.md +1 -1
- package/packages/shared-skills/skills/frontend/references/designpowers/lane-a-direction.md +1 -1
- package/packages/shared-skills/skills/frontend/references/designpowers/lane-b-execution.md +11 -11
- package/packages/shared-skills/skills/frontend/references/designpowers/lane-d-memory.md +3 -3
- package/packages/shared-skills/skills/frontend/references/designpowers/orchestration.md +1 -1
- package/packages/shared-skills/skills/frontend/references/designpowers/routing.md +5 -5
- package/packages/shared-skills/skills/review-work/SKILL.md +3 -3
- package/packages/shared-skills/skills/ultimate-browsing/ATTRIBUTION.md +37 -10
- package/packages/shared-skills/skills/ultimate-browsing/SKILL.md +2 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/AGENTS.md +179 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/templates/package.json +1 -1
- package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +13 -11
- package/packages/shared-skills/skills/{start-work → ulw-execute}/SKILL.md +9 -8
- package/packages/shared-skills/skills/ulw-plan/SKILL.md +6 -6
- package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +31 -7
- package/packages/shared-skills/skills/ulw-plan/references/intent-clear.md +2 -1
- package/packages/shared-skills/skills/ulw-plan/references/intent-unclear.md +5 -5
- package/packages/shared-skills/skills/ulw-research/SKILL.md +4 -2
- package/packages/shared-skills/skills/visual-qa/AGENTS.md +58 -0
- package/packages/shared-skills/skills/visual-qa/SKILL.md +3 -2
- package/script/qa/web-terminal-visual-qa.mjs +2 -0
- package/script/qa/xterm-live-terminal.mjs +18 -2
- package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +0 -28
- package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +0 -17
- package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +0 -17
- package/packages/omo-codex/plugin/skills/data-scientist/references/common-scenarios.md +0 -176
- package/packages/omo-codex/plugin/skills/data-scientist/references/execution-templates.md +0 -197
- package/packages/omo-codex/plugin/skills/data-scientist/references/integration-patterns.md +0 -153
- package/packages/omo-codex/plugin/skills/data-scientist/references/performance-benchmarks.md +0 -37
- package/packages/omo-codex/plugin/skills/start-work/agents/openai.yaml +0 -2
- package/packages/omo-codex/plugin/test/aggregate-skills.test.mjs +0 -92
- package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +0 -314
- package/packages/omo-codex/plugin/test/ulw-plan-scope-contract.test.mjs +0 -24
- package/packages/shared-skills/skills/data-scientist/references/common-scenarios.md +0 -176
- package/packages/shared-skills/skills/data-scientist/references/execution-templates.md +0 -197
- package/packages/shared-skills/skills/data-scientist/references/integration-patterns.md +0 -153
- package/packages/shared-skills/skills/data-scientist/references/performance-benchmarks.md +0 -37
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/.gitattributes +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/CHANGELOG.md +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/LICENSE +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/plan-checklist.ts +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/types.ts +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-completed.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-mixed-platforms.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-single-codex-work.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-all-done.md +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-scaffold.md +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-with-nested-checkboxes.md +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-with-unchecked.md +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/tsconfig.build.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/tsconfig.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/vitest.config.ts +0 -0
|
@@ -7,7 +7,7 @@ metadata:
|
|
|
7
7
|
|
|
8
8
|
# ulw-plan - UNCLEAR intent
|
|
9
9
|
|
|
10
|
-
Read this when INTENT ROUTING resolved to UNCLEAR: the desired OUTCOME is fuzzy - a vague request, a bootstrap, `$
|
|
10
|
+
Read this when INTENT ROUTING resolved to UNCLEAR: the desired OUTCOME is fuzzy - a vague request, a bootstrap, `$ulw-execute` with no selectable plan, or a goal the user cannot yet articulate. Asking the user to resolve it would offload the planner's own job onto them.
|
|
11
11
|
|
|
12
12
|
<stance>
|
|
13
13
|
PRIME DIRECTIVE: do NOT interrogate the user. Resolve ambiguity by RESEARCH, not questions. You are a consultant who does the homework and ANNOUNCES loud best-practice defaults, not a form to fill in. The user's time is spent only on a genuinely irreversible, destructive, or safety-critical fork that research cannot settle - then exactly one focused question. Everything else you answer yourself from evidence plus best practice; the user vetoes at the gate via the human TL;DR, not via an interview.
|
|
@@ -20,19 +20,19 @@ TOPOLOGY LOCK still applies: enumerate the 1-6 independently-succeed/fail compon
|
|
|
20
20
|
</research_protocol>
|
|
21
21
|
|
|
22
22
|
<default_selection>
|
|
23
|
-
For each open decision, adopt the defensible best-practice default (industry standard or repo convention), RECORD it in the draft's Open-assumptions ledger with rationale and reversibility, and proceed. NO numeric scoring - the ledger IS the audit trail. The ONLY default escalated to a single focused question is one that is irreversible, destructive, or safety-critical and research cannot settle.
|
|
23
|
+
For each open decision - including the extrinsic axes the sweep names (budget, mandated stack, expected scale, target audience / compliance) - adopt the defensible best-practice default (industry standard or repo convention), RECORD it in the draft's Open-assumptions ledger with rationale and reversibility, and proceed. NO numeric scoring - the ledger IS the audit trail. The ONLY default escalated to a single focused question is one that is irreversible, destructive, or safety-critical, or commits real spend the user never authorized, and research cannot settle.
|
|
24
24
|
|
|
25
25
|
Fold a contrarian self-grill into the Metis spawn: challenge the single highest-leverage adopted assumption - is this constraint real or habitual; does any adopted default add complexity the request never asked for? - and return concrete reframes. The grill targets incidental complexity (unneeded abstraction, speculative capacity), NEVER the feature set: reducing, phasing, or deferring part of the request is not a reframe. Fold a reframe into the plan only as a recommended default plus rationale, never as a forced change.
|
|
26
26
|
</default_selection>
|
|
27
27
|
|
|
28
28
|
<high_accuracy_auto>
|
|
29
|
-
Because the human did not steer, adversarial review SUBSTITUTES for the interview you skipped - this is what catches a bad default. Metis runs during plan generation as always; after Metis findings are folded and the plan file is complete, run the dual high-accuracy review defined in `full-workflow.md` AUTOMATICALLY - no "do you want a review?" question - and resubmit fresh
|
|
29
|
+
Because the human did not steer, adversarial review SUBSTITUTES for the interview you skipped - this is what catches a bad default. Metis runs during plan generation as always; after Metis findings are folded and the plan file is complete, run the dual high-accuracy review defined in `full-workflow.md` AUTOMATICALLY - no "do you want a review?" question - and drive it to convergence under the bounded convergence contract in `full-workflow.md`: fix every eligible blocker and resubmit fresh, record ineligible findings as non-blocking notes, and on cap exhaustion stop and ask the user.
|
|
30
30
|
|
|
31
31
|
TRIVIAL-TIER GUARD: if Classify sized the work Trivial, the auto-Momus loop is SUPPRESSED (Metis still runs once) - a vague-but-tiny request ("clean this up") must not trigger the full adversarial loop. UNCLEAR raises the research-plus-default posture; it does not override the Trivial cost guard for Momus.
|
|
32
32
|
</high_accuracy_auto>
|
|
33
33
|
|
|
34
34
|
<approval_gate>
|
|
35
|
-
Still present a brief and wait for the user's explicit okay - approval is not execution - but the brief LEADS with "here is the best-practice approach I derived and the assumptions I adopted (with reversibility)", not "here are questions for you". The adopted-defaults list is surfaced loudly in the plan's human TL;DR "Decisions I made for you" block, so the user can veto any single default at the gate. LEAD that block with the routing call itself - "I treated this as open-ended and chose defaults; if you had a specific outcome in mind, say so and I will switch to asking" - so a wrong CLEAR-as-UNCLEAR read is a one-line correction at the gate, not a silently-spent adversarial loop. Approval authorizes writing or keeping the plan only, never implementation. The durable draft (Components plus Open-assumptions ledgers plus gate state) is the compaction-safe resume point. ($
|
|
35
|
+
Still present a brief and wait for the user's explicit okay - approval is not execution - but the brief LEADS with "here is the best-practice approach I derived and the assumptions I adopted (with reversibility)", not "here are questions for you". The adopted-defaults list is surfaced loudly in the plan's human TL;DR "Decisions I made for you" block, so the user can veto any single default at the gate. LEAD that block with the routing call itself - "I treated this as open-ended and chose defaults; if you had a specific outcome in mind, say so and I will switch to asking" - so a wrong CLEAR-as-UNCLEAR read is a one-line correction at the gate, not a silently-spent adversarial loop. Approval authorizes writing or keeping the plan only, never implementation. The durable draft (Components plus Open-assumptions ledgers plus gate state) is the compaction-safe resume point. ($ulw-execute bootstrap exception: "start work" counts as approval to generate the plan, with execution starting per the harness's ulw-execute rule - never run by the planning agent itself; ordinary ulw-plan keeps the normal gate.)
|
|
36
36
|
</approval_gate>
|
|
37
37
|
|
|
38
38
|
<worked_example>
|
|
@@ -40,5 +40,5 @@ Request: "make auth better".
|
|
|
40
40
|
1. Research waves -> current auth at `src/auth/*` and evidence for the requested improvement; best-practice baselines via librarian.
|
|
41
41
|
2. Topology lock as an ANNOUNCEMENT, not a question: components refine the evidenced auth intent in full, such as session hardening, brute-force protection, and password policy when the repository supports them. MFA is an adjacent capability and stays in Scope OUT unless the user asks for it or evidence establishes it as part of the requested outcome.
|
|
42
42
|
3. Adopted-defaults table (assumption | default | rationale | reversible?): bcrypt rounds 8 -> 12 (reversible), add 5/min-per-IP login limit (reversible), rotate session id on privilege change (reversible).
|
|
43
|
-
4. Metis folded -> auto dual review (fix
|
|
43
|
+
4. Metis folded -> auto dual review (fix eligible gaps under the bounded convergence contract) -> brief LEADING with the approach and the defaults, surfaced in the human TL;DR for veto.
|
|
44
44
|
</worked_example>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ulw-research
|
|
3
|
-
description: "Maximum-saturation research orchestration: ALWAYS proposes the final materials first (PDF+DOCX default), then parallel explore+librarian swarms across codebase, web, official docs, and OSS repos — max-roster teammode when the harness has it — with live journaling, a recursive EXPAND loop driven by leads workers return in message text, empirical verification by running code, and a cited synthesis with charts/Mermaid/assets behind a mandatory visual-QA gate. ACTIVATES ONLY on an explicit user demand for research — the word 'ulw-research'
|
|
3
|
+
description: "Maximum-saturation research orchestration: ALWAYS proposes the final materials first (PDF+DOCX default), then parallel explore+librarian swarms across codebase, web, official docs, and OSS repos — max-roster teammode when the harness has it — with live journaling, a recursive EXPAND loop driven by leads workers return in message text, empirical verification by running code, and a cited synthesis with charts/Mermaid/assets behind a mandatory visual-QA gate. ACTIVATES ONLY on an explicit user demand for research — the word 'ulw-research' in any prefix form, any 'ulw' research wording including combined invocations like 'mass ulw research', 'ultradebate' or 'hyperdebate' research requests, or an explicit request for research / deep research / an ultra-precise investigation, in any language. Never self-activates for ordinary questions, debugging, or implementation context-gathering. While active it overrides exploration-bounding defaults: exhaustive coverage is the goal."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
## Codex Harness Tool Compatibility
|
|
@@ -161,7 +161,9 @@ Record the answer in the journal; Phase 5 opens by turning it into `design-spec.
|
|
|
161
161
|
|
|
162
162
|
## Phase 1 — Saturation wave
|
|
163
163
|
|
|
164
|
-
|
|
164
|
+
**When the user asked for MASS research, the wave is sized by the topic's angles, not by the roster ceiling.** "mass ulw research", "mulw research", "ulw mass research" — in any language — order over-collection that a team of 8 cannot produce. Where the harness has a dependency-graph surface (the `mass-ulw` skill and its `references/planning.md`), run collection through it instead: a 60+ node opening wave covering every angle the topic has, routed across the whole difficulty ladder in one graph — mechanical sweeps and per-item harvest batches on the cheapest tier, judgment-shaped angles a step up, cross-territory angles a step above that, and the deepest tier reserved for genuinely hairy contradictions. Each wave's EXPAND leads define the next wave's nodes, and the synthesis reduces through several parallel architect-tier nodes into ONE architect-tier reducer (the strongest reasoning tier substitutes wherever no architect tier exists). Absent that surface, hold the same shape with background workers in batched waves. Everything else in this skill still binds: the format gate, the journal, the claim graph, the convergence rules, and the delivery gates.
|
|
165
|
+
|
|
166
|
+
Otherwise launch the entire first wave in one turn — every axis at once, as team members if you formed a team, else as background workers. Sequential launches and "start with one and see" defeat the mode.
|
|
165
167
|
|
|
166
168
|
Scaling floor — more angles always justify more workers:
|
|
167
169
|
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# visual-qa — Bundled Visual-Evidence CLI
|
|
2
|
+
|
|
3
|
+
**Generated:** 2026-08-24 (f3642fcda)
|
|
4
|
+
|
|
5
|
+
## OVERVIEW
|
|
6
|
+
|
|
7
|
+
The visual-QA skill's executable core: a zero-dependency Node CLI that produces machine evidence (`image-diff`, `tui-check`) plus the TypeScript sources it is bundled from. Earned this file: the only shared skill shipping a built bundle whose runtime and development sources must be kept in lockstep.
|
|
8
|
+
|
|
9
|
+
## STRUCTURE
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
visual-qa/
|
|
13
|
+
├── SKILL.md # reviewer workflow (dual oracle, evidence gates) — the prose contract
|
|
14
|
+
├── references/agent-browser-setup.md
|
|
15
|
+
└── scripts/
|
|
16
|
+
├── visual-qa.mjs # SHIPPED RUNTIME: bun-build bundle of cli.ts (+ embedded modules)
|
|
17
|
+
├── cli.ts # development source; dispatches image-diff / tui-check
|
|
18
|
+
├── image-diff.ts # diffImages — 8x8 grid cells, hotspots, rounded metrics
|
|
19
|
+
├── tui-grid.ts # checkTui — column overflow + border alignment verdicts
|
|
20
|
+
├── east-asian-width.ts # charWidth / stringWidth — CJK-aware width math
|
|
21
|
+
├── ansi.ts # ANSI escape stripping (width must be escape-aware)
|
|
22
|
+
├── png-decode.ts / png-crc.ts / png-synth.ts # stdlib PNG codec (no deps)
|
|
23
|
+
├── types.ts
|
|
24
|
+
└── *.test.ts # co-located bun tests for every module above
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## BUNDLE/SOURCE DUALITY
|
|
28
|
+
|
|
29
|
+
`visual-qa.mjs` is the artifact the skill's commands invoke (`node "$SKILL_DIR/scripts/visual-qa.mjs" …`); the `.ts` files exist for development and tests only. A behavior fix lands in the TS source AND the bundle is regenerated from `cli.ts` — editing one without the other makes tests and runtime disagree. Never hand-edit the `.mjs`.
|
|
30
|
+
|
|
31
|
+
## SURFACE
|
|
32
|
+
|
|
33
|
+
- Commands: `image-diff <reference.png> <actual.png>` and `tui-check <capture.txt> --cols <N>`; JSON verdict output (hotspot cells, overflow lines, wide-char columns, border alignment).
|
|
34
|
+
- Module exports: `diffImages`, `checkTui`, `charWidth`/`stringWidth`, ANSI + PNG helpers. `cli.ts` owns `CliError`, `parseColumns`, `run`, `main`.
|
|
35
|
+
|
|
36
|
+
## CONVENTIONS
|
|
37
|
+
|
|
38
|
+
- Zero runtime dependencies — PNG decode/synthesis and ANSI handling are hand-rolled in `scripts/`; keep it that way (the bundle must stay require-free apart from `node:` builtins).
|
|
39
|
+
- Width is never `String.length`: CJK wide characters and ANSI escapes are accounted for before any column math.
|
|
40
|
+
- Tests are co-located `bun test scripts/*.test.ts`, given/when/then style per repo convention.
|
|
41
|
+
|
|
42
|
+
## ANTI-PATTERNS
|
|
43
|
+
|
|
44
|
+
- NEVER hand-edit `visual-qa.mjs`; regenerate from source.
|
|
45
|
+
- Don't add an npm dependency to make PNG/diff easier — the no-dep bundle is the point.
|
|
46
|
+
- Column math that ignores CJK width or ANSI escapes is wrong by construction; `tui-check` exists because text-diff tools get terminal grids wrong.
|
|
47
|
+
- Skill-level rule worth repeating for code changes: `tmux capture-pane` is forbidden as a capture mechanism.
|
|
48
|
+
|
|
49
|
+
## COMMANDS
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
# from packages/shared-skills/skills/visual-qa/
|
|
53
|
+
node scripts/visual-qa.mjs image-diff <reference.png> <actual.png>
|
|
54
|
+
node scripts/visual-qa.mjs tui-check <capture.txt> --cols 80
|
|
55
|
+
bun test scripts/*.test.ts
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
- Parent: [`packages/shared-skills/AGENTS.md`](../../AGENTS.md).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: visual-qa
|
|
3
|
-
description: "MUST USE after building/changing any UI or when asked whether a page, component, or TUI looks right. Rigorous visual QA across web/page and
|
|
3
|
+
description: "MUST USE after building/changing any UI or when asked whether a page, component, or TUI looks right. Rigorous visual QA across web/page, terminal, and paginated-document surfaces. Prefer browser:control-in-app-browser for unauthenticated browser/page QA in Codex, then Playwright/agent-browser/dev-browser. Captures screenshot/TUI evidence with bundled diff scripts, runs design-system/functional and visual-fidelity/CJK reviewer passes, then synthesizes a good/bad verdict. Triggers: visual QA, screenshot/pixel diff, UI looks wrong, reference fidelity, design system check, responsive check, CJK text clipping, TUI alignment, box-drawing drift, PDF page check, deck review, blank or near-empty page, wrong page break."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Visual QA - Dual-Oracle Web and TUI Verification
|
|
@@ -9,7 +9,7 @@ Verify a rendered UI against intent using objective script evidence plus two par
|
|
|
9
9
|
|
|
10
10
|
## Purpose and when to use
|
|
11
11
|
|
|
12
|
-
- Use after you build or change any UI, before calling it done. Covers web/page UIs
|
|
12
|
+
- Use after you build or change any UI, before calling it done. Covers web/page UIs, TUI/terminal UIs, and paginated documents.
|
|
13
13
|
- Use when output must match a mock, a baseline, or a stated design intent; when you suspect a regression; when CJK (Korean/Japanese/Chinese) text may clip, misalign, or wrap awkwardly; when a claimed design system might actually be a flat image; when a terminal layout may overflow or its borders may break.
|
|
14
14
|
- Skip when there is no rendered surface (pure backend or library logic with no visual or terminal output). For broad post-implementation review use review-work; this skill is the visual specialist.
|
|
15
15
|
|
|
@@ -19,6 +19,7 @@ In the commands below, `$SKILL_DIR` is this skill's own directory (the folder co
|
|
|
19
19
|
|
|
20
20
|
- Web/page UI: renders in a browser (HTML/CSS/JS, components, canvas, SVG). Evidence is screenshots.
|
|
21
21
|
- TUI/terminal UI: renders as text in a terminal (box-drawing, panes, status lines, REPL/TUI apps). Evidence is terminal captures.
|
|
22
|
+
- Paginated document: renders as ordered pages (PDF report, printed HTML, exported deck). Evidence is every page rendered to an image - `pdftoppm -png -r 150 <file>.pdf <prefix>` or the pipeline's own renderer. Extracted text is not evidence here: layout is exactly what extraction discards, so a stranded block, a split table, or a near-empty page survives a clean text check.
|
|
22
23
|
- Reference-fidelity UI: any web/page UI built from a concrete reference packet, including screenshots, generated Imagen/Stitch mockups, Figma exports, overview text, annotations, or source-site captures. Evidence is the full reference packet plus same-size actual captures.
|
|
23
24
|
|
|
24
25
|
If the change touches both, run both capture tracks and feed both into the passes.
|
|
@@ -30,6 +30,8 @@ Inputs:
|
|
|
30
30
|
--from-file <path> Render an existing raw terminal byte stream through xterm.js (replay; no interaction).
|
|
31
31
|
--input <token> Scripted interaction, repeatable, applied in order THROUGH the browser terminal.
|
|
32
32
|
Literal text is typed; {Enter} {Tab} {Escape} {ArrowDown} {Ctrl+C} etc. are pressed as keys.
|
|
33
|
+
{WheelUp} and {WheelDown} send real browser mouse-wheel input over the xterm viewport.
|
|
34
|
+
{CtrlSlashByte} and {Ctrl7Byte} send their shared exact terminal control byte.
|
|
33
35
|
--cwd <path> Working directory for --command. Default: current directory.
|
|
34
36
|
--cols <n> / --rows <n> Terminal geometry. Default: 120 x 32.
|
|
35
37
|
--dwell-ms <n> Milliseconds to let the TUI settle after input before capture. Default: 1500.
|
|
@@ -80,10 +80,26 @@ const NAMED_KEYS = new Set([
|
|
|
80
80
|
// An `input` token wrapped in {Braces} is pressed as a named key; anything else
|
|
81
81
|
// is typed literally. Both flow through the browser terminal (xterm onData ->
|
|
82
82
|
// pty), so the interaction is genuinely driven in the web terminal.
|
|
83
|
-
async function driveInput(page, inputs, keyDelayMs) {
|
|
83
|
+
export async function driveInput(page, inputs, keyDelayMs) {
|
|
84
84
|
for (const raw of inputs) {
|
|
85
85
|
const match = /^\{(.+)\}$/.exec(raw);
|
|
86
|
-
if (
|
|
86
|
+
if (
|
|
87
|
+
match?.[1] === "CtrlSlashByte" ||
|
|
88
|
+
match?.[1] === "Ctrl7Byte"
|
|
89
|
+
) {
|
|
90
|
+
await page.evaluate((data) => window.__ptyInput(data), "\u001f");
|
|
91
|
+
} else if (match && /^(WheelUp|WheelDown)$/.test(match[1])) {
|
|
92
|
+
const terminal = await page.$(".xterm-screen");
|
|
93
|
+
const bounds = await terminal?.boundingBox();
|
|
94
|
+
if (!bounds) throw new Error("xterm viewport unavailable for wheel input");
|
|
95
|
+
await page.mouse.move(
|
|
96
|
+
bounds.x + bounds.width / 2,
|
|
97
|
+
bounds.y + bounds.height / 2,
|
|
98
|
+
);
|
|
99
|
+
await page.mouse.wheel({
|
|
100
|
+
deltaY: match[1] === "WheelDown" ? 720 : -720,
|
|
101
|
+
});
|
|
102
|
+
} else if (match && NAMED_KEYS.has(match[1])) {
|
|
87
103
|
await page.keyboard.press(match[1] === "Space" ? " " : match[1], { delay: 15 });
|
|
88
104
|
} else if (match && /^Ctrl\+(.)$/i.test(match[1])) {
|
|
89
105
|
const key = /^Ctrl\+(.)$/i.exec(match[1])[1];
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"hooks": {
|
|
3
|
-
"Stop": [
|
|
4
|
-
{
|
|
5
|
-
"hooks": [
|
|
6
|
-
{
|
|
7
|
-
"type": "command",
|
|
8
|
-
"command": "node \"${PLUGIN_ROOT}/components/start-work-continuation/dist/cli.js\" hook stop",
|
|
9
|
-
"timeout": 10,
|
|
10
|
-
"statusMessage": "(OmO 5.0.0-beta.3) Checking Start-Work Continuation"
|
|
11
|
-
}
|
|
12
|
-
]
|
|
13
|
-
}
|
|
14
|
-
],
|
|
15
|
-
"SubagentStop": [
|
|
16
|
-
{
|
|
17
|
-
"hooks": [
|
|
18
|
-
{
|
|
19
|
-
"type": "command",
|
|
20
|
-
"command": "node \"${PLUGIN_ROOT}/components/start-work-continuation/dist/cli.js\" hook subagent-stop",
|
|
21
|
-
"timeout": 10,
|
|
22
|
-
"statusMessage": "(OmO 5.0.0-beta.3) Checking Start-Work Continuation"
|
|
23
|
-
}
|
|
24
|
-
]
|
|
25
|
-
}
|
|
26
|
-
]
|
|
27
|
-
}
|
|
28
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"hooks": {
|
|
3
|
-
"Stop": [
|
|
4
|
-
{
|
|
5
|
-
"hooks": [
|
|
6
|
-
{
|
|
7
|
-
"type": "command",
|
|
8
|
-
"command": "node \"${PLUGIN_ROOT}/components/start-work-continuation/dist/cli.js\" hook stop",
|
|
9
|
-
"timeout": 10,
|
|
10
|
-
"statusMessage": "(OmO 5.0.0-beta.3) Checking Start-Work Continuation",
|
|
11
|
-
"commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\start-work-continuation\\dist\\cli.js\" hook stop"
|
|
12
|
-
}
|
|
13
|
-
]
|
|
14
|
-
}
|
|
15
|
-
]
|
|
16
|
-
}
|
|
17
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"hooks": {
|
|
3
|
-
"SubagentStop": [
|
|
4
|
-
{
|
|
5
|
-
"hooks": [
|
|
6
|
-
{
|
|
7
|
-
"type": "command",
|
|
8
|
-
"command": "node \"${PLUGIN_ROOT}/components/start-work-continuation/dist/cli.js\" hook subagent-stop",
|
|
9
|
-
"timeout": 10,
|
|
10
|
-
"statusMessage": "(OmO 5.0.0-beta.3) Checking Start-Work Continuation",
|
|
11
|
-
"commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\start-work-continuation\\dist\\cli.js\" hook subagent-stop"
|
|
12
|
-
}
|
|
13
|
-
]
|
|
14
|
-
}
|
|
15
|
-
]
|
|
16
|
-
}
|
|
17
|
-
}
|
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
# Common Scenarios with Tool Selection
|
|
2
|
-
|
|
3
|
-
## Scenario 1: Simple Calculation
|
|
4
|
-
|
|
5
|
-
**Decision: Python (always)**
|
|
6
|
-
|
|
7
|
-
```python
|
|
8
|
-
uv run --with numpy python -c "
|
|
9
|
-
import numpy as np
|
|
10
|
-
result = np.sum([1, 2, 3, 4, 5])
|
|
11
|
-
print(f'Result: {result}')
|
|
12
|
-
"
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
## Scenario 2: CSV Quick Analysis
|
|
16
|
-
|
|
17
|
-
**Decision: DuckDB (direct query, no memory load)**
|
|
18
|
-
|
|
19
|
-
```python
|
|
20
|
-
uv run --with numpy --with duckdb python -c "
|
|
21
|
-
import duckdb
|
|
22
|
-
result = duckdb.sql('''
|
|
23
|
-
SELECT * FROM 'data.csv'
|
|
24
|
-
LIMIT 10
|
|
25
|
-
''').pl()
|
|
26
|
-
print(result)
|
|
27
|
-
"
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
## Scenario 3: Filter + Sort on Large Dataset
|
|
31
|
-
|
|
32
|
-
**Decision: Polars (128x faster filtering, 12x faster sorting)**
|
|
33
|
-
|
|
34
|
-
```python
|
|
35
|
-
uv run --with numpy --with polars python -c "
|
|
36
|
-
import polars as pl
|
|
37
|
-
result = (
|
|
38
|
-
pl.scan_csv('large.csv')
|
|
39
|
-
.filter(pl.col('value') > 1000)
|
|
40
|
-
.sort('value', descending=True)
|
|
41
|
-
.head(100)
|
|
42
|
-
.collect()
|
|
43
|
-
)
|
|
44
|
-
print(result)
|
|
45
|
-
"
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
## Scenario 4: Multi-Table Join + Aggregation
|
|
49
|
-
|
|
50
|
-
**Decision: DuckDB (best for joins and aggregations)**
|
|
51
|
-
|
|
52
|
-
```python
|
|
53
|
-
uv run --with numpy --with duckdb python -c "
|
|
54
|
-
import duckdb
|
|
55
|
-
result = duckdb.sql('''
|
|
56
|
-
SELECT
|
|
57
|
-
a.category,
|
|
58
|
-
COUNT(*) as count,
|
|
59
|
-
SUM(b.amount) as total
|
|
60
|
-
FROM 'table1.csv' a
|
|
61
|
-
JOIN 'table2.csv' b ON a.id = b.id
|
|
62
|
-
GROUP BY a.category
|
|
63
|
-
ORDER BY total DESC
|
|
64
|
-
''').pl()
|
|
65
|
-
print(result)
|
|
66
|
-
"
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
## Scenario 5: Data Exploration
|
|
70
|
-
|
|
71
|
-
**Decision: DuckDB for quick exploration**
|
|
72
|
-
|
|
73
|
-
```python
|
|
74
|
-
uv run --with numpy --with duckdb python -c "
|
|
75
|
-
import duckdb
|
|
76
|
-
|
|
77
|
-
# Show first few rows
|
|
78
|
-
print('**Sample Data**')
|
|
79
|
-
print(duckdb.sql('SELECT * FROM \"data.csv\" LIMIT 5').pl())
|
|
80
|
-
|
|
81
|
-
# Show summary statistics
|
|
82
|
-
print('\\n**Summary Statistics**')
|
|
83
|
-
print(duckdb.sql('DESCRIBE SELECT * FROM \"data.csv\"').pl())
|
|
84
|
-
|
|
85
|
-
# Show row count
|
|
86
|
-
print('\\n**Row Count**')
|
|
87
|
-
print(duckdb.sql('SELECT COUNT(*) as total_rows FROM \"data.csv\"').pl())
|
|
88
|
-
"
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
## Scenario 6: Time-Series Analysis
|
|
92
|
-
|
|
93
|
-
**Decision: DuckDB for aggregation + matplotlib for visualization**
|
|
94
|
-
|
|
95
|
-
```python
|
|
96
|
-
uv run --with numpy --with duckdb --with pyarrow --with matplotlib python -c "
|
|
97
|
-
import duckdb
|
|
98
|
-
import matplotlib.pyplot as plt
|
|
99
|
-
|
|
100
|
-
# Aggregate by date
|
|
101
|
-
result = duckdb.sql('''
|
|
102
|
-
SELECT
|
|
103
|
-
DATE_TRUNC('day', timestamp) as date,
|
|
104
|
-
COUNT(*) as count,
|
|
105
|
-
AVG(value) as avg_value
|
|
106
|
-
FROM 'timeseries.csv'
|
|
107
|
-
GROUP BY date
|
|
108
|
-
ORDER BY date
|
|
109
|
-
''').pl()
|
|
110
|
-
|
|
111
|
-
# Plot
|
|
112
|
-
plt.figure(figsize=(12, 6))
|
|
113
|
-
plt.subplot(2, 1, 1)
|
|
114
|
-
plt.plot(result['date'], result['count'])
|
|
115
|
-
plt.title('Daily Count')
|
|
116
|
-
|
|
117
|
-
plt.subplot(2, 1, 2)
|
|
118
|
-
plt.plot(result['date'], result['avg_value'])
|
|
119
|
-
plt.title('Daily Average Value')
|
|
120
|
-
|
|
121
|
-
plt.tight_layout()
|
|
122
|
-
plt.savefig('timeseries.png')
|
|
123
|
-
print('Saved to timeseries.png')
|
|
124
|
-
"
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
## Scenario 7: Complex Transformation
|
|
128
|
-
|
|
129
|
-
**Decision: Polars for efficient transformations**
|
|
130
|
-
|
|
131
|
-
```python
|
|
132
|
-
uv run --with numpy --with polars python -c "
|
|
133
|
-
import polars as pl
|
|
134
|
-
|
|
135
|
-
result = (
|
|
136
|
-
pl.scan_csv('data.csv')
|
|
137
|
-
.with_columns([
|
|
138
|
-
# Create new calculated columns
|
|
139
|
-
(pl.col('price') * pl.col('quantity')).alias('total'),
|
|
140
|
-
pl.col('date').str.strptime(pl.Date, '%Y-%m-%d').alias('parsed_date'),
|
|
141
|
-
pl.col('name').str.to_uppercase().alias('upper_name'),
|
|
142
|
-
])
|
|
143
|
-
.filter(pl.col('total') > 100)
|
|
144
|
-
.select(['parsed_date', 'upper_name', 'total'])
|
|
145
|
-
.collect()
|
|
146
|
-
)
|
|
147
|
-
|
|
148
|
-
print(result)
|
|
149
|
-
"
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
## Scenario 8: Large File Processing
|
|
153
|
-
|
|
154
|
-
**Decision: Polars streaming mode**
|
|
155
|
-
|
|
156
|
-
```python
|
|
157
|
-
uv run --with numpy --with polars python -c "
|
|
158
|
-
import polars as pl
|
|
159
|
-
|
|
160
|
-
# Process file larger than RAM
|
|
161
|
-
result = (
|
|
162
|
-
pl.scan_csv('huge_file.csv')
|
|
163
|
-
.filter(pl.col('active') == True)
|
|
164
|
-
.groupby('category')
|
|
165
|
-
.agg([
|
|
166
|
-
pl.count().alias('count'),
|
|
167
|
-
pl.sum('amount').alias('total'),
|
|
168
|
-
pl.mean('amount').alias('average'),
|
|
169
|
-
])
|
|
170
|
-
.collect(streaming=True) # Streaming mode
|
|
171
|
-
)
|
|
172
|
-
|
|
173
|
-
print(result)
|
|
174
|
-
print(f'\\nProcessed {result[\"count\"].sum():,} rows')
|
|
175
|
-
"
|
|
176
|
-
```
|
|
@@ -1,197 +0,0 @@
|
|
|
1
|
-
# Execution Templates
|
|
2
|
-
|
|
3
|
-
## Template 1: DuckDB for Simple/Complex SQL Queries
|
|
4
|
-
|
|
5
|
-
**Use when:**
|
|
6
|
-
- Simple aggregation on single file
|
|
7
|
-
- Complex multi-table joins
|
|
8
|
-
- Heavy GROUP BY operations
|
|
9
|
-
- Window functions with complex SQL logic
|
|
10
|
-
- Ad-hoc exploration queries
|
|
11
|
-
|
|
12
|
-
```python
|
|
13
|
-
uv run --with numpy --with duckdb python -c "
|
|
14
|
-
import duckdb
|
|
15
|
-
|
|
16
|
-
# Simple query - direct file access
|
|
17
|
-
result = duckdb.sql('''
|
|
18
|
-
SELECT
|
|
19
|
-
category,
|
|
20
|
-
COUNT(*) as count,
|
|
21
|
-
AVG(amount) as avg_amount,
|
|
22
|
-
SUM(amount) as total
|
|
23
|
-
FROM 'data.csv'
|
|
24
|
-
WHERE date >= '2024-01-01'
|
|
25
|
-
GROUP BY category
|
|
26
|
-
ORDER BY total DESC
|
|
27
|
-
LIMIT 10
|
|
28
|
-
''').pl()
|
|
29
|
-
|
|
30
|
-
print('**Results**')
|
|
31
|
-
print(result)
|
|
32
|
-
print(f'\\nProcessed {len(result)} categories')
|
|
33
|
-
"
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
## Template 2: Polars for Filtering & Sorting
|
|
37
|
-
|
|
38
|
-
**Use when:**
|
|
39
|
-
- Primary operation is filtering large dataset
|
|
40
|
-
- Sorting required
|
|
41
|
-
- Chain transformations
|
|
42
|
-
- Memory-efficient processing needed
|
|
43
|
-
|
|
44
|
-
```python
|
|
45
|
-
uv run --with numpy --with polars python -c "
|
|
46
|
-
import polars as pl
|
|
47
|
-
|
|
48
|
-
# Lazy evaluation for optimal performance
|
|
49
|
-
result = (
|
|
50
|
-
pl.scan_csv('data.csv') # Lazy scan
|
|
51
|
-
.filter(
|
|
52
|
-
(pl.col('amount') > 1000) &
|
|
53
|
-
(pl.col('status') == 'active') &
|
|
54
|
-
(pl.col('date') >= '2024-01-01')
|
|
55
|
-
)
|
|
56
|
-
.sort('amount', descending=True)
|
|
57
|
-
.head(100)
|
|
58
|
-
.collect() # Execute optimized plan
|
|
59
|
-
)
|
|
60
|
-
|
|
61
|
-
print('**Filtered and Sorted Results**')
|
|
62
|
-
print(result)
|
|
63
|
-
print(f'\\nFound {len(result)} matching rows')
|
|
64
|
-
"
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
## Template 3: Hybrid Approach (Best of Both)
|
|
68
|
-
|
|
69
|
-
**Use when:**
|
|
70
|
-
- Need joins AND heavy filtering
|
|
71
|
-
- Complex SQL followed by transformations
|
|
72
|
-
- Optimize different operation stages
|
|
73
|
-
|
|
74
|
-
```python
|
|
75
|
-
uv run --with numpy --with duckdb --with polars --with pyarrow python -c "
|
|
76
|
-
import duckdb
|
|
77
|
-
import polars as pl
|
|
78
|
-
|
|
79
|
-
print('Phase 1: DuckDB for complex join (3x faster)')
|
|
80
|
-
# DuckDB excels at joins
|
|
81
|
-
joined = duckdb.sql('''
|
|
82
|
-
SELECT
|
|
83
|
-
o.order_id,
|
|
84
|
-
o.amount,
|
|
85
|
-
c.customer_id,
|
|
86
|
-
c.region,
|
|
87
|
-
p.category
|
|
88
|
-
FROM 'orders.csv' o
|
|
89
|
-
JOIN 'customers.csv' c ON o.customer_id = c.customer_id
|
|
90
|
-
JOIN 'products.csv' p ON o.product_id = p.product_id
|
|
91
|
-
WHERE o.date >= '2024-01-01'
|
|
92
|
-
''').pl() # Convert to Polars
|
|
93
|
-
|
|
94
|
-
print(f'Joined {len(joined):,} rows')
|
|
95
|
-
|
|
96
|
-
print('\\nPhase 2: Polars for ultra-fast filtering (128x faster)')
|
|
97
|
-
# Polars excels at filtering
|
|
98
|
-
filtered = (
|
|
99
|
-
joined
|
|
100
|
-
.filter(
|
|
101
|
-
(pl.col('amount') > 100) &
|
|
102
|
-
(pl.col('region').is_in(['North', 'South', 'East']))
|
|
103
|
-
)
|
|
104
|
-
.with_columns([
|
|
105
|
-
(pl.col('amount') * 1.1).alias('amount_with_tax')
|
|
106
|
-
])
|
|
107
|
-
)
|
|
108
|
-
|
|
109
|
-
print(f'Filtered to {len(filtered):,} rows')
|
|
110
|
-
|
|
111
|
-
print('\\nPhase 3: DuckDB for final aggregation (4x faster)')
|
|
112
|
-
# Back to DuckDB for aggregation
|
|
113
|
-
duckdb.register('filtered_data', filtered)
|
|
114
|
-
final = duckdb.sql('''
|
|
115
|
-
SELECT
|
|
116
|
-
region,
|
|
117
|
-
category,
|
|
118
|
-
COUNT(DISTINCT customer_id) as customers,
|
|
119
|
-
SUM(amount_with_tax) as total_revenue,
|
|
120
|
-
AVG(amount_with_tax) as avg_transaction
|
|
121
|
-
FROM filtered_data
|
|
122
|
-
GROUP BY region, category
|
|
123
|
-
HAVING total_revenue > 10000
|
|
124
|
-
ORDER BY total_revenue DESC
|
|
125
|
-
''').pl()
|
|
126
|
-
|
|
127
|
-
print('\\n**Final Results**')
|
|
128
|
-
print(final)
|
|
129
|
-
"
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
## Template 4: Polars Streaming for Large Files
|
|
133
|
-
|
|
134
|
-
**Use when:**
|
|
135
|
-
- Dataset larger than available RAM
|
|
136
|
-
- Need to process data in batches
|
|
137
|
-
- Memory constraints
|
|
138
|
-
|
|
139
|
-
```python
|
|
140
|
-
uv run --with numpy --with polars python -c "
|
|
141
|
-
import polars as pl
|
|
142
|
-
|
|
143
|
-
# Streaming mode - processes data in chunks
|
|
144
|
-
result = (
|
|
145
|
-
pl.scan_csv('huge_file.csv')
|
|
146
|
-
.filter(pl.col('status') == 'active')
|
|
147
|
-
.with_columns([
|
|
148
|
-
(pl.col('amount') * 1.1).alias('adjusted_amount')
|
|
149
|
-
])
|
|
150
|
-
.groupby('category')
|
|
151
|
-
.agg([
|
|
152
|
-
pl.sum('adjusted_amount').alias('total'),
|
|
153
|
-
pl.count().alias('count')
|
|
154
|
-
])
|
|
155
|
-
.collect(streaming=True) # Streaming mode for large data
|
|
156
|
-
)
|
|
157
|
-
|
|
158
|
-
print('**Streaming Results**')
|
|
159
|
-
print(result)
|
|
160
|
-
print(f'\\nProcessed {result[\"count\"].sum():,} total rows')
|
|
161
|
-
"
|
|
162
|
-
```
|
|
163
|
-
|
|
164
|
-
## Template 5: Visualization with Matplotlib
|
|
165
|
-
|
|
166
|
-
**Use when:**
|
|
167
|
-
- User requests charts, graphs, or plots
|
|
168
|
-
- Exploratory data analysis (EDA)
|
|
169
|
-
- Time-series or distribution analysis
|
|
170
|
-
|
|
171
|
-
```python
|
|
172
|
-
uv run --with numpy --with duckdb --with polars --with pyarrow --with matplotlib python -c "
|
|
173
|
-
import duckdb
|
|
174
|
-
import matplotlib.pyplot as plt
|
|
175
|
-
|
|
176
|
-
# Query data
|
|
177
|
-
result = duckdb.sql('''
|
|
178
|
-
SELECT
|
|
179
|
-
date,
|
|
180
|
-
SUM(amount) as total
|
|
181
|
-
FROM 'data.csv'
|
|
182
|
-
GROUP BY date
|
|
183
|
-
ORDER BY date
|
|
184
|
-
''').pl()
|
|
185
|
-
|
|
186
|
-
# Create visualization
|
|
187
|
-
plt.figure(figsize=(10, 6))
|
|
188
|
-
plt.plot(result['date'], result['total'])
|
|
189
|
-
plt.xlabel('Date')
|
|
190
|
-
plt.ylabel('Total Amount')
|
|
191
|
-
plt.title('Daily Total Trends')
|
|
192
|
-
plt.xticks(rotation=45)
|
|
193
|
-
plt.tight_layout()
|
|
194
|
-
plt.savefig('output.png')
|
|
195
|
-
print('Chart saved to output.png')
|
|
196
|
-
"
|
|
197
|
-
```
|