@monoes/monomindcli 2.16.1 → 2.16.3
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/.claude/agents/architecture/system-design/arch-system-design.md +4 -1
- package/.claude/agents/consensus/quorum-manager.md +3 -0
- package/.claude/agents/consensus/security-manager.md +4 -1
- package/.claude/agents/core/coder.md +4 -1
- package/.claude/agents/core/coordinator.md +3 -0
- package/.claude/agents/core/planner.md +4 -1
- package/.claude/agents/core/researcher.md +4 -1
- package/.claude/agents/core/reviewer.md +4 -1
- package/.claude/agents/core/tester.md +4 -1
- package/.claude/agents/design/design-monodesign.md +4 -1
- package/.claude/agents/engineering/engineering-ai-data-remediation-engineer.md +4 -1
- package/.claude/agents/engineering/engineering-ai-engineer.md +4 -1
- package/.claude/agents/engineering/engineering-autonomous-optimization-architect.md +3 -0
- package/.claude/agents/engineering/engineering-backend-architect.md +4 -1
- package/.claude/agents/engineering/engineering-code-reviewer.md +5 -0
- package/.claude/agents/engineering/engineering-data-engineer.md +4 -1
- package/.claude/agents/engineering/engineering-database-optimizer.md +4 -1
- package/.claude/agents/engineering/engineering-devops-automator.md +3 -0
- package/.claude/agents/engineering/engineering-embedded-firmware-engineer.md +3 -0
- package/.claude/agents/engineering/engineering-feishu-integration-developer.md +4 -1
- package/.claude/agents/engineering/engineering-frontend-developer.md +3 -0
- package/.claude/agents/engineering/engineering-git-workflow-master.md +4 -1
- package/.claude/agents/engineering/engineering-incident-response-commander.md +4 -1
- package/.claude/agents/engineering/engineering-mobile-app-builder.md +3 -0
- package/.claude/agents/engineering/engineering-rapid-prototyper.md +3 -0
- package/.claude/agents/engineering/engineering-security-engineer.md +4 -1
- package/.claude/agents/engineering/engineering-senior-developer.md +3 -0
- package/.claude/agents/engineering/engineering-software-architect.md +4 -1
- package/.claude/agents/engineering/engineering-solidity-smart-contract-engineer.md +4 -1
- package/.claude/agents/engineering/engineering-sre.md +3 -0
- package/.claude/agents/engineering/engineering-technical-writer.md +4 -1
- package/.claude/agents/engineering/engineering-threat-detection-engineer.md +4 -1
- package/.claude/agents/engineering/engineering-wechat-mini-program-developer.md +4 -1
- package/.claude/agents/github/github-modes.md +4 -2
- package/.claude/agents/github/issue-tracker.md +4 -2
- package/.claude/agents/github/monoswarm-code-review.md +4 -2
- package/.claude/agents/github/monoswarm-issue.md +5 -0
- package/.claude/agents/github/monoswarm-multi-repo.md +4 -1
- package/.claude/agents/github/monoswarm-pr.md +5 -0
- package/.claude/agents/github/pr-manager.md +4 -2
- package/.claude/agents/github/project-board-sync.md +4 -2
- package/.claude/agents/github/release-manager.md +4 -2
- package/.claude/agents/github/repo-architect.md +4 -2
- package/.claude/agents/github/sync-coordinator.md +4 -2
- package/.claude/agents/github/workflow-automation.md +4 -2
- package/.claude/agents/goal/goal-planner.md +16 -2
- package/.claude/agents/marketing/marketing-competitive-content.md +4 -1
- package/.claude/agents/marketing/marketing-cro-specialist.md +4 -1
- package/.claude/agents/marketing/marketing-email-specialist.md +4 -1
- package/.claude/agents/marketing/marketing-launch-strategist.md +4 -1
- package/.claude/agents/marketing/marketing-pricing-strategist.md +4 -1
- package/.claude/agents/monoswarm/collective-intelligence-coordinator.md +3 -0
- package/.claude/agents/monoswarm/mesh-coordinator.md +3 -0
- package/.claude/agents/monoswarm/monoswarm-memory-manager.md +4 -2
- package/.claude/agents/monoswarm/scout-explorer.md +4 -2
- package/.claude/agents/monoswarm/worker-specialist.md +3 -0
- package/.claude/agents/optimization/benchmark-suite.md +3 -0
- package/.claude/agents/optimization/load-balancer.md +3 -0
- package/.claude/agents/optimization/performance-monitor.md +3 -0
- package/.claude/agents/optimization/resource-allocator.md +3 -0
- package/.claude/agents/optimization/topology-optimizer.md +3 -0
- package/.claude/agents/specialists/integration-architect.md +4 -2
- package/.claude/agents/specialized/agentic-identity-trust.md +4 -1
- package/.claude/agents/specialized/agents-orchestrator.md +3 -0
- package/.claude/agents/specialized/automation-governance-architect.md +3 -0
- package/.claude/agents/specialized/blockchain-security-auditor.md +4 -1
- package/.claude/agents/specialized/compliance-auditor.md +4 -1
- package/.claude/agents/specialized/identity-graph-operator.md +4 -1
- package/.claude/agents/specialized/lsp-index-engineer.md +3 -0
- package/.claude/agents/specialized/mobile/spec-mobile-react-native.md +5 -0
- package/.claude/agents/specialized/specialized-cultural-intelligence-strategist.md +3 -0
- package/.claude/agents/specialized/specialized-developer-advocate.md +4 -1
- package/.claude/agents/specialized/specialized-document-generator.md +4 -1
- package/.claude/agents/specialized/specialized-mcp-builder.md +3 -0
- package/.claude/agents/specialized/specialized-model-qa.md +4 -1
- package/.claude/agents/specialized/specialized-workflow-architect.md +4 -1
- package/.claude/agents/specialized/zk-steward.md +4 -1
- package/.claude/agents/templates/automation-smart-agent.md +4 -1
- package/.claude/agents/templates/coordinator-monoswarm-init.md +4 -1
- package/.claude/agents/testing/production-validator.md +3 -0
- package/.claude/agents/testing/tdd-london-monoswarm.md +3 -0
- package/.claude/agents/testing/testing-accessibility-auditor.md +4 -1
- package/.claude/agents/testing/testing-api-tester.md +4 -1
- package/.claude/agents/testing/testing-evidence-collector.md +3 -0
- package/.claude/agents/testing/testing-performance-benchmarker.md +4 -1
- package/.claude/agents/testing/testing-test-results-analyzer.md +4 -1
- package/.claude/agents/testing/testing-tool-evaluator.md +4 -1
- package/.claude/agents/testing/testing-workflow-optimizer.md +4 -1
- package/.claude/commands/agents/agent-types.md +7 -5
- package/.claude/commands/mastermind/code-review.md +5 -5
- package/.claude/commands/mastermind/content.md +8 -2
- package/.claude/commands/mastermind/createtask.md +2 -2
- package/.claude/commands/mastermind/do.md +18 -36
- package/.claude/commands/mastermind/finance.md +8 -2
- package/.claude/commands/mastermind/ideate.md +4 -4
- package/.claude/commands/mastermind/improve.md +3 -3
- package/.claude/commands/mastermind/marketing.md +8 -2
- package/.claude/commands/mastermind/master.md +63 -45
- package/.claude/commands/mastermind/monoswarm.md +7 -5
- package/.claude/commands/mastermind/ops.md +8 -2
- package/.claude/commands/mastermind/sales.md +8 -2
- package/.claude/commands/mastermind.md +7 -7
- package/.claude/commands/monoswarm/analysis.md +1 -1
- package/.claude/commands/monoswarm/development.md +1 -1
- package/.claude/commands/monoswarm/maintenance.md +1 -1
- package/.claude/commands/monoswarm/optimization.md +2 -1
- package/.claude/commands/monoswarm/research.md +1 -1
- package/.claude/commands/monoswarm/testing.md +1 -1
- package/.claude/commands/pair/examples.md +3 -2
- package/.claude/commands/pair/modes.md +3 -3
- package/.claude/helpers/build-skill-registry.cjs +186 -26
- package/.claude/helpers/handlers/agent-start-handler.cjs +3 -0
- package/.claude/helpers/handlers/capture-handler.cjs +22 -14
- package/.claude/helpers/handlers/edit-handler.cjs +15 -13
- package/.claude/helpers/handlers/pick-core.cjs +445 -0
- package/.claude/helpers/handlers/route-handler.cjs +87 -180
- package/.claude/helpers/handlers/session-handler.cjs +44 -62
- package/.claude/helpers/handlers/session-restore-handler.cjs +5 -1
- package/.claude/helpers/handlers/task-handler.cjs +11 -6
- package/.claude/helpers/hook-handler.cjs +9 -2
- package/.claude/helpers/jev-catalog.cjs +225 -0
- package/.claude/helpers/jev-picker.cjs +36 -147
- package/.claude/helpers/monograph-freshen.cjs +31 -113
- package/.claude/helpers/org-skill-index.cjs +230 -0
- package/.claude/helpers/pick-rank.cjs +221 -0
- package/.claude/helpers/pick-stats.cjs +413 -0
- package/.claude/helpers/router.cjs +7 -379
- package/.claude/helpers/utils/monograph-resolve.cjs +505 -0
- package/.claude/helpers/utils/monograph.cjs +8 -51
- package/.claude/settings.json +51 -41
- package/.claude/skills/hooks-automation/SKILL.md +4 -4
- package/.claude/skills/mastermind-access/SKILL.md +4 -3
- package/.claude/skills/mastermind-activity/SKILL.md +3 -2
- package/.claude/skills/mastermind-adapter-manager/SKILL.md +2 -1
- package/.claude/skills/mastermind-adapters/SKILL.md +2 -1
- package/.claude/skills/mastermind-agent-detail/SKILL.md +5 -4
- package/.claude/skills/mastermind-agent-select/SKILL.md +99 -100
- package/.claude/skills/mastermind-agents/SKILL.md +2 -1
- package/.claude/skills/mastermind-approval-detail/SKILL.md +2 -1
- package/.claude/skills/mastermind-backup/SKILL.md +2 -1
- package/.claude/skills/mastermind-bootstrap/SKILL.md +2 -2
- package/.claude/skills/mastermind-budgets/SKILL.md +4 -3
- package/.claude/skills/mastermind-createorg/SKILL.md +23 -5
- package/.claude/skills/mastermind-delegation/SKILL.md +11 -19
- package/.claude/skills/mastermind-diagnose/SKILL.md +3 -3
- package/.claude/skills/mastermind-env/SKILL.md +2 -1
- package/.claude/skills/mastermind-environments/SKILL.md +2 -1
- package/.claude/skills/mastermind-execute/SKILL.md +1 -1
- package/.claude/skills/mastermind-export/SKILL.md +2 -1
- package/.claude/skills/mastermind-goal-detail/SKILL.md +3 -2
- package/.claude/skills/mastermind-goals/SKILL.md +3 -2
- package/.claude/skills/mastermind-idea/SKILL.md +52 -92
- package/.claude/skills/mastermind-import/SKILL.md +2 -1
- package/.claude/skills/mastermind-inbox/SKILL.md +3 -2
- package/.claude/skills/mastermind-instance/SKILL.md +3 -2
- package/.claude/skills/mastermind-invite-landing/SKILL.md +3 -2
- package/.claude/skills/mastermind-invites/SKILL.md +3 -2
- package/.claude/skills/mastermind-issue-detail/SKILL.md +4 -3
- package/.claude/skills/mastermind-issues/SKILL.md +4 -3
- package/.claude/skills/mastermind-join-queue/SKILL.md +5 -4
- package/.claude/skills/mastermind-liveness/SKILL.md +5 -4
- package/.claude/skills/mastermind-monitor/SKILL.md +15 -15
- package/.claude/skills/mastermind-my-issues/SKILL.md +2 -1
- package/.claude/skills/mastermind-new-agent/SKILL.md +120 -137
- package/.claude/skills/mastermind-org-settings/SKILL.md +6 -5
- package/.claude/skills/mastermind-orgs/SKILL.md +1 -0
- package/.claude/skills/mastermind-orgstatus/SKILL.md +2 -1
- package/.claude/skills/mastermind-plan-to-tasks/SKILL.md +1 -1
- package/.claude/skills/mastermind-plugin-manager/SKILL.md +4 -3
- package/.claude/skills/mastermind-plugin-settings/SKILL.md +5 -4
- package/.claude/skills/mastermind-plugins/SKILL.md +3 -2
- package/.claude/skills/mastermind-profile/SKILL.md +2 -1
- package/.claude/skills/mastermind-protocol/SKILL.md +3 -3
- package/.claude/skills/mastermind-release/SKILL.md +13 -8
- package/.claude/skills/mastermind-research/SKILL.md +10 -8
- package/.claude/skills/mastermind-review/SKILL.md +16 -11
- package/.claude/skills/mastermind-routine-detail/SKILL.md +2 -1
- package/.claude/skills/mastermind-routines/SKILL.md +3 -2
- package/.claude/skills/mastermind-search/SKILL.md +2 -1
- package/.claude/skills/mastermind-secrets/SKILL.md +3 -2
- package/.claude/skills/mastermind-skills/SKILL.md +2 -1
- package/.claude/skills/mastermind-stoporg/SKILL.md +1 -0
- package/.claude/skills/mastermind-tasks/SKILL.md +3 -2
- package/.claude/skills/mastermind-threads/SKILL.md +4 -3
- package/.claude/skills/mastermind-tree-control/SKILL.md +5 -4
- package/.claude/skills/mastermind-workspace-detail/SKILL.md +4 -3
- package/.claude/skills/mastermind-workspaces/SKILL.md +2 -1
- package/.claude/skills/monoswarm/SKILL.md +7 -5
- package/.claude/skills/specialagent/SKILL.md +32 -51
- package/README.md +1 -1
- package/dist/src/agents/registry-builder.d.ts +23 -2
- package/dist/src/agents/registry-builder.d.ts.map +1 -1
- package/dist/src/agents/registry-builder.js +64 -11
- package/dist/src/agents/registry-builder.js.map +1 -1
- package/dist/src/agents/registry-freshness.d.ts +21 -0
- package/dist/src/agents/registry-freshness.d.ts.map +1 -0
- package/dist/src/agents/registry-freshness.js +94 -0
- package/dist/src/agents/registry-freshness.js.map +1 -0
- package/dist/src/commands/agent-lifecycle.d.ts +11 -5
- package/dist/src/commands/agent-lifecycle.d.ts.map +1 -1
- package/dist/src/commands/agent-lifecycle.js +78 -42
- package/dist/src/commands/agent-lifecycle.js.map +1 -1
- package/dist/src/commands/doctor-env-checks.d.ts +18 -3
- package/dist/src/commands/doctor-env-checks.d.ts.map +1 -1
- package/dist/src/commands/doctor-env-checks.js +35 -16
- package/dist/src/commands/doctor-env-checks.js.map +1 -1
- package/dist/src/commands/doctor-fresh-install.d.ts +9 -0
- package/dist/src/commands/doctor-fresh-install.d.ts.map +1 -0
- package/dist/src/commands/doctor-fresh-install.js +43 -0
- package/dist/src/commands/doctor-fresh-install.js.map +1 -0
- package/dist/src/commands/doctor-hook-monograph-checks.d.ts +10 -0
- package/dist/src/commands/doctor-hook-monograph-checks.d.ts.map +1 -0
- package/dist/src/commands/doctor-hook-monograph-checks.js +88 -0
- package/dist/src/commands/doctor-hook-monograph-checks.js.map +1 -0
- package/dist/src/commands/doctor-hook-settings-checks.d.ts +5 -0
- package/dist/src/commands/doctor-hook-settings-checks.d.ts.map +1 -0
- package/dist/src/commands/doctor-hook-settings-checks.js +50 -0
- package/dist/src/commands/doctor-hook-settings-checks.js.map +1 -0
- package/dist/src/commands/doctor-json.d.ts +41 -0
- package/dist/src/commands/doctor-json.d.ts.map +1 -0
- package/dist/src/commands/doctor-json.js +60 -0
- package/dist/src/commands/doctor-json.js.map +1 -0
- package/dist/src/commands/doctor-mode.d.ts +28 -0
- package/dist/src/commands/doctor-mode.d.ts.map +1 -0
- package/dist/src/commands/doctor-mode.js +109 -0
- package/dist/src/commands/doctor-mode.js.map +1 -0
- package/dist/src/commands/doctor-monoes-checks.d.ts.map +1 -1
- package/dist/src/commands/doctor-monoes-checks.js +3 -1
- package/dist/src/commands/doctor-monoes-checks.js.map +1 -1
- package/dist/src/commands/doctor-pick-checks.d.ts +19 -0
- package/dist/src/commands/doctor-pick-checks.d.ts.map +1 -0
- package/dist/src/commands/doctor-pick-checks.js +164 -0
- package/dist/src/commands/doctor-pick-checks.js.map +1 -0
- package/dist/src/commands/doctor-project-checks.d.ts +3 -1
- package/dist/src/commands/doctor-project-checks.d.ts.map +1 -1
- package/dist/src/commands/doctor-project-checks.js +67 -20
- package/dist/src/commands/doctor-project-checks.js.map +1 -1
- package/dist/src/commands/doctor.d.ts.map +1 -1
- package/dist/src/commands/doctor.js +325 -333
- package/dist/src/commands/doctor.js.map +1 -1
- package/dist/src/commands/hooks-coverage-routing.js +1 -1
- package/dist/src/commands/hooks-coverage-routing.js.map +1 -1
- package/dist/src/commands/hooks-coverage-utils.js +1 -1
- package/dist/src/commands/hooks-coverage-utils.js.map +1 -1
- package/dist/src/commands/hooks-routing-commands.js +1 -1
- package/dist/src/commands/init-upgrade.d.ts.map +1 -1
- package/dist/src/commands/init-upgrade.js +4 -0
- package/dist/src/commands/init-upgrade.js.map +1 -1
- package/dist/src/commands/monograph.d.ts.map +1 -1
- package/dist/src/commands/monograph.js +16 -1
- package/dist/src/commands/monograph.js.map +1 -1
- package/dist/src/commands/monoswarm.d.ts.map +1 -1
- package/dist/src/commands/monoswarm.js +16 -10
- package/dist/src/commands/monoswarm.js.map +1 -1
- package/dist/src/commands/pick.d.ts.map +1 -1
- package/dist/src/commands/pick.js +66 -16
- package/dist/src/commands/pick.js.map +1 -1
- package/dist/src/commands/route.d.ts +2 -1
- package/dist/src/commands/route.d.ts.map +1 -1
- package/dist/src/commands/route.js +73 -117
- package/dist/src/commands/route.js.map +1 -1
- package/dist/src/decision/catalogs.d.ts +24 -3
- package/dist/src/decision/catalogs.d.ts.map +1 -1
- package/dist/src/decision/catalogs.js +100 -22
- package/dist/src/decision/catalogs.js.map +1 -1
- package/dist/src/decision/jev.d.ts +26 -6
- package/dist/src/decision/jev.d.ts.map +1 -1
- package/dist/src/decision/jev.js +15 -4
- package/dist/src/decision/jev.js.map +1 -1
- package/dist/src/decision/pick-eval.d.ts +67 -0
- package/dist/src/decision/pick-eval.d.ts.map +1 -0
- package/dist/src/decision/pick-eval.js +113 -0
- package/dist/src/decision/pick-eval.js.map +1 -0
- package/dist/src/decision/pick-stats.d.ts +49 -0
- package/dist/src/decision/pick-stats.d.ts.map +1 -0
- package/dist/src/decision/pick-stats.js +68 -0
- package/dist/src/decision/pick-stats.js.map +1 -0
- package/dist/src/decision/picks.d.ts +37 -6
- package/dist/src/decision/picks.d.ts.map +1 -1
- package/dist/src/decision/picks.js +67 -32
- package/dist/src/decision/picks.js.map +1 -1
- package/dist/src/index.d.ts +5 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +43 -22
- package/dist/src/index.js.map +1 -1
- package/dist/src/init/agent-refresh.d.ts +8 -0
- package/dist/src/init/agent-refresh.d.ts.map +1 -0
- package/dist/src/init/agent-refresh.js +89 -0
- package/dist/src/init/agent-refresh.js.map +1 -0
- package/dist/src/init/claudemd-generator.d.ts.map +1 -1
- package/dist/src/init/claudemd-generator.js +27 -9
- package/dist/src/init/claudemd-generator.js.map +1 -1
- package/dist/src/init/helpers-generator.d.ts +4 -1
- package/dist/src/init/helpers-generator.d.ts.map +1 -1
- package/dist/src/init/helpers-generator.js +84 -55
- package/dist/src/init/helpers-generator.js.map +1 -1
- package/dist/src/init/hook-settings.d.ts +57 -0
- package/dist/src/init/hook-settings.d.ts.map +1 -0
- package/dist/src/init/hook-settings.js +133 -0
- package/dist/src/init/hook-settings.js.map +1 -0
- package/dist/src/init/settings-generator.d.ts.map +1 -1
- package/dist/src/init/settings-generator.js +44 -25
- package/dist/src/init/settings-generator.js.map +1 -1
- package/dist/src/init/shared.d.ts +9 -0
- package/dist/src/init/shared.d.ts.map +1 -1
- package/dist/src/init/shared.js +22 -0
- package/dist/src/init/shared.js.map +1 -1
- package/dist/src/init/upgrade.d.ts +4 -0
- package/dist/src/init/upgrade.d.ts.map +1 -1
- package/dist/src/init/upgrade.js +123 -129
- package/dist/src/init/upgrade.js.map +1 -1
- package/dist/src/init/write-capabilities.d.ts.map +1 -1
- package/dist/src/init/write-capabilities.js +10 -33
- package/dist/src/init/write-capabilities.js.map +1 -1
- package/dist/src/init/write-claude.d.ts.map +1 -1
- package/dist/src/init/write-claude.js +5 -2
- package/dist/src/init/write-claude.js.map +1 -1
- package/dist/src/mcp-client.d.ts.map +1 -1
- package/dist/src/mcp-client.js +4 -0
- package/dist/src/mcp-client.js.map +1 -1
- package/dist/src/mcp-tools/agent-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/agent-tools.js +3 -0
- package/dist/src/mcp-tools/agent-tools.js.map +1 -1
- package/dist/src/mcp-tools/guidance-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/guidance-tools.js +19 -10
- package/dist/src/mcp-tools/guidance-tools.js.map +1 -1
- package/dist/src/mcp-tools/hooks-embedding.d.ts +1 -32
- package/dist/src/mcp-tools/hooks-embedding.d.ts.map +1 -1
- package/dist/src/mcp-tools/hooks-embedding.js +22 -200
- package/dist/src/mcp-tools/hooks-embedding.js.map +1 -1
- package/dist/src/mcp-tools/hooks-routing.d.ts.map +1 -1
- package/dist/src/mcp-tools/hooks-routing.js +77 -192
- package/dist/src/mcp-tools/hooks-routing.js.map +1 -1
- package/dist/src/mcp-tools/index.d.ts +1 -0
- package/dist/src/mcp-tools/index.d.ts.map +1 -1
- package/dist/src/mcp-tools/index.js +1 -0
- package/dist/src/mcp-tools/index.js.map +1 -1
- package/dist/src/mcp-tools/org-skill-tools.d.ts +4 -0
- package/dist/src/mcp-tools/org-skill-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/org-skill-tools.js +42 -0
- package/dist/src/mcp-tools/org-skill-tools.js.map +1 -0
- package/dist/src/mcp-tools/pick-tools.d.ts +4 -0
- package/dist/src/mcp-tools/pick-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/pick-tools.js +53 -0
- package/dist/src/mcp-tools/pick-tools.js.map +1 -0
- package/dist/src/monovector/coverage-router.d.ts +2 -1
- package/dist/src/monovector/coverage-router.d.ts.map +1 -1
- package/dist/src/monovector/coverage-router.js +6 -5
- package/dist/src/monovector/coverage-router.js.map +1 -1
- package/dist/src/monovector/coverage-tools.js +1 -1
- package/dist/src/monovector/coverage-tools.js.map +1 -1
- package/dist/src/monovector/index.d.ts +1 -1
- package/dist/src/monovector/index.d.ts.map +1 -1
- package/dist/src/monovector/index.js +11 -35
- package/dist/src/monovector/index.js.map +1 -1
- package/dist/src/monovector/route-outcomes.d.ts.map +1 -1
- package/dist/src/monovector/route-outcomes.js +89 -34
- package/dist/src/monovector/route-outcomes.js.map +1 -1
- package/dist/src/orgrt/bash-timeout.d.ts +14 -0
- package/dist/src/orgrt/bash-timeout.d.ts.map +1 -0
- package/dist/src/orgrt/bash-timeout.js +18 -0
- package/dist/src/orgrt/bash-timeout.js.map +1 -0
- package/dist/src/orgrt/block-recheck.d.ts +30 -0
- package/dist/src/orgrt/block-recheck.d.ts.map +1 -0
- package/dist/src/orgrt/block-recheck.js +81 -0
- package/dist/src/orgrt/block-recheck.js.map +1 -0
- package/dist/src/orgrt/completion-gate.d.ts +4 -0
- package/dist/src/orgrt/completion-gate.d.ts.map +1 -1
- package/dist/src/orgrt/completion-gate.js +22 -2
- package/dist/src/orgrt/completion-gate.js.map +1 -1
- package/dist/src/orgrt/daemon.d.ts +7 -13
- package/dist/src/orgrt/daemon.d.ts.map +1 -1
- package/dist/src/orgrt/daemon.js +18 -27
- package/dist/src/orgrt/daemon.js.map +1 -1
- package/dist/src/orgrt/decisions.d.ts +4 -9
- package/dist/src/orgrt/decisions.d.ts.map +1 -1
- package/dist/src/orgrt/decisions.js +44 -47
- package/dist/src/orgrt/decisions.js.map +1 -1
- package/dist/src/orgrt/dispatch-hold.d.ts +34 -0
- package/dist/src/orgrt/dispatch-hold.d.ts.map +1 -0
- package/dist/src/orgrt/dispatch-hold.js +75 -0
- package/dist/src/orgrt/dispatch-hold.js.map +1 -0
- package/dist/src/orgrt/mailbox.d.ts +14 -0
- package/dist/src/orgrt/mailbox.d.ts.map +1 -1
- package/dist/src/orgrt/mailbox.js +31 -1
- package/dist/src/orgrt/mailbox.js.map +1 -1
- package/dist/src/orgrt/runner-registry.d.ts +20 -0
- package/dist/src/orgrt/runner-registry.d.ts.map +1 -1
- package/dist/src/orgrt/runner-registry.js +39 -0
- package/dist/src/orgrt/runner-registry.js.map +1 -1
- package/dist/src/orgrt/sandbox-deny-write.d.ts +11 -1
- package/dist/src/orgrt/sandbox-deny-write.d.ts.map +1 -1
- package/dist/src/orgrt/sandbox-deny-write.js +23 -2
- package/dist/src/orgrt/sandbox-deny-write.js.map +1 -1
- package/dist/src/orgrt/sandbox-fault.d.ts +21 -7
- package/dist/src/orgrt/sandbox-fault.d.ts.map +1 -1
- package/dist/src/orgrt/sandbox-fault.js +92 -35
- package/dist/src/orgrt/sandbox-fault.js.map +1 -1
- package/dist/src/orgrt/session.d.ts +20 -10
- package/dist/src/orgrt/session.d.ts.map +1 -1
- package/dist/src/orgrt/session.js +60 -72
- package/dist/src/orgrt/session.js.map +1 -1
- package/dist/src/orgrt/skill-library.d.ts +4 -0
- package/dist/src/orgrt/skill-library.d.ts.map +1 -1
- package/dist/src/orgrt/skill-library.js +12 -0
- package/dist/src/orgrt/skill-library.js.map +1 -1
- package/dist/src/orgrt/skill-tools.d.ts +11 -0
- package/dist/src/orgrt/skill-tools.d.ts.map +1 -0
- package/dist/src/orgrt/skill-tools.js +40 -0
- package/dist/src/orgrt/skill-tools.js.map +1 -0
- package/dist/src/orgrt/task-cancel.d.ts +64 -0
- package/dist/src/orgrt/task-cancel.d.ts.map +1 -0
- package/dist/src/orgrt/task-cancel.js +134 -0
- package/dist/src/orgrt/task-cancel.js.map +1 -0
- package/dist/src/orgrt/task-dag.d.ts +18 -3
- package/dist/src/orgrt/task-dag.d.ts.map +1 -1
- package/dist/src/orgrt/task-dag.js +10 -4
- package/dist/src/orgrt/task-dag.js.map +1 -1
- package/dist/src/orgrt/task-match.d.ts +121 -0
- package/dist/src/orgrt/task-match.d.ts.map +1 -0
- package/dist/src/orgrt/task-match.js +241 -0
- package/dist/src/orgrt/task-match.js.map +1 -0
- package/dist/src/orgrt/task-provenance.d.ts +26 -0
- package/dist/src/orgrt/task-provenance.d.ts.map +1 -0
- package/dist/src/orgrt/task-provenance.js +93 -0
- package/dist/src/orgrt/task-provenance.js.map +1 -0
- package/dist/src/orgrt/task-tools.d.ts +24 -0
- package/dist/src/orgrt/task-tools.d.ts.map +1 -0
- package/dist/src/orgrt/task-tools.js +75 -0
- package/dist/src/orgrt/task-tools.js.map +1 -0
- package/dist/src/orgrt/types.d.ts +11 -0
- package/dist/src/orgrt/types.d.ts.map +1 -1
- package/dist/src/orgrt/types.js +18 -0
- package/dist/src/orgrt/types.js.map +1 -1
- package/dist/src/output.d.ts +6 -0
- package/dist/src/output.d.ts.map +1 -1
- package/dist/src/output.js +13 -2
- package/dist/src/output.js.map +1 -1
- package/dist/src/protocol-capabilities.d.ts +8 -1
- package/dist/src/protocol-capabilities.d.ts.map +1 -1
- package/dist/src/protocol-capabilities.js +10 -0
- package/dist/src/protocol-capabilities.js.map +1 -1
- package/dist/src/routing/agent-pick.d.ts +44 -0
- package/dist/src/routing/agent-pick.d.ts.map +1 -0
- package/dist/src/routing/agent-pick.js +114 -0
- package/dist/src/routing/agent-pick.js.map +1 -0
- package/dist/src/routing/pick-step.d.ts +26 -0
- package/dist/src/routing/pick-step.d.ts.map +1 -0
- package/dist/src/routing/pick-step.js +40 -0
- package/dist/src/routing/pick-step.js.map +1 -0
- package/dist/src/routing/route-layer-factory.d.ts.map +1 -1
- package/dist/src/routing/route-layer-factory.js +19 -17
- package/dist/src/routing/route-layer-factory.js.map +1 -1
- package/dist/src/utils/resource-governor.d.ts.map +1 -1
- package/dist/src/utils/resource-governor.js +55 -2
- package/dist/src/utils/resource-governor.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/org-skills/SOURCES.md +6 -6
- package/org-skills/TAGS.md +146 -0
- package/org-skills/ab-testing/SKILL.md +2 -2
- package/org-skills/accessibility-compliance/SKILL.md +2 -2
- package/org-skills/account-strategist/SKILL.md +2 -2
- package/org-skills/accounts-payable/SKILL.md +2 -2
- package/org-skills/ad-creative/SKILL.md +2 -2
- package/org-skills/adaptive-coordinator/SKILL.md +2 -2
- package/org-skills/adaptive-coordinator2/SKILL.md +2 -2
- package/org-skills/advanced-evaluation/SKILL.md +2 -2
- package/org-skills/adversarial-reviewer/SKILL.md +2 -2
- package/org-skills/agent-evaluation/SKILL.md +2 -2
- package/org-skills/agent-memory-systems/SKILL.md +2 -2
- package/org-skills/agent-tool-design/SKILL.md +2 -2
- package/org-skills/agile-product-owner/SKILL.md +2 -2
- package/org-skills/ai-citation/SKILL.md +2 -2
- package/org-skills/ai-engineer/SKILL.md +2 -2
- package/org-skills/ai-seo/SKILL.md +2 -2
- package/org-skills/analytics-reporter/SKILL.md +2 -2
- package/org-skills/analytics-tracking/SKILL.md +2 -2
- package/org-skills/android-clean-architecture/SKILL.md +2 -2
- package/org-skills/angular-architect/SKILL.md +2 -2
- package/org-skills/api-design/SKILL.md +2 -2
- package/org-skills/api-designer/SKILL.md +2 -2
- package/org-skills/api-tester/SKILL.md +2 -2
- package/org-skills/app-store-optimization/SKILL.md +2 -2
- package/org-skills/architecture-decision-records/SKILL.md +2 -2
- package/org-skills/architecture-designer/SKILL.md +2 -2
- package/org-skills/architecture-patterns/SKILL.md +2 -2
- package/org-skills/article-writing/SKILL.md +2 -2
- package/org-skills/auth-implementation-patterns/SKILL.md +2 -2
- package/org-skills/automation-governance/SKILL.md +2 -2
- package/org-skills/avoid-ai-writing/SKILL.md +2 -2
- package/org-skills/backend-dev/SKILL.md +2 -2
- package/org-skills/backend-patterns/SKILL.md +2 -2
- package/org-skills/bash-defensive-patterns/SKILL.md +2 -2
- package/org-skills/before-you-build/SKILL.md +2 -2
- package/org-skills/benchmark-methodology/SKILL.md +2 -2
- package/org-skills/benchmarker/SKILL.md +2 -2
- package/org-skills/blockchain-auditor/SKILL.md +2 -2
- package/org-skills/board-deck-builder/SKILL.md +2 -2
- package/org-skills/business-investment-advisor/SKILL.md +2 -2
- package/org-skills/byzantine-coord/SKILL.md +2 -2
- package/org-skills/canvas-design/SKILL.md +2 -2
- package/org-skills/carrier-relationship-management/SKILL.md +2 -2
- package/org-skills/case-analyst/SKILL.md +2 -2
- package/org-skills/ceo-advisor/SKILL.md +2 -2
- package/org-skills/cfo-advisor/SKILL.md +2 -2
- package/org-skills/change-management/SKILL.md +2 -2
- package/org-skills/changelog-automation/SKILL.md +2 -2
- package/org-skills/chro-advisor/SKILL.md +2 -2
- package/org-skills/churn-prevention/SKILL.md +2 -2
- package/org-skills/cicd-engineer/SKILL.md +2 -2
- package/org-skills/ciso-advisor/SKILL.md +2 -2
- package/org-skills/click-path-audit/SKILL.md +2 -2
- package/org-skills/cloud-architect/SKILL.md +2 -2
- package/org-skills/cloud-architecture/SKILL.md +2 -2
- package/org-skills/cmo-advisor/SKILL.md +2 -2
- package/org-skills/co-marketing/SKILL.md +2 -2
- package/org-skills/code-documenter/SKILL.md +2 -2
- package/org-skills/code-review-swarm/SKILL.md +2 -2
- package/org-skills/code-reviewer/SKILL.md +2 -2
- package/org-skills/coder/SKILL.md +2 -2
- package/org-skills/coding-standards/SKILL.md +2 -2
- package/org-skills/cold-email/SKILL.md +2 -2
- package/org-skills/collective-coord/SKILL.md +2 -2
- package/org-skills/community-marketing/SKILL.md +2 -2
- package/org-skills/competitive-landscape/SKILL.md +2 -2
- package/org-skills/competitive-platform-analysis/SKILL.md +2 -2
- package/org-skills/competitive-report-structure/SKILL.md +2 -2
- package/org-skills/competitive-teardown/SKILL.md +2 -2
- package/org-skills/competitor-comparison-pages/SKILL.md +2 -2
- package/org-skills/compliance-auditor/SKILL.md +2 -2
- package/org-skills/consensus-coordinator/SKILL.md +2 -2
- package/org-skills/content-creator/SKILL.md +2 -2
- package/org-skills/content-engine/SKILL.md +2 -2
- package/org-skills/content-strategy/SKILL.md +2 -2
- package/org-skills/context-compression/SKILL.md +2 -2
- package/org-skills/context-degradation/SKILL.md +2 -2
- package/org-skills/context-fundamentals/SKILL.md +2 -2
- package/org-skills/context-optimization/SKILL.md +2 -2
- package/org-skills/contract-and-proposal-writer/SKILL.md +1 -1
- package/org-skills/contract-first/SKILL.md +2 -2
- package/org-skills/coo-advisor/SKILL.md +2 -2
- package/org-skills/copy-editing/SKILL.md +2 -2
- package/org-skills/copywriting/SKILL.md +2 -2
- package/org-skills/cost-aware-llm-pipeline/SKILL.md +2 -2
- package/org-skills/cost-optimization/SKILL.md +2 -2
- package/org-skills/cpp-coding-standards/SKILL.md +2 -2
- package/org-skills/cpp-pro/SKILL.md +2 -2
- package/org-skills/cro-advisor/SKILL.md +2 -2
- package/org-skills/cro-specialist/SKILL.md +2 -2
- package/org-skills/csharp-developer/SKILL.md +2 -2
- package/org-skills/cto-advisor/SKILL.md +2 -2
- package/org-skills/culture-architect/SKILL.md +2 -2
- package/org-skills/customer-research/SKILL.md +2 -2
- package/org-skills/customs-trade-compliance/SKILL.md +2 -2
- package/org-skills/dart-flutter-patterns/SKILL.md +2 -2
- package/org-skills/dashboard-builder/SKILL.md +2 -2
- package/org-skills/data-consolidator/SKILL.md +2 -2
- package/org-skills/data-engineer/SKILL.md +2 -2
- package/org-skills/data-quality-frameworks/SKILL.md +2 -2
- package/org-skills/data-storytelling/SKILL.md +2 -2
- package/org-skills/database-migrations/SKILL.md +2 -2
- package/org-skills/database-optimizer/SKILL.md +2 -2
- package/org-skills/dbt-transformation-patterns/SKILL.md +2 -2
- package/org-skills/deal-strategist/SKILL.md +2 -2
- package/org-skills/debugging-wizard/SKILL.md +2 -2
- package/org-skills/deep-research/SKILL.md +2 -2
- package/org-skills/defender/SKILL.md +2 -2
- package/org-skills/dependency-upgrade/SKILL.md +2 -2
- package/org-skills/deployment-patterns/SKILL.md +2 -2
- package/org-skills/deployment-pipeline-design/SKILL.md +2 -2
- package/org-skills/design-system/SKILL.md +2 -2
- package/org-skills/design-system-patterns/SKILL.md +2 -2
- package/org-skills/devops-automator/SKILL.md +2 -2
- package/org-skills/devops-engineer/SKILL.md +2 -2
- package/org-skills/discovery-coach/SKILL.md +2 -2
- package/org-skills/django-expert/SKILL.md +2 -2
- package/org-skills/django-patterns/SKILL.md +2 -2
- package/org-skills/docker-patterns/SKILL.md +2 -2
- package/org-skills/dotnet-patterns/SKILL.md +2 -2
- package/org-skills/e2e-testing/SKILL.md +2 -2
- package/org-skills/email-marketing/SKILL.md +2 -2
- package/org-skills/email-sequences/SKILL.md +2 -2
- package/org-skills/embedded-firmware/SKILL.md +2 -2
- package/org-skills/embedded-systems/SKILL.md +2 -2
- package/org-skills/employment-contract-templates/SKILL.md +2 -2
- package/org-skills/energy-procurement/SKILL.md +2 -2
- package/org-skills/error-handling/SKILL.md +2 -2
- package/org-skills/event-marketing/SKILL.md +2 -2
- package/org-skills/evidence-collector/SKILL.md +2 -2
- package/org-skills/experiment-designer/SKILL.md +2 -2
- package/org-skills/experiment-tracker/SKILL.md +2 -2
- package/org-skills/experimental-design/SKILL.md +2 -2
- package/org-skills/fastapi-expert/SKILL.md +2 -2
- package/org-skills/fastapi-patterns/SKILL.md +2 -2
- package/org-skills/feedback-synthesizer/SKILL.md +2 -2
- package/org-skills/finance-tracker/SKILL.md +2 -2
- package/org-skills/finishing-a-development-branch/SKILL.md +2 -2
- package/org-skills/flutter-expert/SKILL.md +2 -2
- package/org-skills/focused-fix/SKILL.md +2 -2
- package/org-skills/free-tool-strategy/SKILL.md +2 -2
- package/org-skills/frontend-design/SKILL.md +2 -2
- package/org-skills/frontend-design-direction/SKILL.md +2 -2
- package/org-skills/frontend-developer/SKILL.md +2 -2
- package/org-skills/frontend-patterns/SKILL.md +2 -2
- package/org-skills/game-audio-engineer/SKILL.md +2 -2
- package/org-skills/game-designer/SKILL.md +2 -2
- package/org-skills/gdpr-data-handling/SKILL.md +2 -2
- package/org-skills/general-counsel-advisor/SKILL.md +2 -2
- package/org-skills/git-advanced-workflows/SKILL.md +2 -2
- package/org-skills/git-workflow/SKILL.md +2 -2
- package/org-skills/golang-patterns/SKILL.md +2 -2
- package/org-skills/golang-pro/SKILL.md +2 -2
- package/org-skills/harness-engineering/SKILL.md +2 -2
- package/org-skills/healthcare-phi-compliance/SKILL.md +2 -2
- package/org-skills/hexagonal-architecture/SKILL.md +2 -2
- package/org-skills/hierarchical-coord/SKILL.md +2 -2
- package/org-skills/huggingface-transformers/SKILL.md +2 -2
- package/org-skills/hypothesis-generation/SKILL.md +2 -2
- package/org-skills/incident-command-playbook/SKILL.md +2 -2
- package/org-skills/incident-commander/SKILL.md +2 -2
- package/org-skills/incident-runbook-templates/SKILL.md +2 -2
- package/org-skills/influencer-marketing/SKILL.md +2 -2
- package/org-skills/infrastructure/SKILL.md +2 -2
- package/org-skills/input-validator/SKILL.md +2 -2
- package/org-skills/intent-driven-development/SKILL.md +2 -2
- package/org-skills/inventory-demand-planning/SKILL.md +2 -2
- package/org-skills/investor-materials/SKILL.md +2 -2
- package/org-skills/ios-developer/SKILL.md +2 -2
- package/org-skills/isms-audit-expert/SKILL.md +2 -2
- package/org-skills/issue-tracker/SKILL.md +2 -2
- package/org-skills/java-architect/SKILL.md +2 -2
- package/org-skills/java-coding-standards/SKILL.md +2 -2
- package/org-skills/judge/SKILL.md +2 -2
- package/org-skills/kotlin-patterns/SKILL.md +2 -2
- package/org-skills/kotlin-specialist/SKILL.md +2 -2
- package/org-skills/kpi-dashboard-design/SKILL.md +2 -2
- package/org-skills/kubernetes-patterns/SKILL.md +2 -2
- package/org-skills/kubernetes-specialist/SKILL.md +2 -2
- package/org-skills/laravel-patterns/SKILL.md +2 -2
- package/org-skills/launch-strategist/SKILL.md +2 -2
- package/org-skills/launch-strategy/SKILL.md +2 -2
- package/org-skills/lead-magnets/SKILL.md +2 -2
- package/org-skills/legacy-modernizer/SKILL.md +2 -2
- package/org-skills/legal-compliance/SKILL.md +2 -2
- package/org-skills/level-designer/SKILL.md +2 -2
- package/org-skills/llm-cost-optimizer/SKILL.md +2 -2
- package/org-skills/llm-evaluation/SKILL.md +2 -2
- package/org-skills/llm-project-development/SKILL.md +2 -2
- package/org-skills/load-balancer/SKILL.md +2 -2
- package/org-skills/logistics-exception-management/SKILL.md +2 -2
- package/org-skills/long-horizon-prompting/SKILL.md +2 -2
- package/org-skills/make-interfaces-feel-better/SKILL.md +2 -2
- package/org-skills/markdown-mermaid-writing/SKILL.md +2 -2
- package/org-skills/market-research/SKILL.md +2 -2
- package/org-skills/market-research-reports/SKILL.md +2 -2
- package/org-skills/market-sizing-analysis/SKILL.md +2 -2
- package/org-skills/marketing-attribution/SKILL.md +2 -2
- package/org-skills/marketing-campaign/SKILL.md +2 -2
- package/org-skills/marketing-council/SKILL.md +2 -2
- package/org-skills/marketing-demand-acquisition/SKILL.md +2 -2
- package/org-skills/marketing-loops/SKILL.md +2 -2
- package/org-skills/marketing-plan/SKILL.md +2 -2
- package/org-skills/marketing-psychology/SKILL.md +2 -2
- package/org-skills/marketing-strategy-pmm/SKILL.md +2 -2
- package/org-skills/markitdown-document-conversion/SKILL.md +2 -2
- package/org-skills/mcp-builder/SKILL.md +2 -2
- package/org-skills/mcp-server-builder/SKILL.md +2 -2
- package/org-skills/mcp-server-patterns/SKILL.md +2 -2
- package/org-skills/memory-coordinator/SKILL.md +2 -2
- package/org-skills/mesh-coordinator/SKILL.md +2 -2
- package/org-skills/ml-developer/SKILL.md +2 -2
- package/org-skills/ml-pipeline/SKILL.md +2 -2
- package/org-skills/mle-workflow/SKILL.md +2 -2
- package/org-skills/mobile-app-builder/SKILL.md +2 -2
- package/org-skills/mobile-dev/SKILL.md +2 -2
- package/org-skills/model-qa/SKILL.md +2 -2
- package/org-skills/monitoring-expert/SKILL.md +2 -2
- package/org-skills/monodesign-ui-quality/SKILL.md +2 -2
- package/org-skills/monograph-code-navigation/SKILL.md +2 -2
- package/org-skills/monolean-minimal-change/SKILL.md +2 -2
- package/org-skills/multi-agent-patterns/SKILL.md +2 -2
- package/org-skills/mysql-patterns/SKILL.md +2 -2
- package/org-skills/narrative-designer/SKILL.md +2 -2
- package/org-skills/nextjs-developer/SKILL.md +2 -2
- package/org-skills/offer-design/SKILL.md +2 -2
- package/org-skills/onboarding-cro/SKILL.md +2 -2
- package/org-skills/outbound-strategist/SKILL.md +2 -2
- package/org-skills/page-cro/SKILL.md +2 -2
- package/org-skills/paid-ads/SKILL.md +2 -2
- package/org-skills/pandas-pro/SKILL.md +2 -2
- package/org-skills/path-validator/SKILL.md +2 -2
- package/org-skills/payment-agent/SKILL.md +2 -2
- package/org-skills/pci-compliance/SKILL.md +2 -2
- package/org-skills/perf-analyzer/SKILL.md +2 -2
- package/org-skills/php-pro/SKILL.md +2 -2
- package/org-skills/pipeline-analyst/SKILL.md +2 -2
- package/org-skills/planner/SKILL.md +2 -2
- package/org-skills/playwright-expert/SKILL.md +2 -2
- package/org-skills/postgres-patterns/SKILL.md +2 -2
- package/org-skills/postgresql-table-design/SKILL.md +2 -2
- package/org-skills/postmortem-writing/SKILL.md +2 -2
- package/org-skills/pr-manager/SKILL.md +2 -2
- package/org-skills/pricing-strategist/SKILL.md +2 -2
- package/org-skills/pricing-strategy/SKILL.md +2 -2
- package/org-skills/prisma-patterns/SKILL.md +2 -2
- package/org-skills/product-capability/SKILL.md +2 -2
- package/org-skills/product-discovery/SKILL.md +2 -2
- package/org-skills/product-lens/SKILL.md +2 -2
- package/org-skills/product-manager/SKILL.md +2 -2
- package/org-skills/product-marketing-context/SKILL.md +2 -2
- package/org-skills/production-audit/SKILL.md +2 -2
- package/org-skills/production-scheduling/SKILL.md +2 -2
- package/org-skills/production-validator/SKILL.md +2 -2
- package/org-skills/programmatic-seo/SKILL.md +2 -2
- package/org-skills/project-shepherd/SKILL.md +2 -2
- package/org-skills/prompt-engineer/SKILL.md +2 -2
- package/org-skills/proposal-strategist/SKILL.md +2 -2
- package/org-skills/prosecutor/SKILL.md +2 -2
- package/org-skills/public-relations/SKILL.md +2 -2
- package/org-skills/pymc-bayesian-modeling/SKILL.md +2 -2
- package/org-skills/python-patterns/SKILL.md +2 -2
- package/org-skills/python-pro/SKILL.md +2 -2
- package/org-skills/python-testing/SKILL.md +2 -2
- package/org-skills/quality-nonconformance/SKILL.md +2 -2
- package/org-skills/queen-coordinator/SKILL.md +2 -2
- package/org-skills/quorum-manager/SKILL.md +2 -2
- package/org-skills/raft-manager/SKILL.md +2 -2
- package/org-skills/rag-architect/SKILL.md +2 -2
- package/org-skills/rails-patterns/SKILL.md +2 -2
- package/org-skills/react-expert/SKILL.md +2 -2
- package/org-skills/react-native-expert/SKILL.md +2 -2
- package/org-skills/react-native-patterns/SKILL.md +2 -2
- package/org-skills/react-patterns/SKILL.md +2 -2
- package/org-skills/react-performance/SKILL.md +2 -2
- package/org-skills/react-testing/SKILL.md +2 -2
- package/org-skills/reality-checker/SKILL.md +2 -2
- package/org-skills/receiving-code-review/SKILL.md +2 -2
- package/org-skills/recruitment/SKILL.md +2 -2
- package/org-skills/redis-patterns/SKILL.md +2 -2
- package/org-skills/referral-programs/SKILL.md +2 -2
- package/org-skills/release-manager/SKILL.md +2 -2
- package/org-skills/repo-architect/SKILL.md +2 -2
- package/org-skills/researcher/SKILL.md +2 -2
- package/org-skills/resource-allocator/SKILL.md +2 -2
- package/org-skills/responsive-design/SKILL.md +2 -2
- package/org-skills/returns-reverse-logistics/SKILL.md +2 -2
- package/org-skills/reviewer/SKILL.md +2 -2
- package/org-skills/revops/SKILL.md +2 -2
- package/org-skills/roadmap-communicator/SKILL.md +2 -2
- package/org-skills/rust-engineer/SKILL.md +2 -2
- package/org-skills/rust-patterns/SKILL.md +2 -2
- package/org-skills/safe-executor/SKILL.md +2 -2
- package/org-skills/sales-coach/SKILL.md +2 -2
- package/org-skills/sales-enablement/SKILL.md +2 -2
- package/org-skills/sales-engineer/SKILL.md +2 -2
- package/org-skills/sales-prospecting/SKILL.md +2 -2
- package/org-skills/schema-markup/SKILL.md +2 -2
- package/org-skills/scientific-brainstorming/SKILL.md +2 -2
- package/org-skills/scientific-critical-thinking/SKILL.md +2 -2
- package/org-skills/scientific-thinking-literature-review/SKILL.md +2 -2
- package/org-skills/scientific-thinking-scholar-evaluation/SKILL.md +2 -2
- package/org-skills/scientific-visualization/SKILL.md +2 -2
- package/org-skills/scientific-writing/SKILL.md +2 -2
- package/org-skills/scout-explorer/SKILL.md +2 -2
- package/org-skills/secrets-vault-manager/SKILL.md +2 -2
- package/org-skills/secure-code-guardian/SKILL.md +2 -2
- package/org-skills/security-architect/SKILL.md +2 -2
- package/org-skills/security-auditor/SKILL.md +2 -2
- package/org-skills/security-review/SKILL.md +2 -2
- package/org-skills/security-reviewer/SKILL.md +2 -2
- package/org-skills/senior-data-scientist/SKILL.md +2 -2
- package/org-skills/senior-developer/SKILL.md +2 -2
- package/org-skills/senior-pm/SKILL.md +2 -2
- package/org-skills/senior-pm-playbook/SKILL.md +2 -2
- package/org-skills/seo/SKILL.md +2 -2
- package/org-skills/seo-audit/SKILL.md +2 -2
- package/org-skills/seo-specialist/SKILL.md +2 -2
- package/org-skills/shap-model-explainability/SKILL.md +2 -2
- package/org-skills/signup-flow-cro/SKILL.md +2 -2
- package/org-skills/site-architecture/SKILL.md +2 -2
- package/org-skills/sms-marketing/SKILL.md +2 -2
- package/org-skills/soc2-compliance/SKILL.md +2 -2
- package/org-skills/social-content/SKILL.md +2 -2
- package/org-skills/social-media/SKILL.md +2 -2
- package/org-skills/social-media-manager/SKILL.md +2 -2
- package/org-skills/solidity-engineer/SKILL.md +2 -2
- package/org-skills/spark-engineer/SKILL.md +2 -2
- package/org-skills/spec-driven-workflow/SKILL.md +2 -2
- package/org-skills/springboot-patterns/SKILL.md +2 -2
- package/org-skills/sprint-prioritizer/SKILL.md +2 -2
- package/org-skills/sql-pro/SKILL.md +2 -2
- package/org-skills/sre/SKILL.md +2 -2
- package/org-skills/sre-engineer/SKILL.md +2 -2
- package/org-skills/startup-financial-modeling/SKILL.md +2 -2
- package/org-skills/startup-metrics-framework/SKILL.md +2 -2
- package/org-skills/statistical-analysis/SKILL.md +2 -2
- package/org-skills/statistical-power/SKILL.md +2 -2
- package/org-skills/stride-analysis-patterns/SKILL.md +2 -2
- package/org-skills/stripe-integration/SKILL.md +2 -2
- package/org-skills/studio-operations/SKILL.md +2 -2
- package/org-skills/studio-producer/SKILL.md +2 -2
- package/org-skills/support-responder/SKILL.md +2 -2
- package/org-skills/swift-expert/SKILL.md +2 -2
- package/org-skills/swiftui-patterns/SKILL.md +2 -2
- package/org-skills/system-architect/SKILL.md +2 -2
- package/org-skills/systematic-debugging/SKILL.md +2 -2
- package/org-skills/task-orchestrator/SKILL.md +2 -2
- package/org-skills/team-communications/SKILL.md +2 -2
- package/org-skills/team-composition-analysis/SKILL.md +2 -2
- package/org-skills/technical-artist/SKILL.md +2 -2
- package/org-skills/technical-writer/SKILL.md +2 -2
- package/org-skills/terraform-engineer/SKILL.md +2 -2
- package/org-skills/test-driven-development/SKILL.md +2 -2
- package/org-skills/test-master/SKILL.md +2 -2
- package/org-skills/tester/SKILL.md +2 -2
- package/org-skills/the-fool/SKILL.md +2 -2
- package/org-skills/theme-factory/SKILL.md +2 -2
- package/org-skills/threat-detection/SKILL.md +2 -2
- package/org-skills/threat-mitigation-mapping/SKILL.md +2 -2
- package/org-skills/trend-researcher/SKILL.md +2 -2
- package/org-skills/trial-director/SKILL.md +2 -2
- package/org-skills/typescript-pro/SKILL.md +2 -2
- package/org-skills/unity-architect/SKILL.md +2 -2
- package/org-skills/using-git-worktrees/SKILL.md +2 -2
- package/org-skills/ux-researcher-designer/SKILL.md +2 -2
- package/org-skills/verification-before-completion/SKILL.md +2 -2
- package/org-skills/visionos-engineer/SKILL.md +2 -2
- package/org-skills/visual-design-foundations/SKILL.md +2 -2
- package/org-skills/vue-expert/SKILL.md +2 -2
- package/org-skills/vue-patterns/SKILL.md +2 -2
- package/org-skills/worker-specialist/SKILL.md +2 -2
- package/org-skills/workflow-architect/SKILL.md +2 -2
- package/org-skills/workflow-automation/SKILL.md +2 -2
- package/org-skills/writing-plans/SKILL.md +2 -2
- package/org-skills/zk-steward/SKILL.md +2 -2
- package/package.json +7 -7
- package/.claude/helpers/skill-registry.json +0 -5997
- package/.claude/skills/monodesign/SKILL.md +0 -257
- package/.claude/skills/monodesign/adapt.md +0 -53
- package/.claude/skills/monodesign/agents/monodesign-asset-producer.md +0 -100
- package/.claude/skills/monodesign/agents/monodesign-manual-edit-applier.md +0 -103
- package/.claude/skills/monodesign/animate.md +0 -65
- package/.claude/skills/monodesign/audit.md +0 -89
- package/.claude/skills/monodesign/bolder.md +0 -50
- package/.claude/skills/monodesign/clarify.md +0 -64
- package/.claude/skills/monodesign/colorize.md +0 -68
- package/.claude/skills/monodesign/craft.md +0 -51
- package/.claude/skills/monodesign/critique.md +0 -66
- package/.claude/skills/monodesign/delight.md +0 -47
- package/.claude/skills/monodesign/distill.md +0 -56
- package/.claude/skills/monodesign/document.md +0 -83
- package/.claude/skills/monodesign/extract.md +0 -74
- package/.claude/skills/monodesign/harden.md +0 -65
- package/.claude/skills/monodesign/init.md +0 -30
- package/.claude/skills/monodesign/layout.md +0 -36
- package/.claude/skills/monodesign/live.md +0 -34
- package/.claude/skills/monodesign/onboard.md +0 -50
- package/.claude/skills/monodesign/optimize.md +0 -64
- package/.claude/skills/monodesign/overdrive.md +0 -56
- package/.claude/skills/monodesign/polish.md +0 -68
- package/.claude/skills/monodesign/quieter.md +0 -57
- package/.claude/skills/monodesign/reference/adapt.md +0 -312
- package/.claude/skills/monodesign/reference/adapt.native.md +0 -58
- package/.claude/skills/monodesign/reference/android.md +0 -40
- package/.claude/skills/monodesign/reference/animate.md +0 -203
- package/.claude/skills/monodesign/reference/antipatterns-catalog.md +0 -410
- package/.claude/skills/monodesign/reference/audit.md +0 -135
- package/.claude/skills/monodesign/reference/audit.native.md +0 -139
- package/.claude/skills/monodesign/reference/bolder.md +0 -120
- package/.claude/skills/monodesign/reference/brand-workflow.md +0 -180
- package/.claude/skills/monodesign/reference/brand.md +0 -108
- package/.claude/skills/monodesign/reference/clarify.md +0 -288
- package/.claude/skills/monodesign/reference/codex.md +0 -105
- package/.claude/skills/monodesign/reference/cognitive-load.md +0 -106
- package/.claude/skills/monodesign/reference/color-and-contrast.md +0 -105
- package/.claude/skills/monodesign/reference/colorize.md +0 -257
- package/.claude/skills/monodesign/reference/component-specs.md +0 -260
- package/.claude/skills/monodesign/reference/component-states.md +0 -274
- package/.claude/skills/monodesign/reference/component-system.md +0 -358
- package/.claude/skills/monodesign/reference/copy-formulas.md +0 -160
- package/.claude/skills/monodesign/reference/craft.md +0 -123
- package/.claude/skills/monodesign/reference/critique.md +0 -780
- package/.claude/skills/monodesign/reference/delight.md +0 -302
- package/.claude/skills/monodesign/reference/design-principles.md +0 -246
- package/.claude/skills/monodesign/reference/distill.md +0 -111
- package/.claude/skills/monodesign/reference/document.md +0 -429
- package/.claude/skills/monodesign/reference/extract.md +0 -69
- package/.claude/skills/monodesign/reference/harden.md +0 -347
- package/.claude/skills/monodesign/reference/heuristics-scoring.md +0 -234
- package/.claude/skills/monodesign/reference/hooks.md +0 -92
- package/.claude/skills/monodesign/reference/image-prompts.md +0 -130
- package/.claude/skills/monodesign/reference/init.md +0 -221
- package/.claude/skills/monodesign/reference/interaction-design.md +0 -189
- package/.claude/skills/monodesign/reference/ios.md +0 -45
- package/.claude/skills/monodesign/reference/layout.md +0 -185
- package/.claude/skills/monodesign/reference/live.md +0 -710
- package/.claude/skills/monodesign/reference/motion-design.md +0 -109
- package/.claude/skills/monodesign/reference/onboard.md +0 -234
- package/.claude/skills/monodesign/reference/optimize.md +0 -258
- package/.claude/skills/monodesign/reference/overdrive.md +0 -130
- package/.claude/skills/monodesign/reference/personas.md +0 -179
- package/.claude/skills/monodesign/reference/polish.md +0 -241
- package/.claude/skills/monodesign/reference/pre-delivery-checklist.md +0 -108
- package/.claude/skills/monodesign/reference/product.md +0 -60
- package/.claude/skills/monodesign/reference/quieter.md +0 -99
- package/.claude/skills/monodesign/reference/responsive-design.md +0 -114
- package/.claude/skills/monodesign/reference/shape.md +0 -165
- package/.claude/skills/monodesign/reference/spatial-design.md +0 -100
- package/.claude/skills/monodesign/reference/teach.md +0 -10
- package/.claude/skills/monodesign/reference/token-architecture.md +0 -222
- package/.claude/skills/monodesign/reference/typeset.md +0 -301
- package/.claude/skills/monodesign/reference/typography.md +0 -159
- package/.claude/skills/monodesign/reference/ux-research.md +0 -143
- package/.claude/skills/monodesign/reference/ux-rules.md +0 -211
- package/.claude/skills/monodesign/reference/ux-writing.md +0 -107
- package/.claude/skills/monodesign/scripts/command-metadata.json +0 -94
- package/.claude/skills/monodesign/scripts/context-signals.mjs +0 -260
- package/.claude/skills/monodesign/scripts/context.mjs +0 -1065
- package/.claude/skills/monodesign/scripts/critique-storage.mjs +0 -416
- package/.claude/skills/monodesign/scripts/detect-csp.mjs +0 -193
- package/.claude/skills/monodesign/scripts/detect.mjs +0 -33
- package/.claude/skills/monodesign/scripts/detector/browser/injected/index.mjs +0 -1960
- package/.claude/skills/monodesign/scripts/detector/cli/main.mjs +0 -321
- package/.claude/skills/monodesign/scripts/detector/design-system.mjs +0 -814
- package/.claude/skills/monodesign/scripts/detector/detect-antipatterns-browser.js +0 -5628
- package/.claude/skills/monodesign/scripts/detector/detect-antipatterns.mjs +0 -50
- package/.claude/skills/monodesign/scripts/detector/engines/browser/detect-url.mjs +0 -259
- package/.claude/skills/monodesign/scripts/detector/engines/browser/drivers.mjs +0 -339
- package/.claude/skills/monodesign/scripts/detector/engines/regex/detect-text.mjs +0 -636
- package/.claude/skills/monodesign/scripts/detector/engines/static-html/css-cascade.mjs +0 -1016
- package/.claude/skills/monodesign/scripts/detector/engines/static-html/detect-html.mjs +0 -253
- package/.claude/skills/monodesign/scripts/detector/engines/visual/screenshot-contrast.mjs +0 -198
- package/.claude/skills/monodesign/scripts/detector/findings.mjs +0 -12
- package/.claude/skills/monodesign/scripts/detector/fix/css-regions.mjs +0 -181
- package/.claude/skills/monodesign/scripts/detector/fix/fixers.mjs +0 -373
- package/.claude/skills/monodesign/scripts/detector/fix/index.mjs +0 -426
- package/.claude/skills/monodesign/scripts/detector/node/file-system.mjs +0 -198
- package/.claude/skills/monodesign/scripts/detector/profile/profiler.mjs +0 -166
- package/.claude/skills/monodesign/scripts/detector/registry/antipatterns.mjs +0 -563
- package/.claude/skills/monodesign/scripts/detector/rules/checks.mjs +0 -3024
- package/.claude/skills/monodesign/scripts/detector/shared/color.mjs +0 -124
- package/.claude/skills/monodesign/scripts/detector/shared/constants.mjs +0 -101
- package/.claude/skills/monodesign/scripts/detector/shared/fonts.mjs +0 -30
- package/.claude/skills/monodesign/scripts/detector/shared/inline-ignores.mjs +0 -148
- package/.claude/skills/monodesign/scripts/detector/shared/page.mjs +0 -7
- package/.claude/skills/monodesign/scripts/hook-admin.mjs +0 -694
- package/.claude/skills/monodesign/scripts/hook-before-edit.mjs +0 -516
- package/.claude/skills/monodesign/scripts/hook-lib.mjs +0 -1785
- package/.claude/skills/monodesign/scripts/hook.mjs +0 -61
- package/.claude/skills/monodesign/scripts/lib/design-parser.mjs +0 -809
- package/.claude/skills/monodesign/scripts/lib/is-generated.mjs +0 -69
- package/.claude/skills/monodesign/scripts/lib/monodesign-config.mjs +0 -640
- package/.claude/skills/monodesign/scripts/lib/monodesign-paths.mjs +0 -129
- package/.claude/skills/monodesign/scripts/lib/provider.mjs +0 -4
- package/.claude/skills/monodesign/scripts/lib/target-args.mjs +0 -42
- package/.claude/skills/monodesign/scripts/live/browser-script-parts.mjs +0 -50
- package/.claude/skills/monodesign/scripts/live/completion.mjs +0 -19
- package/.claude/skills/monodesign/scripts/live/event-validation.mjs +0 -137
- package/.claude/skills/monodesign/scripts/live/insert-ui.mjs +0 -458
- package/.claude/skills/monodesign/scripts/live/manual-apply.mjs +0 -939
- package/.claude/skills/monodesign/scripts/live/manual-edit-routes.mjs +0 -357
- package/.claude/skills/monodesign/scripts/live/manual-edits-buffer.mjs +0 -152
- package/.claude/skills/monodesign/scripts/live/session-store.mjs +0 -293
- package/.claude/skills/monodesign/scripts/live/svelte-component.mjs +0 -826
- package/.claude/skills/monodesign/scripts/live/sveltekit-adapter.mjs +0 -279
- package/.claude/skills/monodesign/scripts/live/ui-core.mjs +0 -180
- package/.claude/skills/monodesign/scripts/live/vocabulary.mjs +0 -36
- package/.claude/skills/monodesign/scripts/live-accept.mjs +0 -812
- package/.claude/skills/monodesign/scripts/live-browser-dom.js +0 -147
- package/.claude/skills/monodesign/scripts/live-browser-session.js +0 -124
- package/.claude/skills/monodesign/scripts/live-browser.js +0 -11213
- package/.claude/skills/monodesign/scripts/live-commit-manual-edits.mjs +0 -1241
- package/.claude/skills/monodesign/scripts/live-complete.mjs +0 -75
- package/.claude/skills/monodesign/scripts/live-copy-edit-agent.mjs +0 -683
- package/.claude/skills/monodesign/scripts/live-discard-manual-edits.mjs +0 -51
- package/.claude/skills/monodesign/scripts/live-inject.mjs +0 -596
- package/.claude/skills/monodesign/scripts/live-insert.mjs +0 -272
- package/.claude/skills/monodesign/scripts/live-manual-edit-evidence.mjs +0 -363
- package/.claude/skills/monodesign/scripts/live-poll.mjs +0 -384
- package/.claude/skills/monodesign/scripts/live-resume.mjs +0 -94
- package/.claude/skills/monodesign/scripts/live-server.mjs +0 -1210
- package/.claude/skills/monodesign/scripts/live-status.mjs +0 -61
- package/.claude/skills/monodesign/scripts/live-target.mjs +0 -30
- package/.claude/skills/monodesign/scripts/live-wrap.mjs +0 -884
- package/.claude/skills/monodesign/scripts/live.mjs +0 -297
- package/.claude/skills/monodesign/scripts/modern-screenshot.umd.js +0 -14
- package/.claude/skills/monodesign/scripts/palette.mjs +0 -635
- package/.claude/skills/monodesign/scripts/pin.mjs +0 -221
- package/.claude/skills/monodesign/shape.md +0 -71
- package/.claude/skills/monodesign/teach.md +0 -18
- package/.claude/skills/monodesign/typeset.md +0 -59
- package/dist/src/routing/jev-step.d.ts +0 -17
- package/dist/src/routing/jev-step.d.ts.map +0 -1
- package/dist/src/routing/jev-step.js +0 -27
- package/dist/src/routing/jev-step.js.map +0 -1
- package/org-skills/accessibility/LICENSE.txt +0 -21
- package/org-skills/accessibility/SKILL.md +0 -149
- package/org-skills/database-migration/LICENSE.txt +0 -21
- package/org-skills/database-migration/SKILL.md +0 -337
- package/org-skills/database-migration/references/details.md +0 -76
- package/org-skills/error-handling-patterns/LICENSE.txt +0 -21
- package/org-skills/error-handling-patterns/SKILL.md +0 -126
- package/org-skills/error-handling-patterns/references/details.md +0 -516
- package/org-skills/internal-comms/LICENSE.txt +0 -202
- package/org-skills/internal-comms/SKILL.md +0 -36
- package/org-skills/internal-comms/examples/3p-updates.md +0 -47
- package/org-skills/internal-comms/examples/company-newsletter.md +0 -65
- package/org-skills/internal-comms/examples/faq-answers.md +0 -30
- package/org-skills/internal-comms/examples/general-comms.md +0 -16
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Anti-Pattern Detector for Monodesign
|
|
5
|
-
* Copyright (c) 2026 Paul Bakaus
|
|
6
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
7
|
-
*
|
|
8
|
-
* Public API facade. Runtime engines live under cli/engine/engines/.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { detectCli } from './cli/main.mjs';
|
|
12
|
-
|
|
13
|
-
export { ANTIPATTERNS, RULE_ENGINE_SUPPORT, getAntipattern, getRulesForCategory, getRuleEngineSupport } from './registry/antipatterns.mjs';
|
|
14
|
-
export { SAFE_TAGS, BORDER_SAFE_TAGS, OVERUSED_FONTS, GENERIC_FONTS, KNOWN_SERIF_FONTS } from './shared/constants.mjs';
|
|
15
|
-
export { isNeutralColor, parseRgb, relativeLuminance, contrastRatio, parseGradientColors, hasChroma, getHue, colorToHex } from './shared/color.mjs';
|
|
16
|
-
export { isFullPage } from './shared/page.mjs';
|
|
17
|
-
export {
|
|
18
|
-
checkElementBorders,
|
|
19
|
-
checkElementMotion,
|
|
20
|
-
checkElementGlow,
|
|
21
|
-
checkPageTypography,
|
|
22
|
-
checkPageLayout,
|
|
23
|
-
checkHtmlPatterns,
|
|
24
|
-
} from './rules/checks.mjs';
|
|
25
|
-
export { createDetectorProfile, summarizeDetectorProfile } from './profile/profiler.mjs';
|
|
26
|
-
export {
|
|
27
|
-
parseFrontmatter as parseDesignFrontmatter,
|
|
28
|
-
normalizeDesignSystem,
|
|
29
|
-
loadDesignSystemForCwd,
|
|
30
|
-
checkSourceDesignSystem,
|
|
31
|
-
collectStaticDesignSystemFindings,
|
|
32
|
-
} from './design-system.mjs';
|
|
33
|
-
export { detectHtml } from './engines/static-html/detect-html.mjs';
|
|
34
|
-
export { detectUrl, createBrowserDetector } from './engines/browser/detect-url.mjs';
|
|
35
|
-
export { detectText, extractStyleBlocks, extractCSSinJS } from './engines/regex/detect-text.mjs';
|
|
36
|
-
export {
|
|
37
|
-
walkDir,
|
|
38
|
-
SCANNABLE_EXTENSIONS,
|
|
39
|
-
SKIP_DIRS,
|
|
40
|
-
buildImportGraph,
|
|
41
|
-
resolveImport,
|
|
42
|
-
detectFrameworkConfig,
|
|
43
|
-
isPortListening,
|
|
44
|
-
FRAMEWORK_CONFIGS,
|
|
45
|
-
} from './node/file-system.mjs';
|
|
46
|
-
export { formatFindings, detectCli } from './cli/main.mjs';
|
|
47
|
-
|
|
48
|
-
const isMainModule = process.argv[1]?.endsWith('detect-antipatterns.mjs') ||
|
|
49
|
-
process.argv[1]?.endsWith('detect-antipatterns.mjs/');
|
|
50
|
-
if (isMainModule) detectCli();
|
|
@@ -1,259 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import { fileURLToPath } from 'node:url';
|
|
4
|
-
|
|
5
|
-
import { finding } from '../../findings.mjs';
|
|
6
|
-
import { filterByProviders } from '../../registry/antipatterns.mjs';
|
|
7
|
-
import { profileFindingsAsync, profileStep, profileStepAsync } from '../../profile/profiler.mjs';
|
|
8
|
-
import { captureVisualContrastCandidate } from '../visual/screenshot-contrast.mjs';
|
|
9
|
-
import { launchDetectionBrowser, normalizeBrowserHandle } from './drivers.mjs';
|
|
10
|
-
|
|
11
|
-
function serializeDesignSystemForBrowser(designSystem) {
|
|
12
|
-
if (!designSystem?.present) return null;
|
|
13
|
-
return {
|
|
14
|
-
present: true,
|
|
15
|
-
hasFonts: designSystem.hasFonts === true,
|
|
16
|
-
allowedFonts: Array.from(designSystem.allowedFonts || []),
|
|
17
|
-
hasColors: designSystem.hasColors === true,
|
|
18
|
-
allowedColors: Array.from(designSystem.allowedColorKeys?.values?.() || [])
|
|
19
|
-
.map(entry => entry?.color)
|
|
20
|
-
.filter(color => color && Number.isFinite(color.r) && Number.isFinite(color.g) && Number.isFinite(color.b))
|
|
21
|
-
.map(color => ({ r: color.r, g: color.g, b: color.b })),
|
|
22
|
-
hasRadii: designSystem.hasRadii === true,
|
|
23
|
-
allowedRadii: (designSystem.allowedRadii || [])
|
|
24
|
-
.map(entry => Number(entry?.px))
|
|
25
|
-
.filter(px => Number.isFinite(px)),
|
|
26
|
-
hasPillRadius: designSystem.hasPillRadius === true,
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
async function runVisualContrastFallback(page, serializedGroups, options, profile, target) {
|
|
31
|
-
if (options?.visualContrast === false) return [];
|
|
32
|
-
const maxCandidates = Number.isFinite(options?.visualContrastMaxCandidates)
|
|
33
|
-
? options.visualContrastMaxCandidates
|
|
34
|
-
: 12;
|
|
35
|
-
const scrollOffscreen = options?.visualContrastScrollOffscreen !== false;
|
|
36
|
-
const existingLowContrastSelectors = new Set(
|
|
37
|
-
serializedGroups
|
|
38
|
-
.filter(group => group.findings?.some(f => f.type === 'low-contrast'))
|
|
39
|
-
.map(group => group.selector)
|
|
40
|
-
.filter(Boolean)
|
|
41
|
-
);
|
|
42
|
-
|
|
43
|
-
let browserAnalyses = [];
|
|
44
|
-
const findings = [];
|
|
45
|
-
if (options?.visualContrastBrowser !== false) {
|
|
46
|
-
const browserFindings = await profileFindingsAsync(profile, {
|
|
47
|
-
engine: 'browser',
|
|
48
|
-
phase: 'visual-contrast',
|
|
49
|
-
ruleId: 'browser-fallback',
|
|
50
|
-
target,
|
|
51
|
-
}, async () => {
|
|
52
|
-
browserAnalyses = await page.evaluate(async ({ maxCandidates, scrollOffscreen }) => {
|
|
53
|
-
if (typeof window.monodesignAnalyzeVisualContrast !== 'function') return [];
|
|
54
|
-
return window.monodesignAnalyzeVisualContrast({ maxCandidates, scrollOffscreen });
|
|
55
|
-
}, { maxCandidates, scrollOffscreen });
|
|
56
|
-
return browserAnalyses
|
|
57
|
-
.filter(result => result.finding && !existingLowContrastSelectors.has(result.selector))
|
|
58
|
-
.map(result => result.finding);
|
|
59
|
-
});
|
|
60
|
-
findings.push(...browserFindings);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
let candidates = browserAnalyses.length > 0 ? browserAnalyses : [];
|
|
64
|
-
if (candidates.length === 0) {
|
|
65
|
-
candidates = await profileStepAsync(profile, {
|
|
66
|
-
engine: 'browser',
|
|
67
|
-
phase: 'visual-contrast',
|
|
68
|
-
ruleId: 'collect-candidates',
|
|
69
|
-
target,
|
|
70
|
-
}, () => page.evaluate(({ maxCandidates }) => {
|
|
71
|
-
if (typeof window.monodesignCollectVisualContrastCandidates !== 'function') return [];
|
|
72
|
-
return window.monodesignCollectVisualContrastCandidates({ maxCandidates });
|
|
73
|
-
}, { maxCandidates }));
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
const viewport = options?.viewport || { width: 1280, height: 800 };
|
|
77
|
-
const browserResolvedSelectors = new Set(
|
|
78
|
-
browserAnalyses
|
|
79
|
-
.filter(result => result.status === 'fail' || result.status === 'pass')
|
|
80
|
-
.map(result => result.selector)
|
|
81
|
-
.filter(Boolean)
|
|
82
|
-
);
|
|
83
|
-
const filtered = candidates.filter(candidate =>
|
|
84
|
-
!existingLowContrastSelectors.has(candidate.selector) &&
|
|
85
|
-
!browserResolvedSelectors.has(candidate.selector)
|
|
86
|
-
);
|
|
87
|
-
if (options?.visualContrastPixel === false) return findings;
|
|
88
|
-
for (const candidate of filtered) {
|
|
89
|
-
const result = await profileFindingsAsync(profile, {
|
|
90
|
-
engine: 'browser',
|
|
91
|
-
phase: 'visual-contrast',
|
|
92
|
-
ruleId: 'pixel-diff',
|
|
93
|
-
target,
|
|
94
|
-
}, async () => {
|
|
95
|
-
const finding = await captureVisualContrastCandidate(page, candidate, viewport);
|
|
96
|
-
return finding ? [finding] : [];
|
|
97
|
-
});
|
|
98
|
-
findings.push(...result);
|
|
99
|
-
}
|
|
100
|
-
return findings;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
// ---------------------------------------------------------------------------
|
|
104
|
-
// Browser detection (for URLs) — driver-based: monobrowse (native CDP,
|
|
105
|
-
// preferred) with puppeteer as fallback. See ./drivers.mjs for the seam.
|
|
106
|
-
// ---------------------------------------------------------------------------
|
|
107
|
-
|
|
108
|
-
async function detectUrl(url, options = {}) {
|
|
109
|
-
const profile = options?.profile;
|
|
110
|
-
const waitUntil = options?.waitUntil || 'networkidle0';
|
|
111
|
-
const settleMs = Number.isFinite(options?.settleMs) ? options.settleMs : 0;
|
|
112
|
-
const viewport = options?.viewport || { width: 1280, height: 800 };
|
|
113
|
-
// options.browser accepts either a driver handle (from createBrowserDetector)
|
|
114
|
-
// or a raw puppeteer Browser (legacy callers).
|
|
115
|
-
const externalBrowser = options?.browser ? normalizeBrowserHandle(options.browser) : null;
|
|
116
|
-
|
|
117
|
-
// Read the browser detection script — reuse it instead of reimplementing
|
|
118
|
-
const browserScriptPath = path.resolve(
|
|
119
|
-
path.dirname(fileURLToPath(import.meta.url)),
|
|
120
|
-
'..',
|
|
121
|
-
'..',
|
|
122
|
-
'detect-antipatterns-browser.js'
|
|
123
|
-
);
|
|
124
|
-
let browserScript;
|
|
125
|
-
try {
|
|
126
|
-
browserScript = profileStep(profile, {
|
|
127
|
-
engine: 'browser',
|
|
128
|
-
phase: 'setup',
|
|
129
|
-
ruleId: 'read-browser-script',
|
|
130
|
-
target: url,
|
|
131
|
-
}, () => fs.readFileSync(browserScriptPath, 'utf-8'));
|
|
132
|
-
} catch {
|
|
133
|
-
throw new Error(`Browser script not found at ${browserScriptPath}`);
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
const browser = externalBrowser || await profileStepAsync(profile, {
|
|
137
|
-
engine: 'browser',
|
|
138
|
-
phase: 'load',
|
|
139
|
-
ruleId: 'launch-browser',
|
|
140
|
-
target: url,
|
|
141
|
-
}, () => launchDetectionBrowser({ launchArgs: options?.launchArgs, headless: true }));
|
|
142
|
-
const page = await profileStepAsync(profile, {
|
|
143
|
-
engine: 'browser',
|
|
144
|
-
phase: 'load',
|
|
145
|
-
ruleId: 'new-page',
|
|
146
|
-
target: url,
|
|
147
|
-
}, () => browser.newPage());
|
|
148
|
-
let results = [];
|
|
149
|
-
try {
|
|
150
|
-
await profileStepAsync(profile, {
|
|
151
|
-
engine: 'browser',
|
|
152
|
-
phase: 'load',
|
|
153
|
-
ruleId: 'set-viewport',
|
|
154
|
-
target: url,
|
|
155
|
-
}, () => page.setViewport(viewport));
|
|
156
|
-
await profileStepAsync(profile, {
|
|
157
|
-
engine: 'browser',
|
|
158
|
-
phase: 'load',
|
|
159
|
-
ruleId: `goto:${waitUntil}`,
|
|
160
|
-
target: url,
|
|
161
|
-
}, () => page.goto(url, { waitUntil, timeout: 30000 }));
|
|
162
|
-
if (settleMs > 0) {
|
|
163
|
-
await profileStepAsync(profile, {
|
|
164
|
-
engine: 'browser',
|
|
165
|
-
phase: 'load',
|
|
166
|
-
ruleId: 'settle',
|
|
167
|
-
target: url,
|
|
168
|
-
}, () => new Promise(resolve => setTimeout(resolve, settleMs)));
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
// Inject the browser detection script and collect results
|
|
172
|
-
const browserDesignSystem = serializeDesignSystemForBrowser(options?.designSystem);
|
|
173
|
-
await profileStepAsync(profile, {
|
|
174
|
-
engine: 'browser',
|
|
175
|
-
phase: 'scan',
|
|
176
|
-
ruleId: 'configure-pure-detect',
|
|
177
|
-
target: url,
|
|
178
|
-
}, () => page.evaluate((designSystem) => {
|
|
179
|
-
window.__MONODESIGN_CONFIG__ = {
|
|
180
|
-
...(window.__MONODESIGN_CONFIG__ || {}),
|
|
181
|
-
autoScan: false,
|
|
182
|
-
...(designSystem ? { designSystem } : {}),
|
|
183
|
-
};
|
|
184
|
-
}, browserDesignSystem));
|
|
185
|
-
await profileStepAsync(profile, {
|
|
186
|
-
engine: 'browser',
|
|
187
|
-
phase: 'scan',
|
|
188
|
-
ruleId: 'inject-browser-script',
|
|
189
|
-
target: url,
|
|
190
|
-
}, () => page.evaluate(browserScript));
|
|
191
|
-
let serializedGroups = [];
|
|
192
|
-
results = await profileFindingsAsync(profile, {
|
|
193
|
-
engine: 'browser',
|
|
194
|
-
phase: 'scan',
|
|
195
|
-
ruleId: 'browser-scan',
|
|
196
|
-
target: url,
|
|
197
|
-
}, async () => {
|
|
198
|
-
serializedGroups = await page.evaluate(() => {
|
|
199
|
-
if (!window.monodesignDetect) return [];
|
|
200
|
-
return window.monodesignDetect({ decorate: false, serialize: true });
|
|
201
|
-
});
|
|
202
|
-
return serializedGroups.flatMap(({ findings }) =>
|
|
203
|
-
findings.map(f => ({ id: f.type, snippet: f.detail, ignoreValue: f.ignoreValue || '' }))
|
|
204
|
-
);
|
|
205
|
-
});
|
|
206
|
-
const visualFindings = await runVisualContrastFallback(page, serializedGroups, options, profile, url);
|
|
207
|
-
results.push(...visualFindings);
|
|
208
|
-
} finally {
|
|
209
|
-
await profileStepAsync(profile, {
|
|
210
|
-
engine: 'browser',
|
|
211
|
-
phase: 'load',
|
|
212
|
-
ruleId: 'close-page',
|
|
213
|
-
target: url,
|
|
214
|
-
}, () => page.close().catch(() => {}));
|
|
215
|
-
if (!externalBrowser) {
|
|
216
|
-
await profileStepAsync(profile, {
|
|
217
|
-
engine: 'browser',
|
|
218
|
-
phase: 'load',
|
|
219
|
-
ruleId: 'close-browser',
|
|
220
|
-
target: url,
|
|
221
|
-
}, () => browser.close());
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
return filterByProviders(results.map(f => {
|
|
225
|
-
const item = finding(f.id, url, f.snippet);
|
|
226
|
-
if (f.ignoreValue) item.ignoreValue = f.ignoreValue;
|
|
227
|
-
return item;
|
|
228
|
-
}), options.providers);
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
async function createBrowserDetector(options = {}) {
|
|
232
|
-
// Pooled reuse for multiple URLs. `browser` is a driver handle (monobrowse
|
|
233
|
-
// or puppeteer); pass a raw puppeteer Browser via options.browser to reuse
|
|
234
|
-
// an externally managed instance.
|
|
235
|
-
const browser = options.browser
|
|
236
|
-
? normalizeBrowserHandle(options.browser)
|
|
237
|
-
: await launchDetectionBrowser({ launchArgs: options.launchArgs, headless: options.headless ?? true });
|
|
238
|
-
const ownsBrowser = !options.browser;
|
|
239
|
-
const defaults = {
|
|
240
|
-
waitUntil: options.waitUntil || 'load',
|
|
241
|
-
settleMs: Number.isFinite(options.settleMs) ? options.settleMs : 100,
|
|
242
|
-
viewport: options.viewport || { width: 1280, height: 800 },
|
|
243
|
-
};
|
|
244
|
-
return {
|
|
245
|
-
browser,
|
|
246
|
-
async detectUrl(url, scanOptions = {}) {
|
|
247
|
-
return detectUrl(url, {
|
|
248
|
-
...defaults,
|
|
249
|
-
...scanOptions,
|
|
250
|
-
browser,
|
|
251
|
-
});
|
|
252
|
-
},
|
|
253
|
-
async close() {
|
|
254
|
-
if (ownsBrowser) await browser.close().catch(() => {});
|
|
255
|
-
},
|
|
256
|
-
};
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
export { runVisualContrastFallback, detectUrl, createBrowserDetector };
|
|
@@ -1,339 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Browser driver seam for URL detection.
|
|
3
|
-
//
|
|
4
|
-
// The detection engine (detect-url.mjs) and the visual-contrast fallback
|
|
5
|
-
// (engines/visual/screenshot-contrast.mjs) only need a tiny, puppeteer-shaped
|
|
6
|
-
// page surface:
|
|
7
|
-
//
|
|
8
|
-
// browser: { driverName, newPage(): Promise<page>, close(): Promise<void> }
|
|
9
|
-
// page: {
|
|
10
|
-
// setViewport({ width, height })
|
|
11
|
-
// goto(url, { waitUntil, timeout })
|
|
12
|
-
// evaluate(fnOrExpressionString, ...serializableArgs) -> serializable value
|
|
13
|
-
// screenshot({ encoding: 'base64', clip?, captureBeyondViewport? }) -> base64 string
|
|
14
|
-
// close()
|
|
15
|
-
// }
|
|
16
|
-
//
|
|
17
|
-
// Two drivers implement it:
|
|
18
|
-
// - monobrowse (preferred): @monoes/monobrowse, the monorepo's native CDP
|
|
19
|
-
// client. Drives a locally installed Chrome/Edge/Chromium — no bundled
|
|
20
|
-
// Chromium download needed. Supports the full surface including clip
|
|
21
|
-
// screenshots (Page.captureScreenshot) and evaluate roundtrips
|
|
22
|
-
// (Runtime.evaluate), so the visual-contrast pixel fallback runs under it.
|
|
23
|
-
// - puppeteer (fallback): the original optionalDependency path, kept for
|
|
24
|
-
// environments that have puppeteer + its downloaded Chrome but no system
|
|
25
|
-
// browser. A raw puppeteer Page already satisfies the page surface, so the
|
|
26
|
-
// puppeteer driver returns real puppeteer pages untouched.
|
|
27
|
-
//
|
|
28
|
-
// Selection: MONODESIGN_BROWSER_DRIVER=monobrowse|puppeteer forces one;
|
|
29
|
-
// otherwise monobrowse is tried first and puppeteer is the fallback.
|
|
30
|
-
|
|
31
|
-
import { createServer } from 'node:net';
|
|
32
|
-
import { mkdtempSync, rmSync } from 'node:fs';
|
|
33
|
-
import { tmpdir } from 'node:os';
|
|
34
|
-
import { join } from 'node:path';
|
|
35
|
-
|
|
36
|
-
const DRIVER_ENV = 'MONODESIGN_BROWSER_DRIVER';
|
|
37
|
-
// Windows CI teardown is the slow case: Chrome acknowledges Browser.close long
|
|
38
|
-
// before the process exits and hands the socket back, and closeBrowser()'s
|
|
39
|
-
// force-kill safety net is itself a deferred 1s timer. 5s is comfortable
|
|
40
|
-
// locally but cuts into a loaded runner's teardown, so give CI more runway —
|
|
41
|
-
// same reasoning as launchTimeoutMs below.
|
|
42
|
-
const CDP_PORT_RELEASE_TIMEOUT_MS = process.env.CI ? 15_000 : 5_000;
|
|
43
|
-
const CDP_PORT_RELEASE_POLL_MS = 25;
|
|
44
|
-
const PROFILE_CLEANUP_RETRY_MS = 2_000;
|
|
45
|
-
|
|
46
|
-
function serializeEvalArg(arg) {
|
|
47
|
-
const json = JSON.stringify(arg);
|
|
48
|
-
return json === undefined ? 'undefined' : json;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
function mapWaitUntil(waitUntil) {
|
|
52
|
-
if (waitUntil === 'domcontentloaded') return 'domcontentloaded';
|
|
53
|
-
if (waitUntil === 'networkidle0' || waitUntil === 'networkidle2' || waitUntil === 'networkidle') return 'networkidle';
|
|
54
|
-
return 'load';
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
// This timer is deliberately NOT unref'd. Both call sites race it against CDP
|
|
58
|
-
// I/O that can die silently: goto() awaits a promise settled only by a
|
|
59
|
-
// Page.loadEventFired/domContentEventFired event, and close() races
|
|
60
|
-
// Browser.close — the very command that tears the websocket down. An unref'd
|
|
61
|
-
// timer never fires once nothing else pins the event loop, and a launched
|
|
62
|
-
// Chrome is detached and unref'd, so that websocket is the only ref'd handle
|
|
63
|
-
// here — exactly the one that goes away. Node would then consider the loop
|
|
64
|
-
// drained and exit 0 with the race still pending, instead of surfacing the
|
|
65
|
-
// timeout. The .finally() below clears it either way, so keeping it ref'd
|
|
66
|
-
// only ever costs a caller `ms`, never a hang. (Same rule as monobrowse's
|
|
67
|
-
// waitForProcessExit, #314.)
|
|
68
|
-
function withTimeout(promise, ms, label) {
|
|
69
|
-
let handle;
|
|
70
|
-
const timeout = new Promise((_, reject) => {
|
|
71
|
-
handle = setTimeout(() => reject(new Error(`Timeout waiting for ${label} after ${ms}ms`)), ms);
|
|
72
|
-
});
|
|
73
|
-
return Promise.race([promise, timeout]).finally(() => clearTimeout(handle));
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
// "Released" has to mean BINDABLE, not merely unreachable. A connect probe
|
|
77
|
-
// stops succeeding as soon as Chrome's listener socket closes, which happens
|
|
78
|
-
// early in its shutdown — while the process is still alive holding both the
|
|
79
|
-
// port and the --user-data-dir singleton lock for this port. On Windows that
|
|
80
|
-
// gap is wide and the socket stays unbindable across it (node does not set
|
|
81
|
-
// SO_REUSEADDR there), so close() reported success and the next launch on the
|
|
82
|
-
// same forced port sat until its timeout: "Chrome failed to start on port N
|
|
83
|
-
// within 30000ms". Binding is the question the next launch actually asks, so
|
|
84
|
-
// ask it directly. A listener that never accepted a connection leaves no
|
|
85
|
-
// TIME_WAIT behind, so probing this way does not itself hold the port.
|
|
86
|
-
function isPortBindable(port) {
|
|
87
|
-
return new Promise((resolve) => {
|
|
88
|
-
const server = createServer();
|
|
89
|
-
server.once('error', () => resolve(false));
|
|
90
|
-
server.listen(port, '127.0.0.1', () => server.close(() => resolve(true)));
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
function removeProfileDir(dir) {
|
|
95
|
-
try {
|
|
96
|
-
rmSync(dir, { recursive: true, force: true });
|
|
97
|
-
} catch {
|
|
98
|
-
/* reclaimed by the OS's temp cleanup instead */
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
async function waitForCdpPortRelease(port) {
|
|
103
|
-
const deadline = Date.now() + CDP_PORT_RELEASE_TIMEOUT_MS;
|
|
104
|
-
while (Date.now() < deadline) {
|
|
105
|
-
if (await isPortBindable(port)) return;
|
|
106
|
-
await new Promise(resolve => setTimeout(resolve, CDP_PORT_RELEASE_POLL_MS));
|
|
107
|
-
}
|
|
108
|
-
throw new Error(`Chrome did not release CDP port ${port} within ${CDP_PORT_RELEASE_TIMEOUT_MS}ms`);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// ---------------------------------------------------------------------------
|
|
112
|
-
// monobrowse driver
|
|
113
|
-
// ---------------------------------------------------------------------------
|
|
114
|
-
|
|
115
|
-
function createMonobrowsePage(mb, client, sessionId, targetId, port) {
|
|
116
|
-
return {
|
|
117
|
-
async setViewport({ width, height }) {
|
|
118
|
-
await mb.setViewport(client, sessionId, width, height);
|
|
119
|
-
},
|
|
120
|
-
async goto(url, { waitUntil = 'load', timeout = 30000 } = {}) {
|
|
121
|
-
const condition = mapWaitUntil(waitUntil);
|
|
122
|
-
if (condition === 'networkidle') {
|
|
123
|
-
const nav = await client.send('Page.navigate', { url }, sessionId);
|
|
124
|
-
if (nav?.errorText) throw new Error(`Navigation to ${url} failed: ${nav.errorText}`);
|
|
125
|
-
await mb.waitForLoad(client, sessionId, 'networkidle', timeout);
|
|
126
|
-
return;
|
|
127
|
-
}
|
|
128
|
-
// Register the lifecycle listener BEFORE navigating so a fast page load
|
|
129
|
-
// cannot slip past it (waitForLoad's readyState pre-check would otherwise
|
|
130
|
-
// race against the previous document's readyState).
|
|
131
|
-
const event = condition === 'load' ? 'Page.loadEventFired' : 'Page.domContentEventFired';
|
|
132
|
-
const [eventPromise, cancel] = client.onceWithOff(event, sessionId);
|
|
133
|
-
try {
|
|
134
|
-
const nav = await client.send('Page.navigate', { url }, sessionId);
|
|
135
|
-
if (nav?.errorText) throw new Error(`Navigation to ${url} failed: ${nav.errorText}`);
|
|
136
|
-
await withTimeout(eventPromise, timeout, condition);
|
|
137
|
-
} finally {
|
|
138
|
-
cancel();
|
|
139
|
-
}
|
|
140
|
-
},
|
|
141
|
-
async evaluate(fnOrExpression, ...args) {
|
|
142
|
-
const expression = typeof fnOrExpression === 'function'
|
|
143
|
-
? `(${String(fnOrExpression)})(${args.map(serializeEvalArg).join(', ')})`
|
|
144
|
-
: String(fnOrExpression);
|
|
145
|
-
const result = await client.send('Runtime.evaluate', {
|
|
146
|
-
expression,
|
|
147
|
-
returnByValue: true,
|
|
148
|
-
awaitPromise: true,
|
|
149
|
-
}, sessionId);
|
|
150
|
-
if (result?.exceptionDetails) {
|
|
151
|
-
const details = result.exceptionDetails;
|
|
152
|
-
throw new Error(details.exception?.description || details.exception?.value || details.text || 'Evaluation failed');
|
|
153
|
-
}
|
|
154
|
-
return result?.result?.value;
|
|
155
|
-
},
|
|
156
|
-
// Always returns a base64 string (the only mode the engine uses).
|
|
157
|
-
async screenshot({ clip } = {}) {
|
|
158
|
-
const params = { format: 'png' };
|
|
159
|
-
if (clip) {
|
|
160
|
-
params.clip = { x: clip.x, y: clip.y, width: clip.width, height: clip.height, scale: 1 };
|
|
161
|
-
params.captureBeyondViewport = true;
|
|
162
|
-
}
|
|
163
|
-
const result = await client.send('Page.captureScreenshot', params, sessionId);
|
|
164
|
-
return result?.data;
|
|
165
|
-
},
|
|
166
|
-
async close() {
|
|
167
|
-
// HTTP endpoint works regardless of which domains the ws connection has.
|
|
168
|
-
try {
|
|
169
|
-
await fetch(`http://127.0.0.1:${port}/json/close/${encodeURIComponent(targetId)}`);
|
|
170
|
-
} catch {
|
|
171
|
-
// Tab may already be gone; browser close cleans up anything left.
|
|
172
|
-
}
|
|
173
|
-
client.close();
|
|
174
|
-
},
|
|
175
|
-
};
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
async function launchMonobrowseBrowser(options = {}) {
|
|
179
|
-
const mb = await import('@monoes/monobrowse');
|
|
180
|
-
const headless = options.headless ?? true;
|
|
181
|
-
const launchArgs = options.launchArgs || (process.env.CI ? ['--no-sandbox', '--disable-setuid-sandbox'] : []);
|
|
182
|
-
|
|
183
|
-
// We must never attach to a browser we did not launch: browser.close()
|
|
184
|
-
// issues Browser.close. Picking a "free" port ourselves cannot guarantee
|
|
185
|
-
// that — the port is only probed, and a concurrent launch (node --test runs
|
|
186
|
-
// files in parallel) can pick the same one before either Chrome binds it.
|
|
187
|
-
// The losing Chrome then listens on [::1] instead and its launcher attaches
|
|
188
|
-
// to the winner's browser, which dies under it ("CDP connection closed")
|
|
189
|
-
// when the winner closes. Port 0 has Chrome take a kernel-assigned port and
|
|
190
|
-
// report it in its own profile dir, so the endpoint is always ours.
|
|
191
|
-
const forcedPort = Number(process.env.MONODESIGN_MONOBROWSE_PORT);
|
|
192
|
-
const port = Number.isInteger(forcedPort) && forcedPort > 0 ? forcedPort : 0;
|
|
193
|
-
|
|
194
|
-
// CI runners (observed on the Windows GH Actions runner) are slower to get
|
|
195
|
-
// Chrome's CDP port open than the 10s default — a batch of sequential
|
|
196
|
-
// headless launches in the same job intermittently misses that window and
|
|
197
|
-
// fails with "Chrome failed to start... within 10000ms" even though the
|
|
198
|
-
// browser starts fine, just later. Give CI more runway; local dev keeps
|
|
199
|
-
// the tighter default so a genuinely broken launch still fails fast.
|
|
200
|
-
const launchTimeoutMs = options.launchTimeoutMs ?? (process.env.CI ? 30000 : undefined);
|
|
201
|
-
// Throwaway profile per launch. monobrowse defaults --user-data-dir to
|
|
202
|
-
// tmpdir()/monomind-browser-<port>, which is right for `monomind browse`
|
|
203
|
-
// (a later process reattaches to the same session by port) but wrong here:
|
|
204
|
-
// detection launches are stateless, and keying the profile on the port
|
|
205
|
-
// means two launches on the SAME port share one profile. Chrome enforces
|
|
206
|
-
// single-instance-per-profile, so the second launch rendezvouses with the
|
|
207
|
-
// first instead of starting its own — it hands over its command line and
|
|
208
|
-
// exits without ever opening a debugging port, which surfaces as "Chrome
|
|
209
|
-
// failed to start on port N" after the full launch timeout. Windows is
|
|
210
|
-
// where this bites: its singleton lock survives the previous Chrome being
|
|
211
|
-
// force-killed, and outlives the port being released. A unique dir removes
|
|
212
|
-
// the sharing entirely rather than racing the lock's cleanup.
|
|
213
|
-
const userDataDir = mkdtempSync(join(tmpdir(), 'monodesign-cdp-'));
|
|
214
|
-
const launchedPort = await mb.launchBrowser({ port, headless, args: launchArgs, launchTimeoutMs, userDataDir });
|
|
215
|
-
// Control connection (to the initial about:blank tab) — used for lifecycle
|
|
216
|
-
// commands; detection pages get their own dedicated connections.
|
|
217
|
-
const control = await mb.connectToTarget(launchedPort);
|
|
218
|
-
|
|
219
|
-
async function openPage() {
|
|
220
|
-
const target = await mb.fetchNewTarget(launchedPort, 'about:blank');
|
|
221
|
-
const wsUrl = target.webSocketDebuggerUrl || `ws://127.0.0.1:${launchedPort}/devtools/page/${target.id}`;
|
|
222
|
-
const client = new mb.CdpClient();
|
|
223
|
-
await client.connect(wsUrl);
|
|
224
|
-
const { sessionId } = await client.send('Target.attachToTarget', { targetId: target.id, flatten: true });
|
|
225
|
-
await Promise.all([
|
|
226
|
-
client.send('Page.enable', {}, sessionId),
|
|
227
|
-
client.send('Runtime.enable', {}, sessionId),
|
|
228
|
-
client.send('Network.enable', {}, sessionId),
|
|
229
|
-
]);
|
|
230
|
-
return createMonobrowsePage(mb, client, sessionId, target.id, launchedPort);
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
return {
|
|
234
|
-
driverName: 'monobrowse',
|
|
235
|
-
newPage: openPage,
|
|
236
|
-
async close() {
|
|
237
|
-
try {
|
|
238
|
-
if (typeof mb.closeBrowser === 'function') {
|
|
239
|
-
// Newer monobrowse: graceful Browser.close with PID-kill fallback.
|
|
240
|
-
await mb.closeBrowser(control.client, launchedPort);
|
|
241
|
-
} else {
|
|
242
|
-
// Published 1.0.3 has no closeBrowser export — send the CDP
|
|
243
|
-
// Browser.close command directly (best effort, short timeout).
|
|
244
|
-
await withTimeout(control.client.send('Browser.close', {}), 3000, 'Browser.close').catch(() => {});
|
|
245
|
-
}
|
|
246
|
-
// Browser.close is acknowledged before Chrome has actually exited. A
|
|
247
|
-
// following detection run on a forced port can otherwise attach to the
|
|
248
|
-
// shutting-down process and fail creating its first target. Do not
|
|
249
|
-
// expose close() as complete until that CDP listener is gone.
|
|
250
|
-
await waitForCdpPortRelease(launchedPort);
|
|
251
|
-
} finally {
|
|
252
|
-
control.client.close();
|
|
253
|
-
// Best effort, twice: Chrome is still flushing profile data when the
|
|
254
|
-
// port comes back, so an immediate delete gets a few files recreated
|
|
255
|
-
// under it. The unref'd retry lands after that (same pattern as
|
|
256
|
-
// monobrowse's own post-close force-kill net) and never holds the
|
|
257
|
-
// process open. Whatever still survives is a few KB under tmpdir that
|
|
258
|
-
// nothing reuses, so neither attempt may fail close().
|
|
259
|
-
removeProfileDir(userDataDir);
|
|
260
|
-
setTimeout(() => removeProfileDir(userDataDir), PROFILE_CLEANUP_RETRY_MS).unref?.();
|
|
261
|
-
}
|
|
262
|
-
},
|
|
263
|
-
};
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
// ---------------------------------------------------------------------------
|
|
267
|
-
// puppeteer driver (original behavior, kept as fallback)
|
|
268
|
-
// ---------------------------------------------------------------------------
|
|
269
|
-
|
|
270
|
-
function wrapPuppeteerBrowser(browser) {
|
|
271
|
-
return {
|
|
272
|
-
driverName: 'puppeteer',
|
|
273
|
-
raw: browser,
|
|
274
|
-
newPage: () => browser.newPage(),
|
|
275
|
-
close: () => browser.close(),
|
|
276
|
-
};
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
async function launchPuppeteerBrowser(options = {}) {
|
|
280
|
-
let puppeteer;
|
|
281
|
-
try {
|
|
282
|
-
puppeteer = await import('puppeteer');
|
|
283
|
-
} catch {
|
|
284
|
-
throw new Error('puppeteer is required for URL scanning. Install: npm install puppeteer');
|
|
285
|
-
}
|
|
286
|
-
// CI runners (GitHub Actions Ubuntu) block unprivileged user namespaces, so
|
|
287
|
-
// Chrome can't initialize its sandbox there. Disable the sandbox only when
|
|
288
|
-
// running in CI; local users keep the default hardened launch.
|
|
289
|
-
const launchArgs = options.launchArgs || (process.env.CI ? ['--no-sandbox', '--disable-setuid-sandbox'] : []);
|
|
290
|
-
const browser = await puppeteer.default.launch({
|
|
291
|
-
headless: options.headless ?? true,
|
|
292
|
-
args: launchArgs,
|
|
293
|
-
});
|
|
294
|
-
return wrapPuppeteerBrowser(browser);
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
// ---------------------------------------------------------------------------
|
|
298
|
-
// Selection
|
|
299
|
-
// ---------------------------------------------------------------------------
|
|
300
|
-
|
|
301
|
-
/** Accepts either a driver browser handle or a raw puppeteer Browser. */
|
|
302
|
-
function normalizeBrowserHandle(browser) {
|
|
303
|
-
if (!browser) return null;
|
|
304
|
-
if (browser.driverName && typeof browser.newPage === 'function') return browser;
|
|
305
|
-
if (typeof browser.newPage === 'function') return wrapPuppeteerBrowser(browser);
|
|
306
|
-
throw new Error('Unsupported browser handle passed to detectUrl (expected a driver handle or puppeteer Browser)');
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
async function launchDetectionBrowser(options = {}) {
|
|
310
|
-
const forced = (process.env[DRIVER_ENV] || '').trim().toLowerCase();
|
|
311
|
-
if (forced && forced !== 'monobrowse' && forced !== 'puppeteer') {
|
|
312
|
-
throw new Error(`Invalid ${DRIVER_ENV}=${forced} (expected "monobrowse" or "puppeteer")`);
|
|
313
|
-
}
|
|
314
|
-
const order = forced ? [forced] : ['monobrowse', 'puppeteer'];
|
|
315
|
-
const errors = [];
|
|
316
|
-
for (const name of order) {
|
|
317
|
-
try {
|
|
318
|
-
return name === 'monobrowse'
|
|
319
|
-
? await launchMonobrowseBrowser(options)
|
|
320
|
-
: await launchPuppeteerBrowser(options);
|
|
321
|
-
} catch (error) {
|
|
322
|
-
errors.push(`${name}: ${error?.message || error}`);
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
throw new Error(
|
|
326
|
-
'A browser is required for URL scanning and no driver could start one ' +
|
|
327
|
-
`(${errors.join(' | ')}). ` +
|
|
328
|
-
'Install Google Chrome/Chromium/Edge for the native @monoes/monobrowse driver, ' +
|
|
329
|
-
'or puppeteer is required for URL scanning. Install: npm install puppeteer'
|
|
330
|
-
);
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
export {
|
|
334
|
-
launchDetectionBrowser,
|
|
335
|
-
launchMonobrowseBrowser,
|
|
336
|
-
launchPuppeteerBrowser,
|
|
337
|
-
normalizeBrowserHandle,
|
|
338
|
-
wrapPuppeteerBrowser,
|
|
339
|
-
};
|