0xray 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.opencode/agents/api-design.yml +31 -0
- package/.opencode/agents/architect.yml +15 -0
- package/.opencode/agents/architecture-patterns.yml +14 -0
- package/.opencode/agents/auto-format.yml +14 -0
- package/.opencode/agents/backend-engineer.yml +12 -0
- package/.opencode/agents/boot-orchestrator.yml +14 -0
- package/.opencode/agents/bug-triage-specialist.yml +15 -0
- package/.opencode/agents/code-analyzer.yml +12 -0
- package/.opencode/agents/code-reviewer.yml +14 -0
- package/.opencode/agents/content-creator.yml +12 -0
- package/.opencode/agents/database-engineer.yml +12 -0
- package/.opencode/agents/devops-engineer.yml +12 -0
- package/.opencode/agents/framework-compliance-audit.yml +14 -0
- package/.opencode/agents/frontend-engineer.yml +12 -0
- package/.opencode/agents/frontend-ui-ux-engineer.yml +12 -0
- package/.opencode/agents/git-workflow.yml +15 -0
- package/.opencode/agents/growth-strategist.yml +12 -0
- package/.opencode/agents/hermes-agent.yml +12 -0
- package/.opencode/agents/inference-improve.yml +12 -0
- package/.opencode/agents/lint.yml +14 -0
- package/.opencode/agents/log-monitor.yml +12 -0
- package/.opencode/agents/mobile-developer.yml +12 -0
- package/.opencode/agents/model-health-check.yml +12 -0
- package/.opencode/agents/multimodal-looker.yml +12 -0
- package/.opencode/agents/performance-analysis.yml +12 -0
- package/.opencode/agents/performance-engineer.yml +12 -0
- package/.opencode/agents/performance-optimization.yml +12 -0
- package/.opencode/agents/processor-pipeline.yml +14 -0
- package/.opencode/agents/project-analysis.yml +12 -0
- package/.opencode/agents/refactorer.yml +12 -0
- package/.opencode/agents/researcher.yml +12 -0
- package/.opencode/agents/security-auditor.yml +12 -0
- package/.opencode/agents/security-scan.yml +12 -0
- package/.opencode/agents/seo-consultant.yml +12 -0
- package/.opencode/agents/session-management.yml +12 -0
- package/.opencode/agents/state-manager.yml +12 -0
- package/.opencode/agents/storyteller.yml +12 -0
- package/.opencode/agents/strategist.yml +12 -0
- package/.opencode/agents/tech-writer.yml +12 -0
- package/.opencode/agents/testing-best-practices.yml +12 -0
- package/.opencode/agents/testing-lead.yml +12 -0
- package/.opencode/agents/ui-ux-design.yml +12 -0
- package/.opencode/codex.codex +8 -0
- package/.opencode/commands/auto-format.md +99 -0
- package/.opencode/commands/auto-summary-capture.md +90 -0
- package/.opencode/commands/dependency-audit.md +184 -0
- package/.opencode/commands/enforcer-daily-scan.md +137 -0
- package/.opencode/commands/framework-compliance-audit.md +205 -0
- package/.opencode/commands/interactive-validator.md +75 -0
- package/.opencode/commands/job-summary-logger.md +68 -0
- package/.opencode/commands/lint.md +11 -0
- package/.opencode/commands/mode-switch.md +95 -0
- package/.opencode/commands/model-health-check.md +186 -0
- package/.opencode/commands/performance-analysis.md +144 -0
- package/.opencode/commands/pre-commit-introspection.md +185 -0
- package/.opencode/commands/pre-commit-introspection.sh +133 -0
- package/.opencode/commands/security-scan.md +157 -0
- package/.opencode/commands/sisyphus-validation.md +128 -0
- package/.opencode/commands/summary-logger.md +83 -0
- package/.opencode/enforcer-config.json +285 -0
- package/.opencode/hooks/hook-metrics.json +380 -0
- package/.opencode/hooks/post-commit +114 -0
- package/.opencode/hooks/post-push +34 -0
- package/.opencode/init.sh +151 -0
- package/.opencode/skills/api-design/SKILL.md +37 -0
- package/.opencode/skills/architect-tools/SKILL.md +37 -0
- package/.opencode/skills/architecture-patterns/SKILL.md +37 -0
- package/.opencode/skills/auto-format/SKILL.md +37 -0
- package/.opencode/skills/backend-engineer/SKILL.md +49 -0
- package/.opencode/skills/boot-orchestrator/SKILL.md +37 -0
- package/.opencode/skills/bug-triage/SKILL.md +43 -0
- package/.opencode/skills/code-analyzer/SKILL.md +45 -0
- package/.opencode/skills/code-review/SKILL.md +52 -0
- package/.opencode/skills/content-creator/SKILL.md +38 -0
- package/.opencode/skills/database-engineer/SKILL.md +46 -0
- package/.opencode/skills/devops-engineer/SKILL.md +49 -0
- package/.opencode/skills/enforcer/SKILL.md +37 -0
- package/.opencode/skills/framework-compliance-audit/SKILL.md +37 -0
- package/.opencode/skills/frontend-engineer/SKILL.md +49 -0
- package/.opencode/skills/frontend-ui-ux-engineer/SKILL.md +41 -0
- package/.opencode/skills/git-workflow/SKILL.md +37 -0
- package/.opencode/skills/growth-strategist/SKILL.md +48 -0
- package/.opencode/skills/hermes-agent/SKILL.md +212 -0
- package/.opencode/skills/inference-improve/SKILL.md +97 -0
- package/.opencode/skills/lint/SKILL.md +37 -0
- package/.opencode/skills/log-monitor/SKILL.md +44 -0
- package/.opencode/skills/mobile-developer/SKILL.md +42 -0
- package/.opencode/skills/model-health-check/SKILL.md +37 -0
- package/.opencode/skills/multimodal-looker/SKILL.md +45 -0
- package/.opencode/skills/orchestrator/SKILL.md +37 -0
- package/.opencode/skills/performance-analysis/SKILL.md +37 -0
- package/.opencode/skills/performance-engineer/SKILL.md +41 -0
- package/.opencode/skills/performance-optimization/SKILL.md +37 -0
- package/.opencode/skills/processor-pipeline/SKILL.md +37 -0
- package/.opencode/skills/project-analysis/SKILL.md +42 -0
- package/.opencode/skills/refactoring-strategies/SKILL.md +37 -0
- package/.opencode/skills/registry.json +66 -0
- package/.opencode/skills/researcher/SKILL.md +37 -0
- package/.opencode/skills/security-audit/SKILL.md +47 -0
- package/.opencode/skills/security-scan/SKILL.md +37 -0
- package/.opencode/skills/seo-consultant/SKILL.md +43 -0
- package/.opencode/skills/session-management/SKILL.md +36 -0
- package/.opencode/skills/state-manager/SKILL.md +37 -0
- package/.opencode/skills/storyteller/SKILL.md +130 -0
- package/.opencode/skills/strategist/SKILL.md +32 -0
- package/.opencode/skills/tech-writer/SKILL.md +37 -0
- package/.opencode/skills/testing-best-practices/SKILL.md +37 -0
- package/.opencode/skills/testing-strategy/SKILL.md +43 -0
- package/.opencode/skills/ui-ux-design/SKILL.md +603 -0
- package/.opencode/workflows/post-deployment-audit.yml +123 -0
- package/AGENTS.md +110 -0
- package/LICENSE +21 -0
- package/README.md +131 -0
- package/dist/AGENTS.md +110 -0
- package/dist/CHANGELOG.md +2182 -0
- package/dist/LICENSE +21 -0
- package/dist/README.md +131 -0
- package/dist/agents/architect.js +56 -0
- package/dist/agents/backend-engineer.js +81 -0
- package/dist/agents/bug-triage-specialist.js +74 -0
- package/dist/agents/code-analyzer.js +150 -0
- package/dist/agents/code-reviewer.js +69 -0
- package/dist/agents/content-creator.js +72 -0
- package/dist/agents/database-engineer.js +76 -0
- package/dist/agents/devops-engineer.js +84 -0
- package/dist/agents/frontend-engineer.js +78 -0
- package/dist/agents/frontend-ui-ux-engineer.js +64 -0
- package/dist/agents/growth-strategist.js +111 -0
- package/dist/agents/index.js +45 -0
- package/dist/agents/librarian-agents-updater.js +333 -0
- package/dist/agents/log-monitor.js +109 -0
- package/dist/agents/mobile-developer.js +102 -0
- package/dist/agents/multimodal-looker.js +93 -0
- package/dist/agents/performance-engineer.js +86 -0
- package/dist/agents/refactorer.js +80 -0
- package/dist/agents/registry.js +340 -0
- package/dist/agents/researcher.js +83 -0
- package/dist/agents/security-auditor.js +158 -0
- package/dist/agents/seo-consultant.js +53 -0
- package/dist/agents/strategist.js +47 -0
- package/dist/agents/tech-writer.js +84 -0
- package/dist/agents/testing-lead.js +95 -0
- package/dist/agents/types.js +1 -0
- package/dist/analytics/consent-manager.js +258 -0
- package/dist/analytics/emerging-pattern-detector.js +260 -0
- package/dist/analytics/pattern-learning-engine.js +278 -0
- package/dist/analytics/pattern-performance-tracker.js +336 -0
- package/dist/analytics/predictive-analytics.js +248 -0
- package/dist/analytics/prompt-pattern-analyzer.js +371 -0
- package/dist/analytics/routing-performance-analyzer.js +356 -0
- package/dist/analytics/routing-refiner.js +380 -0
- package/dist/analytics/simple-pattern-analyzer.js +297 -0
- package/dist/architect/architect-tools.js +437 -0
- package/dist/architect/architectural-integrity.js +78 -0
- package/dist/benchmark/performance-benchmark.js +372 -0
- package/dist/cli/commands/analytics-disable.js +72 -0
- package/dist/cli/commands/analytics-enable-action.js +82 -0
- package/dist/cli/commands/analytics-preview.js +106 -0
- package/dist/cli/commands/analytics-status.js +68 -0
- package/dist/cli/commands/antigravity-status.js +106 -0
- package/dist/cli/commands/archive-logs.js +161 -0
- package/dist/cli/commands/credible-init.js +82 -0
- package/dist/cli/commands/grok-install.js +16 -0
- package/dist/cli/commands/hermes-install.js +66 -0
- package/dist/cli/commands/mcp-install.js +253 -0
- package/dist/cli/commands/openclaw-install.js +44 -0
- package/dist/cli/commands/opencode-install.js +99 -0
- package/dist/cli/commands/plugin-commands.js +246 -0
- package/dist/cli/commands/publish-agent.js +184 -0
- package/dist/cli/commands/security-audit.js +219 -0
- package/dist/cli/commands/skill-install.js +481 -0
- package/dist/cli/commands/status.js +196 -0
- package/dist/cli/commands/storyteller.js +230 -0
- package/dist/cli/index.js +986 -0
- package/dist/cli/server.js +147 -0
- package/dist/config/default-agents.js +16 -0
- package/dist/core/activity-logger.js +260 -0
- package/dist/core/adaptive-kernel.js +192 -0
- package/dist/core/agent-spawn-gate.js +120 -0
- package/dist/core/boot-orchestrator.js +812 -0
- package/dist/core/bridge.mjs +945 -0
- package/dist/core/codex-formatter.js +220 -0
- package/dist/core/codex-injector.js +424 -0
- package/dist/core/config-loader.js +148 -0
- package/dist/core/config-paths.js +162 -0
- package/dist/core/context-loader.js +269 -0
- package/dist/core/context-validator.js +212 -0
- package/dist/core/features-config.js +457 -0
- package/dist/core/framework-logger.js +275 -0
- package/dist/core/index.js +6 -0
- package/dist/core/kernel-patterns.js +302 -0
- package/dist/core/logging-config.js +43 -0
- package/dist/core/model-router.js +175 -0
- package/dist/core/orchestrator.js +408 -0
- package/dist/core/system-prompt-generator.js +265 -0
- package/dist/core/trace-context.js +33 -0
- package/dist/core/xray-activation.js +134 -0
- package/dist/delegation/agent-delegator.js +769 -0
- package/dist/delegation/agent-expertise.js +156 -0
- package/dist/delegation/analytics/index.js +12 -0
- package/dist/delegation/analytics/learning-engine.js +277 -0
- package/dist/delegation/analytics/outcome-tracker.js +279 -0
- package/dist/delegation/analytics/routing-analytics.js +193 -0
- package/dist/delegation/ast-code-parser.js +878 -0
- package/dist/delegation/codebase-context-analyzer.js +1040 -0
- package/dist/delegation/complexity-analyzer.js +282 -0
- package/dist/delegation/complexity-core.js +219 -0
- package/dist/delegation/config/types.js +6 -0
- package/dist/delegation/dependency-graph-builder.js +409 -0
- package/dist/delegation/index.js +20 -0
- package/dist/delegation/metrics-aggregator.js +335 -0
- package/dist/delegation/session-coordinator.js +352 -0
- package/dist/delegation/strategy-selector.js +108 -0
- package/dist/delegation/voting-coordinator.js +375 -0
- package/dist/delegation/voting-types.js +10 -0
- package/dist/delegation/weighted-voting-aggregator.js +194 -0
- package/dist/enforcement/core/index.js +19 -0
- package/dist/enforcement/core/rule-executor.js +365 -0
- package/dist/enforcement/core/rule-hierarchy.js +259 -0
- package/dist/enforcement/core/rule-registry.js +240 -0
- package/dist/enforcement/core/violation-fixer.js +651 -0
- package/dist/enforcement/enforcer-tools.js +909 -0
- package/dist/enforcement/index.js +41 -0
- package/dist/enforcement/loaders/agent-triage-loader.js +222 -0
- package/dist/enforcement/loaders/agents-md-validation-loader.js +252 -0
- package/dist/enforcement/loaders/base-loader.js +86 -0
- package/dist/enforcement/loaders/codex-loader.js +396 -0
- package/dist/enforcement/loaders/index.js +40 -0
- package/dist/enforcement/loaders/loader-orchestrator.js +168 -0
- package/dist/enforcement/loaders/processor-loader.js +113 -0
- package/dist/enforcement/rule-enforcer.js +298 -0
- package/dist/enforcement/test-auto-healing.js +325 -0
- package/dist/enforcement/types.js +30 -0
- package/dist/enforcement/validators/architecture-validators.js +600 -0
- package/dist/enforcement/validators/base-validator.js +108 -0
- package/dist/enforcement/validators/code-quality-validators.js +336 -0
- package/dist/enforcement/validators/index.js +21 -0
- package/dist/enforcement/validators/security-validators.js +220 -0
- package/dist/enforcement/validators/testing-validators.js +253 -0
- package/dist/enforcement/validators/validator-registry.js +150 -0
- package/dist/execution/opencode-cli-invoker.js +173 -0
- package/dist/execution/proposal-applier.js +254 -0
- package/dist/governance/codex-policy.service.js +167 -0
- package/dist/governance/governance-core.js +152 -0
- package/dist/governance/governance-service.js +274 -0
- package/dist/governance/governance-types.js +6 -0
- package/dist/index.js +24 -0
- package/dist/inference/deploy-verifier.js +161 -0
- package/dist/inference/index.js +5 -0
- package/dist/inference/inference-accumulator.js +126 -0
- package/dist/inference/inference-cycle.js +1168 -0
- package/dist/inference/semantic-patterns.js +310 -0
- package/dist/inference/session-capture.js +308 -0
- package/dist/integrations/base/ExampleIntegration.js +181 -0
- package/dist/integrations/base/Integration.js +395 -0
- package/dist/integrations/base/README.md +446 -0
- package/dist/integrations/base/index.js +16 -0
- package/dist/integrations/base/registry.js +606 -0
- package/dist/integrations/base/types.js +118 -0
- package/dist/integrations/governance/governance-client.js +316 -0
- package/dist/integrations/governance/index.js +373 -0
- package/dist/integrations/governance/types.js +97 -0
- package/dist/integrations/grok/grok-cli.js +83 -0
- package/dist/integrations/grok/hooks/pre-tool-use.js +134 -0
- package/dist/integrations/grok/plugin/0xray/.mcp.json +15 -0
- package/dist/integrations/grok/plugin/0xray/hooks/hooks.json +30 -0
- package/dist/integrations/hermes-agent/__init__.py +718 -0
- package/dist/integrations/hermes-agent/after-install.md +71 -0
- package/dist/integrations/hermes-agent/bridge.mjs +861 -0
- package/dist/integrations/hermes-agent/conftest.py +14 -0
- package/dist/integrations/hermes-agent/plugin.yaml +12 -0
- package/dist/integrations/hermes-agent/schemas.py +100 -0
- package/dist/integrations/hermes-agent/test_plugin.py +1100 -0
- package/dist/integrations/hermes-agent/tools.py +253 -0
- package/dist/integrations/openclaw/README.md +134 -0
- package/dist/integrations/openclaw/api-server.js +389 -0
- package/dist/integrations/openclaw/client.js +492 -0
- package/dist/integrations/openclaw/config.js +374 -0
- package/dist/integrations/openclaw/hooks/strray-hooks.js +280 -0
- package/dist/integrations/openclaw/index.js +351 -0
- package/dist/integrations/openclaw/types.js +153 -0
- package/dist/integrations/plugins/index.js +10 -0
- package/dist/integrations/plugins/plugin-integration.js +606 -0
- package/dist/integrations/plugins/plugin-registry.js +580 -0
- package/dist/mcps/agent-resolver.js +106 -0
- package/dist/mcps/architect-tools.server.js +277 -0
- package/dist/mcps/auto-format.server.js +413 -0
- package/dist/mcps/boot-orchestrator.server.js +853 -0
- package/dist/mcps/config/config-loader.js +103 -0
- package/dist/mcps/config/config-validator.js +101 -0
- package/dist/mcps/config/index.js +30 -0
- package/dist/mcps/config/plugin-server-registry.js +223 -0
- package/dist/mcps/config/server-config-registry.js +348 -0
- package/dist/mcps/connection/connection-manager.js +79 -0
- package/dist/mcps/connection/connection-pool.js +164 -0
- package/dist/mcps/connection/mcp-connection.js +233 -0
- package/dist/mcps/connection/process-spawner.js +34 -0
- package/dist/mcps/enforcer-tools.server.js +778 -0
- package/dist/mcps/estimation.server.js +192 -0
- package/dist/mcps/framework-compliance-audit.server.js +500 -0
- package/dist/mcps/framework-help.server.js +400 -0
- package/dist/mcps/governance.server.js +464 -0
- package/dist/mcps/in-process-skill-registry.js +48 -0
- package/dist/mcps/knowledge-skills/api-design.server.js +123 -0
- package/dist/mcps/knowledge-skills/architecture-patterns.server.js +113 -0
- package/dist/mcps/knowledge-skills/bug-triage-specialist.server.js +474 -0
- package/dist/mcps/knowledge-skills/code-analyzer.server.js +605 -0
- package/dist/mcps/knowledge-skills/code-review.server.js +847 -0
- package/dist/mcps/knowledge-skills/content-creator.server.js +256 -0
- package/dist/mcps/knowledge-skills/database-design.server.js +822 -0
- package/dist/mcps/knowledge-skills/devops-deployment.server.js +1180 -0
- package/dist/mcps/knowledge-skills/git-workflow.server.js +115 -0
- package/dist/mcps/knowledge-skills/growth-strategist.server.js +361 -0
- package/dist/mcps/knowledge-skills/log-monitor.server.js +451 -0
- package/dist/mcps/knowledge-skills/mobile-development.server.js +525 -0
- package/dist/mcps/knowledge-skills/multimodal-looker.server.js +1063 -0
- package/dist/mcps/knowledge-skills/performance-optimization.server.js +1587 -0
- package/dist/mcps/knowledge-skills/project-analysis.server.js +811 -0
- package/dist/mcps/knowledge-skills/refactoring-strategies.server.js +796 -0
- package/dist/mcps/knowledge-skills/security-audit.server.js +846 -0
- package/dist/mcps/knowledge-skills/seo-consultant.server.js +937 -0
- package/dist/mcps/knowledge-skills/session-management.server.js +470 -0
- package/dist/mcps/knowledge-skills/skill-invocation.server.js +729 -0
- package/dist/mcps/knowledge-skills/strategist.server.js +217 -0
- package/dist/mcps/knowledge-skills/tech-writer.server.js +1191 -0
- package/dist/mcps/knowledge-skills/testing-best-practices.server.js +866 -0
- package/dist/mcps/knowledge-skills/testing-strategy.server.js +827 -0
- package/dist/mcps/knowledge-skills/ui-ux-design.server.js +1538 -0
- package/dist/mcps/lint.server.js +381 -0
- package/dist/mcps/mcp-client.js +574 -0
- package/dist/mcps/model-health-check.server.js +228 -0
- package/dist/mcps/orchestrator/config/agent-capabilities.js +87 -0
- package/dist/mcps/orchestrator/execution/execution-planner.js +279 -0
- package/dist/mcps/orchestrator/handlers/complexity-handler.js +94 -0
- package/dist/mcps/orchestrator/handlers/status-handler.js +232 -0
- package/dist/mcps/orchestrator/handlers/task-handler.js +197 -0
- package/dist/mcps/orchestrator/server.js +305 -0
- package/dist/mcps/orchestrator/types.js +6 -0
- package/dist/mcps/orchestrator.server.js +19 -0
- package/dist/mcps/performance-analysis.server.js +519 -0
- package/dist/mcps/processor-pipeline.server.js +561 -0
- package/dist/mcps/protocol/protocol-constants.js +46 -0
- package/dist/mcps/registry.json +110 -0
- package/dist/mcps/researcher.server.js +504 -0
- package/dist/mcps/security-scan.server.js +531 -0
- package/dist/mcps/simulation/index.js +12 -0
- package/dist/mcps/simulation/server-simulations.js +219 -0
- package/dist/mcps/simulation/simulation-engine.js +96 -0
- package/dist/mcps/state-manager.server.js +637 -0
- package/dist/mcps/tools/index.js +14 -0
- package/dist/mcps/tools/tool-cache.js +112 -0
- package/dist/mcps/tools/tool-discovery.js +65 -0
- package/dist/mcps/tools/tool-executor.js +75 -0
- package/dist/mcps/tools/tool-registry.js +67 -0
- package/dist/mcps/types/index.js +15 -0
- package/dist/mcps/types/json-rpc.types.js +7 -0
- package/dist/mcps/types/mcp.types.js +7 -0
- package/dist/metrics/agent-metrics.js +574 -0
- package/dist/metrics/index.js +6 -0
- package/dist/monitoring/advanced-profiler.js +232 -0
- package/dist/monitoring/memory-monitor.js +315 -0
- package/dist/monitoring/nudge-watchdog.js +356 -0
- package/dist/monitoring/test-auto-generation-monitor.js +157 -0
- package/dist/orchestrator/agent-spawn-governor.js +559 -0
- package/dist/orchestrator/enhanced-multi-agent-orchestrator.js +399 -0
- package/dist/orchestrator/intelligent-commit-batcher.js +353 -0
- package/dist/orchestrator/multi-agent-orchestration-coordinator.js +456 -0
- package/dist/orchestrator/orchestrator.js +657 -0
- package/dist/orchestrator/self-direction-activation.js +245 -0
- package/dist/orchestrator/universal-librarian-consultation.js +216 -0
- package/dist/orchestrator/universal-registry-bridge.js +247 -0
- package/dist/performance/performance-budget-enforcer.js +434 -0
- package/dist/performance/performance-regression-tester.js +342 -0
- package/dist/plugin/xray-codex-injection.js +857 -0
- package/dist/postprocessor/PostProcessor.js +1048 -0
- package/dist/postprocessor/analysis/FailureAnalysisEngine.js +245 -0
- package/dist/postprocessor/autofix/AutoFixEngine.js +254 -0
- package/dist/postprocessor/autofix/FixValidator.js +56 -0
- package/dist/postprocessor/config.js +65 -0
- package/dist/postprocessor/escalation/EscalationEngine.js +492 -0
- package/dist/postprocessor/monitoring/MonitoringEngine.js +125 -0
- package/dist/postprocessor/redeploy/RedeployCoordinator.js +342 -0
- package/dist/postprocessor/services/RegressionAnalysisService.js +131 -0
- package/dist/postprocessor/success/SuccessHandler.js +134 -0
- package/dist/postprocessor/triggers/APITrigger.js +115 -0
- package/dist/postprocessor/triggers/GitHookTrigger.js +551 -0
- package/dist/postprocessor/triggers/WebhookTrigger.js +211 -0
- package/dist/postprocessor/types.js +4 -0
- package/dist/processors/doc-write-guard.js +46 -0
- package/dist/processors/implementations/agents-md-validation-processor.js +286 -0
- package/dist/processors/implementations/async-pattern-processor.js +158 -0
- package/dist/processors/implementations/codex-compliance-processor.js +57 -0
- package/dist/processors/implementations/commit-batcher-processor.js +71 -0
- package/dist/processors/implementations/console-log-guard-processor.js +163 -0
- package/dist/processors/implementations/coverage-analysis-processor.js +138 -0
- package/dist/processors/implementations/error-boundary-processor.js +44 -0
- package/dist/processors/implementations/inference-improvement-processor.js +270 -0
- package/dist/processors/implementations/log-protection-processor.js +118 -0
- package/dist/processors/implementations/nudge-processor.js +130 -0
- package/dist/processors/implementations/performance-budget-processor.js +217 -0
- package/dist/processors/implementations/postprocessor-chain-validator.js +149 -0
- package/dist/processors/implementations/pre-validate-processor.js +18 -0
- package/dist/processors/implementations/publish-preflight-processor.js +249 -0
- package/dist/processors/implementations/refactoring-logging-processor-wrapper.js +33 -0
- package/dist/processors/implementations/refactoring-logging-processor.js +96 -0
- package/dist/processors/implementations/regression-testing-processor.js +59 -0
- package/dist/processors/implementations/session-capture-processor.js +37 -0
- package/dist/processors/implementations/session-summary-processor.js +130 -0
- package/dist/processors/implementations/spawn-governance-processor.js +219 -0
- package/dist/processors/implementations/state-validation-processor.js +15 -0
- package/dist/processors/implementations/storytelling-trigger-processor.js +589 -0
- package/dist/processors/implementations/test-auto-creation-processor.js +484 -0
- package/dist/processors/implementations/test-execution-processor.js +132 -0
- package/dist/processors/implementations/typescript-compilation-processor.js +87 -0
- package/dist/processors/implementations/version-compliance-processor.js +350 -0
- package/dist/processors/processor-interfaces.js +126 -0
- package/dist/processors/processor-manager.js +826 -0
- package/dist/processors/processor-types.js +12 -0
- package/dist/public/about.html +228 -0
- package/dist/public/enterprise.html +27 -0
- package/dist/public/features.html +102 -0
- package/dist/public/index.html +145 -0
- package/dist/reporting/framework-reporting-system.js +187 -0
- package/dist/reporting/log-parser.js +281 -0
- package/dist/reporting/metrics.js +202 -0
- package/dist/reporting/report-formatter.js +146 -0
- package/dist/reporting/types.js +1 -0
- package/dist/scripts/activate-kernel-pipeline.js +101 -0
- package/dist/scripts/integration.js +234 -0
- package/dist/scripts/pre-command +26 -0
- package/dist/scripts/pre-command.mjs +358 -0
- package/dist/security/comprehensive-security-audit.js +1005 -0
- package/dist/security/index.js +13 -0
- package/dist/security/prompt-security-validator.js +148 -0
- package/dist/security/security-agent-coordinator.js +204 -0
- package/dist/security/security-auditor.js +584 -0
- package/dist/security/security-hardener.js +170 -0
- package/dist/security/security-hardening-system.js +727 -0
- package/dist/security/security-headers.js +118 -0
- package/dist/security/security-orchestration-layer.js +496 -0
- package/dist/security/security-scanner.js +429 -0
- package/dist/services/inference-tuner.js +301 -0
- package/dist/session/index.js +3 -0
- package/dist/session/session-cleanup-manager.js +366 -0
- package/dist/session/session-monitor.js +503 -0
- package/dist/session/session-state-manager.js +522 -0
- package/dist/skills/api-design/SKILL.md +37 -0
- package/dist/skills/architect-tools/SKILL.md +37 -0
- package/dist/skills/architecture-patterns/SKILL.md +37 -0
- package/dist/skills/auto-format/SKILL.md +37 -0
- package/dist/skills/backend-engineer/SKILL.md +49 -0
- package/dist/skills/boot-orchestrator/SKILL.md +37 -0
- package/dist/skills/bug-triage/SKILL.md +43 -0
- package/dist/skills/code-analyzer/SKILL.md +45 -0
- package/dist/skills/code-review/SKILL.md +52 -0
- package/dist/skills/content-creator/SKILL.md +38 -0
- package/dist/skills/database-engineer/SKILL.md +46 -0
- package/dist/skills/devops-engineer/SKILL.md +49 -0
- package/dist/skills/enforcer/SKILL.md +37 -0
- package/dist/skills/framework-compliance-audit/SKILL.md +37 -0
- package/dist/skills/frontend-engineer/SKILL.md +49 -0
- package/dist/skills/frontend-ui-ux-engineer/SKILL.md +41 -0
- package/dist/skills/git-workflow/SKILL.md +37 -0
- package/dist/skills/growth-strategist/SKILL.md +48 -0
- package/dist/skills/hermes-agent/SKILL.md +212 -0
- package/dist/skills/inference-improve/SKILL.md +97 -0
- package/dist/skills/lint/SKILL.md +37 -0
- package/dist/skills/log-monitor/SKILL.md +44 -0
- package/dist/skills/mobile-developer/SKILL.md +42 -0
- package/dist/skills/model-health-check/SKILL.md +37 -0
- package/dist/skills/multimodal-looker/SKILL.md +45 -0
- package/dist/skills/orchestrator/SKILL.md +37 -0
- package/dist/skills/performance-analysis/SKILL.md +37 -0
- package/dist/skills/performance-engineer/SKILL.md +41 -0
- package/dist/skills/performance-optimization/SKILL.md +37 -0
- package/dist/skills/processor-pipeline/SKILL.md +37 -0
- package/dist/skills/project-analysis/SKILL.md +42 -0
- package/dist/skills/refactoring-strategies/SKILL.md +37 -0
- package/dist/skills/registry.json +66 -0
- package/dist/skills/researcher/SKILL.md +37 -0
- package/dist/skills/security-audit/SKILL.md +48 -0
- package/dist/skills/security-scan/SKILL.md +37 -0
- package/dist/skills/seo-consultant/SKILL.md +43 -0
- package/dist/skills/session-management/SKILL.md +36 -0
- package/dist/skills/state-manager/SKILL.md +37 -0
- package/dist/skills/storyteller/SKILL.md +130 -0
- package/dist/skills/strategist/SKILL.md +32 -0
- package/dist/skills/tech-writer/SKILL.md +37 -0
- package/dist/skills/testing-best-practices/SKILL.md +37 -0
- package/dist/skills/testing-strategy/SKILL.md +43 -0
- package/dist/skills/ui-ux-design/SKILL.md +603 -0
- package/dist/state/context-providers.js +1 -0
- package/dist/state/index.js +7 -0
- package/dist/state/state-manager.js +208 -0
- package/dist/state/state-types.js +1 -0
- package/dist/testing/memory-regression-suite.js +258 -0
- package/dist/utils/batch-operations.js +292 -0
- package/dist/utils/codex-parser.js +445 -0
- package/dist/utils/command-runner.js +96 -0
- package/dist/utils/import-resolver.js +189 -0
- package/dist/utils/language-detector.js +383 -0
- package/dist/utils/path-resolver.js +112 -0
- package/dist/utils/shutdown-handler.js +75 -0
- package/dist/utils/test-template-generator.js +178 -0
- package/dist/utils/token-manager.js +163 -0
- package/dist/validation/estimation-validator.js +241 -0
- package/dist/validation/report-content-validator.js +218 -0
- package/opencode.json +153 -0
- package/package.json +170 -0
- package/scripts/helpers/resolve-config-path.cjs +57 -0
- package/scripts/helpers/resolve-config-path.mjs +73 -0
- package/scripts/hooks/pre-command +26 -0
- package/scripts/hooks/pre-command.mjs +358 -0
- package/scripts/hooks/run-hook.js +570 -0
- package/scripts/mjs/test-consumer-readiness.mjs +273 -0
- package/scripts/mjs/test-mcp-functionality.mjs +507 -0
- package/scripts/mjs/validate-mcp-connectivity.cjs +75 -0
- package/scripts/mjs/validate-postinstall-config.mjs +308 -0
- package/scripts/node/auto-reflection-generator.mjs +496 -0
- package/scripts/node/basic-security-audit.cjs +338 -0
- package/scripts/node/ci-cd-auto-fix.cjs +263 -0
- package/scripts/node/ci-report-generator.mjs +227 -0
- package/scripts/node/enforce-agents-md.mjs +420 -0
- package/scripts/node/enforce-version-compliance.sh +22 -0
- package/scripts/node/enforce-version-compliance.ts +126 -0
- package/scripts/node/github-actions-monitor.cjs +23 -0
- package/scripts/node/govern-reflection.mjs +160 -0
- package/scripts/node/postinstall.cjs +78 -0
- package/scripts/node/pre-publish-guard.js +267 -0
- package/scripts/node/prepare-consumer.cjs +143 -0
- package/scripts/node/reflection-processor.cjs +213 -0
- package/scripts/node/reflection-validate.sh +194 -0
- package/scripts/node/release-tweet.mjs +39 -0
- package/scripts/node/release.js +159 -0
- package/scripts/node/release.mjs +213 -0
- package/scripts/node/setup-dev.cjs +83 -0
- package/scripts/node/setup.cjs +214 -0
- package/scripts/node/sync-versions.mjs +140 -0
- package/scripts/node/universal-version-manager.js +1025 -0
- package/scripts/node/validate-external-processes.js +265 -0
- package/scripts/node/validate-mcp-connectivity.js +258 -0
- package/scripts/node/version-manager.mjs +524 -0
- package/scripts/validate-stringray-comprehensive.js +636 -0
- package/src/integrations/grok/plugin/0xray/.mcp.json +15 -0
- package/src/integrations/grok/plugin/0xray/hooks/hooks.json +30 -0
- package/src/mcps/agent-resolver.ts +168 -0
- package/src/mcps/architect-tools.server.ts +343 -0
- package/src/mcps/auto-format.server.ts +529 -0
- package/src/mcps/boot-orchestrator.server.ts +1082 -0
- package/src/mcps/config/__tests__/config-loader.test.ts +338 -0
- package/src/mcps/config/__tests__/config-validator.test.ts +646 -0
- package/src/mcps/config/__tests__/server-config-registry.test.ts +257 -0
- package/src/mcps/config/config-loader.ts +127 -0
- package/src/mcps/config/config-validator.ts +127 -0
- package/src/mcps/config/index.ts +32 -0
- package/src/mcps/config/plugin-server-registry.ts +335 -0
- package/src/mcps/config/server-config-registry.ts +395 -0
- package/src/mcps/connection/connection-manager.ts +91 -0
- package/src/mcps/connection/connection-pool.ts +216 -0
- package/src/mcps/connection/mcp-connection.ts +327 -0
- package/src/mcps/connection/process-spawner.ts +47 -0
- package/src/mcps/enforcer-tools.server.ts +1106 -0
- package/src/mcps/estimation.server.ts +229 -0
- package/src/mcps/framework-compliance-audit.server.ts +635 -0
- package/src/mcps/framework-help.server.ts +467 -0
- package/src/mcps/governance.server.ts +551 -0
- package/src/mcps/in-process-skill-registry.ts +79 -0
- package/src/mcps/knowledge-skills/api-design.server.test.ts +41 -0
- package/src/mcps/knowledge-skills/api-design.server.ts +160 -0
- package/src/mcps/knowledge-skills/architecture-patterns.server.ts +152 -0
- package/src/mcps/knowledge-skills/bug-triage-specialist.server.ts +624 -0
- package/src/mcps/knowledge-skills/code-analyzer.server.test.ts +129 -0
- package/src/mcps/knowledge-skills/code-analyzer.server.ts +591 -0
- package/src/mcps/knowledge-skills/code-review.server.ts +1132 -0
- package/src/mcps/knowledge-skills/content-creator.server.ts +300 -0
- package/src/mcps/knowledge-skills/database-design.server.ts +1200 -0
- package/src/mcps/knowledge-skills/devops-deployment.server.ts +1622 -0
- package/src/mcps/knowledge-skills/git-workflow.server.ts +152 -0
- package/src/mcps/knowledge-skills/growth-strategist.server.ts +413 -0
- package/src/mcps/knowledge-skills/log-monitor.server.ts +619 -0
- package/src/mcps/knowledge-skills/mobile-development.server.ts +672 -0
- package/src/mcps/knowledge-skills/multimodal-looker.server.ts +1500 -0
- package/src/mcps/knowledge-skills/performance-optimization.server.ts +2065 -0
- package/src/mcps/knowledge-skills/project-analysis.server.ts +1111 -0
- package/src/mcps/knowledge-skills/refactoring-strategies.server.ts +1092 -0
- package/src/mcps/knowledge-skills/security-audit.server.test.ts +112 -0
- package/src/mcps/knowledge-skills/security-audit.server.ts +1193 -0
- package/src/mcps/knowledge-skills/seo-consultant.server.ts +1160 -0
- package/src/mcps/knowledge-skills/session-management.server.ts +576 -0
- package/src/mcps/knowledge-skills/skill-invocation.server.ts +941 -0
- package/src/mcps/knowledge-skills/strategist.server.ts +267 -0
- package/src/mcps/knowledge-skills/tech-writer.server.ts +1638 -0
- package/src/mcps/knowledge-skills/testing-best-practices.server.test.ts +136 -0
- package/src/mcps/knowledge-skills/testing-best-practices.server.ts +1232 -0
- package/src/mcps/knowledge-skills/testing-strategy.server.test.ts +100 -0
- package/src/mcps/knowledge-skills/testing-strategy.server.ts +1172 -0
- package/src/mcps/knowledge-skills/ui-ux-design.server.ts +2076 -0
- package/src/mcps/lint.server.ts +483 -0
- package/src/mcps/mcp-client.ts +706 -0
- package/src/mcps/model-health-check.server.ts +292 -0
- package/src/mcps/orchestrator/config/agent-capabilities.ts +108 -0
- package/src/mcps/orchestrator/execution/execution-planner.ts +353 -0
- package/src/mcps/orchestrator/handlers/complexity-handler.ts +125 -0
- package/src/mcps/orchestrator/handlers/status-handler.ts +295 -0
- package/src/mcps/orchestrator/handlers/task-handler.ts +268 -0
- package/src/mcps/orchestrator/server.ts +388 -0
- package/src/mcps/orchestrator/types.ts +81 -0
- package/src/mcps/orchestrator.server.ts +34 -0
- package/src/mcps/performance-analysis.server.ts +715 -0
- package/src/mcps/processor-pipeline.server.ts +778 -0
- package/src/mcps/protocol/protocol-constants.ts +51 -0
- package/src/mcps/registry.json +110 -0
- package/src/mcps/researcher.server.ts +595 -0
- package/src/mcps/security-scan.server.ts +651 -0
- package/src/mcps/simulation/__tests__/simulation-engine.test.ts +275 -0
- package/src/mcps/simulation/index.ts +23 -0
- package/src/mcps/simulation/server-simulations.ts +241 -0
- package/src/mcps/simulation/simulation-engine.ts +126 -0
- package/src/mcps/state-manager.server.ts +777 -0
- package/src/mcps/tools/__tests__/tool-cache.test.ts +205 -0
- package/src/mcps/tools/__tests__/tool-discovery.test.ts +189 -0
- package/src/mcps/tools/__tests__/tool-executor.test.ts +215 -0
- package/src/mcps/tools/__tests__/tool-registry.test.ts +230 -0
- package/src/mcps/tools/index.ts +15 -0
- package/src/mcps/tools/tool-cache.ts +145 -0
- package/src/mcps/tools/tool-discovery.ts +83 -0
- package/src/mcps/tools/tool-executor.ts +106 -0
- package/src/mcps/tools/tool-registry.ts +78 -0
- package/src/mcps/types/__tests__/types.test.ts +341 -0
- package/src/mcps/types/index.ts +17 -0
- package/src/mcps/types/json-rpc.types.ts +38 -0
- package/src/mcps/types/mcp.types.ts +115 -0
- package/src/opencode/agents/api-design.yml +31 -0
- package/src/opencode/agents/architect.yml +15 -0
- package/src/opencode/agents/architecture-patterns.yml +14 -0
- package/src/opencode/agents/auto-format.yml +14 -0
- package/src/opencode/agents/backend-engineer.yml +12 -0
- package/src/opencode/agents/boot-orchestrator.yml +14 -0
- package/src/opencode/agents/bug-triage-specialist.yml +15 -0
- package/src/opencode/agents/code-analyzer.yml +12 -0
- package/src/opencode/agents/code-reviewer.yml +14 -0
- package/src/opencode/agents/content-creator.yml +12 -0
- package/src/opencode/agents/database-engineer.yml +12 -0
- package/src/opencode/agents/devops-engineer.yml +12 -0
- package/src/opencode/agents/framework-compliance-audit.yml +14 -0
- package/src/opencode/agents/frontend-engineer.yml +12 -0
- package/src/opencode/agents/frontend-ui-ux-engineer.yml +12 -0
- package/src/opencode/agents/git-workflow.yml +15 -0
- package/src/opencode/agents/growth-strategist.yml +12 -0
- package/src/opencode/agents/hermes-agent.yml +12 -0
- package/src/opencode/agents/inference-improve.yml +12 -0
- package/src/opencode/agents/lint.yml +14 -0
- package/src/opencode/agents/log-monitor.yml +12 -0
- package/src/opencode/agents/mobile-developer.yml +12 -0
- package/src/opencode/agents/model-health-check.yml +12 -0
- package/src/opencode/agents/multimodal-looker.yml +12 -0
- package/src/opencode/agents/performance-analysis.yml +12 -0
- package/src/opencode/agents/performance-engineer.yml +12 -0
- package/src/opencode/agents/performance-optimization.yml +12 -0
- package/src/opencode/agents/processor-pipeline.yml +14 -0
- package/src/opencode/agents/project-analysis.yml +12 -0
- package/src/opencode/agents/refactorer.yml +12 -0
- package/src/opencode/agents/researcher.yml +12 -0
- package/src/opencode/agents/security-auditor.yml +12 -0
- package/src/opencode/agents/security-scan.yml +12 -0
- package/src/opencode/agents/seo-consultant.yml +12 -0
- package/src/opencode/agents/session-management.yml +12 -0
- package/src/opencode/agents/state-manager.yml +12 -0
- package/src/opencode/agents/storyteller.yml +12 -0
- package/src/opencode/agents/strategist.yml +12 -0
- package/src/opencode/agents/tech-writer.yml +12 -0
- package/src/opencode/agents/testing-best-practices.yml +12 -0
- package/src/opencode/agents/testing-lead.yml +12 -0
- package/src/opencode/agents/ui-ux-design.yml +12 -0
- package/src/opencode/codex.codex +8 -0
- package/src/opencode/commands/auto-format.md +99 -0
- package/src/opencode/commands/auto-summary-capture.md +90 -0
- package/src/opencode/commands/dependency-audit.md +184 -0
- package/src/opencode/commands/enforcer-daily-scan.md +137 -0
- package/src/opencode/commands/framework-compliance-audit.md +205 -0
- package/src/opencode/commands/interactive-validator.md +75 -0
- package/src/opencode/commands/job-summary-logger.md +68 -0
- package/src/opencode/commands/lint.md +11 -0
- package/src/opencode/commands/mode-switch.md +95 -0
- package/src/opencode/commands/model-health-check.md +186 -0
- package/src/opencode/commands/performance-analysis.md +144 -0
- package/src/opencode/commands/pre-commit-introspection.md +185 -0
- package/src/opencode/commands/pre-commit-introspection.sh +133 -0
- package/src/opencode/commands/security-scan.md +157 -0
- package/src/opencode/commands/sisyphus-validation.md +128 -0
- package/src/opencode/commands/summary-logger.md +83 -0
- package/src/opencode/enforcer-config.json +285 -0
- package/src/opencode/openclaw/config.json +25 -0
- package/src/opencode/workflows/post-deployment-audit.yml +123 -0
- package/src/skills/api-design/SKILL.md +37 -0
- package/src/skills/architect-tools/SKILL.md +37 -0
- package/src/skills/architecture-patterns/SKILL.md +37 -0
- package/src/skills/auto-format/SKILL.md +37 -0
- package/src/skills/backend-engineer/SKILL.md +49 -0
- package/src/skills/boot-orchestrator/SKILL.md +37 -0
- package/src/skills/bug-triage/SKILL.md +43 -0
- package/src/skills/code-analyzer/SKILL.md +45 -0
- package/src/skills/code-review/SKILL.md +52 -0
- package/src/skills/content-creator/SKILL.md +38 -0
- package/src/skills/database-engineer/SKILL.md +46 -0
- package/src/skills/devops-engineer/SKILL.md +49 -0
- package/src/skills/enforcer/SKILL.md +37 -0
- package/src/skills/framework-compliance-audit/SKILL.md +37 -0
- package/src/skills/frontend-engineer/SKILL.md +49 -0
- package/src/skills/frontend-ui-ux-engineer/SKILL.md +41 -0
- package/src/skills/git-workflow/SKILL.md +37 -0
- package/src/skills/growth-strategist/SKILL.md +48 -0
- package/src/skills/hermes-agent/SKILL.md +212 -0
- package/src/skills/inference-improve/SKILL.md +97 -0
- package/src/skills/lint/SKILL.md +37 -0
- package/src/skills/log-monitor/SKILL.md +44 -0
- package/src/skills/mobile-developer/SKILL.md +42 -0
- package/src/skills/model-health-check/SKILL.md +37 -0
- package/src/skills/multimodal-looker/SKILL.md +45 -0
- package/src/skills/orchestrator/SKILL.md +37 -0
- package/src/skills/performance-analysis/SKILL.md +37 -0
- package/src/skills/performance-engineer/SKILL.md +41 -0
- package/src/skills/performance-optimization/SKILL.md +37 -0
- package/src/skills/processor-pipeline/SKILL.md +37 -0
- package/src/skills/project-analysis/SKILL.md +42 -0
- package/src/skills/refactoring-strategies/SKILL.md +37 -0
- package/src/skills/registry.json +66 -0
- package/src/skills/researcher/SKILL.md +37 -0
- package/src/skills/security-audit/SKILL.md +48 -0
- package/src/skills/security-scan/SKILL.md +37 -0
- package/src/skills/seo-consultant/SKILL.md +43 -0
- package/src/skills/session-management/SKILL.md +36 -0
- package/src/skills/state-manager/SKILL.md +37 -0
- package/src/skills/storyteller/SKILL.md +130 -0
- package/src/skills/strategist/SKILL.md +32 -0
- package/src/skills/tech-writer/SKILL.md +37 -0
- package/src/skills/testing-best-practices/SKILL.md +37 -0
- package/src/skills/testing-strategy/SKILL.md +43 -0
- package/src/skills/ui-ux-design/SKILL.md +603 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule Enforcement Core Components
|
|
3
|
+
*
|
|
4
|
+
* This module exports the core components of the rule enforcement system.
|
|
5
|
+
* These components handle rule storage, hierarchy, execution, and fixing.
|
|
6
|
+
*
|
|
7
|
+
* Phase 5 refactoring: Extracted from RuleEnforcer.
|
|
8
|
+
*
|
|
9
|
+
* @module enforcement/core
|
|
10
|
+
* @version 1.0.0
|
|
11
|
+
*/
|
|
12
|
+
// Rule storage and management
|
|
13
|
+
export { RuleRegistry } from './rule-registry.js';
|
|
14
|
+
// Rule dependency management
|
|
15
|
+
export { RuleHierarchy } from './rule-hierarchy.js';
|
|
16
|
+
// Validation execution orchestration
|
|
17
|
+
export { RuleExecutor } from './rule-executor.js';
|
|
18
|
+
// Violation fix delegation
|
|
19
|
+
export { ViolationFixer } from './violation-fixer.js';
|
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule Executor - Orchestrate validation execution
|
|
3
|
+
*
|
|
4
|
+
* This class orchestrates the execution of validation rules, handling
|
|
5
|
+
* single rule execution, batch execution, parallel vs serial execution,
|
|
6
|
+
* dependency ordering, timeouts, and error handling.
|
|
7
|
+
*
|
|
8
|
+
* Phase 5 refactoring: Extracted from RuleEnforcer.
|
|
9
|
+
*
|
|
10
|
+
* @module enforcement/core
|
|
11
|
+
* @version 1.0.0
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* const executor = new RuleExecutor(registry, hierarchy, validatorRegistry);
|
|
16
|
+
*
|
|
17
|
+
* // Execute all applicable rules for an operation
|
|
18
|
+
* const report = await executor.execute('write', context);
|
|
19
|
+
*
|
|
20
|
+
* // Execute a specific rule
|
|
21
|
+
* const result = await executor.executeSingle('no-duplicate-code', context);
|
|
22
|
+
*
|
|
23
|
+
* // Execute multiple rules in batch
|
|
24
|
+
* const results = await executor.executeBatch(['rule1', 'rule2'], context);
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
import { frameworkLogger } from '../../core/framework-logger.js';
|
|
28
|
+
import { isRuleValidationResult, } from '../types.js';
|
|
29
|
+
/**
|
|
30
|
+
* RuleExecutor orchestrates the execution of validation rules.
|
|
31
|
+
*
|
|
32
|
+
* Key responsibilities:
|
|
33
|
+
* - Execute single rules
|
|
34
|
+
* - Execute rules in batch (parallel or serial)
|
|
35
|
+
* - Sort rules by dependency order
|
|
36
|
+
* - Handle timeouts and errors
|
|
37
|
+
* - Generate validation reports
|
|
38
|
+
*/
|
|
39
|
+
export class RuleExecutor {
|
|
40
|
+
registry;
|
|
41
|
+
hierarchy;
|
|
42
|
+
validatorRegistry;
|
|
43
|
+
/** Default timeout for rule validation in milliseconds */
|
|
44
|
+
DEFAULT_TIMEOUT_MS = 30000;
|
|
45
|
+
constructor(registry, hierarchy, validatorRegistry) {
|
|
46
|
+
this.registry = registry;
|
|
47
|
+
this.hierarchy = hierarchy;
|
|
48
|
+
this.validatorRegistry = validatorRegistry;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Execute validation for an operation against all applicable rules.
|
|
52
|
+
*
|
|
53
|
+
* This method:
|
|
54
|
+
* 1. Gets all applicable rules for the operation
|
|
55
|
+
* 2. Sorts them by dependency order
|
|
56
|
+
* 3. Executes each rule
|
|
57
|
+
* 4. Collects results and generates a validation report
|
|
58
|
+
*
|
|
59
|
+
* @param operation - The operation being performed (e.g., 'write', 'create')
|
|
60
|
+
* @param context - Validation context with code and operation info
|
|
61
|
+
* @param options - Optional execution options
|
|
62
|
+
* @returns Promise resolving to validation report
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* ```typescript
|
|
66
|
+
* const report = await executor.execute('write', {
|
|
67
|
+
* operation: 'write',
|
|
68
|
+
* files: ['src/index.ts'],
|
|
69
|
+
* newCode: 'console.log("hello");'
|
|
70
|
+
* });
|
|
71
|
+
*
|
|
72
|
+
* console.log(report.passed); // false if any rule failed
|
|
73
|
+
* console.log(report.errors); // Array of error messages
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
async execute(operation, context, options) {
|
|
77
|
+
const applicableRules = this.getApplicableRules(operation, context);
|
|
78
|
+
await frameworkLogger.log('rule-executor', 'execute-start', 'info', {
|
|
79
|
+
operation,
|
|
80
|
+
ruleCount: applicableRules.length,
|
|
81
|
+
rules: applicableRules.map(r => r.id),
|
|
82
|
+
});
|
|
83
|
+
const results = [];
|
|
84
|
+
const errors = [];
|
|
85
|
+
const warnings = [];
|
|
86
|
+
// Always sort rules by dependency order for execute()
|
|
87
|
+
const sortedRules = this.sortByDependencyOrder(applicableRules);
|
|
88
|
+
// Execute rules
|
|
89
|
+
if (options?.parallel) {
|
|
90
|
+
// Execute in parallel
|
|
91
|
+
const batchResults = await this.executeParallel(sortedRules, context, options);
|
|
92
|
+
this.processResults(batchResults, sortedRules, results, errors, warnings);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
// Execute serially
|
|
96
|
+
const executedRules = new Set();
|
|
97
|
+
for (const rule of sortedRules) {
|
|
98
|
+
// Check if dependencies are satisfied
|
|
99
|
+
if (!this.hierarchy.isDependencySatisfied(rule.id, executedRules)) {
|
|
100
|
+
const deps = this.hierarchy.getDependencies(rule.id);
|
|
101
|
+
warnings.push(`${rule.id}: dependencies not satisfied (requires: ${deps.join(', ')})`);
|
|
102
|
+
executedRules.add(rule.id);
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
try {
|
|
106
|
+
const result = await this.executeRuleWithTimeout(rule, context, options?.timeoutMs || this.DEFAULT_TIMEOUT_MS);
|
|
107
|
+
this.processResult(result, rule, results, errors, warnings);
|
|
108
|
+
executedRules.add(rule.id);
|
|
109
|
+
// Stop on first error if requested
|
|
110
|
+
if (options?.stopOnError && errors.length > 0) {
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
const errorMessage = `Rule ${rule.name} failed: ${error instanceof Error ? error.message : String(error)}`;
|
|
116
|
+
errors.push(errorMessage);
|
|
117
|
+
executedRules.add(rule.id);
|
|
118
|
+
await frameworkLogger.log('rule-executor', 'rule-execution-error', 'error', {
|
|
119
|
+
ruleId: rule.id,
|
|
120
|
+
operation,
|
|
121
|
+
error: errorMessage,
|
|
122
|
+
});
|
|
123
|
+
// Stop on first error if requested
|
|
124
|
+
if (options?.stopOnError) {
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
const report = {
|
|
131
|
+
operation,
|
|
132
|
+
passed: errors.length === 0,
|
|
133
|
+
errors,
|
|
134
|
+
warnings,
|
|
135
|
+
results,
|
|
136
|
+
timestamp: new Date(),
|
|
137
|
+
};
|
|
138
|
+
await frameworkLogger.log('rule-executor', 'execute-complete', report.passed ? 'success' : 'error', {
|
|
139
|
+
operation,
|
|
140
|
+
passed: report.passed,
|
|
141
|
+
errorCount: errors.length,
|
|
142
|
+
warningCount: warnings.length,
|
|
143
|
+
});
|
|
144
|
+
return report;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Execute a single rule by ID.
|
|
148
|
+
*
|
|
149
|
+
* @param ruleId - The ID of the rule to execute
|
|
150
|
+
* @param context - Validation context
|
|
151
|
+
* @returns Promise resolving to validation result
|
|
152
|
+
* @throws Error if rule not found or not enabled
|
|
153
|
+
*
|
|
154
|
+
* @example
|
|
155
|
+
* ```typescript
|
|
156
|
+
* const result = await executor.executeSingle('no-duplicate-code', context);
|
|
157
|
+
* console.log(result.passed); // true or false
|
|
158
|
+
* ```
|
|
159
|
+
*/
|
|
160
|
+
async executeSingle(ruleId, context) {
|
|
161
|
+
const rule = this.registry.getRule(ruleId);
|
|
162
|
+
if (!rule) {
|
|
163
|
+
throw new Error(`Rule with ID "${ruleId}" not found`);
|
|
164
|
+
}
|
|
165
|
+
if (!rule.enabled) {
|
|
166
|
+
throw new Error(`Rule "${ruleId}" is disabled`);
|
|
167
|
+
}
|
|
168
|
+
return this.executeRuleWithTimeout(rule, context, this.DEFAULT_TIMEOUT_MS);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Execute multiple rules in batch.
|
|
172
|
+
*
|
|
173
|
+
* Supports parallel or serial execution based on options.
|
|
174
|
+
* Optionally sorts rules by dependency order before execution.
|
|
175
|
+
*
|
|
176
|
+
* @param ruleIds - Array of rule IDs to execute
|
|
177
|
+
* @param context - Validation context
|
|
178
|
+
* @param options - Optional batch execution options
|
|
179
|
+
* @returns Promise resolving to array of validation results
|
|
180
|
+
*
|
|
181
|
+
* @example
|
|
182
|
+
* ```typescript
|
|
183
|
+
* const results = await executor.executeBatch(
|
|
184
|
+
* ['no-duplicate-code', 'tests-required'],
|
|
185
|
+
* context,
|
|
186
|
+
* { parallel: true, sortByDependencies: true }
|
|
187
|
+
* );
|
|
188
|
+
* ```
|
|
189
|
+
*/
|
|
190
|
+
async executeBatch(ruleIds, context, options) {
|
|
191
|
+
// Get rule definitions
|
|
192
|
+
const rules = [];
|
|
193
|
+
for (const id of ruleIds) {
|
|
194
|
+
const rule = this.registry.getRule(id);
|
|
195
|
+
if (rule && rule.enabled) {
|
|
196
|
+
rules.push(rule);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
// Sort by dependencies if requested
|
|
200
|
+
const sortedRules = options?.sortByDependencies !== false
|
|
201
|
+
? this.sortByDependencyOrder(rules)
|
|
202
|
+
: rules;
|
|
203
|
+
if (options?.parallel) {
|
|
204
|
+
return this.executeParallel(sortedRules, context, options);
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
const results = [];
|
|
208
|
+
for (const rule of sortedRules) {
|
|
209
|
+
const result = await this.executeRuleWithTimeout(rule, context, options?.timeoutMs || this.DEFAULT_TIMEOUT_MS);
|
|
210
|
+
results.push(result);
|
|
211
|
+
if (options?.stopOnError && !result.passed) {
|
|
212
|
+
break;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
return results;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Execute a rule with timeout protection.
|
|
220
|
+
*
|
|
221
|
+
* @param rule - The rule definition to execute
|
|
222
|
+
* @param context - Validation context
|
|
223
|
+
* @param timeoutMs - Timeout in milliseconds
|
|
224
|
+
* @returns Promise resolving to validation result
|
|
225
|
+
*/
|
|
226
|
+
async executeRuleWithTimeout(rule, context, timeoutMs) {
|
|
227
|
+
return new Promise((resolve, reject) => {
|
|
228
|
+
const timeoutId = setTimeout(() => {
|
|
229
|
+
reject(new Error(`Rule ${rule.id} timed out after ${timeoutMs}ms`));
|
|
230
|
+
}, timeoutMs);
|
|
231
|
+
rule.validator(context)
|
|
232
|
+
.then(result => {
|
|
233
|
+
clearTimeout(timeoutId);
|
|
234
|
+
resolve(result);
|
|
235
|
+
})
|
|
236
|
+
.catch(error => {
|
|
237
|
+
clearTimeout(timeoutId);
|
|
238
|
+
reject(error);
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Execute rules in parallel.
|
|
244
|
+
*
|
|
245
|
+
* @param rules - Array of rules to execute
|
|
246
|
+
* @param context - Validation context
|
|
247
|
+
* @param options - Execution options
|
|
248
|
+
* @returns Promise resolving to array of results
|
|
249
|
+
*/
|
|
250
|
+
async executeParallel(rules, context, options) {
|
|
251
|
+
const concurrency = options?.concurrency || rules.length;
|
|
252
|
+
const results = [];
|
|
253
|
+
// Process in chunks based on concurrency limit
|
|
254
|
+
for (let i = 0; i < rules.length; i += concurrency) {
|
|
255
|
+
const chunk = rules.slice(i, i + concurrency);
|
|
256
|
+
const chunkPromises = chunk.map(rule => this.executeRuleWithTimeout(rule, context, options?.timeoutMs || this.DEFAULT_TIMEOUT_MS).catch(error => ({
|
|
257
|
+
passed: false,
|
|
258
|
+
message: `Rule ${rule.id} failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
259
|
+
})));
|
|
260
|
+
const chunkResults = await Promise.all(chunkPromises);
|
|
261
|
+
results.push(...chunkResults);
|
|
262
|
+
// Stop on first error if requested
|
|
263
|
+
if (options?.stopOnError && chunkResults.some(r => !r.passed)) {
|
|
264
|
+
break;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
return results;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Sort rules by dependency order using the hierarchy.
|
|
271
|
+
*
|
|
272
|
+
* @param rules - Array of rules to sort
|
|
273
|
+
* @returns Sorted array of rules
|
|
274
|
+
*/
|
|
275
|
+
sortByDependencyOrder(rules) {
|
|
276
|
+
const ruleIds = rules.map(r => r.id);
|
|
277
|
+
const orderedIds = this.hierarchy.getExecutionOrder(ruleIds);
|
|
278
|
+
// Map ordered IDs back to rule definitions
|
|
279
|
+
const ruleMap = new Map(rules.map(r => [r.id, r]));
|
|
280
|
+
return orderedIds
|
|
281
|
+
.map(id => ruleMap.get(id))
|
|
282
|
+
.filter((r) => r !== undefined);
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Process a single result and categorize errors/warnings.
|
|
286
|
+
*/
|
|
287
|
+
processResult(result, rule, results, errors, warnings) {
|
|
288
|
+
if (isRuleValidationResult(result) && result.passed === false) {
|
|
289
|
+
results.push(result);
|
|
290
|
+
if (rule.severity === 'error' || rule.severity === 'blocking' || rule.severity === 'high') {
|
|
291
|
+
errors.push(`${rule.name}: ${result.message}`);
|
|
292
|
+
}
|
|
293
|
+
else if (rule.severity === 'warning') {
|
|
294
|
+
warnings.push(`${rule.name}: ${result.message}`);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Process multiple results and categorize errors/warnings.
|
|
300
|
+
*/
|
|
301
|
+
processResults(batchResults, rules, results, errors, warnings) {
|
|
302
|
+
batchResults.forEach((result, index) => {
|
|
303
|
+
const rule = rules[index];
|
|
304
|
+
if (rule && isRuleValidationResult(result) && result.passed === false) {
|
|
305
|
+
results.push(result);
|
|
306
|
+
if (rule.severity === 'error' || rule.severity === 'blocking' || rule.severity === 'high') {
|
|
307
|
+
errors.push(`${rule.name}: ${result.message}`);
|
|
308
|
+
}
|
|
309
|
+
else if (rule.severity === 'warning') {
|
|
310
|
+
warnings.push(`${rule.name}: ${result.message}`);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Get applicable rules for an operation and context.
|
|
317
|
+
*
|
|
318
|
+
* @param operation - The operation being performed
|
|
319
|
+
* @param context - Validation context
|
|
320
|
+
* @returns Array of applicable rule definitions
|
|
321
|
+
*/
|
|
322
|
+
getApplicableRules(operation, context) {
|
|
323
|
+
return this.registry.getRules().filter(rule => this.isRuleApplicable(rule, operation, context));
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Check if a rule is applicable to the current operation.
|
|
327
|
+
*
|
|
328
|
+
* @param rule - The rule definition
|
|
329
|
+
* @param operation - The operation being performed
|
|
330
|
+
* @param context - Validation context
|
|
331
|
+
* @returns true if the rule is applicable
|
|
332
|
+
*/
|
|
333
|
+
isRuleApplicable(rule, operation, context) {
|
|
334
|
+
if (!rule.enabled)
|
|
335
|
+
return false;
|
|
336
|
+
// Check operation type for specific rules
|
|
337
|
+
switch (rule.id) {
|
|
338
|
+
case 'tests-required':
|
|
339
|
+
return operation === 'write' || operation === 'create';
|
|
340
|
+
case 'no-duplicate-code':
|
|
341
|
+
return operation === 'write' && !!context.newCode;
|
|
342
|
+
case 'no-over-engineering':
|
|
343
|
+
return operation === 'write' && !!context.newCode;
|
|
344
|
+
case 'resolve-all-errors':
|
|
345
|
+
return operation === 'write' && !!context.newCode;
|
|
346
|
+
case 'prevent-infinite-loops':
|
|
347
|
+
return operation === 'write' && !!context.newCode;
|
|
348
|
+
case 'state-management-patterns':
|
|
349
|
+
return operation === 'write' && !!context.newCode;
|
|
350
|
+
case 'import-consistency':
|
|
351
|
+
return operation === 'write' && !!context.newCode;
|
|
352
|
+
case 'documentation-required':
|
|
353
|
+
return operation === 'write' || operation === 'modify';
|
|
354
|
+
case 'clean-debug-logs':
|
|
355
|
+
return operation === 'write' && !!context.newCode;
|
|
356
|
+
case 'console-log-usage':
|
|
357
|
+
return operation === 'write' && !!context.newCode;
|
|
358
|
+
case 'src-dist-integrity':
|
|
359
|
+
return ((operation === 'write' || operation === 'copy' || operation === 'modify') &&
|
|
360
|
+
!!context.files);
|
|
361
|
+
default:
|
|
362
|
+
return true;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule Hierarchy - Manage rule dependencies and execution order
|
|
3
|
+
*
|
|
4
|
+
* This class manages rule dependencies and calculates execution order.
|
|
5
|
+
* It uses topological sorting to ensure dependencies are validated before dependents.
|
|
6
|
+
*
|
|
7
|
+
* Phase 5 refactoring: Extracted from RuleEnforcer.
|
|
8
|
+
*
|
|
9
|
+
* @module enforcement/core
|
|
10
|
+
* @version 1.0.0
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* const hierarchy = new RuleHierarchy();
|
|
15
|
+
* hierarchy.addDependency('tests-required', ['no-duplicate-code']);
|
|
16
|
+
* hierarchy.addDependency('memory-optimization', ['context-analysis-integration']);
|
|
17
|
+
*
|
|
18
|
+
* const order = hierarchy.getExecutionOrder(['tests-required', 'memory-optimization']);
|
|
19
|
+
* // Result: ['no-duplicate-code', 'tests-required', 'context-analysis-integration', 'memory-optimization']
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* RuleHierarchy manages rule dependency relationships and execution ordering.
|
|
24
|
+
*
|
|
25
|
+
* Key responsibilities:
|
|
26
|
+
* - Track rule dependencies (A depends on B)
|
|
27
|
+
* - Calculate execution order via topological sort
|
|
28
|
+
* - Detect circular dependencies
|
|
29
|
+
* - Check dependency satisfaction
|
|
30
|
+
*/
|
|
31
|
+
export class RuleHierarchy {
|
|
32
|
+
/** Map of rule IDs to their dependencies */
|
|
33
|
+
dependencies = new Map();
|
|
34
|
+
/** Map of rule IDs to rules that depend on them */
|
|
35
|
+
dependents = new Map();
|
|
36
|
+
/**
|
|
37
|
+
* Add a dependency relationship.
|
|
38
|
+
* The rule will be executed after all its dependencies.
|
|
39
|
+
*
|
|
40
|
+
* @param ruleId - The rule that depends on others
|
|
41
|
+
* @param dependsOn - Array of rule IDs that must be executed first
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```typescript
|
|
45
|
+
* hierarchy.addDependency('tests-required', ['no-duplicate-code']);
|
|
46
|
+
* // tests-required will be validated after no-duplicate-code
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
addDependency(ruleId, dependsOn) {
|
|
50
|
+
// Add forward dependency relationship
|
|
51
|
+
if (!this.dependencies.has(ruleId)) {
|
|
52
|
+
this.dependencies.set(ruleId, new Set());
|
|
53
|
+
}
|
|
54
|
+
dependsOn.forEach(dep => this.dependencies.get(ruleId).add(dep));
|
|
55
|
+
// Track reverse relationship (dependents)
|
|
56
|
+
dependsOn.forEach(dep => {
|
|
57
|
+
if (!this.dependents.has(dep)) {
|
|
58
|
+
this.dependents.set(dep, new Set());
|
|
59
|
+
}
|
|
60
|
+
this.dependents.get(dep).add(ruleId);
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Get all dependencies for a rule.
|
|
65
|
+
*
|
|
66
|
+
* @param ruleId - The rule to get dependencies for
|
|
67
|
+
* @returns Array of rule IDs that the rule depends on
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* ```typescript
|
|
71
|
+
* const deps = hierarchy.getDependencies('tests-required');
|
|
72
|
+
* console.log(deps); // ['no-duplicate-code']
|
|
73
|
+
* ```
|
|
74
|
+
*/
|
|
75
|
+
getDependencies(ruleId) {
|
|
76
|
+
const deps = this.dependencies.get(ruleId);
|
|
77
|
+
return deps ? Array.from(deps) : [];
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Get all rules that depend on the given rule.
|
|
81
|
+
*
|
|
82
|
+
* @param ruleId - The rule to get dependents for
|
|
83
|
+
* @returns Array of rule IDs that depend on this rule
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* ```typescript
|
|
87
|
+
* const dependents = hierarchy.getDependents('no-duplicate-code');
|
|
88
|
+
* console.log(dependents); // ['tests-required']
|
|
89
|
+
* ```
|
|
90
|
+
*/
|
|
91
|
+
getDependents(ruleId) {
|
|
92
|
+
const deps = this.dependents.get(ruleId);
|
|
93
|
+
return deps ? Array.from(deps) : [];
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Get the execution order for a set of rules using topological sort.
|
|
97
|
+
* Rules are returned in order such that dependencies come before dependents.
|
|
98
|
+
*
|
|
99
|
+
* Uses Kahn's algorithm for topological sorting.
|
|
100
|
+
*
|
|
101
|
+
* @param ruleIds - Array of rule IDs to order
|
|
102
|
+
* @returns Sorted array of rule IDs in dependency order
|
|
103
|
+
*
|
|
104
|
+
* @example
|
|
105
|
+
* ```typescript
|
|
106
|
+
* const order = hierarchy.getExecutionOrder(['tests-required', 'no-duplicate-code']);
|
|
107
|
+
* // Result: ['no-duplicate-code', 'tests-required']
|
|
108
|
+
* ```
|
|
109
|
+
*/
|
|
110
|
+
getExecutionOrder(ruleIds) {
|
|
111
|
+
if (ruleIds.length === 0)
|
|
112
|
+
return [];
|
|
113
|
+
// Build in-degree map for rules in the set
|
|
114
|
+
const inDegree = new Map();
|
|
115
|
+
const adjacencyList = new Map();
|
|
116
|
+
// Initialize
|
|
117
|
+
ruleIds.forEach(id => {
|
|
118
|
+
inDegree.set(id, 0);
|
|
119
|
+
adjacencyList.set(id, new Set());
|
|
120
|
+
});
|
|
121
|
+
// Calculate in-degrees and adjacency list
|
|
122
|
+
ruleIds.forEach(id => {
|
|
123
|
+
const deps = this.getDependencies(id);
|
|
124
|
+
deps.forEach(dep => {
|
|
125
|
+
// Only count dependencies that are in the rule set
|
|
126
|
+
if (ruleIds.includes(dep)) {
|
|
127
|
+
inDegree.set(id, (inDegree.get(id) || 0) + 1);
|
|
128
|
+
adjacencyList.get(dep).add(id);
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
// Kahn's algorithm
|
|
133
|
+
const result = [];
|
|
134
|
+
const queue = [];
|
|
135
|
+
// Start with nodes that have no dependencies
|
|
136
|
+
inDegree.forEach((degree, id) => {
|
|
137
|
+
if (degree === 0)
|
|
138
|
+
queue.push(id);
|
|
139
|
+
});
|
|
140
|
+
while (queue.length > 0) {
|
|
141
|
+
const current = queue.shift();
|
|
142
|
+
result.push(current);
|
|
143
|
+
const dependents = adjacencyList.get(current) || new Set();
|
|
144
|
+
dependents.forEach(dependent => {
|
|
145
|
+
const newDegree = (inDegree.get(dependent) || 0) - 1;
|
|
146
|
+
inDegree.set(dependent, newDegree);
|
|
147
|
+
if (newDegree === 0) {
|
|
148
|
+
queue.push(dependent);
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
// If not all rules were processed, there's a circular dependency
|
|
153
|
+
if (result.length !== ruleIds.length) {
|
|
154
|
+
// Return rules in original order if topological sort fails
|
|
155
|
+
// This ensures we still execute rules even with cycles
|
|
156
|
+
return [...ruleIds];
|
|
157
|
+
}
|
|
158
|
+
return result;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Check if any circular dependencies exist in the hierarchy.
|
|
162
|
+
*
|
|
163
|
+
* @returns true if circular dependencies exist, false otherwise
|
|
164
|
+
*
|
|
165
|
+
* @example
|
|
166
|
+
* ```typescript
|
|
167
|
+
* if (hierarchy.hasCircularDependencies()) {
|
|
168
|
+
* console.error('Circular dependencies detected!');
|
|
169
|
+
* }
|
|
170
|
+
* ```
|
|
171
|
+
*/
|
|
172
|
+
hasCircularDependencies() {
|
|
173
|
+
return this.findCircularDependencies().length > 0;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Find all circular dependency cycles.
|
|
177
|
+
* Uses DFS to detect cycles in the dependency graph.
|
|
178
|
+
*
|
|
179
|
+
* @returns Array of cycles, where each cycle is an array of rule IDs
|
|
180
|
+
*
|
|
181
|
+
* @example
|
|
182
|
+
* ```typescript
|
|
183
|
+
* const cycles = hierarchy.findCircularDependencies();
|
|
184
|
+
* // cycles might be [['rule-a', 'rule-b', 'rule-c']]
|
|
185
|
+
* ```
|
|
186
|
+
*/
|
|
187
|
+
findCircularDependencies() {
|
|
188
|
+
const cycles = [];
|
|
189
|
+
const visited = new Set();
|
|
190
|
+
const recursionStack = new Set();
|
|
191
|
+
const dfs = (node, path) => {
|
|
192
|
+
if (recursionStack.has(node)) {
|
|
193
|
+
// Found a cycle
|
|
194
|
+
const cycleStart = path.indexOf(node);
|
|
195
|
+
if (cycleStart !== -1) {
|
|
196
|
+
const cycle = path.slice(cycleStart);
|
|
197
|
+
cycles.push(cycle);
|
|
198
|
+
}
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
if (visited.has(node)) {
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
visited.add(node);
|
|
205
|
+
recursionStack.add(node);
|
|
206
|
+
path.push(node);
|
|
207
|
+
const deps = this.getDependencies(node);
|
|
208
|
+
deps.forEach(dep => {
|
|
209
|
+
dfs(dep, [...path]);
|
|
210
|
+
});
|
|
211
|
+
recursionStack.delete(node);
|
|
212
|
+
};
|
|
213
|
+
// Check all nodes
|
|
214
|
+
this.dependencies.forEach((_, ruleId) => {
|
|
215
|
+
if (!visited.has(ruleId)) {
|
|
216
|
+
dfs(ruleId, []);
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
return cycles;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Check if all dependencies for a rule have been executed.
|
|
223
|
+
*
|
|
224
|
+
* @param ruleId - The rule to check
|
|
225
|
+
* @param executedRules - Set of rule IDs that have already been executed
|
|
226
|
+
* @returns true if all dependencies are satisfied, false otherwise
|
|
227
|
+
*
|
|
228
|
+
* @example
|
|
229
|
+
* ```typescript
|
|
230
|
+
* const executed = new Set(['no-duplicate-code']);
|
|
231
|
+
* if (hierarchy.isDependencySatisfied('tests-required', executed)) {
|
|
232
|
+
* // Safe to execute tests-required
|
|
233
|
+
* }
|
|
234
|
+
* ```
|
|
235
|
+
*/
|
|
236
|
+
isDependencySatisfied(ruleId, executedRules) {
|
|
237
|
+
const deps = this.getDependencies(ruleId);
|
|
238
|
+
return deps.every(dep => executedRules.has(dep));
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Clear all dependency relationships.
|
|
242
|
+
* Useful for testing or reinitializing.
|
|
243
|
+
*/
|
|
244
|
+
clear() {
|
|
245
|
+
this.dependencies.clear();
|
|
246
|
+
this.dependents.clear();
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Get all rules that have dependencies registered.
|
|
250
|
+
*
|
|
251
|
+
* @returns Array of rule IDs with dependencies
|
|
252
|
+
*/
|
|
253
|
+
getAllRules() {
|
|
254
|
+
const rules = new Set();
|
|
255
|
+
this.dependencies.forEach((_, ruleId) => rules.add(ruleId));
|
|
256
|
+
this.dependents.forEach((_, ruleId) => rules.add(ruleId));
|
|
257
|
+
return Array.from(rules);
|
|
258
|
+
}
|
|
259
|
+
}
|