@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,502 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project Reporter — Aggregates codebase mapping, stack detection, and tech debt analysis
|
|
3
|
+
*
|
|
4
|
+
* Provides:
|
|
5
|
+
* - generate(structure, stack, techDebt): Aggregates all analysis into unified report
|
|
6
|
+
* - buildArchitectureOverview(structure, stack): Creates architecture summary section
|
|
7
|
+
* - buildPainPoints(techDebt): Creates prioritized issues section
|
|
8
|
+
* - buildRecommendations(techDebt, stack): Creates actionable recommendations section
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
const path = require('path');
|
|
12
|
+
|
|
13
|
+
class ProjectReporter {
|
|
14
|
+
constructor(rootPath) {
|
|
15
|
+
this.rootPath = rootPath;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Generate comprehensive project report
|
|
20
|
+
* @param {object} structure - Structure from CodebaseAnalyzer
|
|
21
|
+
* @param {object} stack - Stack from StackDetector
|
|
22
|
+
* @param {object} techDebt - Tech debt from TechDebtAnalyzer
|
|
23
|
+
* @returns {string} Markdown report
|
|
24
|
+
*/
|
|
25
|
+
generate(structure, stack, techDebt) {
|
|
26
|
+
const sections = [
|
|
27
|
+
this.buildHeader(),
|
|
28
|
+
this.buildFileStructureSummary(structure),
|
|
29
|
+
this.buildTechStackSummary(stack),
|
|
30
|
+
this.buildArchitectureOverview(structure, stack),
|
|
31
|
+
this.buildPainPoints(techDebt),
|
|
32
|
+
this.buildRecommendations(techDebt, stack)
|
|
33
|
+
];
|
|
34
|
+
|
|
35
|
+
return sections.filter(s => s).join('\n\n');
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Build report header
|
|
40
|
+
* @private
|
|
41
|
+
*/
|
|
42
|
+
buildHeader() {
|
|
43
|
+
const date = new Date().toISOString().split('T')[0];
|
|
44
|
+
return `# Project Analysis Report
|
|
45
|
+
|
|
46
|
+
**Generated:** ${date}
|
|
47
|
+
**Analysis Depth:** Standard
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Executive Summary
|
|
52
|
+
|
|
53
|
+
This report provides a comprehensive analysis of the codebase including file structure, technology stack, architecture patterns, pain points, and actionable recommendations.
|
|
54
|
+
`;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Build architecture overview section
|
|
59
|
+
* @param {object} structure - Structure from CodebaseAnalyzer
|
|
60
|
+
* @param {object} stack - Stack from StackDetector
|
|
61
|
+
* @returns {string} Markdown section
|
|
62
|
+
*/
|
|
63
|
+
buildArchitectureOverview(structure, stack) {
|
|
64
|
+
const pattern = this._detectPattern(structure, stack);
|
|
65
|
+
const layers = this._describeLayers(structure);
|
|
66
|
+
const dataFlow = this._describeDataFlow(structure);
|
|
67
|
+
const entryPoints = structure.entryPoints || [];
|
|
68
|
+
const errorHandling = this._detectErrorHandling(structure);
|
|
69
|
+
|
|
70
|
+
return `## Architecture Overview
|
|
71
|
+
|
|
72
|
+
### Pattern
|
|
73
|
+
|
|
74
|
+
**Detected Pattern:** ${pattern}
|
|
75
|
+
|
|
76
|
+
### Layers
|
|
77
|
+
|
|
78
|
+
${layers}
|
|
79
|
+
|
|
80
|
+
### Data Flow
|
|
81
|
+
|
|
82
|
+
${dataFlow}
|
|
83
|
+
|
|
84
|
+
### Entry Points
|
|
85
|
+
|
|
86
|
+
${entryPoints.length > 0 ? entryPoints.map(ep => `- \`${ep}\``).join('\n') : '- No explicit entry points detected'}
|
|
87
|
+
|
|
88
|
+
### Error Handling
|
|
89
|
+
|
|
90
|
+
${errorHandling}
|
|
91
|
+
`;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Build pain points section
|
|
96
|
+
* @param {object} techDebt - Tech debt analysis
|
|
97
|
+
* @returns {string} Markdown section
|
|
98
|
+
*/
|
|
99
|
+
buildPainPoints(techDebt) {
|
|
100
|
+
const findings = techDebt.findings || [];
|
|
101
|
+
|
|
102
|
+
// Group by severity
|
|
103
|
+
const bySeverity = {
|
|
104
|
+
Critical: [],
|
|
105
|
+
High: [],
|
|
106
|
+
Medium: [],
|
|
107
|
+
Low: []
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
for (const finding of findings) {
|
|
111
|
+
const severity = finding.severity || 'Medium';
|
|
112
|
+
if (bySeverity[severity]) {
|
|
113
|
+
bySeverity[severity].push(finding);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
let section = `## Pain Points
|
|
118
|
+
|
|
119
|
+
**Total Issues:** ${findings.length}
|
|
120
|
+
|
|
121
|
+
`;
|
|
122
|
+
|
|
123
|
+
// Critical Issues
|
|
124
|
+
if (bySeverity.Critical.length > 0) {
|
|
125
|
+
section += `### **Critical** Issues (${bySeverity.Critical.length})\n\n`;
|
|
126
|
+
for (const issue of bySeverity.Critical.slice(0, 5)) {
|
|
127
|
+
section += `- **${issue.file || 'Unknown'}** (line ${issue.line || '?'})\n`;
|
|
128
|
+
section += ` - ${issue.description || issue.content || issue.message}\n`;
|
|
129
|
+
section += ` - **Impact:** Requires immediate attention\n\n`;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// High Priority
|
|
134
|
+
if (bySeverity.High.length > 0) {
|
|
135
|
+
section += `### **High** Priority (${bySeverity.High.length})\n\n`;
|
|
136
|
+
for (const issue of bySeverity.High.slice(0, 5)) {
|
|
137
|
+
section += `- **${issue.file || 'Unknown'}**\n`;
|
|
138
|
+
section += ` - ${issue.description || issue.content || issue.message}\n\n`;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Medium Priority
|
|
143
|
+
if (bySeverity.Medium.length > 0) {
|
|
144
|
+
section += `### **Medium** Priority (${bySeverity.Medium.length})\n\n`;
|
|
145
|
+
section += `- ${bySeverity.Medium.length} medium priority issues identified\n`;
|
|
146
|
+
section += `- Review and address in upcoming sprints\n\n`;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Low Priority
|
|
150
|
+
if (bySeverity.Low.length > 0) {
|
|
151
|
+
section += `### **Low** Priority (${bySeverity.Low.length})\n\n`;
|
|
152
|
+
section += `- ${bySeverity.Low.length} low priority issues identified\n`;
|
|
153
|
+
section += `- Address as time permits\n\n`;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
if (findings.length === 0) {
|
|
157
|
+
section += '*No significant pain points identified.*\n\n';
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
return section;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Build recommendations section
|
|
165
|
+
* @param {object} techDebt - Tech debt analysis
|
|
166
|
+
* @param {object} stack - Stack from StackDetector
|
|
167
|
+
* @returns {string} Markdown section
|
|
168
|
+
*/
|
|
169
|
+
buildRecommendations(techDebt, stack) {
|
|
170
|
+
const recommendations = [];
|
|
171
|
+
const findings = techDebt.findings || [];
|
|
172
|
+
|
|
173
|
+
// Generate recommendations based on findings
|
|
174
|
+
const criticalFindings = findings.filter(f => f.severity === 'Critical');
|
|
175
|
+
const highFindings = findings.filter(f => f.severity === 'High');
|
|
176
|
+
const largeFiles = findings.filter(f => f.type === 'large_file');
|
|
177
|
+
const complexityIssues = findings.filter(f => f.type === 'complexity');
|
|
178
|
+
|
|
179
|
+
// Critical issues → Immediate action
|
|
180
|
+
if (criticalFindings.length > 0) {
|
|
181
|
+
recommendations.push({
|
|
182
|
+
title: 'Address Critical Issues Immediately',
|
|
183
|
+
issue: `${criticalFindings.length} critical issues require immediate attention`,
|
|
184
|
+
files: [...new Set(criticalFindings.map(f => f.file).filter(Boolean))],
|
|
185
|
+
approach: 'Review and fix critical issues including deprecated code, security vulnerabilities, and breaking bugs',
|
|
186
|
+
effort: 'High'
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// Large files → Refactoring
|
|
191
|
+
if (largeFiles.length > 0) {
|
|
192
|
+
recommendations.push({
|
|
193
|
+
title: 'Refactor Large Files',
|
|
194
|
+
issue: `${largeFiles.length} files exceed recommended size thresholds`,
|
|
195
|
+
files: largeFiles.slice(0, 5).map(f => f.file),
|
|
196
|
+
approach: 'Split large files into smaller, focused modules. Target files with >500 lines.',
|
|
197
|
+
effort: 'Medium'
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// Complexity issues → Simplification
|
|
202
|
+
if (complexityIssues.length > 0) {
|
|
203
|
+
recommendations.push({
|
|
204
|
+
title: 'Reduce Code Complexity',
|
|
205
|
+
issue: `${complexityIssues.length} functions/files have high complexity`,
|
|
206
|
+
files: [...new Set(complexityIssues.map(f => f.file).filter(Boolean))],
|
|
207
|
+
approach: 'Extract helper functions, reduce nesting, and simplify conditional logic',
|
|
208
|
+
effort: 'Medium'
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// High priority findings
|
|
213
|
+
if (highFindings.length > 5) {
|
|
214
|
+
recommendations.push({
|
|
215
|
+
title: 'Address High Priority Tech Debt',
|
|
216
|
+
issue: `${highFindings.length} high priority issues identified`,
|
|
217
|
+
files: [...new Set(highFindings.map(f => f.file).filter(Boolean))],
|
|
218
|
+
approach: 'Create tickets for high priority issues and address in next sprint',
|
|
219
|
+
effort: 'Medium'
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// Stack-specific recommendations
|
|
224
|
+
if (stack.frameworks?.includes('Next.js')) {
|
|
225
|
+
recommendations.push({
|
|
226
|
+
title: 'Optimize Next.js Configuration',
|
|
227
|
+
issue: 'Ensure optimal Next.js setup for production',
|
|
228
|
+
files: ['next.config.js', 'package.json'],
|
|
229
|
+
approach: 'Review Next.js configuration for performance optimizations, image optimization, and caching',
|
|
230
|
+
effort: 'Low'
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
let section = `## Recommendations
|
|
235
|
+
|
|
236
|
+
`;
|
|
237
|
+
|
|
238
|
+
if (recommendations.length === 0) {
|
|
239
|
+
section += '*No specific recommendations at this time. Continue following best practices.*\n\n';
|
|
240
|
+
} else {
|
|
241
|
+
for (const rec of recommendations) {
|
|
242
|
+
section += `### ${rec.title}\n\n`;
|
|
243
|
+
section += `- **Issue:** ${rec.issue}\n`;
|
|
244
|
+
section += `- **Files:** ${rec.files.length > 0 ? rec.files.map(f => `\`${f}\``).join(', ') : 'N/A'}\n`;
|
|
245
|
+
section += `- **Fix approach:** ${rec.approach}\n`;
|
|
246
|
+
section += `- **Effort:** ${rec.effort}\n\n`;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
return section;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Build file structure summary section
|
|
255
|
+
* @param {object} structure - Structure from CodebaseAnalyzer
|
|
256
|
+
* @returns {string} Markdown section
|
|
257
|
+
*/
|
|
258
|
+
buildFileStructureSummary(structure) {
|
|
259
|
+
const directories = structure.directories || [];
|
|
260
|
+
const entryPoints = structure.entryPoints || [];
|
|
261
|
+
const configFiles = structure.configFiles || [];
|
|
262
|
+
const modules = structure.modules || [];
|
|
263
|
+
|
|
264
|
+
let section = `## File Structure
|
|
265
|
+
|
|
266
|
+
### Directory Layout
|
|
267
|
+
|
|
268
|
+
\`\`\`
|
|
269
|
+
${this._buildDirectoryTree(structure)}
|
|
270
|
+
\`\`\`
|
|
271
|
+
|
|
272
|
+
### Directory Purposes
|
|
273
|
+
|
|
274
|
+
`;
|
|
275
|
+
|
|
276
|
+
// Group directories by depth
|
|
277
|
+
const topDirs = directories.filter(d => d.depth === 1).slice(0, 10);
|
|
278
|
+
for (const dir of topDirs) {
|
|
279
|
+
const name = path.basename(dir.path);
|
|
280
|
+
const purpose = this._describeDirectoryPurpose(name);
|
|
281
|
+
section += `- **${name}** — ${purpose}\n`;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
section += `\n### Key Files\n\n`;
|
|
285
|
+
|
|
286
|
+
if (entryPoints.length > 0) {
|
|
287
|
+
section += '**Entry Points:**\n\n';
|
|
288
|
+
for (const ep of entryPoints.slice(0, 5)) {
|
|
289
|
+
section += `- \`${ep}\`\n`;
|
|
290
|
+
}
|
|
291
|
+
section += '\n';
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
if (configFiles.length > 0) {
|
|
295
|
+
section += '**Configuration Files:**\n\n';
|
|
296
|
+
for (const cf of configFiles.slice(0, 10)) {
|
|
297
|
+
const name = path.basename(cf);
|
|
298
|
+
section += `- \`${name}\`\n`;
|
|
299
|
+
}
|
|
300
|
+
section += '\n';
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
if (modules.length > 0) {
|
|
304
|
+
section += '**Module Boundaries:**\n\n';
|
|
305
|
+
for (const mod of modules.slice(0, 10)) {
|
|
306
|
+
section += `- **${mod.name}** (${mod.fileCount} files) — \`${mod.path}\`\n`;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
return section;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* Build technology stack summary section
|
|
315
|
+
* @param {object} stack - Stack from StackDetector
|
|
316
|
+
* @returns {string} Markdown section
|
|
317
|
+
*/
|
|
318
|
+
buildTechStackSummary(stack) {
|
|
319
|
+
const language = stack.language || 'Unknown';
|
|
320
|
+
const runtime = stack.runtime || 'Unknown';
|
|
321
|
+
const packageManager = stack.packageManager || 'Unknown';
|
|
322
|
+
const frameworks = stack.frameworks || [];
|
|
323
|
+
const databases = stack.databases || [];
|
|
324
|
+
const infrastructure = stack.infrastructure || [];
|
|
325
|
+
|
|
326
|
+
return `## Technology Stack
|
|
327
|
+
|
|
328
|
+
### Languages
|
|
329
|
+
|
|
330
|
+
- **Primary:** ${language}
|
|
331
|
+
- **Runtime:** ${runtime}
|
|
332
|
+
|
|
333
|
+
### Package Manager
|
|
334
|
+
|
|
335
|
+
- **Manager:** ${packageManager}
|
|
336
|
+
|
|
337
|
+
### Frameworks
|
|
338
|
+
|
|
339
|
+
${frameworks.length > 0 ? frameworks.map(f => `- ${f}`).join('\n') : '- No major frameworks detected'}
|
|
340
|
+
|
|
341
|
+
### Databases
|
|
342
|
+
|
|
343
|
+
${databases.length > 0 ? databases.map(d => `- ${d}`).join('\n') : '- No databases detected'}
|
|
344
|
+
|
|
345
|
+
### Infrastructure
|
|
346
|
+
|
|
347
|
+
${infrastructure.length > 0 ? infrastructure.map(i => `- ${i}`).join('\n') : '- No infrastructure tools detected'}
|
|
348
|
+
`;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
/**
|
|
352
|
+
* Detect architectural pattern from structure
|
|
353
|
+
* @private
|
|
354
|
+
*/
|
|
355
|
+
_detectPattern(structure, stack) {
|
|
356
|
+
const directories = structure.directories || [];
|
|
357
|
+
const dirNames = directories.map(d => path.basename(d.path).toLowerCase());
|
|
358
|
+
|
|
359
|
+
if (dirNames.includes('components') && dirNames.includes('pages')) {
|
|
360
|
+
return stack.frameworks?.includes('Next.js') ? 'Next.js Pages/App Router' : 'React Component-based';
|
|
361
|
+
}
|
|
362
|
+
if (dirNames.includes('controllers') && dirNames.includes('models') && dirNames.includes('routes')) {
|
|
363
|
+
return 'MVC (Model-View-Controller)';
|
|
364
|
+
}
|
|
365
|
+
if (dirNames.includes('services') && dirNames.includes('handlers')) {
|
|
366
|
+
return 'Service-Oriented';
|
|
367
|
+
}
|
|
368
|
+
if (dirNames.includes('features') || dirNames.includes('modules')) {
|
|
369
|
+
return 'Feature-based / Domain-driven';
|
|
370
|
+
}
|
|
371
|
+
return 'Standard Layered Architecture';
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
/**
|
|
375
|
+
* Describe layers in the architecture
|
|
376
|
+
* @private
|
|
377
|
+
*/
|
|
378
|
+
_describeLayers(structure) {
|
|
379
|
+
const directories = structure.directories || [];
|
|
380
|
+
const layers = [];
|
|
381
|
+
|
|
382
|
+
const layerPatterns = {
|
|
383
|
+
'Presentation': ['components', 'pages', 'views', 'ui'],
|
|
384
|
+
'Business Logic': ['services', 'domain', 'usecases'],
|
|
385
|
+
'Data Access': ['models', 'repositories', 'dal'],
|
|
386
|
+
'Routing': ['routes', 'controllers', 'handlers'],
|
|
387
|
+
'Utilities': ['utils', 'helpers', 'lib']
|
|
388
|
+
};
|
|
389
|
+
|
|
390
|
+
for (const [layer, patterns] of Object.entries(layerPatterns)) {
|
|
391
|
+
const matching = directories.filter(d =>
|
|
392
|
+
patterns.some(p => path.basename(d.path).toLowerCase().includes(p))
|
|
393
|
+
);
|
|
394
|
+
if (matching.length > 0) {
|
|
395
|
+
layers.push(`- **${layer}:** ${matching.map(m => path.basename(m.path)).join(', ')}`);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
return layers.length > 0 ? layers.join('\n') : '- Standard layer structure detected';
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
/**
|
|
403
|
+
* Describe data flow
|
|
404
|
+
* @private
|
|
405
|
+
*/
|
|
406
|
+
_describeDataFlow(structure) {
|
|
407
|
+
const modules = structure.modules || [];
|
|
408
|
+
|
|
409
|
+
if (modules.length > 0) {
|
|
410
|
+
const hasServices = modules.some(m => m.name === 'services');
|
|
411
|
+
const hasModels = modules.some(m => m.name === 'models');
|
|
412
|
+
const hasControllers = modules.some(m => m.name === 'controllers');
|
|
413
|
+
|
|
414
|
+
if (hasControllers && hasServices && hasModels) {
|
|
415
|
+
return 'Controllers → Services → Models → Database';
|
|
416
|
+
}
|
|
417
|
+
if (hasServices && hasModels) {
|
|
418
|
+
return 'Components → Services → Models';
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
return 'Standard request-response flow';
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
/**
|
|
426
|
+
* Detect error handling patterns
|
|
427
|
+
* @private
|
|
428
|
+
*/
|
|
429
|
+
_detectErrorHandling(structure) {
|
|
430
|
+
const files = structure.files || [];
|
|
431
|
+
const errorFiles = files.filter(f =>
|
|
432
|
+
f.toLowerCase().includes('error') ||
|
|
433
|
+
f.toLowerCase().includes('exception')
|
|
434
|
+
);
|
|
435
|
+
|
|
436
|
+
if (errorFiles.length > 0) {
|
|
437
|
+
return `Dedicated error handling modules found (${errorFiles.length} files)`;
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
return 'Standard try-catch error handling expected';
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
/**
|
|
444
|
+
* Build ASCII directory tree
|
|
445
|
+
* @private
|
|
446
|
+
*/
|
|
447
|
+
_buildDirectoryTree(structure) {
|
|
448
|
+
const directories = structure.directories || [];
|
|
449
|
+
const lines = [];
|
|
450
|
+
|
|
451
|
+
const rootName = path.basename(structure.root) || 'project';
|
|
452
|
+
lines.push(rootName + '/');
|
|
453
|
+
|
|
454
|
+
const topDirs = directories.filter(d => d.depth === 1).slice(0, 15);
|
|
455
|
+
for (let i = 0; i < topDirs.length; i++) {
|
|
456
|
+
const dir = topDirs[i];
|
|
457
|
+
const isLast = i === topDirs.length - 1;
|
|
458
|
+
const prefix = isLast ? '└── ' : '├── ';
|
|
459
|
+
const name = path.basename(dir.path);
|
|
460
|
+
lines.push(prefix + name + '/');
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
if (directories.filter(d => d.depth === 1).length > 15) {
|
|
464
|
+
lines.push('└── ...');
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
return lines.join('\n');
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
/**
|
|
471
|
+
* Describe directory purpose
|
|
472
|
+
* @private
|
|
473
|
+
*/
|
|
474
|
+
_describeDirectoryPurpose(name) {
|
|
475
|
+
const purposes = {
|
|
476
|
+
src: 'Main source code directory',
|
|
477
|
+
components: 'Reusable UI components',
|
|
478
|
+
pages: 'Page components and routes',
|
|
479
|
+
services: 'Business logic and external API calls',
|
|
480
|
+
models: 'Data models and database schemas',
|
|
481
|
+
controllers: 'Request handlers and route logic',
|
|
482
|
+
routes: 'Route definitions',
|
|
483
|
+
utils: 'Utility functions and helpers',
|
|
484
|
+
helpers: 'Helper functions',
|
|
485
|
+
lib: 'Library code and shared utilities',
|
|
486
|
+
hooks: 'Custom React hooks',
|
|
487
|
+
stores: 'State management stores',
|
|
488
|
+
api: 'API client and endpoints',
|
|
489
|
+
types: 'TypeScript type definitions',
|
|
490
|
+
styles: 'CSS and styling files',
|
|
491
|
+
assets: 'Static assets (images, fonts)',
|
|
492
|
+
tests: 'Test files',
|
|
493
|
+
__tests__: 'Test files',
|
|
494
|
+
config: 'Configuration files',
|
|
495
|
+
docs: 'Documentation'
|
|
496
|
+
};
|
|
497
|
+
|
|
498
|
+
return purposes[name.toLowerCase()] || 'Application code';
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
module.exports = { ProjectReporter };
|