@howlil/ez-agents 3.5.0 → 4.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/README.md +735 -537
- package/agents/ez-architect-agent.md +267 -0
- package/agents/ez-backend-agent.md +303 -0
- package/agents/ez-chief-strategist.md +271 -0
- package/agents/ez-codebase-mapper.md +770 -770
- package/agents/ez-context-manager.md +319 -0
- package/agents/ez-debugger.md +1255 -1255
- package/agents/ez-design-expert.md +347 -0
- package/agents/ez-devops-agent.md +331 -0
- package/agents/ez-executor.md +487 -487
- package/agents/ez-frontend-agent.md +322 -0
- package/agents/ez-phase-researcher.md +553 -553
- package/agents/ez-planner.md +1307 -1307
- package/agents/ez-product-engineer.md +435 -0
- package/agents/ez-project-researcher.md +629 -629
- package/agents/ez-qa-agent.md +320 -0
- package/agents/ez-release-agent.md +333 -333
- package/agents/ez-requirements-agent.md +377 -377
- package/agents/ez-roadmapper.md +650 -650
- package/agents/ez-technical-writer.md +551 -0
- package/agents/ez-ux-expert.md +393 -0
- package/agents/ez-verifier.md +579 -579
- package/bin/guards/autonomy-guard.cjs +346 -0
- package/bin/guards/context-budget-guard.cjs +278 -0
- package/bin/guards/hallucination-guard.cjs +380 -0
- package/bin/guards/hidden-state-guard.cjs +182 -0
- package/bin/guards/team-overhead-guard.cjs +266 -0
- package/bin/guards/tool-sprawl-guard.cjs +271 -0
- package/bin/lib/analytics/analytics-collector.cjs +86 -0
- package/bin/lib/analytics/analytics-reporter.cjs +130 -0
- package/bin/lib/analytics/cohort-analyzer.cjs +138 -0
- package/bin/lib/analytics/funnel-analyzer.cjs +147 -0
- package/bin/lib/analytics/nps-tracker.cjs +147 -0
- package/bin/lib/archetype-detector.cjs +289 -0
- package/bin/lib/assistant-adapter.cjs +361 -0
- package/bin/lib/audit-exec.cjs +175 -0
- package/bin/lib/auth.cjs +176 -0
- package/bin/lib/backup-service.cjs +422 -0
- package/bin/lib/bdd-validator.cjs +622 -0
- package/bin/lib/business-flow-mapper.cjs +429 -0
- package/bin/lib/circuit-breaker.cjs +276 -0
- package/bin/lib/code-complexity-analyzer.cjs +360 -0
- package/bin/lib/codebase-analyzer.cjs +241 -0
- package/bin/lib/commands.cjs +691 -0
- package/bin/lib/config.cjs +236 -0
- package/bin/lib/constraint-extractor.cjs +526 -0
- package/bin/lib/content-scanner.cjs +238 -0
- package/bin/lib/context-cache.cjs +154 -0
- package/bin/lib/context-compressor.cjs +102 -0
- package/bin/lib/context-deduplicator.cjs +105 -0
- package/bin/lib/context-errors.cjs +78 -0
- package/bin/lib/context-manager.cjs +338 -0
- package/bin/lib/context-metadata-tracker.cjs +140 -0
- package/bin/lib/context-relevance-scorer.cjs +99 -0
- package/bin/lib/core.cjs +507 -0
- package/bin/lib/cost-alerts.cjs +174 -0
- package/bin/lib/cost-tracker.cjs +275 -0
- package/bin/lib/crash-recovery.cjs +220 -0
- package/bin/lib/dependency-graph.cjs +319 -0
- package/bin/lib/deploy/deploy-audit-log.cjs +76 -0
- package/bin/lib/deploy/deploy-detector.cjs +69 -0
- package/bin/lib/deploy/deploy-env-manager.cjs +109 -0
- package/bin/lib/deploy/deploy-health-check.cjs +88 -0
- package/bin/lib/deploy/deploy-pre-flight.cjs +57 -0
- package/bin/lib/deploy/deploy-rollback.cjs +72 -0
- package/bin/lib/deploy/deploy-runner.cjs +97 -0
- package/bin/lib/deploy/deploy-status.cjs +74 -0
- package/bin/lib/discussion-synthesizer.cjs +439 -0
- package/bin/lib/error-cache.cjs +114 -0
- package/bin/lib/error-registry.cjs +177 -0
- package/bin/lib/file-access.cjs +207 -0
- package/bin/lib/file-lock.cjs +236 -0
- package/bin/lib/finops/budget-enforcer.cjs +126 -0
- package/bin/lib/finops/cost-reporter.cjs +132 -0
- package/bin/lib/finops/finops-analyzer.cjs +112 -0
- package/bin/lib/finops/spot-manager.cjs +118 -0
- package/bin/lib/framework-detector.cjs +396 -0
- package/bin/lib/frontmatter.cjs +313 -0
- package/bin/lib/fs-utils.cjs +153 -0
- package/bin/lib/gate-executor.cjs +272 -0
- package/bin/lib/gates/README.md +374 -0
- package/bin/lib/gates/gate-01-requirement.cjs +303 -0
- package/bin/lib/gates/gate-02-architecture.cjs +555 -0
- package/bin/lib/gates/gate-03-code.cjs +635 -0
- package/bin/lib/gates/gate-04-security.cjs +829 -0
- package/bin/lib/git-errors.cjs +83 -0
- package/bin/lib/git-utils.cjs +321 -0
- package/bin/lib/git-workflow-engine.cjs +1157 -0
- package/bin/lib/health-check.cjs +227 -0
- package/bin/lib/index.cjs +279 -0
- package/bin/lib/init.cjs +725 -0
- package/bin/lib/lock-logger.cjs +194 -0
- package/bin/lib/lock-state.cjs +263 -0
- package/bin/lib/lockfile-validator.cjs +227 -0
- package/bin/lib/log-rotation.cjs +71 -0
- package/bin/lib/logger.cjs +125 -0
- package/bin/lib/memory-compression.cjs +256 -0
- package/bin/lib/milestone.cjs +247 -0
- package/bin/lib/model-provider.cjs +241 -0
- package/bin/lib/package-manager-detector.cjs +203 -0
- package/bin/lib/package-manager-executor.cjs +385 -0
- package/bin/lib/package-manager-service.cjs +216 -0
- package/bin/lib/perf/api-monitor.cjs +88 -0
- package/bin/lib/perf/db-optimizer.cjs +78 -0
- package/bin/lib/perf/frontend-performance.cjs +56 -0
- package/bin/lib/perf/perf-analyzer.cjs +77 -0
- package/bin/lib/perf/perf-baseline.cjs +102 -0
- package/bin/lib/perf/perf-reporter.cjs +117 -0
- package/bin/lib/perf/regression-detector.cjs +92 -0
- package/bin/lib/phase.cjs +963 -0
- package/bin/lib/planning-write.cjs +123 -0
- package/bin/lib/project-reporter.cjs +565 -0
- package/bin/lib/quality-gate.cjs +332 -0
- package/bin/lib/quality-metrics.cjs +324 -0
- package/bin/lib/recovery-manager.cjs +98 -0
- package/bin/lib/release-validator.cjs +617 -0
- package/bin/lib/retry.cjs +119 -0
- package/bin/lib/roadmap.cjs +309 -0
- package/bin/lib/safe-exec.cjs +173 -0
- package/bin/lib/safe-path.cjs +130 -0
- package/bin/lib/security-errors.cjs +62 -0
- package/bin/lib/session-chain.cjs +304 -0
- package/bin/lib/session-errors.cjs +81 -0
- package/bin/lib/session-export.cjs +251 -0
- package/bin/lib/session-import.cjs +262 -0
- package/bin/lib/session-manager.cjs +280 -0
- package/bin/lib/skill-context.cjs +148 -0
- package/bin/lib/skill-matcher.cjs +236 -0
- package/bin/lib/skill-registry.cjs +360 -0
- package/bin/lib/skill-resolver.cjs +449 -0
- package/bin/lib/skill-triggers.cjs +90 -0
- package/bin/lib/skill-validator.cjs +270 -0
- package/bin/lib/skill-versioning.cjs +355 -0
- package/bin/lib/stack-detector.cjs +399 -0
- package/bin/lib/state.cjs +736 -0
- package/bin/lib/tech-debt-analyzer.cjs +309 -0
- package/bin/lib/temp-file.cjs +239 -0
- package/bin/lib/template.cjs +223 -0
- package/bin/lib/test-file-lock.cjs +112 -0
- package/bin/lib/test-graceful.cjs +93 -0
- package/bin/lib/test-logger.cjs +60 -0
- package/bin/lib/test-safe-exec.cjs +38 -0
- package/bin/lib/test-safe-path.cjs +33 -0
- package/bin/lib/test-temp-file.cjs +125 -0
- package/bin/lib/tier-manager.cjs +428 -0
- package/bin/lib/timeout-exec.cjs +63 -0
- package/bin/lib/tradeoff-analyzer.cjs +284 -0
- package/bin/lib/url-fetch.cjs +170 -0
- package/bin/lib/verify.cjs +863 -0
- package/bin/update.js +217 -214
- package/commands/deploy.cjs +53 -0
- package/commands/ez/add-tests.md +41 -41
- package/commands/ez/audit-milestone.md +36 -36
- package/commands/ez/complete-milestone.md +136 -136
- package/commands/ez/discuss-phase.md +90 -90
- package/commands/ez/execute-phase.md +52 -52
- package/commands/ez/help.md +22 -22
- package/commands/ez/map-codebase.md +71 -71
- package/commands/ez/new-milestone.md +44 -44
- package/commands/ez/new-project.md +51 -42
- package/commands/ez/plan-phase.md +53 -53
- package/commands/ez/progress.md +36 -36
- package/commands/ez/quick.md +45 -45
- package/commands/ez/resume-work.md +40 -40
- package/commands/ez/run-phase.md +580 -0
- package/commands/ez/settings.md +36 -36
- package/commands/ez/update.md +37 -37
- package/commands/ez/verify-work.md +402 -38
- package/commands/health-check.cjs +44 -0
- package/commands/rollback.cjs +47 -0
- package/ez-agents/bin/ez-tools.cjs +599 -2
- package/ez-agents/bin/guards/autonomy-guard.cjs +346 -0
- package/ez-agents/bin/guards/context-budget-guard.cjs +247 -0
- package/ez-agents/bin/guards/hallucination-guard.cjs +271 -0
- package/ez-agents/bin/guards/hidden-state-guard.cjs +182 -0
- package/ez-agents/bin/guards/team-overhead-guard.cjs +266 -0
- package/ez-agents/bin/guards/tool-sprawl-guard.cjs +271 -0
- package/ez-agents/bin/lib/analytics/analytics-collector.cjs +86 -0
- package/ez-agents/bin/lib/analytics/analytics-reporter.cjs +130 -0
- package/ez-agents/bin/lib/analytics/cohort-analyzer.cjs +138 -0
- package/ez-agents/bin/lib/analytics/funnel-analyzer.cjs +147 -0
- package/ez-agents/bin/lib/analytics/nps-tracker.cjs +147 -0
- package/ez-agents/bin/lib/archetype-detector.cjs +289 -0
- package/ez-agents/bin/lib/audit-exec.cjs +166 -167
- package/ez-agents/bin/lib/auth.cjs +176 -176
- package/ez-agents/bin/lib/backup-service.cjs +422 -0
- package/ez-agents/bin/lib/bdd-validator.cjs +622 -622
- package/ez-agents/bin/lib/business-flow-mapper.cjs +429 -0
- package/ez-agents/bin/lib/code-complexity-analyzer.cjs +360 -0
- package/ez-agents/bin/lib/codebase-analyzer.cjs +241 -0
- package/ez-agents/bin/lib/commands.cjs +685 -685
- package/ez-agents/bin/lib/config.cjs +41 -1
- package/ez-agents/bin/lib/constraint-extractor.cjs +526 -0
- package/ez-agents/bin/lib/content-scanner.cjs +238 -238
- package/ez-agents/bin/lib/context-cache.cjs +154 -154
- package/ez-agents/bin/lib/context-errors.cjs +71 -71
- package/ez-agents/bin/lib/context-manager.cjs +220 -220
- package/ez-agents/bin/lib/core.cjs +507 -512
- package/ez-agents/bin/lib/cost-tracker.cjs +243 -0
- package/ez-agents/bin/lib/crash-recovery.cjs +172 -0
- package/ez-agents/bin/lib/dependency-graph.cjs +319 -0
- package/ez-agents/bin/lib/deploy/deploy-audit-log.cjs +76 -0
- package/ez-agents/bin/lib/deploy/deploy-detector.cjs +69 -0
- package/ez-agents/bin/lib/deploy/deploy-env-manager.cjs +109 -0
- package/ez-agents/bin/lib/deploy/deploy-health-check.cjs +88 -0
- package/ez-agents/bin/lib/deploy/deploy-pre-flight.cjs +57 -0
- package/ez-agents/bin/lib/deploy/deploy-rollback.cjs +72 -0
- package/ez-agents/bin/lib/deploy/deploy-runner.cjs +97 -0
- package/ez-agents/bin/lib/deploy/deploy-status.cjs +74 -0
- package/ez-agents/bin/lib/file-access.cjs +207 -207
- package/ez-agents/bin/lib/finops/budget-enforcer.cjs +126 -0
- package/ez-agents/bin/lib/finops/cost-reporter.cjs +132 -0
- package/ez-agents/bin/lib/finops/finops-analyzer.cjs +112 -0
- package/ez-agents/bin/lib/finops/spot-manager.cjs +118 -0
- package/ez-agents/bin/lib/framework-detector.cjs +396 -0
- package/ez-agents/bin/lib/frontmatter.cjs +3 -1
- package/ez-agents/bin/lib/gates/README.md +374 -0
- package/ez-agents/bin/lib/gates/gate-01-requirement.cjs +303 -0
- package/ez-agents/bin/lib/gates/gate-02-architecture.cjs +555 -0
- package/ez-agents/bin/lib/gates/gate-03-code.cjs +635 -0
- package/ez-agents/bin/lib/gates/gate-04-security.cjs +829 -0
- package/ez-agents/bin/lib/git-errors.cjs +83 -83
- package/ez-agents/bin/lib/git-utils.cjs +321 -321
- package/ez-agents/bin/lib/git-workflow-engine.cjs +1157 -1157
- package/ez-agents/bin/lib/health-check.cjs +162 -162
- package/ez-agents/bin/lib/index.cjs +2 -8
- package/ez-agents/bin/lib/init.cjs +0 -2
- package/ez-agents/bin/lib/lockfile-validator.cjs +227 -227
- package/ez-agents/bin/lib/log-rotation.cjs +71 -0
- package/ez-agents/bin/lib/logger.cjs +22 -47
- package/ez-agents/bin/lib/memory-compression.cjs +256 -256
- package/ez-agents/bin/lib/package-manager-detector.cjs +203 -203
- package/ez-agents/bin/lib/package-manager-executor.cjs +385 -385
- package/ez-agents/bin/lib/package-manager-service.cjs +216 -216
- package/ez-agents/bin/lib/perf/api-monitor.cjs +88 -0
- package/ez-agents/bin/lib/perf/db-optimizer.cjs +78 -0
- package/ez-agents/bin/lib/perf/frontend-performance.cjs +56 -0
- package/ez-agents/bin/lib/perf/perf-analyzer.cjs +77 -0
- package/ez-agents/bin/lib/perf/perf-baseline.cjs +102 -0
- package/ez-agents/bin/lib/perf/perf-reporter.cjs +117 -0
- package/ez-agents/bin/lib/perf/regression-detector.cjs +92 -0
- package/ez-agents/bin/lib/project-reporter.cjs +502 -0
- package/ez-agents/bin/lib/quality-gate.cjs +332 -0
- package/ez-agents/bin/lib/recovery-manager.cjs +98 -0
- package/ez-agents/bin/lib/release-validator.cjs +617 -614
- package/ez-agents/bin/lib/security-errors.cjs +62 -0
- package/ez-agents/bin/lib/session-chain.cjs +304 -304
- package/ez-agents/bin/lib/session-errors.cjs +81 -81
- package/ez-agents/bin/lib/session-export.cjs +251 -251
- package/ez-agents/bin/lib/session-import.cjs +262 -262
- package/ez-agents/bin/lib/session-manager.cjs +280 -280
- package/ez-agents/bin/lib/skill-context.cjs +148 -0
- package/ez-agents/bin/lib/skill-matcher.cjs +236 -0
- package/ez-agents/bin/lib/skill-registry.cjs +341 -0
- package/ez-agents/bin/lib/skill-resolver.cjs +449 -0
- package/ez-agents/bin/lib/skill-triggers.cjs +90 -0
- package/ez-agents/bin/lib/skill-validator.cjs +270 -0
- package/ez-agents/bin/lib/skill-versioning.cjs +355 -0
- package/ez-agents/bin/lib/stack-detector.cjs +399 -0
- package/ez-agents/bin/lib/tech-debt-analyzer.cjs +309 -0
- package/ez-agents/bin/lib/tier-manager.cjs +428 -428
- package/ez-agents/bin/lib/tradeoff-analyzer.cjs +284 -0
- package/ez-agents/bin/lib/url-fetch.cjs +170 -170
- package/ez-agents/bin/lib/verify.cjs +863 -863
- package/ez-agents/references/decimal-phase-calculation.md +65 -65
- package/ez-agents/references/git-integration.md +248 -248
- package/ez-agents/references/git-planning-commit.md +38 -38
- package/ez-agents/references/metrics-schema.md +118 -118
- package/ez-agents/references/model-profile-resolution.md +34 -34
- package/ez-agents/references/model-profiles.md +93 -93
- package/ez-agents/references/phase-argument-parsing.md +61 -61
- package/ez-agents/references/planning-config.md +340 -340
- package/ez-agents/references/tier-strategy.md +103 -103
- package/ez-agents/references/ui-brand.md +160 -160
- package/ez-agents/references/verification-patterns.md +612 -612
- package/ez-agents/templates/DEBUG.md +164 -164
- package/ez-agents/templates/UAT.md +247 -247
- package/ez-agents/templates/agent-output-format.md +404 -0
- package/ez-agents/templates/bdd-feature.md +173 -173
- package/ez-agents/templates/codebase/architecture.md +255 -255
- package/ez-agents/templates/codebase/structure.md +285 -285
- package/ez-agents/templates/copilot-instructions.md +7 -7
- package/ez-agents/templates/debug-subagent-prompt.md +91 -91
- package/ez-agents/templates/discovery.md +146 -146
- package/ez-agents/templates/discussion.md +68 -68
- package/ez-agents/templates/handoff-protocol.md +294 -0
- package/ez-agents/templates/incident-runbook.md +205 -205
- package/ez-agents/templates/mode-workflow-templates.md +301 -0
- package/ez-agents/templates/phase-prompt.md +610 -610
- package/ez-agents/templates/planner-subagent-prompt.md +117 -117
- package/ez-agents/templates/project.md +184 -184
- package/ez-agents/templates/release-checklist.md +136 -133
- package/ez-agents/templates/research.md +552 -552
- package/ez-agents/templates/rollback-plan.md +201 -201
- package/ez-agents/templates/security-user-setup.md +244 -0
- package/ez-agents/templates/skill-validation-rules.md +476 -0
- package/ez-agents/templates/state.md +180 -176
- package/ez-agents/templates/summary-complex.md +59 -59
- package/ez-agents/tests/gates/gate-01-02.test.cjs +812 -0
- package/ez-agents/tests/gates/gate-03-04.test.cjs +762 -0
- package/ez-agents/tests/gates/gate-05-validator.test.cjs +145 -0
- package/ez-agents/tests/gates/gate-06-docs-validator.test.cjs +244 -0
- package/ez-agents/tests/gates/gate-07-release-validator.test.cjs +219 -0
- package/ez-agents/tests/guards/context-budget-guard.test.cjs +145 -0
- package/ez-agents/tests/guards/edge-case-guards.test.cjs +238 -0
- package/ez-agents/tests/guards/hallucination-guard.test.cjs +124 -0
- package/ez-agents/workflows/audit-milestone.md +1 -1
- package/ez-agents/workflows/autonomous.md +844 -844
- package/ez-agents/workflows/complete-milestone.md +1 -1
- package/ez-agents/workflows/discuss-phase.md +1 -1
- package/ez-agents/workflows/execute-phase.md +124 -3
- package/ez-agents/workflows/help.md +42 -181
- package/ez-agents/workflows/hotfix.md +291 -291
- package/ez-agents/workflows/new-milestone.md +713 -713
- package/ez-agents/workflows/new-project.md +1089 -1107
- package/ez-agents/workflows/plan-phase.md +0 -40
- package/ez-agents/workflows/release.md +253 -253
- package/ez-agents/workflows/resume-session.md +215 -215
- package/ez-agents/workflows/run-phase.md +531 -0
- package/ez-agents/workflows/settings.md +2 -35
- package/hooks/dist/ez-check-update.js +81 -81
- package/hooks/dist/ez-context-monitor.js +148 -141
- package/hooks/dist/ez-statusline.js +115 -115
- package/package.json +78 -71
- package/scripts/fix-qwen-installation.js +144 -144
- package/agents/ez-integration-checker.md +0 -443
- package/agents/ez-nyquist-auditor.md +0 -176
- package/agents/ez-observer-agent.md +0 -260
- package/agents/ez-plan-checker.md +0 -706
- package/agents/ez-research-synthesizer.md +0 -247
- package/agents/ez-scrum-master-agent.md +0 -242
- package/agents/ez-tech-lead-agent.md +0 -267
- package/agents/ez-ui-auditor.md +0 -439
- package/agents/ez-ui-checker.md +0 -300
- package/agents/ez-ui-researcher.md +0 -353
- package/commands/ez/add-phase.md +0 -43
- package/commands/ez/add-todo.md +0 -47
- package/commands/ez/arch-review.md +0 -102
- package/commands/ez/auth.md +0 -87
- package/commands/ez/autonomous.md +0 -41
- package/commands/ez/check-todos.md +0 -45
- package/commands/ez/cleanup.md +0 -18
- package/commands/ez/debug.md +0 -168
- package/commands/ez/export-session.md +0 -79
- package/commands/ez/gather-requirements.md +0 -117
- package/commands/ez/git-workflow.md +0 -72
- package/commands/ez/health.md +0 -22
- package/commands/ez/hotfix.md +0 -120
- package/commands/ez/import-session.md +0 -82
- package/commands/ez/insert-phase.md +0 -32
- package/commands/ez/join-discord.md +0 -18
- package/commands/ez/list-phase-assumptions.md +0 -46
- package/commands/ez/list-sessions.md +0 -96
- package/commands/ez/package-manager.md +0 -316
- package/commands/ez/pause-work.md +0 -38
- package/commands/ez/plan-milestone-gaps.md +0 -34
- package/commands/ez/preflight.md +0 -79
- package/commands/ez/reapply-patches.md +0 -124
- package/commands/ez/release.md +0 -153
- package/commands/ez/remove-phase.md +0 -31
- package/commands/ez/research-phase.md +0 -190
- package/commands/ez/resume.md +0 -107
- package/commands/ez/set-profile.md +0 -34
- package/commands/ez/standup.md +0 -85
- package/commands/ez/stats.md +0 -18
- package/commands/ez/ui-phase.md +0 -34
- package/commands/ez/ui-review.md +0 -32
- package/commands/ez/validate-phase.md +0 -35
- package/ez-agents/bin/lib/metrics-tracker.cjs +0 -406
- package/ez-agents/templates/UI-SPEC.md +0 -100
- package/ez-agents/templates/VALIDATION.md +0 -76
- package/ez-agents/templates/context.md +0 -352
- package/ez-agents/templates/verification-report.md +0 -322
- package/ez-agents/workflows/arch-review.md +0 -54
- package/ez-agents/workflows/export-session.md +0 -255
- package/ez-agents/workflows/gather-requirements.md +0 -206
- package/ez-agents/workflows/import-session.md +0 -303
- package/ez-agents/workflows/research-phase.md +0 -74
- package/ez-agents/workflows/standup.md +0 -64
- package/ez-agents/workflows/ui-phase.md +0 -290
- package/ez-agents/workflows/ui-review.md +0 -157
- package/ez-agents/workflows/validate-phase.md +0 -167
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Perf Analyzer — Core performance analysis coordinator
|
|
3
|
+
* Orchestrates all analyzers and aggregates results
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const fs = require('fs');
|
|
7
|
+
const path = require('path');
|
|
8
|
+
|
|
9
|
+
class PerfAnalyzer {
|
|
10
|
+
constructor(cwd) {
|
|
11
|
+
this.cwd = cwd || process.cwd();
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Run all performance analyzers and aggregate results
|
|
16
|
+
* @param {Object} options - Analysis options
|
|
17
|
+
* @returns {Object} Aggregated performance results
|
|
18
|
+
*/
|
|
19
|
+
async analyze(options = {}) {
|
|
20
|
+
const results = {
|
|
21
|
+
timestamp: new Date().toISOString(),
|
|
22
|
+
db: null,
|
|
23
|
+
frontend: null,
|
|
24
|
+
api: null,
|
|
25
|
+
errors: []
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
try {
|
|
29
|
+
// Run DB analysis if DB URL provided
|
|
30
|
+
if (options.dbUrl) {
|
|
31
|
+
const { analyzeQueries } = require('./db-optimizer.cjs');
|
|
32
|
+
results.db = await analyzeQueries(options.dbUrl, options.queries || []);
|
|
33
|
+
}
|
|
34
|
+
} catch (e) {
|
|
35
|
+
results.errors.push(`DB analysis failed: ${e.message}`);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
try {
|
|
39
|
+
// Run frontend analysis if URL provided
|
|
40
|
+
if (options.url) {
|
|
41
|
+
const { runLighthouse } = require('./frontend-performance.cjs');
|
|
42
|
+
results.frontend = await runLighthouse(options.url);
|
|
43
|
+
}
|
|
44
|
+
} catch (e) {
|
|
45
|
+
results.errors.push(`Frontend analysis failed: ${e.message}`);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
try {
|
|
49
|
+
// Run API analysis if API URL provided
|
|
50
|
+
if (options.apiUrl) {
|
|
51
|
+
const { trackEndpoint } = require('./api-monitor.cjs');
|
|
52
|
+
results.api = await trackEndpoint(options.apiUrl, options.endpoints || []);
|
|
53
|
+
}
|
|
54
|
+
} catch (e) {
|
|
55
|
+
results.errors.push(`API analysis failed: ${e.message}`);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return results;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Aggregate results from multiple analyzers
|
|
63
|
+
* @param {Array} results - Array of analysis results
|
|
64
|
+
* @returns {Object} Aggregated results
|
|
65
|
+
*/
|
|
66
|
+
aggregate(results) {
|
|
67
|
+
return results.reduce((acc, r) => {
|
|
68
|
+
if (r.db) acc.db.push(r.db);
|
|
69
|
+
if (r.frontend) acc.frontend.push(r.frontend);
|
|
70
|
+
if (r.api) acc.api.push(r.api);
|
|
71
|
+
acc.errors.push(...(r.errors || []));
|
|
72
|
+
return acc;
|
|
73
|
+
}, { db: [], frontend: [], api: [], errors: [] });
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
module.exports = { PerfAnalyzer, analyze: PerfAnalyzer.prototype.analyze };
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Perf Baseline — Save and load performance baselines
|
|
3
|
+
* Stores baselines in .planning/perf-baselines/
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const fs = require('fs');
|
|
7
|
+
const path = require('path');
|
|
8
|
+
|
|
9
|
+
class PerfBaseline {
|
|
10
|
+
constructor(cwd) {
|
|
11
|
+
this.cwd = cwd || process.cwd();
|
|
12
|
+
this.baselinesDir = path.join(this.cwd, '.planning', 'perf-baselines');
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Save baseline metrics
|
|
17
|
+
* @param {Object} metrics - Metrics to save
|
|
18
|
+
* @param {string} name - Baseline name
|
|
19
|
+
* @returns {string} Path to saved baseline
|
|
20
|
+
*/
|
|
21
|
+
saveBaseline(metrics, name = 'default') {
|
|
22
|
+
// Ensure directory exists
|
|
23
|
+
if (!fs.existsSync(this.baselinesDir)) {
|
|
24
|
+
fs.mkdirSync(this.baselinesDir, { recursive: true });
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const baselinePath = path.join(this.baselinesDir, `${name}.json`);
|
|
28
|
+
const baseline = {
|
|
29
|
+
...metrics,
|
|
30
|
+
metadata: {
|
|
31
|
+
name,
|
|
32
|
+
createdAt: new Date().toISOString(),
|
|
33
|
+
updatedAt: new Date().toISOString()
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
fs.writeFileSync(baselinePath, JSON.stringify(baseline, null, 2), 'utf8');
|
|
38
|
+
return baselinePath;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Load baseline metrics
|
|
43
|
+
* @param {string} name - Baseline name
|
|
44
|
+
* @returns {Object|null} Baseline metrics or null
|
|
45
|
+
*/
|
|
46
|
+
loadBaseline(name = 'default') {
|
|
47
|
+
const baselinePath = path.join(this.baselinesDir, `${name}.json`);
|
|
48
|
+
|
|
49
|
+
if (!fs.existsSync(baselinePath)) return null;
|
|
50
|
+
|
|
51
|
+
return JSON.parse(fs.readFileSync(baselinePath, 'utf8'));
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* List all available baselines
|
|
56
|
+
* @returns {Array} Array of baseline names
|
|
57
|
+
*/
|
|
58
|
+
listBaselines() {
|
|
59
|
+
if (!fs.existsSync(this.baselinesDir)) return [];
|
|
60
|
+
|
|
61
|
+
return fs.readdirSync(this.baselinesDir)
|
|
62
|
+
.filter(f => f.endsWith('.json'))
|
|
63
|
+
.map(f => f.replace('.json', ''));
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Delete a baseline
|
|
68
|
+
* @param {string} name - Baseline name
|
|
69
|
+
* @returns {boolean} Success
|
|
70
|
+
*/
|
|
71
|
+
deleteBaseline(name) {
|
|
72
|
+
const baselinePath = path.join(this.baselinesDir, `${name}.json`);
|
|
73
|
+
|
|
74
|
+
if (!fs.existsSync(baselinePath)) return false;
|
|
75
|
+
|
|
76
|
+
fs.unlinkSync(baselinePath);
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Save baseline metrics
|
|
83
|
+
* @param {Object} metrics - Metrics to save
|
|
84
|
+
* @param {string} name - Baseline name
|
|
85
|
+
* @returns {string} Path to saved baseline
|
|
86
|
+
*/
|
|
87
|
+
function saveBaseline(metrics, name = 'default') {
|
|
88
|
+
const baseline = new PerfBaseline();
|
|
89
|
+
return baseline.saveBaseline(metrics, name);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Load baseline metrics
|
|
94
|
+
* @param {string} name - Baseline name
|
|
95
|
+
* @returns {Object|null} Baseline metrics or null
|
|
96
|
+
*/
|
|
97
|
+
function loadBaseline(name = 'default') {
|
|
98
|
+
const baseline = new PerfBaseline();
|
|
99
|
+
return baseline.loadBaseline(name);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
module.exports = { PerfBaseline, saveBaseline, loadBaseline };
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Perf Reporter — Performance report generation
|
|
3
|
+
* Generates structured reports (temp directory)
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const fs = require('fs');
|
|
7
|
+
const path = require('path');
|
|
8
|
+
|
|
9
|
+
class PerfReporter {
|
|
10
|
+
constructor(cwd) {
|
|
11
|
+
this.cwd = cwd || process.cwd();
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Generate structured performance report
|
|
16
|
+
* @param {Object} results - Analysis results from PerfAnalyzer
|
|
17
|
+
* @returns {Object} Structured report
|
|
18
|
+
*/
|
|
19
|
+
generateReport(results) {
|
|
20
|
+
return {
|
|
21
|
+
timestamp: results.timestamp || new Date().toISOString(),
|
|
22
|
+
summary: {
|
|
23
|
+
dbIssues: results.db?.suggestions?.length || 0,
|
|
24
|
+
frontendScore: results.frontend?.performance || 0,
|
|
25
|
+
apiLatency: results.api ? this.calculateAvgLatency(results.api) : 0
|
|
26
|
+
},
|
|
27
|
+
details: {
|
|
28
|
+
db: results.db || null,
|
|
29
|
+
frontend: results.frontend || null,
|
|
30
|
+
api: results.api || null
|
|
31
|
+
},
|
|
32
|
+
errors: results.errors || [],
|
|
33
|
+
recommendations: this.generateRecommendations(results)
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Save report to temp directory
|
|
39
|
+
* @param {Object} report - Report to save
|
|
40
|
+
* @param {string} filename - Optional filename
|
|
41
|
+
* @returns {string} Path to saved report
|
|
42
|
+
*/
|
|
43
|
+
saveReport(report, filename) {
|
|
44
|
+
const logsDir = path.join(process.env.TEMP || process.env.TMPDIR || '/tmp', 'ez-agents-perf');
|
|
45
|
+
if (!fs.existsSync(logsDir)) {
|
|
46
|
+
fs.mkdirSync(logsDir, { recursive: true });
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const reportFilename = filename || `perf-${Date.now()}.json`;
|
|
50
|
+
const reportPath = path.join(logsDir, reportFilename);
|
|
51
|
+
|
|
52
|
+
fs.writeFileSync(reportPath, JSON.stringify(report, null, 2), 'utf8');
|
|
53
|
+
return reportPath;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Calculate average latency from API results
|
|
58
|
+
* @param {Array} apiResults - API latency results
|
|
59
|
+
* @returns {number} Average latency
|
|
60
|
+
*/
|
|
61
|
+
calculateAvgLatency(apiResults) {
|
|
62
|
+
if (!apiResults || apiResults.length === 0) return 0;
|
|
63
|
+
const valid = apiResults.filter(r => r.latency > 0);
|
|
64
|
+
if (valid.length === 0) return 0;
|
|
65
|
+
return Math.round(valid.reduce((sum, r) => sum + r.latency, 0) / valid.length);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Generate recommendations from analysis results
|
|
70
|
+
* @param {Object} results - Analysis results
|
|
71
|
+
* @returns {Array} Recommendations
|
|
72
|
+
*/
|
|
73
|
+
generateRecommendations(results) {
|
|
74
|
+
const recommendations = [];
|
|
75
|
+
|
|
76
|
+
if (results.db?.suggestions?.length > 0) {
|
|
77
|
+
recommendations.push({
|
|
78
|
+
category: 'database',
|
|
79
|
+
priority: 'high',
|
|
80
|
+
suggestion: `Address ${results.db.suggestions.length} query optimization opportunities`
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (results.frontend?.performance < 50) {
|
|
85
|
+
recommendations.push({
|
|
86
|
+
category: 'frontend',
|
|
87
|
+
priority: 'critical',
|
|
88
|
+
suggestion: 'Frontend performance score is low - optimize bundle size and Core Web Vitals'
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return recommendations;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Generate structured performance report
|
|
98
|
+
* @param {Object} results - Analysis results from PerfAnalyzer
|
|
99
|
+
* @returns {Object} Structured report
|
|
100
|
+
*/
|
|
101
|
+
function generateReport(results) {
|
|
102
|
+
const reporter = new PerfReporter();
|
|
103
|
+
return reporter.generateReport(results);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Save report to temp directory
|
|
108
|
+
* @param {Object} report - Report to save
|
|
109
|
+
* @param {string} filename - Optional filename
|
|
110
|
+
* @returns {string} Path to saved report
|
|
111
|
+
*/
|
|
112
|
+
function saveReport(report, filename) {
|
|
113
|
+
const reporter = new PerfReporter();
|
|
114
|
+
return reporter.saveReport(report, filename);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
module.exports = { PerfReporter, generateReport, saveReport };
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Regression Detector — Baseline comparison and regression flagging
|
|
3
|
+
* Flags >10% degradation with severity levels
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
class RegressionDetector {
|
|
7
|
+
/**
|
|
8
|
+
* Detect regressions by comparing current metrics against baseline
|
|
9
|
+
* @param {Object} current - Current metrics
|
|
10
|
+
* @param {Object} baseline - Baseline metrics
|
|
11
|
+
* @param {number} threshold - Regression threshold percentage (default: 10)
|
|
12
|
+
* @returns {Array} Array of regression findings
|
|
13
|
+
*/
|
|
14
|
+
detectRegressions(current, baseline, threshold = 10) {
|
|
15
|
+
const regressions = [];
|
|
16
|
+
|
|
17
|
+
for (const [metric, currentValue] of Object.entries(current)) {
|
|
18
|
+
const baselineValue = baseline[metric];
|
|
19
|
+
if (baselineValue === undefined || baselineValue === 0) continue;
|
|
20
|
+
|
|
21
|
+
const change = ((currentValue - baselineValue) / baselineValue) * 100;
|
|
22
|
+
|
|
23
|
+
if (change > threshold) {
|
|
24
|
+
regressions.push({
|
|
25
|
+
metric,
|
|
26
|
+
current: currentValue,
|
|
27
|
+
baseline: baselineValue,
|
|
28
|
+
changePercent: Math.round(change * 100) / 100,
|
|
29
|
+
severity: change > 50 ? 'critical' : change > 20 ? 'high' : 'medium'
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return regressions;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Save baseline metrics
|
|
39
|
+
* @param {Object} metrics - Metrics to save
|
|
40
|
+
* @param {string} name - Baseline name
|
|
41
|
+
* @param {string} cwd - Working directory
|
|
42
|
+
*/
|
|
43
|
+
saveBaseline(metrics, name = 'default', cwd) {
|
|
44
|
+
const fs = require('fs');
|
|
45
|
+
const path = require('path');
|
|
46
|
+
const baselinePath = path.join(cwd || process.cwd(), '.planning', 'perf-baselines', `${name}.json`);
|
|
47
|
+
|
|
48
|
+
// Ensure directory exists
|
|
49
|
+
const dir = path.dirname(baselinePath);
|
|
50
|
+
if (!fs.existsSync(dir)) {
|
|
51
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
fs.writeFileSync(baselinePath, JSON.stringify({
|
|
55
|
+
...metrics,
|
|
56
|
+
metadata: {
|
|
57
|
+
name,
|
|
58
|
+
createdAt: new Date().toISOString()
|
|
59
|
+
}
|
|
60
|
+
}, null, 2));
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Load baseline metrics
|
|
65
|
+
* @param {string} name - Baseline name
|
|
66
|
+
* @param {string} cwd - Working directory
|
|
67
|
+
* @returns {Object|null} Baseline metrics or null
|
|
68
|
+
*/
|
|
69
|
+
loadBaseline(name = 'default', cwd) {
|
|
70
|
+
const fs = require('fs');
|
|
71
|
+
const path = require('path');
|
|
72
|
+
const baselinePath = path.join(cwd || process.cwd(), '.planning', 'perf-baselines', `${name}.json`);
|
|
73
|
+
|
|
74
|
+
if (!fs.existsSync(baselinePath)) return null;
|
|
75
|
+
|
|
76
|
+
return JSON.parse(fs.readFileSync(baselinePath, 'utf8'));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Detect regressions by comparing current metrics against baseline
|
|
82
|
+
* @param {Object} current - Current metrics
|
|
83
|
+
* @param {Object} baseline - Baseline metrics
|
|
84
|
+
* @param {number} threshold - Regression threshold percentage (default: 10)
|
|
85
|
+
* @returns {Array} Array of regression findings
|
|
86
|
+
*/
|
|
87
|
+
function detectRegressions(current, baseline, threshold = 10) {
|
|
88
|
+
const detector = new RegressionDetector();
|
|
89
|
+
return detector.detectRegressions(current, baseline, threshold);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
module.exports = { RegressionDetector, detectRegressions };
|