aigroup-workflow 2.2.0 → 2.2.2
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/.claude/commands/fix-build.md +10 -5
- package/.claude/commands/init-project.md +13 -8
- package/.claude/commands/plan.md +15 -8
- package/.claude/commands/review.md +12 -6
- package/.claude/commands/tdd.md +11 -5
- package/.claude/commands/workflow-start.md +20 -11
- package/.claude/settings.json +28 -0
- package/.codex/agents/architect.toml +207 -0
- package/.codex/agents/build-error-resolver.toml +110 -0
- package/.codex/agents/code-reviewer.toml +233 -0
- package/.codex/agents/doc-updater.toml +103 -0
- package/.codex/agents/e2e-runner.toml +103 -0
- package/.codex/agents/get-current-datetime.toml +23 -0
- package/.codex/agents/init-architect.toml +181 -0
- package/.codex/agents/planner.toml +208 -0
- package/.codex/agents/refactor-cleaner.toml +81 -0
- package/.codex/agents/rust-reviewer.toml +90 -0
- package/.codex/agents/security-reviewer.toml +104 -0
- package/.codex/agents/tdd-guide.toml +87 -0
- package/AGENTS.md +2 -2
- package/CLAUDE.md +23 -1
- package/LICENSE +20 -20
- package/README.md +333 -333
- package/agents/a11y-architect.md +141 -141
- package/agents/architect.md +211 -211
- package/agents/build-error-resolver.md +114 -114
- package/agents/chief-of-staff.md +151 -151
- package/agents/code-architect.md +71 -71
- package/agents/code-explorer.md +69 -69
- package/agents/code-reviewer.md +237 -237
- package/agents/code-simplifier.md +47 -47
- package/agents/comment-analyzer.md +45 -45
- package/agents/conversation-analyzer.md +52 -52
- package/agents/cpp-build-resolver.md +90 -90
- package/agents/cpp-reviewer.md +72 -72
- package/agents/csharp-reviewer.md +101 -101
- package/agents/dart-build-resolver.md +201 -201
- package/agents/database-reviewer.md +91 -91
- package/agents/doc-updater.md +107 -107
- package/agents/docs-lookup.md +68 -68
- package/agents/e2e-runner.md +107 -107
- package/agents/flutter-reviewer.md +243 -243
- package/agents/gan-evaluator.md +209 -209
- package/agents/gan-generator.md +131 -131
- package/agents/gan-planner.md +99 -99
- package/agents/get-current-datetime.md +26 -26
- package/agents/go-build-resolver.md +94 -94
- package/agents/go-reviewer.md +76 -76
- package/agents/harness-optimizer.md +35 -35
- package/agents/healthcare-reviewer.md +83 -83
- package/agents/java-build-resolver.md +153 -153
- package/agents/java-reviewer.md +92 -92
- package/agents/kotlin-build-resolver.md +118 -118
- package/agents/kotlin-reviewer.md +159 -159
- package/agents/loop-operator.md +36 -36
- package/agents/opensource-forker.md +198 -198
- package/agents/opensource-packager.md +249 -249
- package/agents/opensource-sanitizer.md +188 -188
- package/agents/performance-optimizer.md +446 -446
- package/agents/planner.md +212 -212
- package/agents/pr-test-analyzer.md +45 -45
- package/agents/python-reviewer.md +98 -98
- package/agents/pytorch-build-resolver.md +120 -120
- package/agents/refactor-cleaner.md +85 -85
- package/agents/rust-build-resolver.md +148 -148
- package/agents/rust-reviewer.md +94 -94
- package/agents/security-reviewer.md +108 -108
- package/agents/seo-specialist.md +59 -59
- package/agents/silent-failure-hunter.md +50 -50
- package/agents/tdd-guide.md +91 -91
- package/agents/type-design-analyzer.md +41 -41
- package/agents/typescript-reviewer.md +112 -112
- package/cli/commands/update.mjs +1 -1
- package/cli/utils/scaffold.mjs +53 -0
- package/docs/rules/agents.md +166 -50
- package/docs/rules/cpp/coding-style.md +44 -44
- package/docs/rules/cpp/hooks.md +39 -39
- package/docs/rules/cpp/patterns.md +51 -51
- package/docs/rules/cpp/security.md +51 -51
- package/docs/rules/cpp/testing.md +44 -44
- package/docs/rules/csharp/coding-style.md +72 -72
- package/docs/rules/csharp/hooks.md +25 -25
- package/docs/rules/csharp/patterns.md +50 -50
- package/docs/rules/csharp/security.md +58 -58
- package/docs/rules/csharp/testing.md +46 -46
- package/docs/rules/dart/coding-style.md +159 -159
- package/docs/rules/dart/hooks.md +66 -66
- package/docs/rules/dart/patterns.md +261 -261
- package/docs/rules/dart/security.md +135 -135
- package/docs/rules/dart/testing.md +215 -215
- package/docs/rules/golang/coding-style.md +32 -32
- package/docs/rules/golang/hooks.md +17 -17
- package/docs/rules/golang/patterns.md +45 -45
- package/docs/rules/golang/security.md +34 -34
- package/docs/rules/golang/testing.md +31 -31
- package/docs/rules/java/coding-style.md +114 -114
- package/docs/rules/java/hooks.md +18 -18
- package/docs/rules/java/patterns.md +146 -146
- package/docs/rules/java/security.md +100 -100
- package/docs/rules/java/testing.md +131 -131
- package/docs/rules/kotlin/coding-style.md +86 -86
- package/docs/rules/kotlin/hooks.md +17 -17
- package/docs/rules/kotlin/patterns.md +146 -146
- package/docs/rules/kotlin/security.md +82 -82
- package/docs/rules/kotlin/testing.md +128 -128
- package/docs/rules/perl/coding-style.md +46 -46
- package/docs/rules/perl/hooks.md +22 -22
- package/docs/rules/perl/patterns.md +76 -76
- package/docs/rules/perl/security.md +69 -69
- package/docs/rules/perl/testing.md +54 -54
- package/docs/rules/php/coding-style.md +40 -40
- package/docs/rules/php/hooks.md +24 -24
- package/docs/rules/php/patterns.md +33 -33
- package/docs/rules/php/security.md +37 -37
- package/docs/rules/php/testing.md +39 -39
- package/docs/rules/python/coding-style.md +42 -42
- package/docs/rules/python/hooks.md +19 -19
- package/docs/rules/python/patterns.md +39 -39
- package/docs/rules/python/security.md +30 -30
- package/docs/rules/python/testing.md +38 -38
- package/docs/rules/rust/coding-style.md +151 -151
- package/docs/rules/rust/hooks.md +16 -16
- package/docs/rules/rust/patterns.md +168 -168
- package/docs/rules/rust/security.md +141 -141
- package/docs/rules/rust/testing.md +154 -154
- package/docs/rules/swift/coding-style.md +47 -47
- package/docs/rules/swift/hooks.md +20 -20
- package/docs/rules/swift/patterns.md +66 -66
- package/docs/rules/swift/security.md +33 -33
- package/docs/rules/swift/testing.md +45 -45
- package/docs/rules/typescript/coding-style.md +199 -199
- package/docs/rules/typescript/hooks.md +22 -22
- package/docs/rules/typescript/patterns.md +52 -52
- package/docs/rules/typescript/security.md +28 -28
- package/docs/rules/typescript/testing.md +18 -18
- package/docs/rules/web/coding-style.md +96 -96
- package/docs/rules/web/design-quality.md +62 -62
- package/docs/rules/web/hooks.md +120 -120
- package/docs/rules/web/patterns.md +79 -79
- package/docs/rules/web/performance.md +64 -64
- package/docs/rules/web/security.md +57 -57
- package/docs/rules/web/testing.md +55 -55
- package/docs/templates/README.md +36 -36
- package/docs/templates/ai-project-final.md +124 -124
- package/docs/templates/ai-project.md +105 -105
- package/docs/templates/api.md +157 -157
- package/docs/templates/bug.md +62 -62
- package/docs/templates/code-review.md +87 -87
- package/docs/templates/generic.md +116 -116
- package/docs/templates/implementation-plan.md +1 -1
- package/docs/templates/meeting.md +68 -68
- package/docs/templates/prd.md +98 -98
- package/docs/templates/ui.md +134 -134
- package/docs/workflow-pipeline.md +11 -10
- package/package.json +40 -39
- package/scripts/hooks/checks/orchestration-artifacts.cjs +28 -23
- package/scripts/hooks/checks/workflow-state.cjs +4 -5
- package/scripts/orchestration/lib/orchestrator.cjs +344 -117
- package/scripts/orchestration/lib/validate.cjs +145 -0
- package/scripts/orchestration/session.cjs +88 -44
- package/skills/SUPERPOWERS-LICENSE +21 -21
- package/skills/ai-ml/fine-tuning-expert/SKILL.md +162 -162
- package/skills/ai-ml/fine-tuning-expert/references/dataset-preparation.md +540 -540
- package/skills/ai-ml/fine-tuning-expert/references/deployment-optimization.md +673 -673
- package/skills/ai-ml/fine-tuning-expert/references/evaluation-metrics.md +597 -597
- package/skills/ai-ml/fine-tuning-expert/references/hyperparameter-tuning.md +565 -565
- package/skills/ai-ml/fine-tuning-expert/references/lora-peft.md +347 -347
- package/skills/ai-ml/ml-pipeline/SKILL.md +159 -159
- package/skills/ai-ml/ml-pipeline/references/experiment-tracking.md +833 -833
- package/skills/ai-ml/ml-pipeline/references/feature-engineering.md +631 -631
- package/skills/ai-ml/ml-pipeline/references/model-validation.md +978 -978
- package/skills/ai-ml/ml-pipeline/references/pipeline-orchestration.md +907 -907
- package/skills/ai-ml/ml-pipeline/references/training-pipelines.md +782 -782
- package/skills/ai-ml/rag-architect/SKILL.md +194 -194
- package/skills/ai-ml/rag-architect/references/chunking-strategies.md +878 -878
- package/skills/ai-ml/rag-architect/references/embedding-models.md +561 -561
- package/skills/ai-ml/rag-architect/references/rag-evaluation.md +833 -833
- package/skills/ai-ml/rag-architect/references/retrieval-optimization.md +795 -795
- package/skills/ai-ml/rag-architect/references/vector-databases.md +589 -589
- package/skills/ai-ml/spark-engineer/SKILL.md +148 -148
- package/skills/ai-ml/spark-engineer/references/partitioning-caching.md +543 -543
- package/skills/ai-ml/spark-engineer/references/performance-tuning.md +544 -544
- package/skills/ai-ml/spark-engineer/references/rdd-operations.md +599 -599
- package/skills/ai-ml/spark-engineer/references/spark-sql-dataframes.md +474 -474
- package/skills/ai-ml/spark-engineer/references/streaming-patterns.md +786 -786
- package/skills/backend/api-designer/SKILL.md +217 -217
- package/skills/backend/api-designer/references/error-handling.md +541 -541
- package/skills/backend/api-designer/references/openapi.md +824 -824
- package/skills/backend/api-designer/references/pagination.md +494 -494
- package/skills/backend/api-designer/references/rest-patterns.md +335 -335
- package/skills/backend/api-designer/references/versioning.md +391 -391
- package/skills/backend/architecture-designer/SKILL.md +117 -117
- package/skills/backend/architecture-designer/references/adr-template.md +116 -116
- package/skills/backend/architecture-designer/references/architecture-patterns.md +111 -111
- package/skills/backend/architecture-designer/references/database-selection.md +102 -102
- package/skills/backend/architecture-designer/references/nfr-checklist.md +112 -112
- package/skills/backend/architecture-designer/references/system-design.md +100 -100
- package/skills/backend/code-documenter/SKILL.md +147 -147
- package/skills/backend/code-documenter/references/api-docs-fastapi-django.md +166 -166
- package/skills/backend/code-documenter/references/api-docs-nestjs-express.md +220 -220
- package/skills/backend/code-documenter/references/coverage-reports.md +125 -125
- package/skills/backend/code-documenter/references/documentation-systems.md +333 -333
- package/skills/backend/code-documenter/references/interactive-api-docs.md +531 -531
- package/skills/backend/code-documenter/references/python-docstrings.md +121 -121
- package/skills/backend/code-documenter/references/typescript-jsdoc.md +145 -145
- package/skills/backend/code-documenter/references/user-guides-tutorials.md +530 -530
- package/skills/backend/debugging-wizard/SKILL.md +105 -105
- package/skills/backend/debugging-wizard/references/common-patterns.md +132 -132
- package/skills/backend/debugging-wizard/references/debugging-tools.md +140 -140
- package/skills/backend/debugging-wizard/references/quick-fixes.md +177 -177
- package/skills/backend/debugging-wizard/references/strategies.md +142 -142
- package/skills/backend/debugging-wizard/references/systematic-debugging.md +367 -367
- package/skills/backend/feature-forge/SKILL.md +98 -98
- package/skills/backend/feature-forge/references/acceptance-criteria.md +104 -104
- package/skills/backend/feature-forge/references/ears-syntax.md +99 -99
- package/skills/backend/feature-forge/references/interview-questions.md +150 -150
- package/skills/backend/feature-forge/references/pre-discovery-subagents.md +54 -54
- package/skills/backend/feature-forge/references/specification-template.md +103 -103
- package/skills/backend/fullstack-guardian/SKILL.md +105 -105
- package/skills/backend/fullstack-guardian/references/api-design-standards.md +307 -307
- package/skills/backend/fullstack-guardian/references/architecture-decisions.md +350 -350
- package/skills/backend/fullstack-guardian/references/backend-patterns.md +237 -237
- package/skills/backend/fullstack-guardian/references/common-patterns.md +134 -134
- package/skills/backend/fullstack-guardian/references/deliverables-checklist.md +354 -354
- package/skills/backend/fullstack-guardian/references/design-template.md +91 -91
- package/skills/backend/fullstack-guardian/references/error-handling.md +135 -135
- package/skills/backend/fullstack-guardian/references/frontend-patterns.md +340 -340
- package/skills/backend/fullstack-guardian/references/integration-patterns.md +333 -333
- package/skills/backend/fullstack-guardian/references/security-checklist.md +106 -106
- package/skills/backend/graphql-architect/SKILL.md +146 -146
- package/skills/backend/graphql-architect/references/federation.md +418 -418
- package/skills/backend/graphql-architect/references/migration-from-rest.md +1141 -1141
- package/skills/backend/graphql-architect/references/resolvers.md +425 -425
- package/skills/backend/graphql-architect/references/schema-design.md +393 -393
- package/skills/backend/graphql-architect/references/security.md +569 -569
- package/skills/backend/graphql-architect/references/subscriptions.md +510 -510
- package/skills/backend/legacy-modernizer/SKILL.md +137 -137
- package/skills/backend/legacy-modernizer/references/legacy-testing.md +381 -381
- package/skills/backend/legacy-modernizer/references/migration-strategies.md +423 -423
- package/skills/backend/legacy-modernizer/references/refactoring-patterns.md +395 -395
- package/skills/backend/legacy-modernizer/references/strangler-fig-pattern.md +281 -281
- package/skills/backend/legacy-modernizer/references/system-assessment.md +487 -487
- package/skills/backend/microservices-architect/SKILL.md +164 -164
- package/skills/backend/microservices-architect/references/communication.md +499 -499
- package/skills/backend/microservices-architect/references/data.md +721 -721
- package/skills/backend/microservices-architect/references/decomposition.md +344 -344
- package/skills/backend/microservices-architect/references/observability.md +805 -805
- package/skills/backend/microservices-architect/references/patterns.md +603 -603
- package/skills/database/database-optimizer/SKILL.md +147 -147
- package/skills/database/database-optimizer/references/index-strategies.md +331 -331
- package/skills/database/database-optimizer/references/monitoring-analysis.md +501 -501
- package/skills/database/database-optimizer/references/mysql-tuning.md +452 -452
- package/skills/database/database-optimizer/references/postgresql-tuning.md +413 -413
- package/skills/database/database-optimizer/references/query-optimization.md +251 -251
- package/skills/database/postgres-pro/SKILL.md +152 -152
- package/skills/database/postgres-pro/references/extensions.md +404 -404
- package/skills/database/postgres-pro/references/jsonb.md +321 -321
- package/skills/database/postgres-pro/references/maintenance.md +481 -481
- package/skills/database/postgres-pro/references/performance.md +265 -265
- package/skills/database/postgres-pro/references/replication.md +446 -446
- package/skills/database/sql-pro/SKILL.md +129 -129
- package/skills/database/sql-pro/references/database-design.md +402 -402
- package/skills/database/sql-pro/references/dialect-differences.md +419 -419
- package/skills/database/sql-pro/references/optimization.md +384 -384
- package/skills/database/sql-pro/references/query-patterns.md +285 -285
- package/skills/database/sql-pro/references/window-functions.md +328 -328
- package/skills/dotnet/csharp-developer/SKILL.md +125 -125
- package/skills/dotnet/csharp-developer/references/aspnet-core.md +394 -394
- package/skills/dotnet/csharp-developer/references/blazor.md +553 -553
- package/skills/dotnet/csharp-developer/references/entity-framework.md +409 -409
- package/skills/dotnet/csharp-developer/references/modern-csharp.md +248 -248
- package/skills/dotnet/csharp-developer/references/performance.md +498 -498
- package/skills/dotnet/dotnet-core-expert/SKILL.md +138 -138
- package/skills/dotnet/dotnet-core-expert/references/authentication.md +546 -546
- package/skills/dotnet/dotnet-core-expert/references/clean-architecture.md +455 -455
- package/skills/dotnet/dotnet-core-expert/references/cloud-native.md +548 -548
- package/skills/dotnet/dotnet-core-expert/references/entity-framework.md +440 -440
- package/skills/dotnet/dotnet-core-expert/references/minimal-apis.md +319 -319
- package/skills/frontend/angular-architect/SKILL.md +152 -152
- package/skills/frontend/angular-architect/references/components.md +297 -297
- package/skills/frontend/angular-architect/references/ngrx.md +401 -401
- package/skills/frontend/angular-architect/references/routing.md +361 -361
- package/skills/frontend/angular-architect/references/rxjs.md +319 -319
- package/skills/frontend/angular-architect/references/testing.md +405 -405
- package/skills/frontend/design-commands/design.md +91 -91
- package/skills/frontend/design-commands/handoff.md +97 -97
- package/skills/frontend/design-commands/prototype.md +120 -120
- package/skills/frontend/design-commands/spec.md +160 -160
- package/skills/frontend/design-commands/style.md +78 -78
- package/skills/frontend/flutter-expert/SKILL.md +138 -138
- package/skills/frontend/flutter-expert/references/bloc-state.md +259 -259
- package/skills/frontend/flutter-expert/references/gorouter-navigation.md +119 -119
- package/skills/frontend/flutter-expert/references/performance.md +99 -99
- package/skills/frontend/flutter-expert/references/project-structure.md +118 -118
- package/skills/frontend/flutter-expert/references/riverpod-state.md +130 -130
- package/skills/frontend/flutter-expert/references/widget-patterns.md +123 -123
- package/skills/frontend/nextjs-developer/SKILL.md +143 -143
- package/skills/frontend/nextjs-developer/references/app-router.md +311 -311
- package/skills/frontend/nextjs-developer/references/data-fetching.md +482 -482
- package/skills/frontend/nextjs-developer/references/deployment.md +545 -545
- package/skills/frontend/nextjs-developer/references/server-actions.md +462 -462
- package/skills/frontend/nextjs-developer/references/server-components.md +384 -384
- package/skills/frontend/react-expert/SKILL.md +149 -149
- package/skills/frontend/react-expert/references/hooks-patterns.md +162 -162
- package/skills/frontend/react-expert/references/migration-class-to-modern.md +1119 -1119
- package/skills/frontend/react-expert/references/performance.md +168 -168
- package/skills/frontend/react-expert/references/react-19-features.md +174 -174
- package/skills/frontend/react-expert/references/server-components.md +143 -143
- package/skills/frontend/react-expert/references/state-management.md +171 -171
- package/skills/frontend/react-expert/references/testing-react.md +174 -174
- package/skills/frontend/react-native-expert/SKILL.md +185 -185
- package/skills/frontend/react-native-expert/references/expo-router.md +187 -187
- package/skills/frontend/react-native-expert/references/list-optimization.md +204 -204
- package/skills/frontend/react-native-expert/references/platform-handling.md +188 -188
- package/skills/frontend/react-native-expert/references/project-structure.md +171 -171
- package/skills/frontend/react-native-expert/references/storage-hooks.md +173 -173
- package/skills/frontend/senior-frontend/SKILL.md +477 -477
- package/skills/frontend/senior-frontend/references/frontend_best_practices.md +806 -806
- package/skills/frontend/senior-frontend/references/nextjs_optimization_guide.md +724 -724
- package/skills/frontend/senior-frontend/references/react_patterns.md +746 -746
- package/skills/frontend/senior-frontend/scripts/bundle_analyzer.py +407 -407
- package/skills/frontend/senior-frontend/scripts/component_generator.py +329 -329
- package/skills/frontend/senior-frontend/scripts/frontend_scaffolder.py +1005 -1005
- package/skills/frontend/ui-ux-pro-max/SKILL.md +386 -386
- package/skills/frontend/ui-ux-pro-max/data/charts.csv +26 -26
- package/skills/frontend/ui-ux-pro-max/data/colors.csv +97 -97
- package/skills/frontend/ui-ux-pro-max/data/icons.csv +101 -101
- package/skills/frontend/ui-ux-pro-max/data/landing.csv +31 -31
- package/skills/frontend/ui-ux-pro-max/data/products.csv +96 -96
- package/skills/frontend/ui-ux-pro-max/data/react-performance.csv +45 -45
- package/skills/frontend/ui-ux-pro-max/data/stacks/astro.csv +54 -54
- package/skills/frontend/ui-ux-pro-max/data/stacks/flutter.csv +53 -53
- package/skills/frontend/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -56
- package/skills/frontend/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -53
- package/skills/frontend/ui-ux-pro-max/data/stacks/nextjs.csv +53 -53
- package/skills/frontend/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -51
- package/skills/frontend/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -59
- package/skills/frontend/ui-ux-pro-max/data/stacks/react-native.csv +52 -52
- package/skills/frontend/ui-ux-pro-max/data/stacks/react.csv +54 -54
- package/skills/frontend/ui-ux-pro-max/data/stacks/shadcn.csv +61 -61
- package/skills/frontend/ui-ux-pro-max/data/stacks/svelte.csv +54 -54
- package/skills/frontend/ui-ux-pro-max/data/stacks/swiftui.csv +51 -51
- package/skills/frontend/ui-ux-pro-max/data/stacks/vue.csv +50 -50
- package/skills/frontend/ui-ux-pro-max/data/styles.csv +68 -68
- package/skills/frontend/ui-ux-pro-max/data/typography.csv +57 -57
- package/skills/frontend/ui-ux-pro-max/data/ui-reasoning.csv +101 -101
- package/skills/frontend/ui-ux-pro-max/data/ux-guidelines.csv +99 -99
- package/skills/frontend/ui-ux-pro-max/data/web-interface.csv +31 -31
- package/skills/frontend/ui-ux-pro-max/scripts/core.py +253 -253
- package/skills/frontend/ui-ux-pro-max/scripts/design_system.py +1067 -1067
- package/skills/frontend/ui-ux-pro-max/scripts/search.py +114 -114
- package/skills/frontend/vue-expert/SKILL.md +98 -98
- package/skills/frontend/vue-expert/references/build-tooling.md +480 -480
- package/skills/frontend/vue-expert/references/components.md +448 -448
- package/skills/frontend/vue-expert/references/composition-api.md +299 -299
- package/skills/frontend/vue-expert/references/mobile-hybrid.md +636 -636
- package/skills/frontend/vue-expert/references/nuxt.md +669 -669
- package/skills/frontend/vue-expert/references/state-management.md +449 -449
- package/skills/frontend/vue-expert/references/typescript.md +584 -584
- package/skills/frontend/vue-expert-js/SKILL.md +167 -167
- package/skills/frontend/vue-expert-js/references/component-architecture.md +219 -219
- package/skills/frontend/vue-expert-js/references/composables-patterns.md +183 -183
- package/skills/frontend/vue-expert-js/references/jsdoc-typing.md +535 -535
- package/skills/frontend/vue-expert-js/references/state-management.md +249 -249
- package/skills/frontend/vue-expert-js/references/testing-patterns.md +237 -237
- package/skills/go-rust-cpp/cpp-pro/SKILL.md +115 -115
- package/skills/go-rust-cpp/cpp-pro/references/build-tooling.md +440 -440
- package/skills/go-rust-cpp/cpp-pro/references/concurrency.md +437 -437
- package/skills/go-rust-cpp/cpp-pro/references/memory-performance.md +397 -397
- package/skills/go-rust-cpp/cpp-pro/references/modern-cpp.md +304 -304
- package/skills/go-rust-cpp/cpp-pro/references/templates.md +357 -357
- package/skills/go-rust-cpp/golang-pro/SKILL.md +122 -122
- package/skills/go-rust-cpp/golang-pro/references/concurrency.md +329 -329
- package/skills/go-rust-cpp/golang-pro/references/generics.md +442 -442
- package/skills/go-rust-cpp/golang-pro/references/interfaces.md +432 -432
- package/skills/go-rust-cpp/golang-pro/references/project-structure.md +477 -477
- package/skills/go-rust-cpp/golang-pro/references/testing.md +451 -451
- package/skills/go-rust-cpp/rust-engineer/SKILL.md +167 -167
- package/skills/go-rust-cpp/rust-engineer/references/async.md +458 -458
- package/skills/go-rust-cpp/rust-engineer/references/error-handling.md +334 -334
- package/skills/go-rust-cpp/rust-engineer/references/ownership.md +278 -278
- package/skills/go-rust-cpp/rust-engineer/references/testing.md +470 -470
- package/skills/go-rust-cpp/rust-engineer/references/traits.md +413 -413
- package/skills/infra/cli-developer/SKILL.md +113 -113
- package/skills/infra/cli-developer/references/design-patterns.md +221 -221
- package/skills/infra/cli-developer/references/go-cli.md +540 -540
- package/skills/infra/cli-developer/references/node-cli.md +383 -383
- package/skills/infra/cli-developer/references/python-cli.md +422 -422
- package/skills/infra/cli-developer/references/ux-patterns.md +448 -448
- package/skills/infra/cloud-architect/SKILL.md +216 -216
- package/skills/infra/cloud-architect/references/aws.md +394 -394
- package/skills/infra/cloud-architect/references/azure.md +562 -562
- package/skills/infra/cloud-architect/references/cost.md +582 -582
- package/skills/infra/cloud-architect/references/gcp.md +633 -633
- package/skills/infra/cloud-architect/references/multi-cloud.md +483 -483
- package/skills/infra/devops-engineer/SKILL.md +144 -144
- package/skills/infra/devops-engineer/references/deployment-strategies.md +241 -241
- package/skills/infra/devops-engineer/references/docker-patterns.md +113 -113
- package/skills/infra/devops-engineer/references/github-actions.md +139 -139
- package/skills/infra/devops-engineer/references/incident-response.md +331 -331
- package/skills/infra/devops-engineer/references/kubernetes.md +154 -154
- package/skills/infra/devops-engineer/references/platform-engineering.md +417 -417
- package/skills/infra/devops-engineer/references/release-automation.md +527 -527
- package/skills/infra/devops-engineer/references/terraform-iac.md +141 -141
- package/skills/infra/kubernetes-specialist/SKILL.md +241 -241
- package/skills/infra/kubernetes-specialist/references/configuration.md +452 -452
- package/skills/infra/kubernetes-specialist/references/cost-optimization.md +458 -458
- package/skills/infra/kubernetes-specialist/references/custom-operators.md +563 -563
- package/skills/infra/kubernetes-specialist/references/gitops.md +530 -530
- package/skills/infra/kubernetes-specialist/references/helm-charts.md +912 -912
- package/skills/infra/kubernetes-specialist/references/multi-cluster.md +507 -507
- package/skills/infra/kubernetes-specialist/references/networking.md +447 -447
- package/skills/infra/kubernetes-specialist/references/service-mesh.md +459 -459
- package/skills/infra/kubernetes-specialist/references/storage.md +535 -535
- package/skills/infra/kubernetes-specialist/references/troubleshooting.md +414 -414
- package/skills/infra/kubernetes-specialist/references/workloads.md +377 -377
- package/skills/infra/mcp-developer/SKILL.md +143 -143
- package/skills/infra/mcp-developer/references/protocol.md +244 -244
- package/skills/infra/mcp-developer/references/python-sdk.md +367 -367
- package/skills/infra/mcp-developer/references/resources.md +554 -554
- package/skills/infra/mcp-developer/references/tools.md +480 -480
- package/skills/infra/mcp-developer/references/typescript-sdk.md +350 -350
- package/skills/infra/monitoring-expert/SKILL.md +176 -176
- package/skills/infra/monitoring-expert/references/alerting-rules.md +141 -141
- package/skills/infra/monitoring-expert/references/application-profiling.md +331 -331
- package/skills/infra/monitoring-expert/references/capacity-planning.md +344 -344
- package/skills/infra/monitoring-expert/references/dashboards.md +126 -126
- package/skills/infra/monitoring-expert/references/opentelemetry.md +123 -123
- package/skills/infra/monitoring-expert/references/performance-testing.md +269 -269
- package/skills/infra/monitoring-expert/references/prometheus-metrics.md +136 -136
- package/skills/infra/monitoring-expert/references/structured-logging.md +142 -142
- package/skills/infra/sre-engineer/SKILL.md +181 -181
- package/skills/infra/sre-engineer/references/automation-toil.md +492 -492
- package/skills/infra/sre-engineer/references/error-budget-policy.md +334 -334
- package/skills/infra/sre-engineer/references/incident-chaos.md +576 -576
- package/skills/infra/sre-engineer/references/monitoring-alerting.md +424 -424
- package/skills/infra/sre-engineer/references/slo-sli-management.md +238 -238
- package/skills/infra/terraform-engineer/SKILL.md +143 -143
- package/skills/infra/terraform-engineer/references/best-practices.md +583 -583
- package/skills/infra/terraform-engineer/references/module-patterns.md +297 -297
- package/skills/infra/terraform-engineer/references/providers.md +452 -452
- package/skills/infra/terraform-engineer/references/state-management.md +371 -371
- package/skills/infra/terraform-engineer/references/testing.md +486 -486
- package/skills/infra/websocket-engineer/SKILL.md +168 -168
- package/skills/infra/websocket-engineer/references/alternatives.md +391 -391
- package/skills/infra/websocket-engineer/references/patterns.md +400 -400
- package/skills/infra/websocket-engineer/references/protocol.md +195 -195
- package/skills/infra/websocket-engineer/references/scaling.md +333 -333
- package/skills/infra/websocket-engineer/references/security.md +474 -474
- package/skills/java/java-architect/SKILL.md +132 -132
- package/skills/java/java-architect/references/jpa-optimization.md +393 -393
- package/skills/java/java-architect/references/reactive-webflux.md +356 -356
- package/skills/java/java-architect/references/spring-boot-setup.md +269 -269
- package/skills/java/java-architect/references/spring-security.md +445 -445
- package/skills/java/java-architect/references/testing-patterns.md +500 -500
- package/skills/java/kotlin-specialist/SKILL.md +147 -147
- package/skills/java/kotlin-specialist/references/android-compose.md +419 -419
- package/skills/java/kotlin-specialist/references/coroutines-flow.md +276 -276
- package/skills/java/kotlin-specialist/references/dsl-idioms.md +421 -421
- package/skills/java/kotlin-specialist/references/ktor-server.md +426 -426
- package/skills/java/kotlin-specialist/references/multiplatform-kmp.md +380 -380
- package/skills/java/spring-boot-engineer/SKILL.md +195 -195
- package/skills/java/spring-boot-engineer/references/cloud.md +498 -498
- package/skills/java/spring-boot-engineer/references/data.md +381 -381
- package/skills/java/spring-boot-engineer/references/security.md +459 -459
- package/skills/java/spring-boot-engineer/references/testing.md +545 -545
- package/skills/java/spring-boot-engineer/references/web.md +295 -295
- package/skills/javascript/javascript-pro/SKILL.md +132 -132
- package/skills/javascript/javascript-pro/references/async-patterns.md +334 -334
- package/skills/javascript/javascript-pro/references/browser-apis.md +398 -398
- package/skills/javascript/javascript-pro/references/modern-syntax.md +272 -272
- package/skills/javascript/javascript-pro/references/modules.md +357 -357
- package/skills/javascript/javascript-pro/references/node-essentials.md +471 -471
- package/skills/javascript/nestjs-expert/SKILL.md +206 -206
- package/skills/javascript/nestjs-expert/references/authentication.md +166 -166
- package/skills/javascript/nestjs-expert/references/controllers-routing.md +111 -111
- package/skills/javascript/nestjs-expert/references/dtos-validation.md +153 -153
- package/skills/javascript/nestjs-expert/references/migration-from-express.md +1237 -1237
- package/skills/javascript/nestjs-expert/references/services-di.md +140 -140
- package/skills/javascript/nestjs-expert/references/testing-patterns.md +186 -186
- package/skills/javascript/typescript-pro/SKILL.md +145 -145
- package/skills/javascript/typescript-pro/references/advanced-types.md +259 -259
- package/skills/javascript/typescript-pro/references/configuration.md +445 -445
- package/skills/javascript/typescript-pro/references/patterns.md +484 -484
- package/skills/javascript/typescript-pro/references/type-guards.md +352 -352
- package/skills/javascript/typescript-pro/references/utility-types.md +329 -329
- package/skills/php/laravel-specialist/SKILL.md +262 -262
- package/skills/php/laravel-specialist/references/eloquent.md +351 -351
- package/skills/php/laravel-specialist/references/livewire.md +512 -512
- package/skills/php/laravel-specialist/references/queues.md +423 -423
- package/skills/php/laravel-specialist/references/routing.md +362 -362
- package/skills/php/laravel-specialist/references/testing.md +522 -522
- package/skills/php/php-pro/SKILL.md +206 -206
- package/skills/php/php-pro/references/async-patterns.md +412 -412
- package/skills/php/php-pro/references/laravel-patterns.md +377 -377
- package/skills/php/php-pro/references/modern-php-features.md +323 -323
- package/skills/php/php-pro/references/symfony-patterns.md +466 -466
- package/skills/php/php-pro/references/testing-quality.md +466 -466
- package/skills/product/competitive-analysis/SKILL.md +257 -257
- package/skills/product/meeting-notes/SKILL.md +266 -266
- package/skills/product/prd-template/SKILL.md +150 -150
- package/skills/product/stakeholder-update/SKILL.md +225 -225
- package/skills/product/user-research-synthesis/SKILL.md +235 -235
- package/skills/python/django-expert/SKILL.md +162 -162
- package/skills/python/django-expert/references/authentication.md +145 -145
- package/skills/python/django-expert/references/drf-serializers.md +148 -148
- package/skills/python/django-expert/references/models-orm.md +151 -151
- package/skills/python/django-expert/references/testing-django.md +204 -204
- package/skills/python/django-expert/references/viewsets-views.md +153 -153
- package/skills/python/fastapi-expert/SKILL.md +185 -185
- package/skills/python/fastapi-expert/references/async-sqlalchemy.md +146 -146
- package/skills/python/fastapi-expert/references/authentication.md +159 -159
- package/skills/python/fastapi-expert/references/endpoints-routing.md +142 -142
- package/skills/python/fastapi-expert/references/migration-from-django.md +996 -996
- package/skills/python/fastapi-expert/references/pydantic-v2.md +135 -135
- package/skills/python/fastapi-expert/references/testing-async.md +159 -159
- package/skills/python/pandas-pro/SKILL.md +178 -178
- package/skills/python/pandas-pro/references/aggregation-groupby.md +545 -545
- package/skills/python/pandas-pro/references/data-cleaning.md +500 -500
- package/skills/python/pandas-pro/references/dataframe-operations.md +420 -420
- package/skills/python/pandas-pro/references/merging-joining.md +596 -596
- package/skills/python/pandas-pro/references/performance-optimization.md +597 -597
- package/skills/python/python-pro/SKILL.md +177 -177
- package/skills/python/python-pro/references/async-patterns.md +356 -356
- package/skills/python/python-pro/references/packaging.md +460 -460
- package/skills/python/python-pro/references/standard-library.md +378 -378
- package/skills/python/python-pro/references/testing.md +404 -404
- package/skills/python/python-pro/references/type-system.md +290 -290
- package/skills/quality/chaos-engineer/SKILL.md +182 -182
- package/skills/quality/chaos-engineer/references/chaos-tools.md +511 -511
- package/skills/quality/chaos-engineer/references/experiment-design.md +229 -229
- package/skills/quality/chaos-engineer/references/game-days.md +434 -434
- package/skills/quality/chaos-engineer/references/infrastructure-chaos.md +348 -348
- package/skills/quality/chaos-engineer/references/kubernetes-chaos.md +432 -432
- package/skills/quality/code-reviewer/SKILL.md +119 -119
- package/skills/quality/code-reviewer/references/common-issues.md +142 -142
- package/skills/quality/code-reviewer/references/feedback-examples.md +144 -144
- package/skills/quality/code-reviewer/references/receiving-feedback.md +238 -238
- package/skills/quality/code-reviewer/references/report-template.md +109 -109
- package/skills/quality/code-reviewer/references/review-checklist.md +88 -88
- package/skills/quality/code-reviewer/references/spec-compliance-review.md +258 -258
- package/skills/quality/playwright-expert/SKILL.md +169 -169
- package/skills/quality/playwright-expert/references/api-mocking.md +140 -140
- package/skills/quality/playwright-expert/references/configuration.md +155 -155
- package/skills/quality/playwright-expert/references/debugging-flaky.md +150 -150
- package/skills/quality/playwright-expert/references/page-object-model.md +152 -152
- package/skills/quality/playwright-expert/references/selectors-locators.md +119 -119
- package/skills/quality/secure-code-guardian/SKILL.md +191 -191
- package/skills/quality/secure-code-guardian/references/authentication.md +136 -136
- package/skills/quality/secure-code-guardian/references/input-validation.md +146 -146
- package/skills/quality/secure-code-guardian/references/owasp-prevention.md +135 -135
- package/skills/quality/secure-code-guardian/references/security-headers.md +133 -133
- package/skills/quality/secure-code-guardian/references/xss-csrf.md +157 -157
- package/skills/quality/security-reviewer/SKILL.md +103 -103
- package/skills/quality/security-reviewer/references/infrastructure-security.md +268 -268
- package/skills/quality/security-reviewer/references/penetration-testing.md +268 -268
- package/skills/quality/security-reviewer/references/report-template.md +170 -170
- package/skills/quality/security-reviewer/references/sast-tools.md +117 -117
- package/skills/quality/security-reviewer/references/secret-scanning.md +125 -125
- package/skills/quality/security-reviewer/references/vulnerability-patterns.md +152 -152
- package/skills/quality/senior-qa/README.md +196 -196
- package/skills/quality/senior-qa/SKILL.md +399 -399
- package/skills/quality/senior-qa/references/qa_best_practices.md +964 -964
- package/skills/quality/senior-qa/references/test_automation_patterns.md +1009 -1009
- package/skills/quality/senior-qa/references/testing_strategies.md +649 -649
- package/skills/quality/senior-qa/scripts/coverage_analyzer.py +836 -836
- package/skills/quality/senior-qa/scripts/e2e_test_scaffolder.py +820 -820
- package/skills/quality/senior-qa/scripts/test_suite_generator.py +605 -605
- package/skills/quality/tdd-guide/HOW_TO_USE.md +313 -313
- package/skills/quality/tdd-guide/README.md +680 -680
- package/skills/quality/tdd-guide/SKILL.md +122 -122
- package/skills/quality/tdd-guide/assets/expected_output.json +77 -77
- package/skills/quality/tdd-guide/assets/sample_input_python.json +39 -39
- package/skills/quality/tdd-guide/assets/sample_input_typescript.json +36 -36
- package/skills/quality/tdd-guide/references/ci-integration.md +195 -195
- package/skills/quality/tdd-guide/references/framework-guide.md +206 -206
- package/skills/quality/tdd-guide/references/tdd-best-practices.md +128 -128
- package/skills/quality/tdd-guide/scripts/coverage_analyzer.py +434 -434
- package/skills/quality/tdd-guide/scripts/fixture_generator.py +440 -440
- package/skills/quality/tdd-guide/scripts/format_detector.py +384 -384
- package/skills/quality/tdd-guide/scripts/framework_adapter.py +428 -428
- package/skills/quality/tdd-guide/scripts/metrics_calculator.py +456 -456
- package/skills/quality/tdd-guide/scripts/output_formatter.py +354 -354
- package/skills/quality/tdd-guide/scripts/tdd_workflow.py +474 -474
- package/skills/quality/tdd-guide/scripts/test_generator.py +438 -438
- package/skills/quality/test-master/SKILL.md +94 -94
- package/skills/quality/test-master/references/automation-frameworks.md +294 -294
- package/skills/quality/test-master/references/e2e-testing.md +128 -128
- package/skills/quality/test-master/references/integration-testing.md +120 -120
- package/skills/quality/test-master/references/performance-testing.md +118 -118
- package/skills/quality/test-master/references/qa-methodology.md +247 -247
- package/skills/quality/test-master/references/security-testing.md +127 -127
- package/skills/quality/test-master/references/tdd-iron-laws.md +174 -174
- package/skills/quality/test-master/references/test-reports.md +104 -104
- package/skills/quality/test-master/references/testing-anti-patterns.md +231 -231
- package/skills/quality/test-master/references/unit-testing.md +113 -113
- package/skills/ruby/rails-expert/SKILL.md +154 -154
- package/skills/ruby/rails-expert/references/active-record.md +244 -244
- package/skills/ruby/rails-expert/references/api-development.md +401 -401
- package/skills/ruby/rails-expert/references/background-jobs.md +272 -272
- package/skills/ruby/rails-expert/references/hotwire-turbo.md +228 -228
- package/skills/ruby/rails-expert/references/rspec-testing.md +367 -367
- package/skills/swift/swift-expert/SKILL.md +163 -163
- package/skills/swift/swift-expert/references/async-concurrency.md +360 -360
- package/skills/swift/swift-expert/references/memory-performance.md +377 -377
- package/skills/swift/swift-expert/references/protocol-oriented.md +354 -354
- package/skills/swift/swift-expert/references/swiftui-patterns.md +291 -291
- package/skills/swift/swift-expert/references/testing-patterns.md +399 -399
- package/skills/workflow/brainstorming/SKILL.md +164 -164
- package/skills/workflow/brainstorming/scripts/frame-template.html +214 -214
- package/skills/workflow/brainstorming/scripts/helper.js +88 -88
- package/skills/workflow/brainstorming/scripts/server.cjs +354 -354
- package/skills/workflow/brainstorming/scripts/start-server.sh +148 -148
- package/skills/workflow/brainstorming/scripts/stop-server.sh +56 -56
- package/skills/workflow/brainstorming/spec-document-reviewer-prompt.md +49 -49
- package/skills/workflow/brainstorming/visual-companion.md +287 -287
- package/skills/workflow/documentation/SKILL.md +45 -45
- package/skills/workflow/entropy-management/SKILL.md +115 -115
- package/skills/workflow/executing-plans/SKILL.md +70 -70
- package/skills/workflow/finishing-a-development-branch/SKILL.md +200 -200
- package/skills/workflow/receiving-code-review/SKILL.md +213 -213
- package/skills/workflow/requesting-code-review/SKILL.md +105 -105
- package/skills/workflow/requesting-code-review/code-reviewer.md +146 -146
- package/skills/workflow/requirement-engineering/SKILL.md +111 -111
- package/skills/workflow/systematic-debugging/CREATION-LOG.md +119 -119
- package/skills/workflow/systematic-debugging/SKILL.md +296 -296
- package/skills/workflow/systematic-debugging/condition-based-waiting-example.ts +158 -158
- package/skills/workflow/systematic-debugging/condition-based-waiting.md +115 -115
- package/skills/workflow/systematic-debugging/defense-in-depth.md +122 -122
- package/skills/workflow/systematic-debugging/find-polluter.sh +63 -63
- package/skills/workflow/systematic-debugging/root-cause-tracing.md +169 -169
- package/skills/workflow/systematic-debugging/test-academic.md +14 -14
- package/skills/workflow/systematic-debugging/test-pressure-1.md +58 -58
- package/skills/workflow/systematic-debugging/test-pressure-2.md +68 -68
- package/skills/workflow/systematic-debugging/test-pressure-3.md +69 -69
- package/skills/workflow/using-git-worktrees/SKILL.md +218 -218
- package/skills/workflow/verification-before-completion/SKILL.md +139 -139
- package/skills/workflow/writing-plans/SKILL.md +151 -151
- package/skills/workflow/writing-plans/plan-document-reviewer-prompt.md +49 -49
- package/skills/workflow/writing-skills/SKILL.md +655 -655
- package/skills/workflow/writing-skills/anthropic-best-practices.md +1150 -1150
- package/skills/workflow/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -189
- package/skills/workflow/writing-skills/persuasion-principles.md +187 -187
- package/skills/workflow/writing-skills/render-graphs.js +168 -168
- package/skills/workflow/writing-skills/testing-skills-with-subagents.md +384 -384
|
@@ -1,407 +1,407 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""
|
|
3
|
-
Frontend Bundle Analyzer
|
|
4
|
-
|
|
5
|
-
Analyzes package.json and project structure for bundle optimization opportunities,
|
|
6
|
-
heavy dependencies, and best practice recommendations.
|
|
7
|
-
|
|
8
|
-
Usage:
|
|
9
|
-
python bundle_analyzer.py <project_dir>
|
|
10
|
-
python bundle_analyzer.py . --json
|
|
11
|
-
python bundle_analyzer.py /path/to/project --verbose
|
|
12
|
-
"""
|
|
13
|
-
|
|
14
|
-
import argparse
|
|
15
|
-
import json
|
|
16
|
-
import os
|
|
17
|
-
import re
|
|
18
|
-
import sys
|
|
19
|
-
from pathlib import Path
|
|
20
|
-
from typing import Dict, List, Optional, Any, Tuple
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
# Known heavy packages and their lighter alternatives
|
|
24
|
-
HEAVY_PACKAGES = {
|
|
25
|
-
"moment": {
|
|
26
|
-
"size": "290KB",
|
|
27
|
-
"alternative": "date-fns (12KB) or dayjs (2KB)",
|
|
28
|
-
"reason": "Large locale files bundled by default"
|
|
29
|
-
},
|
|
30
|
-
"lodash": {
|
|
31
|
-
"size": "71KB",
|
|
32
|
-
"alternative": "lodash-es with tree-shaking or individual imports (lodash/get)",
|
|
33
|
-
"reason": "Full library often imported when only few functions needed"
|
|
34
|
-
},
|
|
35
|
-
"jquery": {
|
|
36
|
-
"size": "87KB",
|
|
37
|
-
"alternative": "Native DOM APIs or React/Vue patterns",
|
|
38
|
-
"reason": "Rarely needed in modern frameworks"
|
|
39
|
-
},
|
|
40
|
-
"axios": {
|
|
41
|
-
"size": "14KB",
|
|
42
|
-
"alternative": "Native fetch API (0KB) or ky (3KB)",
|
|
43
|
-
"reason": "Fetch API covers most use cases"
|
|
44
|
-
},
|
|
45
|
-
"underscore": {
|
|
46
|
-
"size": "17KB",
|
|
47
|
-
"alternative": "Native ES6+ methods or lodash-es",
|
|
48
|
-
"reason": "Most utilities now in standard JavaScript"
|
|
49
|
-
},
|
|
50
|
-
"chart.js": {
|
|
51
|
-
"size": "180KB",
|
|
52
|
-
"alternative": "recharts (bundled with React) or lightweight-charts",
|
|
53
|
-
"reason": "Consider if you need all chart types"
|
|
54
|
-
},
|
|
55
|
-
"three": {
|
|
56
|
-
"size": "600KB",
|
|
57
|
-
"alternative": "None - use dynamic import for 3D features",
|
|
58
|
-
"reason": "Very large, should be lazy-loaded"
|
|
59
|
-
},
|
|
60
|
-
"firebase": {
|
|
61
|
-
"size": "400KB+",
|
|
62
|
-
"alternative": "Import specific modules (firebase/auth, firebase/firestore)",
|
|
63
|
-
"reason": "Modular imports significantly reduce size"
|
|
64
|
-
},
|
|
65
|
-
"material-ui": {
|
|
66
|
-
"size": "Large",
|
|
67
|
-
"alternative": "shadcn/ui (copy-paste components) or Tailwind",
|
|
68
|
-
"reason": "Heavy runtime, consider headless alternatives"
|
|
69
|
-
},
|
|
70
|
-
"@mui/material": {
|
|
71
|
-
"size": "Large",
|
|
72
|
-
"alternative": "shadcn/ui or Radix UI + Tailwind",
|
|
73
|
-
"reason": "Heavy runtime, consider headless alternatives"
|
|
74
|
-
},
|
|
75
|
-
"antd": {
|
|
76
|
-
"size": "Large",
|
|
77
|
-
"alternative": "shadcn/ui or Radix UI + Tailwind",
|
|
78
|
-
"reason": "Heavy runtime, consider headless alternatives"
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
# Recommended optimizations by package
|
|
83
|
-
PACKAGE_OPTIMIZATIONS = {
|
|
84
|
-
"react-icons": "Import individual icons: import { FaHome } from 'react-icons/fa'",
|
|
85
|
-
"date-fns": "Use tree-shaking: import { format } from 'date-fns'",
|
|
86
|
-
"@heroicons/react": "Already tree-shakeable, good choice",
|
|
87
|
-
"lucide-react": "Already tree-shakeable, add to optimizePackageImports in next.config.js",
|
|
88
|
-
"framer-motion": "Use dynamic import for non-critical animations",
|
|
89
|
-
"recharts": "Consider lazy loading for dashboard charts",
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
# Development dependencies that should not be in dependencies
|
|
93
|
-
DEV_ONLY_PACKAGES = [
|
|
94
|
-
"typescript", "@types/", "eslint", "prettier", "jest", "vitest",
|
|
95
|
-
"@testing-library", "cypress", "playwright", "storybook", "@storybook",
|
|
96
|
-
"webpack", "vite", "rollup", "esbuild", "tailwindcss", "postcss",
|
|
97
|
-
"autoprefixer", "sass", "less", "husky", "lint-staged"
|
|
98
|
-
]
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
def load_package_json(project_dir: Path) -> Optional[Dict]:
|
|
102
|
-
"""Load and parse package.json."""
|
|
103
|
-
package_path = project_dir / "package.json"
|
|
104
|
-
if not package_path.exists():
|
|
105
|
-
return None
|
|
106
|
-
|
|
107
|
-
try:
|
|
108
|
-
with open(package_path) as f:
|
|
109
|
-
return json.load(f)
|
|
110
|
-
except json.JSONDecodeError:
|
|
111
|
-
return None
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
def analyze_dependencies(package_json: Dict) -> Dict:
|
|
115
|
-
"""Analyze dependencies for issues."""
|
|
116
|
-
deps = package_json.get("dependencies", {})
|
|
117
|
-
dev_deps = package_json.get("devDependencies", {})
|
|
118
|
-
|
|
119
|
-
issues = []
|
|
120
|
-
warnings = []
|
|
121
|
-
optimizations = []
|
|
122
|
-
|
|
123
|
-
# Check for heavy packages
|
|
124
|
-
for pkg, info in HEAVY_PACKAGES.items():
|
|
125
|
-
if pkg in deps:
|
|
126
|
-
issues.append({
|
|
127
|
-
"package": pkg,
|
|
128
|
-
"type": "heavy_dependency",
|
|
129
|
-
"size": info["size"],
|
|
130
|
-
"alternative": info["alternative"],
|
|
131
|
-
"reason": info["reason"]
|
|
132
|
-
})
|
|
133
|
-
|
|
134
|
-
# Check for dev dependencies in production
|
|
135
|
-
for pkg in deps.keys():
|
|
136
|
-
for dev_pattern in DEV_ONLY_PACKAGES:
|
|
137
|
-
if dev_pattern in pkg:
|
|
138
|
-
warnings.append({
|
|
139
|
-
"package": pkg,
|
|
140
|
-
"type": "dev_in_production",
|
|
141
|
-
"message": f"{pkg} should be in devDependencies, not dependencies"
|
|
142
|
-
})
|
|
143
|
-
|
|
144
|
-
# Check for optimization opportunities
|
|
145
|
-
for pkg in deps.keys():
|
|
146
|
-
for opt_pkg, opt_tip in PACKAGE_OPTIMIZATIONS.items():
|
|
147
|
-
if opt_pkg in pkg:
|
|
148
|
-
optimizations.append({
|
|
149
|
-
"package": pkg,
|
|
150
|
-
"tip": opt_tip
|
|
151
|
-
})
|
|
152
|
-
|
|
153
|
-
# Check for outdated React patterns
|
|
154
|
-
if "prop-types" in deps and ("typescript" in dev_deps or "@types/react" in dev_deps):
|
|
155
|
-
warnings.append({
|
|
156
|
-
"package": "prop-types",
|
|
157
|
-
"type": "redundant",
|
|
158
|
-
"message": "prop-types is redundant when using TypeScript"
|
|
159
|
-
})
|
|
160
|
-
|
|
161
|
-
# Check for multiple state management libraries
|
|
162
|
-
state_libs = ["redux", "@reduxjs/toolkit", "mobx", "zustand", "jotai", "recoil", "valtio"]
|
|
163
|
-
found_state_libs = [lib for lib in state_libs if lib in deps]
|
|
164
|
-
if len(found_state_libs) > 1:
|
|
165
|
-
warnings.append({
|
|
166
|
-
"packages": found_state_libs,
|
|
167
|
-
"type": "multiple_state_libs",
|
|
168
|
-
"message": f"Multiple state management libraries found: {', '.join(found_state_libs)}"
|
|
169
|
-
})
|
|
170
|
-
|
|
171
|
-
return {
|
|
172
|
-
"total_dependencies": len(deps),
|
|
173
|
-
"total_dev_dependencies": len(dev_deps),
|
|
174
|
-
"issues": issues,
|
|
175
|
-
"warnings": warnings,
|
|
176
|
-
"optimizations": optimizations
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
def check_nextjs_config(project_dir: Path) -> Dict:
|
|
181
|
-
"""Check Next.js configuration for optimizations."""
|
|
182
|
-
config_paths = [
|
|
183
|
-
project_dir / "next.config.js",
|
|
184
|
-
project_dir / "next.config.mjs",
|
|
185
|
-
project_dir / "next.config.ts"
|
|
186
|
-
]
|
|
187
|
-
|
|
188
|
-
for config_path in config_paths:
|
|
189
|
-
if config_path.exists():
|
|
190
|
-
try:
|
|
191
|
-
content = config_path.read_text()
|
|
192
|
-
suggestions = []
|
|
193
|
-
|
|
194
|
-
# Check for image optimization
|
|
195
|
-
if "images" not in content:
|
|
196
|
-
suggestions.append("Configure images.remotePatterns for optimized image loading")
|
|
197
|
-
|
|
198
|
-
# Check for package optimization
|
|
199
|
-
if "optimizePackageImports" not in content:
|
|
200
|
-
suggestions.append("Add experimental.optimizePackageImports for lucide-react, @heroicons/react")
|
|
201
|
-
|
|
202
|
-
# Check for transpilePackages
|
|
203
|
-
if "transpilePackages" not in content and "swc" not in content:
|
|
204
|
-
suggestions.append("Consider transpilePackages for monorepo packages")
|
|
205
|
-
|
|
206
|
-
return {
|
|
207
|
-
"found": True,
|
|
208
|
-
"path": str(config_path),
|
|
209
|
-
"suggestions": suggestions
|
|
210
|
-
}
|
|
211
|
-
except Exception:
|
|
212
|
-
pass
|
|
213
|
-
|
|
214
|
-
return {
|
|
215
|
-
"found": False,
|
|
216
|
-
"suggestions": ["Create next.config.js with image and bundle optimizations"]
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
def analyze_imports(project_dir: Path) -> Dict:
|
|
221
|
-
"""Analyze import patterns in source files."""
|
|
222
|
-
issues = []
|
|
223
|
-
src_dirs = [project_dir / "src", project_dir / "app", project_dir / "pages"]
|
|
224
|
-
|
|
225
|
-
patterns_to_check = [
|
|
226
|
-
(r"import\s+\*\s+as\s+\w+\s+from\s+['\"]lodash['\"]", "Avoid import * from lodash, use individual imports"),
|
|
227
|
-
(r"import\s+moment\s+from\s+['\"]moment['\"]", "Consider replacing moment with date-fns or dayjs"),
|
|
228
|
-
(r"import\s+\{\s*\w+(?:,\s*\w+){5,}\s*\}\s+from\s+['\"]react-icons", "Import icons from specific icon sets (react-icons/fa)"),
|
|
229
|
-
]
|
|
230
|
-
|
|
231
|
-
files_checked = 0
|
|
232
|
-
for src_dir in src_dirs:
|
|
233
|
-
if not src_dir.exists():
|
|
234
|
-
continue
|
|
235
|
-
|
|
236
|
-
for ext in ["*.ts", "*.tsx", "*.js", "*.jsx"]:
|
|
237
|
-
for file_path in src_dir.glob(f"**/{ext}"):
|
|
238
|
-
if "node_modules" in str(file_path):
|
|
239
|
-
continue
|
|
240
|
-
|
|
241
|
-
files_checked += 1
|
|
242
|
-
try:
|
|
243
|
-
content = file_path.read_text()
|
|
244
|
-
for pattern, message in patterns_to_check:
|
|
245
|
-
if re.search(pattern, content):
|
|
246
|
-
issues.append({
|
|
247
|
-
"file": str(file_path.relative_to(project_dir)),
|
|
248
|
-
"issue": message
|
|
249
|
-
})
|
|
250
|
-
except Exception:
|
|
251
|
-
continue
|
|
252
|
-
|
|
253
|
-
return {
|
|
254
|
-
"files_checked": files_checked,
|
|
255
|
-
"issues": issues
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
def calculate_score(analysis: Dict) -> Tuple[int, str]:
|
|
260
|
-
"""Calculate bundle health score."""
|
|
261
|
-
score = 100
|
|
262
|
-
|
|
263
|
-
# Deduct for heavy dependencies
|
|
264
|
-
score -= len(analysis["dependencies"]["issues"]) * 10
|
|
265
|
-
|
|
266
|
-
# Deduct for dev deps in production
|
|
267
|
-
score -= len([w for w in analysis["dependencies"]["warnings"]
|
|
268
|
-
if w.get("type") == "dev_in_production"]) * 5
|
|
269
|
-
|
|
270
|
-
# Deduct for import issues
|
|
271
|
-
score -= len(analysis.get("imports", {}).get("issues", [])) * 3
|
|
272
|
-
|
|
273
|
-
# Deduct for missing Next.js optimizations
|
|
274
|
-
if not analysis.get("nextjs", {}).get("found", True):
|
|
275
|
-
score -= 10
|
|
276
|
-
|
|
277
|
-
score = max(0, min(100, score))
|
|
278
|
-
|
|
279
|
-
if score >= 90:
|
|
280
|
-
grade = "A"
|
|
281
|
-
elif score >= 80:
|
|
282
|
-
grade = "B"
|
|
283
|
-
elif score >= 70:
|
|
284
|
-
grade = "C"
|
|
285
|
-
elif score >= 60:
|
|
286
|
-
grade = "D"
|
|
287
|
-
else:
|
|
288
|
-
grade = "F"
|
|
289
|
-
|
|
290
|
-
return score, grade
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
def print_report(analysis: Dict) -> None:
|
|
294
|
-
"""Print human-readable report."""
|
|
295
|
-
score, grade = calculate_score(analysis)
|
|
296
|
-
|
|
297
|
-
print("=" * 60)
|
|
298
|
-
print("FRONTEND BUNDLE ANALYSIS REPORT")
|
|
299
|
-
print("=" * 60)
|
|
300
|
-
print(f"\nBundle Health Score: {score}/100 ({grade})")
|
|
301
|
-
|
|
302
|
-
deps = analysis["dependencies"]
|
|
303
|
-
print(f"\nDependencies: {deps['total_dependencies']} production, {deps['total_dev_dependencies']} dev")
|
|
304
|
-
|
|
305
|
-
# Heavy dependencies
|
|
306
|
-
if deps["issues"]:
|
|
307
|
-
print("\n--- HEAVY DEPENDENCIES ---")
|
|
308
|
-
for issue in deps["issues"]:
|
|
309
|
-
print(f"\n {issue['package']} ({issue['size']})")
|
|
310
|
-
print(f" Reason: {issue['reason']}")
|
|
311
|
-
print(f" Alternative: {issue['alternative']}")
|
|
312
|
-
|
|
313
|
-
# Warnings
|
|
314
|
-
if deps["warnings"]:
|
|
315
|
-
print("\n--- WARNINGS ---")
|
|
316
|
-
for warning in deps["warnings"]:
|
|
317
|
-
if "package" in warning:
|
|
318
|
-
print(f" - {warning['package']}: {warning['message']}")
|
|
319
|
-
else:
|
|
320
|
-
print(f" - {warning['message']}")
|
|
321
|
-
|
|
322
|
-
# Optimizations
|
|
323
|
-
if deps["optimizations"]:
|
|
324
|
-
print("\n--- OPTIMIZATION TIPS ---")
|
|
325
|
-
for opt in deps["optimizations"]:
|
|
326
|
-
print(f" - {opt['package']}: {opt['tip']}")
|
|
327
|
-
|
|
328
|
-
# Next.js config
|
|
329
|
-
if "nextjs" in analysis:
|
|
330
|
-
nextjs = analysis["nextjs"]
|
|
331
|
-
if nextjs.get("suggestions"):
|
|
332
|
-
print("\n--- NEXT.JS CONFIG ---")
|
|
333
|
-
for suggestion in nextjs["suggestions"]:
|
|
334
|
-
print(f" - {suggestion}")
|
|
335
|
-
|
|
336
|
-
# Import issues
|
|
337
|
-
if analysis.get("imports", {}).get("issues"):
|
|
338
|
-
print("\n--- IMPORT ISSUES ---")
|
|
339
|
-
for issue in analysis["imports"]["issues"][:10]: # Limit to 10
|
|
340
|
-
print(f" - {issue['file']}: {issue['issue']}")
|
|
341
|
-
|
|
342
|
-
# Summary
|
|
343
|
-
print("\n--- RECOMMENDATIONS ---")
|
|
344
|
-
if score >= 90:
|
|
345
|
-
print(" Bundle is well-optimized!")
|
|
346
|
-
elif deps["issues"]:
|
|
347
|
-
print(" 1. Replace heavy dependencies with lighter alternatives")
|
|
348
|
-
if deps["warnings"]:
|
|
349
|
-
print(" 2. Move dev-only packages to devDependencies")
|
|
350
|
-
if deps["optimizations"]:
|
|
351
|
-
print(" 3. Apply import optimizations for tree-shaking")
|
|
352
|
-
|
|
353
|
-
print("\n" + "=" * 60)
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
def main():
|
|
357
|
-
parser = argparse.ArgumentParser(
|
|
358
|
-
description="Analyze frontend project for bundle optimization opportunities"
|
|
359
|
-
)
|
|
360
|
-
parser.add_argument(
|
|
361
|
-
"project_dir",
|
|
362
|
-
nargs="?",
|
|
363
|
-
default=".",
|
|
364
|
-
help="Project directory to analyze (default: current directory)"
|
|
365
|
-
)
|
|
366
|
-
parser.add_argument(
|
|
367
|
-
"--json",
|
|
368
|
-
action="store_true",
|
|
369
|
-
help="Output in JSON format"
|
|
370
|
-
)
|
|
371
|
-
parser.add_argument(
|
|
372
|
-
"--verbose", "-v",
|
|
373
|
-
action="store_true",
|
|
374
|
-
help="Include detailed import analysis"
|
|
375
|
-
)
|
|
376
|
-
|
|
377
|
-
args = parser.parse_args()
|
|
378
|
-
project_dir = Path(args.project_dir).resolve()
|
|
379
|
-
|
|
380
|
-
if not project_dir.exists():
|
|
381
|
-
print(f"Error: Directory not found: {project_dir}", file=sys.stderr)
|
|
382
|
-
sys.exit(1)
|
|
383
|
-
|
|
384
|
-
package_json = load_package_json(project_dir)
|
|
385
|
-
if not package_json:
|
|
386
|
-
print("Error: No valid package.json found", file=sys.stderr)
|
|
387
|
-
sys.exit(1)
|
|
388
|
-
|
|
389
|
-
analysis = {
|
|
390
|
-
"project": str(project_dir),
|
|
391
|
-
"dependencies": analyze_dependencies(package_json),
|
|
392
|
-
"nextjs": check_nextjs_config(project_dir)
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
if args.verbose:
|
|
396
|
-
analysis["imports"] = analyze_imports(project_dir)
|
|
397
|
-
|
|
398
|
-
analysis["score"], analysis["grade"] = calculate_score(analysis)
|
|
399
|
-
|
|
400
|
-
if args.json:
|
|
401
|
-
print(json.dumps(analysis, indent=2))
|
|
402
|
-
else:
|
|
403
|
-
print_report(analysis)
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
if __name__ == "__main__":
|
|
407
|
-
main()
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Frontend Bundle Analyzer
|
|
4
|
+
|
|
5
|
+
Analyzes package.json and project structure for bundle optimization opportunities,
|
|
6
|
+
heavy dependencies, and best practice recommendations.
|
|
7
|
+
|
|
8
|
+
Usage:
|
|
9
|
+
python bundle_analyzer.py <project_dir>
|
|
10
|
+
python bundle_analyzer.py . --json
|
|
11
|
+
python bundle_analyzer.py /path/to/project --verbose
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
import argparse
|
|
15
|
+
import json
|
|
16
|
+
import os
|
|
17
|
+
import re
|
|
18
|
+
import sys
|
|
19
|
+
from pathlib import Path
|
|
20
|
+
from typing import Dict, List, Optional, Any, Tuple
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
# Known heavy packages and their lighter alternatives
|
|
24
|
+
HEAVY_PACKAGES = {
|
|
25
|
+
"moment": {
|
|
26
|
+
"size": "290KB",
|
|
27
|
+
"alternative": "date-fns (12KB) or dayjs (2KB)",
|
|
28
|
+
"reason": "Large locale files bundled by default"
|
|
29
|
+
},
|
|
30
|
+
"lodash": {
|
|
31
|
+
"size": "71KB",
|
|
32
|
+
"alternative": "lodash-es with tree-shaking or individual imports (lodash/get)",
|
|
33
|
+
"reason": "Full library often imported when only few functions needed"
|
|
34
|
+
},
|
|
35
|
+
"jquery": {
|
|
36
|
+
"size": "87KB",
|
|
37
|
+
"alternative": "Native DOM APIs or React/Vue patterns",
|
|
38
|
+
"reason": "Rarely needed in modern frameworks"
|
|
39
|
+
},
|
|
40
|
+
"axios": {
|
|
41
|
+
"size": "14KB",
|
|
42
|
+
"alternative": "Native fetch API (0KB) or ky (3KB)",
|
|
43
|
+
"reason": "Fetch API covers most use cases"
|
|
44
|
+
},
|
|
45
|
+
"underscore": {
|
|
46
|
+
"size": "17KB",
|
|
47
|
+
"alternative": "Native ES6+ methods or lodash-es",
|
|
48
|
+
"reason": "Most utilities now in standard JavaScript"
|
|
49
|
+
},
|
|
50
|
+
"chart.js": {
|
|
51
|
+
"size": "180KB",
|
|
52
|
+
"alternative": "recharts (bundled with React) or lightweight-charts",
|
|
53
|
+
"reason": "Consider if you need all chart types"
|
|
54
|
+
},
|
|
55
|
+
"three": {
|
|
56
|
+
"size": "600KB",
|
|
57
|
+
"alternative": "None - use dynamic import for 3D features",
|
|
58
|
+
"reason": "Very large, should be lazy-loaded"
|
|
59
|
+
},
|
|
60
|
+
"firebase": {
|
|
61
|
+
"size": "400KB+",
|
|
62
|
+
"alternative": "Import specific modules (firebase/auth, firebase/firestore)",
|
|
63
|
+
"reason": "Modular imports significantly reduce size"
|
|
64
|
+
},
|
|
65
|
+
"material-ui": {
|
|
66
|
+
"size": "Large",
|
|
67
|
+
"alternative": "shadcn/ui (copy-paste components) or Tailwind",
|
|
68
|
+
"reason": "Heavy runtime, consider headless alternatives"
|
|
69
|
+
},
|
|
70
|
+
"@mui/material": {
|
|
71
|
+
"size": "Large",
|
|
72
|
+
"alternative": "shadcn/ui or Radix UI + Tailwind",
|
|
73
|
+
"reason": "Heavy runtime, consider headless alternatives"
|
|
74
|
+
},
|
|
75
|
+
"antd": {
|
|
76
|
+
"size": "Large",
|
|
77
|
+
"alternative": "shadcn/ui or Radix UI + Tailwind",
|
|
78
|
+
"reason": "Heavy runtime, consider headless alternatives"
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
# Recommended optimizations by package
|
|
83
|
+
PACKAGE_OPTIMIZATIONS = {
|
|
84
|
+
"react-icons": "Import individual icons: import { FaHome } from 'react-icons/fa'",
|
|
85
|
+
"date-fns": "Use tree-shaking: import { format } from 'date-fns'",
|
|
86
|
+
"@heroicons/react": "Already tree-shakeable, good choice",
|
|
87
|
+
"lucide-react": "Already tree-shakeable, add to optimizePackageImports in next.config.js",
|
|
88
|
+
"framer-motion": "Use dynamic import for non-critical animations",
|
|
89
|
+
"recharts": "Consider lazy loading for dashboard charts",
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
# Development dependencies that should not be in dependencies
|
|
93
|
+
DEV_ONLY_PACKAGES = [
|
|
94
|
+
"typescript", "@types/", "eslint", "prettier", "jest", "vitest",
|
|
95
|
+
"@testing-library", "cypress", "playwright", "storybook", "@storybook",
|
|
96
|
+
"webpack", "vite", "rollup", "esbuild", "tailwindcss", "postcss",
|
|
97
|
+
"autoprefixer", "sass", "less", "husky", "lint-staged"
|
|
98
|
+
]
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def load_package_json(project_dir: Path) -> Optional[Dict]:
|
|
102
|
+
"""Load and parse package.json."""
|
|
103
|
+
package_path = project_dir / "package.json"
|
|
104
|
+
if not package_path.exists():
|
|
105
|
+
return None
|
|
106
|
+
|
|
107
|
+
try:
|
|
108
|
+
with open(package_path) as f:
|
|
109
|
+
return json.load(f)
|
|
110
|
+
except json.JSONDecodeError:
|
|
111
|
+
return None
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def analyze_dependencies(package_json: Dict) -> Dict:
|
|
115
|
+
"""Analyze dependencies for issues."""
|
|
116
|
+
deps = package_json.get("dependencies", {})
|
|
117
|
+
dev_deps = package_json.get("devDependencies", {})
|
|
118
|
+
|
|
119
|
+
issues = []
|
|
120
|
+
warnings = []
|
|
121
|
+
optimizations = []
|
|
122
|
+
|
|
123
|
+
# Check for heavy packages
|
|
124
|
+
for pkg, info in HEAVY_PACKAGES.items():
|
|
125
|
+
if pkg in deps:
|
|
126
|
+
issues.append({
|
|
127
|
+
"package": pkg,
|
|
128
|
+
"type": "heavy_dependency",
|
|
129
|
+
"size": info["size"],
|
|
130
|
+
"alternative": info["alternative"],
|
|
131
|
+
"reason": info["reason"]
|
|
132
|
+
})
|
|
133
|
+
|
|
134
|
+
# Check for dev dependencies in production
|
|
135
|
+
for pkg in deps.keys():
|
|
136
|
+
for dev_pattern in DEV_ONLY_PACKAGES:
|
|
137
|
+
if dev_pattern in pkg:
|
|
138
|
+
warnings.append({
|
|
139
|
+
"package": pkg,
|
|
140
|
+
"type": "dev_in_production",
|
|
141
|
+
"message": f"{pkg} should be in devDependencies, not dependencies"
|
|
142
|
+
})
|
|
143
|
+
|
|
144
|
+
# Check for optimization opportunities
|
|
145
|
+
for pkg in deps.keys():
|
|
146
|
+
for opt_pkg, opt_tip in PACKAGE_OPTIMIZATIONS.items():
|
|
147
|
+
if opt_pkg in pkg:
|
|
148
|
+
optimizations.append({
|
|
149
|
+
"package": pkg,
|
|
150
|
+
"tip": opt_tip
|
|
151
|
+
})
|
|
152
|
+
|
|
153
|
+
# Check for outdated React patterns
|
|
154
|
+
if "prop-types" in deps and ("typescript" in dev_deps or "@types/react" in dev_deps):
|
|
155
|
+
warnings.append({
|
|
156
|
+
"package": "prop-types",
|
|
157
|
+
"type": "redundant",
|
|
158
|
+
"message": "prop-types is redundant when using TypeScript"
|
|
159
|
+
})
|
|
160
|
+
|
|
161
|
+
# Check for multiple state management libraries
|
|
162
|
+
state_libs = ["redux", "@reduxjs/toolkit", "mobx", "zustand", "jotai", "recoil", "valtio"]
|
|
163
|
+
found_state_libs = [lib for lib in state_libs if lib in deps]
|
|
164
|
+
if len(found_state_libs) > 1:
|
|
165
|
+
warnings.append({
|
|
166
|
+
"packages": found_state_libs,
|
|
167
|
+
"type": "multiple_state_libs",
|
|
168
|
+
"message": f"Multiple state management libraries found: {', '.join(found_state_libs)}"
|
|
169
|
+
})
|
|
170
|
+
|
|
171
|
+
return {
|
|
172
|
+
"total_dependencies": len(deps),
|
|
173
|
+
"total_dev_dependencies": len(dev_deps),
|
|
174
|
+
"issues": issues,
|
|
175
|
+
"warnings": warnings,
|
|
176
|
+
"optimizations": optimizations
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
def check_nextjs_config(project_dir: Path) -> Dict:
|
|
181
|
+
"""Check Next.js configuration for optimizations."""
|
|
182
|
+
config_paths = [
|
|
183
|
+
project_dir / "next.config.js",
|
|
184
|
+
project_dir / "next.config.mjs",
|
|
185
|
+
project_dir / "next.config.ts"
|
|
186
|
+
]
|
|
187
|
+
|
|
188
|
+
for config_path in config_paths:
|
|
189
|
+
if config_path.exists():
|
|
190
|
+
try:
|
|
191
|
+
content = config_path.read_text()
|
|
192
|
+
suggestions = []
|
|
193
|
+
|
|
194
|
+
# Check for image optimization
|
|
195
|
+
if "images" not in content:
|
|
196
|
+
suggestions.append("Configure images.remotePatterns for optimized image loading")
|
|
197
|
+
|
|
198
|
+
# Check for package optimization
|
|
199
|
+
if "optimizePackageImports" not in content:
|
|
200
|
+
suggestions.append("Add experimental.optimizePackageImports for lucide-react, @heroicons/react")
|
|
201
|
+
|
|
202
|
+
# Check for transpilePackages
|
|
203
|
+
if "transpilePackages" not in content and "swc" not in content:
|
|
204
|
+
suggestions.append("Consider transpilePackages for monorepo packages")
|
|
205
|
+
|
|
206
|
+
return {
|
|
207
|
+
"found": True,
|
|
208
|
+
"path": str(config_path),
|
|
209
|
+
"suggestions": suggestions
|
|
210
|
+
}
|
|
211
|
+
except Exception:
|
|
212
|
+
pass
|
|
213
|
+
|
|
214
|
+
return {
|
|
215
|
+
"found": False,
|
|
216
|
+
"suggestions": ["Create next.config.js with image and bundle optimizations"]
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
def analyze_imports(project_dir: Path) -> Dict:
|
|
221
|
+
"""Analyze import patterns in source files."""
|
|
222
|
+
issues = []
|
|
223
|
+
src_dirs = [project_dir / "src", project_dir / "app", project_dir / "pages"]
|
|
224
|
+
|
|
225
|
+
patterns_to_check = [
|
|
226
|
+
(r"import\s+\*\s+as\s+\w+\s+from\s+['\"]lodash['\"]", "Avoid import * from lodash, use individual imports"),
|
|
227
|
+
(r"import\s+moment\s+from\s+['\"]moment['\"]", "Consider replacing moment with date-fns or dayjs"),
|
|
228
|
+
(r"import\s+\{\s*\w+(?:,\s*\w+){5,}\s*\}\s+from\s+['\"]react-icons", "Import icons from specific icon sets (react-icons/fa)"),
|
|
229
|
+
]
|
|
230
|
+
|
|
231
|
+
files_checked = 0
|
|
232
|
+
for src_dir in src_dirs:
|
|
233
|
+
if not src_dir.exists():
|
|
234
|
+
continue
|
|
235
|
+
|
|
236
|
+
for ext in ["*.ts", "*.tsx", "*.js", "*.jsx"]:
|
|
237
|
+
for file_path in src_dir.glob(f"**/{ext}"):
|
|
238
|
+
if "node_modules" in str(file_path):
|
|
239
|
+
continue
|
|
240
|
+
|
|
241
|
+
files_checked += 1
|
|
242
|
+
try:
|
|
243
|
+
content = file_path.read_text()
|
|
244
|
+
for pattern, message in patterns_to_check:
|
|
245
|
+
if re.search(pattern, content):
|
|
246
|
+
issues.append({
|
|
247
|
+
"file": str(file_path.relative_to(project_dir)),
|
|
248
|
+
"issue": message
|
|
249
|
+
})
|
|
250
|
+
except Exception:
|
|
251
|
+
continue
|
|
252
|
+
|
|
253
|
+
return {
|
|
254
|
+
"files_checked": files_checked,
|
|
255
|
+
"issues": issues
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
def calculate_score(analysis: Dict) -> Tuple[int, str]:
|
|
260
|
+
"""Calculate bundle health score."""
|
|
261
|
+
score = 100
|
|
262
|
+
|
|
263
|
+
# Deduct for heavy dependencies
|
|
264
|
+
score -= len(analysis["dependencies"]["issues"]) * 10
|
|
265
|
+
|
|
266
|
+
# Deduct for dev deps in production
|
|
267
|
+
score -= len([w for w in analysis["dependencies"]["warnings"]
|
|
268
|
+
if w.get("type") == "dev_in_production"]) * 5
|
|
269
|
+
|
|
270
|
+
# Deduct for import issues
|
|
271
|
+
score -= len(analysis.get("imports", {}).get("issues", [])) * 3
|
|
272
|
+
|
|
273
|
+
# Deduct for missing Next.js optimizations
|
|
274
|
+
if not analysis.get("nextjs", {}).get("found", True):
|
|
275
|
+
score -= 10
|
|
276
|
+
|
|
277
|
+
score = max(0, min(100, score))
|
|
278
|
+
|
|
279
|
+
if score >= 90:
|
|
280
|
+
grade = "A"
|
|
281
|
+
elif score >= 80:
|
|
282
|
+
grade = "B"
|
|
283
|
+
elif score >= 70:
|
|
284
|
+
grade = "C"
|
|
285
|
+
elif score >= 60:
|
|
286
|
+
grade = "D"
|
|
287
|
+
else:
|
|
288
|
+
grade = "F"
|
|
289
|
+
|
|
290
|
+
return score, grade
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
def print_report(analysis: Dict) -> None:
|
|
294
|
+
"""Print human-readable report."""
|
|
295
|
+
score, grade = calculate_score(analysis)
|
|
296
|
+
|
|
297
|
+
print("=" * 60)
|
|
298
|
+
print("FRONTEND BUNDLE ANALYSIS REPORT")
|
|
299
|
+
print("=" * 60)
|
|
300
|
+
print(f"\nBundle Health Score: {score}/100 ({grade})")
|
|
301
|
+
|
|
302
|
+
deps = analysis["dependencies"]
|
|
303
|
+
print(f"\nDependencies: {deps['total_dependencies']} production, {deps['total_dev_dependencies']} dev")
|
|
304
|
+
|
|
305
|
+
# Heavy dependencies
|
|
306
|
+
if deps["issues"]:
|
|
307
|
+
print("\n--- HEAVY DEPENDENCIES ---")
|
|
308
|
+
for issue in deps["issues"]:
|
|
309
|
+
print(f"\n {issue['package']} ({issue['size']})")
|
|
310
|
+
print(f" Reason: {issue['reason']}")
|
|
311
|
+
print(f" Alternative: {issue['alternative']}")
|
|
312
|
+
|
|
313
|
+
# Warnings
|
|
314
|
+
if deps["warnings"]:
|
|
315
|
+
print("\n--- WARNINGS ---")
|
|
316
|
+
for warning in deps["warnings"]:
|
|
317
|
+
if "package" in warning:
|
|
318
|
+
print(f" - {warning['package']}: {warning['message']}")
|
|
319
|
+
else:
|
|
320
|
+
print(f" - {warning['message']}")
|
|
321
|
+
|
|
322
|
+
# Optimizations
|
|
323
|
+
if deps["optimizations"]:
|
|
324
|
+
print("\n--- OPTIMIZATION TIPS ---")
|
|
325
|
+
for opt in deps["optimizations"]:
|
|
326
|
+
print(f" - {opt['package']}: {opt['tip']}")
|
|
327
|
+
|
|
328
|
+
# Next.js config
|
|
329
|
+
if "nextjs" in analysis:
|
|
330
|
+
nextjs = analysis["nextjs"]
|
|
331
|
+
if nextjs.get("suggestions"):
|
|
332
|
+
print("\n--- NEXT.JS CONFIG ---")
|
|
333
|
+
for suggestion in nextjs["suggestions"]:
|
|
334
|
+
print(f" - {suggestion}")
|
|
335
|
+
|
|
336
|
+
# Import issues
|
|
337
|
+
if analysis.get("imports", {}).get("issues"):
|
|
338
|
+
print("\n--- IMPORT ISSUES ---")
|
|
339
|
+
for issue in analysis["imports"]["issues"][:10]: # Limit to 10
|
|
340
|
+
print(f" - {issue['file']}: {issue['issue']}")
|
|
341
|
+
|
|
342
|
+
# Summary
|
|
343
|
+
print("\n--- RECOMMENDATIONS ---")
|
|
344
|
+
if score >= 90:
|
|
345
|
+
print(" Bundle is well-optimized!")
|
|
346
|
+
elif deps["issues"]:
|
|
347
|
+
print(" 1. Replace heavy dependencies with lighter alternatives")
|
|
348
|
+
if deps["warnings"]:
|
|
349
|
+
print(" 2. Move dev-only packages to devDependencies")
|
|
350
|
+
if deps["optimizations"]:
|
|
351
|
+
print(" 3. Apply import optimizations for tree-shaking")
|
|
352
|
+
|
|
353
|
+
print("\n" + "=" * 60)
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
def main():
|
|
357
|
+
parser = argparse.ArgumentParser(
|
|
358
|
+
description="Analyze frontend project for bundle optimization opportunities"
|
|
359
|
+
)
|
|
360
|
+
parser.add_argument(
|
|
361
|
+
"project_dir",
|
|
362
|
+
nargs="?",
|
|
363
|
+
default=".",
|
|
364
|
+
help="Project directory to analyze (default: current directory)"
|
|
365
|
+
)
|
|
366
|
+
parser.add_argument(
|
|
367
|
+
"--json",
|
|
368
|
+
action="store_true",
|
|
369
|
+
help="Output in JSON format"
|
|
370
|
+
)
|
|
371
|
+
parser.add_argument(
|
|
372
|
+
"--verbose", "-v",
|
|
373
|
+
action="store_true",
|
|
374
|
+
help="Include detailed import analysis"
|
|
375
|
+
)
|
|
376
|
+
|
|
377
|
+
args = parser.parse_args()
|
|
378
|
+
project_dir = Path(args.project_dir).resolve()
|
|
379
|
+
|
|
380
|
+
if not project_dir.exists():
|
|
381
|
+
print(f"Error: Directory not found: {project_dir}", file=sys.stderr)
|
|
382
|
+
sys.exit(1)
|
|
383
|
+
|
|
384
|
+
package_json = load_package_json(project_dir)
|
|
385
|
+
if not package_json:
|
|
386
|
+
print("Error: No valid package.json found", file=sys.stderr)
|
|
387
|
+
sys.exit(1)
|
|
388
|
+
|
|
389
|
+
analysis = {
|
|
390
|
+
"project": str(project_dir),
|
|
391
|
+
"dependencies": analyze_dependencies(package_json),
|
|
392
|
+
"nextjs": check_nextjs_config(project_dir)
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
if args.verbose:
|
|
396
|
+
analysis["imports"] = analyze_imports(project_dir)
|
|
397
|
+
|
|
398
|
+
analysis["score"], analysis["grade"] = calculate_score(analysis)
|
|
399
|
+
|
|
400
|
+
if args.json:
|
|
401
|
+
print(json.dumps(analysis, indent=2))
|
|
402
|
+
else:
|
|
403
|
+
print_report(analysis)
|
|
404
|
+
|
|
405
|
+
|
|
406
|
+
if __name__ == "__main__":
|
|
407
|
+
main()
|