lazycodex-ai 5.1.62 → 5.1.64
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.js +1598 -284
- package/dist/cli/service-auth/closed-device-login.fixture.d.ts +1 -0
- package/dist/cli/service-auth/credential-lock.d.ts +8 -2
- package/dist/cli/service-auth/keychain-helper/access.d.ts +27 -0
- package/dist/cli/service-auth/keychain-helper/approval-cache.d.ts +51 -0
- package/dist/cli/service-auth/keychain-helper/client.d.ts +68 -0
- package/dist/cli/service-auth/keychain-helper/creator-handoff.d.ts +31 -0
- package/dist/cli/service-auth/keychain-helper/darwin-backend.d.ts +75 -0
- package/dist/cli/service-auth/keychain-helper/darwin-read.d.ts +46 -0
- package/dist/cli/service-auth/keychain-helper/darwin-store.d.ts +28 -0
- package/dist/cli/service-auth/keychain-helper/fake-keychain.test-support.d.ts +85 -0
- package/dist/cli/service-auth/keychain-helper/location.d.ts +28 -0
- package/dist/cli/service-auth/keychain-helper/migration.d.ts +20 -0
- package/dist/cli/service-auth/keychain-helper/owner-marker.d.ts +7 -0
- package/dist/cli/service-auth/keychain-helper/pin.d.ts +20 -0
- package/dist/cli/service-auth/keychain-helper/process-copy.test-support.d.ts +3 -0
- package/dist/cli/service-auth/keychain-helper/process-state.d.ts +19 -0
- package/dist/cli/service-auth/keychain-helper/prompt-lock.d.ts +14 -0
- package/dist/cli/service-auth/keychain-helper/recovery.d.ts +34 -0
- package/dist/cli/service-auth/keychain-helper/runtime-capabilities.d.ts +13 -0
- package/dist/cli/service-auth/keychain-helper/secrets-gate.d.ts +4 -0
- package/dist/cli/service-auth/keychain-helper/signature.d.ts +17 -0
- package/dist/cli/service-auth/keychain-helper/store-binding.d.ts +46 -0
- package/dist/cli/service-auth/keystore.d.ts +18 -3
- package/dist/cli/service-auth/session.d.ts +2 -2
- package/dist/cli-node/index.js +1598 -284
- package/package.json +1 -1
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
- 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/comment-checker/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
- package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
- package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
- package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/rules/package.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +2 -0
- package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-unclear.md +2 -2
- package/packages/omo-codex/plugin/components/ultrawork/src/directive-content.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/directive.md +1 -1
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/directive.md +2 -0
- package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/define-goal.md +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +10 -10
- 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/post-tool-use-recording-spawn-admission.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 +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/package-lock.json +12 -12
- package/packages/omo-codex/plugin/package.json +1 -1
- package/packages/omo-codex/plugin/scripts/sync-skills.mjs +6 -3
- package/packages/omo-codex/plugin/skills/ast-grep/AGENTS.md +2 -2
- package/packages/omo-codex/plugin/skills/ast-grep/README.md +4 -4
- package/packages/omo-codex/plugin/skills/ast-grep/SKILL.md +10 -8
- package/packages/omo-codex/plugin/skills/ast-grep/references/cli.md +4 -3
- package/packages/omo-codex/plugin/skills/ast-grep/references/patterns.md +5 -5
- package/packages/omo-codex/plugin/skills/ast-grep/references/pitfalls.md +3 -3
- package/packages/omo-codex/plugin/skills/ast-grep/references/recipes.md +6 -4
- package/packages/omo-codex/plugin/skills/ast-grep/references/yaml-rules.md +3 -3
- package/packages/omo-codex/plugin/skills/ast-grep/scripts/ast_grep_helper.py +3 -3
- package/packages/omo-codex/plugin/skills/browser/SKILL.md +2 -3
- package/packages/omo-codex/plugin/skills/browser/runtime/omowright/manifest.json +1 -1
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/AGENTS.md +1 -1
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/SKILL.md +2 -1
- package/packages/omo-codex/plugin/skills/data-scientist/SKILL.md +8 -6
- package/packages/omo-codex/plugin/skills/data-scientist/references/placement.md +9 -5
- package/packages/omo-codex/plugin/skills/data-scientist/references/uv-setup.md +3 -3
- package/packages/omo-codex/plugin/skills/data-scientist/references/visualization.md +19 -4
- package/packages/omo-codex/plugin/skills/debugging/SKILL.md +5 -5
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/02-investigate.md +2 -2
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/06-fix.md +2 -0
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/09-cleanup.md +2 -2
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/partial-runtime-evidence.md +1 -1
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/bundled-js-binary.md +1 -1
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/native-binary.md +1 -1
- package/packages/omo-codex/plugin/skills/debugging/references/tools/browser-qa.md +1 -2
- package/packages/omo-codex/plugin/skills/frontend/SKILL.md +2 -2
- package/packages/omo-codex/plugin/skills/frontend/references/design/design-system-architecture.md +1 -1
- package/packages/omo-codex/plugin/skills/frontend/references/design/print-paged-media.md +1 -1
- package/packages/omo-codex/plugin/skills/frontend/references/perfection/README.md +0 -1
- package/packages/omo-codex/plugin/skills/frontend/references/perfection/react-perf-tooling.md +27 -8
- package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/lighthouse-audit.py +0 -1
- package/packages/omo-codex/plugin/skills/git-master/SKILL.md +12 -2
- package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/lsp-setup/SKILL.md +24 -15
- package/packages/omo-codex/plugin/skills/lsp-setup/references/bash/README.md +3 -3
- package/packages/omo-codex/plugin/skills/lsp-setup/references/c-cpp/README.md +2 -2
- package/packages/omo-codex/plugin/skills/lsp-setup/references/csharp/README.md +2 -2
- package/packages/omo-codex/plugin/skills/lsp-setup/references/dart/README.md +2 -2
- package/packages/omo-codex/plugin/skills/lsp-setup/references/elixir/README.md +2 -2
- package/packages/omo-codex/plugin/skills/lsp-setup/references/go/README.md +2 -2
- package/packages/omo-codex/plugin/skills/lsp-setup/references/haskell/README.md +2 -2
- package/packages/omo-codex/plugin/skills/lsp-setup/references/java/README.md +3 -3
- package/packages/omo-codex/plugin/skills/lsp-setup/references/julia/README.md +3 -3
- package/packages/omo-codex/plugin/skills/lsp-setup/references/kotlin/README.md +4 -4
- package/packages/omo-codex/plugin/skills/lsp-setup/references/lua/README.md +2 -2
- package/packages/omo-codex/plugin/skills/lsp-setup/references/php/README.md +3 -3
- package/packages/omo-codex/plugin/skills/lsp-setup/references/python/README.md +13 -12
- package/packages/omo-codex/plugin/skills/lsp-setup/references/ruby/README.md +2 -2
- package/packages/omo-codex/plugin/skills/lsp-setup/references/rust/README.md +2 -2
- package/packages/omo-codex/plugin/skills/lsp-setup/references/swift/README.md +4 -4
- package/packages/omo-codex/plugin/skills/lsp-setup/references/terraform/README.md +2 -2
- package/packages/omo-codex/plugin/skills/lsp-setup/references/typescript/README.md +3 -3
- package/packages/omo-codex/plugin/skills/lsp-setup/references/yaml/README.md +2 -2
- package/packages/omo-codex/plugin/skills/lsp-setup/references/zig/README.md +2 -2
- package/packages/omo-codex/plugin/skills/lsp-setup/scripts/detect-lsp.ts +1 -1
- package/packages/omo-codex/plugin/skills/lsp-setup/scripts/lsp-server-table.ts +3 -2
- package/packages/omo-codex/plugin/skills/programming/SKILL.md +5 -5
- package/packages/omo-codex/plugin/skills/programming/references/code-smells.md +2 -2
- package/packages/omo-codex/plugin/skills/programming/references/go/README.md +3 -3
- package/packages/omo-codex/plugin/skills/programming/references/python/README.md +8 -8
- package/packages/omo-codex/plugin/skills/programming/references/python/data-processing.md +9 -9
- package/packages/omo-codex/plugin/skills/programming/references/rust-ub/README.md +3 -3
- package/packages/omo-codex/plugin/skills/programming/references/typescript/README.md +5 -5
- package/packages/omo-codex/plugin/skills/programming/scripts/typescript/new-project.ts +1 -1
- package/packages/omo-codex/plugin/skills/refactor/SKILL.md +35 -35
- package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +6 -6
- package/packages/omo-codex/plugin/skills/review-work/SKILL.md +2 -2
- package/packages/omo-codex/plugin/skills/ultimate-browsing/SKILL.md +10 -7
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/AGENTS.md +4 -4
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/agent-reach/README.md +2 -2
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/agent-reach/career.md +1 -1
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/agent-reach/social.md +1 -1
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/agent-reach/web.md +4 -4
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/chrome-stealth.md +2 -1
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/README.md +16 -17
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/fallback.md +10 -6
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/jina.md +12 -12
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/naver.md +3 -3
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/playwright.md +1 -1
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/rss.md +1 -1
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/tls-impersonate.md +12 -7
- package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +2 -0
- package/packages/omo-codex/plugin/skills/ulw-execute/SKILL.md +9 -6
- package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/ulw-loop/references/define-goal.md +1 -1
- package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +10 -10
- package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +1 -1
- package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-unclear.md +2 -2
- package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +2 -2
- package/packages/omo-codex/plugin/skills/ulw-research/references/deliverable-phase.md +5 -5
- package/packages/omo-codex/plugin/skills/ulw-research/references/report-visualization.md +2 -2
- package/packages/omo-codex/plugin/skills/ulw-research/references/research-collection.md +2 -2
- package/packages/omo-codex/plugin/skills/ulw-research/references/unit-rules.md +2 -2
- package/packages/omo-codex/plugin/skills/visual-qa/AGENTS.md +1 -1
- package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +5 -5
- package/packages/omo-codex/plugin/skills/visual-qa/references/browser-setup.md +4 -2
- package/packages/omo-codex/plugin/test/sync-skills-codex-compatibility.test.mjs +2 -0
- package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +7 -3
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +2 -2
- package/packages/prompts-core/prompts/ultrawork/codex.md +2 -0
- package/packages/shared-skills/skills/ast-grep/AGENTS.md +2 -2
- package/packages/shared-skills/skills/ast-grep/README.md +4 -4
- package/packages/shared-skills/skills/ast-grep/SKILL.md +10 -8
- package/packages/shared-skills/skills/ast-grep/references/cli.md +4 -3
- package/packages/shared-skills/skills/ast-grep/references/patterns.md +5 -5
- package/packages/shared-skills/skills/ast-grep/references/pitfalls.md +3 -3
- package/packages/shared-skills/skills/ast-grep/references/recipes.md +6 -4
- package/packages/shared-skills/skills/ast-grep/references/yaml-rules.md +3 -3
- package/packages/shared-skills/skills/ast-grep/scripts/ast_grep_helper.py +3 -3
- package/packages/shared-skills/skills/browser/SKILL.md +2 -3
- package/packages/shared-skills/skills/browser/runtime/omowright/manifest.json +1 -1
- package/packages/shared-skills/skills/coding-agent-sessions/AGENTS.md +1 -1
- package/packages/shared-skills/skills/coding-agent-sessions/SKILL.md +2 -1
- package/packages/shared-skills/skills/data-scientist/SKILL.md +8 -6
- package/packages/shared-skills/skills/data-scientist/references/placement.md +9 -5
- package/packages/shared-skills/skills/data-scientist/references/uv-setup.md +3 -3
- package/packages/shared-skills/skills/data-scientist/references/visualization.md +19 -4
- package/packages/shared-skills/skills/debugging/SKILL.md +5 -5
- package/packages/shared-skills/skills/debugging/references/methodology/02-investigate.md +2 -2
- package/packages/shared-skills/skills/debugging/references/methodology/06-fix.md +2 -0
- package/packages/shared-skills/skills/debugging/references/methodology/09-cleanup.md +2 -2
- package/packages/shared-skills/skills/debugging/references/methodology/partial-runtime-evidence.md +1 -1
- package/packages/shared-skills/skills/debugging/references/runtimes/bundled-js-binary.md +1 -1
- package/packages/shared-skills/skills/debugging/references/runtimes/native-binary.md +1 -1
- package/packages/shared-skills/skills/debugging/references/tools/browser-qa.md +1 -2
- package/packages/shared-skills/skills/frontend/SKILL.md +2 -2
- package/packages/shared-skills/skills/frontend/references/design/design-system-architecture.md +1 -1
- package/packages/shared-skills/skills/frontend/references/design/print-paged-media.md +1 -1
- package/packages/shared-skills/skills/frontend/references/perfection/README.md +0 -1
- package/packages/shared-skills/skills/frontend/references/perfection/react-perf-tooling.md +27 -8
- package/packages/shared-skills/skills/frontend/scripts/perfection/lighthouse-audit.py +0 -1
- package/packages/shared-skills/skills/git-master/SKILL.md +12 -2
- package/packages/shared-skills/skills/init-deep/SKILL.md +1 -1
- package/packages/shared-skills/skills/lsp-setup/SKILL.md +24 -15
- package/packages/shared-skills/skills/lsp-setup/references/bash/README.md +3 -3
- package/packages/shared-skills/skills/lsp-setup/references/c-cpp/README.md +2 -2
- package/packages/shared-skills/skills/lsp-setup/references/csharp/README.md +2 -2
- package/packages/shared-skills/skills/lsp-setup/references/dart/README.md +2 -2
- package/packages/shared-skills/skills/lsp-setup/references/elixir/README.md +2 -2
- package/packages/shared-skills/skills/lsp-setup/references/go/README.md +2 -2
- package/packages/shared-skills/skills/lsp-setup/references/haskell/README.md +2 -2
- package/packages/shared-skills/skills/lsp-setup/references/java/README.md +3 -3
- package/packages/shared-skills/skills/lsp-setup/references/julia/README.md +3 -3
- package/packages/shared-skills/skills/lsp-setup/references/kotlin/README.md +4 -4
- package/packages/shared-skills/skills/lsp-setup/references/lua/README.md +2 -2
- package/packages/shared-skills/skills/lsp-setup/references/php/README.md +3 -3
- package/packages/shared-skills/skills/lsp-setup/references/python/README.md +13 -12
- package/packages/shared-skills/skills/lsp-setup/references/ruby/README.md +2 -2
- package/packages/shared-skills/skills/lsp-setup/references/rust/README.md +2 -2
- package/packages/shared-skills/skills/lsp-setup/references/swift/README.md +4 -4
- package/packages/shared-skills/skills/lsp-setup/references/terraform/README.md +2 -2
- package/packages/shared-skills/skills/lsp-setup/references/typescript/README.md +3 -3
- package/packages/shared-skills/skills/lsp-setup/references/yaml/README.md +2 -2
- package/packages/shared-skills/skills/lsp-setup/references/zig/README.md +2 -2
- package/packages/shared-skills/skills/lsp-setup/scripts/detect-lsp.ts +1 -1
- package/packages/shared-skills/skills/lsp-setup/scripts/lsp-server-table.ts +3 -2
- package/packages/shared-skills/skills/programming/SKILL.md +5 -5
- package/packages/shared-skills/skills/programming/references/code-smells.md +2 -2
- package/packages/shared-skills/skills/programming/references/go/README.md +3 -3
- package/packages/shared-skills/skills/programming/references/python/README.md +8 -8
- package/packages/shared-skills/skills/programming/references/python/data-processing.md +9 -9
- package/packages/shared-skills/skills/programming/references/rust-ub/README.md +3 -3
- package/packages/shared-skills/skills/programming/references/typescript/README.md +5 -5
- package/packages/shared-skills/skills/programming/scripts/typescript/new-project.ts +1 -1
- package/packages/shared-skills/skills/refactor/SKILL.md +35 -35
- package/packages/shared-skills/skills/remove-ai-slops/SKILL.md +6 -6
- package/packages/shared-skills/skills/review-work/SKILL.md +2 -2
- package/packages/shared-skills/skills/ultimate-browsing/SKILL.md +10 -7
- package/packages/shared-skills/skills/ultimate-browsing/engine/AGENTS.md +4 -4
- package/packages/shared-skills/skills/ultimate-browsing/references/agent-reach/README.md +2 -2
- package/packages/shared-skills/skills/ultimate-browsing/references/agent-reach/career.md +1 -1
- package/packages/shared-skills/skills/ultimate-browsing/references/agent-reach/social.md +1 -1
- package/packages/shared-skills/skills/ultimate-browsing/references/agent-reach/web.md +4 -4
- package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +2 -1
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/README.md +16 -17
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/fallback.md +10 -6
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/jina.md +12 -12
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/naver.md +3 -3
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/playwright.md +1 -1
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/rss.md +1 -1
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/tls-impersonate.md +12 -7
- package/packages/shared-skills/skills/ulw-execute/SKILL.md +9 -6
- package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +1 -1
- package/packages/shared-skills/skills/ulw-plan/references/intent-unclear.md +2 -2
- package/packages/shared-skills/skills/ulw-research/SKILL.md +3 -3
- package/packages/shared-skills/skills/ulw-research/references/deliverable-phase.md +5 -5
- package/packages/shared-skills/skills/ulw-research/references/report-visualization.md +2 -2
- package/packages/shared-skills/skills/ulw-research/references/research-collection.md +2 -2
- package/packages/shared-skills/skills/ulw-research/references/unit-rules.md +2 -2
- package/packages/shared-skills/skills/visual-qa/AGENTS.md +1 -1
- package/packages/shared-skills/skills/visual-qa/SKILL.md +5 -5
- package/packages/shared-skills/skills/visual-qa/references/browser-setup.md +4 -2
|
@@ -82,17 +82,15 @@ Should I proceed with [recommendation], or would you prefer differently?
|
|
|
82
82
|
|
|
83
83
|
## Step 0.3: Create Initial Todos
|
|
84
84
|
|
|
85
|
-
**IMMEDIATELY after understanding the request, create todos:**
|
|
85
|
+
**IMMEDIATELY after understanding the request, create these todos with the session's todo tool (all pending):**
|
|
86
86
|
|
|
87
87
|
\`\`\`
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
{"id": "phase-6", "content": "PHASE 6: Final Verification - full test suite and regression check", "status": "pending", "priority": "high"}
|
|
95
|
-
])
|
|
88
|
+
- phase-1: PHASE 1: Codebase Analysis - launch parallel explore agents
|
|
89
|
+
- phase-2: PHASE 2: Build Codemap - map dependencies and impact zones
|
|
90
|
+
- phase-3: PHASE 3: Test Assessment - analyze test coverage and verification strategy
|
|
91
|
+
- phase-4: PHASE 4: Plan Generation - invoke Plan agent for detailed refactoring plan
|
|
92
|
+
- phase-5: PHASE 5: Execute Refactoring - step-by-step with continuous verification
|
|
93
|
+
- phase-6: PHASE 6: Final Verification - full test suite and regression check
|
|
96
94
|
\`\`\`
|
|
97
95
|
|
|
98
96
|
---
|
|
@@ -155,14 +153,14 @@ While background agents are running, use direct tools:
|
|
|
155
153
|
|
|
156
154
|
\`\`\`typescript
|
|
157
155
|
// Find definition(s)
|
|
158
|
-
|
|
156
|
+
lsp_goto_definition(filePath, line, character) // Where is it defined?
|
|
159
157
|
|
|
160
158
|
// Find ALL usages across workspace
|
|
161
|
-
|
|
159
|
+
lsp_find_references(filePath, line, character, includeDeclaration=true)
|
|
162
160
|
|
|
163
161
|
// Get file structure
|
|
164
|
-
|
|
165
|
-
|
|
162
|
+
lsp_symbols(filePath, scope="document") // Hierarchical outline
|
|
163
|
+
lsp_symbols(filePath, scope="workspace", query="[target_symbol]") // Search by name
|
|
166
164
|
|
|
167
165
|
// Get current diagnostics
|
|
168
166
|
lsp_diagnostics(filePath) // Errors, warnings before we start
|
|
@@ -171,8 +169,8 @@ lsp_diagnostics(filePath) // Errors, warnings before we start
|
|
|
171
169
|
### AST-Grep Skill for Pattern Analysis:
|
|
172
170
|
|
|
173
171
|
\`\`\`bash
|
|
174
|
-
// Find structural patterns
|
|
175
|
-
python3 scripts/ast_grep_helper.py search 'function $NAME($$$) { $$$ }' --lang ts
|
|
172
|
+
// Find structural patterns — run this from the ast-grep skill's directory; this skill ships no scripts/
|
|
173
|
+
python3 scripts/ast_grep_helper.py search 'function $NAME($$$) { $$$ }' src/ --lang ts
|
|
176
174
|
|
|
177
175
|
# Preview refactoring first
|
|
178
176
|
sg --pattern '[old_pattern]' --rewrite '[new_pattern]' --lang ts src/
|
|
@@ -181,7 +179,7 @@ sg --pattern '[old_pattern]' --rewrite '[new_pattern]' --lang ts src/
|
|
|
181
179
|
### Grep for Text Patterns:
|
|
182
180
|
|
|
183
181
|
\`\`\`
|
|
184
|
-
grep(pattern="[search_term]", path="src/"
|
|
182
|
+
grep(pattern="[search_term]", path="src/") // narrow to *.ts with the grep tool's file-filter parameter
|
|
185
183
|
\`\`\`
|
|
186
184
|
|
|
187
185
|
## 1.3: Collect Background Results
|
|
@@ -318,6 +316,11 @@ Which approach do you prefer?
|
|
|
318
316
|
- Unit: \`bun test\` / \`npm test\` / \`pytest\` / etc.
|
|
319
317
|
- Integration: [command if exists]
|
|
320
318
|
- Type check: \`tsc --noEmit\` / \`pyright\` / etc.
|
|
319
|
+
- Lint: [project's linter command, the one Phase 6.3 runs]
|
|
320
|
+
|
|
321
|
+
### Baseline (before any change)
|
|
322
|
+
- Pass counts: [X/Y passing per test command above]
|
|
323
|
+
- lsp_diagnostics: [pre-existing diagnostics recorded in Phase 1.2]
|
|
321
324
|
|
|
322
325
|
### Verification Checkpoints
|
|
323
326
|
After each refactoring step:
|
|
@@ -381,17 +384,14 @@ After receiving plan from Plan agent:
|
|
|
381
384
|
|
|
382
385
|
## 4.3: Register Detailed Todos
|
|
383
386
|
|
|
384
|
-
Convert Plan agent output into granular todos:
|
|
387
|
+
Convert Plan agent output into granular todos with the session's todo tool (each step from the plan becomes a todo, followed by its verify todo):
|
|
385
388
|
|
|
386
389
|
\`\`\`
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
{"id": "verify-2", "content": "Verify Step 2: run tests", "status": "pending", "priority": "medium"},
|
|
393
|
-
// ... continue for all steps
|
|
394
|
-
])
|
|
390
|
+
- refactor-1: Step 1: [description]
|
|
391
|
+
- verify-1: Verify Step 1: run tests
|
|
392
|
+
- refactor-2: Step 2: [description]
|
|
393
|
+
- verify-2: Verify Step 2: run tests
|
|
394
|
+
- ... continue for all steps
|
|
395
395
|
\`\`\`
|
|
396
396
|
|
|
397
397
|
**Mark phase-4 as completed.**
|
|
@@ -425,8 +425,8 @@ lsp_rename(filePath, line, character, newName) // Execute rename
|
|
|
425
425
|
// Preview first
|
|
426
426
|
sg --pattern '[pattern]' --rewrite '[rewrite]' --lang ts path/to/file.ts
|
|
427
427
|
|
|
428
|
-
// If preview looks good, execute
|
|
429
|
-
python3 scripts/ast_grep_helper.py replace '[pattern]' '[rewrite]'
|
|
428
|
+
// If preview looks good, execute (from the ast-grep skill's directory)
|
|
429
|
+
python3 scripts/ast_grep_helper.py replace '[pattern]' '[rewrite]' path/to/file.ts --lang ts --apply
|
|
430
430
|
\`\`\`
|
|
431
431
|
|
|
432
432
|
**For Structural Changes:**
|
|
@@ -519,7 +519,7 @@ bun run build # or npm run build, etc.
|
|
|
519
519
|
\`\`\`typescript
|
|
520
520
|
// Check all changed files
|
|
521
521
|
for (file of changedFiles) {
|
|
522
|
-
lsp_diagnostics(file) // Must
|
|
522
|
+
lsp_diagnostics(file) // Must be clean or same as the Phase 1 baseline: zero new diagnostics
|
|
523
523
|
}
|
|
524
524
|
\`\`\`
|
|
525
525
|
|
|
@@ -585,8 +585,8 @@ You already know these tools. Use them intelligently:
|
|
|
585
585
|
|
|
586
586
|
## LSP Tools
|
|
587
587
|
Leverage LSP tools for precision analysis. Key patterns:
|
|
588
|
-
- **Understand before changing**: \`
|
|
589
|
-
- **Impact analysis**: \`
|
|
588
|
+
- **Understand before changing**: \`lsp_goto_definition\` to grasp context
|
|
589
|
+
- **Impact analysis**: \`lsp_find_references\` to map all usages before modification
|
|
590
590
|
- **Safe refactoring**: \`lsp_prepare_rename\` → \`lsp_rename\` for symbol renames
|
|
591
591
|
- **Continuous verification**: \`lsp_diagnostics\` after every change
|
|
592
592
|
|
|
@@ -650,7 +650,7 @@ Then choose the path:
|
|
|
650
650
|
- **Team path (5.1-T)**: when the plan recommends \`team\` AND \`file_independent_steps >= 3\`. Members execute in parallel, Lead orchestrates, a \`deep-high\` verifier lives outside the team.
|
|
651
651
|
- **Legacy path (5.1-L)**: otherwise. Use the original 5.1 / 5.2 / 5.3 flow from above.
|
|
652
652
|
|
|
653
|
-
Record the chosen path in the
|
|
653
|
+
Record the chosen path in the todo list.
|
|
654
654
|
|
|
655
655
|
## Phase 5.1-T: \`refactor-squad\` team execution
|
|
656
656
|
|
|
@@ -658,9 +658,9 @@ Record the chosen path in the TodoWrite list.
|
|
|
658
658
|
|
|
659
659
|
1. When the session lists the \`team-mode\` skill, load it for lifecycle, message protocol, and limits.
|
|
660
660
|
2. Call \`team_list\` and verify no active \`refactor-squad\` run exists; if one does, shutdown + delete the orphan before proceeding.
|
|
661
|
-
3. If
|
|
661
|
+
3. If the project-level spec \`.omo/teams/refactor-squad/config.json\` (under the project root) is missing, write it using the spec below.
|
|
662
662
|
|
|
663
|
-
**Team spec** (
|
|
663
|
+
**Team spec** (\`<project root>/.omo/teams/refactor-squad/config.json\`):
|
|
664
664
|
|
|
665
665
|
\`\`\`json
|
|
666
666
|
{
|
|
@@ -724,7 +724,7 @@ While any team task is \`pending | claimed | in_progress\`:
|
|
|
724
724
|
prompt=<files touched + verify-spec commands + instruction to return "PASS" or "FAIL:<failing test + specific error + suggested revert hunks>">
|
|
725
725
|
)
|
|
726
726
|
\`\`\`
|
|
727
|
-
If \`deep\` is unavailable, fall back to \`category="unspecified-high"\`. Do not create a commit checkpoint until the verifier returns PASS.
|
|
727
|
+
If \`deep-high\` is unavailable, fall back to \`category="unspecified-high"\`. Do not create a commit checkpoint until the verifier returns PASS.
|
|
728
728
|
- On a verifier PASS: make the commit checkpoint for that step (see original 5.3). Proceed.
|
|
729
729
|
- On a verifier FAIL: Lead decides:
|
|
730
730
|
- **Retry with fix hint**: \`team_task_update(status=pending)\` on the original step + \`team_send_message(teamRunId=<id>, to=<original member>, summary="retry", body=<specific failure from verifier>)\`. Runtime reassigns.
|
|
@@ -741,7 +741,7 @@ If Phase 5 used the team path, dismantle \`refactor-squad\` BEFORE producing the
|
|
|
741
741
|
2. \`team_delete(teamRunId=<id>)\`.
|
|
742
742
|
3. \`team_list\` to confirm no residual \`refactor-squad\` run.
|
|
743
743
|
|
|
744
|
-
The
|
|
744
|
+
The \`.omo/teams/refactor-squad/config.json\` declaration stays on disk in the project; next session reuses it.
|
|
745
745
|
|
|
746
746
|
Append to the 6.6 summary a "Dispatch path" line and, when team path was used, team metrics (teamRunId, tasks created, verifier runs, team lifetime).
|
|
747
747
|
|
|
@@ -72,12 +72,12 @@ The agent looks for these ten categories. The first three are stylistic, the nex
|
|
|
72
72
|
10. **Oversized modules** — any source file exceeding **250 pure LOC** (non-blank, non-comment lines). This is an architectural defect, not a style preference. Measure: `awk '!/^[[:space:]]*$/ && !/^[[:space:]]*(#|\/\/)/' <file> | wc -l`.
|
|
73
73
|
|
|
74
74
|
**When found, do NOT just flag it. Execute a full modular refactoring:**
|
|
75
|
-
1.
|
|
75
|
+
1. List every oversized file in scope: run the `awk` measure above on each source file. For `.py` files you may instead run the `programming` skill's Python checker (`uv run <programming skill dir>/scripts/python/check-no-excuse-rules.py <paths>`, rule `oversized-module`); it scans only `.py` files, so it never covers another language.
|
|
76
76
|
2. For each oversized file, identify distinct responsibilities (single-responsibility principle).
|
|
77
77
|
3. Plan the split: name each new file after the concept it owns (never `utils.py`, `helpers.py`, `common.py`, `part_1.py`).
|
|
78
78
|
4. Present the split plan to the user before executing.
|
|
79
79
|
5. Extract into clean modules with explicit `__init__.py` re-exports (re-exports ONLY, no logic in `__init__.py`).
|
|
80
|
-
6. Verify:
|
|
80
|
+
6. Verify: re-measure exactly as in step 1 — every file must be ≤250 pure LOC. Run tests, typecheck, lint.
|
|
81
81
|
|
|
82
82
|
**Forbidden escapes**:
|
|
83
83
|
- Counting blanks/comments toward budget.
|
|
@@ -86,7 +86,7 @@ The agent looks for these ten categories. The first three are stylistic, the nex
|
|
|
86
86
|
- "It's generated" — only valid if the file lives in a build output directory.
|
|
87
87
|
- "230 LOC, close enough" — a 230-LOC file about to grow is already over. Split now.
|
|
88
88
|
|
|
89
|
-
KEEP: genuinely self-contained single-responsibility scripts (e.g., a standalone CLI checker). Opt out with `# noqa: SIZE_OK` in
|
|
89
|
+
KEEP: genuinely self-contained single-responsibility scripts (e.g., a standalone CLI checker). Opt out with the language's SIZE_OK marker in the first 10 lines (`# noqa: SIZE_OK` in Python, the form the Python checker reads; `// allow: SIZE_OK` in `//`-comment languages) and a comment explaining why.
|
|
90
90
|
|
|
91
91
|
---
|
|
92
92
|
|
|
@@ -106,7 +106,7 @@ A pass is complete only when all applicable gates are green. Skip gates that are
|
|
|
106
106
|
|
|
107
107
|
## Process
|
|
108
108
|
|
|
109
|
-
### Phase 0: Plan with
|
|
109
|
+
### Phase 0: Plan with the todo tool
|
|
110
110
|
|
|
111
111
|
Create todos for all phases below. Mark `in_progress` one at a time.
|
|
112
112
|
|
|
@@ -246,8 +246,8 @@ If any gate fails or any checklist item flips:
|
|
|
246
246
|
|
|
247
247
|
1. Identify the specific change that caused the failure.
|
|
248
248
|
2. Explain why it broke things.
|
|
249
|
-
3. `git checkout` the affected file (or use `git diff` + targeted `
|
|
250
|
-
4. If genuine slop remains after revert, edit the file directly yourself — in parallel per file via multiple
|
|
249
|
+
3. `git checkout` the affected file (or use `git diff` + targeted `edit` to revert just the problematic hunk).
|
|
250
|
+
4. If genuine slop remains after revert, edit the file directly yourself — in parallel per file via multiple `edit` calls — applying only the changes you can prove are safe.
|
|
251
251
|
5. Re-run the failing gate and re-walk the checklist for the affected file.
|
|
252
252
|
6. Repeat until all gates green AND checklist clean.
|
|
253
253
|
|
|
@@ -121,7 +121,7 @@ For GOAL, CONSTRAINTS, BACKGROUND - review the full conversation history. The us
|
|
|
121
121
|
|
|
122
122
|
## Phase 1: Manual QA (you run it)
|
|
123
123
|
|
|
124
|
-
You are the QA lane. Do not delegate hands-on QA to a sub-agent: the orchestrator owns the real-surface proof, exactly as the ulw-loop final gate records `manualQa` under the main session.
|
|
124
|
+
You are the QA lane. Do not delegate hands-on QA to a sub-agent: the orchestrator owns the real-surface proof, exactly as the ulw-loop final gate records `manualQa` under the main session. One exception: inside a `ulw-execute` run, whose root never runs QA itself, dispatch these scenarios to one QA worker and build the matrix from the artifacts it captures.
|
|
125
125
|
|
|
126
126
|
1. **Reuse first.** If this session already captured real-surface evidence for the FINAL tree (an ultrawork or ulw-loop evidence directory, a `visual-qa` verdict on this same build), consume it as QA rows instead of re-running. A fix committed after a capture stales that capture: re-run the rows it covered.
|
|
127
127
|
2. **Pick the channel that faithfully exercises the surface** and capture the artifact:
|
|
@@ -240,7 +240,7 @@ Store the lane verdicts independently:
|
|
|
240
240
|
| Manual QA (Phase 1) | PASS/FAIL | rows, artifact paths |
|
|
241
241
|
| Gate review | pending/APPROVE/REJECT/INCONCLUSIVE | - |
|
|
242
242
|
|
|
243
|
-
If the reviewer
|
|
243
|
+
If the reviewer ends without a verdict (it completed without one, answered ack-only to one follow-up, or reported `BLOCKED:`), record the lane INCONCLUSIVE and respawn one smaller reviewer scoped to the same inputs. A reviewer that is still running is alive, not silent. If that retry also ends without a verdict, close the still-running agent if safe, keep the lane INCONCLUSIVE, and emit the final result naming the incomplete lane. Do not spin in repeated wait/followup cycles, and do not use a queued followup as a cancellation.
|
|
244
244
|
|
|
245
245
|
After the lane reaches a terminal state and before delivering the verdict, tear down the review worktree: run `git worktree unlock <path>` followed by `git worktree remove <path>`. The reviewer runs inside that worktree, so removing it earlier destroys its working directory; a crashed review leaves the locked tree as a recoverable marker for manual cleanup.
|
|
246
246
|
|
|
@@ -22,7 +22,7 @@ User request
|
|
|
22
22
|
+- archive snapshot of a dead or changed page ------- TIER 1 insane-search (surrogates, provenance-tagged)
|
|
23
23
|
|
|
|
24
24
|
+- Chinese platform (xhs/douyin/weibo/bilibili/v2ex/wechat) TIER 1.5 agent-reach
|
|
25
|
-
+- podcast transcript
|
|
25
|
+
+- podcast transcript ------------------------------- TIER 1.5 agent-reach
|
|
26
26
|
+- Twitter feed / LinkedIn profile / GitHub via CLI - TIER 1.5 agent-reach
|
|
27
27
|
|
|
|
28
28
|
+- Tier 1/1.5 returned empty or partial ------------- TIER 2 2a owned engine (stealth)
|
|
@@ -71,8 +71,8 @@ The full engine harness (rules R1-R7, the Phase 0 official-API index, the no-sit
|
|
|
71
71
|
| search | Exa AI | [references/agent-reach/search.md](references/agent-reach/search.md) |
|
|
72
72
|
|
|
73
73
|
```bash
|
|
74
|
-
mcporter call 'douyin.parse_douyin_video_info(
|
|
75
|
-
curl -s "https://r.jina.ai/https://weibo.com/<uid>/<pid>"
|
|
74
|
+
mcporter call 'douyin.parse_douyin_video_info(share_link: "<URL>")' # douyin, zero-config
|
|
75
|
+
curl -s -H "Authorization: Bearer ${JINA_API_KEY}" "https://r.jina.ai/https://weibo.com/<uid>/<pid>" # weibo via Jina (key required)
|
|
76
76
|
yt-dlp --dump-json "<bilibili-url>" # Bilibili (overseas: add --cookies-from-browser)
|
|
77
77
|
curl -s "https://www.v2ex.com/api/topics/hot.json" # V2EX public API
|
|
78
78
|
```
|
|
@@ -115,17 +115,19 @@ When the blocked flow needs the user's account, drive the browser they are alrea
|
|
|
115
115
|
|
|
116
116
|
### Cookie login (cross-platform)
|
|
117
117
|
|
|
118
|
-
|
|
118
|
+
A login the user holds goes through Tier 2b, never through their cookies: the `browser` skill forbids copying a session out of the user's real browser profile (`references/owned-engine/network.md`, Cookies).
|
|
119
|
+
|
|
120
|
+
`scripts/extract_cookies.py` reads cookies from the default profile store of a local Chromium-family or Firefox-family browser and optionally injects them over CDP. It resolves browser profile paths and decrypts cookie values per-OS (macOS Keychain, Linux libsecret, Windows DPAPI). Because it always reads that default store, run it only where that browser profile is not the user's live profile (for example a dedicated automation account whose browser the task owns); on the user's own machine it would copy their session, so use Tier 2b instead.
|
|
119
121
|
|
|
120
122
|
```bash
|
|
121
123
|
# Extract cookies to a file:
|
|
122
124
|
mkdir -p ~/.local/state/omo-cookies
|
|
123
125
|
python3 -B scripts/extract_cookies.py --browser chrome --domain youtube.com --output ~/.local/state/omo-cookies/youtube.cookies.json
|
|
124
|
-
# Extract and inject
|
|
126
|
+
# Extract and inject over CDP (needs a browser started with --remote-debugging-port=9242; connectPipe opens no port):
|
|
125
127
|
python3 -B scripts/extract_cookies.py --browser chrome --domain youtube.com --inject --cdp 9242
|
|
126
128
|
```
|
|
127
129
|
|
|
128
|
-
Cookie export files are written with owner-only `0600` permissions. Do not place live auth cookies in shared temp directories or commit them to a repo. Cookie injection sends values to CDP over stdin rather than argv. Cookies apply on next navigation — reload after injecting. Google services use fingerprint-bound tokens that may not transfer across browser profiles. Limits in [references/chrome-stealth.md](references/chrome-stealth.md).
|
|
130
|
+
For a Tier 2a owned page, load the exported file and call `omowright.injectCookies(page, cookies)` instead (see [references/chrome-stealth.md](references/chrome-stealth.md)). Cookie export files are written with owner-only `0600` permissions. Do not place live auth cookies in shared temp directories or commit them to a repo. Cookie injection sends values to CDP over stdin rather than argv. Cookies apply on next navigation — reload after injecting. Google services use fingerprint-bound tokens that may not transfer across browser profiles. Limits in [references/chrome-stealth.md](references/chrome-stealth.md).
|
|
129
131
|
|
|
130
132
|
## Reference docs
|
|
131
133
|
|
|
@@ -139,7 +141,8 @@ Cookie export files are written with owner-only `0600` permissions. Do not place
|
|
|
139
141
|
|
|
140
142
|
```bash
|
|
141
143
|
# agent-reach auth: set the channel-specific env vars from each tool's docs only if you have access
|
|
142
|
-
# insane-search
|
|
144
|
+
# insane-search: JINA_API_KEY only for the Jina Reader route (the engine skips that surrogate without it)
|
|
145
|
+
# insane-search Python deps: the install one-liner in references/insane-search/README.md
|
|
143
146
|
```
|
|
144
147
|
|
|
145
148
|
## Anti-patterns
|
|
@@ -61,7 +61,7 @@ is a regression, not an upgrade:
|
|
|
61
61
|
- **Module split of the fetch chain** — `curl_probe` / `referers` / `url_transforms` /
|
|
62
62
|
`waf_detector` / `validators` / `executor` / `summary` as separate modules rather than
|
|
63
63
|
one monolith.
|
|
64
|
-
- **The Python test suite** under `engine/tests/` with its HTML/JSON fixtures.
|
|
64
|
+
- **The Python test suite** under `engine/tests/` with its HTML/JSON fixtures (source checkout only: the skill copy filter drops `engine/tests/` from every shipped edition).
|
|
65
65
|
- **De-personalization** — no personal absolute paths, no personal auth token literals,
|
|
66
66
|
no personal browser choice; enforced by `depersonalization-gate.test.ts`.
|
|
67
67
|
- **Skill-level layering** — the engine is Tier 1 under a router that also owns Tier 1.5
|
|
@@ -115,7 +115,7 @@ Any future upstream sync preserves BOTH sides. Concretely:
|
|
|
115
115
|
|
|
116
116
|
## OVERVIEW
|
|
117
117
|
|
|
118
|
-
A
|
|
118
|
+
A 13-file Python package (`__init__.py`, `__main__.py` and 11 modules) embedded in the `ultimate-browsing` skill: a site-agnostic fetch chain that escalates from a cheap curl probe to a real browser, with declarative WAF and surrogate registries. Not "optional scripts" — it has its own CLI entry (`python3 -B -m engine URL`; `-B` keeps bytecode caches out of a signed app bundle, #11373), two YAML config schemas, a 6-file test suite (source checkout only), and a standalone CI guard. Package exports (`__init__.py`): `fetch`, `FetchResult`, `Attempt`, `Verdict`, `ValidationResult`, `validate`, `CHALLENGE_MARKERS`, `detect`, `TRANSFORMS`, `apply_transform`.
|
|
119
119
|
|
|
120
120
|
## THE NO-SITE-NAME RULE (enforced in CI)
|
|
121
121
|
|
|
@@ -170,11 +170,11 @@ python3 -B -m engine URL [--selector S] [--device auto|desktop|mobile]
|
|
|
170
170
|
|
|
171
171
|
## TESTS
|
|
172
172
|
|
|
173
|
-
`tests/` — `test_surrogate.py` (staleness, proxy gating, short-circuit), `test_surrogate_validators.py`, `test_fetch_chain.py`, `test_playwright_templates.py`, plus HTML/JSON fixtures under `tests/fixtures/`.
|
|
173
|
+
`tests/` (source checkout only; not shipped with the skill) — `test_surrogate.py` (staleness, proxy gating, short-circuit), `test_surrogate_validators.py`, `test_fetch_chain.py`, `test_playwright_templates.py`, `test_playwright_stealth.py`, `test_executor_timeout.py`, plus HTML/JSON fixtures under `tests/fixtures/`.
|
|
174
174
|
|
|
175
175
|
## NOTES
|
|
176
176
|
|
|
177
177
|
- `summary.py` emits an **R7 API-first hint** after >=3 challenge verdicts against a known WAF profile: look for `/api/`, `/graphql`, or `.json` endpoints, which usually carry weaker WAF protection than the HTML surface.
|
|
178
178
|
- `templates/` holds the Playwright JS templates (`playwright_real_chrome.js`, `playwright_mobile_chrome.js`) the executor drives.
|
|
179
179
|
- `url_transforms.py` transforms stay domain-agnostic (`mobile_subdomain`, `am_prefix`, `drop_www`).
|
|
180
|
-
- Parent:
|
|
180
|
+
- Parent (source checkout only; not shipped with the skill): `packages/shared-skills/AGENTS.md`.
|
|
@@ -25,13 +25,13 @@
|
|
|
25
25
|
mcporter call 'exa.web_search_exa(query: "query", numResults: 5)'
|
|
26
26
|
|
|
27
27
|
# 通用网页阅读
|
|
28
|
-
curl -s "https://r.jina.ai/URL"
|
|
28
|
+
curl -s -H "Authorization: Bearer ${JINA_API_KEY}" "https://r.jina.ai/URL"
|
|
29
29
|
|
|
30
30
|
# GitHub 搜索
|
|
31
31
|
gh search repos "query" --sort stars --limit 10
|
|
32
32
|
|
|
33
33
|
# Twitter 搜索
|
|
34
|
-
twitter search "query"
|
|
34
|
+
twitter search "query" -n 10
|
|
35
35
|
|
|
36
36
|
# YouTube/B站字幕
|
|
37
37
|
yt-dlp --write-sub --skip-download -o "/tmp/%(id)s" "URL"
|
|
@@ -25,5 +25,5 @@ mcporter call 'linkedin-scraper.search_jobs(keyword: "software engineer", limit:
|
|
|
25
25
|
如果 MCP 不可用,可以用 Jina Reader:
|
|
26
26
|
|
|
27
27
|
```bash
|
|
28
|
-
curl -s "https://r.jina.ai/https://linkedin.com/in/username"
|
|
28
|
+
curl -s -H "Authorization: Bearer ${JINA_API_KEY}" "https://r.jina.ai/https://linkedin.com/in/username"
|
|
29
29
|
```
|
|
@@ -105,7 +105,7 @@ twitter likes
|
|
|
105
105
|
|
|
106
106
|
```bash
|
|
107
107
|
# 使用 Jina Reader 读取
|
|
108
|
-
curl -s "https://r.jina.ai/https://weibo.com/USER_ID/POST_ID"
|
|
108
|
+
curl -s -H "Authorization: Bearer ${JINA_API_KEY}" "https://r.jina.ai/https://weibo.com/USER_ID/POST_ID"
|
|
109
109
|
```
|
|
110
110
|
|
|
111
111
|
> 微博主要通过网页抓取,推荐使用通用网页读取方式。
|
|
@@ -6,13 +6,13 @@
|
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
8
|
# 读取任意网页内容
|
|
9
|
-
curl -s "https://r.jina.ai/URL"
|
|
9
|
+
curl -s -H "Authorization: Bearer ${JINA_API_KEY}" "https://r.jina.ai/URL"
|
|
10
10
|
|
|
11
11
|
# 示例
|
|
12
|
-
curl -s "https://r.jina.ai/https://example.com/article"
|
|
12
|
+
curl -s -H "Authorization: Bearer ${JINA_API_KEY}" "https://r.jina.ai/https://example.com/article"
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
-
**适用场景**: 大多数网页可以直接用 Jina Reader
|
|
15
|
+
**适用场景**: 大多数网页可以直接用 Jina Reader 读取。匿名调用返回 401,必须带 `JINA_API_KEY`(见 [../insane-search/jina.md](../insane-search/jina.md))。
|
|
16
16
|
|
|
17
17
|
## Web Reader (MCP)
|
|
18
18
|
|
|
@@ -69,7 +69,7 @@ for e in feedparser.parse('FEED_URL').entries[:5]:
|
|
|
69
69
|
|
|
70
70
|
| 场景 | 推荐工具 |
|
|
71
71
|
|-----|---------|
|
|
72
|
-
| 通用网页 | Jina Reader (`curl r.jina.ai`) |
|
|
72
|
+
| 通用网页 | Jina Reader (`curl r.jina.ai`,需 `JINA_API_KEY`) |
|
|
73
73
|
| 需要图片/格式控制 | web-reader MCP |
|
|
74
74
|
| 微信公众号 | Exa (搜索+阅读) / Camoufox (可选阅读) |
|
|
75
75
|
| RSS 订阅 | feedparser |
|
|
@@ -29,7 +29,8 @@ page that only a signed-in user can reach belongs to the attached engine, not to
|
|
|
29
29
|
|
|
30
30
|
## Cookie login limits
|
|
31
31
|
|
|
32
|
-
`scripts/extract_cookies.py` still exports cookies from a local browser
|
|
32
|
+
`scripts/extract_cookies.py` still exports cookies from a local browser's default profile store (run it only where
|
|
33
|
+
that profile is not the user's live one; see `../SKILL.md`, Cookie login); inject them with
|
|
33
34
|
`injectCookies(page, cookies)` into an **owned** profile. It sanitizes the set (drops expired
|
|
34
35
|
entries, keeps host-prefixed cookies secure and root-scoped). Limits that do not change:
|
|
35
36
|
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
2. 즉시 다음을 실행:
|
|
18
18
|
```bash
|
|
19
19
|
python3 -B -m engine "<URL>" [--selector "<CSS>"] [--device auto|desktop|mobile] [--trace] \
|
|
20
|
-
[--
|
|
20
|
+
[--timeout 25] [--max-attempts 12] [--no-playwright] [--allow-proxy] [--json]
|
|
21
21
|
```
|
|
22
22
|
3. 종료코드 0(ok) 또는 1(fail) 받은 뒤 판단. trace를 먼저 읽고 재시도 결정.
|
|
23
23
|
4. 실패 시에만 `--trace --json`으로 재호출해서 원인 진단 후 `--device` 또는 `user_hint` 조정.
|
|
@@ -124,7 +124,7 @@
|
|
|
124
124
|
### 단일 진입점
|
|
125
125
|
|
|
126
126
|
```python
|
|
127
|
-
from
|
|
127
|
+
from engine import fetch # 스킬 디렉터리에서 실행 (패키지는 engine/)
|
|
128
128
|
|
|
129
129
|
result = fetch(
|
|
130
130
|
"https://example.com/path",
|
|
@@ -136,15 +136,13 @@ result = fetch(
|
|
|
136
136
|
|
|
137
137
|
if result.ok:
|
|
138
138
|
print(result.verdict) # strong_ok | weak_ok
|
|
139
|
-
html = result.content # raw body
|
|
140
|
-
#
|
|
141
|
-
#
|
|
142
|
-
#
|
|
143
|
-
#
|
|
144
|
-
# 429/502/503/504는 probe에서 백오프 재시도(Retry-After 반영, 총 10초 캡);
|
|
145
|
-
# 끄기: enable_retry=False / --no-retry.
|
|
139
|
+
html = result.content # raw body (내장 추출/변환 없음)
|
|
140
|
+
# 필드: ok, content, final_url, verdict, profile_used, trace, summary,
|
|
141
|
+
# provenance, snapshot_timestamp, trust (engine/result_schema.py FetchResult).
|
|
142
|
+
# 업스트림 신버전의 content-rescue(PDF/JSON-LD 추출)와 Retry-After 백오프는
|
|
143
|
+
# 이 스냅샷에 없다 — engine/AGENTS.md의 WANT 목록. grid 시도 사이에는 짧은 jitter만 둔다.
|
|
146
144
|
else:
|
|
147
|
-
#
|
|
145
|
+
# result.trace로 원인 진단. 브라우저가 필요하면 아래 "needs_js_exec only 폴백 규칙"을 따른다
|
|
148
146
|
pass
|
|
149
147
|
```
|
|
150
148
|
|
|
@@ -191,16 +189,17 @@ report — FetchResult(ok, verdict, profile_used, trace, summary)
|
|
|
191
189
|
| 태그 | 실행기 | 언제 |
|
|
192
190
|
|------|--------|------|
|
|
193
191
|
| `needs_real_tls_stack` + `needs_js_exec` | `playwright_real_chrome.js` (로컬 Node) | Akamai Bot Manager 등 — Chromium 번들 TLS는 탐지됨 |
|
|
194
|
-
| `needs_js_exec` only |
|
|
192
|
+
| `needs_js_exec` only | 에이전트가 직접 띄우는 브라우저 (엔진은 stub만 반환, 아래 규칙) | Cloudflare 기본 방어 등 |
|
|
195
193
|
| `needs_mobile_context` (+ real_tls) | `playwright_mobile_chrome.js` | 모바일 디바이스 에뮬레이션 필요 |
|
|
196
194
|
|
|
197
195
|
자세한 선택 기준: [playwright.md](playwright.md).
|
|
198
196
|
|
|
199
|
-
###
|
|
197
|
+
### `needs_js_exec only` 폴백 규칙
|
|
200
198
|
|
|
201
|
-
`fetch_chain`의 `needs_js_exec only` 케이스는
|
|
199
|
+
`fetch_chain`의 `needs_js_exec only` 케이스는 subprocess 경로가 없어 **에이전트가 직접 브라우저를 다뤄야** 한다. 즉:
|
|
202
200
|
1. `result.summary`에 "Playwright MCP must be invoked from the Claude session"이 포함되면
|
|
203
|
-
2. `
|
|
201
|
+
2. 엔진 문구가 MCP를 가리켜도 기본 경로는 Tier 2a owned engine이다: js eval에서 omowright `connectPipe`, 스텔스는 `connectCloakProfile` (`../../SKILL.md` Tier 2, the `browser` skill's `references/owned-engine/`)
|
|
202
|
+
3. `mcp__playwright__*` 도구는 그 MCP가 이미 세션에 연결된 경우에만 쓴다. 없으면 새로 설치하지 않는다 ([playwright.md](playwright.md))
|
|
204
203
|
|
|
205
204
|
## Phase 2 — 수동 개입 (옵션)
|
|
206
205
|
|
|
@@ -233,7 +232,7 @@ Tier 1 추출 폴백 전용이며 에이전트가 직접 브라우저를 다루
|
|
|
233
232
|
|
|
234
233
|
```bash
|
|
235
234
|
# 범용 웹 (Jina Reader — 일반 HTML만, WAF 사이트엔 무효)
|
|
236
|
-
curl -s "https://r.jina.ai/{URL}"
|
|
235
|
+
curl -s -H "Authorization: Bearer ${JINA_API_KEY}" "https://r.jina.ai/{URL}"
|
|
237
236
|
|
|
238
237
|
# yt-dlp — 1,858 사이트 미디어 메타데이터
|
|
239
238
|
yt-dlp --dump-json "URL"
|
|
@@ -290,7 +289,7 @@ yt-dlp --write-sub --write-auto-sub --sub-lang "en,ko" --skip-download -o "/tmp/
|
|
|
290
289
|
| 파일 | 언제 읽는가 | 무엇을 다루는가 |
|
|
291
290
|
|------|-------------|-----------------|
|
|
292
291
|
| [`tls-impersonate.md`](tls-impersonate.md) | curl_cffi 격자가 전부 `challenge`/`blocked`로 끝날 때, 새 impersonate 타겟을 `waf_profiles.yaml`에 추가할 때 | curl_cffi로 Safari/Chrome/Firefox TLS(JA3/JA4) 지문 복제하는 방법, WAF(Akamai/Cloudflare/F5 등)별 최적 타겟 조합, 임퍼소네이션 타겟 버전 목록, `tls_impersonate_avoid`의 실증 근거 |
|
|
293
|
-
| [`playwright.md`](playwright.md) | engine이 Playwright fallback으로 넘어가는데 MCP/Local Chrome 중 어디로 갈지 확인 필요할 때 | Approach 1 (`mcp__playwright__
|
|
292
|
+
| [`playwright.md`](playwright.md) | engine이 Playwright fallback으로 넘어가는데 MCP/Local Chrome 중 어디로 갈지 확인 필요할 때 | Approach 1 (이미 연결된 경우의 `mcp__playwright__*`, 없으면 omowright owned engine — Cloudflare급 챌린지), Approach 2 (Local Node + `channel:'chrome'` + stealth — Akamai Bot Manager급), 템플릿 파라미터 규격 |
|
|
294
293
|
| [`fallback.md`](fallback.md) | `verdict`가 애매하거나 Phase 전환 타이밍 결정 필요할 때 | engine의 Phase 0→1→2→3 에스컬레이션 원칙, 응답 성공/실패 판정 기준 세부, 각 Phase 종료 조건 |
|
|
295
294
|
| [`metadata.md`](metadata.md) | 본문 전체를 못 가져왔지만 제목·요약·가격·저자 같은 핵심만이라도 필요할 때 | OGP 메타 태그, JSON-LD (Schema.org), Twitter Card 파싱, 구조화 데이터 추출 패턴 |
|
|
296
295
|
|
|
@@ -298,7 +297,7 @@ yt-dlp --write-sub --write-auto-sub --sub-lang "en,ko" --skip-download -o "/tmp/
|
|
|
298
297
|
|
|
299
298
|
| 파일 | 언제 읽는가 | 무엇을 다루는가 |
|
|
300
299
|
|------|-------------|-----------------|
|
|
301
|
-
| [`jina.md`](jina.md) | WAF 없는 일반 웹(블로그·뉴스·Wiki)의 깨끗한 마크다운 추출 필요할 때 | `r.jina.ai/URL`
|
|
300
|
+
| [`jina.md`](jina.md) | WAF 없는 일반 웹(블로그·뉴스·Wiki)의 깨끗한 마크다운 추출 필요할 때 | `r.jina.ai/URL` + `JINA_API_KEY` Bearer 헤더(익명 호출은 401)로 Puppeteer 기반 JS SPA 렌더링, 마크다운 변환 |
|
|
302
301
|
| [`cache-archive.md`](cache-archive.md) | 원본 사이트가 차단됐지만 과거 스냅샷으로라도 접근 필요할 때 | Wayback Machine CDX API, archive.today, AMP Cache (Google Cache는 2024-07 종료됨) |
|
|
303
302
|
| [`rss.md`](rss.md) | 뉴스·블로그·커뮤니티의 시계열 업데이트를 구조화해 받고 싶을 때 | RSS/Atom 자동 발견, 피드 파싱, 인증 불필요 — 가장 깔끔한 시계열 데이터 소스 |
|
|
304
303
|
|
package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/fallback.md
CHANGED
|
@@ -23,9 +23,12 @@
|
|
|
23
23
|
|
|
24
24
|
## Phase 1: 경량 프로브 (병렬)
|
|
25
25
|
|
|
26
|
+
> **R1 ([README.md](README.md))**: 차단된 URL에는 WebFetch나 즉흥 curl을 쓰지 않는다. `python3 -B -m engine "<URL>"`이
|
|
27
|
+
> 아래 Phase 1-3(curl_cffi 프로브, Referer/변환/디바이스 격자, 서로게이트, Playwright 폴백)을 실행한다.
|
|
28
|
+
> 이 문서는 `--trace` 출력을 읽기 위한 단계 설명이다.
|
|
29
|
+
|
|
26
30
|
**먼저 시도** (동시):
|
|
27
|
-
-
|
|
28
|
-
- Jina Reader (기본 / JSON / SPA 모드)
|
|
31
|
+
- Jina Reader (기본 / JSON / SPA 모드, `JINA_API_KEY` 있을 때만)
|
|
29
32
|
- curl Chrome Desktop UA
|
|
30
33
|
|
|
31
34
|
**아직 성공 없으면 추가 시도**:
|
|
@@ -34,7 +37,6 @@
|
|
|
34
37
|
- URL 변형 시도: `.json`, `/rss`, `/feed`
|
|
35
38
|
|
|
36
39
|
**사이드카** (1차와 동시, low-trust):
|
|
37
|
-
- Google AMP 캐시
|
|
38
40
|
- archive.today
|
|
39
41
|
- Wayback Machine
|
|
40
42
|
→ **원본이 하나라도 성공하면 사이드카는 참고만.** 전부 실패 시에만 사이드카 채택 (provenance 태깅 필수)
|
|
@@ -90,7 +92,7 @@ for target in TARGETS:
|
|
|
90
92
|
session = requests.Session(impersonate=target)
|
|
91
93
|
session.headers.update(HEADERS)
|
|
92
94
|
resp = session.get("{URL}", timeout=20)
|
|
93
|
-
if resp.status_code == 200 and len(resp.text)
|
|
95
|
+
if resp.status_code == 200 and len(resp.text) >= 3072 and not any(m in resp.text for m in ("Access Denied", "Just a moment...", "DataDome", "sec-if-cpt-container")):
|
|
94
96
|
# 성공 — JSON-LD도 같이 추출
|
|
95
97
|
break
|
|
96
98
|
except:
|
|
@@ -103,7 +105,7 @@ for target in TARGETS:
|
|
|
103
105
|
|
|
104
106
|
---
|
|
105
107
|
|
|
106
|
-
## Phase 3: Playwright MCP
|
|
108
|
+
## Phase 3: 브라우저 (owned engine, 또는 이미 연결된 Playwright MCP)
|
|
107
109
|
|
|
108
110
|
**조건**: Phase 2도 실패 또는 JS 챌린지/CAPTCHA 감지
|
|
109
111
|
|
|
@@ -114,7 +116,9 @@ browser_evaluate → () => document.body.innerText (Light Mode — 먼저)
|
|
|
114
116
|
필요 시 browser_snapshot → 접근성 트리 전체
|
|
115
117
|
```
|
|
116
118
|
|
|
117
|
-
|
|
119
|
+
위 흐름은 Playwright MCP가 이미 세션에 연결된 경우의 도구 이름이다. 없으면 같은 단계를 Tier 2a owned engine(js eval의 omowright `connectPipe` / `connectCloakProfile`)으로 실행한다 — [README.md](README.md) "`needs_js_exec only` 폴백 규칙".
|
|
120
|
+
|
|
121
|
+
**API 발견**: `browser_network_requests`(MCP) 또는 owned engine의 `createNetworkSnoop`(the `browser` skill's `references/owned-engine/network.md`)로 숨은 JSON API를 찾으면 이후 curl_cffi로 재사용 가능.
|
|
118
122
|
|
|
119
123
|
상세: [playwright.md](playwright.md)
|
|
120
124
|
|