@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
|
@@ -1,162 +1,162 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* EZ Health Check — Health monitoring for EZ workflow
|
|
5
|
-
*
|
|
6
|
-
* Validates EZ environment and configuration
|
|
7
|
-
* Used by workflows to detect failures and use fallback functions
|
|
8
|
-
*
|
|
9
|
-
* Usage:
|
|
10
|
-
* const HealthCheck = require('./health-check.cjs');
|
|
11
|
-
* const health = new HealthCheck();
|
|
12
|
-
* const result = health.runAll();
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
const fs = require('fs');
|
|
16
|
-
const path = require('path');
|
|
17
|
-
|
|
18
|
-
class HealthCheck {
|
|
19
|
-
/**
|
|
20
|
-
* Create a HealthCheck instance
|
|
21
|
-
*/
|
|
22
|
-
constructor() {
|
|
23
|
-
this.issues = [];
|
|
24
|
-
this.warnings = [];
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Check Node.js version (must be >= 16)
|
|
29
|
-
* @returns {boolean} - True if version is acceptable
|
|
30
|
-
*/
|
|
31
|
-
checkNodeVersion() {
|
|
32
|
-
try {
|
|
33
|
-
const version = process.version;
|
|
34
|
-
const major = parseInt(version.slice(1).split('.')[0]);
|
|
35
|
-
if (major < 16) {
|
|
36
|
-
this.issues.push(`Node.js version ${version} is below required 16.x`);
|
|
37
|
-
return false;
|
|
38
|
-
}
|
|
39
|
-
return true;
|
|
40
|
-
} catch (err) {
|
|
41
|
-
this.issues.push('Cannot determine Node.js version');
|
|
42
|
-
return false;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Check if .planning directory exists
|
|
48
|
-
* @returns {boolean} - True if exists
|
|
49
|
-
*/
|
|
50
|
-
checkPlanningDirectory() {
|
|
51
|
-
const planningDir = '.planning';
|
|
52
|
-
if (!fs.existsSync(planningDir)) {
|
|
53
|
-
this.warnings.push('.planning directory does not exist');
|
|
54
|
-
return false;
|
|
55
|
-
}
|
|
56
|
-
return true;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Check if config.json exists and is valid JSON
|
|
61
|
-
* @returns {boolean} - True if exists and valid
|
|
62
|
-
*/
|
|
63
|
-
checkConfigFile() {
|
|
64
|
-
const configPath = '.planning/config.json';
|
|
65
|
-
if (!fs.existsSync(configPath)) {
|
|
66
|
-
this.warnings.push('config.json not found');
|
|
67
|
-
return false;
|
|
68
|
-
}
|
|
69
|
-
try {
|
|
70
|
-
JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
71
|
-
return true;
|
|
72
|
-
} catch (err) {
|
|
73
|
-
this.issues.push('config.json is invalid JSON');
|
|
74
|
-
return false;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* Check if STATE.md exists
|
|
80
|
-
* @returns {boolean} - True if exists
|
|
81
|
-
*/
|
|
82
|
-
checkStateFile() {
|
|
83
|
-
const statePath = '.planning/STATE.md';
|
|
84
|
-
if (!fs.existsSync(statePath)) {
|
|
85
|
-
this.warnings.push('STATE.md not found');
|
|
86
|
-
return false;
|
|
87
|
-
}
|
|
88
|
-
return true;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* Check if ROADMAP.md exists
|
|
93
|
-
* @returns {boolean} - True if exists
|
|
94
|
-
*/
|
|
95
|
-
checkRoadmapFile() {
|
|
96
|
-
const roadmapPath = '.planning/ROADMAP.md';
|
|
97
|
-
if (!fs.existsSync(roadmapPath)) {
|
|
98
|
-
this.warnings.push('ROADMAP.md not found');
|
|
99
|
-
return false;
|
|
100
|
-
}
|
|
101
|
-
return true;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* Check if PROJECT.md exists
|
|
106
|
-
* @returns {boolean} - True if exists
|
|
107
|
-
*/
|
|
108
|
-
checkProjectFile() {
|
|
109
|
-
const projectPath = '.planning/PROJECT.md';
|
|
110
|
-
if (!fs.existsSync(projectPath)) {
|
|
111
|
-
this.warnings.push('PROJECT.md not found');
|
|
112
|
-
return false;
|
|
113
|
-
}
|
|
114
|
-
return true;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* Check if REQUIREMENTS.md exists
|
|
119
|
-
* @returns {boolean} - True if exists
|
|
120
|
-
*/
|
|
121
|
-
checkRequirementsFile() {
|
|
122
|
-
const reqPath = '.planning/REQUIREMENTS.md';
|
|
123
|
-
if (!fs.existsSync(reqPath)) {
|
|
124
|
-
this.warnings.push('REQUIREMENTS.md not found');
|
|
125
|
-
return false;
|
|
126
|
-
}
|
|
127
|
-
return true;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
/**
|
|
131
|
-
* Run all health checks
|
|
132
|
-
* @returns {Object} - Health status object
|
|
133
|
-
*/
|
|
134
|
-
runAll() {
|
|
135
|
-
const results = {
|
|
136
|
-
status: 'healthy',
|
|
137
|
-
timestamp: new Date().toISOString(),
|
|
138
|
-
node_version: process.version,
|
|
139
|
-
checks: {
|
|
140
|
-
node_version: this.checkNodeVersion(),
|
|
141
|
-
planning_dir: this.checkPlanningDirectory(),
|
|
142
|
-
config_file: this.checkConfigFile(),
|
|
143
|
-
state_file: this.checkStateFile(),
|
|
144
|
-
roadmap_file: this.checkRoadmapFile(),
|
|
145
|
-
project_file: this.checkProjectFile(),
|
|
146
|
-
requirements_file: this.checkRequirementsFile()
|
|
147
|
-
},
|
|
148
|
-
issues: this.issues,
|
|
149
|
-
warnings: this.warnings
|
|
150
|
-
};
|
|
151
|
-
|
|
152
|
-
if (this.issues.length > 0) {
|
|
153
|
-
results.status = 'unhealthy';
|
|
154
|
-
} else if (this.warnings.length > 0) {
|
|
155
|
-
results.status = 'degraded';
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
return results;
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
module.exports = HealthCheck;
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* EZ Health Check — Health monitoring for EZ workflow
|
|
5
|
+
*
|
|
6
|
+
* Validates EZ environment and configuration
|
|
7
|
+
* Used by workflows to detect failures and use fallback functions
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* const HealthCheck = require('./health-check.cjs');
|
|
11
|
+
* const health = new HealthCheck();
|
|
12
|
+
* const result = health.runAll();
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
const fs = require('fs');
|
|
16
|
+
const path = require('path');
|
|
17
|
+
|
|
18
|
+
class HealthCheck {
|
|
19
|
+
/**
|
|
20
|
+
* Create a HealthCheck instance
|
|
21
|
+
*/
|
|
22
|
+
constructor() {
|
|
23
|
+
this.issues = [];
|
|
24
|
+
this.warnings = [];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Check Node.js version (must be >= 16)
|
|
29
|
+
* @returns {boolean} - True if version is acceptable
|
|
30
|
+
*/
|
|
31
|
+
checkNodeVersion() {
|
|
32
|
+
try {
|
|
33
|
+
const version = process.version;
|
|
34
|
+
const major = parseInt(version.slice(1).split('.')[0]);
|
|
35
|
+
if (major < 16) {
|
|
36
|
+
this.issues.push(`Node.js version ${version} is below required 16.x`);
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
return true;
|
|
40
|
+
} catch (err) {
|
|
41
|
+
this.issues.push('Cannot determine Node.js version');
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Check if .planning directory exists
|
|
48
|
+
* @returns {boolean} - True if exists
|
|
49
|
+
*/
|
|
50
|
+
checkPlanningDirectory() {
|
|
51
|
+
const planningDir = '.planning';
|
|
52
|
+
if (!fs.existsSync(planningDir)) {
|
|
53
|
+
this.warnings.push('.planning directory does not exist');
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Check if config.json exists and is valid JSON
|
|
61
|
+
* @returns {boolean} - True if exists and valid
|
|
62
|
+
*/
|
|
63
|
+
checkConfigFile() {
|
|
64
|
+
const configPath = '.planning/config.json';
|
|
65
|
+
if (!fs.existsSync(configPath)) {
|
|
66
|
+
this.warnings.push('config.json not found');
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
71
|
+
return true;
|
|
72
|
+
} catch (err) {
|
|
73
|
+
this.issues.push('config.json is invalid JSON');
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Check if STATE.md exists
|
|
80
|
+
* @returns {boolean} - True if exists
|
|
81
|
+
*/
|
|
82
|
+
checkStateFile() {
|
|
83
|
+
const statePath = '.planning/STATE.md';
|
|
84
|
+
if (!fs.existsSync(statePath)) {
|
|
85
|
+
this.warnings.push('STATE.md not found');
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Check if ROADMAP.md exists
|
|
93
|
+
* @returns {boolean} - True if exists
|
|
94
|
+
*/
|
|
95
|
+
checkRoadmapFile() {
|
|
96
|
+
const roadmapPath = '.planning/ROADMAP.md';
|
|
97
|
+
if (!fs.existsSync(roadmapPath)) {
|
|
98
|
+
this.warnings.push('ROADMAP.md not found');
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Check if PROJECT.md exists
|
|
106
|
+
* @returns {boolean} - True if exists
|
|
107
|
+
*/
|
|
108
|
+
checkProjectFile() {
|
|
109
|
+
const projectPath = '.planning/PROJECT.md';
|
|
110
|
+
if (!fs.existsSync(projectPath)) {
|
|
111
|
+
this.warnings.push('PROJECT.md not found');
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Check if REQUIREMENTS.md exists
|
|
119
|
+
* @returns {boolean} - True if exists
|
|
120
|
+
*/
|
|
121
|
+
checkRequirementsFile() {
|
|
122
|
+
const reqPath = '.planning/REQUIREMENTS.md';
|
|
123
|
+
if (!fs.existsSync(reqPath)) {
|
|
124
|
+
this.warnings.push('REQUIREMENTS.md not found');
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Run all health checks
|
|
132
|
+
* @returns {Object} - Health status object
|
|
133
|
+
*/
|
|
134
|
+
runAll() {
|
|
135
|
+
const results = {
|
|
136
|
+
status: 'healthy',
|
|
137
|
+
timestamp: new Date().toISOString(),
|
|
138
|
+
node_version: process.version,
|
|
139
|
+
checks: {
|
|
140
|
+
node_version: this.checkNodeVersion(),
|
|
141
|
+
planning_dir: this.checkPlanningDirectory(),
|
|
142
|
+
config_file: this.checkConfigFile(),
|
|
143
|
+
state_file: this.checkStateFile(),
|
|
144
|
+
roadmap_file: this.checkRoadmapFile(),
|
|
145
|
+
project_file: this.checkProjectFile(),
|
|
146
|
+
requirements_file: this.checkRequirementsFile()
|
|
147
|
+
},
|
|
148
|
+
issues: this.issues,
|
|
149
|
+
warnings: this.warnings
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
if (this.issues.length > 0) {
|
|
153
|
+
results.status = 'unhealthy';
|
|
154
|
+
} else if (this.warnings.length > 0) {
|
|
155
|
+
results.status = 'degraded';
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
return results;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
module.exports = HealthCheck;
|
|
@@ -29,6 +29,8 @@ const auditExec = require('./audit-exec.cjs');
|
|
|
29
29
|
|
|
30
30
|
// Git
|
|
31
31
|
const GitUtils = require('./git-utils.cjs');
|
|
32
|
+
const GitWorkflowEngine = require('./git-workflow-engine.cjs');
|
|
33
|
+
const GitErrors = require('./git-errors.cjs');
|
|
32
34
|
|
|
33
35
|
// Reliability
|
|
34
36
|
const retry = require('./retry.cjs');
|
|
@@ -48,6 +50,22 @@ const modelProvider = require('./model-provider.cjs');
|
|
|
48
50
|
// Adapters
|
|
49
51
|
const assistantAdapter = require('./assistant-adapter.cjs');
|
|
50
52
|
|
|
53
|
+
// Package Manager
|
|
54
|
+
const PackageManagerService = require('./package-manager-service.cjs');
|
|
55
|
+
const PackageManagerDetector = require('./package-manager-detector.cjs');
|
|
56
|
+
const PackageManagerExecutor = require('./package-manager-executor.cjs');
|
|
57
|
+
const LockfileValidator = require('./lockfile-validator.cjs');
|
|
58
|
+
|
|
59
|
+
// BDD & Requirements (Phase 30)
|
|
60
|
+
const bddValidator = require('./bdd-validator.cjs');
|
|
61
|
+
|
|
62
|
+
// Discussion Synthesis (Phase 31)
|
|
63
|
+
const discussionSynthesizer = require('./discussion-synthesizer.cjs');
|
|
64
|
+
|
|
65
|
+
// Tier Management & Release Validation (Phase 32-33)
|
|
66
|
+
const TierManager = require('./tier-manager.cjs');
|
|
67
|
+
const ReleaseValidator = require('./release-validator.cjs');
|
|
68
|
+
|
|
51
69
|
module.exports = {
|
|
52
70
|
// Core
|
|
53
71
|
Logger,
|
|
@@ -64,6 +82,8 @@ module.exports = {
|
|
|
64
82
|
|
|
65
83
|
// Git
|
|
66
84
|
GitUtils,
|
|
85
|
+
GitWorkflowEngine,
|
|
86
|
+
GitErrors,
|
|
67
87
|
|
|
68
88
|
// Reliability
|
|
69
89
|
...retry,
|
|
@@ -82,9 +102,25 @@ module.exports = {
|
|
|
82
102
|
|
|
83
103
|
// Adapters
|
|
84
104
|
...assistantAdapter,
|
|
85
|
-
|
|
105
|
+
|
|
106
|
+
// Package Manager
|
|
107
|
+
PackageManagerService,
|
|
108
|
+
PackageManagerDetector,
|
|
109
|
+
PackageManagerExecutor,
|
|
110
|
+
LockfileValidator,
|
|
111
|
+
|
|
112
|
+
// BDD & Requirements (Phase 30)
|
|
113
|
+
...bddValidator,
|
|
114
|
+
|
|
115
|
+
// Discussion Synthesis (Phase 31)
|
|
116
|
+
...discussionSynthesizer,
|
|
117
|
+
|
|
118
|
+
// Tier Management & Release (Phase 32-33)
|
|
119
|
+
TierManager,
|
|
120
|
+
ReleaseValidator,
|
|
121
|
+
|
|
86
122
|
// Version info
|
|
87
|
-
version: '
|
|
123
|
+
version: '3.0.0',
|
|
88
124
|
|
|
89
125
|
/**
|
|
90
126
|
* Get health status of all modules
|
|
@@ -101,6 +137,8 @@ module.exports = {
|
|
|
101
137
|
safePath: 'ok',
|
|
102
138
|
auth: auth.isKeychainAvailable() ? 'keychain' : 'fallback',
|
|
103
139
|
gitUtils: 'ok',
|
|
140
|
+
gitWorkflowEngine: 'ok',
|
|
141
|
+
gitErrors: 'ok',
|
|
104
142
|
retry: 'ok',
|
|
105
143
|
circuitBreaker: 'ok',
|
|
106
144
|
fileLock: 'ok',
|
|
@@ -215,7 +215,6 @@ async function cmdInitNewProject(cwd, raw) {
|
|
|
215
215
|
const result = {
|
|
216
216
|
// Models
|
|
217
217
|
researcher_model: resolveModelInternal(cwd, 'ez-project-researcher'),
|
|
218
|
-
synthesizer_model: resolveModelInternal(cwd, 'ez-research-synthesizer'),
|
|
219
218
|
roadmapper_model: resolveModelInternal(cwd, 'ez-roadmapper'),
|
|
220
219
|
|
|
221
220
|
// Config
|
|
@@ -252,7 +251,6 @@ function cmdInitNewMilestone(cwd, raw) {
|
|
|
252
251
|
const result = {
|
|
253
252
|
// Models
|
|
254
253
|
researcher_model: resolveModelInternal(cwd, 'ez-project-researcher'),
|
|
255
|
-
synthesizer_model: resolveModelInternal(cwd, 'ez-research-synthesizer'),
|
|
256
254
|
roadmapper_model: resolveModelInternal(cwd, 'ez-roadmapper'),
|
|
257
255
|
|
|
258
256
|
// Config
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Lockfile Validator — Validate package manager lockfiles
|
|
5
|
+
*
|
|
6
|
+
* Validates lockfile integrity for npm, yarn, and pnpm:
|
|
7
|
+
* - npm: package-lock.json (JSON format with lockfileVersion)
|
|
8
|
+
* - yarn: yarn.lock (YAML-like format with metadata header)
|
|
9
|
+
* - pnpm: pnpm-lock.yaml (YAML format with lockfileVersion)
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* const LockfileValidator = require('./lockfile-validator.cjs');
|
|
13
|
+
* const validator = new LockfileValidator(cwd);
|
|
14
|
+
* const result = validator.validate('npm');
|
|
15
|
+
* // Returns: { valid, reason, lockfileVersion?, packageCount? }
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
const fs = require('fs');
|
|
19
|
+
const path = require('path');
|
|
20
|
+
const Logger = require('./logger.cjs');
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Lockfile Validator class
|
|
24
|
+
* Validates lockfile integrity for different package managers
|
|
25
|
+
*/
|
|
26
|
+
class LockfileValidator {
|
|
27
|
+
/**
|
|
28
|
+
* Create a LockfileValidator instance
|
|
29
|
+
* @param {string} cwd - Working directory (default: process.cwd())
|
|
30
|
+
*/
|
|
31
|
+
constructor(cwd = process.cwd()) {
|
|
32
|
+
this.cwd = cwd;
|
|
33
|
+
this.logger = new Logger();
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Validate lockfile for a specific package manager
|
|
38
|
+
* @param {string} manager - Package manager name ('npm', 'yarn', or 'pnpm')
|
|
39
|
+
* @returns {Object} Validation result
|
|
40
|
+
* - {boolean} valid - Whether lockfile is valid
|
|
41
|
+
* - {string} reason - Reason code if invalid
|
|
42
|
+
* - {string} message - Human-readable message if invalid
|
|
43
|
+
* - {number} lockfileVersion - Lockfile version (if valid)
|
|
44
|
+
* - {number} packageCount - Number of packages (if valid)
|
|
45
|
+
*/
|
|
46
|
+
validate(manager) {
|
|
47
|
+
const lockfilePath = this.getLockfilePath(manager);
|
|
48
|
+
|
|
49
|
+
this.logger.debug('Validating lockfile', {
|
|
50
|
+
manager,
|
|
51
|
+
lockfilePath,
|
|
52
|
+
cwd: this.cwd
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
// Check file existence
|
|
56
|
+
if (!fs.existsSync(lockfilePath)) {
|
|
57
|
+
this.logger.debug('Lockfile not found', { lockfilePath });
|
|
58
|
+
return {
|
|
59
|
+
valid: false,
|
|
60
|
+
reason: 'lockfile_missing',
|
|
61
|
+
message: `No ${path.basename(lockfilePath)} found`
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
try {
|
|
66
|
+
const content = fs.readFileSync(lockfilePath, 'utf-8');
|
|
67
|
+
|
|
68
|
+
switch (manager) {
|
|
69
|
+
case 'npm':
|
|
70
|
+
return this.validateNpmLockfile(content);
|
|
71
|
+
case 'yarn':
|
|
72
|
+
return this.validateYarnLockfile(content);
|
|
73
|
+
case 'pnpm':
|
|
74
|
+
return this.validatePnpmLockfile(content);
|
|
75
|
+
default:
|
|
76
|
+
return {
|
|
77
|
+
valid: false,
|
|
78
|
+
reason: 'unknown_manager',
|
|
79
|
+
message: `Unknown package manager: ${manager}`
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
} catch (err) {
|
|
83
|
+
this.logger.error('Lockfile read error', {
|
|
84
|
+
manager,
|
|
85
|
+
lockfilePath,
|
|
86
|
+
error: err.message
|
|
87
|
+
});
|
|
88
|
+
return {
|
|
89
|
+
valid: false,
|
|
90
|
+
reason: 'read_error',
|
|
91
|
+
message: err.message
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Validate npm lockfile (package-lock.json)
|
|
98
|
+
* @param {string} content - Lockfile content
|
|
99
|
+
* @returns {Object} Validation result
|
|
100
|
+
*/
|
|
101
|
+
validateNpmLockfile(content) {
|
|
102
|
+
try {
|
|
103
|
+
const lockfile = JSON.parse(content);
|
|
104
|
+
|
|
105
|
+
// Check required fields
|
|
106
|
+
if (!lockfile.lockfileVersion) {
|
|
107
|
+
return {
|
|
108
|
+
valid: false,
|
|
109
|
+
reason: 'invalid_format',
|
|
110
|
+
message: 'Missing lockfileVersion field'
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
if (!lockfile.packages && !lockfile.dependencies) {
|
|
115
|
+
return {
|
|
116
|
+
valid: false,
|
|
117
|
+
reason: 'empty_lockfile',
|
|
118
|
+
message: 'Lockfile has no dependencies'
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const packageCount = Object.keys(lockfile.packages || lockfile.dependencies || {}).length;
|
|
123
|
+
|
|
124
|
+
this.logger.debug('npm lockfile valid', {
|
|
125
|
+
lockfileVersion: lockfile.lockfileVersion,
|
|
126
|
+
packageCount
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
return {
|
|
130
|
+
valid: true,
|
|
131
|
+
lockfileVersion: lockfile.lockfileVersion,
|
|
132
|
+
packageCount
|
|
133
|
+
};
|
|
134
|
+
} catch (err) {
|
|
135
|
+
this.logger.debug('npm lockfile invalid JSON', { error: err.message });
|
|
136
|
+
return {
|
|
137
|
+
valid: false,
|
|
138
|
+
reason: 'invalid_json',
|
|
139
|
+
message: `Invalid JSON: ${err.message}`
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Validate yarn lockfile (yarn.lock)
|
|
146
|
+
* @param {string} content - Lockfile content
|
|
147
|
+
* @returns {Object} Validation result
|
|
148
|
+
*/
|
|
149
|
+
validateYarnLockfile(content) {
|
|
150
|
+
// Yarn lockfile is YAML-like format
|
|
151
|
+
// Check for basic structure: __metadata__ (Yarn 2+) or "# yarn lockfile v" (Yarn 1)
|
|
152
|
+
const hasYarn2Metadata = content.includes('__metadata:');
|
|
153
|
+
const hasYarn1Header = content.match(/^# yarn lockfile v/i);
|
|
154
|
+
|
|
155
|
+
if (!hasYarn2Metadata && !hasYarn1Header) {
|
|
156
|
+
this.logger.debug('yarn lockfile invalid format');
|
|
157
|
+
return {
|
|
158
|
+
valid: false,
|
|
159
|
+
reason: 'invalid_format',
|
|
160
|
+
message: 'Invalid yarn.lock format'
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Count dependency entries (lines starting with package name pattern)
|
|
165
|
+
const entryCount = (content.match(/^"?[^@\s]+@/gm) || []).length;
|
|
166
|
+
|
|
167
|
+
this.logger.debug('yarn lockfile valid', {
|
|
168
|
+
version: hasYarn2Metadata ? '2+' : '1',
|
|
169
|
+
entryCount
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
return {
|
|
173
|
+
valid: true,
|
|
174
|
+
entryCount
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Validate pnpm lockfile (pnpm-lock.yaml)
|
|
180
|
+
* @param {string} content - Lockfile content
|
|
181
|
+
* @returns {Object} Validation result
|
|
182
|
+
*/
|
|
183
|
+
validatePnpmLockfile(content) {
|
|
184
|
+
// Check for lockfileVersion
|
|
185
|
+
const versionMatch = content.match(/^lockfileVersion:\s*(\d+)/m);
|
|
186
|
+
if (!versionMatch) {
|
|
187
|
+
this.logger.debug('pnpm lockfile missing lockfileVersion');
|
|
188
|
+
return {
|
|
189
|
+
valid: false,
|
|
190
|
+
reason: 'invalid_format',
|
|
191
|
+
message: 'Missing lockfileVersion in pnpm-lock.yaml'
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
const lockfileVersion = parseInt(versionMatch[1], 10);
|
|
196
|
+
|
|
197
|
+
// Count dependency entries (lines starting with " /" which are package specs)
|
|
198
|
+
const entryCount = (content.match(/^ \/[^:]+:/gm) || []).length;
|
|
199
|
+
|
|
200
|
+
this.logger.debug('pnpm lockfile valid', {
|
|
201
|
+
lockfileVersion,
|
|
202
|
+
entryCount
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
return {
|
|
206
|
+
valid: true,
|
|
207
|
+
lockfileVersion,
|
|
208
|
+
entryCount
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Get the lockfile path for a specific package manager
|
|
214
|
+
* @param {string} manager - Package manager name
|
|
215
|
+
* @returns {string} Full path to lockfile
|
|
216
|
+
*/
|
|
217
|
+
getLockfilePath(manager) {
|
|
218
|
+
const lockfiles = {
|
|
219
|
+
'npm': 'package-lock.json',
|
|
220
|
+
'yarn': 'yarn.lock',
|
|
221
|
+
'pnpm': 'pnpm-lock.yaml'
|
|
222
|
+
};
|
|
223
|
+
return path.join(this.cwd, lockfiles[manager] || 'package-lock.json');
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
module.exports = LockfileValidator;
|