@howlil/ez-agents 3.4.2 → 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 -462
- 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 -0
- package/agents/ez-requirements-agent.md +377 -0
- 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/install.js +3221 -3272
- 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 -41
- 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 -45
- package/commands/ez/progress.md +36 -24
- 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 +1692 -716
- 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 -0
- 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 -0
- package/ez-agents/bin/lib/context-cache.cjs +154 -0
- package/ez-agents/bin/lib/context-errors.cjs +71 -0
- package/ez-agents/bin/lib/context-manager.cjs +220 -0
- 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/discussion-synthesizer.cjs +458 -0
- package/ez-agents/bin/lib/file-access.cjs +207 -0
- 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 -0
- package/ez-agents/bin/lib/git-utils.cjs +118 -0
- package/ez-agents/bin/lib/git-workflow-engine.cjs +1157 -0
- package/ez-agents/bin/lib/health-check.cjs +162 -162
- package/ez-agents/bin/lib/index.cjs +40 -2
- package/ez-agents/bin/lib/init.cjs +0 -2
- package/ez-agents/bin/lib/lockfile-validator.cjs +227 -0
- package/ez-agents/bin/lib/log-rotation.cjs +71 -0
- package/ez-agents/bin/lib/logger.cjs +99 -154
- package/ez-agents/bin/lib/memory-compression.cjs +256 -0
- package/ez-agents/bin/lib/package-manager-detector.cjs +203 -0
- package/ez-agents/bin/lib/package-manager-executor.cjs +385 -0
- package/ez-agents/bin/lib/package-manager-service.cjs +216 -0
- 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 -0
- package/ez-agents/bin/lib/safe-exec.cjs +128 -214
- package/ez-agents/bin/lib/security-errors.cjs +62 -0
- package/ez-agents/bin/lib/session-chain.cjs +304 -0
- package/ez-agents/bin/lib/session-errors.cjs +81 -0
- package/ez-agents/bin/lib/session-export.cjs +251 -0
- package/ez-agents/bin/lib/session-import.cjs +262 -0
- package/ez-agents/bin/lib/session-manager.cjs +280 -0
- 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 -0
- package/ez-agents/bin/lib/tradeoff-analyzer.cjs +284 -0
- package/ez-agents/bin/lib/url-fetch.cjs +170 -0
- 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 -0
- 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 -200
- package/ez-agents/references/tier-strategy.md +103 -0
- 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 -0
- 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 -0
- package/ez-agents/templates/handoff-protocol.md +294 -0
- package/ez-agents/templates/incident-runbook.md +205 -0
- 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 -0
- package/ez-agents/templates/research.md +552 -552
- package/ez-agents/templates/rollback-plan.md +201 -0
- 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 +131 -30
- 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 +169 -3
- package/ez-agents/workflows/help.md +86 -133
- package/ez-agents/workflows/hotfix.md +291 -0
- package/ez-agents/workflows/new-milestone.md +340 -11
- package/ez-agents/workflows/new-project.md +294 -318
- package/ez-agents/workflows/plan-phase.md +22 -40
- package/ez-agents/workflows/progress.md +15 -25
- package/ez-agents/workflows/release.md +253 -0
- package/ez-agents/workflows/resume-session.md +215 -0
- 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 -64
- 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-plan-checker.md +0 -706
- package/agents/ez-research-synthesizer.md +0 -247
- 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/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/health.md +0 -22
- 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/pause-work.md +0 -38
- package/commands/ez/plan-milestone-gaps.md +0 -34
- package/commands/ez/reapply-patches.md +0 -124
- package/commands/ez/remove-phase.md +0 -31
- package/commands/ez/research-phase.md +0 -190
- package/commands/ez/set-profile.md +0 -34
- 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/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/research-phase.md +0 -74
- 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,71 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Log Rotation Utility
|
|
5
|
+
*
|
|
6
|
+
* Automatically deletes EZ Agents logs older than 7 days to prevent git spam.
|
|
7
|
+
* Run this weekly or add to CI/CD cleanup job.
|
|
8
|
+
*
|
|
9
|
+
* Usage: node ez-agents/bin/lib/log-rotation.cjs [--dry-run]
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
const fs = require('fs');
|
|
13
|
+
const path = require('path');
|
|
14
|
+
|
|
15
|
+
const LOGS_DIR = path.join(process.cwd(), '.planning', 'logs');
|
|
16
|
+
const MAX_AGE_DAYS = 7;
|
|
17
|
+
const DRY_RUN = process.argv.includes('--dry-run');
|
|
18
|
+
|
|
19
|
+
function rotateLogs() {
|
|
20
|
+
if (!fs.existsSync(LOGS_DIR)) {
|
|
21
|
+
console.log('Logs directory not found:', LOGS_DIR);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const cutoff = new Date();
|
|
26
|
+
cutoff.setDate(cutoff.getDate() - MAX_AGE_DAYS);
|
|
27
|
+
|
|
28
|
+
const files = fs.readdirSync(LOGS_DIR);
|
|
29
|
+
const logFiles = files.filter(f => f.endsWith('.log'));
|
|
30
|
+
|
|
31
|
+
let deleted = 0;
|
|
32
|
+
let kept = 0;
|
|
33
|
+
let totalSize = 0;
|
|
34
|
+
|
|
35
|
+
logFiles.forEach(file => {
|
|
36
|
+
const filePath = path.join(LOGS_DIR, file);
|
|
37
|
+
const stats = fs.statSync(filePath);
|
|
38
|
+
|
|
39
|
+
if (stats.mtime < cutoff) {
|
|
40
|
+
if (DRY_RUN) {
|
|
41
|
+
console.log(`[DRY-RUN] Would delete: ${file} (${formatBytes(stats.size)})`);
|
|
42
|
+
} else {
|
|
43
|
+
fs.unlinkSync(filePath);
|
|
44
|
+
console.log(`Deleted: ${file}`);
|
|
45
|
+
}
|
|
46
|
+
deleted++;
|
|
47
|
+
totalSize += stats.size;
|
|
48
|
+
} else {
|
|
49
|
+
kept++;
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
console.log(`\n${DRY_RUN ? '[DRY-RUN] ' : ''}Log Rotation Complete`);
|
|
54
|
+
console.log(` Deleted: ${deleted} files (${formatBytes(totalSize)})`);
|
|
55
|
+
console.log(` Kept: ${kept} files (last ${MAX_AGE_DAYS} days)`);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function formatBytes(bytes) {
|
|
59
|
+
if (bytes === 0) return '0 Bytes';
|
|
60
|
+
const k = 1024;
|
|
61
|
+
const sizes = ['Bytes', 'KB', 'MB', 'GB'];
|
|
62
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
63
|
+
return Math.round(bytes / Math.pow(k, i) * 100) / 100 + ' ' + sizes[i];
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Run if called directly
|
|
67
|
+
if (require.main === module) {
|
|
68
|
+
rotateLogs();
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
module.exports = { rotateLogs };
|
|
@@ -1,154 +1,99 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* EZ Logger — Centralized logging module for EZ workflow
|
|
5
|
-
*
|
|
6
|
-
* Provides structured logging with levels (ERROR, WARN, INFO, DEBUG)
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
try {
|
|
101
|
-
fs.appendFileSync(logFile, JSON.stringify(entry) + '\n');
|
|
102
|
-
|
|
103
|
-
// Always output ERROR level to console for visibility
|
|
104
|
-
if (level === 'ERROR') {
|
|
105
|
-
console.error(`[EZ ${level}] ${message}`);
|
|
106
|
-
}
|
|
107
|
-
} catch (err) {
|
|
108
|
-
// Fallback: log to console if file write fails
|
|
109
|
-
console.error(`[EZ ${level}] ${message} (file write failed: ${err.message})`);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
/**
|
|
114
|
-
* Log an ERROR level message
|
|
115
|
-
* @param {string} msg - Error message
|
|
116
|
-
* @param {Object} ctx - Additional context
|
|
117
|
-
*/
|
|
118
|
-
error(msg, ctx) {
|
|
119
|
-
this.log('ERROR', msg, ctx);
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
/**
|
|
123
|
-
* Log a WARN level message
|
|
124
|
-
* @param {string} msg - Warning message
|
|
125
|
-
* @param {Object} ctx - Additional context
|
|
126
|
-
*/
|
|
127
|
-
warn(msg, ctx) {
|
|
128
|
-
this.log('WARN', msg, ctx);
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
/**
|
|
132
|
-
* Log an INFO level message
|
|
133
|
-
* @param {string} msg - Info message
|
|
134
|
-
* @param {Object} ctx - Additional context
|
|
135
|
-
*/
|
|
136
|
-
info(msg, ctx) {
|
|
137
|
-
this.log('INFO', msg, ctx);
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
/**
|
|
141
|
-
* Log a DEBUG level message
|
|
142
|
-
* @param {string} msg - Debug message
|
|
143
|
-
* @param {Object} ctx - Additional context
|
|
144
|
-
*/
|
|
145
|
-
debug(msg, ctx) {
|
|
146
|
-
this.log('DEBUG', msg, ctx);
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
// Singleton instance for default usage
|
|
151
|
-
const defaultLogger = new Logger();
|
|
152
|
-
|
|
153
|
-
module.exports = Logger;
|
|
154
|
-
module.exports.defaultLogger = defaultLogger;
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* EZ Logger — Centralized logging module for EZ workflow
|
|
5
|
+
*
|
|
6
|
+
* Provides structured logging with levels (ERROR, WARN, INFO, DEBUG)
|
|
7
|
+
* Logs to console only (no file logging)
|
|
8
|
+
* Replaces silent catch {} blocks with proper error logging
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* const Logger = require('./logger.cjs');
|
|
12
|
+
* const logger = new Logger();
|
|
13
|
+
* logger.error('Something failed', { context: 'details' });
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
class Logger {
|
|
17
|
+
/**
|
|
18
|
+
* Create a Logger instance
|
|
19
|
+
*/
|
|
20
|
+
constructor() {
|
|
21
|
+
// No file logging - console only
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Write a log entry to console
|
|
26
|
+
* @param {string} level - Log level (ERROR, WARN, INFO, DEBUG)
|
|
27
|
+
* @param {string} message - Log message
|
|
28
|
+
* @param {Object} context - Additional context data
|
|
29
|
+
*/
|
|
30
|
+
log(level, message, context = {}) {
|
|
31
|
+
const entry = {
|
|
32
|
+
timestamp: new Date().toISOString(),
|
|
33
|
+
level,
|
|
34
|
+
message,
|
|
35
|
+
context,
|
|
36
|
+
pid: process.pid
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
// Always output to console
|
|
40
|
+
if (level === 'ERROR') {
|
|
41
|
+
console.error(`[EZ ${level}] ${message}`);
|
|
42
|
+
} else if (level === 'WARN') {
|
|
43
|
+
console.warn(`[EZ ${level}] ${message}`);
|
|
44
|
+
} else if (process.env.DEBUG === 'ez-agents') {
|
|
45
|
+
// Only output INFO/DEBUG in debug mode
|
|
46
|
+
console.log(`[EZ ${level}] ${message}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Log an ERROR level message
|
|
52
|
+
* @param {string} msg - Error message
|
|
53
|
+
* @param {Object} ctx - Additional context
|
|
54
|
+
*/
|
|
55
|
+
error(msg, ctx) {
|
|
56
|
+
this.log('ERROR', msg, ctx);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Log a WARN level message
|
|
61
|
+
* @param {string} msg - Warning message
|
|
62
|
+
* @param {Object} ctx - Additional context
|
|
63
|
+
*/
|
|
64
|
+
warn(msg, ctx) {
|
|
65
|
+
this.log('WARN', msg, ctx);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Log an INFO level message
|
|
70
|
+
* @param {string} msg - Info message
|
|
71
|
+
* @param {Object} ctx - Additional context
|
|
72
|
+
*/
|
|
73
|
+
info(msg, ctx) {
|
|
74
|
+
this.log('INFO', msg, ctx);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Log a DEBUG level message
|
|
79
|
+
* @param {string} msg - Debug message
|
|
80
|
+
* @param {Object} ctx - Additional context
|
|
81
|
+
*/
|
|
82
|
+
debug(msg, ctx) {
|
|
83
|
+
this.log('DEBUG', msg, ctx);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Get log file path (returns null - no file logging)
|
|
88
|
+
* @returns {null} - Always null
|
|
89
|
+
*/
|
|
90
|
+
getLogFile() {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Singleton instance for default usage
|
|
96
|
+
const defaultLogger = new Logger();
|
|
97
|
+
|
|
98
|
+
module.exports = Logger;
|
|
99
|
+
module.exports.defaultLogger = defaultLogger;
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Memory Compression — Compress long session transcripts
|
|
5
|
+
*
|
|
6
|
+
* Reduces session size by keeping first N and last M messages
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
const { defaultLogger: logger } = require('./logger.cjs');
|
|
10
|
+
|
|
11
|
+
class MemoryCompression {
|
|
12
|
+
/**
|
|
13
|
+
* Create a MemoryCompression instance
|
|
14
|
+
* @param {Object} sessionManager - SessionManager instance
|
|
15
|
+
*/
|
|
16
|
+
constructor(sessionManager) {
|
|
17
|
+
this.sessionManager = sessionManager;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Compress a session transcript
|
|
22
|
+
* @param {string} sessionId - Session ID
|
|
23
|
+
* @param {Object} options - Compression options
|
|
24
|
+
* @param {number} [options.threshold=50] - Minimum messages before compression
|
|
25
|
+
* @param {number} [options.keepFirst=5] - Messages to keep at start
|
|
26
|
+
* @param {number} [options.keepLast=10] - Messages to keep at end
|
|
27
|
+
* @returns {Object} Compression result
|
|
28
|
+
*/
|
|
29
|
+
compress(sessionId, options = {}) {
|
|
30
|
+
const session = this.sessionManager.loadSession(sessionId);
|
|
31
|
+
if (!session) {
|
|
32
|
+
return { compressed: false, reason: 'Session not found' };
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const {
|
|
36
|
+
threshold = 50,
|
|
37
|
+
keepFirst = 5,
|
|
38
|
+
keepLast = 10
|
|
39
|
+
} = options;
|
|
40
|
+
|
|
41
|
+
const transcript = session.context?.transcript || '';
|
|
42
|
+
|
|
43
|
+
// Handle string transcript (split by newlines or messages)
|
|
44
|
+
let messages = [];
|
|
45
|
+
if (typeof transcript === 'string') {
|
|
46
|
+
// Try to parse as JSON array first
|
|
47
|
+
try {
|
|
48
|
+
messages = JSON.parse(transcript);
|
|
49
|
+
} catch {
|
|
50
|
+
// Split by newlines as fallback
|
|
51
|
+
messages = transcript.split('\n').filter(line => line.trim());
|
|
52
|
+
}
|
|
53
|
+
} else if (Array.isArray(transcript)) {
|
|
54
|
+
messages = transcript;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (messages.length <= threshold) {
|
|
58
|
+
logger.info('Session below compression threshold', { sessionId, messageCount: messages.length });
|
|
59
|
+
return {
|
|
60
|
+
compressed: false,
|
|
61
|
+
reason: 'Below threshold',
|
|
62
|
+
messageCount: messages.length,
|
|
63
|
+
threshold
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Create compressed transcript
|
|
68
|
+
const firstMessages = messages.slice(0, keepFirst);
|
|
69
|
+
const lastMessages = messages.slice(-keepLast);
|
|
70
|
+
const compressedCount = messages.length - keepFirst - keepLast;
|
|
71
|
+
|
|
72
|
+
const placeholder = {
|
|
73
|
+
role: 'system',
|
|
74
|
+
content: `... ${compressedCount} messages compressed ...`,
|
|
75
|
+
timestamp: new Date().toISOString(),
|
|
76
|
+
compressed: true
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
const compressedMessages = [
|
|
80
|
+
...firstMessages,
|
|
81
|
+
placeholder,
|
|
82
|
+
...lastMessages
|
|
83
|
+
];
|
|
84
|
+
|
|
85
|
+
// Update session
|
|
86
|
+
const updates = {
|
|
87
|
+
context: {
|
|
88
|
+
transcript: compressedMessages
|
|
89
|
+
},
|
|
90
|
+
metadata: {
|
|
91
|
+
compressed: true,
|
|
92
|
+
compressed_at: new Date().toISOString(),
|
|
93
|
+
compression_stats: {
|
|
94
|
+
original_count: messages.length,
|
|
95
|
+
compressed_count: compressedMessages.length,
|
|
96
|
+
removed_count: compressedCount
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
this.sessionManager.updateSession(sessionId, updates);
|
|
102
|
+
|
|
103
|
+
const reduction = Math.round((1 - compressedMessages.length / messages.length) * 100);
|
|
104
|
+
|
|
105
|
+
logger.info('Session compressed', {
|
|
106
|
+
sessionId,
|
|
107
|
+
originalLength: messages.length,
|
|
108
|
+
newLength: compressedMessages.length,
|
|
109
|
+
reduction
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
return {
|
|
113
|
+
compressed: true,
|
|
114
|
+
originalLength: messages.length,
|
|
115
|
+
newLength: compressedMessages.length,
|
|
116
|
+
reduction
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Get compression stats for a session
|
|
122
|
+
* @param {string} sessionId - Session ID
|
|
123
|
+
* @returns {Object} Compression statistics
|
|
124
|
+
*/
|
|
125
|
+
getCompressionStats(sessionId) {
|
|
126
|
+
const session = this.sessionManager.loadSession(sessionId);
|
|
127
|
+
if (!session) {
|
|
128
|
+
return { compressed: false, reason: 'Session not found' };
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
if (!session.metadata?.compressed) {
|
|
132
|
+
return { compressed: false };
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const originalSize = session.metadata.compression_stats?.original_count || 0;
|
|
136
|
+
const compressedSize = session.metadata.compression_stats?.compressed_count || 0;
|
|
137
|
+
const reduction = session.metadata.compression_stats?.removed_count || 0;
|
|
138
|
+
const reductionPercent = originalSize > 0
|
|
139
|
+
? Math.round((reduction / originalSize) * 100)
|
|
140
|
+
: 0;
|
|
141
|
+
|
|
142
|
+
return {
|
|
143
|
+
compressed: true,
|
|
144
|
+
original_size: originalSize,
|
|
145
|
+
compressed_size: compressedSize,
|
|
146
|
+
reduction_percent: reductionPercent,
|
|
147
|
+
compressed_at: session.metadata.compressed_at
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Check if session should be compressed
|
|
153
|
+
* @param {string} sessionId - Session ID
|
|
154
|
+
* @param {number} threshold - Message threshold
|
|
155
|
+
* @returns {boolean} True if compression recommended
|
|
156
|
+
*/
|
|
157
|
+
shouldCompress(sessionId, threshold = 50) {
|
|
158
|
+
const session = this.sessionManager.loadSession(sessionId);
|
|
159
|
+
if (!session) {
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
const transcript = session.context?.transcript || '';
|
|
164
|
+
let messageCount = 0;
|
|
165
|
+
|
|
166
|
+
if (typeof transcript === 'string') {
|
|
167
|
+
try {
|
|
168
|
+
const messages = JSON.parse(transcript);
|
|
169
|
+
messageCount = Array.isArray(messages) ? messages.length : 0;
|
|
170
|
+
} catch {
|
|
171
|
+
messageCount = transcript.split('\n').filter(line => line.trim()).length;
|
|
172
|
+
}
|
|
173
|
+
} else if (Array.isArray(transcript)) {
|
|
174
|
+
messageCount = transcript.length;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
return messageCount > threshold;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Compress all sessions exceeding threshold
|
|
182
|
+
* @param {Object} options - Compression options
|
|
183
|
+
* @returns {Object} Batch compression result
|
|
184
|
+
*/
|
|
185
|
+
compressAll(options = {}) {
|
|
186
|
+
const sessions = this.sessionManager.listSessions();
|
|
187
|
+
const results = {
|
|
188
|
+
total: sessions.length,
|
|
189
|
+
compressed: 0,
|
|
190
|
+
skipped: 0,
|
|
191
|
+
details: []
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
for (const sessionMeta of sessions) {
|
|
195
|
+
const shouldCompress = this.shouldCompress(sessionMeta.session_id, options.threshold);
|
|
196
|
+
|
|
197
|
+
if (shouldCompress) {
|
|
198
|
+
const result = this.compress(sessionMeta.session_id, options);
|
|
199
|
+
if (result.compressed) {
|
|
200
|
+
results.compressed++;
|
|
201
|
+
results.details.push({
|
|
202
|
+
sessionId: sessionMeta.session_id,
|
|
203
|
+
...result
|
|
204
|
+
});
|
|
205
|
+
} else {
|
|
206
|
+
results.skipped++;
|
|
207
|
+
}
|
|
208
|
+
} else {
|
|
209
|
+
results.skipped++;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
logger.info('Batch compression complete', {
|
|
214
|
+
total: results.total,
|
|
215
|
+
compressed: results.compressed,
|
|
216
|
+
skipped: results.skipped
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
return results;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Decompress a session (restore placeholder info)
|
|
224
|
+
* Note: Cannot restore original messages, only marks as decompressed
|
|
225
|
+
* @param {string} sessionId - Session ID
|
|
226
|
+
* @returns {Object} Decompression result
|
|
227
|
+
*/
|
|
228
|
+
decompress(sessionId) {
|
|
229
|
+
const session = this.sessionManager.loadSession(sessionId);
|
|
230
|
+
if (!session) {
|
|
231
|
+
return { decompressed: false, reason: 'Session not found' };
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
if (!session.metadata?.compressed) {
|
|
235
|
+
return { decompressed: false, reason: 'Not compressed' };
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// Remove compression metadata
|
|
239
|
+
this.sessionManager.updateSession(sessionId, {
|
|
240
|
+
metadata: {
|
|
241
|
+
compressed: false,
|
|
242
|
+
compressed_at: null,
|
|
243
|
+
compression_stats: null
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
logger.info('Session marked as decompressed', { sessionId });
|
|
248
|
+
|
|
249
|
+
return {
|
|
250
|
+
decompressed: true,
|
|
251
|
+
note: 'Original messages cannot be restored'
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
module.exports = MemoryCompression;
|