appiq-solution 1.4.8 → 1.5.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 +172 -48
- package/bmad-core/agent-teams/team-fullstack.yaml +1 -11
- package/bmad-core/agents/analyst.md +3 -7
- package/bmad-core/agents/architect.md +0 -6
- package/bmad-core/agents/dev.md +5 -24
- package/bmad-core/agents/pm.md +3 -7
- package/bmad-core/agents/qa.md +0 -17
- package/bmad-core/agents/sm.md +3 -8
- package/bmad-core/agents/ux-expert.md +3 -8
- package/bmad-core/data/technical-preferences.md +1 -147
- package/bmad-core/templates/fullstack-architecture-tmpl.yaml +5 -12
- package/bmad-core/workflows/brownfield-fullstack.yaml +1 -15
- package/bmad-core/workflows/greenfield-fullstack.yaml +5 -49
- package/bmad-core/working-in-the-brownfield.md +10 -19
- package/dist/agents/bmad-orchestrator.txt +0 -111
- package/dist/agents/pm.txt +2 -0
- package/dist/expansion-packs/bmad-2d-phaser-game-dev/teams/phaser-2d-nodejs-game-team.txt +0 -111
- package/dist/expansion-packs/bmad-2d-unity-game-dev/teams/unity-2d-game-team.txt +0 -111
- package/dist/teams/team-all.txt +2 -111
- package/dist/teams/team-fullstack.txt +2 -111
- package/dist/teams/team-ide-minimal.txt +0 -111
- package/dist/teams/team-no-ui.txt +2 -111
- package/{#Tools/APPIQ-METHOD/expansion-packs/bmad-flutter-mobile-dev → expansion-packs/appiq-flutter-mobile-dev}/config.yaml +1 -0
- package/package.json +60 -18
- package/tools/cli.js +3 -3
- package/tools/installer/lib/ide-setup.js +11 -0
- package/tools/installer/package-lock.json +2 -2
- package/#NEW APP PROMPT/ARCHITECTURE.md +0 -279
- package/#NEW APP PROMPT/ARCHITECTURE_UNIFIED.md +0 -414
- package/#NEW APP PROMPT/accesibility_prompt.md +0 -103
- package/#NEW APP PROMPT/clean-code.mdc +0 -55
- package/#NEW APP PROMPT/codequality.mdc +0 -47
- package/#NEW APP PROMPT/flutter-ai-rules/LICENSE +0 -21
- package/#NEW APP PROMPT/flutter-ai-rules/README.md +0 -104
- package/#NEW APP PROMPT/flutter-ai-rules/combined/README.md +0 -25
- package/#NEW APP PROMPT/flutter-ai-rules/combined/flutter_dart.md +0 -192
- package/#NEW APP PROMPT/flutter-ai-rules/combined/flutter_dart__under_6K.md +0 -99
- package/#NEW APP PROMPT/flutter-ai-rules/combined/flutter_dart_bloc_mocktail.md +0 -308
- package/#NEW APP PROMPT/flutter-ai-rules/combined/flutter_dart_bloc_mocktail__under_6K.md +0 -87
- package/#NEW APP PROMPT/flutter-ai-rules/combined/flutter_dart_change_notifier.md +0 -254
- package/#NEW APP PROMPT/flutter-ai-rules/combined/flutter_dart_change_notifier__under_6K.md +0 -98
- package/#NEW APP PROMPT/flutter-ai-rules/combined/flutter_dart_provider.md +0 -261
- package/#NEW APP PROMPT/flutter-ai-rules/combined/flutter_dart_provider__under_6K.md +0 -105
- package/#NEW APP PROMPT/flutter-ai-rules/combined/flutter_dart_riverpod_mockito.md +0 -371
- package/#NEW APP PROMPT/flutter-ai-rules/combined/flutter_dart_riverpod_mockito__under_6K.md +0 -92
- package/#NEW APP PROMPT/flutter-ai-rules/combined/flutter_with_bloc.md +0 -287
- package/#NEW APP PROMPT/flutter-ai-rules/combined/flutter_with_bloc__under_6K.md +0 -68
- package/#NEW APP PROMPT/flutter-ai-rules/combined/flutter_with_riverpod.md +0 -375
- package/#NEW APP PROMPT/flutter-ai-rules/combined/flutter_with_riverpod__under_6K.md +0 -106
- package/#NEW APP PROMPT/flutter-ai-rules/media/flutter_ai_rules.png +0 -0
- package/#NEW APP PROMPT/flutter-ai-rules/media/mocktail_md_01.png +0 -0
- package/#NEW APP PROMPT/flutter-ai-rules/media/mocktail_md_02.png +0 -0
- package/#NEW APP PROMPT/flutter-ai-rules/rules/bloc.md +0 -94
- package/#NEW APP PROMPT/flutter-ai-rules/rules/dart_3_updates.md +0 -93
- package/#NEW APP PROMPT/flutter-ai-rules/rules/effective_dart.md +0 -105
- package/#NEW APP PROMPT/flutter-ai-rules/rules/flutter_app_architecture.md +0 -57
- package/#NEW APP PROMPT/flutter-ai-rules/rules/flutter_change_notifier.md +0 -62
- package/#NEW APP PROMPT/flutter-ai-rules/rules/flutter_errors.md +0 -11
- package/#NEW APP PROMPT/flutter-ai-rules/rules/mockito.md +0 -31
- package/#NEW APP PROMPT/flutter-ai-rules/rules/mocktail.md +0 -24
- package/#NEW APP PROMPT/flutter-ai-rules/rules/provider.md +0 -69
- package/#NEW APP PROMPT/flutter-ai-rules/rules/riverpod.md +0 -188
- package/#NEW APP PROMPT/generate ssh.md +0 -4
- package/#NEW APP PROMPT/project_ai_prompt.md +0 -544
- package/#Tools/APPIQ-METHOD/.bmad-config.json +0 -13
- package/#Tools/APPIQ-METHOD/.cursor/commands/analyze.md +0 -27
- package/#Tools/APPIQ-METHOD/.cursor/commands/appiq.md +0 -27
- package/#Tools/APPIQ-METHOD/.cursor/commands/help.md +0 -27
- package/#Tools/APPIQ-METHOD/.cursor/commands/story.md +0 -27
- package/#Tools/APPIQ-METHOD/DEVELOPMENT_GUIDE.md +0 -855
- package/#Tools/APPIQ-METHOD/NPM-README.md +0 -138
- package/#Tools/APPIQ-METHOD/README.md +0 -107
- package/#Tools/APPIQ-METHOD/SMART_WORKFLOW_GUIDE.md +0 -401
- package/#Tools/APPIQ-METHOD/activate-appiq.js +0 -81
- package/#Tools/APPIQ-METHOD/appiq-solution/README.md +0 -226
- package/#Tools/APPIQ-METHOD/bmad-core/agent-teams/team-all.yaml +0 -14
- package/#Tools/APPIQ-METHOD/bmad-core/agent-teams/team-flutter-mobile.yaml +0 -114
- package/#Tools/APPIQ-METHOD/bmad-core/agent-teams/team-fullstack.yaml +0 -28
- package/#Tools/APPIQ-METHOD/bmad-core/agent-teams/team-ide-minimal.yaml +0 -10
- package/#Tools/APPIQ-METHOD/bmad-core/agent-teams/team-no-ui.yaml +0 -13
- package/#Tools/APPIQ-METHOD/bmad-core/agents/analyst.md +0 -85
- package/#Tools/APPIQ-METHOD/bmad-core/agents/architect.md +0 -90
- package/#Tools/APPIQ-METHOD/bmad-core/agents/bmad-master.md +0 -108
- package/#Tools/APPIQ-METHOD/bmad-core/agents/bmad-orchestrator.md +0 -150
- package/#Tools/APPIQ-METHOD/bmad-core/agents/bmad-smart-launcher.md +0 -170
- package/#Tools/APPIQ-METHOD/bmad-core/agents/dev.md +0 -95
- package/#Tools/APPIQ-METHOD/bmad-core/agents/init-flow-po.md +0 -143
- package/#Tools/APPIQ-METHOD/bmad-core/agents/pm.md +0 -85
- package/#Tools/APPIQ-METHOD/bmad-core/agents/po.md +0 -76
- package/#Tools/APPIQ-METHOD/bmad-core/agents/qa.md +0 -86
- package/#Tools/APPIQ-METHOD/bmad-core/agents/sm.md +0 -67
- package/#Tools/APPIQ-METHOD/bmad-core/agents/ux-expert.md +0 -71
- package/#Tools/APPIQ-METHOD/bmad-core/bmad-core/user-guide.md +0 -0
- package/#Tools/APPIQ-METHOD/bmad-core/checklists/architect-checklist.md +0 -443
- package/#Tools/APPIQ-METHOD/bmad-core/checklists/change-checklist.md +0 -182
- package/#Tools/APPIQ-METHOD/bmad-core/checklists/pm-checklist.md +0 -375
- package/#Tools/APPIQ-METHOD/bmad-core/checklists/po-master-checklist.md +0 -441
- package/#Tools/APPIQ-METHOD/bmad-core/checklists/security-validation-checklist.md +0 -332
- package/#Tools/APPIQ-METHOD/bmad-core/checklists/story-dod-checklist.md +0 -101
- package/#Tools/APPIQ-METHOD/bmad-core/checklists/story-draft-checklist.md +0 -156
- package/#Tools/APPIQ-METHOD/bmad-core/core-config.yaml +0 -20
- package/#Tools/APPIQ-METHOD/bmad-core/core-config.yaml.bak +0 -20
- package/#Tools/APPIQ-METHOD/bmad-core/data/backend-services-integration.md +0 -686
- package/#Tools/APPIQ-METHOD/bmad-core/data/bmad-kb.md +0 -803
- package/#Tools/APPIQ-METHOD/bmad-core/data/brainstorming-techniques.md +0 -36
- package/#Tools/APPIQ-METHOD/bmad-core/data/elicitation-methods.md +0 -134
- package/#Tools/APPIQ-METHOD/bmad-core/data/shadcn-ui-integration.md +0 -388
- package/#Tools/APPIQ-METHOD/bmad-core/data/technical-preferences.md +0 -149
- package/#Tools/APPIQ-METHOD/bmad-core/enhanced-ide-development-workflow.md +0 -43
- package/#Tools/APPIQ-METHOD/bmad-core/tasks/advanced-elicitation.md +0 -117
- package/#Tools/APPIQ-METHOD/bmad-core/tasks/brownfield-create-epic.md +0 -160
- package/#Tools/APPIQ-METHOD/bmad-core/tasks/brownfield-create-story.md +0 -147
- package/#Tools/APPIQ-METHOD/bmad-core/tasks/correct-course.md +0 -70
- package/#Tools/APPIQ-METHOD/bmad-core/tasks/create-brownfield-story.md +0 -304
- package/#Tools/APPIQ-METHOD/bmad-core/tasks/create-deep-research-prompt.md +0 -289
- package/#Tools/APPIQ-METHOD/bmad-core/tasks/create-flutter-story.md +0 -197
- package/#Tools/APPIQ-METHOD/bmad-core/tasks/create-next-story.md +0 -112
- package/#Tools/APPIQ-METHOD/bmad-core/tasks/document-project.md +0 -341
- package/#Tools/APPIQ-METHOD/bmad-core/tasks/facilitate-brainstorming-session.md +0 -136
- package/#Tools/APPIQ-METHOD/bmad-core/tasks/generate-ai-frontend-prompt.md +0 -51
- package/#Tools/APPIQ-METHOD/bmad-core/tasks/index-docs.md +0 -179
- package/#Tools/APPIQ-METHOD/bmad-core/tasks/intelligent-epic-creation.md +0 -234
- package/#Tools/APPIQ-METHOD/bmad-core/tasks/kb-mode-interaction.md +0 -75
- package/#Tools/APPIQ-METHOD/bmad-core/tasks/review-story.md +0 -145
- package/#Tools/APPIQ-METHOD/bmad-core/tasks/shard-doc.md +0 -187
- package/#Tools/APPIQ-METHOD/bmad-core/tasks/smart-project-analysis.md +0 -289
- package/#Tools/APPIQ-METHOD/bmad-core/tasks/validate-next-story.md +0 -134
- package/#Tools/APPIQ-METHOD/bmad-core/templates/architecture-tmpl.yaml +0 -650
- package/#Tools/APPIQ-METHOD/bmad-core/templates/brainstorming-output-tmpl.yaml +0 -156
- package/#Tools/APPIQ-METHOD/bmad-core/templates/brownfield-architecture-tmpl.yaml +0 -476
- package/#Tools/APPIQ-METHOD/bmad-core/templates/brownfield-prd-tmpl.yaml +0 -280
- package/#Tools/APPIQ-METHOD/bmad-core/templates/competitor-analysis-tmpl.yaml +0 -293
- package/#Tools/APPIQ-METHOD/bmad-core/templates/flutter-mobile-prd-tmpl.yaml +0 -330
- package/#Tools/APPIQ-METHOD/bmad-core/templates/flutter-story-tmpl.yaml +0 -376
- package/#Tools/APPIQ-METHOD/bmad-core/templates/flutter-ui-spec-tmpl.yaml +0 -415
- package/#Tools/APPIQ-METHOD/bmad-core/templates/front-end-architecture-tmpl.yaml +0 -206
- package/#Tools/APPIQ-METHOD/bmad-core/templates/front-end-spec-tmpl.yaml +0 -349
- package/#Tools/APPIQ-METHOD/bmad-core/templates/fullstack-architecture-tmpl.yaml +0 -812
- package/#Tools/APPIQ-METHOD/bmad-core/templates/market-research-tmpl.yaml +0 -252
- package/#Tools/APPIQ-METHOD/bmad-core/templates/prd-tmpl.yaml +0 -202
- package/#Tools/APPIQ-METHOD/bmad-core/templates/project-brief-tmpl.yaml +0 -221
- package/#Tools/APPIQ-METHOD/bmad-core/templates/story-tmpl.yaml +0 -137
- package/#Tools/APPIQ-METHOD/bmad-core/user-guide.md +0 -251
- package/#Tools/APPIQ-METHOD/bmad-core/workflows/brownfield-fullstack.yaml +0 -311
- package/#Tools/APPIQ-METHOD/bmad-core/workflows/brownfield-service.yaml +0 -187
- package/#Tools/APPIQ-METHOD/bmad-core/workflows/brownfield-ui.yaml +0 -197
- package/#Tools/APPIQ-METHOD/bmad-core/workflows/greenfield-fullstack.yaml +0 -284
- package/#Tools/APPIQ-METHOD/bmad-core/workflows/greenfield-service.yaml +0 -206
- package/#Tools/APPIQ-METHOD/bmad-core/workflows/greenfield-ui.yaml +0 -235
- package/#Tools/APPIQ-METHOD/bmad-core/working-in-the-brownfield.md +0 -373
- package/#Tools/APPIQ-METHOD/commands/README.md +0 -28
- package/#Tools/APPIQ-METHOD/commands/analyze.md +0 -27
- package/#Tools/APPIQ-METHOD/commands/appiq.md +0 -27
- package/#Tools/APPIQ-METHOD/commands/help.md +0 -27
- package/#Tools/APPIQ-METHOD/commands/story.md +0 -27
- package/#Tools/APPIQ-METHOD/dist/agents/analyst.txt +0 -2882
- package/#Tools/APPIQ-METHOD/dist/agents/architect.txt +0 -3543
- package/#Tools/APPIQ-METHOD/dist/agents/bmad-master.txt +0 -8756
- package/#Tools/APPIQ-METHOD/dist/agents/bmad-orchestrator.txt +0 -1490
- package/#Tools/APPIQ-METHOD/dist/agents/dev.txt +0 -428
- package/#Tools/APPIQ-METHOD/dist/agents/pm.txt +0 -2229
- package/#Tools/APPIQ-METHOD/dist/agents/po.txt +0 -1364
- package/#Tools/APPIQ-METHOD/dist/agents/qa.txt +0 -386
- package/#Tools/APPIQ-METHOD/dist/agents/sm.txt +0 -668
- package/#Tools/APPIQ-METHOD/dist/agents/ux-expert.txt +0 -701
- package/#Tools/APPIQ-METHOD/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-designer.txt +0 -2408
- package/#Tools/APPIQ-METHOD/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-developer.txt +0 -1631
- package/#Tools/APPIQ-METHOD/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-sm.txt +0 -822
- package/#Tools/APPIQ-METHOD/dist/expansion-packs/bmad-2d-phaser-game-dev/teams/phaser-2d-nodejs-game-team.txt +0 -10989
- package/#Tools/APPIQ-METHOD/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-architect.txt +0 -4047
- package/#Tools/APPIQ-METHOD/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-designer.txt +0 -3744
- package/#Tools/APPIQ-METHOD/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-developer.txt +0 -465
- package/#Tools/APPIQ-METHOD/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-sm.txt +0 -990
- package/#Tools/APPIQ-METHOD/dist/expansion-packs/bmad-2d-unity-game-dev/teams/unity-2d-game-team.txt +0 -15467
- package/#Tools/APPIQ-METHOD/dist/expansion-packs/bmad-infrastructure-devops/agents/infra-devops-platform.txt +0 -2077
- package/#Tools/APPIQ-METHOD/dist/teams/team-all.txt +0 -11062
- package/#Tools/APPIQ-METHOD/dist/teams/team-fullstack.txt +0 -10392
- package/#Tools/APPIQ-METHOD/dist/teams/team-ide-minimal.txt +0 -3507
- package/#Tools/APPIQ-METHOD/dist/teams/team-no-ui.txt +0 -8951
- package/#Tools/APPIQ-METHOD/install-appiq.sh +0 -41
- package/#Tools/APPIQ-METHOD/package-lock.json +0 -631
- package/#Tools/APPIQ-METHOD/package.json +0 -44
- package/#Tools/APPIQ-METHOD/tasks/todo.md +0 -275
- package/#Tools/APPIQ-METHOD/tools/appiq-installer.js +0 -2711
- package/#Tools/APPIQ-METHOD/tools/bmad-npx-wrapper.js +0 -39
- package/#Tools/APPIQ-METHOD/tools/builders/web-builder.js +0 -681
- package/#Tools/APPIQ-METHOD/tools/bump-all-versions.js +0 -106
- package/#Tools/APPIQ-METHOD/tools/bump-expansion-version.js +0 -83
- package/#Tools/APPIQ-METHOD/tools/cli.js +0 -152
- package/#Tools/APPIQ-METHOD/tools/epic-solution-installer.js +0 -536
- package/#Tools/APPIQ-METHOD/tools/flattener/main.js +0 -570
- package/#Tools/APPIQ-METHOD/tools/installer/README.md +0 -8
- package/#Tools/APPIQ-METHOD/tools/installer/bin/bmad.js +0 -483
- package/#Tools/APPIQ-METHOD/tools/installer/config/ide-agent-config.yaml +0 -58
- package/#Tools/APPIQ-METHOD/tools/installer/config/install.config.yaml +0 -92
- package/#Tools/APPIQ-METHOD/tools/installer/lib/config-loader.js +0 -253
- package/#Tools/APPIQ-METHOD/tools/installer/lib/file-manager.js +0 -411
- package/#Tools/APPIQ-METHOD/tools/installer/lib/ide-base-setup.js +0 -227
- package/#Tools/APPIQ-METHOD/tools/installer/lib/ide-setup.js +0 -1096
- package/#Tools/APPIQ-METHOD/tools/installer/lib/installer.js +0 -1772
- package/#Tools/APPIQ-METHOD/tools/installer/lib/memory-profiler.js +0 -224
- package/#Tools/APPIQ-METHOD/tools/installer/lib/module-manager.js +0 -110
- package/#Tools/APPIQ-METHOD/tools/installer/lib/resource-locator.js +0 -310
- package/#Tools/APPIQ-METHOD/tools/installer/package-lock.json +0 -906
- package/#Tools/APPIQ-METHOD/tools/installer/package.json +0 -43
- package/#Tools/APPIQ-METHOD/tools/lib/dependency-resolver.js +0 -179
- package/#Tools/APPIQ-METHOD/tools/lib/yaml-utils.js +0 -29
- package/#Tools/APPIQ-METHOD/tools/md-assets/web-agent-startup-instructions.md +0 -39
- package/#Tools/APPIQ-METHOD/tools/semantic-release-sync-installer.js +0 -30
- package/#Tools/APPIQ-METHOD/tools/setup-ide-commands.js +0 -348
- package/#Tools/APPIQ-METHOD/tools/smart-installer.js +0 -592
- package/#Tools/APPIQ-METHOD/tools/sync-installer-version.js +0 -34
- package/#Tools/APPIQ-METHOD/tools/update-expansion-version.js +0 -54
- package/#Tools/APPIQ-METHOD/tools/upgraders/v3-to-v4-upgrader.js +0 -763
- package/#Tools/APPIQ-METHOD/tools/version-bump.js +0 -79
- package/#Tools/APPIQ-METHOD/tools/yaml-format.js +0 -240
- package/#Tools/SkyReels-V2/.pre-commit-config.yaml +0 -25
- package/#Tools/SkyReels-V2/LICENSE.txt +0 -38
- package/#Tools/SkyReels-V2/README.md +0 -766
- package/#Tools/SkyReels-V2/generate_video.py +0 -161
- package/#Tools/SkyReels-V2/generate_video_df.py +0 -220
- package/#Tools/SkyReels-V2/requirements.txt +0 -16
- package/#Tools/SkyReels-V2/skycaptioner_v1/README.md +0 -278
- package/#Tools/SkyReels-V2/skycaptioner_v1/examples/test.csv +0 -5
- package/#Tools/SkyReels-V2/skycaptioner_v1/examples/test_result.csv +0 -5
- package/#Tools/SkyReels-V2/skycaptioner_v1/infer_fusion_caption.sh +0 -9
- package/#Tools/SkyReels-V2/skycaptioner_v1/infer_struct_caption.sh +0 -8
- package/#Tools/SkyReels-V2/skycaptioner_v1/requirements.txt +0 -3
- package/#Tools/SkyReels-V2/skycaptioner_v1/scripts/gradio_fusion_caption.py +0 -146
- package/#Tools/SkyReels-V2/skycaptioner_v1/scripts/gradio_struct_caption.py +0 -92
- package/#Tools/SkyReels-V2/skycaptioner_v1/scripts/utils.py +0 -19
- package/#Tools/SkyReels-V2/skycaptioner_v1/scripts/vllm_fusion_caption.py +0 -256
- package/#Tools/SkyReels-V2/skycaptioner_v1/scripts/vllm_struct_caption.py +0 -156
- package/#Tools/SkyReels-V2/skyreels_v2_infer/__init__.py +0 -1
- package/#Tools/SkyReels-V2/skyreels_v2_infer/distributed/__init__.py +0 -0
- package/#Tools/SkyReels-V2/skyreels_v2_infer/distributed/xdit_context_parallel.py +0 -286
- package/#Tools/SkyReels-V2/skyreels_v2_infer/modules/__init__.py +0 -69
- package/#Tools/SkyReels-V2/skyreels_v2_infer/modules/attention.py +0 -179
- package/#Tools/SkyReels-V2/skyreels_v2_infer/modules/clip.py +0 -525
- package/#Tools/SkyReels-V2/skyreels_v2_infer/modules/t5.py +0 -454
- package/#Tools/SkyReels-V2/skyreels_v2_infer/modules/tokenizers.py +0 -78
- package/#Tools/SkyReels-V2/skyreels_v2_infer/modules/transformer.py +0 -839
- package/#Tools/SkyReels-V2/skyreels_v2_infer/modules/vae.py +0 -639
- package/#Tools/SkyReels-V2/skyreels_v2_infer/modules/xlm_roberta.py +0 -165
- package/#Tools/SkyReels-V2/skyreels_v2_infer/pipelines/__init__.py +0 -5
- package/#Tools/SkyReels-V2/skyreels_v2_infer/pipelines/diffusion_forcing_pipeline.py +0 -659
- package/#Tools/SkyReels-V2/skyreels_v2_infer/pipelines/image2video_pipeline.py +0 -156
- package/#Tools/SkyReels-V2/skyreels_v2_infer/pipelines/prompt_enhancer.py +0 -65
- package/#Tools/SkyReels-V2/skyreels_v2_infer/pipelines/text2video_pipeline.py +0 -110
- package/#Tools/SkyReels-V2/skyreels_v2_infer/scheduler/__init__.py +0 -0
- package/#Tools/SkyReels-V2/skyreels_v2_infer/scheduler/fm_solvers_unipc.py +0 -759
- package/#Tools/SuperClaude/.claude/commands/analyze.md +0 -36
- package/#Tools/SuperClaude/.claude/commands/build.md +0 -35
- package/#Tools/SuperClaude/.claude/commands/cleanup.md +0 -46
- package/#Tools/SuperClaude/.claude/commands/deploy.md +0 -55
- package/#Tools/SuperClaude/.claude/commands/design.md +0 -91
- package/#Tools/SuperClaude/.claude/commands/dev-setup.md +0 -37
- package/#Tools/SuperClaude/.claude/commands/document.md +0 -99
- package/#Tools/SuperClaude/.claude/commands/estimate.md +0 -69
- package/#Tools/SuperClaude/.claude/commands/explain.md +0 -85
- package/#Tools/SuperClaude/.claude/commands/git.md +0 -47
- package/#Tools/SuperClaude/.claude/commands/improve.md +0 -162
- package/#Tools/SuperClaude/.claude/commands/index.md +0 -159
- package/#Tools/SuperClaude/.claude/commands/load.md +0 -65
- package/#Tools/SuperClaude/.claude/commands/migrate.md +0 -76
- package/#Tools/SuperClaude/.claude/commands/scan.md +0 -163
- package/#Tools/SuperClaude/.claude/commands/shared/ambiguity-check.yml +0 -40
- package/#Tools/SuperClaude/.claude/commands/shared/audit.yml +0 -21
- package/#Tools/SuperClaude/.claude/commands/shared/checkpoint.yml +0 -28
- package/#Tools/SuperClaude/.claude/commands/shared/cleanup-patterns.yml +0 -107
- package/#Tools/SuperClaude/.claude/commands/shared/command-memory.yml +0 -52
- package/#Tools/SuperClaude/.claude/commands/shared/command-templates.yml +0 -167
- package/#Tools/SuperClaude/.claude/commands/shared/config-validator.yml +0 -206
- package/#Tools/SuperClaude/.claude/commands/shared/constants.yml +0 -311
- package/#Tools/SuperClaude/.claude/commands/shared/documentation-dirs.yml +0 -134
- package/#Tools/SuperClaude/.claude/commands/shared/error-handling.yml +0 -341
- package/#Tools/SuperClaude/.claude/commands/shared/evidence.yml +0 -75
- package/#Tools/SuperClaude/.claude/commands/shared/execution-lifecycle.yml +0 -277
- package/#Tools/SuperClaude/.claude/commands/shared/git-operations.yml +0 -217
- package/#Tools/SuperClaude/.claude/commands/shared/git-workflow.yml +0 -37
- package/#Tools/SuperClaude/.claude/commands/shared/implementation.yml +0 -199
- package/#Tools/SuperClaude/.claude/commands/shared/loading-config.yml +0 -73
- package/#Tools/SuperClaude/.claude/commands/shared/mcp-flags.yml +0 -109
- package/#Tools/SuperClaude/.claude/commands/shared/migration-report.md +0 -165
- package/#Tools/SuperClaude/.claude/commands/shared/patterns.yml +0 -155
- package/#Tools/SuperClaude/.claude/commands/shared/performance.yml +0 -317
- package/#Tools/SuperClaude/.claude/commands/shared/planning-mode.yml +0 -51
- package/#Tools/SuperClaude/.claude/commands/shared/research-first.yml +0 -278
- package/#Tools/SuperClaude/.claude/commands/shared/session-recovery.yml +0 -144
- package/#Tools/SuperClaude/.claude/commands/shared/severity-levels.yml +0 -252
- package/#Tools/SuperClaude/.claude/commands/shared/task-system.yml +0 -380
- package/#Tools/SuperClaude/.claude/commands/shared/task-ultracompressed.yml +0 -88
- package/#Tools/SuperClaude/.claude/commands/shared/templates/feature-template.md +0 -59
- package/#Tools/SuperClaude/.claude/commands/shared/templates/task-ultracompressed.md +0 -26
- package/#Tools/SuperClaude/.claude/commands/shared/thinking-modes.yml +0 -61
- package/#Tools/SuperClaude/.claude/commands/shared/ultracompressed.yml +0 -97
- package/#Tools/SuperClaude/.claude/commands/shared/user-experience.yml +0 -208
- package/#Tools/SuperClaude/.claude/commands/shared/validation.yml +0 -54
- package/#Tools/SuperClaude/.claude/commands/shared/workflow-chains.yml +0 -138
- package/#Tools/SuperClaude/.claude/commands/spawn.md +0 -106
- package/#Tools/SuperClaude/.claude/commands/task.md +0 -110
- package/#Tools/SuperClaude/.claude/commands/test.md +0 -67
- package/#Tools/SuperClaude/.claude/commands/troubleshoot.md +0 -93
- package/#Tools/SuperClaude/.github/ISSUE_TEMPLATE/bug_report.yml +0 -114
- package/#Tools/SuperClaude/.github/ISSUE_TEMPLATE/feature_request.yml +0 -119
- package/#Tools/SuperClaude/.github/ISSUE_TEMPLATE/question.yml +0 -87
- package/#Tools/SuperClaude/.github/pull_request_template.md +0 -62
- package/#Tools/SuperClaude/CHANGELOG.md +0 -109
- package/#Tools/SuperClaude/CLAUDE.md +0 -95
- package/#Tools/SuperClaude/CODE_OF_CONDUCT.md +0 -45
- package/#Tools/SuperClaude/CONTRIBUTING.md +0 -225
- package/#Tools/SuperClaude/Commands_Cheat_Sheet.md +0 -160
- package/#Tools/SuperClaude/LICENSE +0 -21
- package/#Tools/SuperClaude/MCP.md +0 -117
- package/#Tools/SuperClaude/PERSONAS.md +0 -115
- package/#Tools/SuperClaude/README.md +0 -249
- package/#Tools/SuperClaude/RULES.md +0 -220
- package/#Tools/SuperClaude/SECURITY.md +0 -91
- package/#Tools/SuperClaude/install.sh +0 -296
- package/#Tools/claude-talk-to-figma-mcp/.github/workflows/test.yml +0 -36
- package/#Tools/claude-talk-to-figma-mcp/CHANGELOG.md +0 -88
- package/#Tools/claude-talk-to-figma-mcp/Dockerfile +0 -16
- package/#Tools/claude-talk-to-figma-mcp/LICENSE +0 -22
- package/#Tools/claude-talk-to-figma-mcp/TESTING.md +0 -216
- package/#Tools/claude-talk-to-figma-mcp/bun.lock +0 -964
- package/#Tools/claude-talk-to-figma-mcp/context/01/00-analisis.md +0 -151
- package/#Tools/claude-talk-to-figma-mcp/context/01/01-tools-refactor.md +0 -370
- package/#Tools/claude-talk-to-figma-mcp/context/01/02-tools-refactor-backlog.md +0 -253
- package/#Tools/claude-talk-to-figma-mcp/context/01/03-tools-refactor-test.md +0 -138
- package/#Tools/claude-talk-to-figma-mcp/context/01/04-tools-refactor-channel-error.md +0 -133
- package/#Tools/claude-talk-to-figma-mcp/context/01/04-tools-refactor-test-backlog.md +0 -0
- package/#Tools/claude-talk-to-figma-mcp/context/01/05-tools-refactor-four-tools-error.md +0 -356
- package/#Tools/claude-talk-to-figma-mcp/context/01/06-tools-refactor-four-tools-error-backlog.md +0 -425
- package/#Tools/claude-talk-to-figma-mcp/context/01/prompt-dev-nodejs-bun.md +0 -105
- package/#Tools/claude-talk-to-figma-mcp/context/01-prompt.md +0 -135
- package/#Tools/claude-talk-to-figma-mcp/context/02/00-analisis.md +0 -131
- package/#Tools/claude-talk-to-figma-mcp/context/02/01-plan.md +0 -162
- package/#Tools/claude-talk-to-figma-mcp/context/02/02-backlog.md +0 -241
- package/#Tools/claude-talk-to-figma-mcp/context/02-analisis.md +0 -202
- package/#Tools/claude-talk-to-figma-mcp/context/99-notas.md +0 -139
- package/#Tools/claude-talk-to-figma-mcp/context/pr-14/pr-14-analisis.md +0 -221
- package/#Tools/claude-talk-to-figma-mcp/context/pr-14/pr-14-claude-tests.md +0 -152
- package/#Tools/claude-talk-to-figma-mcp/context/pr-14/pr-14-npm-publishing.md +0 -272
- package/#Tools/claude-talk-to-figma-mcp/images/claude-talk-to-figma.png +0 -0
- package/#Tools/claude-talk-to-figma-mcp/images/mcp-figma-plugin-configuration.png +0 -0
- package/#Tools/claude-talk-to-figma-mcp/jest.config.cjs +0 -25
- package/#Tools/claude-talk-to-figma-mcp/package.json +0 -67
- package/#Tools/claude-talk-to-figma-mcp/prompts/prompt-ux-ui-especialista-es.md +0 -82
- package/#Tools/claude-talk-to-figma-mcp/prompts/prompt-ux-ui-especialista-gal.md +0 -80
- package/#Tools/claude-talk-to-figma-mcp/prompts/prompt-ux-ui-especialista-pt.md +0 -80
- package/#Tools/claude-talk-to-figma-mcp/prompts/prompt-ux-ui-specialist.md +0 -80
- package/#Tools/claude-talk-to-figma-mcp/readme.md +0 -307
- package/#Tools/claude-talk-to-figma-mcp/scripts/configure-claude.js +0 -90
- package/#Tools/claude-talk-to-figma-mcp/scripts/setup.sh +0 -30
- package/#Tools/claude-talk-to-figma-mcp/scripts/test-integration.js +0 -339
- package/#Tools/claude-talk-to-figma-mcp/smithery.yaml +0 -26
- package/#Tools/claude-talk-to-figma-mcp/src/claude_mcp_plugin/code.js +0 -3295
- package/#Tools/claude-talk-to-figma-mcp/src/claude_mcp_plugin/manifest.json +0 -24
- package/#Tools/claude-talk-to-figma-mcp/src/claude_mcp_plugin/setcharacters.js +0 -215
- package/#Tools/claude-talk-to-figma-mcp/src/claude_mcp_plugin/ui.html +0 -656
- package/#Tools/claude-talk-to-figma-mcp/src/socket.ts +0 -349
- package/#Tools/claude-talk-to-figma-mcp/src/talk_to_figma_mcp/bun.lock +0 -246
- package/#Tools/claude-talk-to-figma-mcp/src/talk_to_figma_mcp/config/config.ts +0 -22
- package/#Tools/claude-talk-to-figma-mcp/src/talk_to_figma_mcp/package.json +0 -31
- package/#Tools/claude-talk-to-figma-mcp/src/talk_to_figma_mcp/prompts/index.ts +0 -297
- package/#Tools/claude-talk-to-figma-mcp/src/talk_to_figma_mcp/server.ts +0 -62
- package/#Tools/claude-talk-to-figma-mcp/src/talk_to_figma_mcp/tools/component-tools.ts +0 -48
- package/#Tools/claude-talk-to-figma-mcp/src/talk_to_figma_mcp/tools/creation-tools.ts +0 -620
- package/#Tools/claude-talk-to-figma-mcp/src/talk_to_figma_mcp/tools/document-tools.ts +0 -390
- package/#Tools/claude-talk-to-figma-mcp/src/talk_to_figma_mcp/tools/index.ts +0 -28
- package/#Tools/claude-talk-to-figma-mcp/src/talk_to_figma_mcp/tools/modification-tools.ts +0 -408
- package/#Tools/claude-talk-to-figma-mcp/src/talk_to_figma_mcp/tools/text-tools.ts +0 -531
- package/#Tools/claude-talk-to-figma-mcp/src/talk_to_figma_mcp/tsconfig.json +0 -18
- package/#Tools/claude-talk-to-figma-mcp/src/talk_to_figma_mcp/types/color.ts +0 -13
- package/#Tools/claude-talk-to-figma-mcp/src/talk_to_figma_mcp/types/index.ts +0 -87
- package/#Tools/claude-talk-to-figma-mcp/src/talk_to_figma_mcp/utils/defaults.ts +0 -23
- package/#Tools/claude-talk-to-figma-mcp/src/talk_to_figma_mcp/utils/figma-helpers.ts +0 -142
- package/#Tools/claude-talk-to-figma-mcp/src/talk_to_figma_mcp/utils/logger.ts +0 -8
- package/#Tools/claude-talk-to-figma-mcp/src/talk_to_figma_mcp/utils/websocket.ts +0 -258
- package/#Tools/claude-talk-to-figma-mcp/tests/fixtures/test-data.ts +0 -32
- package/#Tools/claude-talk-to-figma-mcp/tests/integration/set-fill-color.test.ts +0 -309
- package/#Tools/claude-talk-to-figma-mcp/tests/integration/set-stroke-color.test.ts +0 -387
- package/#Tools/claude-talk-to-figma-mcp/tests/setup.ts +0 -7
- package/#Tools/claude-talk-to-figma-mcp/tests/unit/utils/defaults.test.ts +0 -131
- package/#Tools/claude-talk-to-figma-mcp/tsconfig.json +0 -17
- package/#Tools/claude-talk-to-figma-mcp/tsup.config.ts +0 -14
- package/#Tools/jwt creator/AuthKey_MZ7UQGFV2Q.p8 +0 -6
- package/#Tools/jwt creator/generate_apple_jwt.js +0 -18
- package/#Tools/jwt creator/node_modules/.package-lock.json +0 -145
- package/#Tools/jwt creator/node_modules/buffer-equal-constant-time/.travis.yml +0 -4
- package/#Tools/jwt creator/node_modules/buffer-equal-constant-time/LICENSE.txt +0 -12
- package/#Tools/jwt creator/node_modules/buffer-equal-constant-time/README.md +0 -50
- package/#Tools/jwt creator/node_modules/buffer-equal-constant-time/index.js +0 -41
- package/#Tools/jwt creator/node_modules/buffer-equal-constant-time/package.json +0 -21
- package/#Tools/jwt creator/node_modules/buffer-equal-constant-time/test.js +0 -42
- package/#Tools/jwt creator/node_modules/ecdsa-sig-formatter/CODEOWNERS +0 -1
- package/#Tools/jwt creator/node_modules/ecdsa-sig-formatter/LICENSE +0 -201
- package/#Tools/jwt creator/node_modules/ecdsa-sig-formatter/README.md +0 -65
- package/#Tools/jwt creator/node_modules/ecdsa-sig-formatter/package.json +0 -46
- package/#Tools/jwt creator/node_modules/ecdsa-sig-formatter/src/ecdsa-sig-formatter.d.ts +0 -17
- package/#Tools/jwt creator/node_modules/ecdsa-sig-formatter/src/ecdsa-sig-formatter.js +0 -187
- package/#Tools/jwt creator/node_modules/ecdsa-sig-formatter/src/param-bytes-for-alg.js +0 -23
- package/#Tools/jwt creator/node_modules/jsonwebtoken/LICENSE +0 -21
- package/#Tools/jwt creator/node_modules/jsonwebtoken/README.md +0 -396
- package/#Tools/jwt creator/node_modules/jsonwebtoken/decode.js +0 -30
- package/#Tools/jwt creator/node_modules/jsonwebtoken/index.js +0 -8
- package/#Tools/jwt creator/node_modules/jsonwebtoken/lib/JsonWebTokenError.js +0 -14
- package/#Tools/jwt creator/node_modules/jsonwebtoken/lib/NotBeforeError.js +0 -13
- package/#Tools/jwt creator/node_modules/jsonwebtoken/lib/TokenExpiredError.js +0 -13
- package/#Tools/jwt creator/node_modules/jsonwebtoken/lib/asymmetricKeyDetailsSupported.js +0 -3
- package/#Tools/jwt creator/node_modules/jsonwebtoken/lib/psSupported.js +0 -3
- package/#Tools/jwt creator/node_modules/jsonwebtoken/lib/rsaPssKeyDetailsSupported.js +0 -3
- package/#Tools/jwt creator/node_modules/jsonwebtoken/lib/timespan.js +0 -18
- package/#Tools/jwt creator/node_modules/jsonwebtoken/lib/validateAsymmetricKey.js +0 -66
- package/#Tools/jwt creator/node_modules/jsonwebtoken/package.json +0 -71
- package/#Tools/jwt creator/node_modules/jsonwebtoken/sign.js +0 -253
- package/#Tools/jwt creator/node_modules/jsonwebtoken/verify.js +0 -263
- package/#Tools/jwt creator/node_modules/jwa/LICENSE +0 -17
- package/#Tools/jwt creator/node_modules/jwa/README.md +0 -150
- package/#Tools/jwt creator/node_modules/jwa/index.js +0 -266
- package/#Tools/jwt creator/node_modules/jwa/package.json +0 -37
- package/#Tools/jwt creator/node_modules/jws/CHANGELOG.md +0 -34
- package/#Tools/jwt creator/node_modules/jws/LICENSE +0 -17
- package/#Tools/jwt creator/node_modules/jws/index.js +0 -22
- package/#Tools/jwt creator/node_modules/jws/lib/data-stream.js +0 -55
- package/#Tools/jwt creator/node_modules/jws/lib/sign-stream.js +0 -78
- package/#Tools/jwt creator/node_modules/jws/lib/tostring.js +0 -10
- package/#Tools/jwt creator/node_modules/jws/lib/verify-stream.js +0 -120
- package/#Tools/jwt creator/node_modules/jws/package.json +0 -34
- package/#Tools/jwt creator/node_modules/jws/readme.md +0 -255
- package/#Tools/jwt creator/node_modules/lodash.includes/LICENSE +0 -47
- package/#Tools/jwt creator/node_modules/lodash.includes/README.md +0 -18
- package/#Tools/jwt creator/node_modules/lodash.includes/index.js +0 -745
- package/#Tools/jwt creator/node_modules/lodash.includes/package.json +0 -17
- package/#Tools/jwt creator/node_modules/lodash.isboolean/LICENSE +0 -22
- package/#Tools/jwt creator/node_modules/lodash.isboolean/README.md +0 -18
- package/#Tools/jwt creator/node_modules/lodash.isboolean/index.js +0 -70
- package/#Tools/jwt creator/node_modules/lodash.isboolean/package.json +0 -17
- package/#Tools/jwt creator/node_modules/lodash.isinteger/LICENSE +0 -47
- package/#Tools/jwt creator/node_modules/lodash.isinteger/README.md +0 -18
- package/#Tools/jwt creator/node_modules/lodash.isinteger/index.js +0 -265
- package/#Tools/jwt creator/node_modules/lodash.isinteger/package.json +0 -17
- package/#Tools/jwt creator/node_modules/lodash.isnumber/LICENSE +0 -22
- package/#Tools/jwt creator/node_modules/lodash.isnumber/README.md +0 -18
- package/#Tools/jwt creator/node_modules/lodash.isnumber/index.js +0 -79
- package/#Tools/jwt creator/node_modules/lodash.isnumber/package.json +0 -17
- package/#Tools/jwt creator/node_modules/lodash.isplainobject/LICENSE +0 -47
- package/#Tools/jwt creator/node_modules/lodash.isplainobject/README.md +0 -18
- package/#Tools/jwt creator/node_modules/lodash.isplainobject/index.js +0 -139
- package/#Tools/jwt creator/node_modules/lodash.isplainobject/package.json +0 -17
- package/#Tools/jwt creator/node_modules/lodash.isstring/LICENSE +0 -22
- package/#Tools/jwt creator/node_modules/lodash.isstring/README.md +0 -18
- package/#Tools/jwt creator/node_modules/lodash.isstring/index.js +0 -95
- package/#Tools/jwt creator/node_modules/lodash.isstring/package.json +0 -17
- package/#Tools/jwt creator/node_modules/lodash.once/LICENSE +0 -47
- package/#Tools/jwt creator/node_modules/lodash.once/README.md +0 -18
- package/#Tools/jwt creator/node_modules/lodash.once/index.js +0 -294
- package/#Tools/jwt creator/node_modules/lodash.once/package.json +0 -17
- package/#Tools/jwt creator/node_modules/ms/index.js +0 -162
- package/#Tools/jwt creator/node_modules/ms/license.md +0 -21
- package/#Tools/jwt creator/node_modules/ms/package.json +0 -38
- package/#Tools/jwt creator/node_modules/ms/readme.md +0 -59
- package/#Tools/jwt creator/node_modules/safe-buffer/LICENSE +0 -21
- package/#Tools/jwt creator/node_modules/safe-buffer/README.md +0 -584
- package/#Tools/jwt creator/node_modules/safe-buffer/index.d.ts +0 -187
- package/#Tools/jwt creator/node_modules/safe-buffer/index.js +0 -65
- package/#Tools/jwt creator/node_modules/safe-buffer/package.json +0 -51
- package/#Tools/jwt creator/node_modules/semver/LICENSE +0 -15
- package/#Tools/jwt creator/node_modules/semver/README.md +0 -664
- package/#Tools/jwt creator/node_modules/semver/bin/semver.js +0 -191
- package/#Tools/jwt creator/node_modules/semver/classes/comparator.js +0 -143
- package/#Tools/jwt creator/node_modules/semver/classes/index.js +0 -7
- package/#Tools/jwt creator/node_modules/semver/classes/range.js +0 -556
- package/#Tools/jwt creator/node_modules/semver/classes/semver.js +0 -319
- package/#Tools/jwt creator/node_modules/semver/functions/clean.js +0 -8
- package/#Tools/jwt creator/node_modules/semver/functions/cmp.js +0 -54
- package/#Tools/jwt creator/node_modules/semver/functions/coerce.js +0 -62
- package/#Tools/jwt creator/node_modules/semver/functions/compare-build.js +0 -9
- package/#Tools/jwt creator/node_modules/semver/functions/compare-loose.js +0 -5
- package/#Tools/jwt creator/node_modules/semver/functions/compare.js +0 -7
- package/#Tools/jwt creator/node_modules/semver/functions/diff.js +0 -60
- package/#Tools/jwt creator/node_modules/semver/functions/eq.js +0 -5
- package/#Tools/jwt creator/node_modules/semver/functions/gt.js +0 -5
- package/#Tools/jwt creator/node_modules/semver/functions/gte.js +0 -5
- package/#Tools/jwt creator/node_modules/semver/functions/inc.js +0 -21
- package/#Tools/jwt creator/node_modules/semver/functions/lt.js +0 -5
- package/#Tools/jwt creator/node_modules/semver/functions/lte.js +0 -5
- package/#Tools/jwt creator/node_modules/semver/functions/major.js +0 -5
- package/#Tools/jwt creator/node_modules/semver/functions/minor.js +0 -5
- package/#Tools/jwt creator/node_modules/semver/functions/neq.js +0 -5
- package/#Tools/jwt creator/node_modules/semver/functions/parse.js +0 -18
- package/#Tools/jwt creator/node_modules/semver/functions/patch.js +0 -5
- package/#Tools/jwt creator/node_modules/semver/functions/prerelease.js +0 -8
- package/#Tools/jwt creator/node_modules/semver/functions/rcompare.js +0 -5
- package/#Tools/jwt creator/node_modules/semver/functions/rsort.js +0 -5
- package/#Tools/jwt creator/node_modules/semver/functions/satisfies.js +0 -12
- package/#Tools/jwt creator/node_modules/semver/functions/sort.js +0 -5
- package/#Tools/jwt creator/node_modules/semver/functions/valid.js +0 -8
- package/#Tools/jwt creator/node_modules/semver/index.js +0 -91
- package/#Tools/jwt creator/node_modules/semver/internal/constants.js +0 -37
- package/#Tools/jwt creator/node_modules/semver/internal/debug.js +0 -11
- package/#Tools/jwt creator/node_modules/semver/internal/identifiers.js +0 -25
- package/#Tools/jwt creator/node_modules/semver/internal/lrucache.js +0 -42
- package/#Tools/jwt creator/node_modules/semver/internal/parse-options.js +0 -17
- package/#Tools/jwt creator/node_modules/semver/internal/re.js +0 -223
- package/#Tools/jwt creator/node_modules/semver/package.json +0 -78
- package/#Tools/jwt creator/node_modules/semver/preload.js +0 -4
- package/#Tools/jwt creator/node_modules/semver/range.bnf +0 -16
- package/#Tools/jwt creator/node_modules/semver/ranges/gtr.js +0 -6
- package/#Tools/jwt creator/node_modules/semver/ranges/intersects.js +0 -9
- package/#Tools/jwt creator/node_modules/semver/ranges/ltr.js +0 -6
- package/#Tools/jwt creator/node_modules/semver/ranges/max-satisfying.js +0 -27
- package/#Tools/jwt creator/node_modules/semver/ranges/min-satisfying.js +0 -26
- package/#Tools/jwt creator/node_modules/semver/ranges/min-version.js +0 -63
- package/#Tools/jwt creator/node_modules/semver/ranges/outside.js +0 -82
- package/#Tools/jwt creator/node_modules/semver/ranges/simplify.js +0 -49
- package/#Tools/jwt creator/node_modules/semver/ranges/subset.js +0 -249
- package/#Tools/jwt creator/node_modules/semver/ranges/to-comparators.js +0 -10
- package/#Tools/jwt creator/node_modules/semver/ranges/valid.js +0 -13
- package/#Tools/jwt creator/package-lock.json +0 -150
- package/#Tools/jwt creator/package.json +0 -5
- package/#Tools/package.json +0 -94
- package/SuperClaude/.claude/commands/analyze.md +0 -36
- package/SuperClaude/.claude/commands/build.md +0 -35
- package/SuperClaude/.claude/commands/cleanup.md +0 -46
- package/SuperClaude/.claude/commands/deploy.md +0 -55
- package/SuperClaude/.claude/commands/design.md +0 -91
- package/SuperClaude/.claude/commands/dev-setup.md +0 -37
- package/SuperClaude/.claude/commands/document.md +0 -99
- package/SuperClaude/.claude/commands/estimate.md +0 -69
- package/SuperClaude/.claude/commands/explain.md +0 -85
- package/SuperClaude/.claude/commands/git.md +0 -47
- package/SuperClaude/.claude/commands/improve.md +0 -162
- package/SuperClaude/.claude/commands/index.md +0 -159
- package/SuperClaude/.claude/commands/load.md +0 -65
- package/SuperClaude/.claude/commands/migrate.md +0 -76
- package/SuperClaude/.claude/commands/scan.md +0 -163
- package/SuperClaude/.claude/commands/shared/ambiguity-check.yml +0 -40
- package/SuperClaude/.claude/commands/shared/audit.yml +0 -21
- package/SuperClaude/.claude/commands/shared/checkpoint.yml +0 -28
- package/SuperClaude/.claude/commands/shared/cleanup-patterns.yml +0 -107
- package/SuperClaude/.claude/commands/shared/command-memory.yml +0 -52
- package/SuperClaude/.claude/commands/shared/command-templates.yml +0 -167
- package/SuperClaude/.claude/commands/shared/config-validator.yml +0 -206
- package/SuperClaude/.claude/commands/shared/constants.yml +0 -311
- package/SuperClaude/.claude/commands/shared/documentation-dirs.yml +0 -134
- package/SuperClaude/.claude/commands/shared/error-handling.yml +0 -341
- package/SuperClaude/.claude/commands/shared/evidence.yml +0 -75
- package/SuperClaude/.claude/commands/shared/execution-lifecycle.yml +0 -277
- package/SuperClaude/.claude/commands/shared/git-operations.yml +0 -217
- package/SuperClaude/.claude/commands/shared/git-workflow.yml +0 -37
- package/SuperClaude/.claude/commands/shared/implementation.yml +0 -199
- package/SuperClaude/.claude/commands/shared/loading-config.yml +0 -73
- package/SuperClaude/.claude/commands/shared/mcp-flags.yml +0 -109
- package/SuperClaude/.claude/commands/shared/migration-report.md +0 -165
- package/SuperClaude/.claude/commands/shared/patterns.yml +0 -155
- package/SuperClaude/.claude/commands/shared/performance.yml +0 -317
- package/SuperClaude/.claude/commands/shared/planning-mode.yml +0 -51
- package/SuperClaude/.claude/commands/shared/research-first.yml +0 -278
- package/SuperClaude/.claude/commands/shared/session-recovery.yml +0 -144
- package/SuperClaude/.claude/commands/shared/severity-levels.yml +0 -252
- package/SuperClaude/.claude/commands/shared/task-system.yml +0 -380
- package/SuperClaude/.claude/commands/shared/task-ultracompressed.yml +0 -88
- package/SuperClaude/.claude/commands/shared/templates/feature-template.md +0 -59
- package/SuperClaude/.claude/commands/shared/templates/task-ultracompressed.md +0 -26
- package/SuperClaude/.claude/commands/shared/thinking-modes.yml +0 -61
- package/SuperClaude/.claude/commands/shared/ultracompressed.yml +0 -97
- package/SuperClaude/.claude/commands/shared/user-experience.yml +0 -208
- package/SuperClaude/.claude/commands/shared/validation.yml +0 -54
- package/SuperClaude/.claude/commands/shared/workflow-chains.yml +0 -138
- package/SuperClaude/.claude/commands/spawn.md +0 -106
- package/SuperClaude/.claude/commands/task.md +0 -110
- package/SuperClaude/.claude/commands/test.md +0 -67
- package/SuperClaude/.claude/commands/troubleshoot.md +0 -93
- package/SuperClaude/.github/ISSUE_TEMPLATE/bug_report.yml +0 -114
- package/SuperClaude/.github/ISSUE_TEMPLATE/feature_request.yml +0 -119
- package/SuperClaude/.github/ISSUE_TEMPLATE/question.yml +0 -87
- package/SuperClaude/.github/pull_request_template.md +0 -62
- package/SuperClaude/CHANGELOG.md +0 -109
- package/SuperClaude/CLAUDE.md +0 -95
- package/SuperClaude/CODE_OF_CONDUCT.md +0 -45
- package/SuperClaude/CONTRIBUTING.md +0 -225
- package/SuperClaude/Commands_Cheat_Sheet.md +0 -160
- package/SuperClaude/LICENSE +0 -21
- package/SuperClaude/MCP.md +0 -117
- package/SuperClaude/PERSONAS.md +0 -115
- package/SuperClaude/README.md +0 -249
- package/SuperClaude/RULES.md +0 -220
- package/SuperClaude/SECURITY.md +0 -91
- package/SuperClaude/install.sh +0 -296
- package/appiq-mcp installer/How-to.md +0 -250
- package/appiq-mcp installer/LICENSE +0 -21
- package/appiq-mcp installer/README.md +0 -235
- package/appiq-mcp installer/index.js +0 -672
- package/appiq-mcp installer/my_mcps.md +0 -105
- package/appiq-mcp installer/package-lock.json +0 -708
- package/appiq-mcp installer/package.json +0 -46
- package/appiq-mcp installer/test-install.bat +0 -60
- package/appiq-mcp installer/test-install.sh +0 -55
- package/appiq-mcp installer/test-load.js +0 -40
- package/bmad-core/agent-teams/team-flutter-mobile.yaml +0 -114
- package/bmad-core/agents/bmad-smart-launcher.md +0 -170
- package/bmad-core/agents/init-flow-po.md +0 -143
- package/bmad-core/checklists/security-validation-checklist.md +0 -332
- package/bmad-core/core-config.yaml.bak +0 -20
- package/bmad-core/data/backend-services-integration.md +0 -686
- package/bmad-core/data/shadcn-ui-integration.md +0 -388
- package/bmad-core/tasks/create-flutter-story.md +0 -197
- package/bmad-core/tasks/intelligent-epic-creation.md +0 -234
- package/bmad-core/tasks/smart-project-analysis.md +0 -289
- package/bmad-core/templates/flutter-mobile-prd-tmpl.yaml +0 -330
- package/bmad-core/templates/flutter-story-tmpl.yaml +0 -376
- package/bmad-core/templates/flutter-ui-spec-tmpl.yaml +0 -415
- package/dist/expansion-packs/bmad-mobile-app-dev/agents/mobile-analytics.txt +0 -1530
- package/dist/expansion-packs/bmad-mobile-app-dev/agents/mobile-architect.txt +0 -322
- package/dist/expansion-packs/bmad-mobile-app-dev/agents/mobile-developer.txt +0 -692
- package/dist/expansion-packs/bmad-mobile-app-dev/agents/mobile-pm.txt +0 -382
- package/dist/expansion-packs/bmad-mobile-app-dev/agents/mobile-qa.txt +0 -665
- package/dist/expansion-packs/bmad-mobile-app-dev/agents/mobile-security.txt +0 -1070
- package/dist/expansion-packs/bmad-mobile-app-dev/agents/mobile-ux-expert.txt +0 -1494
- package/dist/expansion-packs/bmad-mobile-app-dev/teams/mobile-team-cross-platform.txt +0 -15613
- package/flutter/CLAUDE.md +0 -58
- package/flutter/punkt.claude/New Folder With Items/channel.md +0 -221
- package/flutter/punkt.claude/New Folder With Items/commands/add-translations.md +0 -12
- package/flutter/punkt.claude/New Folder With Items/commands/create-feature.md +0 -168
- package/flutter/punkt.claude/New Folder With Items/commands/explain-codebase.md +0 -1
- package/flutter/punkt.claude/New Folder With Items/commands/feature-business-logic.md +0 -551
- package/flutter/punkt.claude/New Folder With Items/commands/feature-data-layer.md +0 -924
- package/flutter/punkt.claude/New Folder With Items/commands/feature-domain-layer.md +0 -540
- package/flutter/punkt.claude/New Folder With Items/commands/feature-integration.md +0 -493
- package/flutter/punkt.claude/New Folder With Items/commands/feature-localization.md +0 -427
- package/flutter/punkt.claude/New Folder With Items/commands/feature-ui-layer.md +0 -300
- package/flutter/punkt.claude/New Folder With Items/commands/git-commit.md +0 -3
- package/flutter/punkt.claude/New Folder With Items/commands/search-web.md +0 -1
- package/flutter/punkt.claude/punkt.claude/channel.md +0 -225
- package/flutter/punkt.claude/punkt.claude/commands/add-translations.md +0 -60
- package/flutter/punkt.claude/punkt.claude/commands/bug-fix.md +0 -32
- package/flutter/punkt.claude/punkt.claude/commands/checkdev.md +0 -122
- package/flutter/punkt.claude/punkt.claude/commands/create-feature.md +0 -174
- package/flutter/punkt.claude/punkt.claude/commands/dev.md +0 -79
- package/flutter/punkt.claude/punkt.claude/commands/explain-codebase.md +0 -1
- package/flutter/punkt.claude/punkt.claude/commands/feature-business-logic.md +0 -430
- package/flutter/punkt.claude/punkt.claude/commands/feature-data-layer.md +0 -572
- package/flutter/punkt.claude/punkt.claude/commands/feature-domain-layer.md +0 -537
- package/flutter/punkt.claude/punkt.claude/commands/feature-integration.md +0 -493
- package/flutter/punkt.claude/punkt.claude/commands/feature-localization.md +0 -427
- package/flutter/punkt.claude/punkt.claude/commands/feature-ui-layer.md +0 -831
- package/flutter/punkt.claude/punkt.claude/commands/git-commit.md +0 -3
- package/flutter/punkt.claude/punkt.claude/commands/manage-translations.md +0 -433
- package/flutter/punkt.claude/punkt.claude/commands/search-web.md +0 -1
- package/flutter/punkt.claude/punkt.claude/developer_check.md +0 -121
- package/tools/appiq-installer.js +0 -2711
- package/tools/epic-solution-installer.js +0 -536
- package/tools/setup-ide-commands.js +0 -348
- package/tools/smart-installer.js +0 -592
- package/web/CLAUDE.md +0 -58
- /package/{#Tools/APPIQ-METHOD/.github → .github}/FUNDING.yaml +0 -0
- /package/{#Tools/APPIQ-METHOD/.github → .github}/ISSUE_TEMPLATE/bug_report.md +0 -0
- /package/{#Tools/APPIQ-METHOD/.github → .github}/ISSUE_TEMPLATE/feature_request.md +0 -0
- /package/{#Tools/APPIQ-METHOD/.github → .github}/workflows/release.yaml +0 -0
- /package/{#Tools/APPIQ-METHOD/.releaserc.json → .releaserc.json} +0 -0
- /package/{#Tools/APPIQ-METHOD/.vscode → .vscode}/settings.json +0 -0
- /package/{#Tools/APPIQ-METHOD/CHANGELOG.md → CHANGELOG.md} +0 -0
- /package/{#Tools/APPIQ-METHOD/CONTRIBUTING.md → CONTRIBUTING.md} +0 -0
- /package/{#Tools/APPIQ-METHOD/LICENSE → LICENSE} +0 -0
- /package/{#Tools/APPIQ-METHOD/common → common}/tasks/create-doc.md +0 -0
- /package/{#Tools/APPIQ-METHOD/common → common}/tasks/execute-checklist.md +0 -0
- /package/{#Tools/APPIQ-METHOD/common → common}/utils/bmad-doc-template.md +0 -0
- /package/{#Tools/APPIQ-METHOD/common → common}/utils/workflow-management.md +0 -0
- /package/{#Tools/APPIQ-METHOD/docs → docs}/GUIDING-PRINCIPLES.md +0 -0
- /package/{#Tools/APPIQ-METHOD/docs → docs}/core-architecture.md +0 -0
- /package/{#Tools/APPIQ-METHOD/docs → docs}/expansion-packs.md +0 -0
- /package/{#Tools/APPIQ-METHOD/docs → docs}/how-to-contribute-with-pull-requests.md +0 -0
- /package/{#Tools/APPIQ-METHOD/docs → docs}/versioning-and-releases.md +0 -0
- /package/{#Tools/APPIQ-METHOD/docs → docs}/versions.md +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/README.md +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs/bmad-flutter-mobile-dev → expansion-packs/appiq-flutter-mobile-dev}/agent-teams/flutter-mobile-team.yaml +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs/bmad-flutter-mobile-dev → expansion-packs/appiq-flutter-mobile-dev}/agents/flutter-cubit-agent.md +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs/bmad-flutter-mobile-dev → expansion-packs/appiq-flutter-mobile-dev}/agents/flutter-data-agent.md +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs/bmad-flutter-mobile-dev → expansion-packs/appiq-flutter-mobile-dev}/agents/flutter-domain-agent.md +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs/bmad-flutter-mobile-dev → expansion-packs/appiq-flutter-mobile-dev}/agents/flutter-ui-agent.md +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs/bmad-flutter-mobile-dev → expansion-packs/appiq-flutter-mobile-dev}/agents/shared-components-agent.md +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs/bmad-flutter-mobile-dev → expansion-packs/appiq-flutter-mobile-dev}/checklists/flutter-story-dod-checklist.md +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs/bmad-flutter-mobile-dev → expansion-packs/appiq-flutter-mobile-dev}/data/flutter-development-guidelines.md +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs/bmad-flutter-mobile-dev → expansion-packs/appiq-flutter-mobile-dev}/templates/flutter-mobile-architecture-tmpl.yaml +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs/bmad-flutter-mobile-dev → expansion-packs/appiq-flutter-mobile-dev}/workflows/flutter-ui-first-development.yaml +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-phaser-game-dev/agent-teams/phaser-2d-nodejs-game-team.yaml +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-phaser-game-dev/agents/game-designer.md +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-phaser-game-dev/agents/game-developer.md +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-phaser-game-dev/agents/game-sm.md +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-phaser-game-dev/checklists/game-design-checklist.md +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-phaser-game-dev/checklists/game-story-dod-checklist.md +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-phaser-game-dev/config.yaml +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-phaser-game-dev/data/bmad-kb.md +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-phaser-game-dev/data/development-guidelines.md +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-phaser-game-dev/tasks/advanced-elicitation.md +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-phaser-game-dev/tasks/create-game-story.md +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-phaser-game-dev/tasks/game-design-brainstorming.md +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-phaser-game-dev/templates/game-architecture-tmpl.yaml +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-phaser-game-dev/templates/game-brief-tmpl.yaml +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-phaser-game-dev/templates/game-design-doc-tmpl.yaml +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-phaser-game-dev/templates/game-story-tmpl.yaml +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-phaser-game-dev/templates/level-design-doc-tmpl.yaml +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-phaser-game-dev/workflows/game-dev-greenfield.yaml +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-phaser-game-dev/workflows/game-prototype.yaml +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-unity-game-dev/agent-teams/unity-2d-game-team.yaml +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-unity-game-dev/agents/game-architect.md +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-unity-game-dev/agents/game-designer.md +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-unity-game-dev/agents/game-developer.md +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-unity-game-dev/agents/game-sm.md +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-unity-game-dev/checklists/game-architect-checklist.md +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-unity-game-dev/checklists/game-change-checklist.md +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-unity-game-dev/checklists/game-design-checklist.md +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-unity-game-dev/checklists/game-story-dod-checklist.md +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-unity-game-dev/config.yaml +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-unity-game-dev/data/bmad-kb.md +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-unity-game-dev/data/development-guidelines.md +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-unity-game-dev/tasks/advanced-elicitation.md +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-unity-game-dev/tasks/correct-course-game.md +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-unity-game-dev/tasks/create-game-story.md +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-unity-game-dev/tasks/game-design-brainstorming.md +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-unity-game-dev/tasks/validate-game-story.md +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-unity-game-dev/templates/game-architecture-tmpl.yaml +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-unity-game-dev/templates/game-brief-tmpl.yaml +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-unity-game-dev/templates/game-design-doc-tmpl.yaml +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-unity-game-dev/templates/game-story-tmpl.yaml +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-unity-game-dev/templates/level-design-doc-tmpl.yaml +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-unity-game-dev/workflows/game-dev-greenfield.yaml +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-2d-unity-game-dev/workflows/game-prototype.yaml +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-infrastructure-devops/README.md +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-infrastructure-devops/agents/infra-devops-platform.md +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-infrastructure-devops/checklists/infrastructure-checklist.md +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-infrastructure-devops/config.yaml +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-infrastructure-devops/data/bmad-kb.md +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-infrastructure-devops/tasks/review-infrastructure.md +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-infrastructure-devops/tasks/validate-infrastructure.md +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-infrastructure-devops/templates/infrastructure-architecture-tmpl.yaml +0 -0
- /package/{#Tools/APPIQ-METHOD/expansion-packs → expansion-packs}/bmad-infrastructure-devops/templates/infrastructure-platform-from-arch-tmpl.yaml +0 -0
@@ -1,1772 +0,0 @@
|
|
1
|
-
const path = require("node:path");
|
2
|
-
const fs = require("fs-extra");
|
3
|
-
const chalk = require("chalk");
|
4
|
-
const ora = require("ora");
|
5
|
-
const inquirer = require("inquirer");
|
6
|
-
const fileManager = require("./file-manager");
|
7
|
-
const configLoader = require("./config-loader");
|
8
|
-
const ideSetup = require("./ide-setup");
|
9
|
-
const { extractYamlFromAgent } = require("../../lib/yaml-utils");
|
10
|
-
const resourceLocator = require("./resource-locator");
|
11
|
-
|
12
|
-
class Installer {
|
13
|
-
async getCoreVersion() {
|
14
|
-
try {
|
15
|
-
// Always use package.json version
|
16
|
-
const packagePath = path.join(__dirname, '..', '..', '..', 'package.json');
|
17
|
-
const packageJson = require(packagePath);
|
18
|
-
return packageJson.version;
|
19
|
-
} catch (error) {
|
20
|
-
console.warn("Could not read version from package.json, using 'unknown'");
|
21
|
-
return "unknown";
|
22
|
-
}
|
23
|
-
}
|
24
|
-
|
25
|
-
async install(config) {
|
26
|
-
const spinner = ora("Analyzing installation directory...").start();
|
27
|
-
|
28
|
-
try {
|
29
|
-
// Store the original CWD where npx was executed
|
30
|
-
const originalCwd = process.env.INIT_CWD || process.env.PWD || process.cwd();
|
31
|
-
|
32
|
-
// Resolve installation directory relative to where the user ran the command
|
33
|
-
let installDir = path.isAbsolute(config.directory)
|
34
|
-
? config.directory
|
35
|
-
: path.resolve(originalCwd, config.directory);
|
36
|
-
|
37
|
-
if (path.basename(installDir) === '.bmad-core') {
|
38
|
-
// If user points directly to .bmad-core, treat its parent as the project root
|
39
|
-
installDir = path.dirname(installDir);
|
40
|
-
}
|
41
|
-
|
42
|
-
// Log resolved path for clarity
|
43
|
-
if (!path.isAbsolute(config.directory)) {
|
44
|
-
spinner.text = `Resolving "${config.directory}" to: ${installDir}`;
|
45
|
-
}
|
46
|
-
|
47
|
-
// Check if directory exists and handle non-existent directories
|
48
|
-
if (!(await fileManager.pathExists(installDir))) {
|
49
|
-
spinner.stop();
|
50
|
-
console.log(`\nThe directory ${installDir} does not exist.`);
|
51
|
-
|
52
|
-
const { action } = await inquirer.prompt([
|
53
|
-
{
|
54
|
-
type: 'list',
|
55
|
-
name: 'action',
|
56
|
-
message: 'What would you like to do?',
|
57
|
-
choices: [
|
58
|
-
{
|
59
|
-
name: 'Create the directory and continue',
|
60
|
-
value: 'create'
|
61
|
-
},
|
62
|
-
{
|
63
|
-
name: 'Choose a different directory',
|
64
|
-
value: 'change'
|
65
|
-
},
|
66
|
-
{
|
67
|
-
name: 'Cancel installation',
|
68
|
-
value: 'cancel'
|
69
|
-
}
|
70
|
-
]
|
71
|
-
}
|
72
|
-
]);
|
73
|
-
|
74
|
-
if (action === 'cancel') {
|
75
|
-
console.log('Installation cancelled.');
|
76
|
-
process.exit(0);
|
77
|
-
} else if (action === 'change') {
|
78
|
-
const { newDirectory } = await inquirer.prompt([
|
79
|
-
{
|
80
|
-
type: 'input',
|
81
|
-
name: 'newDirectory',
|
82
|
-
message: 'Enter the new directory path:',
|
83
|
-
validate: (input) => {
|
84
|
-
if (!input.trim()) {
|
85
|
-
return 'Please enter a valid directory path';
|
86
|
-
}
|
87
|
-
return true;
|
88
|
-
}
|
89
|
-
}
|
90
|
-
]);
|
91
|
-
// Preserve the original CWD for the recursive call
|
92
|
-
config.directory = newDirectory;
|
93
|
-
return await this.install(config); // Recursive call with new directory
|
94
|
-
} else if (action === 'create') {
|
95
|
-
try {
|
96
|
-
await fileManager.ensureDirectory(installDir);
|
97
|
-
console.log(`✓ Created directory: ${installDir}`);
|
98
|
-
} catch (error) {
|
99
|
-
console.error(`Failed to create directory: ${error.message}`);
|
100
|
-
console.error('You may need to check permissions or use a different path.');
|
101
|
-
process.exit(1);
|
102
|
-
}
|
103
|
-
}
|
104
|
-
|
105
|
-
spinner.start("Analyzing installation directory...");
|
106
|
-
}
|
107
|
-
|
108
|
-
// If this is an update request from early detection, handle it directly
|
109
|
-
if (config.installType === 'update') {
|
110
|
-
const state = await this.detectInstallationState(installDir);
|
111
|
-
if (state.type === 'v4_existing') {
|
112
|
-
return await this.performUpdate(config, installDir, state.manifest, spinner);
|
113
|
-
} else {
|
114
|
-
spinner.fail('No existing v4 installation found to update');
|
115
|
-
throw new Error('No existing v4 installation found');
|
116
|
-
}
|
117
|
-
}
|
118
|
-
|
119
|
-
// Detect current state
|
120
|
-
const state = await this.detectInstallationState(installDir);
|
121
|
-
|
122
|
-
// Handle different states
|
123
|
-
switch (state.type) {
|
124
|
-
case "clean":
|
125
|
-
return await this.performFreshInstall(config, installDir, spinner);
|
126
|
-
|
127
|
-
case "v4_existing":
|
128
|
-
return await this.handleExistingV4Installation(
|
129
|
-
config,
|
130
|
-
installDir,
|
131
|
-
state,
|
132
|
-
spinner
|
133
|
-
);
|
134
|
-
|
135
|
-
case "v3_existing":
|
136
|
-
return await this.handleV3Installation(
|
137
|
-
config,
|
138
|
-
installDir,
|
139
|
-
state,
|
140
|
-
spinner
|
141
|
-
);
|
142
|
-
|
143
|
-
case "unknown_existing":
|
144
|
-
return await this.handleUnknownInstallation(
|
145
|
-
config,
|
146
|
-
installDir,
|
147
|
-
state,
|
148
|
-
spinner
|
149
|
-
);
|
150
|
-
}
|
151
|
-
} catch (error) {
|
152
|
-
// Check if modules were initialized
|
153
|
-
if (spinner) {
|
154
|
-
spinner.fail("Installation failed");
|
155
|
-
} else {
|
156
|
-
console.error("Installation failed:", error.message);
|
157
|
-
}
|
158
|
-
throw error;
|
159
|
-
}
|
160
|
-
}
|
161
|
-
|
162
|
-
async detectInstallationState(installDir) {
|
163
|
-
const state = {
|
164
|
-
type: "clean",
|
165
|
-
hasV4Manifest: false,
|
166
|
-
hasV3Structure: false,
|
167
|
-
hasBmadCore: false,
|
168
|
-
hasOtherFiles: false,
|
169
|
-
manifest: null,
|
170
|
-
expansionPacks: {},
|
171
|
-
};
|
172
|
-
|
173
|
-
// Check if directory exists
|
174
|
-
if (!(await fileManager.pathExists(installDir))) {
|
175
|
-
return state; // clean install
|
176
|
-
}
|
177
|
-
|
178
|
-
// Check for V4 installation (has .bmad-core with manifest)
|
179
|
-
const bmadCorePath = path.join(installDir, ".bmad-core");
|
180
|
-
const manifestPath = path.join(bmadCorePath, "install-manifest.yaml");
|
181
|
-
|
182
|
-
if (await fileManager.pathExists(manifestPath)) {
|
183
|
-
state.type = "v4_existing";
|
184
|
-
state.hasV4Manifest = true;
|
185
|
-
state.hasBmadCore = true;
|
186
|
-
state.manifest = await fileManager.readManifest(installDir);
|
187
|
-
return state;
|
188
|
-
}
|
189
|
-
|
190
|
-
// Check for V3 installation (has bmad-agent directory)
|
191
|
-
const bmadAgentPath = path.join(installDir, "bmad-agent");
|
192
|
-
if (await fileManager.pathExists(bmadAgentPath)) {
|
193
|
-
state.type = "v3_existing";
|
194
|
-
state.hasV3Structure = true;
|
195
|
-
return state;
|
196
|
-
}
|
197
|
-
|
198
|
-
// Check for .bmad-core without manifest (broken V4 or manual copy)
|
199
|
-
if (await fileManager.pathExists(bmadCorePath)) {
|
200
|
-
state.type = "unknown_existing";
|
201
|
-
state.hasBmadCore = true;
|
202
|
-
return state;
|
203
|
-
}
|
204
|
-
|
205
|
-
// Check if directory has other files
|
206
|
-
const files = await resourceLocator.findFiles("**/*", {
|
207
|
-
cwd: installDir,
|
208
|
-
nodir: true,
|
209
|
-
ignore: ["**/.git/**", "**/node_modules/**"],
|
210
|
-
});
|
211
|
-
|
212
|
-
if (files.length > 0) {
|
213
|
-
// Directory has other files, but no BMad installation.
|
214
|
-
// Treat as clean install but record that it isn't empty.
|
215
|
-
state.hasOtherFiles = true;
|
216
|
-
}
|
217
|
-
|
218
|
-
// Check for expansion packs (folders starting with .)
|
219
|
-
const expansionPacks = await this.detectExpansionPacks(installDir);
|
220
|
-
state.expansionPacks = expansionPacks;
|
221
|
-
|
222
|
-
return state; // clean install
|
223
|
-
}
|
224
|
-
|
225
|
-
async performFreshInstall(config, installDir, spinner, options = {}) {
|
226
|
-
spinner.text = "Installing BMad Method...";
|
227
|
-
|
228
|
-
let files = [];
|
229
|
-
|
230
|
-
if (config.installType === "full") {
|
231
|
-
// Full installation - copy entire .bmad-core folder as a subdirectory
|
232
|
-
spinner.text = "Copying complete .bmad-core folder...";
|
233
|
-
const sourceDir = resourceLocator.getBmadCorePath();
|
234
|
-
const bmadCoreDestDir = path.join(installDir, ".bmad-core");
|
235
|
-
await fileManager.copyDirectoryWithRootReplacement(sourceDir, bmadCoreDestDir, ".bmad-core");
|
236
|
-
|
237
|
-
// Copy common/ items to .bmad-core
|
238
|
-
spinner.text = "Copying common utilities...";
|
239
|
-
await this.copyCommonItems(installDir, ".bmad-core", spinner);
|
240
|
-
|
241
|
-
// Get list of all files for manifest
|
242
|
-
const foundFiles = await resourceLocator.findFiles("**/*", {
|
243
|
-
cwd: bmadCoreDestDir,
|
244
|
-
nodir: true,
|
245
|
-
ignore: ["**/.git/**", "**/node_modules/**"],
|
246
|
-
});
|
247
|
-
files = foundFiles.map((file) => path.join(".bmad-core", file));
|
248
|
-
} else if (config.installType === "single-agent") {
|
249
|
-
// Single agent installation
|
250
|
-
spinner.text = `Installing ${config.agent} agent...`;
|
251
|
-
|
252
|
-
// Copy agent file with {root} replacement
|
253
|
-
const agentPath = configLoader.getAgentPath(config.agent);
|
254
|
-
const destAgentPath = path.join(
|
255
|
-
installDir,
|
256
|
-
".bmad-core",
|
257
|
-
"agents",
|
258
|
-
`${config.agent}.md`
|
259
|
-
);
|
260
|
-
await fileManager.copyFileWithRootReplacement(agentPath, destAgentPath, ".bmad-core");
|
261
|
-
files.push(`.bmad-core/agents/${config.agent}.md`);
|
262
|
-
|
263
|
-
// Copy dependencies
|
264
|
-
const { all: dependencies } = await resourceLocator.getAgentDependencies(
|
265
|
-
config.agent
|
266
|
-
);
|
267
|
-
const sourceBase = resourceLocator.getBmadCorePath();
|
268
|
-
|
269
|
-
for (const dep of dependencies) {
|
270
|
-
spinner.text = `Copying dependency: ${dep}`;
|
271
|
-
|
272
|
-
if (dep.includes("*")) {
|
273
|
-
// Handle glob patterns with {root} replacement
|
274
|
-
const copiedFiles = await fileManager.copyGlobPattern(
|
275
|
-
dep.replace(".bmad-core/", ""),
|
276
|
-
sourceBase,
|
277
|
-
path.join(installDir, ".bmad-core"),
|
278
|
-
".bmad-core"
|
279
|
-
);
|
280
|
-
files.push(...copiedFiles.map(f => `.bmad-core/${f}`));
|
281
|
-
} else {
|
282
|
-
// Handle single files with {root} replacement if needed
|
283
|
-
const sourcePath = path.join(
|
284
|
-
sourceBase,
|
285
|
-
dep.replace(".bmad-core/", "")
|
286
|
-
);
|
287
|
-
const destPath = path.join(
|
288
|
-
installDir,
|
289
|
-
dep
|
290
|
-
);
|
291
|
-
|
292
|
-
const needsRootReplacement = dep.endsWith('.md') || dep.endsWith('.yaml') || dep.endsWith('.yml');
|
293
|
-
let success = false;
|
294
|
-
|
295
|
-
if (needsRootReplacement) {
|
296
|
-
success = await fileManager.copyFileWithRootReplacement(sourcePath, destPath, ".bmad-core");
|
297
|
-
} else {
|
298
|
-
success = await fileManager.copyFile(sourcePath, destPath);
|
299
|
-
}
|
300
|
-
|
301
|
-
if (success) {
|
302
|
-
files.push(dep);
|
303
|
-
}
|
304
|
-
}
|
305
|
-
}
|
306
|
-
|
307
|
-
// Copy common/ items to .bmad-core
|
308
|
-
spinner.text = "Copying common utilities...";
|
309
|
-
const commonFiles = await this.copyCommonItems(installDir, ".bmad-core", spinner);
|
310
|
-
files.push(...commonFiles);
|
311
|
-
} else if (config.installType === "team") {
|
312
|
-
// Team installation
|
313
|
-
spinner.text = `Installing ${config.team} team...`;
|
314
|
-
|
315
|
-
// Get team dependencies
|
316
|
-
const teamDependencies = await configLoader.getTeamDependencies(config.team);
|
317
|
-
const sourceBase = resourceLocator.getBmadCorePath();
|
318
|
-
|
319
|
-
// Install all team dependencies
|
320
|
-
for (const dep of teamDependencies) {
|
321
|
-
spinner.text = `Copying team dependency: ${dep}`;
|
322
|
-
|
323
|
-
if (dep.includes("*")) {
|
324
|
-
// Handle glob patterns with {root} replacement
|
325
|
-
const copiedFiles = await fileManager.copyGlobPattern(
|
326
|
-
dep.replace(".bmad-core/", ""),
|
327
|
-
sourceBase,
|
328
|
-
path.join(installDir, ".bmad-core"),
|
329
|
-
".bmad-core"
|
330
|
-
);
|
331
|
-
files.push(...copiedFiles.map(f => `.bmad-core/${f}`));
|
332
|
-
} else {
|
333
|
-
// Handle single files with {root} replacement if needed
|
334
|
-
const sourcePath = path.join(sourceBase, dep.replace(".bmad-core/", ""));
|
335
|
-
const destPath = path.join(installDir, dep);
|
336
|
-
|
337
|
-
const needsRootReplacement = dep.endsWith('.md') || dep.endsWith('.yaml') || dep.endsWith('.yml');
|
338
|
-
let success = false;
|
339
|
-
|
340
|
-
if (needsRootReplacement) {
|
341
|
-
success = await fileManager.copyFileWithRootReplacement(sourcePath, destPath, ".bmad-core");
|
342
|
-
} else {
|
343
|
-
success = await fileManager.copyFile(sourcePath, destPath);
|
344
|
-
}
|
345
|
-
|
346
|
-
if (success) {
|
347
|
-
files.push(dep);
|
348
|
-
}
|
349
|
-
}
|
350
|
-
}
|
351
|
-
|
352
|
-
// Copy common/ items to .bmad-core
|
353
|
-
spinner.text = "Copying common utilities...";
|
354
|
-
const commonFiles = await this.copyCommonItems(installDir, ".bmad-core", spinner);
|
355
|
-
files.push(...commonFiles);
|
356
|
-
} else if (config.installType === "expansion-only") {
|
357
|
-
// Expansion-only installation - DO NOT create .bmad-core
|
358
|
-
// Only install expansion packs
|
359
|
-
spinner.text = "Installing expansion packs only...";
|
360
|
-
}
|
361
|
-
|
362
|
-
// Install expansion packs if requested
|
363
|
-
const expansionFiles = await this.installExpansionPacks(installDir, config.expansionPacks, spinner, config);
|
364
|
-
files.push(...expansionFiles);
|
365
|
-
|
366
|
-
// Install web bundles if requested
|
367
|
-
if (config.includeWebBundles && config.webBundlesDirectory) {
|
368
|
-
spinner.text = "Installing web bundles...";
|
369
|
-
// Resolve web bundles directory using the same logic as the main installation directory
|
370
|
-
const originalCwd = process.env.INIT_CWD || process.env.PWD || process.cwd();
|
371
|
-
let resolvedWebBundlesDir = path.isAbsolute(config.webBundlesDirectory)
|
372
|
-
? config.webBundlesDirectory
|
373
|
-
: path.resolve(originalCwd, config.webBundlesDirectory);
|
374
|
-
await this.installWebBundles(resolvedWebBundlesDir, config, spinner);
|
375
|
-
}
|
376
|
-
|
377
|
-
// Set up IDE integration if requested
|
378
|
-
const ides = config.ides || (config.ide ? [config.ide] : []);
|
379
|
-
if (ides.length > 0) {
|
380
|
-
for (const ide of ides) {
|
381
|
-
spinner.text = `Setting up ${ide} integration...`;
|
382
|
-
const preConfiguredSettings = ide === 'github-copilot' ? config.githubCopilotConfig : null;
|
383
|
-
await ideSetup.setup(ide, installDir, config.agent, spinner, preConfiguredSettings);
|
384
|
-
}
|
385
|
-
}
|
386
|
-
|
387
|
-
// Modify core-config.yaml if sharding preferences were provided
|
388
|
-
if (config.installType !== "expansion-only" && (config.prdSharded !== undefined || config.architectureSharded !== undefined)) {
|
389
|
-
spinner.text = "Configuring document sharding settings...";
|
390
|
-
await fileManager.modifyCoreConfig(installDir, config);
|
391
|
-
}
|
392
|
-
|
393
|
-
// Create manifest (skip for expansion-only installations)
|
394
|
-
if (config.installType !== "expansion-only") {
|
395
|
-
spinner.text = "Creating installation manifest...";
|
396
|
-
await fileManager.createManifest(installDir, config, files);
|
397
|
-
}
|
398
|
-
|
399
|
-
spinner.succeed("Installation complete!");
|
400
|
-
this.showSuccessMessage(config, installDir, options);
|
401
|
-
}
|
402
|
-
|
403
|
-
async handleExistingV4Installation(config, installDir, state, spinner) {
|
404
|
-
spinner.stop();
|
405
|
-
|
406
|
-
const currentVersion = state.manifest.version;
|
407
|
-
const newVersion = await this.getCoreVersion();
|
408
|
-
const versionCompare = this.compareVersions(currentVersion, newVersion);
|
409
|
-
|
410
|
-
console.log(chalk.yellow("\n🔍 Found existing BMad v4 installation"));
|
411
|
-
console.log(` Directory: ${installDir}`);
|
412
|
-
console.log(` Current version: ${currentVersion}`);
|
413
|
-
console.log(` Available version: ${newVersion}`);
|
414
|
-
console.log(
|
415
|
-
` Installed: ${new Date(
|
416
|
-
state.manifest.installed_at
|
417
|
-
).toLocaleDateString()}`
|
418
|
-
);
|
419
|
-
|
420
|
-
// Check file integrity
|
421
|
-
spinner.start("Checking installation integrity...");
|
422
|
-
const integrity = await fileManager.checkFileIntegrity(installDir, state.manifest);
|
423
|
-
spinner.stop();
|
424
|
-
|
425
|
-
const hasMissingFiles = integrity.missing.length > 0;
|
426
|
-
const hasModifiedFiles = integrity.modified.length > 0;
|
427
|
-
const hasIntegrityIssues = hasMissingFiles || hasModifiedFiles;
|
428
|
-
|
429
|
-
if (hasIntegrityIssues) {
|
430
|
-
console.log(chalk.red("\n⚠️ Installation issues detected:"));
|
431
|
-
if (hasMissingFiles) {
|
432
|
-
console.log(chalk.red(` Missing files: ${integrity.missing.length}`));
|
433
|
-
if (integrity.missing.length <= 5) {
|
434
|
-
integrity.missing.forEach(file => console.log(chalk.dim(` - ${file}`)));
|
435
|
-
}
|
436
|
-
}
|
437
|
-
if (hasModifiedFiles) {
|
438
|
-
console.log(chalk.yellow(` Modified files: ${integrity.modified.length}`));
|
439
|
-
if (integrity.modified.length <= 5) {
|
440
|
-
integrity.modified.forEach(file => console.log(chalk.dim(` - ${file}`)));
|
441
|
-
}
|
442
|
-
}
|
443
|
-
}
|
444
|
-
|
445
|
-
// Show existing expansion packs
|
446
|
-
if (Object.keys(state.expansionPacks).length > 0) {
|
447
|
-
console.log(chalk.cyan("\n📦 Installed expansion packs:"));
|
448
|
-
for (const [packId, packInfo] of Object.entries(state.expansionPacks)) {
|
449
|
-
if (packInfo.hasManifest && packInfo.manifest) {
|
450
|
-
console.log(` - ${packId} (v${packInfo.manifest.version || 'unknown'})`);
|
451
|
-
} else {
|
452
|
-
console.log(` - ${packId} (no manifest)`);
|
453
|
-
}
|
454
|
-
}
|
455
|
-
}
|
456
|
-
|
457
|
-
let choices = [];
|
458
|
-
|
459
|
-
if (versionCompare < 0) {
|
460
|
-
console.log(chalk.cyan("\n⬆️ Upgrade available for BMad core"));
|
461
|
-
choices.push({ name: `Upgrade BMad core (v${currentVersion} → v${newVersion})`, value: "upgrade" });
|
462
|
-
} else if (versionCompare === 0) {
|
463
|
-
if (hasIntegrityIssues) {
|
464
|
-
// Offer repair option when files are missing or modified
|
465
|
-
choices.push({
|
466
|
-
name: "Repair installation (restore missing/modified files)",
|
467
|
-
value: "repair"
|
468
|
-
});
|
469
|
-
}
|
470
|
-
console.log(chalk.yellow("\n⚠️ Same version already installed"));
|
471
|
-
choices.push({ name: `Force reinstall BMad core (v${currentVersion} - reinstall)`, value: "reinstall" });
|
472
|
-
} else {
|
473
|
-
console.log(chalk.yellow("\n⬇️ Installed version is newer than available"));
|
474
|
-
choices.push({ name: `Downgrade BMad core (v${currentVersion} → v${newVersion})`, value: "reinstall" });
|
475
|
-
}
|
476
|
-
|
477
|
-
choices.push(
|
478
|
-
{ name: "Add/update expansion packs only", value: "expansions" },
|
479
|
-
{ name: "Cancel", value: "cancel" }
|
480
|
-
);
|
481
|
-
|
482
|
-
const { action } = await inquirer.prompt([
|
483
|
-
{
|
484
|
-
type: "list",
|
485
|
-
name: "action",
|
486
|
-
message: "What would you like to do?",
|
487
|
-
choices: choices,
|
488
|
-
},
|
489
|
-
]);
|
490
|
-
|
491
|
-
switch (action) {
|
492
|
-
case "upgrade":
|
493
|
-
return await this.performUpdate(config, installDir, state.manifest, spinner);
|
494
|
-
case "repair":
|
495
|
-
// For repair, restore missing/modified files while backing up modified ones
|
496
|
-
return await this.performRepair(config, installDir, state.manifest, integrity, spinner);
|
497
|
-
case "reinstall":
|
498
|
-
// For reinstall, don't check for modifications - just overwrite
|
499
|
-
return await this.performReinstall(config, installDir, spinner);
|
500
|
-
case "expansions": {
|
501
|
-
// Ask which expansion packs to install
|
502
|
-
const availableExpansionPacks = await resourceLocator.getExpansionPacks();
|
503
|
-
|
504
|
-
if (availableExpansionPacks.length === 0) {
|
505
|
-
console.log(chalk.yellow("No expansion packs available."));
|
506
|
-
return;
|
507
|
-
}
|
508
|
-
|
509
|
-
const { selectedPacks } = await inquirer.prompt([
|
510
|
-
{
|
511
|
-
type: 'checkbox',
|
512
|
-
name: 'selectedPacks',
|
513
|
-
message: 'Select expansion packs to install/update:',
|
514
|
-
choices: availableExpansionPacks.map(pack => ({
|
515
|
-
name: `${pack.name} (v${pack.version}) .${pack.id}`,
|
516
|
-
value: pack.id,
|
517
|
-
checked: state.expansionPacks[pack.id] !== undefined
|
518
|
-
}))
|
519
|
-
}
|
520
|
-
]);
|
521
|
-
|
522
|
-
if (selectedPacks.length === 0) {
|
523
|
-
console.log(chalk.yellow("No expansion packs selected."));
|
524
|
-
return;
|
525
|
-
}
|
526
|
-
|
527
|
-
spinner.start("Installing expansion packs...");
|
528
|
-
const expansionFiles = await this.installExpansionPacks(installDir, selectedPacks, spinner, { ides: config.ides || [] });
|
529
|
-
spinner.succeed("Expansion packs installed successfully!");
|
530
|
-
|
531
|
-
console.log(chalk.green("\n✓ Installation complete!"));
|
532
|
-
console.log(chalk.green(`✓ Expansion packs installed/updated:`));
|
533
|
-
for (const packId of selectedPacks) {
|
534
|
-
console.log(chalk.green(` - ${packId} → .${packId}/`));
|
535
|
-
}
|
536
|
-
return;
|
537
|
-
}
|
538
|
-
case "cancel":
|
539
|
-
console.log("Installation cancelled.");
|
540
|
-
return;
|
541
|
-
}
|
542
|
-
}
|
543
|
-
|
544
|
-
async handleV3Installation(config, installDir, state, spinner) {
|
545
|
-
spinner.stop();
|
546
|
-
|
547
|
-
console.log(
|
548
|
-
chalk.yellow("\n🔍 Found BMad v3 installation (bmad-agent/ directory)")
|
549
|
-
);
|
550
|
-
console.log(` Directory: ${installDir}`);
|
551
|
-
|
552
|
-
const { action } = await inquirer.prompt([
|
553
|
-
{
|
554
|
-
type: "list",
|
555
|
-
name: "action",
|
556
|
-
message: "What would you like to do?",
|
557
|
-
choices: [
|
558
|
-
{ name: "Upgrade from v3 to v4 (recommended)", value: "upgrade" },
|
559
|
-
{ name: "Install v4 alongside v3", value: "alongside" },
|
560
|
-
{ name: "Cancel", value: "cancel" },
|
561
|
-
],
|
562
|
-
},
|
563
|
-
]);
|
564
|
-
|
565
|
-
switch (action) {
|
566
|
-
case "upgrade": {
|
567
|
-
console.log(chalk.cyan("\n📦 Starting v3 to v4 upgrade process..."));
|
568
|
-
const V3ToV4Upgrader = require("../../upgraders/v3-to-v4-upgrader");
|
569
|
-
const upgrader = new V3ToV4Upgrader();
|
570
|
-
return await upgrader.upgrade({
|
571
|
-
projectPath: installDir,
|
572
|
-
ides: config.ides || [] // Pass IDE selections from initial config
|
573
|
-
});
|
574
|
-
}
|
575
|
-
case "alongside":
|
576
|
-
return await this.performFreshInstall(config, installDir, spinner);
|
577
|
-
case "cancel":
|
578
|
-
console.log("Installation cancelled.");
|
579
|
-
return;
|
580
|
-
}
|
581
|
-
}
|
582
|
-
|
583
|
-
async handleUnknownInstallation(config, installDir, state, spinner) {
|
584
|
-
spinner.stop();
|
585
|
-
|
586
|
-
console.log(chalk.yellow("\n⚠️ Directory contains existing files"));
|
587
|
-
console.log(` Directory: ${installDir}`);
|
588
|
-
|
589
|
-
if (state.hasBmadCore) {
|
590
|
-
console.log(" Found: .bmad-core directory (but no manifest)");
|
591
|
-
}
|
592
|
-
if (state.hasOtherFiles) {
|
593
|
-
console.log(" Found: Other files in directory");
|
594
|
-
}
|
595
|
-
|
596
|
-
const { action } = await inquirer.prompt([
|
597
|
-
{
|
598
|
-
type: "list",
|
599
|
-
name: "action",
|
600
|
-
message: "What would you like to do?",
|
601
|
-
choices: [
|
602
|
-
{ name: "Install anyway (may overwrite files)", value: "force" },
|
603
|
-
{ name: "Choose different directory", value: "different" },
|
604
|
-
{ name: "Cancel", value: "cancel" },
|
605
|
-
],
|
606
|
-
},
|
607
|
-
]);
|
608
|
-
|
609
|
-
switch (action) {
|
610
|
-
case "force":
|
611
|
-
return await this.performFreshInstall(config, installDir, spinner);
|
612
|
-
case "different": {
|
613
|
-
const { newDir } = await inquirer.prompt([
|
614
|
-
{
|
615
|
-
type: "input",
|
616
|
-
name: "newDir",
|
617
|
-
message: "Enter new installation directory:",
|
618
|
-
default: path.join(path.dirname(installDir), "bmad-project"),
|
619
|
-
},
|
620
|
-
]);
|
621
|
-
config.directory = newDir;
|
622
|
-
return await this.install(config);
|
623
|
-
}
|
624
|
-
case "cancel":
|
625
|
-
console.log("Installation cancelled.");
|
626
|
-
return;
|
627
|
-
}
|
628
|
-
}
|
629
|
-
|
630
|
-
async performUpdate(newConfig, installDir, manifest, spinner) {
|
631
|
-
spinner.start("Checking for updates...");
|
632
|
-
|
633
|
-
try {
|
634
|
-
// Get current and new versions
|
635
|
-
const currentVersion = manifest.version;
|
636
|
-
const newVersion = await this.getCoreVersion();
|
637
|
-
const versionCompare = this.compareVersions(currentVersion, newVersion);
|
638
|
-
|
639
|
-
// Only check for modified files if it's an actual version upgrade
|
640
|
-
let modifiedFiles = [];
|
641
|
-
if (versionCompare !== 0) {
|
642
|
-
spinner.text = "Checking for modified files...";
|
643
|
-
modifiedFiles = await fileManager.checkModifiedFiles(
|
644
|
-
installDir,
|
645
|
-
manifest
|
646
|
-
);
|
647
|
-
}
|
648
|
-
|
649
|
-
if (modifiedFiles.length > 0) {
|
650
|
-
spinner.warn("Found modified files");
|
651
|
-
console.log(chalk.yellow("\nThe following files have been modified:"));
|
652
|
-
for (const file of modifiedFiles) {
|
653
|
-
console.log(` - ${file}`);
|
654
|
-
}
|
655
|
-
|
656
|
-
const { action } = await inquirer.prompt([
|
657
|
-
{
|
658
|
-
type: "list",
|
659
|
-
name: "action",
|
660
|
-
message: "How would you like to proceed?",
|
661
|
-
choices: [
|
662
|
-
{ name: "Backup and overwrite modified files", value: "backup" },
|
663
|
-
{ name: "Skip modified files", value: "skip" },
|
664
|
-
{ name: "Cancel update", value: "cancel" },
|
665
|
-
],
|
666
|
-
},
|
667
|
-
]);
|
668
|
-
|
669
|
-
if (action === "cancel") {
|
670
|
-
console.log("Update cancelled.");
|
671
|
-
return;
|
672
|
-
}
|
673
|
-
|
674
|
-
if (action === "backup") {
|
675
|
-
spinner.start("Backing up modified files...");
|
676
|
-
for (const file of modifiedFiles) {
|
677
|
-
const filePath = path.join(installDir, file);
|
678
|
-
const backupPath = await fileManager.backupFile(filePath);
|
679
|
-
console.log(
|
680
|
-
chalk.dim(` Backed up: ${file} → ${path.basename(backupPath)}`)
|
681
|
-
);
|
682
|
-
}
|
683
|
-
}
|
684
|
-
}
|
685
|
-
|
686
|
-
// Perform update by re-running installation
|
687
|
-
spinner.text = versionCompare === 0 ? "Reinstalling files..." : "Updating files...";
|
688
|
-
const config = {
|
689
|
-
installType: manifest.install_type,
|
690
|
-
agent: manifest.agent,
|
691
|
-
directory: installDir,
|
692
|
-
ides: newConfig?.ides || manifest.ides_setup || [],
|
693
|
-
};
|
694
|
-
|
695
|
-
await this.performFreshInstall(config, installDir, spinner, { isUpdate: true });
|
696
|
-
|
697
|
-
// Clean up .yml files that now have .yaml counterparts
|
698
|
-
spinner.text = "Cleaning up legacy .yml files...";
|
699
|
-
await this.cleanupLegacyYmlFiles(installDir, spinner);
|
700
|
-
} catch (error) {
|
701
|
-
spinner.fail("Update failed");
|
702
|
-
throw error;
|
703
|
-
}
|
704
|
-
}
|
705
|
-
|
706
|
-
async performRepair(config, installDir, manifest, integrity, spinner) {
|
707
|
-
spinner.start("Preparing to repair installation...");
|
708
|
-
|
709
|
-
try {
|
710
|
-
// Back up modified files
|
711
|
-
if (integrity.modified.length > 0) {
|
712
|
-
spinner.text = "Backing up modified files...";
|
713
|
-
for (const file of integrity.modified) {
|
714
|
-
const filePath = path.join(installDir, file);
|
715
|
-
if (await fileManager.pathExists(filePath)) {
|
716
|
-
const backupPath = await fileManager.backupFile(filePath);
|
717
|
-
console.log(chalk.dim(` Backed up: ${file} → ${path.basename(backupPath)}`));
|
718
|
-
}
|
719
|
-
}
|
720
|
-
}
|
721
|
-
|
722
|
-
// Restore missing and modified files
|
723
|
-
spinner.text = "Restoring files...";
|
724
|
-
const sourceBase = resourceLocator.getBmadCorePath();
|
725
|
-
const filesToRestore = [...integrity.missing, ...integrity.modified];
|
726
|
-
|
727
|
-
for (const file of filesToRestore) {
|
728
|
-
// Skip the manifest file itself
|
729
|
-
if (file.endsWith('install-manifest.yaml')) continue;
|
730
|
-
|
731
|
-
const relativePath = file.replace('.bmad-core/', '');
|
732
|
-
const destPath = path.join(installDir, file);
|
733
|
-
|
734
|
-
// Check if this is a common/ file that needs special processing
|
735
|
-
const commonBase = path.dirname(path.dirname(path.dirname(path.dirname(__filename))));
|
736
|
-
const commonSourcePath = path.join(commonBase, 'common', relativePath);
|
737
|
-
|
738
|
-
if (await fileManager.pathExists(commonSourcePath)) {
|
739
|
-
// This is a common/ file - needs template processing
|
740
|
-
const fs = require('fs').promises;
|
741
|
-
const content = await fs.readFile(commonSourcePath, 'utf8');
|
742
|
-
const updatedContent = content.replace(/\{root\}/g, '.bmad-core');
|
743
|
-
await fileManager.ensureDirectory(path.dirname(destPath));
|
744
|
-
await fs.writeFile(destPath, updatedContent, 'utf8');
|
745
|
-
spinner.text = `Restored: ${file}`;
|
746
|
-
} else {
|
747
|
-
// Regular file from bmad-core
|
748
|
-
const sourcePath = path.join(sourceBase, relativePath);
|
749
|
-
if (await fileManager.pathExists(sourcePath)) {
|
750
|
-
await fileManager.copyFile(sourcePath, destPath);
|
751
|
-
spinner.text = `Restored: ${file}`;
|
752
|
-
|
753
|
-
// If this is a .yaml file, check for and remove corresponding .yml file
|
754
|
-
if (file.endsWith('.yaml')) {
|
755
|
-
const ymlFile = file.replace(/\.yaml$/, '.yml');
|
756
|
-
const ymlPath = path.join(installDir, ymlFile);
|
757
|
-
if (await fileManager.pathExists(ymlPath)) {
|
758
|
-
const fs = require('fs').promises;
|
759
|
-
await fs.unlink(ymlPath);
|
760
|
-
console.log(chalk.dim(` Removed legacy: ${ymlFile} (replaced by ${file})`));
|
761
|
-
}
|
762
|
-
}
|
763
|
-
} else {
|
764
|
-
console.warn(chalk.yellow(` Warning: Source file not found: ${file}`));
|
765
|
-
}
|
766
|
-
}
|
767
|
-
}
|
768
|
-
|
769
|
-
// Clean up .yml files that now have .yaml counterparts
|
770
|
-
spinner.text = "Cleaning up legacy .yml files...";
|
771
|
-
await this.cleanupLegacyYmlFiles(installDir, spinner);
|
772
|
-
|
773
|
-
spinner.succeed("Repair completed successfully!");
|
774
|
-
|
775
|
-
// Show summary
|
776
|
-
console.log(chalk.green("\n✓ Installation repaired!"));
|
777
|
-
if (integrity.missing.length > 0) {
|
778
|
-
console.log(chalk.green(` Restored ${integrity.missing.length} missing files`));
|
779
|
-
}
|
780
|
-
if (integrity.modified.length > 0) {
|
781
|
-
console.log(chalk.green(` Restored ${integrity.modified.length} modified files (backups created)`));
|
782
|
-
}
|
783
|
-
|
784
|
-
// Warning for Cursor custom modes if agents were repaired
|
785
|
-
const ides = manifest.ides_setup || [];
|
786
|
-
if (ides.includes('cursor')) {
|
787
|
-
console.log(chalk.yellow.bold("\n⚠️ IMPORTANT: Cursor Custom Modes Update Required"));
|
788
|
-
console.log(chalk.yellow("Since agent files have been repaired, you need to update any custom agent modes configured in the Cursor custom agent GUI per the Cursor docs."));
|
789
|
-
}
|
790
|
-
|
791
|
-
} catch (error) {
|
792
|
-
spinner.fail("Repair failed");
|
793
|
-
throw error;
|
794
|
-
}
|
795
|
-
}
|
796
|
-
|
797
|
-
async performReinstall(config, installDir, spinner) {
|
798
|
-
spinner.start("Preparing to reinstall BMad Method...");
|
799
|
-
|
800
|
-
// Remove existing .bmad-core
|
801
|
-
const bmadCorePath = path.join(installDir, ".bmad-core");
|
802
|
-
if (await fileManager.pathExists(bmadCorePath)) {
|
803
|
-
spinner.text = "Removing existing installation...";
|
804
|
-
await fileManager.removeDirectory(bmadCorePath);
|
805
|
-
}
|
806
|
-
|
807
|
-
spinner.text = "Installing fresh copy...";
|
808
|
-
const result = await this.performFreshInstall(config, installDir, spinner, { isUpdate: true });
|
809
|
-
|
810
|
-
// Clean up .yml files that now have .yaml counterparts
|
811
|
-
spinner.text = "Cleaning up legacy .yml files...";
|
812
|
-
await this.cleanupLegacyYmlFiles(installDir, spinner);
|
813
|
-
|
814
|
-
return result;
|
815
|
-
}
|
816
|
-
|
817
|
-
showSuccessMessage(config, installDir, options = {}) {
|
818
|
-
console.log(chalk.green("\n✓ BMad Method installed successfully!\n"));
|
819
|
-
|
820
|
-
const ides = config.ides || (config.ide ? [config.ide] : []);
|
821
|
-
if (ides.length > 0) {
|
822
|
-
for (const ide of ides) {
|
823
|
-
const ideConfig = configLoader.getIdeConfiguration(ide);
|
824
|
-
if (ideConfig?.instructions) {
|
825
|
-
console.log(
|
826
|
-
chalk.bold(`To use BMad agents in ${ideConfig.name}:`)
|
827
|
-
);
|
828
|
-
console.log(ideConfig.instructions);
|
829
|
-
}
|
830
|
-
}
|
831
|
-
} else {
|
832
|
-
console.log(chalk.yellow("No IDE configuration was set up."));
|
833
|
-
console.log(
|
834
|
-
"You can manually configure your IDE using the agent files in:",
|
835
|
-
installDir
|
836
|
-
);
|
837
|
-
}
|
838
|
-
|
839
|
-
// Information about installation components
|
840
|
-
console.log(chalk.bold("\n🎯 Installation Summary:"));
|
841
|
-
if (config.installType !== "expansion-only") {
|
842
|
-
console.log(chalk.green("✓ .bmad-core framework installed with all agents and workflows"));
|
843
|
-
}
|
844
|
-
|
845
|
-
if (config.expansionPacks && config.expansionPacks.length > 0) {
|
846
|
-
console.log(chalk.green(`✓ Expansion packs installed:`));
|
847
|
-
for (const packId of config.expansionPacks) {
|
848
|
-
console.log(chalk.green(` - ${packId} → .${packId}/`));
|
849
|
-
}
|
850
|
-
}
|
851
|
-
|
852
|
-
if (config.includeWebBundles && config.webBundlesDirectory) {
|
853
|
-
const bundleInfo = this.getWebBundleInfo(config);
|
854
|
-
// Resolve the web bundles directory for display
|
855
|
-
const originalCwd = process.env.INIT_CWD || process.env.PWD || process.cwd();
|
856
|
-
const resolvedWebBundlesDir = path.isAbsolute(config.webBundlesDirectory)
|
857
|
-
? config.webBundlesDirectory
|
858
|
-
: path.resolve(originalCwd, config.webBundlesDirectory);
|
859
|
-
console.log(chalk.green(`✓ Web bundles (${bundleInfo}) installed to: ${resolvedWebBundlesDir}`));
|
860
|
-
}
|
861
|
-
|
862
|
-
if (ides.length > 0) {
|
863
|
-
const ideNames = ides.map(ide => {
|
864
|
-
const ideConfig = configLoader.getIdeConfiguration(ide);
|
865
|
-
return ideConfig?.name || ide;
|
866
|
-
}).join(", ");
|
867
|
-
console.log(chalk.green(`✓ IDE rules and configurations set up for: ${ideNames}`));
|
868
|
-
}
|
869
|
-
|
870
|
-
|
871
|
-
|
872
|
-
// Information about web bundles
|
873
|
-
if (!config.includeWebBundles) {
|
874
|
-
console.log(chalk.bold("\n📦 Web Bundles Available:"));
|
875
|
-
console.log("Pre-built web bundles are available and can be added later:");
|
876
|
-
console.log(chalk.cyan(" Run the installer again to add them to your project"));
|
877
|
-
console.log("These bundles work independently and can be shared, moved, or used");
|
878
|
-
console.log("in other projects as standalone files.");
|
879
|
-
}
|
880
|
-
|
881
|
-
if (config.installType === "single-agent") {
|
882
|
-
console.log(
|
883
|
-
chalk.dim(
|
884
|
-
"\nNeed other agents? Run: npx bmad-method install --agent=<name>"
|
885
|
-
)
|
886
|
-
);
|
887
|
-
console.log(
|
888
|
-
chalk.dim("Need everything? Run: npx bmad-method install --full")
|
889
|
-
);
|
890
|
-
}
|
891
|
-
|
892
|
-
// Warning for Cursor custom modes if agents were updated
|
893
|
-
if (options.isUpdate && ides.includes('cursor')) {
|
894
|
-
console.log(chalk.yellow.bold("\n⚠️ IMPORTANT: Cursor Custom Modes Update Required"));
|
895
|
-
console.log(chalk.yellow("Since agents have been updated, you need to update any custom agent modes configured in the Cursor custom agent GUI per the Cursor docs."));
|
896
|
-
}
|
897
|
-
|
898
|
-
// Important notice to read the user guide
|
899
|
-
console.log(chalk.red.bold("\n📖 IMPORTANT: Please read the user guide installed at .bmad-core/user-guide.md"));
|
900
|
-
console.log(chalk.red("This guide contains essential information about the BMad workflow and how to use the agents effectively."));
|
901
|
-
}
|
902
|
-
|
903
|
-
// Legacy method for backward compatibility
|
904
|
-
async update() {
|
905
|
-
console.log(chalk.yellow('The "update" command is deprecated.'));
|
906
|
-
console.log(
|
907
|
-
'Please use "install" instead - it will detect and offer to update existing installations.'
|
908
|
-
);
|
909
|
-
|
910
|
-
const installDir = await this.findInstallation();
|
911
|
-
if (installDir) {
|
912
|
-
const config = {
|
913
|
-
installType: "full",
|
914
|
-
directory: path.dirname(installDir),
|
915
|
-
ide: null,
|
916
|
-
};
|
917
|
-
return await this.install(config);
|
918
|
-
}
|
919
|
-
console.log(chalk.red("No BMad installation found."));
|
920
|
-
}
|
921
|
-
|
922
|
-
async listAgents() {
|
923
|
-
const agents = await resourceLocator.getAvailableAgents();
|
924
|
-
|
925
|
-
console.log(chalk.bold("\nAvailable BMad Agents:\n"));
|
926
|
-
|
927
|
-
for (const agent of agents) {
|
928
|
-
console.log(chalk.cyan(` ${agent.id.padEnd(20)}`), agent.description);
|
929
|
-
}
|
930
|
-
|
931
|
-
console.log(
|
932
|
-
chalk.dim("\nInstall with: npx bmad-method install --agent=<id>\n")
|
933
|
-
);
|
934
|
-
}
|
935
|
-
|
936
|
-
async listExpansionPacks() {
|
937
|
-
const expansionPacks = await resourceLocator.getExpansionPacks();
|
938
|
-
|
939
|
-
console.log(chalk.bold("\nAvailable BMad Expansion Packs:\n"));
|
940
|
-
|
941
|
-
if (expansionPacks.length === 0) {
|
942
|
-
console.log(chalk.yellow("No expansion packs found."));
|
943
|
-
return;
|
944
|
-
}
|
945
|
-
|
946
|
-
for (const pack of expansionPacks) {
|
947
|
-
console.log(chalk.cyan(` ${pack.id.padEnd(20)}`),
|
948
|
-
`${pack.name} v${pack.version}`);
|
949
|
-
console.log(chalk.dim(` ${' '.repeat(22)}${pack.description}`));
|
950
|
-
if (pack.author && pack.author !== 'Unknown') {
|
951
|
-
console.log(chalk.dim(` ${' '.repeat(22)}by ${pack.author}`));
|
952
|
-
}
|
953
|
-
console.log();
|
954
|
-
}
|
955
|
-
|
956
|
-
console.log(
|
957
|
-
chalk.dim("Install with: npx bmad-method install --full --expansion-packs <id>\n")
|
958
|
-
);
|
959
|
-
}
|
960
|
-
|
961
|
-
async showStatus() {
|
962
|
-
const installDir = await this.findInstallation();
|
963
|
-
|
964
|
-
if (!installDir) {
|
965
|
-
console.log(
|
966
|
-
chalk.yellow("No BMad installation found in current directory tree")
|
967
|
-
);
|
968
|
-
return;
|
969
|
-
}
|
970
|
-
|
971
|
-
const manifest = await fileManager.readManifest(installDir);
|
972
|
-
|
973
|
-
if (!manifest) {
|
974
|
-
console.log(chalk.red("Invalid installation - manifest not found"));
|
975
|
-
return;
|
976
|
-
}
|
977
|
-
|
978
|
-
console.log(chalk.bold("\nBMad Installation Status:\n"));
|
979
|
-
console.log(` Directory: ${installDir}`);
|
980
|
-
console.log(` Version: ${manifest.version}`);
|
981
|
-
console.log(
|
982
|
-
` Installed: ${new Date(
|
983
|
-
manifest.installed_at
|
984
|
-
).toLocaleDateString()}`
|
985
|
-
);
|
986
|
-
console.log(` Type: ${manifest.install_type}`);
|
987
|
-
|
988
|
-
if (manifest.agent) {
|
989
|
-
console.log(` Agent: ${manifest.agent}`);
|
990
|
-
}
|
991
|
-
|
992
|
-
if (manifest.ides_setup && manifest.ides_setup.length > 0) {
|
993
|
-
console.log(` IDE Setup: ${manifest.ides_setup.join(', ')}`);
|
994
|
-
}
|
995
|
-
|
996
|
-
console.log(` Total Files: ${manifest.files.length}`);
|
997
|
-
|
998
|
-
// Check for modifications
|
999
|
-
const modifiedFiles = await fileManager.checkModifiedFiles(
|
1000
|
-
installDir,
|
1001
|
-
manifest
|
1002
|
-
);
|
1003
|
-
if (modifiedFiles.length > 0) {
|
1004
|
-
console.log(chalk.yellow(` Modified Files: ${modifiedFiles.length}`));
|
1005
|
-
}
|
1006
|
-
|
1007
|
-
console.log("");
|
1008
|
-
}
|
1009
|
-
|
1010
|
-
async getAvailableAgents() {
|
1011
|
-
return resourceLocator.getAvailableAgents();
|
1012
|
-
}
|
1013
|
-
|
1014
|
-
async getAvailableExpansionPacks() {
|
1015
|
-
return resourceLocator.getExpansionPacks();
|
1016
|
-
}
|
1017
|
-
|
1018
|
-
async getAvailableTeams() {
|
1019
|
-
return configLoader.getAvailableTeams();
|
1020
|
-
}
|
1021
|
-
|
1022
|
-
async installExpansionPacks(installDir, selectedPacks, spinner, config = {}) {
|
1023
|
-
if (!selectedPacks || selectedPacks.length === 0) {
|
1024
|
-
return [];
|
1025
|
-
}
|
1026
|
-
|
1027
|
-
const installedFiles = [];
|
1028
|
-
|
1029
|
-
for (const packId of selectedPacks) {
|
1030
|
-
spinner.text = `Installing expansion pack: ${packId}...`;
|
1031
|
-
|
1032
|
-
try {
|
1033
|
-
const expansionPacks = await resourceLocator.getExpansionPacks();
|
1034
|
-
const pack = expansionPacks.find(p => p.id === packId);
|
1035
|
-
|
1036
|
-
if (!pack) {
|
1037
|
-
console.warn(`Expansion pack ${packId} not found, skipping...`);
|
1038
|
-
continue;
|
1039
|
-
}
|
1040
|
-
|
1041
|
-
// Check if expansion pack already exists
|
1042
|
-
let expansionDotFolder = path.join(installDir, `.${packId}`);
|
1043
|
-
const existingManifestPath = path.join(expansionDotFolder, 'install-manifest.yaml');
|
1044
|
-
|
1045
|
-
if (await fileManager.pathExists(existingManifestPath)) {
|
1046
|
-
spinner.stop();
|
1047
|
-
const existingManifest = await fileManager.readExpansionPackManifest(installDir, packId);
|
1048
|
-
|
1049
|
-
console.log(chalk.yellow(`\n🔍 Found existing ${pack.name} installation`));
|
1050
|
-
console.log(` Current version: ${existingManifest.version || 'unknown'}`);
|
1051
|
-
console.log(` New version: ${pack.version}`);
|
1052
|
-
|
1053
|
-
// Check integrity of existing expansion pack
|
1054
|
-
const packIntegrity = await fileManager.checkFileIntegrity(installDir, existingManifest);
|
1055
|
-
const hasPackIntegrityIssues = packIntegrity.missing.length > 0 || packIntegrity.modified.length > 0;
|
1056
|
-
|
1057
|
-
if (hasPackIntegrityIssues) {
|
1058
|
-
console.log(chalk.red(" ⚠️ Installation issues detected:"));
|
1059
|
-
if (packIntegrity.missing.length > 0) {
|
1060
|
-
console.log(chalk.red(` Missing files: ${packIntegrity.missing.length}`));
|
1061
|
-
}
|
1062
|
-
if (packIntegrity.modified.length > 0) {
|
1063
|
-
console.log(chalk.yellow(` Modified files: ${packIntegrity.modified.length}`));
|
1064
|
-
}
|
1065
|
-
}
|
1066
|
-
|
1067
|
-
const versionCompare = this.compareVersions(existingManifest.version || '0.0.0', pack.version);
|
1068
|
-
|
1069
|
-
if (versionCompare === 0) {
|
1070
|
-
console.log(chalk.yellow(' ⚠️ Same version already installed'));
|
1071
|
-
|
1072
|
-
const choices = [];
|
1073
|
-
if (hasPackIntegrityIssues) {
|
1074
|
-
choices.push({ name: 'Repair (restore missing/modified files)', value: 'repair' });
|
1075
|
-
}
|
1076
|
-
choices.push(
|
1077
|
-
{ name: 'Force reinstall (overwrite)', value: 'overwrite' },
|
1078
|
-
{ name: 'Skip this expansion pack', value: 'skip' },
|
1079
|
-
{ name: 'Cancel installation', value: 'cancel' }
|
1080
|
-
);
|
1081
|
-
|
1082
|
-
const { action } = await inquirer.prompt([{
|
1083
|
-
type: 'list',
|
1084
|
-
name: 'action',
|
1085
|
-
message: `${pack.name} v${pack.version} is already installed. What would you like to do?`,
|
1086
|
-
choices: choices
|
1087
|
-
}]);
|
1088
|
-
|
1089
|
-
if (action === 'skip') {
|
1090
|
-
spinner.start();
|
1091
|
-
continue;
|
1092
|
-
} else if (action === 'cancel') {
|
1093
|
-
console.log('Installation cancelled.');
|
1094
|
-
process.exit(0);
|
1095
|
-
} else if (action === 'repair') {
|
1096
|
-
// Repair the expansion pack
|
1097
|
-
await this.repairExpansionPack(installDir, packId, pack, packIntegrity, spinner);
|
1098
|
-
continue;
|
1099
|
-
}
|
1100
|
-
} else if (versionCompare < 0) {
|
1101
|
-
console.log(chalk.cyan(' ⬆️ Upgrade available'));
|
1102
|
-
|
1103
|
-
const { proceed } = await inquirer.prompt([{
|
1104
|
-
type: 'confirm',
|
1105
|
-
name: 'proceed',
|
1106
|
-
message: `Upgrade ${pack.name} from v${existingManifest.version} to v${pack.version}?`,
|
1107
|
-
default: true
|
1108
|
-
}]);
|
1109
|
-
|
1110
|
-
if (!proceed) {
|
1111
|
-
spinner.start();
|
1112
|
-
continue;
|
1113
|
-
}
|
1114
|
-
} else {
|
1115
|
-
console.log(chalk.yellow(' ⬇️ Installed version is newer than available version'));
|
1116
|
-
|
1117
|
-
const { action } = await inquirer.prompt([{
|
1118
|
-
type: 'list',
|
1119
|
-
name: 'action',
|
1120
|
-
message: 'What would you like to do?',
|
1121
|
-
choices: [
|
1122
|
-
{ name: 'Keep current version', value: 'skip' },
|
1123
|
-
{ name: 'Downgrade to available version', value: 'downgrade' },
|
1124
|
-
{ name: 'Cancel installation', value: 'cancel' }
|
1125
|
-
]
|
1126
|
-
}]);
|
1127
|
-
|
1128
|
-
if (action === 'skip') {
|
1129
|
-
spinner.start();
|
1130
|
-
continue;
|
1131
|
-
} else if (action === 'cancel') {
|
1132
|
-
console.log('Installation cancelled.');
|
1133
|
-
process.exit(0);
|
1134
|
-
}
|
1135
|
-
}
|
1136
|
-
|
1137
|
-
// If we get here, we're proceeding with installation
|
1138
|
-
spinner.start(`Removing old ${pack.name} installation...`);
|
1139
|
-
await fileManager.removeDirectory(expansionDotFolder);
|
1140
|
-
}
|
1141
|
-
|
1142
|
-
const expansionPackDir = pack.path;
|
1143
|
-
|
1144
|
-
// Ensure dedicated dot folder exists for this expansion pack
|
1145
|
-
expansionDotFolder = path.join(installDir, `.${packId}`);
|
1146
|
-
await fileManager.ensureDirectory(expansionDotFolder);
|
1147
|
-
|
1148
|
-
// Define the folders to copy from expansion packs
|
1149
|
-
const foldersToSync = [
|
1150
|
-
'agents',
|
1151
|
-
'agent-teams',
|
1152
|
-
'templates',
|
1153
|
-
'tasks',
|
1154
|
-
'checklists',
|
1155
|
-
'workflows',
|
1156
|
-
'data',
|
1157
|
-
'utils',
|
1158
|
-
'schemas'
|
1159
|
-
];
|
1160
|
-
|
1161
|
-
// Copy each folder if it exists
|
1162
|
-
for (const folder of foldersToSync) {
|
1163
|
-
const sourceFolder = path.join(expansionPackDir, folder);
|
1164
|
-
|
1165
|
-
// Check if folder exists in expansion pack
|
1166
|
-
if (await fileManager.pathExists(sourceFolder)) {
|
1167
|
-
// Get all files in this folder
|
1168
|
-
const files = await resourceLocator.findFiles('**/*', {
|
1169
|
-
cwd: sourceFolder,
|
1170
|
-
nodir: true
|
1171
|
-
});
|
1172
|
-
|
1173
|
-
// Copy each file to the expansion pack's dot folder with {root} replacement
|
1174
|
-
for (const file of files) {
|
1175
|
-
const sourcePath = path.join(sourceFolder, file);
|
1176
|
-
const destPath = path.join(expansionDotFolder, folder, file);
|
1177
|
-
|
1178
|
-
const needsRootReplacement = file.endsWith('.md') || file.endsWith('.yaml') || file.endsWith('.yml');
|
1179
|
-
let success = false;
|
1180
|
-
|
1181
|
-
if (needsRootReplacement) {
|
1182
|
-
success = await fileManager.copyFileWithRootReplacement(sourcePath, destPath, `.${packId}`);
|
1183
|
-
} else {
|
1184
|
-
success = await fileManager.copyFile(sourcePath, destPath);
|
1185
|
-
}
|
1186
|
-
|
1187
|
-
if (success) {
|
1188
|
-
installedFiles.push(path.join(`.${packId}`, folder, file));
|
1189
|
-
}
|
1190
|
-
}
|
1191
|
-
}
|
1192
|
-
}
|
1193
|
-
|
1194
|
-
// Copy config.yaml with {root} replacement
|
1195
|
-
const configPath = path.join(expansionPackDir, 'config.yaml');
|
1196
|
-
if (await fileManager.pathExists(configPath)) {
|
1197
|
-
const configDestPath = path.join(expansionDotFolder, 'config.yaml');
|
1198
|
-
if (await fileManager.copyFileWithRootReplacement(configPath, configDestPath, `.${packId}`)) {
|
1199
|
-
installedFiles.push(path.join(`.${packId}`, 'config.yaml'));
|
1200
|
-
}
|
1201
|
-
}
|
1202
|
-
|
1203
|
-
// Copy README if it exists with {root} replacement
|
1204
|
-
const readmePath = path.join(expansionPackDir, 'README.md');
|
1205
|
-
if (await fileManager.pathExists(readmePath)) {
|
1206
|
-
const readmeDestPath = path.join(expansionDotFolder, 'README.md');
|
1207
|
-
if (await fileManager.copyFileWithRootReplacement(readmePath, readmeDestPath, `.${packId}`)) {
|
1208
|
-
installedFiles.push(path.join(`.${packId}`, 'README.md'));
|
1209
|
-
}
|
1210
|
-
}
|
1211
|
-
|
1212
|
-
// Copy common/ items to expansion pack folder
|
1213
|
-
spinner.text = `Copying common utilities to ${packId}...`;
|
1214
|
-
await this.copyCommonItems(installDir, `.${packId}`, spinner);
|
1215
|
-
|
1216
|
-
// Check and resolve core dependencies
|
1217
|
-
await this.resolveExpansionPackCoreDependencies(installDir, expansionDotFolder, packId, pack, spinner);
|
1218
|
-
|
1219
|
-
// Check and resolve core agents referenced by teams
|
1220
|
-
await this.resolveExpansionPackCoreAgents(installDir, expansionDotFolder, packId, spinner);
|
1221
|
-
|
1222
|
-
// Create manifest for this expansion pack
|
1223
|
-
spinner.text = `Creating manifest for ${packId}...`;
|
1224
|
-
const expansionConfig = {
|
1225
|
-
installType: 'expansion-pack',
|
1226
|
-
expansionPackId: packId,
|
1227
|
-
expansionPackName: pack.name,
|
1228
|
-
expansionPackVersion: pack.version,
|
1229
|
-
ides: config.ides || [] // Use ides_setup instead of ide_setup
|
1230
|
-
};
|
1231
|
-
|
1232
|
-
// Get all files installed in this expansion pack
|
1233
|
-
const foundFiles = await resourceLocator.findFiles('**/*', {
|
1234
|
-
cwd: expansionDotFolder,
|
1235
|
-
nodir: true
|
1236
|
-
});
|
1237
|
-
const expansionPackFiles = foundFiles.map(f => path.join(`.${packId}`, f));
|
1238
|
-
|
1239
|
-
await fileManager.createExpansionPackManifest(installDir, packId, expansionConfig, expansionPackFiles);
|
1240
|
-
|
1241
|
-
console.log(chalk.green(`✓ Installed expansion pack: ${pack.name} to ${`.${packId}`}`));
|
1242
|
-
} catch (error) {
|
1243
|
-
console.error(`Failed to install expansion pack ${packId}: ${error.message}`);
|
1244
|
-
console.error(`Stack trace: ${error.stack}`);
|
1245
|
-
}
|
1246
|
-
}
|
1247
|
-
|
1248
|
-
return installedFiles;
|
1249
|
-
}
|
1250
|
-
|
1251
|
-
async resolveExpansionPackCoreDependencies(installDir, expansionDotFolder, packId, pack, spinner) {
|
1252
|
-
const yaml = require('js-yaml');
|
1253
|
-
const fs = require('fs').promises;
|
1254
|
-
|
1255
|
-
// Find all agent files in the expansion pack
|
1256
|
-
const agentFiles = await resourceLocator.findFiles('agents/*.md', {
|
1257
|
-
cwd: expansionDotFolder
|
1258
|
-
});
|
1259
|
-
|
1260
|
-
for (const agentFile of agentFiles) {
|
1261
|
-
const agentPath = path.join(expansionDotFolder, agentFile);
|
1262
|
-
const agentContent = await fs.readFile(agentPath, 'utf8');
|
1263
|
-
|
1264
|
-
// Extract YAML frontmatter to check dependencies
|
1265
|
-
const yamlContent = extractYamlFromAgent(agentContent);
|
1266
|
-
if (yamlContent) {
|
1267
|
-
try {
|
1268
|
-
const agentConfig = yaml.load(yamlContent);
|
1269
|
-
const dependencies = agentConfig.dependencies || {};
|
1270
|
-
|
1271
|
-
// Check for core dependencies (those that don't exist in the expansion pack)
|
1272
|
-
for (const depType of ['tasks', 'templates', 'checklists', 'workflows', 'utils', 'data']) {
|
1273
|
-
const deps = dependencies[depType] || [];
|
1274
|
-
|
1275
|
-
for (const dep of deps) {
|
1276
|
-
const depFileName = dep.endsWith('.md') || dep.endsWith('.yaml') ? dep :
|
1277
|
-
(depType === 'templates' ? `${dep}.yaml` : `${dep}.md`);
|
1278
|
-
const expansionDepPath = path.join(expansionDotFolder, depType, depFileName);
|
1279
|
-
|
1280
|
-
// Check if dependency exists in expansion pack dot folder
|
1281
|
-
if (!(await fileManager.pathExists(expansionDepPath))) {
|
1282
|
-
// Try to find it in expansion pack source
|
1283
|
-
const sourceDepPath = path.join(pack.path, depType, depFileName);
|
1284
|
-
|
1285
|
-
if (await fileManager.pathExists(sourceDepPath)) {
|
1286
|
-
// Copy from expansion pack source
|
1287
|
-
spinner.text = `Copying ${packId} dependency ${dep}...`;
|
1288
|
-
const destPath = path.join(expansionDotFolder, depType, depFileName);
|
1289
|
-
await fileManager.copyFileWithRootReplacement(sourceDepPath, destPath, `.${packId}`);
|
1290
|
-
console.log(chalk.dim(` Added ${packId} dependency: ${depType}/${depFileName}`));
|
1291
|
-
} else {
|
1292
|
-
// Try to find it in core
|
1293
|
-
const coreDepPath = path.join(resourceLocator.getBmadCorePath(), depType, depFileName);
|
1294
|
-
|
1295
|
-
if (await fileManager.pathExists(coreDepPath)) {
|
1296
|
-
spinner.text = `Copying core dependency ${dep} for ${packId}...`;
|
1297
|
-
|
1298
|
-
// Copy from core to expansion pack dot folder with {root} replacement
|
1299
|
-
const destPath = path.join(expansionDotFolder, depType, depFileName);
|
1300
|
-
await fileManager.copyFileWithRootReplacement(coreDepPath, destPath, `.${packId}`);
|
1301
|
-
|
1302
|
-
console.log(chalk.dim(` Added core dependency: ${depType}/${depFileName}`));
|
1303
|
-
} else {
|
1304
|
-
console.warn(chalk.yellow(` Warning: Dependency ${depType}/${dep} not found in core or expansion pack`));
|
1305
|
-
}
|
1306
|
-
}
|
1307
|
-
}
|
1308
|
-
}
|
1309
|
-
}
|
1310
|
-
} catch (error) {
|
1311
|
-
console.warn(` Warning: Could not parse agent dependencies: ${error.message}`);
|
1312
|
-
}
|
1313
|
-
}
|
1314
|
-
}
|
1315
|
-
}
|
1316
|
-
|
1317
|
-
async resolveExpansionPackCoreAgents(installDir, expansionDotFolder, packId, spinner) {
|
1318
|
-
const yaml = require('js-yaml');
|
1319
|
-
const fs = require('fs').promises;
|
1320
|
-
|
1321
|
-
// Find all team files in the expansion pack
|
1322
|
-
const teamFiles = await resourceLocator.findFiles('agent-teams/*.yaml', {
|
1323
|
-
cwd: expansionDotFolder
|
1324
|
-
});
|
1325
|
-
|
1326
|
-
// Also get existing agents in the expansion pack
|
1327
|
-
const existingAgents = new Set();
|
1328
|
-
const agentFiles = await resourceLocator.findFiles('agents/*.md', {
|
1329
|
-
cwd: expansionDotFolder
|
1330
|
-
});
|
1331
|
-
for (const agentFile of agentFiles) {
|
1332
|
-
const agentName = path.basename(agentFile, '.md');
|
1333
|
-
existingAgents.add(agentName);
|
1334
|
-
}
|
1335
|
-
|
1336
|
-
// Process each team file
|
1337
|
-
for (const teamFile of teamFiles) {
|
1338
|
-
const teamPath = path.join(expansionDotFolder, teamFile);
|
1339
|
-
const teamContent = await fs.readFile(teamPath, 'utf8');
|
1340
|
-
|
1341
|
-
try {
|
1342
|
-
const teamConfig = yaml.load(teamContent);
|
1343
|
-
const agents = teamConfig.agents || [];
|
1344
|
-
|
1345
|
-
// Add bmad-orchestrator if not present (required for all teams)
|
1346
|
-
if (!agents.includes('bmad-orchestrator')) {
|
1347
|
-
agents.unshift('bmad-orchestrator');
|
1348
|
-
}
|
1349
|
-
|
1350
|
-
// Check each agent in the team
|
1351
|
-
for (const agentId of agents) {
|
1352
|
-
if (!existingAgents.has(agentId)) {
|
1353
|
-
// Agent not in expansion pack, try to get from core
|
1354
|
-
const coreAgentPath = path.join(resourceLocator.getBmadCorePath(), 'agents', `${agentId}.md`);
|
1355
|
-
|
1356
|
-
if (await fileManager.pathExists(coreAgentPath)) {
|
1357
|
-
spinner.text = `Copying core agent ${agentId} for ${packId}...`;
|
1358
|
-
|
1359
|
-
// Copy agent file with {root} replacement
|
1360
|
-
const destPath = path.join(expansionDotFolder, 'agents', `${agentId}.md`);
|
1361
|
-
await fileManager.copyFileWithRootReplacement(coreAgentPath, destPath, `.${packId}`);
|
1362
|
-
existingAgents.add(agentId);
|
1363
|
-
|
1364
|
-
console.log(chalk.dim(` Added core agent: ${agentId}`));
|
1365
|
-
|
1366
|
-
// Now resolve this agent's dependencies too
|
1367
|
-
const agentContent = await fs.readFile(coreAgentPath, 'utf8');
|
1368
|
-
const yamlContent = extractYamlFromAgent(agentContent, true);
|
1369
|
-
|
1370
|
-
if (yamlContent) {
|
1371
|
-
try {
|
1372
|
-
|
1373
|
-
const agentConfig = yaml.load(yamlContent);
|
1374
|
-
const dependencies = agentConfig.dependencies || {};
|
1375
|
-
|
1376
|
-
// Copy all dependencies for this agent
|
1377
|
-
for (const depType of ['tasks', 'templates', 'checklists', 'workflows', 'utils', 'data']) {
|
1378
|
-
const deps = dependencies[depType] || [];
|
1379
|
-
|
1380
|
-
for (const dep of deps) {
|
1381
|
-
const depFileName = dep.endsWith('.md') || dep.endsWith('.yaml') ? dep :
|
1382
|
-
(depType === 'templates' ? `${dep}.yaml` : `${dep}.md`);
|
1383
|
-
const expansionDepPath = path.join(expansionDotFolder, depType, depFileName);
|
1384
|
-
|
1385
|
-
// Check if dependency exists in expansion pack
|
1386
|
-
if (!(await fileManager.pathExists(expansionDepPath))) {
|
1387
|
-
// Try to find it in core
|
1388
|
-
const coreDepPath = path.join(resourceLocator.getBmadCorePath(), depType, depFileName);
|
1389
|
-
|
1390
|
-
if (await fileManager.pathExists(coreDepPath)) {
|
1391
|
-
const destDepPath = path.join(expansionDotFolder, depType, depFileName);
|
1392
|
-
await fileManager.copyFileWithRootReplacement(coreDepPath, destDepPath, `.${packId}`);
|
1393
|
-
console.log(chalk.dim(` Added agent dependency: ${depType}/${depFileName}`));
|
1394
|
-
} else {
|
1395
|
-
// Try common folder
|
1396
|
-
const sourceBase = path.dirname(path.dirname(path.dirname(path.dirname(__filename)))); // Go up to project root
|
1397
|
-
const commonDepPath = path.join(sourceBase, 'common', depType, depFileName);
|
1398
|
-
if (await fileManager.pathExists(commonDepPath)) {
|
1399
|
-
const destDepPath = path.join(expansionDotFolder, depType, depFileName);
|
1400
|
-
await fileManager.copyFile(commonDepPath, destDepPath);
|
1401
|
-
console.log(chalk.dim(` Added agent dependency from common: ${depType}/${depFileName}`));
|
1402
|
-
}
|
1403
|
-
}
|
1404
|
-
}
|
1405
|
-
}
|
1406
|
-
}
|
1407
|
-
} catch (error) {
|
1408
|
-
console.warn(` Warning: Could not parse agent ${agentId} dependencies: ${error.message}`);
|
1409
|
-
}
|
1410
|
-
}
|
1411
|
-
} else {
|
1412
|
-
console.warn(chalk.yellow(` Warning: Core agent ${agentId} not found for team ${path.basename(teamFile, '.yaml')}`));
|
1413
|
-
}
|
1414
|
-
}
|
1415
|
-
}
|
1416
|
-
} catch (error) {
|
1417
|
-
console.warn(` Warning: Could not parse team file ${teamFile}: ${error.message}`);
|
1418
|
-
}
|
1419
|
-
}
|
1420
|
-
}
|
1421
|
-
|
1422
|
-
getWebBundleInfo(config) {
|
1423
|
-
const webBundleType = config.webBundleType || 'all';
|
1424
|
-
|
1425
|
-
switch (webBundleType) {
|
1426
|
-
case 'all':
|
1427
|
-
return 'all bundles';
|
1428
|
-
case 'agents':
|
1429
|
-
return 'individual agents only';
|
1430
|
-
case 'teams':
|
1431
|
-
return config.selectedWebBundleTeams ?
|
1432
|
-
`teams: ${config.selectedWebBundleTeams.join(', ')}` :
|
1433
|
-
'selected teams';
|
1434
|
-
case 'custom': {
|
1435
|
-
const parts = [];
|
1436
|
-
if (config.selectedWebBundleTeams && config.selectedWebBundleTeams.length > 0) {
|
1437
|
-
parts.push(`teams: ${config.selectedWebBundleTeams.join(', ')}`);
|
1438
|
-
}
|
1439
|
-
if (config.includeIndividualAgents) {
|
1440
|
-
parts.push('individual agents');
|
1441
|
-
}
|
1442
|
-
return parts.length > 0 ? parts.join(' + ') : 'custom selection';
|
1443
|
-
}
|
1444
|
-
default:
|
1445
|
-
return 'selected bundles';
|
1446
|
-
}
|
1447
|
-
}
|
1448
|
-
|
1449
|
-
async installWebBundles(webBundlesDirectory, config, spinner) {
|
1450
|
-
|
1451
|
-
try {
|
1452
|
-
// Find the dist directory in the BMad installation
|
1453
|
-
const distDir = configLoader.getDistPath();
|
1454
|
-
|
1455
|
-
if (!(await fileManager.pathExists(distDir))) {
|
1456
|
-
console.warn('Web bundles not found. Run "npm run build" to generate them.');
|
1457
|
-
return;
|
1458
|
-
}
|
1459
|
-
|
1460
|
-
// Ensure web bundles directory exists
|
1461
|
-
await fileManager.ensureDirectory(webBundlesDirectory);
|
1462
|
-
|
1463
|
-
const webBundleType = config.webBundleType || 'all';
|
1464
|
-
|
1465
|
-
if (webBundleType === 'all') {
|
1466
|
-
// Copy the entire dist directory structure
|
1467
|
-
await fileManager.copyDirectory(distDir, webBundlesDirectory);
|
1468
|
-
console.log(chalk.green(`✓ Installed all web bundles to: ${webBundlesDirectory}`));
|
1469
|
-
} else {
|
1470
|
-
let copiedCount = 0;
|
1471
|
-
|
1472
|
-
// Copy specific selections based on type
|
1473
|
-
if (webBundleType === 'agents' || (webBundleType === 'custom' && config.includeIndividualAgents)) {
|
1474
|
-
const agentsSource = path.join(distDir, 'agents');
|
1475
|
-
const agentsTarget = path.join(webBundlesDirectory, 'agents');
|
1476
|
-
if (await fileManager.pathExists(agentsSource)) {
|
1477
|
-
await fileManager.copyDirectory(agentsSource, agentsTarget);
|
1478
|
-
console.log(chalk.green(`✓ Copied individual agent bundles`));
|
1479
|
-
copiedCount += 10; // Approximate count for agents
|
1480
|
-
}
|
1481
|
-
}
|
1482
|
-
|
1483
|
-
if (webBundleType === 'teams' || webBundleType === 'custom') {
|
1484
|
-
if (config.selectedWebBundleTeams && config.selectedWebBundleTeams.length > 0) {
|
1485
|
-
const teamsSource = path.join(distDir, 'teams');
|
1486
|
-
const teamsTarget = path.join(webBundlesDirectory, 'teams');
|
1487
|
-
await fileManager.ensureDirectory(teamsTarget);
|
1488
|
-
|
1489
|
-
for (const teamId of config.selectedWebBundleTeams) {
|
1490
|
-
const teamFile = `${teamId}.txt`;
|
1491
|
-
const sourcePath = path.join(teamsSource, teamFile);
|
1492
|
-
const targetPath = path.join(teamsTarget, teamFile);
|
1493
|
-
|
1494
|
-
if (await fileManager.pathExists(sourcePath)) {
|
1495
|
-
await fileManager.copyFile(sourcePath, targetPath);
|
1496
|
-
copiedCount++;
|
1497
|
-
console.log(chalk.green(`✓ Copied team bundle: ${teamId}`));
|
1498
|
-
}
|
1499
|
-
}
|
1500
|
-
}
|
1501
|
-
}
|
1502
|
-
|
1503
|
-
// Always copy expansion packs if they exist
|
1504
|
-
const expansionSource = path.join(distDir, 'expansion-packs');
|
1505
|
-
const expansionTarget = path.join(webBundlesDirectory, 'expansion-packs');
|
1506
|
-
if (await fileManager.pathExists(expansionSource)) {
|
1507
|
-
await fileManager.copyDirectory(expansionSource, expansionTarget);
|
1508
|
-
console.log(chalk.green(`✓ Copied expansion pack bundles`));
|
1509
|
-
}
|
1510
|
-
|
1511
|
-
console.log(chalk.green(`✓ Installed ${copiedCount} selected web bundles to: ${webBundlesDirectory}`));
|
1512
|
-
}
|
1513
|
-
} catch (error) {
|
1514
|
-
console.error(`Failed to install web bundles: ${error.message}`);
|
1515
|
-
}
|
1516
|
-
}
|
1517
|
-
|
1518
|
-
async copyCommonItems(installDir, targetSubdir, spinner) {
|
1519
|
-
|
1520
|
-
const fs = require('fs').promises;
|
1521
|
-
const sourceBase = path.dirname(path.dirname(path.dirname(path.dirname(__filename)))); // Go up to project root
|
1522
|
-
const commonPath = path.join(sourceBase, 'common');
|
1523
|
-
const targetPath = path.join(installDir, targetSubdir);
|
1524
|
-
const copiedFiles = [];
|
1525
|
-
|
1526
|
-
// Check if common/ exists
|
1527
|
-
if (!(await fileManager.pathExists(commonPath))) {
|
1528
|
-
console.warn('Warning: common/ folder not found');
|
1529
|
-
return copiedFiles;
|
1530
|
-
}
|
1531
|
-
|
1532
|
-
// Copy all items from common/ to target
|
1533
|
-
const commonItems = await resourceLocator.findFiles('**/*', {
|
1534
|
-
cwd: commonPath,
|
1535
|
-
nodir: true
|
1536
|
-
});
|
1537
|
-
|
1538
|
-
for (const item of commonItems) {
|
1539
|
-
const sourcePath = path.join(commonPath, item);
|
1540
|
-
const destPath = path.join(targetPath, item);
|
1541
|
-
|
1542
|
-
// Read the file content
|
1543
|
-
const content = await fs.readFile(sourcePath, 'utf8');
|
1544
|
-
|
1545
|
-
// Replace {root} with the target subdirectory
|
1546
|
-
const updatedContent = content.replace(/\{root\}/g, targetSubdir);
|
1547
|
-
|
1548
|
-
// Ensure directory exists
|
1549
|
-
await fileManager.ensureDirectory(path.dirname(destPath));
|
1550
|
-
|
1551
|
-
// Write the updated content
|
1552
|
-
await fs.writeFile(destPath, updatedContent, 'utf8');
|
1553
|
-
copiedFiles.push(path.join(targetSubdir, item));
|
1554
|
-
}
|
1555
|
-
|
1556
|
-
console.log(chalk.dim(` Added ${commonItems.length} common utilities`));
|
1557
|
-
return copiedFiles;
|
1558
|
-
}
|
1559
|
-
|
1560
|
-
async detectExpansionPacks(installDir) {
|
1561
|
-
const expansionPacks = {};
|
1562
|
-
const glob = require("glob");
|
1563
|
-
|
1564
|
-
// Find all dot folders that might be expansion packs
|
1565
|
-
const dotFolders = glob.sync(".*", {
|
1566
|
-
cwd: installDir,
|
1567
|
-
ignore: [".git", ".git/**", ".bmad-core", ".bmad-core/**"],
|
1568
|
-
});
|
1569
|
-
|
1570
|
-
for (const folder of dotFolders) {
|
1571
|
-
const folderPath = path.join(installDir, folder);
|
1572
|
-
const stats = await fileManager.pathExists(folderPath);
|
1573
|
-
|
1574
|
-
if (stats) {
|
1575
|
-
// Check if it has a manifest
|
1576
|
-
const manifestPath = path.join(folderPath, "install-manifest.yaml");
|
1577
|
-
if (await fileManager.pathExists(manifestPath)) {
|
1578
|
-
const manifest = await fileManager.readExpansionPackManifest(installDir, folder.substring(1));
|
1579
|
-
if (manifest) {
|
1580
|
-
expansionPacks[folder.substring(1)] = {
|
1581
|
-
path: folderPath,
|
1582
|
-
manifest: manifest,
|
1583
|
-
hasManifest: true
|
1584
|
-
};
|
1585
|
-
}
|
1586
|
-
} else {
|
1587
|
-
// Check if it has a config.yaml (expansion pack without manifest)
|
1588
|
-
const configPath = path.join(folderPath, "config.yaml");
|
1589
|
-
if (await fileManager.pathExists(configPath)) {
|
1590
|
-
expansionPacks[folder.substring(1)] = {
|
1591
|
-
path: folderPath,
|
1592
|
-
manifest: null,
|
1593
|
-
hasManifest: false
|
1594
|
-
};
|
1595
|
-
}
|
1596
|
-
}
|
1597
|
-
}
|
1598
|
-
}
|
1599
|
-
|
1600
|
-
return expansionPacks;
|
1601
|
-
}
|
1602
|
-
|
1603
|
-
async repairExpansionPack(installDir, packId, pack, integrity, spinner) {
|
1604
|
-
spinner.start(`Repairing ${pack.name}...`);
|
1605
|
-
|
1606
|
-
try {
|
1607
|
-
const expansionDotFolder = path.join(installDir, `.${packId}`);
|
1608
|
-
|
1609
|
-
// Back up modified files
|
1610
|
-
if (integrity.modified.length > 0) {
|
1611
|
-
spinner.text = "Backing up modified files...";
|
1612
|
-
for (const file of integrity.modified) {
|
1613
|
-
const filePath = path.join(installDir, file);
|
1614
|
-
if (await fileManager.pathExists(filePath)) {
|
1615
|
-
const backupPath = await fileManager.backupFile(filePath);
|
1616
|
-
console.log(chalk.dim(` Backed up: ${file} → ${path.basename(backupPath)}`));
|
1617
|
-
}
|
1618
|
-
}
|
1619
|
-
}
|
1620
|
-
|
1621
|
-
// Restore missing and modified files
|
1622
|
-
spinner.text = "Restoring files...";
|
1623
|
-
const filesToRestore = [...integrity.missing, ...integrity.modified];
|
1624
|
-
|
1625
|
-
for (const file of filesToRestore) {
|
1626
|
-
// Skip the manifest file itself
|
1627
|
-
if (file.endsWith('install-manifest.yaml')) continue;
|
1628
|
-
|
1629
|
-
const relativePath = file.replace(`.${packId}/`, '');
|
1630
|
-
const sourcePath = path.join(pack.path, relativePath);
|
1631
|
-
const destPath = path.join(installDir, file);
|
1632
|
-
|
1633
|
-
// Check if this is a common/ file that needs special processing
|
1634
|
-
const commonBase = path.dirname(path.dirname(path.dirname(path.dirname(__filename))));
|
1635
|
-
const commonSourcePath = path.join(commonBase, 'common', relativePath);
|
1636
|
-
|
1637
|
-
if (await fileManager.pathExists(commonSourcePath)) {
|
1638
|
-
// This is a common/ file - needs template processing
|
1639
|
-
const fs = require('fs').promises;
|
1640
|
-
const content = await fs.readFile(commonSourcePath, 'utf8');
|
1641
|
-
const updatedContent = content.replace(/\{root\}/g, `.${packId}`);
|
1642
|
-
await fileManager.ensureDirectory(path.dirname(destPath));
|
1643
|
-
await fs.writeFile(destPath, updatedContent, 'utf8');
|
1644
|
-
spinner.text = `Restored: ${file}`;
|
1645
|
-
} else if (await fileManager.pathExists(sourcePath)) {
|
1646
|
-
// Regular file from expansion pack
|
1647
|
-
await fileManager.copyFile(sourcePath, destPath);
|
1648
|
-
spinner.text = `Restored: ${file}`;
|
1649
|
-
} else {
|
1650
|
-
console.warn(chalk.yellow(` Warning: Source file not found: ${file}`));
|
1651
|
-
}
|
1652
|
-
}
|
1653
|
-
|
1654
|
-
spinner.succeed(`${pack.name} repaired successfully!`);
|
1655
|
-
|
1656
|
-
// Show summary
|
1657
|
-
console.log(chalk.green(`\n✓ ${pack.name} repaired!`));
|
1658
|
-
if (integrity.missing.length > 0) {
|
1659
|
-
console.log(chalk.green(` Restored ${integrity.missing.length} missing files`));
|
1660
|
-
}
|
1661
|
-
if (integrity.modified.length > 0) {
|
1662
|
-
console.log(chalk.green(` Restored ${integrity.modified.length} modified files (backups created)`));
|
1663
|
-
}
|
1664
|
-
|
1665
|
-
} catch (error) {
|
1666
|
-
if (spinner) spinner.fail(`Failed to repair ${pack.name}`);
|
1667
|
-
console.error(`Error: ${error.message}`);
|
1668
|
-
}
|
1669
|
-
}
|
1670
|
-
|
1671
|
-
compareVersions(v1, v2) {
|
1672
|
-
// Simple semver comparison
|
1673
|
-
const parts1 = v1.split('.').map(Number);
|
1674
|
-
const parts2 = v2.split('.').map(Number);
|
1675
|
-
|
1676
|
-
for (let i = 0; i < 3; i++) {
|
1677
|
-
const part1 = parts1[i] || 0;
|
1678
|
-
const part2 = parts2[i] || 0;
|
1679
|
-
|
1680
|
-
if (part1 > part2) return 1;
|
1681
|
-
if (part1 < part2) return -1;
|
1682
|
-
}
|
1683
|
-
|
1684
|
-
return 0;
|
1685
|
-
}
|
1686
|
-
|
1687
|
-
async cleanupLegacyYmlFiles(installDir, spinner) {
|
1688
|
-
const glob = require('glob');
|
1689
|
-
const fs = require('fs').promises;
|
1690
|
-
|
1691
|
-
try {
|
1692
|
-
// Find all .yml files in the installation directory
|
1693
|
-
const ymlFiles = glob.sync('**/*.yml', {
|
1694
|
-
cwd: installDir,
|
1695
|
-
ignore: ['**/node_modules/**', '**/.git/**']
|
1696
|
-
});
|
1697
|
-
|
1698
|
-
let deletedCount = 0;
|
1699
|
-
|
1700
|
-
for (const ymlFile of ymlFiles) {
|
1701
|
-
// Check if corresponding .yaml file exists
|
1702
|
-
const yamlFile = ymlFile.replace(/\.yml$/, '.yaml');
|
1703
|
-
const ymlPath = path.join(installDir, ymlFile);
|
1704
|
-
const yamlPath = path.join(installDir, yamlFile);
|
1705
|
-
|
1706
|
-
if (await fileManager.pathExists(yamlPath)) {
|
1707
|
-
// .yaml counterpart exists, delete the .yml file
|
1708
|
-
await fs.unlink(ymlPath);
|
1709
|
-
deletedCount++;
|
1710
|
-
console.log(chalk.dim(` Removed legacy: ${ymlFile} (replaced by ${yamlFile})`));
|
1711
|
-
}
|
1712
|
-
}
|
1713
|
-
|
1714
|
-
if (deletedCount > 0) {
|
1715
|
-
console.log(chalk.green(`✓ Cleaned up ${deletedCount} legacy .yml files`));
|
1716
|
-
}
|
1717
|
-
|
1718
|
-
} catch (error) {
|
1719
|
-
console.warn(`Warning: Could not cleanup legacy .yml files: ${error.message}`);
|
1720
|
-
}
|
1721
|
-
}
|
1722
|
-
|
1723
|
-
async findInstallation() {
|
1724
|
-
// Look for .bmad-core in current directory or parent directories
|
1725
|
-
let currentDir = process.cwd();
|
1726
|
-
|
1727
|
-
while (currentDir !== path.dirname(currentDir)) {
|
1728
|
-
const bmadDir = path.join(currentDir, ".bmad-core");
|
1729
|
-
const manifestPath = path.join(bmadDir, "install-manifest.yaml");
|
1730
|
-
|
1731
|
-
if (await fileManager.pathExists(manifestPath)) {
|
1732
|
-
return bmadDir;
|
1733
|
-
}
|
1734
|
-
|
1735
|
-
currentDir = path.dirname(currentDir);
|
1736
|
-
}
|
1737
|
-
|
1738
|
-
// Also check if we're inside a .bmad-core directory
|
1739
|
-
if (path.basename(process.cwd()) === ".bmad-core") {
|
1740
|
-
const manifestPath = path.join(process.cwd(), "install-manifest.yaml");
|
1741
|
-
if (await fileManager.pathExists(manifestPath)) {
|
1742
|
-
return process.cwd();
|
1743
|
-
}
|
1744
|
-
}
|
1745
|
-
|
1746
|
-
return null;
|
1747
|
-
}
|
1748
|
-
|
1749
|
-
async flatten(options) {
|
1750
|
-
const { spawn } = require('child_process');
|
1751
|
-
const flattenerPath = path.join(__dirname, '..', '..', 'flattener', 'main.js');
|
1752
|
-
|
1753
|
-
const args = [];
|
1754
|
-
if (options.input) {
|
1755
|
-
args.push('--input', options.input);
|
1756
|
-
}
|
1757
|
-
if (options.output) {
|
1758
|
-
args.push('--output', options.output);
|
1759
|
-
}
|
1760
|
-
|
1761
|
-
const child = spawn('node', [flattenerPath, ...args], {
|
1762
|
-
stdio: 'inherit',
|
1763
|
-
cwd: process.cwd()
|
1764
|
-
});
|
1765
|
-
|
1766
|
-
child.on('exit', (code) => {
|
1767
|
-
process.exit(code);
|
1768
|
-
});
|
1769
|
-
}
|
1770
|
-
}
|
1771
|
-
|
1772
|
-
module.exports = new Installer();
|