aios-core 2.1.5 → 2.2.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/.aios-core/core/README.md +229 -229
- package/.aios-core/core/data/agent-config-requirements.yaml +368 -368
- package/.aios-core/core/data/aios-kb.md +923 -923
- package/.aios-core/core/data/workflow-patterns.yaml +267 -267
- package/.aios-core/core/docs/SHARD-TRANSLATION-GUIDE.md +335 -335
- package/.aios-core/core/docs/component-creation-guide.md +457 -457
- package/.aios-core/core/docs/session-update-pattern.md +307 -307
- package/.aios-core/core/docs/template-syntax.md +266 -266
- package/.aios-core/core/docs/troubleshooting-guide.md +624 -624
- package/.aios-core/core/elicitation/elicitation-engine.js +1 -1
- package/.aios-core/core/index.esm.js +42 -42
- package/.aios-core/core/index.js +1 -1
- package/.aios-core/core/migration/migration-config.yaml +83 -83
- package/.aios-core/core/migration/module-mapping.yaml +89 -89
- package/.aios-core/core/quality-gates/layer2-pr-automation.js +1 -1
- package/.aios-core/core/quality-gates/quality-gate-config.yaml +86 -86
- package/.aios-core/core/registry/README.md +179 -179
- package/.aios-core/core/utils/security-utils.js +1 -1
- package/.aios-core/core-config.yaml +391 -382
- package/.aios-core/data/agent-config-requirements.yaml +368 -368
- package/.aios-core/data/aios-kb.md +923 -923
- package/.aios-core/data/technical-preferences.md +3 -3
- package/.aios-core/data/workflow-patterns.yaml +267 -267
- package/.aios-core/development/README.md +142 -142
- package/.aios-core/development/agent-teams/team-all.yaml +15 -15
- package/.aios-core/development/agent-teams/team-fullstack.yaml +18 -18
- package/.aios-core/development/agent-teams/team-ide-minimal.yaml +10 -10
- package/.aios-core/development/agent-teams/team-no-ui.yaml +13 -13
- package/.aios-core/development/agent-teams/team-qa-focused.yaml +155 -155
- package/.aios-core/development/agents/aios-master.md +339 -339
- package/.aios-core/development/agents/analyst.md +195 -195
- package/.aios-core/development/agents/architect.md +359 -359
- package/.aios-core/development/agents/data-engineer.md +468 -468
- package/.aios-core/development/agents/dev.md +390 -390
- package/.aios-core/development/agents/devops.md +398 -398
- package/.aios-core/development/agents/pm.md +198 -198
- package/.aios-core/development/agents/po.md +256 -256
- package/.aios-core/development/agents/qa.md +312 -312
- package/.aios-core/development/agents/sm.md +220 -220
- package/.aios-core/development/agents/ux-design-expert.md +451 -451
- package/.aios-core/development/scripts/greeting-config-cli.js +85 -85
- package/.aios-core/development/tasks/add-mcp.md +319 -319
- package/.aios-core/development/tasks/advanced-elicitation.md +318 -318
- package/.aios-core/development/tasks/analyst-facilitate-brainstorming.md +341 -341
- package/.aios-core/development/tasks/analyze-brownfield.md +456 -0
- package/.aios-core/development/tasks/analyze-framework.md +696 -696
- package/.aios-core/development/tasks/analyze-performance.md +637 -637
- package/.aios-core/development/tasks/apply-qa-fixes.md +340 -340
- package/.aios-core/development/tasks/architect-analyze-impact.md +826 -826
- package/.aios-core/development/tasks/audit-codebase.md +429 -429
- package/.aios-core/development/tasks/audit-tailwind-config.md +270 -270
- package/.aios-core/development/tasks/audit-utilities.md +358 -358
- package/.aios-core/development/tasks/bootstrap-shadcn-library.md +286 -286
- package/.aios-core/development/tasks/brownfield-create-epic.md +485 -485
- package/.aios-core/development/tasks/brownfield-create-story.md +356 -356
- package/.aios-core/development/tasks/build-component.md +478 -478
- package/.aios-core/development/tasks/calculate-roi.md +455 -455
- package/.aios-core/development/tasks/ci-cd-configuration.md +764 -764
- package/.aios-core/development/tasks/cleanup-utilities.md +670 -670
- package/.aios-core/development/tasks/collaborative-edit.md +1108 -1108
- package/.aios-core/development/tasks/compose-molecule.md +284 -284
- package/.aios-core/development/tasks/consolidate-patterns.md +414 -414
- package/.aios-core/development/tasks/correct-course.md +279 -279
- package/.aios-core/development/tasks/create-agent.md +321 -321
- package/.aios-core/development/tasks/create-brownfield-story.md +726 -726
- package/.aios-core/development/tasks/create-deep-research-prompt.md +498 -498
- package/.aios-core/development/tasks/create-doc.md +316 -316
- package/.aios-core/development/tasks/create-next-story.md +774 -774
- package/.aios-core/development/tasks/create-suite.md +283 -283
- package/.aios-core/development/tasks/create-task.md +371 -371
- package/.aios-core/development/tasks/create-workflow.md +370 -370
- package/.aios-core/development/tasks/db-analyze-hotpaths.md +572 -572
- package/.aios-core/development/tasks/db-apply-migration.md +381 -381
- package/.aios-core/development/tasks/db-bootstrap.md +642 -642
- package/.aios-core/development/tasks/db-domain-modeling.md +693 -693
- package/.aios-core/development/tasks/db-dry-run.md +293 -293
- package/.aios-core/development/tasks/db-env-check.md +260 -260
- package/.aios-core/development/tasks/db-expansion-pack-integration.md +663 -663
- package/.aios-core/development/tasks/db-explain.md +631 -631
- package/.aios-core/development/tasks/db-impersonate.md +495 -495
- package/.aios-core/development/tasks/db-load-csv.md +593 -593
- package/.aios-core/development/tasks/db-policy-apply.md +653 -653
- package/.aios-core/development/tasks/db-rls-audit.md +411 -411
- package/.aios-core/development/tasks/db-rollback.md +739 -739
- package/.aios-core/development/tasks/db-run-sql.md +613 -613
- package/.aios-core/development/tasks/db-schema-audit.md +1011 -1011
- package/.aios-core/development/tasks/db-seed.md +390 -390
- package/.aios-core/development/tasks/db-smoke-test.md +351 -351
- package/.aios-core/development/tasks/db-snapshot.md +569 -569
- package/.aios-core/development/tasks/db-supabase-setup.md +712 -712
- package/.aios-core/development/tasks/db-verify-order.md +515 -515
- package/.aios-core/development/tasks/deprecate-component.md +956 -956
- package/.aios-core/development/tasks/dev-apply-qa-fixes.md +318 -318
- package/.aios-core/development/tasks/dev-backlog-debt.md +469 -469
- package/.aios-core/development/tasks/dev-develop-story.md +846 -846
- package/.aios-core/development/tasks/dev-improve-code-quality.md +872 -872
- package/.aios-core/development/tasks/dev-optimize-performance.md +1033 -1033
- package/.aios-core/development/tasks/dev-suggest-refactoring.md +870 -870
- package/.aios-core/development/tasks/dev-validate-next-story.md +348 -348
- package/.aios-core/development/tasks/document-project.md +552 -552
- package/.aios-core/development/tasks/environment-bootstrap.md +1311 -1311
- package/.aios-core/development/tasks/execute-checklist.md +301 -301
- package/.aios-core/development/tasks/export-design-tokens-dtcg.md +274 -274
- package/.aios-core/development/tasks/extend-pattern.md +269 -269
- package/.aios-core/development/tasks/extract-tokens.md +467 -467
- package/.aios-core/development/tasks/facilitate-brainstorming-session.md +518 -518
- package/.aios-core/development/tasks/generate-ai-frontend-prompt.md +260 -260
- package/.aios-core/development/tasks/generate-documentation.md +284 -284
- package/.aios-core/development/tasks/generate-migration-strategy.md +522 -522
- package/.aios-core/development/tasks/generate-shock-report.md +501 -501
- package/.aios-core/development/tasks/github-devops-github-pr-automation.md +427 -427
- package/.aios-core/development/tasks/github-devops-pre-push-quality-gate.md +733 -733
- package/.aios-core/development/tasks/github-devops-repository-cleanup.md +374 -374
- package/.aios-core/development/tasks/github-devops-version-management.md +483 -483
- package/.aios-core/development/tasks/improve-self.md +822 -822
- package/.aios-core/development/tasks/index-docs.md +387 -387
- package/.aios-core/development/tasks/init-project-status.md +506 -506
- package/.aios-core/development/tasks/integrate-expansion-pack.md +314 -314
- package/.aios-core/development/tasks/kb-mode-interaction.md +283 -283
- package/.aios-core/development/tasks/learn-patterns.md +900 -900
- package/.aios-core/development/tasks/mcp-workflow.md +437 -437
- package/.aios-core/development/tasks/modify-agent.md +381 -381
- package/.aios-core/development/tasks/modify-task.md +424 -424
- package/.aios-core/development/tasks/modify-workflow.md +465 -465
- package/.aios-core/development/tasks/po-backlog-add.md +370 -370
- package/.aios-core/development/tasks/po-manage-story-backlog.md +523 -523
- package/.aios-core/development/tasks/po-pull-story-from-clickup.md +540 -540
- package/.aios-core/development/tasks/po-pull-story.md +316 -316
- package/.aios-core/development/tasks/po-stories-index.md +351 -351
- package/.aios-core/development/tasks/po-sync-story-to-clickup.md +457 -457
- package/.aios-core/development/tasks/po-sync-story.md +303 -303
- package/.aios-core/development/tasks/pr-automation.md +701 -701
- package/.aios-core/development/tasks/propose-modification.md +842 -842
- package/.aios-core/development/tasks/qa-backlog-add-followup.md +425 -425
- package/.aios-core/development/tasks/qa-gate.md +373 -373
- package/.aios-core/development/tasks/qa-generate-tests.md +1174 -1174
- package/.aios-core/development/tasks/qa-nfr-assess.md +557 -557
- package/.aios-core/development/tasks/qa-review-proposal.md +1157 -1157
- package/.aios-core/development/tasks/qa-review-story.md +682 -682
- package/.aios-core/development/tasks/qa-risk-profile.md +566 -566
- package/.aios-core/development/tasks/qa-run-tests.md +277 -277
- package/.aios-core/development/tasks/qa-test-design.md +387 -387
- package/.aios-core/development/tasks/qa-trace-requirements.md +476 -476
- package/.aios-core/development/tasks/release-management.md +723 -723
- package/.aios-core/development/tasks/security-audit.md +554 -554
- package/.aios-core/development/tasks/security-scan.md +790 -790
- package/.aios-core/development/tasks/setup-database.md +741 -741
- package/.aios-core/development/tasks/setup-design-system.md +462 -462
- package/.aios-core/development/tasks/setup-github.md +874 -874
- package/.aios-core/development/tasks/setup-llm-routing.md +1 -1
- package/.aios-core/development/tasks/setup-mcp-docker.md +584 -584
- package/.aios-core/development/tasks/setup-project-docs.md +440 -0
- package/.aios-core/development/tasks/shard-doc.md +537 -537
- package/.aios-core/development/tasks/sm-create-next-story.md +480 -480
- package/.aios-core/development/tasks/sync-documentation.md +864 -864
- package/.aios-core/development/tasks/tailwind-upgrade.md +294 -294
- package/.aios-core/development/tasks/test-as-user.md +621 -621
- package/.aios-core/development/tasks/test-validation-task.md +171 -171
- package/.aios-core/development/tasks/undo-last.md +346 -346
- package/.aios-core/development/tasks/update-manifest.md +409 -409
- package/.aios-core/development/tasks/ux-create-wireframe.md +617 -617
- package/.aios-core/development/tasks/ux-ds-scan-artifact.md +672 -672
- package/.aios-core/development/tasks/ux-user-research.md +559 -559
- package/.aios-core/development/tasks/validate-next-story.md +422 -422
- package/.aios-core/development/workflows/README.md +83 -83
- package/.aios-core/development/workflows/brownfield-fullstack.yaml +297 -297
- package/.aios-core/development/workflows/brownfield-service.yaml +187 -187
- package/.aios-core/development/workflows/brownfield-ui.yaml +197 -197
- package/.aios-core/development/workflows/greenfield-fullstack.yaml +333 -333
- package/.aios-core/development/workflows/greenfield-service.yaml +206 -206
- package/.aios-core/development/workflows/greenfield-ui.yaml +235 -235
- package/.aios-core/docs/SHARD-TRANSLATION-GUIDE.md +335 -335
- package/.aios-core/docs/component-creation-guide.md +457 -457
- package/.aios-core/docs/session-update-pattern.md +307 -307
- package/.aios-core/docs/standards/AGENT-PERSONALIZATION-STANDARD-V1.md +572 -572
- package/.aios-core/docs/standards/AIOS-COLOR-PALETTE-QUICK-REFERENCE.md +185 -185
- package/.aios-core/docs/standards/AIOS-COLOR-PALETTE-V2.1.md +354 -354
- package/.aios-core/docs/standards/AIOS-FRAMEWORK-MASTER.md +1963 -1963
- package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO-V2.1-COMPLETE.md +821 -821
- package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO-V2.1-SUMMARY.md +1190 -1190
- package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO-V2.1.md +439 -439
- package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO-V2.2-SUMMARY.md +1339 -1339
- package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO.md +5398 -5398
- package/.aios-core/docs/standards/EXECUTOR-DECISION-TREE.md +697 -697
- package/.aios-core/docs/standards/OPEN-SOURCE-VS-SERVICE-DIFFERENCES.md +511 -511
- package/.aios-core/docs/standards/QUALITY-GATES-SPECIFICATION.md +556 -556
- package/.aios-core/docs/standards/STANDARDS-INDEX.md +210 -210
- package/.aios-core/docs/standards/STORY-TEMPLATE-V2-SPECIFICATION.md +550 -550
- package/.aios-core/docs/standards/TASK-FORMAT-SPECIFICATION-V1.md +1414 -1414
- package/.aios-core/docs/standards/V3-ARCHITECTURAL-DECISIONS.md +523 -523
- package/.aios-core/docs/template-syntax.md +266 -266
- package/.aios-core/docs/troubleshooting-guide.md +624 -624
- package/.aios-core/index.esm.js +15 -15
- package/.aios-core/index.js +1 -1
- package/.aios-core/infrastructure/README.md +126 -126
- package/.aios-core/infrastructure/integrations/pm-adapters/README.md +59 -59
- package/.aios-core/infrastructure/scripts/approval-workflow.js +1 -1
- package/.aios-core/infrastructure/scripts/batch-creator.js +1 -1
- package/.aios-core/infrastructure/scripts/component-generator.js +3 -3
- package/.aios-core/infrastructure/scripts/component-metadata.js +1 -1
- package/.aios-core/infrastructure/scripts/component-search.js +1 -1
- package/.aios-core/infrastructure/scripts/coverage-analyzer.js +1 -1
- package/.aios-core/infrastructure/scripts/dependency-analyzer.js +1 -1
- package/.aios-core/infrastructure/scripts/dependency-impact-analyzer.js +1 -1
- package/.aios-core/infrastructure/scripts/documentation-integrity/brownfield-analyzer.js +501 -0
- package/.aios-core/infrastructure/scripts/documentation-integrity/config-generator.js +368 -0
- package/.aios-core/infrastructure/scripts/documentation-integrity/deployment-config-loader.js +308 -0
- package/.aios-core/infrastructure/scripts/documentation-integrity/doc-generator.js +331 -0
- package/.aios-core/infrastructure/scripts/documentation-integrity/gitignore-generator.js +312 -0
- package/.aios-core/infrastructure/scripts/documentation-integrity/index.js +74 -0
- package/.aios-core/infrastructure/scripts/documentation-integrity/mode-detector.js +389 -0
- package/.aios-core/infrastructure/scripts/framework-analyzer.js +1 -1
- package/.aios-core/infrastructure/scripts/improvement-engine.js +1 -1
- package/.aios-core/infrastructure/scripts/llm-routing/install-llm-routing.js +26 -13
- package/.aios-core/infrastructure/scripts/llm-routing/templates/claude-free-tracked.cmd +127 -0
- package/.aios-core/infrastructure/scripts/llm-routing/templates/claude-free-tracked.sh +108 -0
- package/.aios-core/infrastructure/scripts/llm-routing/templates/deepseek-proxy.cmd +71 -0
- package/.aios-core/infrastructure/scripts/llm-routing/templates/deepseek-proxy.sh +65 -0
- package/.aios-core/infrastructure/scripts/llm-routing/templates/deepseek-usage.cmd +51 -0
- package/.aios-core/infrastructure/scripts/llm-routing/templates/deepseek-usage.sh +16 -0
- package/.aios-core/infrastructure/scripts/llm-routing/usage-tracker/index.js +549 -0
- package/.aios-core/infrastructure/scripts/modification-risk-assessment.js +1 -1
- package/.aios-core/infrastructure/scripts/performance-analyzer.js +1 -1
- package/.aios-core/infrastructure/scripts/pm-adapter.js +134 -134
- package/.aios-core/infrastructure/scripts/repository-detector.js +3 -3
- package/.aios-core/infrastructure/scripts/template-engine.js +1 -1
- package/.aios-core/infrastructure/scripts/template-validator.js +1 -1
- package/.aios-core/infrastructure/scripts/test-generator.js +1 -1
- package/.aios-core/infrastructure/scripts/test-quality-assessment.js +1 -1
- package/.aios-core/infrastructure/scripts/transaction-manager.js +1 -1
- package/.aios-core/infrastructure/scripts/usage-analytics.js +1 -1
- package/.aios-core/infrastructure/scripts/visual-impact-generator.js +2 -2
- package/.aios-core/infrastructure/templates/core-config/core-config-brownfield.tmpl.yaml +176 -0
- package/.aios-core/infrastructure/templates/core-config/core-config-greenfield.tmpl.yaml +127 -0
- package/.aios-core/infrastructure/templates/github-workflows/README.md +109 -109
- package/.aios-core/infrastructure/templates/gitignore/gitignore-aios-base.tmpl +63 -0
- package/.aios-core/infrastructure/templates/gitignore/gitignore-brownfield-merge.tmpl +18 -0
- package/.aios-core/infrastructure/templates/gitignore/gitignore-node.tmpl +85 -0
- package/.aios-core/infrastructure/templates/gitignore/gitignore-python.tmpl +145 -0
- package/.aios-core/infrastructure/templates/project-docs/coding-standards-tmpl.md +346 -0
- package/.aios-core/infrastructure/templates/project-docs/source-tree-tmpl.md +177 -0
- package/.aios-core/infrastructure/templates/project-docs/tech-stack-tmpl.md +267 -0
- package/.aios-core/infrastructure/tests/regression-suite-v2.md +621 -621
- package/.aios-core/infrastructure/tools/README.md +222 -222
- package/.aios-core/infrastructure/tools/cli/github-cli.yaml +200 -200
- package/.aios-core/infrastructure/tools/cli/railway-cli.yaml +260 -260
- package/.aios-core/infrastructure/tools/cli/supabase-cli.yaml +224 -224
- package/.aios-core/infrastructure/tools/local/ffmpeg.yaml +261 -261
- package/.aios-core/infrastructure/tools/mcp/21st-dev-magic.yaml +127 -127
- package/.aios-core/infrastructure/tools/mcp/browser.yaml +103 -103
- package/.aios-core/infrastructure/tools/mcp/clickup.yaml +534 -534
- package/.aios-core/infrastructure/tools/mcp/context7.yaml +78 -78
- package/.aios-core/infrastructure/tools/mcp/desktop-commander.yaml +180 -180
- package/.aios-core/infrastructure/tools/mcp/exa.yaml +103 -103
- package/.aios-core/infrastructure/tools/mcp/google-workspace.yaml +930 -930
- package/.aios-core/infrastructure/tools/mcp/n8n.yaml +551 -551
- package/.aios-core/infrastructure/tools/mcp/supabase.yaml +808 -808
- package/.aios-core/install-manifest.yaml +347 -347
- package/.aios-core/product/README.md +56 -56
- package/.aios-core/product/checklists/accessibility-wcag-checklist.md +80 -0
- package/.aios-core/product/checklists/architect-checklist.md +443 -443
- package/.aios-core/product/checklists/change-checklist.md +182 -182
- package/.aios-core/product/checklists/component-quality-checklist.md +74 -0
- package/.aios-core/product/checklists/database-design-checklist.md +119 -119
- package/.aios-core/product/checklists/dba-predeploy-checklist.md +97 -97
- package/.aios-core/product/checklists/dba-rollback-checklist.md +99 -99
- package/.aios-core/product/checklists/migration-readiness-checklist.md +75 -0
- package/.aios-core/product/checklists/pattern-audit-checklist.md +88 -0
- package/.aios-core/product/checklists/pm-checklist.md +375 -375
- package/.aios-core/product/checklists/po-master-checklist.md +441 -441
- package/.aios-core/product/checklists/pre-push-checklist.md +108 -108
- package/.aios-core/product/checklists/release-checklist.md +122 -122
- package/.aios-core/product/checklists/story-dod-checklist.md +101 -101
- package/.aios-core/product/checklists/story-draft-checklist.md +215 -215
- package/.aios-core/product/data/atomic-design-principles.md +108 -0
- package/.aios-core/product/data/brainstorming-techniques.md +36 -36
- package/.aios-core/product/data/consolidation-algorithms.md +142 -0
- package/.aios-core/product/data/database-best-practices.md +182 -0
- package/.aios-core/product/data/design-token-best-practices.md +107 -0
- package/.aios-core/product/data/elicitation-methods.md +134 -134
- package/.aios-core/product/data/integration-patterns.md +207 -0
- package/.aios-core/product/data/migration-safety-guide.md +329 -0
- package/.aios-core/product/data/mode-selection-best-practices.md +471 -471
- package/.aios-core/product/data/postgres-tuning-guide.md +300 -0
- package/.aios-core/product/data/rls-security-patterns.md +333 -0
- package/.aios-core/product/data/roi-calculation-guide.md +142 -0
- package/.aios-core/product/data/supabase-patterns.md +330 -0
- package/.aios-core/product/data/test-levels-framework.md +148 -148
- package/.aios-core/product/data/test-priorities-matrix.md +174 -174
- package/.aios-core/product/data/wcag-compliance-guide.md +267 -0
- package/.aios-core/product/templates/1mcp-config.yaml +225 -225
- package/.aios-core/product/templates/activation-instructions-inline-greeting.yaml +63 -63
- package/.aios-core/product/templates/activation-instructions-template.md +258 -258
- package/.aios-core/product/templates/agent-template.yaml +120 -120
- package/.aios-core/product/templates/architecture-tmpl.yaml +650 -650
- package/.aios-core/product/templates/brainstorming-output-tmpl.yaml +155 -155
- package/.aios-core/product/templates/brownfield-architecture-tmpl.yaml +475 -475
- package/.aios-core/product/templates/brownfield-prd-tmpl.yaml +279 -279
- package/.aios-core/product/templates/changelog-template.md +134 -134
- package/.aios-core/product/templates/command-rationalization-matrix.md +152 -152
- package/.aios-core/product/templates/competitor-analysis-tmpl.yaml +292 -292
- package/.aios-core/product/templates/design-story-tmpl.yaml +587 -587
- package/.aios-core/product/templates/ds-artifact-analysis.md +70 -70
- package/.aios-core/product/templates/front-end-architecture-tmpl.yaml +205 -205
- package/.aios-core/product/templates/front-end-spec-tmpl.yaml +348 -348
- package/.aios-core/product/templates/fullstack-architecture-tmpl.yaml +804 -804
- package/.aios-core/product/templates/github-pr-template.md +67 -67
- package/.aios-core/product/templates/gordon-mcp.yaml +140 -140
- package/.aios-core/product/templates/ide-rules/antigravity-rules.md +115 -115
- package/.aios-core/product/templates/ide-rules/claude-rules.md +221 -221
- package/.aios-core/product/templates/ide-rules/cline-rules.md +84 -84
- package/.aios-core/product/templates/ide-rules/copilot-rules.md +92 -92
- package/.aios-core/product/templates/ide-rules/cursor-rules.md +115 -115
- package/.aios-core/product/templates/ide-rules/gemini-rules.md +85 -85
- package/.aios-core/product/templates/ide-rules/roo-rules.md +86 -86
- package/.aios-core/product/templates/ide-rules/trae-rules.md +104 -104
- package/.aios-core/product/templates/ide-rules/windsurf-rules.md +80 -80
- package/.aios-core/product/templates/index-strategy-tmpl.yaml +53 -53
- package/.aios-core/product/templates/market-research-tmpl.yaml +251 -251
- package/.aios-core/product/templates/mcp-workflow.js +271 -271
- package/.aios-core/product/templates/migration-plan-tmpl.yaml +1022 -1022
- package/.aios-core/product/templates/migration-strategy-tmpl.md +524 -524
- package/.aios-core/product/templates/personalized-agent-template.md +258 -258
- package/.aios-core/product/templates/personalized-checklist-template.md +340 -340
- package/.aios-core/product/templates/personalized-task-template-v2.md +905 -905
- package/.aios-core/product/templates/personalized-task-template.md +344 -344
- package/.aios-core/product/templates/personalized-template-file.yaml +322 -322
- package/.aios-core/product/templates/personalized-workflow-template.yaml +460 -460
- package/.aios-core/product/templates/prd-tmpl.yaml +201 -201
- package/.aios-core/product/templates/project-brief-tmpl.yaml +220 -220
- package/.aios-core/product/templates/qa-gate-tmpl.yaml +240 -240
- package/.aios-core/product/templates/rls-policies-tmpl.yaml +1203 -1203
- package/.aios-core/product/templates/schema-design-tmpl.yaml +428 -428
- package/.aios-core/product/templates/state-persistence-tmpl.yaml +219 -219
- package/.aios-core/product/templates/story-tmpl.yaml +331 -331
- package/.aios-core/product/templates/task-execution-report.md +495 -495
- package/.aios-core/product/templates/task-template.md +122 -122
- package/.aios-core/product/templates/token-exports-tailwind-tmpl.js +395 -395
- package/.aios-core/product/templates/tokens-schema-tmpl.yaml +305 -305
- package/.aios-core/product/templates/workflow-template.yaml +133 -133
- package/.aios-core/scripts/README.md +354 -354
- package/.aios-core/scripts/aios-doc-template.md +325 -325
- package/.aios-core/scripts/elicitation-engine.js +1 -1
- package/.aios-core/scripts/test-template-system.js +1 -1
- package/.aios-core/scripts/workflow-management.md +69 -69
- package/.aios-core/user-guide.md +1413 -1413
- package/.aios-core/working-in-the-brownfield.md +361 -361
- package/LICENSE +1 -1
- package/README.md +702 -703
- package/bin/aios-init-old.js +3 -3
- package/bin/aios-init-v4.js +1 -1
- package/bin/aios-init.backup-v1.1.4.js +1 -1
- package/bin/aios-init.js +3 -3
- package/bin/aios.js +279 -279
- package/bin/utils/install-errors.js +339 -339
- package/bin/utils/install-transaction.js +445 -445
- package/index.d.ts +18 -18
- package/index.esm.js +20 -20
- package/index.js +6 -6
- package/package.json +8 -10
- package/packages/installer/src/config/templates/env-template.js +27 -4
- package/packages/installer/src/detection/detect-project-type.js +81 -81
- package/packages/installer/src/wizard/wizard.js +185 -34
- package/packages/installer/tests/integration/environment-configuration.test.js +2 -1
- package/packages/installer/tests/integration/wizard-detection.test.js +8 -6
- package/packages/installer/tests/unit/env-template.test.js +11 -10
- package/src/config/ide-configs.js +1 -1
- package/src/wizard/feedback.js +2 -2
- package/src/wizard/index.js +1 -1
- package/src/wizard/validation/report-generator.js +1 -1
- package/src/wizard/validation/troubleshooting-system.js +13 -13
- package/.aios-core/development/tasks/validate-structure.md +0 -243
- package/.aios-core/infrastructure/scripts/_archived/final-todo-count.js +0 -122
- package/.aios-core/infrastructure/scripts/_archived/fix-yaml-formatting.js +0 -89
- package/.aios-core/infrastructure/scripts/_archived/migration-generator.js +0 -780
- package/.aios-core/infrastructure/scripts/_archived/migration-path-generator.js +0 -950
- package/.aios-core/infrastructure/scripts/_archived/phase2-entrada-saida-errors.js +0 -425
- package/.aios-core/infrastructure/scripts/_archived/phase2-spot-check.js +0 -132
- package/.aios-core/infrastructure/scripts/_archived/phase3-tools-scripts-validation.js +0 -381
- package/.aios-core/infrastructure/scripts/_archived/phase4-metadata-performance.js +0 -203
- package/.aios-core/infrastructure/scripts/_archived/test-yaml-parsing.js +0 -24
- package/.aios-core/infrastructure/scripts/_archived/verify-yaml-fix.js +0 -51
- package/.aios-core/infrastructure/scripts/source-tree-guardian/index.js +0 -375
- package/.aios-core/infrastructure/scripts/source-tree-guardian/manifest-generator.js +0 -410
- package/.aios-core/infrastructure/scripts/source-tree-guardian/rules/naming-rules.yaml +0 -285
- package/.aios-core/infrastructure/scripts/source-tree-guardian/rules/placement-rules.yaml +0 -262
- package/.aios-core/infrastructure/scripts/source-tree-guardian/validator.js +0 -468
- package/.aios-core/tasks/find-component.md.legacy +0 -391
- package/.aios-core/tasks/generate-commit-message.md.legacy +0 -426
- package/.aios-core/tasks/generate-migration.md.legacy +0 -382
- package/.aios-core/tasks/rollback-modification.md.legacy +0 -307
- package/.aios-core/tasks/update-tests.md.legacy +0 -283
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config Generator Module
|
|
3
|
+
*
|
|
4
|
+
* Generates project-specific core-config.yaml from templates.
|
|
5
|
+
* Supports greenfield and brownfield modes with deployment configuration.
|
|
6
|
+
*
|
|
7
|
+
* @module documentation-integrity/config-generator
|
|
8
|
+
* @version 1.0.0
|
|
9
|
+
* @story 6.9
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
const fs = require('fs');
|
|
13
|
+
const path = require('path');
|
|
14
|
+
const yaml = require('yaml');
|
|
15
|
+
|
|
16
|
+
// Template directory
|
|
17
|
+
const TEMPLATES_DIR = path.join(__dirname, '..', '..', 'templates', 'core-config');
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Template file names
|
|
21
|
+
* @enum {string}
|
|
22
|
+
*/
|
|
23
|
+
const ConfigTemplates = {
|
|
24
|
+
GREENFIELD: 'core-config-greenfield.tmpl.yaml',
|
|
25
|
+
BROWNFIELD: 'core-config-brownfield.tmpl.yaml',
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Deployment workflow types
|
|
30
|
+
* @enum {string}
|
|
31
|
+
*/
|
|
32
|
+
const DeploymentWorkflow = {
|
|
33
|
+
STAGING_FIRST: 'staging-first',
|
|
34
|
+
DIRECT_TO_MAIN: 'direct-to-main',
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Deployment platform options
|
|
39
|
+
* @enum {string}
|
|
40
|
+
*/
|
|
41
|
+
const DeploymentPlatform = {
|
|
42
|
+
RAILWAY: 'Railway',
|
|
43
|
+
VERCEL: 'Vercel',
|
|
44
|
+
AWS: 'AWS',
|
|
45
|
+
DOCKER: 'Docker',
|
|
46
|
+
NONE: 'None',
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Default deployment configuration
|
|
51
|
+
* @type {Object}
|
|
52
|
+
*/
|
|
53
|
+
const DEFAULT_DEPLOYMENT_CONFIG = {
|
|
54
|
+
workflow: DeploymentWorkflow.STAGING_FIRST,
|
|
55
|
+
stagingBranch: 'staging',
|
|
56
|
+
productionBranch: 'main',
|
|
57
|
+
defaultTarget: 'staging',
|
|
58
|
+
stagingEnvName: 'Staging',
|
|
59
|
+
productionEnvName: 'Production',
|
|
60
|
+
platform: DeploymentPlatform.NONE,
|
|
61
|
+
qualityGates: {
|
|
62
|
+
lint: true,
|
|
63
|
+
typecheck: true,
|
|
64
|
+
tests: true,
|
|
65
|
+
securityScan: false,
|
|
66
|
+
minCoverage: 50,
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Escapes a string for use in YAML double-quoted strings
|
|
72
|
+
*
|
|
73
|
+
* @param {string} str - String to escape
|
|
74
|
+
* @returns {string} Escaped string safe for YAML
|
|
75
|
+
*/
|
|
76
|
+
function escapeYamlString(str) {
|
|
77
|
+
return String(str)
|
|
78
|
+
.replace(/\\/g, '\\\\') // Escape backslashes first
|
|
79
|
+
.replace(/"/g, '\\"') // Escape double quotes
|
|
80
|
+
.replace(/\n/g, '\\n') // Escape newlines
|
|
81
|
+
.replace(/\r/g, '\\r') // Escape carriage returns
|
|
82
|
+
.replace(/\t/g, '\\t'); // Escape tabs
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Formats an array as YAML list string for template substitution
|
|
87
|
+
*
|
|
88
|
+
* @param {Array} arr - Array to format
|
|
89
|
+
* @param {number} [indent=4] - Number of spaces for indentation
|
|
90
|
+
* @returns {string} YAML-formatted array string
|
|
91
|
+
*/
|
|
92
|
+
function formatArrayAsYaml(arr, indent = 4) {
|
|
93
|
+
if (!Array.isArray(arr) || arr.length === 0) {
|
|
94
|
+
return '[]';
|
|
95
|
+
}
|
|
96
|
+
const spaces = ' '.repeat(indent);
|
|
97
|
+
const items = arr.map((item) => `\n${spaces}- "${escapeYamlString(item)}"`).join('');
|
|
98
|
+
return items;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Builds config context from project info and deployment settings
|
|
103
|
+
*
|
|
104
|
+
* @param {string} projectName - Project name
|
|
105
|
+
* @param {string} mode - Installation mode (greenfield/brownfield)
|
|
106
|
+
* @param {Object} deploymentConfig - Deployment configuration
|
|
107
|
+
* @param {Object} [analysisResults] - Brownfield analysis results (if applicable)
|
|
108
|
+
* @returns {Object} Config context for template rendering
|
|
109
|
+
*/
|
|
110
|
+
function buildConfigContext(projectName, mode, deploymentConfig = {}, analysisResults = {}) {
|
|
111
|
+
const config = { ...DEFAULT_DEPLOYMENT_CONFIG, ...deploymentConfig };
|
|
112
|
+
const isStaging = config.workflow === DeploymentWorkflow.STAGING_FIRST;
|
|
113
|
+
|
|
114
|
+
const context = {
|
|
115
|
+
// Basic info
|
|
116
|
+
PROJECT_NAME: projectName,
|
|
117
|
+
GENERATED_DATE: new Date().toISOString().split('T')[0],
|
|
118
|
+
PROJECT_VERSION: analysisResults.version || '0.1.0',
|
|
119
|
+
|
|
120
|
+
// Deployment workflow
|
|
121
|
+
DEPLOYMENT_WORKFLOW: config.workflow,
|
|
122
|
+
|
|
123
|
+
// Branch configuration
|
|
124
|
+
STAGING_BRANCH: isStaging ? config.stagingBranch : 'null',
|
|
125
|
+
PRODUCTION_BRANCH: config.productionBranch,
|
|
126
|
+
// Use symbolic name ('staging'/'production') - deployment-config-loader resolves to actual branch
|
|
127
|
+
DEFAULT_TARGET: isStaging ? 'staging' : 'production',
|
|
128
|
+
|
|
129
|
+
// Environment names
|
|
130
|
+
STAGING_ENV_NAME: config.stagingEnvName,
|
|
131
|
+
PRODUCTION_ENV_NAME: config.productionEnvName,
|
|
132
|
+
|
|
133
|
+
// Platform
|
|
134
|
+
DEPLOYMENT_PLATFORM: config.platform,
|
|
135
|
+
|
|
136
|
+
// Quality gates
|
|
137
|
+
QUALITY_LINT: config.qualityGates.lint,
|
|
138
|
+
QUALITY_TYPECHECK: config.qualityGates.typecheck,
|
|
139
|
+
QUALITY_TESTS: config.qualityGates.tests,
|
|
140
|
+
QUALITY_SECURITY: config.qualityGates.securityScan || false,
|
|
141
|
+
MIN_COVERAGE: config.qualityGates.minCoverage || 50,
|
|
142
|
+
|
|
143
|
+
// Brownfield specific (defaults for greenfield)
|
|
144
|
+
HAS_EXISTING_STRUCTURE: analysisResults.hasExistingStructure || false,
|
|
145
|
+
HAS_EXISTING_WORKFLOWS: analysisResults.hasExistingWorkflows || false,
|
|
146
|
+
HAS_EXISTING_STANDARDS: analysisResults.hasExistingStandards || false,
|
|
147
|
+
MERGE_STRATEGY: analysisResults.mergeStrategy || 'parallel',
|
|
148
|
+
|
|
149
|
+
// Detected configs (brownfield)
|
|
150
|
+
DETECTED_TECH_STACK: JSON.stringify(analysisResults.techStack || []),
|
|
151
|
+
DETECTED_FRAMEWORKS: JSON.stringify(analysisResults.frameworks || []),
|
|
152
|
+
DETECTED_LINTING: analysisResults.linting || 'none',
|
|
153
|
+
DETECTED_FORMATTING: analysisResults.formatting || 'none',
|
|
154
|
+
DETECTED_TESTING: analysisResults.testing || 'none',
|
|
155
|
+
|
|
156
|
+
// Auto deploy settings
|
|
157
|
+
STAGING_AUTO_DEPLOY: config.stagingAutoDeploy !== false,
|
|
158
|
+
PRODUCTION_AUTO_DEPLOY: config.productionAutoDeploy !== false,
|
|
159
|
+
|
|
160
|
+
// PR settings
|
|
161
|
+
AUTO_ASSIGN_REVIEWERS: config.autoAssignReviewers || false,
|
|
162
|
+
DRAFT_BY_DEFAULT: config.draftByDefault || false,
|
|
163
|
+
|
|
164
|
+
// Existing config paths (brownfield)
|
|
165
|
+
ESLINT_CONFIG_PATH: analysisResults.eslintPath || 'null',
|
|
166
|
+
PRETTIER_CONFIG_PATH: analysisResults.prettierPath || 'null',
|
|
167
|
+
TSCONFIG_PATH: analysisResults.tsconfigPath || 'null',
|
|
168
|
+
FLAKE8_CONFIG_PATH: analysisResults.flake8Path || 'null',
|
|
169
|
+
GITHUB_WORKFLOWS_PATH: analysisResults.githubWorkflowsPath || 'null',
|
|
170
|
+
GITLAB_CI_PATH: analysisResults.gitlabCiPath || 'null',
|
|
171
|
+
PACKAGE_JSON_PATH: analysisResults.packageJsonPath || 'null',
|
|
172
|
+
REQUIREMENTS_PATH: analysisResults.requirementsPath || 'null',
|
|
173
|
+
GO_MOD_PATH: analysisResults.goModPath || 'null',
|
|
174
|
+
|
|
175
|
+
// Merge settings
|
|
176
|
+
MERGE_WORKFLOWS: analysisResults.mergeWorkflows || false,
|
|
177
|
+
|
|
178
|
+
// Migration notes (brownfield)
|
|
179
|
+
MIGRATION_SUMMARY: analysisResults.summary || 'No analysis performed',
|
|
180
|
+
MANUAL_REVIEW_ITEMS: analysisResults.manualReviewItems || [],
|
|
181
|
+
CONFLICTS: analysisResults.conflicts || [],
|
|
182
|
+
RECOMMENDATIONS: analysisResults.recommendations || [],
|
|
183
|
+
|
|
184
|
+
// Pre-formatted YAML arrays for template substitution (avoids Handlebars #each)
|
|
185
|
+
MANUAL_REVIEW_ITEMS_YAML: formatArrayAsYaml(analysisResults.manualReviewItems || []),
|
|
186
|
+
CONFLICTS_YAML: formatArrayAsYaml(analysisResults.conflicts || []),
|
|
187
|
+
RECOMMENDATIONS_YAML: formatArrayAsYaml(analysisResults.recommendations || []),
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
return context;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Renders a YAML template with context
|
|
195
|
+
*
|
|
196
|
+
* @param {string} template - Template content
|
|
197
|
+
* @param {Object} context - Context object
|
|
198
|
+
* @returns {string} Rendered YAML content
|
|
199
|
+
*/
|
|
200
|
+
function renderConfigTemplate(template, context) {
|
|
201
|
+
let result = template;
|
|
202
|
+
|
|
203
|
+
// Process {{#each}} blocks
|
|
204
|
+
result = processEachBlocks(result, context);
|
|
205
|
+
|
|
206
|
+
// Replace simple variables {{variable}}
|
|
207
|
+
result = result.replace(/\{\{([^#/}][^}]*)\}\}/g, (match, key) => {
|
|
208
|
+
const value = context[key.trim()];
|
|
209
|
+
if (value === undefined) return match;
|
|
210
|
+
if (typeof value === 'boolean') return value.toString();
|
|
211
|
+
if (typeof value === 'number') return value.toString();
|
|
212
|
+
return String(value);
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
return result;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Process {{#each array}}...{{/each}} blocks
|
|
220
|
+
*
|
|
221
|
+
* @param {string} template - Template string
|
|
222
|
+
* @param {Object} context - Context object
|
|
223
|
+
* @returns {string} Processed template
|
|
224
|
+
*/
|
|
225
|
+
function processEachBlocks(template, context) {
|
|
226
|
+
const eachRegex = /\{\{#each\s+(\w+)\}\}([\s\S]*?)\{\{\/each\}\}/g;
|
|
227
|
+
|
|
228
|
+
return template.replace(eachRegex, (match, arrayName, content) => {
|
|
229
|
+
const array = context[arrayName];
|
|
230
|
+
if (!Array.isArray(array) || array.length === 0) {
|
|
231
|
+
return '';
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
return array
|
|
235
|
+
.map((item) => {
|
|
236
|
+
return content.replace(/\{\{this\}\}/g, String(item));
|
|
237
|
+
})
|
|
238
|
+
.join('');
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Loads a config template
|
|
244
|
+
*
|
|
245
|
+
* @param {string} templateName - Template file name
|
|
246
|
+
* @returns {string} Template content
|
|
247
|
+
* @throws {Error} If template not found
|
|
248
|
+
*/
|
|
249
|
+
function loadConfigTemplate(templateName) {
|
|
250
|
+
const templatePath = path.join(TEMPLATES_DIR, templateName);
|
|
251
|
+
|
|
252
|
+
if (!fs.existsSync(templatePath)) {
|
|
253
|
+
throw new Error(`Config template not found: ${templatePath}`);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
return fs.readFileSync(templatePath, 'utf8');
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Generates core-config.yaml for a project
|
|
261
|
+
*
|
|
262
|
+
* @param {string} targetDir - Target directory
|
|
263
|
+
* @param {string} mode - Installation mode (greenfield/brownfield)
|
|
264
|
+
* @param {Object} context - Config context
|
|
265
|
+
* @param {Object} [options] - Generation options
|
|
266
|
+
* @param {boolean} [options.dryRun] - Don't write file, just return content
|
|
267
|
+
* @returns {Object} Generation result
|
|
268
|
+
*/
|
|
269
|
+
function generateConfig(targetDir, mode, context, options = {}) {
|
|
270
|
+
const templateName =
|
|
271
|
+
mode === 'brownfield' ? ConfigTemplates.BROWNFIELD : ConfigTemplates.GREENFIELD;
|
|
272
|
+
|
|
273
|
+
try {
|
|
274
|
+
const template = loadConfigTemplate(templateName);
|
|
275
|
+
const rendered = renderConfigTemplate(template, context);
|
|
276
|
+
|
|
277
|
+
// Validate YAML syntax
|
|
278
|
+
try {
|
|
279
|
+
yaml.parse(rendered);
|
|
280
|
+
} catch (yamlError) {
|
|
281
|
+
return {
|
|
282
|
+
success: false,
|
|
283
|
+
error: `Generated YAML is invalid: ${yamlError.message}`,
|
|
284
|
+
content: rendered,
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
const configDir = path.join(targetDir, '.aios-core');
|
|
289
|
+
const configPath = path.join(configDir, 'core-config.yaml');
|
|
290
|
+
|
|
291
|
+
if (!options.dryRun) {
|
|
292
|
+
fs.mkdirSync(configDir, { recursive: true });
|
|
293
|
+
fs.writeFileSync(configPath, rendered, 'utf8');
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
return {
|
|
297
|
+
success: true,
|
|
298
|
+
path: configPath,
|
|
299
|
+
content: rendered,
|
|
300
|
+
};
|
|
301
|
+
} catch (error) {
|
|
302
|
+
return {
|
|
303
|
+
success: false,
|
|
304
|
+
error: error.message,
|
|
305
|
+
content: null,
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/**
|
|
311
|
+
* Generates deployment config context from user inputs
|
|
312
|
+
*
|
|
313
|
+
* @param {Object} inputs - User inputs from wizard
|
|
314
|
+
* @returns {Object} Deployment configuration
|
|
315
|
+
*/
|
|
316
|
+
function buildDeploymentConfig(inputs = {}) {
|
|
317
|
+
return {
|
|
318
|
+
workflow: inputs.workflow || DeploymentWorkflow.STAGING_FIRST,
|
|
319
|
+
stagingBranch: inputs.stagingBranch || 'staging',
|
|
320
|
+
productionBranch: inputs.productionBranch || 'main',
|
|
321
|
+
stagingEnvName: inputs.stagingEnvName || 'Staging',
|
|
322
|
+
productionEnvName: inputs.productionEnvName || 'Production',
|
|
323
|
+
platform: inputs.platform || DeploymentPlatform.NONE,
|
|
324
|
+
qualityGates: {
|
|
325
|
+
lint: inputs.lint !== false,
|
|
326
|
+
typecheck: inputs.typecheck !== false,
|
|
327
|
+
tests: inputs.tests !== false,
|
|
328
|
+
securityScan: inputs.securityScan || false,
|
|
329
|
+
minCoverage: inputs.minCoverage || 50,
|
|
330
|
+
},
|
|
331
|
+
autoAssignReviewers: inputs.autoAssignReviewers || false,
|
|
332
|
+
draftByDefault: inputs.draftByDefault || false,
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/**
|
|
337
|
+
* Gets default deployment config for a mode
|
|
338
|
+
*
|
|
339
|
+
* @param {string} mode - Installation mode
|
|
340
|
+
* @returns {Object} Default deployment config
|
|
341
|
+
*/
|
|
342
|
+
function getDefaultDeploymentConfig(mode) {
|
|
343
|
+
if (mode === 'brownfield') {
|
|
344
|
+
// Brownfield might use direct-to-main if solo project
|
|
345
|
+
return {
|
|
346
|
+
...DEFAULT_DEPLOYMENT_CONFIG,
|
|
347
|
+
// Keep staging-first as default, but brownfield analyzer may change this
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
return { ...DEFAULT_DEPLOYMENT_CONFIG };
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
module.exports = {
|
|
355
|
+
buildConfigContext,
|
|
356
|
+
renderConfigTemplate,
|
|
357
|
+
loadConfigTemplate,
|
|
358
|
+
generateConfig,
|
|
359
|
+
buildDeploymentConfig,
|
|
360
|
+
getDefaultDeploymentConfig,
|
|
361
|
+
formatArrayAsYaml,
|
|
362
|
+
escapeYamlString,
|
|
363
|
+
ConfigTemplates,
|
|
364
|
+
DeploymentWorkflow,
|
|
365
|
+
DeploymentPlatform,
|
|
366
|
+
DEFAULT_DEPLOYMENT_CONFIG,
|
|
367
|
+
TEMPLATES_DIR,
|
|
368
|
+
};
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deployment Config Loader
|
|
3
|
+
*
|
|
4
|
+
* Shared utility for loading deployment configuration from core-config.yaml.
|
|
5
|
+
* Implements the Configuration-Driven Architecture pattern.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* const { loadDeploymentConfig } = require('./deployment-config-loader');
|
|
9
|
+
* const config = loadDeploymentConfig(projectRoot);
|
|
10
|
+
*
|
|
11
|
+
* @module documentation-integrity/deployment-config-loader
|
|
12
|
+
* @version 1.0.0
|
|
13
|
+
* @story 6.9
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
const fs = require('fs');
|
|
17
|
+
const path = require('path');
|
|
18
|
+
const yaml = require('yaml');
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Default deployment configuration
|
|
22
|
+
* Used when core-config.yaml doesn't exist or deployment section is missing
|
|
23
|
+
*
|
|
24
|
+
* @type {Object}
|
|
25
|
+
*/
|
|
26
|
+
const DEFAULT_DEPLOYMENT_CONFIG = {
|
|
27
|
+
workflow: 'staging-first',
|
|
28
|
+
|
|
29
|
+
branches: {
|
|
30
|
+
staging_targets: ['feature/*', 'fix/*', 'docs/*', 'chore/*', 'refactor/*', 'test/*'],
|
|
31
|
+
production_targets: ['hotfix/*'],
|
|
32
|
+
staging_branch: 'staging',
|
|
33
|
+
production_branch: 'main',
|
|
34
|
+
default_target: 'staging',
|
|
35
|
+
},
|
|
36
|
+
|
|
37
|
+
environments: {
|
|
38
|
+
staging: {
|
|
39
|
+
name: 'Staging',
|
|
40
|
+
auto_deploy: true,
|
|
41
|
+
platform: null,
|
|
42
|
+
url: null,
|
|
43
|
+
promotion_message: 'After validation, create PR to main for production',
|
|
44
|
+
},
|
|
45
|
+
production: {
|
|
46
|
+
name: 'Production',
|
|
47
|
+
auto_deploy: true,
|
|
48
|
+
platform: null,
|
|
49
|
+
url: null,
|
|
50
|
+
promotion_message: 'This is the final production deployment',
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
|
|
54
|
+
quality_gates: {
|
|
55
|
+
lint: true,
|
|
56
|
+
typecheck: true,
|
|
57
|
+
tests: true,
|
|
58
|
+
security_scan: false,
|
|
59
|
+
min_coverage: 50,
|
|
60
|
+
},
|
|
61
|
+
|
|
62
|
+
pr_defaults: {
|
|
63
|
+
auto_assign_reviewers: false,
|
|
64
|
+
draft_by_default: false,
|
|
65
|
+
include_deployment_info: true,
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Loads deployment configuration from core-config.yaml
|
|
71
|
+
*
|
|
72
|
+
* @param {string} projectRoot - Project root directory
|
|
73
|
+
* @returns {Object} Deployment configuration (merged with defaults)
|
|
74
|
+
*/
|
|
75
|
+
function loadDeploymentConfig(projectRoot) {
|
|
76
|
+
const configPath = path.join(projectRoot, '.aios-core', 'core-config.yaml');
|
|
77
|
+
|
|
78
|
+
if (!fs.existsSync(configPath)) {
|
|
79
|
+
console.warn(`[deployment-config-loader] core-config.yaml not found at ${configPath}`);
|
|
80
|
+
console.warn('[deployment-config-loader] Using default deployment configuration');
|
|
81
|
+
return { ...DEFAULT_DEPLOYMENT_CONFIG };
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
try {
|
|
85
|
+
const configContent = fs.readFileSync(configPath, 'utf8');
|
|
86
|
+
const config = yaml.parse(configContent);
|
|
87
|
+
|
|
88
|
+
if (!config || !config.deployment) {
|
|
89
|
+
console.warn('[deployment-config-loader] No deployment section in core-config.yaml');
|
|
90
|
+
console.warn('[deployment-config-loader] Using default deployment configuration');
|
|
91
|
+
return { ...DEFAULT_DEPLOYMENT_CONFIG };
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Deep merge with defaults to ensure all required fields exist
|
|
95
|
+
return deepMerge(DEFAULT_DEPLOYMENT_CONFIG, config.deployment);
|
|
96
|
+
} catch (error) {
|
|
97
|
+
console.error(`[deployment-config-loader] Error loading config: ${error.message}`);
|
|
98
|
+
console.warn('[deployment-config-loader] Using default deployment configuration');
|
|
99
|
+
return { ...DEFAULT_DEPLOYMENT_CONFIG };
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Loads project configuration from core-config.yaml
|
|
105
|
+
*
|
|
106
|
+
* @param {string} projectRoot - Project root directory
|
|
107
|
+
* @returns {Object|null} Project configuration or null if not found
|
|
108
|
+
*/
|
|
109
|
+
function loadProjectConfig(projectRoot) {
|
|
110
|
+
const configPath = path.join(projectRoot, '.aios-core', 'core-config.yaml');
|
|
111
|
+
|
|
112
|
+
if (!fs.existsSync(configPath)) {
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
try {
|
|
117
|
+
const configContent = fs.readFileSync(configPath, 'utf8');
|
|
118
|
+
const config = yaml.parse(configContent);
|
|
119
|
+
return config.project || null;
|
|
120
|
+
} catch (error) {
|
|
121
|
+
console.error(`[deployment-config-loader] Error loading project config: ${error.message}`);
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Gets the target branch for a given source branch
|
|
128
|
+
*
|
|
129
|
+
* @param {string} sourceBranch - Source branch name
|
|
130
|
+
* @param {Object} deploymentConfig - Deployment configuration
|
|
131
|
+
* @returns {string} Target branch name
|
|
132
|
+
*/
|
|
133
|
+
function getTargetBranch(sourceBranch, deploymentConfig) {
|
|
134
|
+
const { branches, workflow } = deploymentConfig;
|
|
135
|
+
|
|
136
|
+
// Check if it's a staging branch (used for promotion)
|
|
137
|
+
if (sourceBranch === branches.staging_branch) {
|
|
138
|
+
return branches.production_branch;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Check production targets (hotfix/* etc.)
|
|
142
|
+
for (const pattern of branches.production_targets || []) {
|
|
143
|
+
if (matchesBranchPattern(sourceBranch, pattern)) {
|
|
144
|
+
return branches.production_branch;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Check staging targets
|
|
149
|
+
for (const pattern of branches.staging_targets || []) {
|
|
150
|
+
if (matchesBranchPattern(sourceBranch, pattern)) {
|
|
151
|
+
// If direct-to-main workflow, target production
|
|
152
|
+
if (workflow === 'direct-to-main') {
|
|
153
|
+
return branches.production_branch;
|
|
154
|
+
}
|
|
155
|
+
return branches.staging_branch || branches.production_branch;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// Default target - resolve symbolic name to actual branch
|
|
160
|
+
const defaultTarget = (branches.default_target || 'production').toLowerCase();
|
|
161
|
+
const stagingBranch = branches.staging_branch;
|
|
162
|
+
const productionBranch = branches.production_branch;
|
|
163
|
+
|
|
164
|
+
// Handle symbolic names
|
|
165
|
+
if (defaultTarget === 'staging') {
|
|
166
|
+
return stagingBranch || productionBranch;
|
|
167
|
+
}
|
|
168
|
+
if (defaultTarget === 'production') {
|
|
169
|
+
return productionBranch;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// Handle explicit branch names as fallback (for manually-edited configs)
|
|
173
|
+
if (stagingBranch && defaultTarget === stagingBranch.toLowerCase()) {
|
|
174
|
+
return stagingBranch;
|
|
175
|
+
}
|
|
176
|
+
if (productionBranch && defaultTarget === productionBranch.toLowerCase()) {
|
|
177
|
+
return productionBranch;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// Conservative fallback with warning
|
|
181
|
+
console.warn(
|
|
182
|
+
`[deployment-config-loader] Unknown default_target "${branches.default_target}", falling back to production`,
|
|
183
|
+
);
|
|
184
|
+
return productionBranch;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Checks if a branch name matches a pattern
|
|
189
|
+
*
|
|
190
|
+
* @param {string} branchName - Branch name to check
|
|
191
|
+
* @param {string} pattern - Pattern to match (e.g., "feature/*")
|
|
192
|
+
* @returns {boolean} True if matches
|
|
193
|
+
*/
|
|
194
|
+
function matchesBranchPattern(branchName, pattern) {
|
|
195
|
+
// Escape regex metacharacters first, then convert glob wildcards
|
|
196
|
+
// Order matters: escape special chars, then convert * and ?
|
|
197
|
+
const regexPattern = pattern
|
|
198
|
+
.replace(/[.+^${}()|[\]\\]/g, '\\$&') // Escape regex metacharacters (except * and ?)
|
|
199
|
+
.replace(/\*/g, '.*') // Convert glob * to regex .*
|
|
200
|
+
.replace(/\?/g, '.'); // Convert glob ? to regex .
|
|
201
|
+
|
|
202
|
+
const regex = new RegExp(`^${regexPattern}$`);
|
|
203
|
+
return regex.test(branchName);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Gets environment configuration by name
|
|
208
|
+
*
|
|
209
|
+
* @param {string} envName - Environment name (staging/production)
|
|
210
|
+
* @param {Object} deploymentConfig - Deployment configuration
|
|
211
|
+
* @returns {Object|null} Environment configuration
|
|
212
|
+
*/
|
|
213
|
+
function getEnvironmentConfig(envName, deploymentConfig) {
|
|
214
|
+
const normalized = envName.toLowerCase();
|
|
215
|
+
return deploymentConfig.environments?.[normalized] || null;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Checks if quality gate is enabled
|
|
220
|
+
*
|
|
221
|
+
* @param {string} gateName - Gate name (lint, typecheck, tests, security_scan)
|
|
222
|
+
* @param {Object} deploymentConfig - Deployment configuration
|
|
223
|
+
* @returns {boolean} True if gate is enabled
|
|
224
|
+
*/
|
|
225
|
+
function isQualityGateEnabled(gateName, deploymentConfig) {
|
|
226
|
+
return deploymentConfig.quality_gates?.[gateName] === true;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Gets all enabled quality gates
|
|
231
|
+
*
|
|
232
|
+
* @param {Object} deploymentConfig - Deployment configuration
|
|
233
|
+
* @returns {string[]} List of enabled gate names
|
|
234
|
+
*/
|
|
235
|
+
function getEnabledQualityGates(deploymentConfig) {
|
|
236
|
+
const gates = deploymentConfig.quality_gates || {};
|
|
237
|
+
return Object.entries(gates)
|
|
238
|
+
.filter(([key, value]) => value === true && key !== 'min_coverage')
|
|
239
|
+
.map(([key]) => key);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Deep merge two objects
|
|
244
|
+
*
|
|
245
|
+
* @param {Object} target - Target object
|
|
246
|
+
* @param {Object} source - Source object
|
|
247
|
+
* @returns {Object} Merged object
|
|
248
|
+
*/
|
|
249
|
+
function deepMerge(target, source) {
|
|
250
|
+
const result = { ...target };
|
|
251
|
+
|
|
252
|
+
for (const key of Object.keys(source)) {
|
|
253
|
+
if (source[key] && typeof source[key] === 'object' && !Array.isArray(source[key])) {
|
|
254
|
+
result[key] = deepMerge(target[key] || {}, source[key]);
|
|
255
|
+
} else if (source[key] !== undefined) {
|
|
256
|
+
result[key] = source[key];
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
return result;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* Validates deployment configuration
|
|
265
|
+
*
|
|
266
|
+
* @param {Object} config - Deployment configuration to validate
|
|
267
|
+
* @returns {Object} Validation result with isValid and errors
|
|
268
|
+
*/
|
|
269
|
+
function validateDeploymentConfig(config) {
|
|
270
|
+
const errors = [];
|
|
271
|
+
|
|
272
|
+
// Check workflow
|
|
273
|
+
if (!['staging-first', 'direct-to-main'].includes(config.workflow)) {
|
|
274
|
+
errors.push(`Invalid workflow: ${config.workflow}`);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// Check branches
|
|
278
|
+
if (!config.branches?.production_branch) {
|
|
279
|
+
errors.push('Missing production_branch');
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
if (config.workflow === 'staging-first' && !config.branches?.staging_branch) {
|
|
283
|
+
errors.push('staging-first workflow requires staging_branch');
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// Check environments
|
|
287
|
+
if (!config.environments?.production) {
|
|
288
|
+
errors.push('Missing production environment configuration');
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
return {
|
|
292
|
+
isValid: errors.length === 0,
|
|
293
|
+
errors,
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
module.exports = {
|
|
298
|
+
loadDeploymentConfig,
|
|
299
|
+
loadProjectConfig,
|
|
300
|
+
getTargetBranch,
|
|
301
|
+
matchesBranchPattern,
|
|
302
|
+
getEnvironmentConfig,
|
|
303
|
+
isQualityGateEnabled,
|
|
304
|
+
getEnabledQualityGates,
|
|
305
|
+
validateDeploymentConfig,
|
|
306
|
+
deepMerge,
|
|
307
|
+
DEFAULT_DEPLOYMENT_CONFIG,
|
|
308
|
+
};
|