siesa-agents 2.1.40 → 2.1.41
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 +147 -147
- package/bin/install.js +534 -534
- package/bin/prepare-publish.js +26 -26
- package/bin/restore-folders.js +26 -26
- package/bmad/_config/agent-manifest.csv +20 -20
- package/bmad/_config/agents/bmb-agent-builder.customize.yaml +41 -41
- package/bmad/_config/agents/bmb-module-builder.customize.yaml +41 -41
- package/bmad/_config/agents/bmb-workflow-builder.customize.yaml +41 -41
- package/bmad/_config/files-manifest.csv +469 -469
- package/bmad/_config/ides/claude-code.yaml +6 -6
- package/bmad/_config/manifest.yaml +14 -14
- package/bmad/_config/task-manifest.csv +6 -6
- package/bmad/_config/tool-manifest.csv +1 -1
- package/bmad/_config/workflow-manifest.csv +45 -45
- package/bmad/_memory/config.yaml +11 -11
- package/bmad/bmb/README.md +25 -25
- package/bmad/bmb/agents/agent-builder.md +57 -57
- package/bmad/bmb/agents/module-builder.md +60 -60
- package/bmad/bmb/agents/workflow-builder.md +56 -56
- package/bmad/bmb/config.yaml +12 -12
- package/bmad/bmb/docs/workflows/architecture.md +220 -220
- package/bmad/bmb/docs/workflows/common-workflow-tools.csv +18 -18
- package/bmad/bmb/docs/workflows/csv-data-file-standards.md +206 -206
- package/bmad/bmb/docs/workflows/intent-vs-prescriptive-spectrum.md +220 -220
- package/bmad/bmb/docs/workflows/step-file-rules.md +469 -469
- package/bmad/bmb/docs/workflows/templates/step-01-init-continuable-template.md +241 -241
- package/bmad/bmb/docs/workflows/templates/step-1b-template.md +223 -223
- package/bmad/bmb/docs/workflows/templates/step-file.md +139 -139
- package/bmad/bmb/docs/workflows/templates/step-template.md +290 -290
- package/bmad/bmb/docs/workflows/templates/workflow-template.md +104 -104
- package/bmad/bmb/docs/workflows/templates/workflow.md +58 -58
- package/bmad/bmb/docs/workflows/terms.md +97 -97
- package/bmad/bmb/reference/agents/simple-examples/README.md +223 -223
- package/bmad/bmb/reference/readme.md +3 -3
- package/bmad/bmb/reference/workflows/meal-prep-nutrition/data/dietary-restrictions.csv +17 -17
- package/bmad/bmb/reference/workflows/meal-prep-nutrition/data/macro-calculator.csv +15 -15
- package/bmad/bmb/reference/workflows/meal-prep-nutrition/data/recipe-database.csv +27 -27
- package/bmad/bmb/reference/workflows/meal-prep-nutrition/steps/step-01-init.md +177 -177
- package/bmad/bmb/reference/workflows/meal-prep-nutrition/steps/step-01b-continue.md +121 -121
- package/bmad/bmb/reference/workflows/meal-prep-nutrition/steps/step-02-profile.md +165 -165
- package/bmad/bmb/reference/workflows/meal-prep-nutrition/steps/step-03-assessment.md +154 -154
- package/bmad/bmb/reference/workflows/meal-prep-nutrition/steps/step-04-strategy.md +183 -183
- package/bmad/bmb/reference/workflows/meal-prep-nutrition/steps/step-05-shopping.md +168 -168
- package/bmad/bmb/reference/workflows/meal-prep-nutrition/steps/step-06-prep-schedule.md +195 -195
- package/bmad/bmb/reference/workflows/meal-prep-nutrition/templates/assessment-section.md +25 -25
- package/bmad/bmb/reference/workflows/meal-prep-nutrition/templates/nutrition-plan.md +68 -68
- package/bmad/bmb/reference/workflows/meal-prep-nutrition/templates/prep-schedule-section.md +29 -29
- package/bmad/bmb/reference/workflows/meal-prep-nutrition/templates/profile-section.md +47 -47
- package/bmad/bmb/reference/workflows/meal-prep-nutrition/templates/shopping-section.md +37 -37
- package/bmad/bmb/reference/workflows/meal-prep-nutrition/templates/strategy-section.md +18 -18
- package/bmad/bmb/reference/workflows/meal-prep-nutrition/workflow.md +59 -59
- package/bmad/bmb/workflows/agent/data/agent-compilation.md +273 -273
- package/bmad/bmb/workflows/agent/data/agent-menu-patterns.md +233 -233
- package/bmad/bmb/workflows/agent/data/agent-metadata.md +208 -208
- package/bmad/bmb/workflows/agent/data/brainstorm-context.md +146 -146
- package/bmad/bmb/workflows/agent/data/communication-presets.csv +61 -61
- package/bmad/bmb/workflows/agent/data/critical-actions.md +120 -120
- package/bmad/bmb/workflows/agent/data/expert-agent-architecture.md +236 -236
- package/bmad/bmb/workflows/agent/data/expert-agent-validation.md +173 -173
- package/bmad/bmb/workflows/agent/data/module-agent-validation.md +124 -124
- package/bmad/bmb/workflows/agent/data/persona-properties.md +266 -266
- package/bmad/bmb/workflows/agent/data/principles-crafting.md +292 -292
- package/bmad/bmb/workflows/agent/data/reference/expert-examples/journal-keeper/journal-keeper-sidecar/entries/yy-mm-dd-entry-template.md +16 -16
- package/bmad/bmb/workflows/agent/data/reference/module-examples/architect.md +68 -68
- package/bmad/bmb/workflows/agent/data/simple-agent-architecture.md +204 -204
- package/bmad/bmb/workflows/agent/data/simple-agent-validation.md +132 -132
- package/bmad/bmb/workflows/agent/data/understanding-agent-types.md +222 -222
- package/bmad/bmb/workflows/agent/steps-c/step-01-brainstorm.md +126 -126
- package/bmad/bmb/workflows/agent/steps-c/step-02-discovery.md +168 -168
- package/bmad/bmb/workflows/agent/steps-c/step-03-type-metadata.md +294 -294
- package/bmad/bmb/workflows/agent/steps-c/step-04-persona.md +210 -210
- package/bmad/bmb/workflows/agent/steps-c/step-05-commands-menu.md +176 -176
- package/bmad/bmb/workflows/agent/steps-c/step-06-activation.md +275 -275
- package/bmad/bmb/workflows/agent/steps-c/step-07a-build-simple.md +185 -185
- package/bmad/bmb/workflows/agent/steps-c/step-07b-build-expert.md +201 -201
- package/bmad/bmb/workflows/agent/steps-c/step-07c-build-module.md +258 -258
- package/bmad/bmb/workflows/agent/steps-c/step-08a-plan-traceability.md +203 -203
- package/bmad/bmb/workflows/agent/steps-c/step-08b-metadata-validation.md +135 -135
- package/bmad/bmb/workflows/agent/steps-c/step-08c-persona-validation.md +161 -161
- package/bmad/bmb/workflows/agent/steps-c/step-08d-menu-validation.md +158 -158
- package/bmad/bmb/workflows/agent/steps-c/step-08e-structure-validation.md +306 -306
- package/bmad/bmb/workflows/agent/steps-c/step-08f-sidecar-validation.md +462 -462
- package/bmad/bmb/workflows/agent/steps-c/step-09-celebrate.md +244 -244
- package/bmad/bmb/workflows/agent/steps-e/e-01-load-existing.md +214 -214
- package/bmad/bmb/workflows/agent/steps-e/e-02-discover-edits.md +191 -191
- package/bmad/bmb/workflows/agent/steps-e/e-03a-validate-metadata.md +78 -78
- package/bmad/bmb/workflows/agent/steps-e/e-03b-validate-persona.md +76 -76
- package/bmad/bmb/workflows/agent/steps-e/e-03c-validate-menu.md +75 -75
- package/bmad/bmb/workflows/agent/steps-e/e-03d-validate-structure.md +75 -75
- package/bmad/bmb/workflows/agent/steps-e/e-03e-validate-sidecar.md +78 -78
- package/bmad/bmb/workflows/agent/steps-e/e-03f-validation-summary.md +119 -119
- package/bmad/bmb/workflows/agent/steps-e/e-04-type-metadata.md +122 -122
- package/bmad/bmb/workflows/agent/steps-e/e-05-persona.md +132 -132
- package/bmad/bmb/workflows/agent/steps-e/e-06-commands-menu.md +120 -120
- package/bmad/bmb/workflows/agent/steps-e/e-07-activation.md +122 -122
- package/bmad/bmb/workflows/agent/steps-e/e-08a-edit-simple.md +134 -134
- package/bmad/bmb/workflows/agent/steps-e/e-08b-edit-expert.md +117 -117
- package/bmad/bmb/workflows/agent/steps-e/e-08c-edit-module.md +120 -120
- package/bmad/bmb/workflows/agent/steps-e/e-09a-validate-metadata.md +70 -70
- package/bmad/bmb/workflows/agent/steps-e/e-09b-validate-persona.md +70 -70
- package/bmad/bmb/workflows/agent/steps-e/e-09c-validate-menu.md +69 -69
- package/bmad/bmb/workflows/agent/steps-e/e-09d-validate-structure.md +69 -69
- package/bmad/bmb/workflows/agent/steps-e/e-09e-validate-sidecar.md +70 -70
- package/bmad/bmb/workflows/agent/steps-e/e-09f-validation-summary.md +111 -111
- package/bmad/bmb/workflows/agent/steps-e/e-10-celebrate.md +150 -150
- package/bmad/bmb/workflows/agent/steps-v/v-01-load-review.md +128 -128
- package/bmad/bmb/workflows/agent/steps-v/v-02a-validate-metadata.md +73 -73
- package/bmad/bmb/workflows/agent/steps-v/v-02b-validate-persona.md +72 -72
- package/bmad/bmb/workflows/agent/steps-v/v-02c-validate-menu.md +71 -71
- package/bmad/bmb/workflows/agent/steps-v/v-02d-validate-structure.md +71 -71
- package/bmad/bmb/workflows/agent/steps-v/v-02e-validate-sidecar.md +76 -76
- package/bmad/bmb/workflows/agent/steps-v/v-03-summary.md +100 -100
- package/bmad/bmb/workflows/agent/templates/agent-plan.template.md +5 -5
- package/bmad/bmb/workflows/agent/templates/expert-agent-template/expert-agent.template.md +76 -76
- package/bmad/bmb/workflows/agent/templates/simple-agent.template.md +71 -71
- package/bmad/bmb/workflows/agent/workflow.md +123 -123
- package/bmad/bmb/workflows/create-module/steps/step-01-init.md +156 -156
- package/bmad/bmb/workflows/create-module/steps/step-01b-continue.md +170 -170
- package/bmad/bmb/workflows/create-module/steps/step-02-concept.md +218 -218
- package/bmad/bmb/workflows/create-module/steps/step-03-components.md +268 -268
- package/bmad/bmb/workflows/create-module/steps/step-04-structure.md +229 -229
- package/bmad/bmb/workflows/create-module/steps/step-05-config.md +234 -234
- package/bmad/bmb/workflows/create-module/steps/step-06-agents.md +297 -297
- package/bmad/bmb/workflows/create-module/steps/step-07-workflows.md +229 -229
- package/bmad/bmb/workflows/create-module/steps/step-08-installer.md +187 -187
- package/bmad/bmb/workflows/create-module/steps/step-09-documentation.md +310 -310
- package/bmad/bmb/workflows/create-module/steps/step-10-roadmap.md +338 -338
- package/bmad/bmb/workflows/create-module/steps/step-11-validate.md +336 -336
- package/bmad/bmb/workflows/create-module/templates/agent.template.md +313 -313
- package/bmad/bmb/workflows/create-module/templates/installer.template.js +47 -47
- package/bmad/bmb/workflows/create-module/templates/module-plan.template.md +5 -5
- package/bmad/bmb/workflows/create-module/templates/module.template.yaml +53 -53
- package/bmad/bmb/workflows/create-module/templates/workflow-plan-template.md +23 -23
- package/bmad/bmb/workflows/create-module/validation.md +126 -126
- package/bmad/bmb/workflows/create-module/workflow.md +56 -56
- package/bmad/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/data/dietary-restrictions.csv +17 -17
- package/bmad/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/data/macro-calculator.csv +15 -15
- package/bmad/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/data/recipe-database.csv +27 -27
- package/bmad/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/steps/step-01-init.md +177 -177
- package/bmad/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/steps/step-01b-continue.md +150 -150
- package/bmad/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/steps/step-02-profile.md +164 -164
- package/bmad/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/steps/step-03-assessment.md +152 -152
- package/bmad/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/steps/step-04-strategy.md +182 -182
- package/bmad/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/steps/step-05-shopping.md +167 -167
- package/bmad/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/steps/step-06-prep-schedule.md +194 -194
- package/bmad/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/templates/assessment-section.md +25 -25
- package/bmad/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/templates/nutrition-plan.md +68 -68
- package/bmad/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/templates/prep-schedule-section.md +29 -29
- package/bmad/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/templates/profile-section.md +47 -47
- package/bmad/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/templates/shopping-section.md +37 -37
- package/bmad/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/templates/strategy-section.md +18 -18
- package/bmad/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/workflow.md +58 -58
- package/bmad/bmb/workflows/create-workflow/steps/step-01-init.md +158 -158
- package/bmad/bmb/workflows/create-workflow/steps/step-02-gather.md +212 -212
- package/bmad/bmb/workflows/create-workflow/steps/step-03-tools-configuration.md +251 -251
- package/bmad/bmb/workflows/create-workflow/steps/step-04-plan-review.md +217 -217
- package/bmad/bmb/workflows/create-workflow/steps/step-05-output-format-design.md +290 -290
- package/bmad/bmb/workflows/create-workflow/steps/step-06-design.md +272 -272
- package/bmad/bmb/workflows/create-workflow/steps/step-07-build.md +323 -323
- package/bmad/bmb/workflows/create-workflow/steps/step-08-review.md +285 -285
- package/bmad/bmb/workflows/create-workflow/steps/step-09-complete.md +188 -188
- package/bmad/bmb/workflows/create-workflow/workflow.md +59 -59
- package/bmad/bmb/workflows/edit-workflow/steps/step-01-analyze.md +217 -217
- package/bmad/bmb/workflows/edit-workflow/steps/step-02-discover.md +254 -254
- package/bmad/bmb/workflows/edit-workflow/steps/step-03-improve.md +218 -218
- package/bmad/bmb/workflows/edit-workflow/steps/step-04-validate.md +194 -194
- package/bmad/bmb/workflows/edit-workflow/steps/step-05-compliance-check.md +246 -246
- package/bmad/bmb/workflows/edit-workflow/templates/completion-summary.md +75 -75
- package/bmad/bmb/workflows/edit-workflow/templates/improvement-goals.md +68 -68
- package/bmad/bmb/workflows/edit-workflow/templates/improvement-log.md +40 -40
- package/bmad/bmb/workflows/edit-workflow/templates/validation-results.md +51 -51
- package/bmad/bmb/workflows/edit-workflow/templates/workflow-analysis.md +56 -56
- package/bmad/bmb/workflows/edit-workflow/workflow.md +59 -59
- package/bmad/bmb/workflows/workflow-compliance-check/steps/step-01-validate-goal.md +153 -153
- package/bmad/bmb/workflows/workflow-compliance-check/steps/step-02-workflow-validation.md +244 -244
- package/bmad/bmb/workflows/workflow-compliance-check/steps/step-03-step-validation.md +275 -275
- package/bmad/bmb/workflows/workflow-compliance-check/steps/step-04-file-validation.md +296 -296
- package/bmad/bmb/workflows/workflow-compliance-check/steps/step-05-intent-spectrum-validation.md +265 -265
- package/bmad/bmb/workflows/workflow-compliance-check/steps/step-06-web-subprocess-validation.md +361 -361
- package/bmad/bmb/workflows/workflow-compliance-check/steps/step-07-holistic-analysis.md +259 -259
- package/bmad/bmb/workflows/workflow-compliance-check/steps/step-08-generate-report.md +302 -302
- package/bmad/bmb/workflows/workflow-compliance-check/templates/compliance-report.md +140 -140
- package/bmad/bmb/workflows/workflow-compliance-check/workflow.md +59 -59
- package/bmad/bmb/workflows-legacy/edit-module/README.md +171 -171
- package/bmad/bmb/workflows-legacy/edit-module/checklist.md +163 -163
- package/bmad/bmb/workflows-legacy/edit-module/instructions.md +340 -340
- package/bmad/bmb/workflows-legacy/edit-module/workflow.yaml +32 -32
- package/bmad/bmb/workflows-legacy/module-brief/README.md +264 -264
- package/bmad/bmb/workflows-legacy/module-brief/checklist.md +116 -116
- package/bmad/bmb/workflows-legacy/module-brief/instructions.md +268 -268
- package/bmad/bmb/workflows-legacy/module-brief/template.md +275 -275
- package/bmad/bmb/workflows-legacy/module-brief/workflow.yaml +34 -34
- package/bmad/bmm/agents/analyst.md +76 -76
- package/bmad/bmm/agents/architect.md +68 -68
- package/bmad/bmm/agents/dev.md +70 -70
- package/bmad/bmm/agents/pm.md +70 -70
- package/bmad/bmm/agents/quick-flow-solo-dev.md +68 -68
- package/bmad/bmm/agents/sm.md +71 -71
- package/bmad/bmm/agents/tea.md +71 -71
- package/bmad/bmm/agents/tech-writer.md +72 -72
- package/bmad/bmm/agents/ux-designer.md +68 -68
- package/bmad/bmm/config.yaml +18 -18
- package/bmad/bmm/data/README.md +29 -29
- package/bmad/bmm/data/documentation-standards.md +262 -262
- package/bmad/bmm/data/project-context-template.md +40 -40
- package/bmad/bmm/teams/default-party.csv +21 -21
- package/bmad/bmm/teams/team-fullstack.yaml +12 -12
- package/bmad/bmm/testarch/knowledge/api-request.md +303 -303
- package/bmad/bmm/testarch/knowledge/auth-session.md +356 -356
- package/bmad/bmm/testarch/knowledge/burn-in.md +273 -273
- package/bmad/bmm/testarch/knowledge/ci-burn-in.md +675 -675
- package/bmad/bmm/testarch/knowledge/component-tdd.md +486 -486
- package/bmad/bmm/testarch/knowledge/contract-testing.md +957 -957
- package/bmad/bmm/testarch/knowledge/data-factories.md +500 -500
- package/bmad/bmm/testarch/knowledge/email-auth.md +721 -721
- package/bmad/bmm/testarch/knowledge/error-handling.md +725 -725
- package/bmad/bmm/testarch/knowledge/feature-flags.md +750 -750
- package/bmad/bmm/testarch/knowledge/file-utils.md +260 -260
- package/bmad/bmm/testarch/knowledge/fixture-architecture.md +401 -401
- package/bmad/bmm/testarch/knowledge/fixtures-composition.md +382 -382
- package/bmad/bmm/testarch/knowledge/intercept-network-call.md +280 -280
- package/bmad/bmm/testarch/knowledge/log.md +294 -294
- package/bmad/bmm/testarch/knowledge/network-error-monitor.md +272 -272
- package/bmad/bmm/testarch/knowledge/network-first.md +486 -486
- package/bmad/bmm/testarch/knowledge/network-recorder.md +265 -265
- package/bmad/bmm/testarch/knowledge/nfr-criteria.md +670 -670
- package/bmad/bmm/testarch/knowledge/overview.md +283 -283
- package/bmad/bmm/testarch/knowledge/playwright-config.md +730 -730
- package/bmad/bmm/testarch/knowledge/probability-impact.md +601 -601
- package/bmad/bmm/testarch/knowledge/recurse.md +296 -296
- package/bmad/bmm/testarch/knowledge/risk-governance.md +615 -615
- package/bmad/bmm/testarch/knowledge/selective-testing.md +732 -732
- package/bmad/bmm/testarch/knowledge/selector-resilience.md +527 -527
- package/bmad/bmm/testarch/knowledge/test-healing-patterns.md +644 -644
- package/bmad/bmm/testarch/knowledge/test-levels-framework.md +473 -473
- package/bmad/bmm/testarch/knowledge/test-priorities-matrix.md +373 -373
- package/bmad/bmm/testarch/knowledge/test-quality.md +664 -664
- package/bmad/bmm/testarch/knowledge/timing-debugging.md +372 -372
- package/bmad/bmm/testarch/knowledge/visual-debugging.md +524 -524
- package/bmad/bmm/testarch/tea-index.csv +33 -33
- package/bmad/bmm/workflows/1-analysis/create-product-brief/product-brief.template.md +10 -10
- package/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-01-init.md +182 -182
- package/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-01b-continue.md +166 -166
- package/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-02-vision.md +204 -204
- package/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-03-users.md +207 -207
- package/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-04-metrics.md +210 -210
- package/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-05-scope.md +224 -224
- package/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-06-complete.md +199 -199
- package/bmad/bmm/workflows/1-analysis/create-product-brief/workflow.md +58 -58
- package/bmad/bmm/workflows/1-analysis/research/domain-steps/step-01-init.md +137 -137
- package/bmad/bmm/workflows/1-analysis/research/domain-steps/step-02-domain-analysis.md +229 -229
- package/bmad/bmm/workflows/1-analysis/research/domain-steps/step-03-competitive-landscape.md +238 -238
- package/bmad/bmm/workflows/1-analysis/research/domain-steps/step-04-regulatory-focus.md +206 -206
- package/bmad/bmm/workflows/1-analysis/research/domain-steps/step-05-technical-trends.md +234 -234
- package/bmad/bmm/workflows/1-analysis/research/domain-steps/step-06-research-synthesis.md +443 -443
- package/bmad/bmm/workflows/1-analysis/research/market-steps/step-01-init.md +182 -182
- package/bmad/bmm/workflows/1-analysis/research/market-steps/step-02-customer-behavior.md +237 -237
- package/bmad/bmm/workflows/1-analysis/research/market-steps/step-02-customer-insights.md +200 -200
- package/bmad/bmm/workflows/1-analysis/research/market-steps/step-03-customer-pain-points.md +249 -249
- package/bmad/bmm/workflows/1-analysis/research/market-steps/step-04-customer-decisions.md +259 -259
- package/bmad/bmm/workflows/1-analysis/research/market-steps/step-05-competitive-analysis.md +177 -177
- package/bmad/bmm/workflows/1-analysis/research/market-steps/step-06-research-completion.md +475 -475
- package/bmad/bmm/workflows/1-analysis/research/research.template.md +29 -29
- package/bmad/bmm/workflows/1-analysis/research/technical-steps/step-01-init.md +137 -137
- package/bmad/bmm/workflows/1-analysis/research/technical-steps/step-02-technical-overview.md +239 -239
- package/bmad/bmm/workflows/1-analysis/research/technical-steps/step-03-integration-patterns.md +248 -248
- package/bmad/bmm/workflows/1-analysis/research/technical-steps/step-04-architectural-patterns.md +202 -202
- package/bmad/bmm/workflows/1-analysis/research/technical-steps/step-05-implementation-research.md +239 -239
- package/bmad/bmm/workflows/1-analysis/research/technical-steps/step-06-research-synthesis.md +486 -486
- package/bmad/bmm/workflows/1-analysis/research/workflow.md +173 -173
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01-init.md +135 -135
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01b-continue.md +127 -127
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-02-discovery.md +190 -190
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-03-core-experience.md +216 -216
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-04-emotional-response.md +219 -219
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-05-inspiration.md +234 -234
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-06-design-system.md +252 -252
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-07-defining-experience.md +254 -254
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-08-visual-foundation.md +224 -224
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-09-design-directions.md +224 -224
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-10-user-journeys.md +241 -241
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-11-component-strategy.md +248 -248
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-12-ux-patterns.md +237 -237
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-13-responsive-accessibility.md +264 -264
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-14-complete.md +228 -228
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/ux-design-template.md +13 -13
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/workflow.md +43 -43
- package/bmad/bmm/workflows/2-plan-workflows/prd/domain-complexity.csv +12 -12
- package/bmad/bmm/workflows/2-plan-workflows/prd/prd-template.md +11 -11
- package/bmad/bmm/workflows/2-plan-workflows/prd/project-types.csv +10 -10
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps/step-01-init.md +197 -197
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps/step-01b-continue.md +166 -166
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps/step-02-discovery.md +421 -421
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps/step-03-success.md +290 -290
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps/step-04-journeys.md +291 -291
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps/step-05-domain.md +271 -271
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps/step-06-innovation.md +262 -262
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps/step-07-project-type.md +258 -258
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps/step-08-scoping.md +299 -299
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps/step-09-functional.md +270 -270
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps/step-10-nonfunctional.md +294 -294
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps/step-11-complete.md +186 -186
- package/bmad/bmm/workflows/2-plan-workflows/prd/workflow.md +63 -63
- package/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-01-document-discovery.md +190 -190
- package/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-02-prd-analysis.md +178 -178
- package/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-03-epic-coverage-validation.md +179 -179
- package/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-04-ux-alignment.md +139 -139
- package/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-05-epic-quality-review.md +252 -252
- package/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-06-final-assessment.md +133 -133
- package/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/templates/readiness-report-template.md +4 -4
- package/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/workflow.md +55 -55
- package/bmad/bmm/workflows/3-solutioning/create-architecture/architecture-decision-template.md +12 -12
- package/bmad/bmm/workflows/3-solutioning/create-architecture/data/company-standards/architecture-patterns.md +415 -415
- package/bmad/bmm/workflows/3-solutioning/create-architecture/data/company-standards/backend-standards.md +811 -811
- package/bmad/bmm/workflows/3-solutioning/create-architecture/data/company-standards/frontend-standards.md +375 -375
- package/bmad/bmm/workflows/3-solutioning/create-architecture/data/company-standards/technical-preferences-ux.md +422 -422
- package/bmad/bmm/workflows/3-solutioning/create-architecture/data/company-standards/technology-stack.md +235 -235
- package/bmad/bmm/workflows/3-solutioning/create-architecture/data/domain-complexity.csv +10 -10
- package/bmad/bmm/workflows/3-solutioning/create-architecture/data/project-types.csv +6 -6
- package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-01-init.md +166 -166
- package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-01b-continue.md +164 -164
- package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-02-context.md +224 -224
- package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-03-starter.md +342 -342
- package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-04-decisions.md +328 -328
- package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-05-patterns.md +368 -368
- package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-06-structure.md +379 -379
- package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-07-validation.md +366 -366
- package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-08-complete.md +352 -352
- package/bmad/bmm/workflows/3-solutioning/create-architecture/workflow.md +51 -51
- package/bmad/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-01-validate-prerequisites.md +259 -259
- package/bmad/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-02-design-epics.md +233 -233
- package/bmad/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-03-create-stories.md +272 -272
- package/bmad/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-04-final-validation.md +145 -145
- package/bmad/bmm/workflows/3-solutioning/create-epics-and-stories/templates/epics-template.md +57 -57
- package/bmad/bmm/workflows/3-solutioning/create-epics-and-stories/workflow.md +59 -59
- package/bmad/bmm/workflows/4-implementation/code-review/checklist.md +23 -23
- package/bmad/bmm/workflows/4-implementation/code-review/instructions.xml +224 -224
- package/bmad/bmm/workflows/4-implementation/code-review/workflow.yaml +49 -49
- package/bmad/bmm/workflows/4-implementation/correct-course/checklist.md +279 -279
- package/bmad/bmm/workflows/4-implementation/correct-course/instructions.md +206 -206
- package/bmad/bmm/workflows/4-implementation/correct-course/workflow.yaml +58 -58
- package/bmad/bmm/workflows/4-implementation/create-story/checklist.md +358 -358
- package/bmad/bmm/workflows/4-implementation/create-story/steps/step-01-determine-story.md +85 -85
- package/bmad/bmm/workflows/4-implementation/create-story/steps/step-02-analyze.md +67 -67
- package/bmad/bmm/workflows/4-implementation/create-story/steps/step-03-architecture.md +71 -71
- package/bmad/bmm/workflows/4-implementation/create-story/steps/step-04-web-research.md +58 -58
- package/bmad/bmm/workflows/4-implementation/create-story/steps/step-05-create-file.md +76 -76
- package/bmad/bmm/workflows/4-implementation/create-story/steps/step-06-finalize.md +66 -66
- package/bmad/bmm/workflows/4-implementation/create-story/template.md +49 -49
- package/bmad/bmm/workflows/4-implementation/create-story/workflow.md +58 -58
- package/bmad/bmm/workflows/4-implementation/create-story/workflow.yaml.bak +63 -63
- package/bmad/bmm/workflows/4-implementation/dev-story/checklist.md +85 -85
- package/bmad/bmm/workflows/4-implementation/dev-story/instructions.xml +470 -470
- package/bmad/bmm/workflows/4-implementation/dev-story/workflow.yaml +25 -25
- package/bmad/bmm/workflows/4-implementation/retrospective/instructions.md +1443 -1443
- package/bmad/bmm/workflows/4-implementation/retrospective/workflow.yaml +56 -56
- package/bmad/bmm/workflows/4-implementation/sprint-planning/checklist.md +33 -33
- package/bmad/bmm/workflows/4-implementation/sprint-planning/instructions.md +225 -225
- package/bmad/bmm/workflows/4-implementation/sprint-planning/sprint-status-template.yaml +55 -55
- package/bmad/bmm/workflows/4-implementation/sprint-planning/workflow.yaml +52 -52
- package/bmad/bmm/workflows/4-implementation/sprint-status/instructions.md +229 -229
- package/bmad/bmm/workflows/4-implementation/sprint-status/workflow.yaml +34 -34
- package/bmad/bmm/workflows/bmad-quick-flow/create-tech-spec/steps/step-01-understand.md +189 -189
- package/bmad/bmm/workflows/bmad-quick-flow/create-tech-spec/steps/step-02-investigate.md +144 -144
- package/bmad/bmm/workflows/bmad-quick-flow/create-tech-spec/steps/step-03-generate.md +128 -128
- package/bmad/bmm/workflows/bmad-quick-flow/create-tech-spec/steps/step-04-review.md +173 -173
- package/bmad/bmm/workflows/bmad-quick-flow/create-tech-spec/tech-spec-template.md +74 -74
- package/bmad/bmm/workflows/bmad-quick-flow/create-tech-spec/workflow.md +79 -79
- package/bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-01-mode-detection.md +156 -156
- package/bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-02-context-gathering.md +120 -120
- package/bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-03-execute.md +113 -113
- package/bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-04-self-check.md +113 -113
- package/bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-05-adversarial-review.md +106 -106
- package/bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-06-resolve-findings.md +140 -140
- package/bmad/bmm/workflows/bmad-quick-flow/quick-dev/workflow.md +52 -52
- package/bmad/bmm/workflows/document-project/checklist.md +245 -245
- package/bmad/bmm/workflows/document-project/documentation-requirements.csv +12 -12
- package/bmad/bmm/workflows/document-project/instructions.md +221 -221
- package/bmad/bmm/workflows/document-project/templates/deep-dive-template.md +345 -345
- package/bmad/bmm/workflows/document-project/templates/index-template.md +169 -169
- package/bmad/bmm/workflows/document-project/templates/project-overview-template.md +103 -103
- package/bmad/bmm/workflows/document-project/templates/project-scan-report-schema.json +160 -160
- package/bmad/bmm/workflows/document-project/templates/source-tree-template.md +135 -135
- package/bmad/bmm/workflows/document-project/workflow.yaml +28 -28
- package/bmad/bmm/workflows/document-project/workflows/deep-dive-instructions.md +298 -298
- package/bmad/bmm/workflows/document-project/workflows/deep-dive.yaml +31 -31
- package/bmad/bmm/workflows/document-project/workflows/full-scan-instructions.md +1106 -1106
- package/bmad/bmm/workflows/document-project/workflows/full-scan.yaml +31 -31
- package/bmad/bmm/workflows/excalidraw-diagrams/_shared/excalidraw-library.json +90 -90
- package/bmad/bmm/workflows/excalidraw-diagrams/_shared/excalidraw-templates.yaml +127 -127
- package/bmad/bmm/workflows/excalidraw-diagrams/create-dataflow/checklist.md +39 -39
- package/bmad/bmm/workflows/excalidraw-diagrams/create-dataflow/instructions.md +130 -130
- package/bmad/bmm/workflows/excalidraw-diagrams/create-dataflow/workflow.yaml +25 -25
- package/bmad/bmm/workflows/excalidraw-diagrams/create-diagram/checklist.md +43 -43
- package/bmad/bmm/workflows/excalidraw-diagrams/create-diagram/instructions.md +141 -141
- package/bmad/bmm/workflows/excalidraw-diagrams/create-diagram/workflow.yaml +25 -25
- package/bmad/bmm/workflows/excalidraw-diagrams/create-flowchart/checklist.md +49 -49
- package/bmad/bmm/workflows/excalidraw-diagrams/create-flowchart/instructions.md +241 -241
- package/bmad/bmm/workflows/excalidraw-diagrams/create-flowchart/workflow.yaml +25 -25
- package/bmad/bmm/workflows/excalidraw-diagrams/create-wireframe/checklist.md +38 -38
- package/bmad/bmm/workflows/excalidraw-diagrams/create-wireframe/instructions.md +133 -133
- package/bmad/bmm/workflows/excalidraw-diagrams/create-wireframe/workflow.yaml +25 -25
- package/bmad/bmm/workflows/generate-project-context/project-context-template.md +21 -21
- package/bmad/bmm/workflows/generate-project-context/steps/step-01-discover.md +218 -218
- package/bmad/bmm/workflows/generate-project-context/steps/step-02-generate.md +318 -318
- package/bmad/bmm/workflows/generate-project-context/steps/step-03-complete.md +278 -278
- package/bmad/bmm/workflows/generate-project-context/workflow.md +50 -50
- package/bmad/bmm/workflows/testarch/atdd/atdd-checklist-template.md +364 -364
- package/bmad/bmm/workflows/testarch/atdd/checklist.md +374 -374
- package/bmad/bmm/workflows/testarch/atdd/instructions.md +806 -806
- package/bmad/bmm/workflows/testarch/atdd/workflow.yaml +45 -45
- package/bmad/bmm/workflows/testarch/automate/checklist.md +582 -582
- package/bmad/bmm/workflows/testarch/automate/instructions.md +1324 -1324
- package/bmad/bmm/workflows/testarch/automate/workflow.yaml +52 -52
- package/bmad/bmm/workflows/testarch/ci/checklist.md +248 -248
- package/bmad/bmm/workflows/testarch/ci/github-actions-template.yaml +198 -198
- package/bmad/bmm/workflows/testarch/ci/gitlab-ci-template.yaml +149 -149
- package/bmad/bmm/workflows/testarch/ci/instructions.md +536 -536
- package/bmad/bmm/workflows/testarch/ci/workflow.yaml +45 -45
- package/bmad/bmm/workflows/testarch/framework/checklist.md +321 -321
- package/bmad/bmm/workflows/testarch/framework/instructions.md +481 -481
- package/bmad/bmm/workflows/testarch/framework/workflow.yaml +47 -47
- package/bmad/bmm/workflows/testarch/nfr-assess/checklist.md +407 -407
- package/bmad/bmm/workflows/testarch/nfr-assess/instructions.md +722 -722
- package/bmad/bmm/workflows/testarch/nfr-assess/nfr-report-template.md +445 -445
- package/bmad/bmm/workflows/testarch/nfr-assess/workflow.yaml +47 -47
- package/bmad/bmm/workflows/testarch/test-design/checklist.md +235 -235
- package/bmad/bmm/workflows/testarch/test-design/instructions.md +788 -788
- package/bmad/bmm/workflows/testarch/test-design/test-design-template.md +294 -294
- package/bmad/bmm/workflows/testarch/test-design/workflow.yaml +54 -54
- package/bmad/bmm/workflows/testarch/test-review/checklist.md +472 -472
- package/bmad/bmm/workflows/testarch/test-review/instructions.md +628 -628
- package/bmad/bmm/workflows/testarch/test-review/test-review-template.md +390 -390
- package/bmad/bmm/workflows/testarch/test-review/workflow.yaml +46 -46
- package/bmad/bmm/workflows/testarch/trace/checklist.md +655 -655
- package/bmad/bmm/workflows/testarch/trace/instructions.md +1047 -1047
- package/bmad/bmm/workflows/testarch/trace/trace-template.md +675 -675
- package/bmad/bmm/workflows/testarch/trace/workflow.yaml +55 -55
- package/bmad/bmm/workflows/workflow-status/init/instructions.md +346 -346
- package/bmad/bmm/workflows/workflow-status/init/workflow.yaml +28 -28
- package/bmad/bmm/workflows/workflow-status/instructions.md +395 -395
- package/bmad/bmm/workflows/workflow-status/paths/enterprise-brownfield.yaml +103 -103
- package/bmad/bmm/workflows/workflow-status/paths/enterprise-greenfield.yaml +100 -100
- package/bmad/bmm/workflows/workflow-status/paths/method-brownfield.yaml +103 -103
- package/bmad/bmm/workflows/workflow-status/paths/method-greenfield.yaml +100 -100
- package/bmad/bmm/workflows/workflow-status/project-levels.yaml +59 -59
- package/bmad/bmm/workflows/workflow-status/workflow-status-template.yaml +24 -24
- package/bmad/bmm/workflows/workflow-status/workflow.yaml +30 -30
- package/bmad/cis/agents/brainstorming-coach.md +60 -60
- package/bmad/cis/agents/creative-problem-solver.md +60 -60
- package/bmad/cis/agents/design-thinking-coach.md +60 -60
- package/bmad/cis/agents/innovation-strategist.md +60 -60
- package/bmad/cis/agents/presentation-master.md +66 -66
- package/bmad/cis/agents/storyteller/storyteller.md +57 -57
- package/bmad/cis/config.yaml +11 -11
- package/bmad/cis/teams/creative-squad.yaml +7 -7
- package/bmad/cis/teams/default-party.csv +12 -12
- package/bmad/cis/workflows/README.md +139 -139
- package/bmad/cis/workflows/design-thinking/README.md +56 -56
- package/bmad/cis/workflows/design-thinking/design-methods.csv +30 -30
- package/bmad/cis/workflows/design-thinking/instructions.md +202 -202
- package/bmad/cis/workflows/design-thinking/template.md +111 -111
- package/bmad/cis/workflows/design-thinking/workflow.yaml +27 -27
- package/bmad/cis/workflows/innovation-strategy/README.md +56 -56
- package/bmad/cis/workflows/innovation-strategy/innovation-frameworks.csv +30 -30
- package/bmad/cis/workflows/innovation-strategy/instructions.md +276 -276
- package/bmad/cis/workflows/innovation-strategy/template.md +189 -189
- package/bmad/cis/workflows/innovation-strategy/workflow.yaml +27 -27
- package/bmad/cis/workflows/problem-solving/README.md +56 -56
- package/bmad/cis/workflows/problem-solving/instructions.md +252 -252
- package/bmad/cis/workflows/problem-solving/solving-methods.csv +30 -30
- package/bmad/cis/workflows/problem-solving/template.md +165 -165
- package/bmad/cis/workflows/problem-solving/workflow.yaml +27 -27
- package/bmad/cis/workflows/storytelling/README.md +58 -58
- package/bmad/cis/workflows/storytelling/instructions.md +293 -293
- package/bmad/cis/workflows/storytelling/story-types.csv +25 -25
- package/bmad/cis/workflows/storytelling/template.md +113 -113
- package/bmad/cis/workflows/storytelling/workflow.yaml +27 -27
- package/bmad/core/agents/bmad-master.md +57 -57
- package/bmad/core/config.yaml +9 -9
- package/bmad/core/resources/excalidraw/README.md +160 -160
- package/bmad/core/resources/excalidraw/excalidraw-helpers.md +127 -127
- package/bmad/core/resources/excalidraw/library-loader.md +50 -50
- package/bmad/core/resources/excalidraw/validate-json-instructions.md +79 -79
- package/bmad/core/tasks/index-docs.xml +64 -64
- package/bmad/core/tasks/review-adversarial-general.xml +41 -41
- package/bmad/core/tasks/shard-doc.xml +108 -108
- package/bmad/core/tasks/validate-workflow.xml +88 -88
- package/bmad/core/tasks/workflow.xml +234 -234
- package/bmad/core/workflows/advanced-elicitation/methods.csv +51 -51
- package/bmad/core/workflows/advanced-elicitation/workflow.xml +116 -116
- package/bmad/core/workflows/brainstorming/brain-methods.csv +61 -61
- package/bmad/core/workflows/brainstorming/steps/step-01-session-setup.md +197 -197
- package/bmad/core/workflows/brainstorming/steps/step-01b-continue.md +122 -122
- package/bmad/core/workflows/brainstorming/steps/step-02a-user-selected.md +225 -225
- package/bmad/core/workflows/brainstorming/steps/step-02b-ai-recommended.md +237 -237
- package/bmad/core/workflows/brainstorming/steps/step-02c-random-selection.md +209 -209
- package/bmad/core/workflows/brainstorming/steps/step-02d-progressive-flow.md +264 -264
- package/bmad/core/workflows/brainstorming/steps/step-03-technique-execution.md +340 -340
- package/bmad/core/workflows/brainstorming/steps/step-04-idea-organization.md +303 -303
- package/bmad/core/workflows/brainstorming/template.md +15 -15
- package/bmad/core/workflows/brainstorming/workflow.md +51 -51
- package/bmad/core/workflows/party-mode/steps/step-01-agent-loading.md +139 -139
- package/bmad/core/workflows/party-mode/steps/step-02-discussion-orchestration.md +204 -204
- package/bmad/core/workflows/party-mode/steps/step-03-graceful-exit.md +159 -159
- package/bmad/core/workflows/party-mode/workflow.md +206 -206
- package/claude/hooks/file-restriction-hook.py +51 -51
- package/claude/hooks/track-agent.py +67 -67
- package/claude/settings.local.json +76 -76
- package/gemini/commands/BMad/agents/analyst.toml +6 -0
- package/gemini/commands/BMad/agents/architect.toml +6 -0
- package/gemini/commands/BMad/agents/bmad-master.toml +6 -0
- package/gemini/commands/BMad/agents/bmad-orchestrator.toml +6 -0
- package/gemini/commands/BMad/agents/dev.toml +6 -0
- package/gemini/commands/BMad/agents/pm.toml +6 -0
- package/gemini/commands/BMad/agents/po.toml +6 -0
- package/gemini/commands/BMad/agents/qa.toml +6 -0
- package/gemini/commands/BMad/agents/sm.toml +6 -0
- package/gemini/commands/BMad/agents/ux-expert.toml +6 -0
- package/gemini/commands/BMad/tasks/advanced-elicitation.toml +6 -0
- package/gemini/commands/BMad/tasks/apply-qa-fixes.toml +6 -0
- package/gemini/commands/BMad/tasks/brownfield-create-epic.toml +6 -0
- package/gemini/commands/BMad/tasks/brownfield-create-story.toml +6 -0
- package/gemini/commands/BMad/tasks/correct-course.toml +6 -0
- package/gemini/commands/BMad/tasks/create-brownfield-story.toml +6 -0
- package/gemini/commands/BMad/tasks/create-deep-research-prompt.toml +6 -0
- package/gemini/commands/BMad/tasks/create-doc.toml +6 -0
- package/gemini/commands/BMad/tasks/create-next-story.toml +6 -0
- package/gemini/commands/BMad/tasks/document-project.toml +6 -0
- package/gemini/commands/BMad/tasks/execute-checklist.toml +6 -0
- package/gemini/commands/BMad/tasks/facilitate-brainstorming-session.toml +6 -0
- package/gemini/commands/BMad/tasks/generate-ai-frontend-prompt.toml +6 -0
- package/gemini/commands/BMad/tasks/index-docs.toml +6 -0
- package/gemini/commands/BMad/tasks/kb-mode-interaction.toml +6 -0
- package/gemini/commands/BMad/tasks/nfr-assess.toml +6 -0
- package/gemini/commands/BMad/tasks/qa-gate.toml +6 -0
- package/gemini/commands/BMad/tasks/review-story.toml +6 -0
- package/gemini/commands/BMad/tasks/risk-profile.toml +6 -0
- package/gemini/commands/BMad/tasks/shard-doc.toml +6 -0
- package/gemini/commands/BMad/tasks/test-design.toml +6 -0
- package/gemini/commands/BMad/tasks/trace-requirements.toml +6 -0
- package/gemini/commands/BMad/tasks/validate-next-story.toml +6 -0
- package/github/workflows/publish.yml +150 -150
- package/index.js +9 -9
- package/mcp.json +14 -14
- package/package.json +41 -40
- package/resources/images/Siesa_Logosimbolo_Azul.svg +24 -24
- package/resources/images/Siesa_Logosimbolo_Blanco.svg +24 -24
- package/resources/images/Siesa_Simbolo_Azul.svg +14 -14
- package/resources/images/Siesa_Simbolo_Blanco.svg +14 -14
- package/vscode/mcp.json +15 -15
- package/vscode/settings.json +12 -12
package/bin/install.js
CHANGED
|
@@ -1,535 +1,535 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
const fs = require('fs-extra');
|
|
4
|
-
const path = require('path');
|
|
5
|
-
const { sourceMapsEnabled } = require('process');
|
|
6
|
-
const readline = require('readline');
|
|
7
|
-
|
|
8
|
-
class SiesaBmadInstaller {
|
|
9
|
-
constructor() {
|
|
10
|
-
// Definir las carpetas primero (nombres en el paquete vs nombres finales)
|
|
11
|
-
this.folderMappings = [
|
|
12
|
-
{ source: 'bmad', target: '_bmad' },
|
|
13
|
-
{ source: 'vscode', target: '.vscode' },
|
|
14
|
-
{ source: 'github', target: '.github' },
|
|
15
|
-
{ source: 'claude', target: '.claude' },
|
|
16
|
-
{ source: 'gemini', target: '.gemini' },
|
|
17
|
-
{ source: 'resources', target: '.resources' },
|
|
18
|
-
{ source: 'mcp.json', target: '.mcp.json' }
|
|
19
|
-
];
|
|
20
|
-
|
|
21
|
-
// Lista de archivos que se preservan automáticamente (no se crean backups)
|
|
22
|
-
this.ignoredFiles = [
|
|
23
|
-
'data/technical-preferences.md'
|
|
24
|
-
];
|
|
25
|
-
|
|
26
|
-
this.targetDir = process.cwd();
|
|
27
|
-
// Intentar múltiples ubicaciones posibles para el paquete
|
|
28
|
-
this.packageDir = this.findPackageDir();
|
|
29
|
-
|
|
30
|
-
// Almacenamiento temporal para contenido de archivos ignorados
|
|
31
|
-
this.preservedContent = new Map();
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
showBanner() {
|
|
36
|
-
console.log('\n');
|
|
37
|
-
console.log('███████╗██╗███████╗███████╗ █████╗ █████╗ ██████╗ ███████╗███╗ ██╗████████╗███████╗');
|
|
38
|
-
console.log('██╔════╝██║██╔════╝██╔════╝██╔══██╗ ██╔══██╗██╔════╝ ██╔════╝████╗ ██║╚══██╔══╝██╔════╝');
|
|
39
|
-
console.log('███████╗██║█████╗ ███████╗███████║ ███████║██║ ███╗█████╗ ██╔██╗ ██║ ██║ ███████╗');
|
|
40
|
-
console.log('╚════██║██║██╔══╝ ╚════██║██╔══██║ ██╔══██║██║ ██║██╔══╝ ██║╚██╗██║ ██║ ╚════██║');
|
|
41
|
-
console.log('███████║██║███████╗███████║██║ ██║ ██║ ██║╚██████╔╝███████╗██║ ╚████║ ██║ ███████║');
|
|
42
|
-
console.log('╚══════╝╚═╝╚══════╝╚══════╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚═══╝ ╚═╝ ╚══════╝');
|
|
43
|
-
console.log('');
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
findPackageDir() {
|
|
47
|
-
// Opción 1: directorio padre del bin (instalación normal)
|
|
48
|
-
let packageDir = path.dirname(__dirname);
|
|
49
|
-
|
|
50
|
-
// Debug: mostrar información de diagnóstico
|
|
51
|
-
const debug = process.env.SIESA_DEBUG === '1';
|
|
52
|
-
if (debug) {
|
|
53
|
-
console.log('\n🔍 DEBUG - Buscando directorio del paquete:');
|
|
54
|
-
console.log(` __dirname: ${__dirname}`);
|
|
55
|
-
console.log(` packageDir inicial: ${packageDir}`);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// Verificar si _bmad existe en el directorio inicial
|
|
59
|
-
const bmadPath = path.join(packageDir, '_bmad');
|
|
60
|
-
if (debug) {
|
|
61
|
-
console.log(` Verificando _bmad en: ${bmadPath}`);
|
|
62
|
-
console.log(` ¿Existe _bmad?: ${fs.existsSync(bmadPath)}`);
|
|
63
|
-
|
|
64
|
-
// Listar contenido del directorio
|
|
65
|
-
try {
|
|
66
|
-
const contents = fs.readdirSync(packageDir);
|
|
67
|
-
console.log(` Contenido de packageDir: ${contents.join(', ')}`);
|
|
68
|
-
} catch (e) {
|
|
69
|
-
console.log(` Error listando directorio: ${e.message}`);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// Opción 2: si estamos en npx, buscar en node_modules
|
|
74
|
-
if (!this.hasRequiredFolders(packageDir)) {
|
|
75
|
-
// Para npm 6.14+ y npx, intentar ubicaciones alternativas
|
|
76
|
-
const possiblePaths = [
|
|
77
|
-
path.join(__dirname, '..'), // bin -> paquete
|
|
78
|
-
path.resolve(__dirname, '..'), // alternativa con resolve
|
|
79
|
-
path.resolve(__dirname, '..', '..', 'siesa-agents'), // desde node_modules
|
|
80
|
-
// Intentar buscar basado en __dirname específicamente para npx
|
|
81
|
-
path.resolve(__dirname.replace(/\\bin$|\/bin$/, '')),
|
|
82
|
-
process.cwd(), // directorio actual como último recurso
|
|
83
|
-
];
|
|
84
|
-
|
|
85
|
-
for (const possiblePath of possiblePaths) {
|
|
86
|
-
if (this.hasRequiredFolders(possiblePath)) {
|
|
87
|
-
packageDir = possiblePath;
|
|
88
|
-
if (debug) {
|
|
89
|
-
console.log(` Encontrado en: ${possiblePath}`);
|
|
90
|
-
}
|
|
91
|
-
break;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
return packageDir;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
hasRequiredFolders(dir) {
|
|
100
|
-
return this.folderMappings.some(mapping => {
|
|
101
|
-
const folderPath = path.join(dir, mapping.source);
|
|
102
|
-
return fs.existsSync(folderPath);
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
async install() {
|
|
107
|
-
this.showBanner();
|
|
108
|
-
console.log(' Instalando SIESA Agents...');
|
|
109
|
-
|
|
110
|
-
try {
|
|
111
|
-
// Verificar si ya existe una instalación
|
|
112
|
-
const hasExistingInstallation = this.checkExistingInstallation();
|
|
113
|
-
|
|
114
|
-
if (hasExistingInstallation) {
|
|
115
|
-
console.log('🔄 Instalación existente detectada. Actualizando...');
|
|
116
|
-
await this.update();
|
|
117
|
-
} else {
|
|
118
|
-
console.log('✨ Nueva instalación...');
|
|
119
|
-
await this.performInstallation();
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
console.log('✅ SIESA Agents instalado correctamente!');
|
|
123
|
-
this.showPostInstallMessage();
|
|
124
|
-
|
|
125
|
-
} catch (error) {
|
|
126
|
-
console.error('❌ Error durante la instalación:', error.message);
|
|
127
|
-
process.exit(1);
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
checkExistingInstallation() {
|
|
132
|
-
return this.folderMappings.some(mapping => {
|
|
133
|
-
const targetPath = path.join(this.targetDir, mapping.target);
|
|
134
|
-
return fs.existsSync(targetPath);
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
async checkModifiedFiles() {
|
|
139
|
-
const modifiedFiles = [];
|
|
140
|
-
|
|
141
|
-
for (const mapping of this.folderMappings) {
|
|
142
|
-
const sourcePath = path.join(this.packageDir, mapping.source);
|
|
143
|
-
const targetPath = path.join(this.targetDir, mapping.target);
|
|
144
|
-
|
|
145
|
-
if (!fs.existsSync(sourcePath) || !fs.existsSync(targetPath)) {
|
|
146
|
-
continue;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
// Obtener todos los archivos recursivamente
|
|
150
|
-
const sourceFiles = await this.getAllFiles(sourcePath);
|
|
151
|
-
|
|
152
|
-
for (const sourceFile of sourceFiles) {
|
|
153
|
-
const relativePath = path.relative(sourcePath, sourceFile);
|
|
154
|
-
const targetFile = path.join(targetPath, relativePath);
|
|
155
|
-
|
|
156
|
-
if (fs.existsSync(targetFile)) {
|
|
157
|
-
try {
|
|
158
|
-
// Comparar contenido de archivos
|
|
159
|
-
const sourceContent = await fs.readFile(sourceFile, 'utf8');
|
|
160
|
-
const targetContent = await fs.readFile(targetFile, 'utf8');
|
|
161
|
-
|
|
162
|
-
if (sourceContent !== targetContent) {
|
|
163
|
-
modifiedFiles.push({
|
|
164
|
-
folder: mapping.target,
|
|
165
|
-
file: relativePath,
|
|
166
|
-
fullPath: targetFile,
|
|
167
|
-
is_ignored: this.ignoredFiles.includes(relativePath)
|
|
168
|
-
});
|
|
169
|
-
}
|
|
170
|
-
} catch (error) {
|
|
171
|
-
// Si no se puede leer como texto, comparar como buffer (archivos binarios)
|
|
172
|
-
const sourceBuffer = await fs.readFile(sourceFile);
|
|
173
|
-
const targetBuffer = await fs.readFile(targetFile);
|
|
174
|
-
|
|
175
|
-
if (!sourceBuffer.equals(targetBuffer)) {
|
|
176
|
-
modifiedFiles.push({
|
|
177
|
-
folder: mapping.target,
|
|
178
|
-
file: relativePath,
|
|
179
|
-
fullPath: targetFile,
|
|
180
|
-
is_ignored: this.ignoredFiles.includes(relativePath)
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
return modifiedFiles;
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
async getAllFiles(dir) {
|
|
192
|
-
const files = [];
|
|
193
|
-
const stat = await fs.stat(dir);
|
|
194
|
-
if (stat.isFile()) {
|
|
195
|
-
files.push(dir);
|
|
196
|
-
return files;
|
|
197
|
-
}
|
|
198
|
-
const items = await fs.readdir(dir);
|
|
199
|
-
for (const item of items) {
|
|
200
|
-
const fullPath = path.join(dir, item);
|
|
201
|
-
const stat = await fs.stat(fullPath);
|
|
202
|
-
|
|
203
|
-
if (stat.isDirectory()) {
|
|
204
|
-
const subFiles = await this.getAllFiles(fullPath);
|
|
205
|
-
files.push(...subFiles);
|
|
206
|
-
} else {
|
|
207
|
-
files.push(fullPath);
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
return files;
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
async promptUser(modifiedFiles) {
|
|
215
|
-
|
|
216
|
-
const hasNonIgnoredFiles = modifiedFiles.some(file => file.is_ignored == false)
|
|
217
|
-
if (!hasNonIgnoredFiles) return '2'
|
|
218
|
-
|
|
219
|
-
console.log('\n⚠️ Se detectaron archivos modificados:');
|
|
220
|
-
|
|
221
|
-
// Agrupar por carpeta
|
|
222
|
-
const filesByFolder = {};
|
|
223
|
-
modifiedFiles.forEach(item => {
|
|
224
|
-
if (!filesByFolder[item.folder]) {
|
|
225
|
-
filesByFolder[item.folder] = [];
|
|
226
|
-
}
|
|
227
|
-
filesByFolder[item.folder].push(item.file);
|
|
228
|
-
});
|
|
229
|
-
|
|
230
|
-
// Mostrar archivos modificados por carpeta
|
|
231
|
-
Object.keys(filesByFolder).forEach(folder => {
|
|
232
|
-
console.log(`\n📁 ${folder}:`);
|
|
233
|
-
filesByFolder[folder].forEach(file => {
|
|
234
|
-
console.log(` - ${file}`);
|
|
235
|
-
});
|
|
236
|
-
});
|
|
237
|
-
|
|
238
|
-
console.log('\n¿Qué deseas hacer?');
|
|
239
|
-
console.log('1. Reemplazar todos los archivos (se perderán las modificaciones)');
|
|
240
|
-
console.log('2. Hacer backup de archivos modificados (se agregarán con sufijo _bk)');
|
|
241
|
-
|
|
242
|
-
const rl = readline.createInterface({
|
|
243
|
-
input: process.stdin,
|
|
244
|
-
output: process.stdout
|
|
245
|
-
});
|
|
246
|
-
|
|
247
|
-
return new Promise((resolve) => {
|
|
248
|
-
rl.question('\nElige una opción (1 o 2): ', (answer) => {
|
|
249
|
-
rl.close();
|
|
250
|
-
resolve(answer.trim());
|
|
251
|
-
});
|
|
252
|
-
});
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
async backupModifiedFiles(modifiedFiles) {
|
|
256
|
-
console.log('\n🔄 Creando backup de archivos modificados...');
|
|
257
|
-
|
|
258
|
-
for (const item of modifiedFiles) {
|
|
259
|
-
// No crear backup de archivos ignorados
|
|
260
|
-
if (item.is_ignored) {
|
|
261
|
-
console.log(`✓ Preservando: ${item.file} (sin backup)`);
|
|
262
|
-
continue;
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
const originalPath = item.fullPath;
|
|
266
|
-
const backupPath = this.getBackupPath(originalPath);
|
|
267
|
-
|
|
268
|
-
try {
|
|
269
|
-
await fs.copy(originalPath, backupPath);
|
|
270
|
-
|
|
271
|
-
// Determinar tipo de backup para mostrar mensaje apropiado
|
|
272
|
-
const backupName = path.basename(backupPath);
|
|
273
|
-
const isVersionedBackup = backupName.includes('_bk_');
|
|
274
|
-
|
|
275
|
-
if (isVersionedBackup) {
|
|
276
|
-
console.log(`✓ Backup versionado: ${path.relative(this.targetDir, backupPath)}`);
|
|
277
|
-
} else {
|
|
278
|
-
console.log(`✓ Backup creado: ${path.relative(this.targetDir, backupPath)}`);
|
|
279
|
-
}
|
|
280
|
-
} catch (error) {
|
|
281
|
-
console.warn(`⚠️ Error creando backup de ${item.file}: ${error.message}`);
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
getBackupPath(filePath) {
|
|
287
|
-
const dir = path.dirname(filePath);
|
|
288
|
-
const ext = path.extname(filePath);
|
|
289
|
-
const name = path.basename(filePath, ext);
|
|
290
|
-
|
|
291
|
-
// Primer intento: archivo_bk.ext
|
|
292
|
-
const basicBackupPath = path.join(dir, `${name}_bk${ext}`);
|
|
293
|
-
|
|
294
|
-
// Si no existe, usar el nombre básico
|
|
295
|
-
if (!fs.existsSync(basicBackupPath)) {
|
|
296
|
-
return basicBackupPath;
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
// Si ya existe _bk, crear versión con timestamp
|
|
300
|
-
const now = new Date();
|
|
301
|
-
const timestamp = now.getFullYear().toString() +
|
|
302
|
-
(now.getMonth() + 1).toString().padStart(2, '0') +
|
|
303
|
-
now.getDate().toString().padStart(2, '0') + '_' +
|
|
304
|
-
now.getHours().toString().padStart(2, '0') +
|
|
305
|
-
now.getMinutes().toString().padStart(2, '0') +
|
|
306
|
-
now.getSeconds().toString().padStart(2, '0');
|
|
307
|
-
|
|
308
|
-
return path.join(dir, `${name}_bk_${timestamp}${ext}`);
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
async performUpdateWithBackups() {
|
|
312
|
-
for (const mapping of this.folderMappings) {
|
|
313
|
-
const sourcePath = path.join(this.packageDir, mapping.source);
|
|
314
|
-
const targetPath = path.join(this.targetDir, mapping.target);
|
|
315
|
-
|
|
316
|
-
if (fs.existsSync(sourcePath)) {
|
|
317
|
-
// Copiar archivos selectivamente, preservando los _bk
|
|
318
|
-
await this.copyWithBackupPreservation(sourcePath, targetPath);
|
|
319
|
-
} else {
|
|
320
|
-
console.warn(`⚠️ Carpeta ${mapping.source} no encontrada en el paquete`);
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
async copyWithBackupPreservation(sourcePath, targetPath) {
|
|
326
|
-
// Obtener todos los archivos backup existentes
|
|
327
|
-
const backupFiles = await this.findBackupFiles(targetPath);
|
|
328
|
-
|
|
329
|
-
// Copiar la carpeta preservando technical-preferences.md
|
|
330
|
-
await fs.copy(sourcePath, targetPath, {
|
|
331
|
-
overwrite: true,
|
|
332
|
-
recursive: true,
|
|
333
|
-
filter: (src) => {
|
|
334
|
-
const relativePath = path.relative(sourcePath, src);
|
|
335
|
-
// No sobrescribir archivos ignorados si ya existen
|
|
336
|
-
if (this.ignoredFiles.includes(relativePath)) {
|
|
337
|
-
const targetFile = path.join(targetPath, relativePath);
|
|
338
|
-
return !fs.existsSync(targetFile);
|
|
339
|
-
}
|
|
340
|
-
return true;
|
|
341
|
-
}
|
|
342
|
-
});
|
|
343
|
-
|
|
344
|
-
// Restaurar los archivos backup
|
|
345
|
-
for (const backupFile of backupFiles) {
|
|
346
|
-
const backupSourcePath = backupFile.tempPath;
|
|
347
|
-
const backupTargetPath = backupFile.originalPath;
|
|
348
|
-
|
|
349
|
-
try {
|
|
350
|
-
await fs.copy(backupSourcePath, backupTargetPath);
|
|
351
|
-
// Limpiar archivo temporal
|
|
352
|
-
await fs.remove(backupSourcePath);
|
|
353
|
-
} catch (error) {
|
|
354
|
-
console.warn(`⚠️ Error restaurando backup ${backupFile.relativePath}: ${error.message}`);
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
async findBackupFiles(targetPath) {
|
|
360
|
-
if (!fs.existsSync(targetPath)) {
|
|
361
|
-
return [];
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
const backupFiles = [];
|
|
365
|
-
const allFiles = await this.getAllFiles(targetPath);
|
|
366
|
-
|
|
367
|
-
for (const filePath of allFiles) {
|
|
368
|
-
const fileName = path.basename(filePath);
|
|
369
|
-
// Detectar archivos _bk y _bk_timestamp
|
|
370
|
-
if (fileName.includes('_bk')) {
|
|
371
|
-
const tempPath = path.join(require('os').tmpdir(), `backup_${Date.now()}_${fileName}`);
|
|
372
|
-
const relativePath = path.relative(targetPath, filePath);
|
|
373
|
-
|
|
374
|
-
// Crear copia temporal del backup
|
|
375
|
-
await fs.copy(filePath, tempPath);
|
|
376
|
-
|
|
377
|
-
backupFiles.push({
|
|
378
|
-
originalPath: filePath,
|
|
379
|
-
tempPath: tempPath,
|
|
380
|
-
relativePath: relativePath
|
|
381
|
-
});
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
return backupFiles;
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
async performInstallation() {
|
|
389
|
-
for (const mapping of this.folderMappings) {
|
|
390
|
-
const sourcePath = path.join(this.packageDir, mapping.source);
|
|
391
|
-
const targetPath = path.join(this.targetDir, mapping.target);
|
|
392
|
-
|
|
393
|
-
if (fs.existsSync(sourcePath)) {
|
|
394
|
-
await fs.copy(sourcePath, targetPath, {
|
|
395
|
-
overwrite: true,
|
|
396
|
-
recursive: true,
|
|
397
|
-
filter: (src) => {
|
|
398
|
-
const relativePath = path.relative(sourcePath, src);
|
|
399
|
-
// No sobrescribir archivos ignorados si ya existen
|
|
400
|
-
if (this.ignoredFiles.includes(relativePath)) {
|
|
401
|
-
const targetFile = path.join(targetPath, relativePath);
|
|
402
|
-
return !fs.existsSync(targetFile);
|
|
403
|
-
}
|
|
404
|
-
return true;
|
|
405
|
-
}
|
|
406
|
-
});
|
|
407
|
-
} else {
|
|
408
|
-
console.warn(`⚠️ Carpeta ${mapping.source} no encontrada en el paquete`);
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
|
|
413
|
-
async update() {
|
|
414
|
-
// Verificar archivos modificados
|
|
415
|
-
console.log('🔍 Verificando archivos modificados...');
|
|
416
|
-
const modifiedFiles = await this.checkModifiedFiles();
|
|
417
|
-
|
|
418
|
-
let hasBackups = false;
|
|
419
|
-
if (modifiedFiles.length > 0) {
|
|
420
|
-
const userChoice = await this.promptUser(modifiedFiles);
|
|
421
|
-
|
|
422
|
-
if (userChoice === '2') {
|
|
423
|
-
// Crear backup de archivos modificados
|
|
424
|
-
await this.backupModifiedFiles(modifiedFiles);
|
|
425
|
-
hasBackups = true;
|
|
426
|
-
} else if (userChoice !== '1') {
|
|
427
|
-
console.log('❌ Opción no válida. Cancelando actualización.');
|
|
428
|
-
return;
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
console.log('\n🔄 Procediendo con la actualización...');
|
|
432
|
-
} else {
|
|
433
|
-
console.log('✓ No se detectaron archivos modificados.');
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
// Si hay backups, hacer actualización preservando backups
|
|
437
|
-
if (hasBackups) {
|
|
438
|
-
await this.performUpdateWithBackups();
|
|
439
|
-
} else {
|
|
440
|
-
// Si no hay backups, hacer actualización normal (remover y copiar)
|
|
441
|
-
// Pero primero preservar archivos ignorados
|
|
442
|
-
await this.preserveIgnoredFiles();
|
|
443
|
-
|
|
444
|
-
for (const mapping of this.folderMappings) {
|
|
445
|
-
const targetPath = path.join(this.targetDir, mapping.target);
|
|
446
|
-
|
|
447
|
-
if (fs.existsSync(targetPath)) {
|
|
448
|
-
await fs.remove(targetPath);
|
|
449
|
-
}
|
|
450
|
-
}
|
|
451
|
-
|
|
452
|
-
// Realizar instalación nueva
|
|
453
|
-
await this.performInstallation();
|
|
454
|
-
|
|
455
|
-
// Restaurar archivos ignorados
|
|
456
|
-
await this.restoreIgnoredFiles();
|
|
457
|
-
}
|
|
458
|
-
}
|
|
459
|
-
|
|
460
|
-
async preserveIgnoredFiles() {
|
|
461
|
-
console.log('🔒 Preservando archivos de configuración...');
|
|
462
|
-
|
|
463
|
-
for (const mapping of this.folderMappings) {
|
|
464
|
-
const targetFolderPath = path.join(this.targetDir, mapping.target);
|
|
465
|
-
|
|
466
|
-
if (!fs.existsSync(targetFolderPath)) {
|
|
467
|
-
continue;
|
|
468
|
-
}
|
|
469
|
-
|
|
470
|
-
for (const ignoredFile of this.ignoredFiles) {
|
|
471
|
-
const filePath = path.join(targetFolderPath, ignoredFile);
|
|
472
|
-
|
|
473
|
-
if (fs.existsSync(filePath)) {
|
|
474
|
-
try {
|
|
475
|
-
const content = await fs.readFile(filePath, 'utf8');
|
|
476
|
-
const key = `${mapping.target}/${ignoredFile}`;
|
|
477
|
-
this.preservedContent.set(key, content);
|
|
478
|
-
console.log(`✓ Preservando: ${ignoredFile}`);
|
|
479
|
-
} catch (error) {
|
|
480
|
-
console.warn(`⚠️ Error leyendo ${ignoredFile}: ${error.message}`);
|
|
481
|
-
}
|
|
482
|
-
}
|
|
483
|
-
}
|
|
484
|
-
}
|
|
485
|
-
}
|
|
486
|
-
|
|
487
|
-
async restoreIgnoredFiles() {
|
|
488
|
-
if (this.preservedContent.size === 0) {
|
|
489
|
-
return;
|
|
490
|
-
}
|
|
491
|
-
|
|
492
|
-
console.log('🔄 Restaurando archivos de configuración...');
|
|
493
|
-
|
|
494
|
-
for (const [key, content] of this.preservedContent) {
|
|
495
|
-
const [targetFolder, ...filePathParts] = key.split('/');
|
|
496
|
-
const filePath = path.join(this.targetDir, targetFolder, ...filePathParts);
|
|
497
|
-
|
|
498
|
-
try {
|
|
499
|
-
// Asegurar que el directorio existe
|
|
500
|
-
await fs.ensureDir(path.dirname(filePath));
|
|
501
|
-
|
|
502
|
-
// Restaurar el contenido
|
|
503
|
-
await fs.writeFile(filePath, content, 'utf8');
|
|
504
|
-
console.log(`✓ Restaurado: ${filePathParts.join('/')}`);
|
|
505
|
-
} catch (error) {
|
|
506
|
-
console.warn(`⚠️ Error restaurando ${filePathParts.join('/')}: ${error.message}`);
|
|
507
|
-
}
|
|
508
|
-
}
|
|
509
|
-
|
|
510
|
-
// Limpiar el mapa después de restaurar
|
|
511
|
-
this.preservedContent.clear();
|
|
512
|
-
}
|
|
513
|
-
|
|
514
|
-
showPostInstallMessage() {
|
|
515
|
-
console.log('\n📚 Carpetas instaladas:');
|
|
516
|
-
this.folderMappings.forEach(mapping => {
|
|
517
|
-
const targetPath = path.join(this.targetDir, mapping.target);
|
|
518
|
-
if (fs.existsSync(targetPath)) {
|
|
519
|
-
console.log(` ✓ ${mapping.target}`);
|
|
520
|
-
}
|
|
521
|
-
});
|
|
522
|
-
|
|
523
|
-
console.log('\n🎉 ¡Instalación completada!');
|
|
524
|
-
console.log('💡 Las carpetas han sido instaladas en tu directorio actual.');
|
|
525
|
-
console.log('🔧 Puedes ejecutar "npx siesa-agents" nuevamente para actualizar.');
|
|
526
|
-
}
|
|
527
|
-
}
|
|
528
|
-
|
|
529
|
-
// Ejecutar instalación si el script es llamado directamente
|
|
530
|
-
if (require.main === module) {
|
|
531
|
-
const installer = new SiesaBmadInstaller();
|
|
532
|
-
installer.install();
|
|
533
|
-
}
|
|
534
|
-
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const fs = require('fs-extra');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
const { sourceMapsEnabled } = require('process');
|
|
6
|
+
const readline = require('readline');
|
|
7
|
+
|
|
8
|
+
class SiesaBmadInstaller {
|
|
9
|
+
constructor() {
|
|
10
|
+
// Definir las carpetas primero (nombres en el paquete vs nombres finales)
|
|
11
|
+
this.folderMappings = [
|
|
12
|
+
{ source: 'bmad', target: '_bmad' },
|
|
13
|
+
{ source: 'vscode', target: '.vscode' },
|
|
14
|
+
{ source: 'github', target: '.github' },
|
|
15
|
+
{ source: 'claude', target: '.claude' },
|
|
16
|
+
{ source: 'gemini', target: '.gemini' },
|
|
17
|
+
{ source: 'resources', target: '.resources' },
|
|
18
|
+
{ source: 'mcp.json', target: '.mcp.json' }
|
|
19
|
+
];
|
|
20
|
+
|
|
21
|
+
// Lista de archivos que se preservan automáticamente (no se crean backups)
|
|
22
|
+
this.ignoredFiles = [
|
|
23
|
+
'data/technical-preferences.md'
|
|
24
|
+
];
|
|
25
|
+
|
|
26
|
+
this.targetDir = process.cwd();
|
|
27
|
+
// Intentar múltiples ubicaciones posibles para el paquete
|
|
28
|
+
this.packageDir = this.findPackageDir();
|
|
29
|
+
|
|
30
|
+
// Almacenamiento temporal para contenido de archivos ignorados
|
|
31
|
+
this.preservedContent = new Map();
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
showBanner() {
|
|
36
|
+
console.log('\n');
|
|
37
|
+
console.log('███████╗██╗███████╗███████╗ █████╗ █████╗ ██████╗ ███████╗███╗ ██╗████████╗███████╗');
|
|
38
|
+
console.log('██╔════╝██║██╔════╝██╔════╝██╔══██╗ ██╔══██╗██╔════╝ ██╔════╝████╗ ██║╚══██╔══╝██╔════╝');
|
|
39
|
+
console.log('███████╗██║█████╗ ███████╗███████║ ███████║██║ ███╗█████╗ ██╔██╗ ██║ ██║ ███████╗');
|
|
40
|
+
console.log('╚════██║██║██╔══╝ ╚════██║██╔══██║ ██╔══██║██║ ██║██╔══╝ ██║╚██╗██║ ██║ ╚════██║');
|
|
41
|
+
console.log('███████║██║███████╗███████║██║ ██║ ██║ ██║╚██████╔╝███████╗██║ ╚████║ ██║ ███████║');
|
|
42
|
+
console.log('╚══════╝╚═╝╚══════╝╚══════╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚═══╝ ╚═╝ ╚══════╝');
|
|
43
|
+
console.log('');
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
findPackageDir() {
|
|
47
|
+
// Opción 1: directorio padre del bin (instalación normal)
|
|
48
|
+
let packageDir = path.dirname(__dirname);
|
|
49
|
+
|
|
50
|
+
// Debug: mostrar información de diagnóstico
|
|
51
|
+
const debug = process.env.SIESA_DEBUG === '1';
|
|
52
|
+
if (debug) {
|
|
53
|
+
console.log('\n🔍 DEBUG - Buscando directorio del paquete:');
|
|
54
|
+
console.log(` __dirname: ${__dirname}`);
|
|
55
|
+
console.log(` packageDir inicial: ${packageDir}`);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Verificar si _bmad existe en el directorio inicial
|
|
59
|
+
const bmadPath = path.join(packageDir, '_bmad');
|
|
60
|
+
if (debug) {
|
|
61
|
+
console.log(` Verificando _bmad en: ${bmadPath}`);
|
|
62
|
+
console.log(` ¿Existe _bmad?: ${fs.existsSync(bmadPath)}`);
|
|
63
|
+
|
|
64
|
+
// Listar contenido del directorio
|
|
65
|
+
try {
|
|
66
|
+
const contents = fs.readdirSync(packageDir);
|
|
67
|
+
console.log(` Contenido de packageDir: ${contents.join(', ')}`);
|
|
68
|
+
} catch (e) {
|
|
69
|
+
console.log(` Error listando directorio: ${e.message}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Opción 2: si estamos en npx, buscar en node_modules
|
|
74
|
+
if (!this.hasRequiredFolders(packageDir)) {
|
|
75
|
+
// Para npm 6.14+ y npx, intentar ubicaciones alternativas
|
|
76
|
+
const possiblePaths = [
|
|
77
|
+
path.join(__dirname, '..'), // bin -> paquete
|
|
78
|
+
path.resolve(__dirname, '..'), // alternativa con resolve
|
|
79
|
+
path.resolve(__dirname, '..', '..', 'siesa-agents'), // desde node_modules
|
|
80
|
+
// Intentar buscar basado en __dirname específicamente para npx
|
|
81
|
+
path.resolve(__dirname.replace(/\\bin$|\/bin$/, '')),
|
|
82
|
+
process.cwd(), // directorio actual como último recurso
|
|
83
|
+
];
|
|
84
|
+
|
|
85
|
+
for (const possiblePath of possiblePaths) {
|
|
86
|
+
if (this.hasRequiredFolders(possiblePath)) {
|
|
87
|
+
packageDir = possiblePath;
|
|
88
|
+
if (debug) {
|
|
89
|
+
console.log(` Encontrado en: ${possiblePath}`);
|
|
90
|
+
}
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return packageDir;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
hasRequiredFolders(dir) {
|
|
100
|
+
return this.folderMappings.some(mapping => {
|
|
101
|
+
const folderPath = path.join(dir, mapping.source);
|
|
102
|
+
return fs.existsSync(folderPath);
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
async install() {
|
|
107
|
+
this.showBanner();
|
|
108
|
+
console.log(' Instalando SIESA Agents...');
|
|
109
|
+
|
|
110
|
+
try {
|
|
111
|
+
// Verificar si ya existe una instalación
|
|
112
|
+
const hasExistingInstallation = this.checkExistingInstallation();
|
|
113
|
+
|
|
114
|
+
if (hasExistingInstallation) {
|
|
115
|
+
console.log('🔄 Instalación existente detectada. Actualizando...');
|
|
116
|
+
await this.update();
|
|
117
|
+
} else {
|
|
118
|
+
console.log('✨ Nueva instalación...');
|
|
119
|
+
await this.performInstallation();
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
console.log('✅ SIESA Agents instalado correctamente!');
|
|
123
|
+
this.showPostInstallMessage();
|
|
124
|
+
|
|
125
|
+
} catch (error) {
|
|
126
|
+
console.error('❌ Error durante la instalación:', error.message);
|
|
127
|
+
process.exit(1);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
checkExistingInstallation() {
|
|
132
|
+
return this.folderMappings.some(mapping => {
|
|
133
|
+
const targetPath = path.join(this.targetDir, mapping.target);
|
|
134
|
+
return fs.existsSync(targetPath);
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
async checkModifiedFiles() {
|
|
139
|
+
const modifiedFiles = [];
|
|
140
|
+
|
|
141
|
+
for (const mapping of this.folderMappings) {
|
|
142
|
+
const sourcePath = path.join(this.packageDir, mapping.source);
|
|
143
|
+
const targetPath = path.join(this.targetDir, mapping.target);
|
|
144
|
+
|
|
145
|
+
if (!fs.existsSync(sourcePath) || !fs.existsSync(targetPath)) {
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Obtener todos los archivos recursivamente
|
|
150
|
+
const sourceFiles = await this.getAllFiles(sourcePath);
|
|
151
|
+
|
|
152
|
+
for (const sourceFile of sourceFiles) {
|
|
153
|
+
const relativePath = path.relative(sourcePath, sourceFile);
|
|
154
|
+
const targetFile = path.join(targetPath, relativePath);
|
|
155
|
+
|
|
156
|
+
if (fs.existsSync(targetFile)) {
|
|
157
|
+
try {
|
|
158
|
+
// Comparar contenido de archivos
|
|
159
|
+
const sourceContent = await fs.readFile(sourceFile, 'utf8');
|
|
160
|
+
const targetContent = await fs.readFile(targetFile, 'utf8');
|
|
161
|
+
|
|
162
|
+
if (sourceContent !== targetContent) {
|
|
163
|
+
modifiedFiles.push({
|
|
164
|
+
folder: mapping.target,
|
|
165
|
+
file: relativePath,
|
|
166
|
+
fullPath: targetFile,
|
|
167
|
+
is_ignored: this.ignoredFiles.includes(relativePath)
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
} catch (error) {
|
|
171
|
+
// Si no se puede leer como texto, comparar como buffer (archivos binarios)
|
|
172
|
+
const sourceBuffer = await fs.readFile(sourceFile);
|
|
173
|
+
const targetBuffer = await fs.readFile(targetFile);
|
|
174
|
+
|
|
175
|
+
if (!sourceBuffer.equals(targetBuffer)) {
|
|
176
|
+
modifiedFiles.push({
|
|
177
|
+
folder: mapping.target,
|
|
178
|
+
file: relativePath,
|
|
179
|
+
fullPath: targetFile,
|
|
180
|
+
is_ignored: this.ignoredFiles.includes(relativePath)
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
return modifiedFiles;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
async getAllFiles(dir) {
|
|
192
|
+
const files = [];
|
|
193
|
+
const stat = await fs.stat(dir);
|
|
194
|
+
if (stat.isFile()) {
|
|
195
|
+
files.push(dir);
|
|
196
|
+
return files;
|
|
197
|
+
}
|
|
198
|
+
const items = await fs.readdir(dir);
|
|
199
|
+
for (const item of items) {
|
|
200
|
+
const fullPath = path.join(dir, item);
|
|
201
|
+
const stat = await fs.stat(fullPath);
|
|
202
|
+
|
|
203
|
+
if (stat.isDirectory()) {
|
|
204
|
+
const subFiles = await this.getAllFiles(fullPath);
|
|
205
|
+
files.push(...subFiles);
|
|
206
|
+
} else {
|
|
207
|
+
files.push(fullPath);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
return files;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
async promptUser(modifiedFiles) {
|
|
215
|
+
|
|
216
|
+
const hasNonIgnoredFiles = modifiedFiles.some(file => file.is_ignored == false)
|
|
217
|
+
if (!hasNonIgnoredFiles) return '2'
|
|
218
|
+
|
|
219
|
+
console.log('\n⚠️ Se detectaron archivos modificados:');
|
|
220
|
+
|
|
221
|
+
// Agrupar por carpeta
|
|
222
|
+
const filesByFolder = {};
|
|
223
|
+
modifiedFiles.forEach(item => {
|
|
224
|
+
if (!filesByFolder[item.folder]) {
|
|
225
|
+
filesByFolder[item.folder] = [];
|
|
226
|
+
}
|
|
227
|
+
filesByFolder[item.folder].push(item.file);
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
// Mostrar archivos modificados por carpeta
|
|
231
|
+
Object.keys(filesByFolder).forEach(folder => {
|
|
232
|
+
console.log(`\n📁 ${folder}:`);
|
|
233
|
+
filesByFolder[folder].forEach(file => {
|
|
234
|
+
console.log(` - ${file}`);
|
|
235
|
+
});
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
console.log('\n¿Qué deseas hacer?');
|
|
239
|
+
console.log('1. Reemplazar todos los archivos (se perderán las modificaciones)');
|
|
240
|
+
console.log('2. Hacer backup de archivos modificados (se agregarán con sufijo _bk)');
|
|
241
|
+
|
|
242
|
+
const rl = readline.createInterface({
|
|
243
|
+
input: process.stdin,
|
|
244
|
+
output: process.stdout
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
return new Promise((resolve) => {
|
|
248
|
+
rl.question('\nElige una opción (1 o 2): ', (answer) => {
|
|
249
|
+
rl.close();
|
|
250
|
+
resolve(answer.trim());
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
async backupModifiedFiles(modifiedFiles) {
|
|
256
|
+
console.log('\n🔄 Creando backup de archivos modificados...');
|
|
257
|
+
|
|
258
|
+
for (const item of modifiedFiles) {
|
|
259
|
+
// No crear backup de archivos ignorados
|
|
260
|
+
if (item.is_ignored) {
|
|
261
|
+
console.log(`✓ Preservando: ${item.file} (sin backup)`);
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
const originalPath = item.fullPath;
|
|
266
|
+
const backupPath = this.getBackupPath(originalPath);
|
|
267
|
+
|
|
268
|
+
try {
|
|
269
|
+
await fs.copy(originalPath, backupPath);
|
|
270
|
+
|
|
271
|
+
// Determinar tipo de backup para mostrar mensaje apropiado
|
|
272
|
+
const backupName = path.basename(backupPath);
|
|
273
|
+
const isVersionedBackup = backupName.includes('_bk_');
|
|
274
|
+
|
|
275
|
+
if (isVersionedBackup) {
|
|
276
|
+
console.log(`✓ Backup versionado: ${path.relative(this.targetDir, backupPath)}`);
|
|
277
|
+
} else {
|
|
278
|
+
console.log(`✓ Backup creado: ${path.relative(this.targetDir, backupPath)}`);
|
|
279
|
+
}
|
|
280
|
+
} catch (error) {
|
|
281
|
+
console.warn(`⚠️ Error creando backup de ${item.file}: ${error.message}`);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
getBackupPath(filePath) {
|
|
287
|
+
const dir = path.dirname(filePath);
|
|
288
|
+
const ext = path.extname(filePath);
|
|
289
|
+
const name = path.basename(filePath, ext);
|
|
290
|
+
|
|
291
|
+
// Primer intento: archivo_bk.ext
|
|
292
|
+
const basicBackupPath = path.join(dir, `${name}_bk${ext}`);
|
|
293
|
+
|
|
294
|
+
// Si no existe, usar el nombre básico
|
|
295
|
+
if (!fs.existsSync(basicBackupPath)) {
|
|
296
|
+
return basicBackupPath;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
// Si ya existe _bk, crear versión con timestamp
|
|
300
|
+
const now = new Date();
|
|
301
|
+
const timestamp = now.getFullYear().toString() +
|
|
302
|
+
(now.getMonth() + 1).toString().padStart(2, '0') +
|
|
303
|
+
now.getDate().toString().padStart(2, '0') + '_' +
|
|
304
|
+
now.getHours().toString().padStart(2, '0') +
|
|
305
|
+
now.getMinutes().toString().padStart(2, '0') +
|
|
306
|
+
now.getSeconds().toString().padStart(2, '0');
|
|
307
|
+
|
|
308
|
+
return path.join(dir, `${name}_bk_${timestamp}${ext}`);
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
async performUpdateWithBackups() {
|
|
312
|
+
for (const mapping of this.folderMappings) {
|
|
313
|
+
const sourcePath = path.join(this.packageDir, mapping.source);
|
|
314
|
+
const targetPath = path.join(this.targetDir, mapping.target);
|
|
315
|
+
|
|
316
|
+
if (fs.existsSync(sourcePath)) {
|
|
317
|
+
// Copiar archivos selectivamente, preservando los _bk
|
|
318
|
+
await this.copyWithBackupPreservation(sourcePath, targetPath);
|
|
319
|
+
} else {
|
|
320
|
+
console.warn(`⚠️ Carpeta ${mapping.source} no encontrada en el paquete`);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
async copyWithBackupPreservation(sourcePath, targetPath) {
|
|
326
|
+
// Obtener todos los archivos backup existentes
|
|
327
|
+
const backupFiles = await this.findBackupFiles(targetPath);
|
|
328
|
+
|
|
329
|
+
// Copiar la carpeta preservando technical-preferences.md
|
|
330
|
+
await fs.copy(sourcePath, targetPath, {
|
|
331
|
+
overwrite: true,
|
|
332
|
+
recursive: true,
|
|
333
|
+
filter: (src) => {
|
|
334
|
+
const relativePath = path.relative(sourcePath, src);
|
|
335
|
+
// No sobrescribir archivos ignorados si ya existen
|
|
336
|
+
if (this.ignoredFiles.includes(relativePath)) {
|
|
337
|
+
const targetFile = path.join(targetPath, relativePath);
|
|
338
|
+
return !fs.existsSync(targetFile);
|
|
339
|
+
}
|
|
340
|
+
return true;
|
|
341
|
+
}
|
|
342
|
+
});
|
|
343
|
+
|
|
344
|
+
// Restaurar los archivos backup
|
|
345
|
+
for (const backupFile of backupFiles) {
|
|
346
|
+
const backupSourcePath = backupFile.tempPath;
|
|
347
|
+
const backupTargetPath = backupFile.originalPath;
|
|
348
|
+
|
|
349
|
+
try {
|
|
350
|
+
await fs.copy(backupSourcePath, backupTargetPath);
|
|
351
|
+
// Limpiar archivo temporal
|
|
352
|
+
await fs.remove(backupSourcePath);
|
|
353
|
+
} catch (error) {
|
|
354
|
+
console.warn(`⚠️ Error restaurando backup ${backupFile.relativePath}: ${error.message}`);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
async findBackupFiles(targetPath) {
|
|
360
|
+
if (!fs.existsSync(targetPath)) {
|
|
361
|
+
return [];
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
const backupFiles = [];
|
|
365
|
+
const allFiles = await this.getAllFiles(targetPath);
|
|
366
|
+
|
|
367
|
+
for (const filePath of allFiles) {
|
|
368
|
+
const fileName = path.basename(filePath);
|
|
369
|
+
// Detectar archivos _bk y _bk_timestamp
|
|
370
|
+
if (fileName.includes('_bk')) {
|
|
371
|
+
const tempPath = path.join(require('os').tmpdir(), `backup_${Date.now()}_${fileName}`);
|
|
372
|
+
const relativePath = path.relative(targetPath, filePath);
|
|
373
|
+
|
|
374
|
+
// Crear copia temporal del backup
|
|
375
|
+
await fs.copy(filePath, tempPath);
|
|
376
|
+
|
|
377
|
+
backupFiles.push({
|
|
378
|
+
originalPath: filePath,
|
|
379
|
+
tempPath: tempPath,
|
|
380
|
+
relativePath: relativePath
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
return backupFiles;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
async performInstallation() {
|
|
389
|
+
for (const mapping of this.folderMappings) {
|
|
390
|
+
const sourcePath = path.join(this.packageDir, mapping.source);
|
|
391
|
+
const targetPath = path.join(this.targetDir, mapping.target);
|
|
392
|
+
|
|
393
|
+
if (fs.existsSync(sourcePath)) {
|
|
394
|
+
await fs.copy(sourcePath, targetPath, {
|
|
395
|
+
overwrite: true,
|
|
396
|
+
recursive: true,
|
|
397
|
+
filter: (src) => {
|
|
398
|
+
const relativePath = path.relative(sourcePath, src);
|
|
399
|
+
// No sobrescribir archivos ignorados si ya existen
|
|
400
|
+
if (this.ignoredFiles.includes(relativePath)) {
|
|
401
|
+
const targetFile = path.join(targetPath, relativePath);
|
|
402
|
+
return !fs.existsSync(targetFile);
|
|
403
|
+
}
|
|
404
|
+
return true;
|
|
405
|
+
}
|
|
406
|
+
});
|
|
407
|
+
} else {
|
|
408
|
+
console.warn(`⚠️ Carpeta ${mapping.source} no encontrada en el paquete`);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
async update() {
|
|
414
|
+
// Verificar archivos modificados
|
|
415
|
+
console.log('🔍 Verificando archivos modificados...');
|
|
416
|
+
const modifiedFiles = await this.checkModifiedFiles();
|
|
417
|
+
|
|
418
|
+
let hasBackups = false;
|
|
419
|
+
if (modifiedFiles.length > 0) {
|
|
420
|
+
const userChoice = await this.promptUser(modifiedFiles);
|
|
421
|
+
|
|
422
|
+
if (userChoice === '2') {
|
|
423
|
+
// Crear backup de archivos modificados
|
|
424
|
+
await this.backupModifiedFiles(modifiedFiles);
|
|
425
|
+
hasBackups = true;
|
|
426
|
+
} else if (userChoice !== '1') {
|
|
427
|
+
console.log('❌ Opción no válida. Cancelando actualización.');
|
|
428
|
+
return;
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
console.log('\n🔄 Procediendo con la actualización...');
|
|
432
|
+
} else {
|
|
433
|
+
console.log('✓ No se detectaron archivos modificados.');
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
// Si hay backups, hacer actualización preservando backups
|
|
437
|
+
if (hasBackups) {
|
|
438
|
+
await this.performUpdateWithBackups();
|
|
439
|
+
} else {
|
|
440
|
+
// Si no hay backups, hacer actualización normal (remover y copiar)
|
|
441
|
+
// Pero primero preservar archivos ignorados
|
|
442
|
+
await this.preserveIgnoredFiles();
|
|
443
|
+
|
|
444
|
+
for (const mapping of this.folderMappings) {
|
|
445
|
+
const targetPath = path.join(this.targetDir, mapping.target);
|
|
446
|
+
|
|
447
|
+
if (fs.existsSync(targetPath)) {
|
|
448
|
+
await fs.remove(targetPath);
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
// Realizar instalación nueva
|
|
453
|
+
await this.performInstallation();
|
|
454
|
+
|
|
455
|
+
// Restaurar archivos ignorados
|
|
456
|
+
await this.restoreIgnoredFiles();
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
async preserveIgnoredFiles() {
|
|
461
|
+
console.log('🔒 Preservando archivos de configuración...');
|
|
462
|
+
|
|
463
|
+
for (const mapping of this.folderMappings) {
|
|
464
|
+
const targetFolderPath = path.join(this.targetDir, mapping.target);
|
|
465
|
+
|
|
466
|
+
if (!fs.existsSync(targetFolderPath)) {
|
|
467
|
+
continue;
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
for (const ignoredFile of this.ignoredFiles) {
|
|
471
|
+
const filePath = path.join(targetFolderPath, ignoredFile);
|
|
472
|
+
|
|
473
|
+
if (fs.existsSync(filePath)) {
|
|
474
|
+
try {
|
|
475
|
+
const content = await fs.readFile(filePath, 'utf8');
|
|
476
|
+
const key = `${mapping.target}/${ignoredFile}`;
|
|
477
|
+
this.preservedContent.set(key, content);
|
|
478
|
+
console.log(`✓ Preservando: ${ignoredFile}`);
|
|
479
|
+
} catch (error) {
|
|
480
|
+
console.warn(`⚠️ Error leyendo ${ignoredFile}: ${error.message}`);
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
async restoreIgnoredFiles() {
|
|
488
|
+
if (this.preservedContent.size === 0) {
|
|
489
|
+
return;
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
console.log('🔄 Restaurando archivos de configuración...');
|
|
493
|
+
|
|
494
|
+
for (const [key, content] of this.preservedContent) {
|
|
495
|
+
const [targetFolder, ...filePathParts] = key.split('/');
|
|
496
|
+
const filePath = path.join(this.targetDir, targetFolder, ...filePathParts);
|
|
497
|
+
|
|
498
|
+
try {
|
|
499
|
+
// Asegurar que el directorio existe
|
|
500
|
+
await fs.ensureDir(path.dirname(filePath));
|
|
501
|
+
|
|
502
|
+
// Restaurar el contenido
|
|
503
|
+
await fs.writeFile(filePath, content, 'utf8');
|
|
504
|
+
console.log(`✓ Restaurado: ${filePathParts.join('/')}`);
|
|
505
|
+
} catch (error) {
|
|
506
|
+
console.warn(`⚠️ Error restaurando ${filePathParts.join('/')}: ${error.message}`);
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
// Limpiar el mapa después de restaurar
|
|
511
|
+
this.preservedContent.clear();
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
showPostInstallMessage() {
|
|
515
|
+
console.log('\n📚 Carpetas instaladas:');
|
|
516
|
+
this.folderMappings.forEach(mapping => {
|
|
517
|
+
const targetPath = path.join(this.targetDir, mapping.target);
|
|
518
|
+
if (fs.existsSync(targetPath)) {
|
|
519
|
+
console.log(` ✓ ${mapping.target}`);
|
|
520
|
+
}
|
|
521
|
+
});
|
|
522
|
+
|
|
523
|
+
console.log('\n🎉 ¡Instalación completada!');
|
|
524
|
+
console.log('💡 Las carpetas han sido instaladas en tu directorio actual.');
|
|
525
|
+
console.log('🔧 Puedes ejecutar "npx siesa-agents" nuevamente para actualizar.');
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
// Ejecutar instalación si el script es llamado directamente
|
|
530
|
+
if (require.main === module) {
|
|
531
|
+
const installer = new SiesaBmadInstaller();
|
|
532
|
+
installer.install();
|
|
533
|
+
}
|
|
534
|
+
|
|
535
535
|
module.exports = SiesaBmadInstaller;
|