aios-core 2.1.6 → 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-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 +1 -1
- 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/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/github-workflows/README.md +109 -109
- 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/tests/integration/wizard-detection.test.js +8 -6
- package/packages/installer/tests/unit/env-template.test.js +8 -8
- 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/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/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
|
@@ -1,733 +1,733 @@
|
|
|
1
|
-
# pre-push-quality-gate.md
|
|
2
|
-
|
|
3
|
-
**Task**: Pre-Push Quality Gate Validation (Repository-Agnostic)
|
|
4
|
-
|
|
5
|
-
**Purpose**: Execute comprehensive quality checks before pushing code to remote repository, ensuring code quality, tests, and security standards are met.
|
|
6
|
-
|
|
7
|
-
**When to use**: Before pushing code to GitHub, always via `@github-devops *pre-push` command.
|
|
8
|
-
|
|
9
|
-
## Execution Modes
|
|
10
|
-
|
|
11
|
-
**Choose your execution mode:**
|
|
12
|
-
|
|
13
|
-
### 1. YOLO Mode - Fast, Autonomous (0-1 prompts)
|
|
14
|
-
- Autonomous decision making with logging
|
|
15
|
-
- Minimal user interaction
|
|
16
|
-
- **Best for:** Simple, deterministic tasks
|
|
17
|
-
|
|
18
|
-
### 2. Interactive Mode - Balanced, Educational (5-10 prompts) **[DEFAULT]**
|
|
19
|
-
- Explicit decision checkpoints
|
|
20
|
-
- Educational explanations
|
|
21
|
-
- **Best for:** Learning, complex decisions
|
|
22
|
-
|
|
23
|
-
### 3. Pre-Flight Planning - Comprehensive Upfront Planning
|
|
24
|
-
- Task analysis phase (identify all ambiguities)
|
|
25
|
-
- Zero ambiguity execution
|
|
26
|
-
- **Best for:** Ambiguous requirements, critical work
|
|
27
|
-
|
|
28
|
-
**Parameter:** `mode` (optional, default: `interactive`)
|
|
29
|
-
|
|
30
|
-
---
|
|
31
|
-
|
|
32
|
-
## Task Definition (AIOS Task Format V1.0)
|
|
33
|
-
|
|
34
|
-
```yaml
|
|
35
|
-
task: githubDevopsPrePushQualityGate()
|
|
36
|
-
responsável: Gage (Automator)
|
|
37
|
-
responsavel_type: Agente
|
|
38
|
-
atomic_layer: Organism
|
|
39
|
-
|
|
40
|
-
**Entrada:**
|
|
41
|
-
- campo: task
|
|
42
|
-
tipo: string
|
|
43
|
-
origem: User Input
|
|
44
|
-
obrigatório: true
|
|
45
|
-
validação: Must be registered task
|
|
46
|
-
|
|
47
|
-
- campo: parameters
|
|
48
|
-
tipo: object
|
|
49
|
-
origem: User Input
|
|
50
|
-
obrigatório: false
|
|
51
|
-
validação: Valid task parameters
|
|
52
|
-
|
|
53
|
-
- campo: mode
|
|
54
|
-
tipo: string
|
|
55
|
-
origem: User Input
|
|
56
|
-
obrigatório: false
|
|
57
|
-
validação: yolo|interactive|pre-flight
|
|
58
|
-
|
|
59
|
-
**Saída:**
|
|
60
|
-
- campo: execution_result
|
|
61
|
-
tipo: object
|
|
62
|
-
destino: Memory
|
|
63
|
-
persistido: false
|
|
64
|
-
|
|
65
|
-
- campo: logs
|
|
66
|
-
tipo: array
|
|
67
|
-
destino: File (.ai/logs/*)
|
|
68
|
-
persistido: true
|
|
69
|
-
|
|
70
|
-
- campo: state
|
|
71
|
-
tipo: object
|
|
72
|
-
destino: State management
|
|
73
|
-
persistido: true
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
---
|
|
77
|
-
|
|
78
|
-
## Pre-Conditions
|
|
79
|
-
|
|
80
|
-
**Purpose:** Validate prerequisites BEFORE task execution (blocking)
|
|
81
|
-
|
|
82
|
-
**Checklist:**
|
|
83
|
-
|
|
84
|
-
```yaml
|
|
85
|
-
pre-conditions:
|
|
86
|
-
- [ ] Task is registered; required parameters provided; dependencies met
|
|
87
|
-
tipo: pre-condition
|
|
88
|
-
blocker: true
|
|
89
|
-
validação: |
|
|
90
|
-
Check task is registered; required parameters provided; dependencies met
|
|
91
|
-
error_message: "Pre-condition failed: Task is registered; required parameters provided; dependencies met"
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
---
|
|
95
|
-
|
|
96
|
-
## Post-Conditions
|
|
97
|
-
|
|
98
|
-
**Purpose:** Validate execution success AFTER task completes
|
|
99
|
-
|
|
100
|
-
**Checklist:**
|
|
101
|
-
|
|
102
|
-
```yaml
|
|
103
|
-
post-conditions:
|
|
104
|
-
- [ ] Task completed; exit code 0; expected outputs created
|
|
105
|
-
tipo: post-condition
|
|
106
|
-
blocker: true
|
|
107
|
-
validação: |
|
|
108
|
-
Verify task completed; exit code 0; expected outputs created
|
|
109
|
-
error_message: "Post-condition failed: Task completed; exit code 0; expected outputs created"
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
---
|
|
113
|
-
|
|
114
|
-
## Acceptance Criteria
|
|
115
|
-
|
|
116
|
-
**Purpose:** Definitive pass/fail criteria for task completion
|
|
117
|
-
|
|
118
|
-
**Checklist:**
|
|
119
|
-
|
|
120
|
-
```yaml
|
|
121
|
-
acceptance-criteria:
|
|
122
|
-
- [ ] Task completed as expected; side effects documented
|
|
123
|
-
tipo: acceptance-criterion
|
|
124
|
-
blocker: true
|
|
125
|
-
validação: |
|
|
126
|
-
Assert task completed as expected; side effects documented
|
|
127
|
-
error_message: "Acceptance criterion not met: Task completed as expected; side effects documented"
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
---
|
|
131
|
-
|
|
132
|
-
## Tools
|
|
133
|
-
|
|
134
|
-
**External/shared resources used by this task:**
|
|
135
|
-
|
|
136
|
-
- **Tool:** task-runner
|
|
137
|
-
- **Purpose:** Task execution and orchestration
|
|
138
|
-
- **Source:** .aios-core/core/task-runner.js
|
|
139
|
-
|
|
140
|
-
- **Tool:** logger
|
|
141
|
-
- **Purpose:** Execution logging and error tracking
|
|
142
|
-
- **Source:** .aios-core/utils/logger.js
|
|
143
|
-
|
|
144
|
-
---
|
|
145
|
-
|
|
146
|
-
## Scripts
|
|
147
|
-
|
|
148
|
-
**Agent-specific code for this task:**
|
|
149
|
-
|
|
150
|
-
- **Script:** execute-task.js
|
|
151
|
-
- **Purpose:** Generic task execution wrapper
|
|
152
|
-
- **Language:** JavaScript
|
|
153
|
-
- **Location:** .aios-core/scripts/execute-task.js
|
|
154
|
-
|
|
155
|
-
---
|
|
156
|
-
|
|
157
|
-
## Error Handling
|
|
158
|
-
|
|
159
|
-
**Strategy:** retry
|
|
160
|
-
|
|
161
|
-
**Common Errors:**
|
|
162
|
-
|
|
163
|
-
1. **Error:** Task Not Found
|
|
164
|
-
- **Cause:** Specified task not registered in system
|
|
165
|
-
- **Resolution:** Verify task name and registration
|
|
166
|
-
- **Recovery:** List available tasks, suggest similar
|
|
167
|
-
|
|
168
|
-
2. **Error:** Invalid Parameters
|
|
169
|
-
- **Cause:** Task parameters do not match expected schema
|
|
170
|
-
- **Resolution:** Validate parameters against task definition
|
|
171
|
-
- **Recovery:** Provide parameter template, reject execution
|
|
172
|
-
|
|
173
|
-
3. **Error:** Execution Timeout
|
|
174
|
-
- **Cause:** Task exceeds maximum execution time
|
|
175
|
-
- **Resolution:** Optimize task or increase timeout
|
|
176
|
-
- **Recovery:** Kill task, cleanup resources, log state
|
|
177
|
-
|
|
178
|
-
---
|
|
179
|
-
|
|
180
|
-
## Performance
|
|
181
|
-
|
|
182
|
-
**Expected Metrics:**
|
|
183
|
-
|
|
184
|
-
```yaml
|
|
185
|
-
duration_expected: 5-15 min (estimated)
|
|
186
|
-
cost_estimated: $0.003-0.010
|
|
187
|
-
token_usage: ~3,000-10,000 tokens
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
**Optimization Notes:**
|
|
191
|
-
- Break into smaller workflows; implement checkpointing; use async processing where possible
|
|
192
|
-
|
|
193
|
-
---
|
|
194
|
-
|
|
195
|
-
## Metadata
|
|
196
|
-
|
|
197
|
-
```yaml
|
|
198
|
-
story: N/A
|
|
199
|
-
version: 1.0.0
|
|
200
|
-
dependencies:
|
|
201
|
-
- N/A
|
|
202
|
-
tags:
|
|
203
|
-
- automation
|
|
204
|
-
- workflow
|
|
205
|
-
updated_at: 2025-11-17
|
|
206
|
-
```
|
|
207
|
-
|
|
208
|
-
---
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
## Prerequisites
|
|
212
|
-
- Git repository with changes to push
|
|
213
|
-
- package.json with npm scripts (gracefully handles missing scripts)
|
|
214
|
-
- Repository context detected (run `aios init` if needed)
|
|
215
|
-
|
|
216
|
-
## Quality Gate Checks
|
|
217
|
-
|
|
218
|
-
### 1. Repository Context Detection
|
|
219
|
-
|
|
220
|
-
```javascript
|
|
221
|
-
const { detectRepositoryContext } = require('./../scripts/repository-detector');
|
|
222
|
-
|
|
223
|
-
const context = detectRepositoryContext();
|
|
224
|
-
if (!context) {
|
|
225
|
-
console.error('❌ Unable to detect repository context');
|
|
226
|
-
console.error('Run "aios init" to configure installation mode');
|
|
227
|
-
process.exit(1);
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
console.log(`\n🚀 Pre-Push Quality Gate`);
|
|
231
|
-
console.log(`Repository: ${context.repositoryUrl}`);
|
|
232
|
-
console.log(`Mode: ${context.mode}`);
|
|
233
|
-
console.log(`Package: ${context.packageName} v${context.packageVersion}\n`);
|
|
234
|
-
```
|
|
235
|
-
|
|
236
|
-
### 2. Check for Uncommitted Changes
|
|
237
|
-
|
|
238
|
-
```bash
|
|
239
|
-
git status --porcelain
|
|
240
|
-
```
|
|
241
|
-
|
|
242
|
-
If output is not empty, fail with message:
|
|
243
|
-
```
|
|
244
|
-
❌ Uncommitted changes detected!
|
|
245
|
-
|
|
246
|
-
Please commit or stash changes before pushing:
|
|
247
|
-
git add .
|
|
248
|
-
git commit -m "your message"
|
|
249
|
-
```
|
|
250
|
-
|
|
251
|
-
### 3. Check for Merge Conflicts
|
|
252
|
-
|
|
253
|
-
```bash
|
|
254
|
-
git diff --check
|
|
255
|
-
```
|
|
256
|
-
|
|
257
|
-
If conflicts detected, fail with message:
|
|
258
|
-
```
|
|
259
|
-
❌ Merge conflicts detected!
|
|
260
|
-
|
|
261
|
-
Resolve conflicts before pushing.
|
|
262
|
-
```
|
|
263
|
-
|
|
264
|
-
### 4. Run npm run lint (if script exists)
|
|
265
|
-
|
|
266
|
-
```javascript
|
|
267
|
-
function runNpmScript(scriptName, projectRoot) {
|
|
268
|
-
const packageJsonPath = path.join(projectRoot, 'package.json');
|
|
269
|
-
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
|
|
270
|
-
|
|
271
|
-
if (!packageJson.scripts || !packageJson.scripts[scriptName]) {
|
|
272
|
-
console.log(`⚠️ Script "${scriptName}" not found - skipping`);
|
|
273
|
-
return { skipped: true };
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
try {
|
|
277
|
-
execSync(`npm run ${scriptName}`, {
|
|
278
|
-
cwd: projectRoot,
|
|
279
|
-
stdio: 'inherit'
|
|
280
|
-
});
|
|
281
|
-
console.log(`✓ ${scriptName} PASSED`);
|
|
282
|
-
return { passed: true };
|
|
283
|
-
} catch (error) {
|
|
284
|
-
console.error(`❌ ${scriptName} FAILED`);
|
|
285
|
-
return { passed: false, error };
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
```
|
|
289
|
-
|
|
290
|
-
### 5. Run npm test (if script exists)
|
|
291
|
-
|
|
292
|
-
Same logic as lint, but for `npm test`.
|
|
293
|
-
|
|
294
|
-
### 6. Run npm run typecheck (if script exists)
|
|
295
|
-
|
|
296
|
-
Same logic as lint, but for `npm run typecheck`.
|
|
297
|
-
|
|
298
|
-
### 7. Run npm run build (if script exists)
|
|
299
|
-
|
|
300
|
-
Same logic as lint, but for `npm run build`.
|
|
301
|
-
|
|
302
|
-
### 8. Run CodeRabbit CLI Review (TR-3.14.12)
|
|
303
|
-
|
|
304
|
-
```javascript
|
|
305
|
-
const { execSync } = require('child_process');
|
|
306
|
-
|
|
307
|
-
function runCodeRabbitReview(projectRoot) {
|
|
308
|
-
console.log('\n🐰 Running CodeRabbit CLI Review...');
|
|
309
|
-
console.log('⏱️ This may take 7-30 minutes. Please wait...\n');
|
|
310
|
-
|
|
311
|
-
try {
|
|
312
|
-
// Construct WSL command with proper paths
|
|
313
|
-
const wslProjectPath = projectRoot
|
|
314
|
-
.replace(/\\/g, '/')
|
|
315
|
-
.replace(/^([A-Z]):/, (match, drive) => `/mnt/${drive.toLowerCase()}`);
|
|
316
|
-
|
|
317
|
-
const coderabbitCommand = `wsl bash -c 'cd ${wslProjectPath} && ~/.local/bin/coderabbit --prompt-only -t uncommitted'`;
|
|
318
|
-
|
|
319
|
-
console.log(`Executing: ${coderabbitCommand}\n`);
|
|
320
|
-
|
|
321
|
-
// Execute with 15-minute timeout
|
|
322
|
-
const output = execSync(coderabbitCommand, {
|
|
323
|
-
cwd: projectRoot,
|
|
324
|
-
encoding: 'utf8',
|
|
325
|
-
timeout: 900000, // 15 minutes
|
|
326
|
-
stdio: 'pipe',
|
|
327
|
-
maxBuffer: 10 * 1024 * 1024 // 10MB buffer
|
|
328
|
-
});
|
|
329
|
-
|
|
330
|
-
// Parse CodeRabbit output
|
|
331
|
-
const results = parseCodeRabbitOutput(output);
|
|
332
|
-
|
|
333
|
-
console.log(`\n✅ CodeRabbit Review Complete:`);
|
|
334
|
-
console.log(` - CRITICAL: ${results.critical}`);
|
|
335
|
-
console.log(` - HIGH: ${results.high}`);
|
|
336
|
-
console.log(` - MEDIUM: ${results.medium}`);
|
|
337
|
-
console.log(` - LOW: ${results.low}`);
|
|
338
|
-
|
|
339
|
-
// Determine gate impact
|
|
340
|
-
const gateImpact = determineCodeRabbitGate(results);
|
|
341
|
-
|
|
342
|
-
return { gateImpact, results, rawOutput: output };
|
|
343
|
-
} catch (error) {
|
|
344
|
-
// Handle timeout
|
|
345
|
-
if (error.killed && error.signal === 'SIGTERM') {
|
|
346
|
-
console.error('❌ CodeRabbit review timed out after 15 minutes');
|
|
347
|
-
console.error(' Review may still be processing. Check manually.');
|
|
348
|
-
return { gateImpact: 'FAIL', error: 'Timeout', timeout: true };
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
// Handle authentication errors
|
|
352
|
-
if (error.stderr && error.stderr.includes('not authenticated')) {
|
|
353
|
-
console.error('❌ CodeRabbit not authenticated');
|
|
354
|
-
console.error(' Run: wsl bash -c "~/.local/bin/coderabbit auth status"');
|
|
355
|
-
return { gateImpact: 'FAIL', error: 'Not authenticated' };
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
// Handle command not found
|
|
359
|
-
if (error.stderr && error.stderr.includes('command not found')) {
|
|
360
|
-
console.error('❌ CodeRabbit CLI not found in WSL');
|
|
361
|
-
console.error(' Expected location: ~/.local/bin/coderabbit');
|
|
362
|
-
console.error(' Verify: wsl bash -c "~/.local/bin/coderabbit --version"');
|
|
363
|
-
return { gateImpact: 'FAIL', error: 'Not installed' };
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
// Generic error with output for debugging
|
|
367
|
-
console.error('❌ CodeRabbit review failed:', error.message);
|
|
368
|
-
if (error.stdout) {
|
|
369
|
-
console.log('Output:', error.stdout.toString().substring(0, 500));
|
|
370
|
-
}
|
|
371
|
-
return { gateImpact: 'CONCERNS', error: error.message };
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
function parseCodeRabbitOutput(output) {
|
|
376
|
-
// CodeRabbit outputs issues with type markers
|
|
377
|
-
const lines = output.split('\n');
|
|
378
|
-
|
|
379
|
-
let critical = 0;
|
|
380
|
-
let high = 0;
|
|
381
|
-
let medium = 0;
|
|
382
|
-
let low = 0;
|
|
383
|
-
|
|
384
|
-
for (const line of lines) {
|
|
385
|
-
// Check for issue type markers
|
|
386
|
-
if (line.includes('Type: critical') || line.match(/\bCRITICAL\b/i)) {
|
|
387
|
-
critical++;
|
|
388
|
-
} else if (line.includes('Type: high') || line.match(/\bHIGH\b/i)) {
|
|
389
|
-
high++;
|
|
390
|
-
} else if (line.includes('Type: potential_issue') || line.match(/\bMEDIUM\b/i)) {
|
|
391
|
-
medium++;
|
|
392
|
-
} else if (line.includes('Type: refactor_suggestion') || line.match(/\bLOW\b/i)) {
|
|
393
|
-
low++;
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
return { critical, high, medium, low };
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
function determineCodeRabbitGate(results) {
|
|
401
|
-
// CRITICAL issues = auto-fail (block push)
|
|
402
|
-
if (results.critical > 0) {
|
|
403
|
-
console.log(`\n❌ FAIL: ${results.critical} CRITICAL issue(s) found - MUST FIX`);
|
|
404
|
-
return 'FAIL';
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
// HIGH issues = concerns (warn but allow push)
|
|
408
|
-
if (results.high > 0) {
|
|
409
|
-
console.log(`\n⚠️ CONCERNS: ${results.high} HIGH issue(s) found - recommend fix`);
|
|
410
|
-
return 'CONCERNS';
|
|
411
|
-
}
|
|
412
|
-
|
|
413
|
-
// Only MEDIUM or LOW = pass with notes
|
|
414
|
-
if (results.medium > 0 || results.low > 0) {
|
|
415
|
-
console.log(`\n✅ PASS: Only ${results.medium} MEDIUM and ${results.low} LOW issues`);
|
|
416
|
-
} else {
|
|
417
|
-
console.log(`\n✅ PASS: No issues found`);
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
return 'PASS';
|
|
421
|
-
}
|
|
422
|
-
```
|
|
423
|
-
|
|
424
|
-
**Usage in pre-push flow:**
|
|
425
|
-
```javascript
|
|
426
|
-
const coderabbitResult = runCodeRabbitReview(process.cwd());
|
|
427
|
-
|
|
428
|
-
if (coderabbitResult.gateImpact === 'FAIL') {
|
|
429
|
-
console.error('\n❌ CodeRabbit quality gate FAILED - cannot push');
|
|
430
|
-
process.exit(1);
|
|
431
|
-
}
|
|
432
|
-
|
|
433
|
-
if (coderabbitResult.gateImpact === 'CONCERNS') {
|
|
434
|
-
// Ask user for confirmation
|
|
435
|
-
const { confirm } = await inquirer.prompt([{
|
|
436
|
-
type: 'confirm',
|
|
437
|
-
name: 'confirm',
|
|
438
|
-
message: 'CodeRabbit found HIGH issues. Continue anyway?',
|
|
439
|
-
default: false
|
|
440
|
-
}]);
|
|
441
|
-
|
|
442
|
-
if (!confirm) {
|
|
443
|
-
console.log('Push cancelled - please address HIGH issues');
|
|
444
|
-
process.exit(2);
|
|
445
|
-
}
|
|
446
|
-
}
|
|
447
|
-
```
|
|
448
|
-
|
|
449
|
-
### 9. Run Security Scan (TR-3.14.11)
|
|
450
|
-
|
|
451
|
-
```javascript
|
|
452
|
-
const { execSync } = require('child_process');
|
|
453
|
-
const path = require('path');
|
|
454
|
-
|
|
455
|
-
function runSecurityScan(storyId, storyPath, projectRoot) {
|
|
456
|
-
console.log('\n🔒 Running Security Scan (SAST)...\n');
|
|
457
|
-
|
|
458
|
-
try {
|
|
459
|
-
// Execute security-scan.md task
|
|
460
|
-
const securityScanPath = path.join(__dirname, 'security-scan.md');
|
|
461
|
-
|
|
462
|
-
// For now, run security checks directly
|
|
463
|
-
const results = {
|
|
464
|
-
audit: runNpmAudit(projectRoot),
|
|
465
|
-
eslint: runESLintSecurity(projectRoot),
|
|
466
|
-
secrets: runSecretDetection(projectRoot)
|
|
467
|
-
};
|
|
468
|
-
|
|
469
|
-
// Determine gate impact
|
|
470
|
-
const gateImpact = determineSecurityGate(results);
|
|
471
|
-
|
|
472
|
-
console.log(`\nSecurity Scan Complete: ${gateImpact}`);
|
|
473
|
-
|
|
474
|
-
return { gateImpact, results };
|
|
475
|
-
} catch (error) {
|
|
476
|
-
console.error('❌ Security scan failed:', error.message);
|
|
477
|
-
return { gateImpact: 'FAIL', error };
|
|
478
|
-
}
|
|
479
|
-
}
|
|
480
|
-
|
|
481
|
-
function runNpmAudit(projectRoot) {
|
|
482
|
-
try {
|
|
483
|
-
const output = execSync('npm audit --audit-level=moderate --json', {
|
|
484
|
-
cwd: projectRoot
|
|
485
|
-
}).toString();
|
|
486
|
-
|
|
487
|
-
const results = JSON.parse(output);
|
|
488
|
-
const vulns = results.metadata?.vulnerabilities || {};
|
|
489
|
-
|
|
490
|
-
return {
|
|
491
|
-
critical: vulns.critical || 0,
|
|
492
|
-
high: vulns.high || 0,
|
|
493
|
-
moderate: vulns.moderate || 0,
|
|
494
|
-
low: vulns.low || 0,
|
|
495
|
-
gate: vulns.critical > 0 ? 'FAIL' : (vulns.high > 0 ? 'CONCERNS' : 'PASS')
|
|
496
|
-
};
|
|
497
|
-
} catch (error) {
|
|
498
|
-
// npm audit exits with 1 if vulnerabilities found
|
|
499
|
-
if (error.stdout) {
|
|
500
|
-
const results = JSON.parse(error.stdout.toString());
|
|
501
|
-
const vulns = results.metadata?.vulnerabilities || {};
|
|
502
|
-
|
|
503
|
-
return {
|
|
504
|
-
critical: vulns.critical || 0,
|
|
505
|
-
high: vulns.high || 0,
|
|
506
|
-
moderate: vulns.moderate || 0,
|
|
507
|
-
low: vulns.low || 0,
|
|
508
|
-
gate: vulns.critical > 0 ? 'FAIL' : (vulns.high > 0 ? 'CONCERNS' : 'PASS')
|
|
509
|
-
};
|
|
510
|
-
}
|
|
511
|
-
|
|
512
|
-
console.warn('⚠️ npm audit failed - skipping dependency check');
|
|
513
|
-
return { gate: 'PASS', skipped: true };
|
|
514
|
-
}
|
|
515
|
-
}
|
|
516
|
-
|
|
517
|
-
function runESLintSecurity(projectRoot) {
|
|
518
|
-
// Check if ESLint security config exists
|
|
519
|
-
const eslintConfigPath = path.join(projectRoot, '.eslintrc.security.json');
|
|
520
|
-
|
|
521
|
-
if (!fs.existsSync(eslintConfigPath)) {
|
|
522
|
-
console.log('⚠️ .eslintrc.security.json not found - skipping ESLint security');
|
|
523
|
-
return { gate: 'PASS', skipped: true };
|
|
524
|
-
}
|
|
525
|
-
|
|
526
|
-
try {
|
|
527
|
-
execSync('npx eslint . --ext .js,.ts --config .eslintrc.security.json', {
|
|
528
|
-
cwd: projectRoot,
|
|
529
|
-
stdio: 'pipe'
|
|
530
|
-
});
|
|
531
|
-
|
|
532
|
-
return { gate: 'PASS', issues: 0 };
|
|
533
|
-
} catch (error) {
|
|
534
|
-
// ESLint exits with 1 if issues found
|
|
535
|
-
const output = error.stdout?.toString() || '';
|
|
536
|
-
const errorCount = (output.match(/error/g) || []).length;
|
|
537
|
-
const warningCount = (output.match(/warning/g) || []).length;
|
|
538
|
-
|
|
539
|
-
return {
|
|
540
|
-
gate: errorCount > 0 ? 'FAIL' : (warningCount > 0 ? 'CONCERNS' : 'PASS'),
|
|
541
|
-
errors: errorCount,
|
|
542
|
-
warnings: warningCount
|
|
543
|
-
};
|
|
544
|
-
}
|
|
545
|
-
}
|
|
546
|
-
|
|
547
|
-
function runSecretDetection(projectRoot) {
|
|
548
|
-
try {
|
|
549
|
-
execSync('npx secretlint "**/*"', {
|
|
550
|
-
cwd: projectRoot,
|
|
551
|
-
stdio: 'pipe'
|
|
552
|
-
});
|
|
553
|
-
|
|
554
|
-
return { gate: 'PASS', secretsFound: 0 };
|
|
555
|
-
} catch (error) {
|
|
556
|
-
// secretlint exits with 1 if secrets found
|
|
557
|
-
return { gate: 'FAIL', secretsFound: 1 };
|
|
558
|
-
}
|
|
559
|
-
}
|
|
560
|
-
|
|
561
|
-
function determineSecurityGate(results) {
|
|
562
|
-
// Secrets are auto-fail
|
|
563
|
-
if (results.secrets.gate === 'FAIL') return 'FAIL';
|
|
564
|
-
|
|
565
|
-
// Any FAIL → overall FAIL
|
|
566
|
-
if (results.audit.gate === 'FAIL' || results.eslint.gate === 'FAIL') return 'FAIL';
|
|
567
|
-
|
|
568
|
-
// Any CONCERNS → overall CONCERNS
|
|
569
|
-
if (results.audit.gate === 'CONCERNS' || results.eslint.gate === 'CONCERNS') return 'CONCERNS';
|
|
570
|
-
|
|
571
|
-
// All PASS → overall PASS
|
|
572
|
-
return 'PASS';
|
|
573
|
-
}
|
|
574
|
-
```
|
|
575
|
-
|
|
576
|
-
### 10. Verify Story Status (Optional - if using story-driven workflow)
|
|
577
|
-
|
|
578
|
-
```javascript
|
|
579
|
-
function checkStoryStatus(storyPath) {
|
|
580
|
-
if (!storyPath || !fs.existsSync(storyPath)) {
|
|
581
|
-
console.log('⚠️ No story file specified - skipping story status check');
|
|
582
|
-
return { skipped: true };
|
|
583
|
-
}
|
|
584
|
-
|
|
585
|
-
const storyContent = fs.readFileSync(storyPath, 'utf8');
|
|
586
|
-
|
|
587
|
-
// Look for status: "Done" or status: "Ready for Review"
|
|
588
|
-
const statusMatch = storyContent.match(/status:\s*["']?(Done|Ready for Review|InProgress)["']?/i);
|
|
589
|
-
|
|
590
|
-
if (!statusMatch) {
|
|
591
|
-
console.log('⚠️ Unable to determine story status - skipping');
|
|
592
|
-
return { skipped: true };
|
|
593
|
-
}
|
|
594
|
-
|
|
595
|
-
const status = statusMatch[1];
|
|
596
|
-
|
|
597
|
-
if (status === 'Done' || status === 'Ready for Review') {
|
|
598
|
-
console.log(`✓ Story status: ${status}`);
|
|
599
|
-
return { passed: true, status };
|
|
600
|
-
} else {
|
|
601
|
-
console.log(`⚠️ Story status: ${status} (expected Done or Ready for Review)`);
|
|
602
|
-
return { passed: false, status };
|
|
603
|
-
}
|
|
604
|
-
}
|
|
605
|
-
```
|
|
606
|
-
|
|
607
|
-
## Summary Report
|
|
608
|
-
|
|
609
|
-
After all checks complete, present summary:
|
|
610
|
-
|
|
611
|
-
```
|
|
612
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
613
|
-
🚀 Pre-Push Quality Gate Summary
|
|
614
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
615
|
-
|
|
616
|
-
Repository: {repositoryUrl}
|
|
617
|
-
Package: {packageName} v{version}
|
|
618
|
-
Mode: {framework-development | project-development}
|
|
619
|
-
|
|
620
|
-
Quality Checks:
|
|
621
|
-
✓ No uncommitted changes
|
|
622
|
-
✓ No merge conflicts
|
|
623
|
-
✓ npm run lint PASSED
|
|
624
|
-
✓ npm test PASSED
|
|
625
|
-
✓ npm run typecheck PASSED
|
|
626
|
-
✓ npm run build PASSED
|
|
627
|
-
✓ Security scan PASSED
|
|
628
|
-
⚠️ Story status SKIPPED (no story file)
|
|
629
|
-
|
|
630
|
-
Security Scan Results:
|
|
631
|
-
✓ Dependencies: 0 critical, 0 high, 2 moderate, 5 low
|
|
632
|
-
✓ Code patterns: No security issues
|
|
633
|
-
✓ Secrets: No secrets detected
|
|
634
|
-
|
|
635
|
-
Overall Status: ✅ READY TO PUSH
|
|
636
|
-
|
|
637
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
638
|
-
|
|
639
|
-
Proceed with push to remote? (Y/n)
|
|
640
|
-
```
|
|
641
|
-
|
|
642
|
-
### If FAIL status:
|
|
643
|
-
|
|
644
|
-
```
|
|
645
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
646
|
-
❌ Pre-Push Quality Gate FAILED
|
|
647
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
648
|
-
|
|
649
|
-
Quality Checks:
|
|
650
|
-
❌ npm test FAILED
|
|
651
|
-
❌ Security scan FAILED (CRITICAL vulnerabilities)
|
|
652
|
-
|
|
653
|
-
Security Issues:
|
|
654
|
-
❌ Dependencies: 2 CRITICAL, 5 HIGH vulnerabilities
|
|
655
|
-
❌ Secrets: 1 API key detected in config/db.js
|
|
656
|
-
|
|
657
|
-
Overall Status: ❌ BLOCKED - Cannot push to remote
|
|
658
|
-
|
|
659
|
-
Action Required:
|
|
660
|
-
1. Fix failing tests
|
|
661
|
-
2. Run: npm audit fix --force
|
|
662
|
-
3. Remove secrets from codebase
|
|
663
|
-
4. Re-run quality gate
|
|
664
|
-
|
|
665
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
666
|
-
```
|
|
667
|
-
|
|
668
|
-
### If CONCERNS status:
|
|
669
|
-
|
|
670
|
-
```
|
|
671
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
672
|
-
⚠️ Pre-Push Quality Gate: CONCERNS
|
|
673
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
674
|
-
|
|
675
|
-
Quality Checks:
|
|
676
|
-
✓ All tests passed
|
|
677
|
-
⚠️ Security scan CONCERNS (HIGH vulnerabilities)
|
|
678
|
-
|
|
679
|
-
Security Issues:
|
|
680
|
-
⚠️ Dependencies: 0 CRITICAL, 3 HIGH, 10 MODERATE vulnerabilities
|
|
681
|
-
⚠️ Code patterns: 2 medium-severity issues
|
|
682
|
-
|
|
683
|
-
Overall Status: ⚠️ CONCERNS - Review recommended
|
|
684
|
-
|
|
685
|
-
Recommendations:
|
|
686
|
-
- Address HIGH vulnerabilities before production
|
|
687
|
-
- Review medium-severity code patterns
|
|
688
|
-
- Consider running: npm audit fix
|
|
689
|
-
|
|
690
|
-
Proceed with push anyway? (y/N)
|
|
691
|
-
```
|
|
692
|
-
|
|
693
|
-
## User Approval
|
|
694
|
-
|
|
695
|
-
```javascript
|
|
696
|
-
async function requestPushApproval(gateStatus) {
|
|
697
|
-
if (gateStatus === 'FAIL') {
|
|
698
|
-
console.log('\n❌ Quality gate FAILED. Cannot proceed with push.');
|
|
699
|
-
process.exit(1);
|
|
700
|
-
}
|
|
701
|
-
|
|
702
|
-
const { confirm } = await inquirer.prompt([
|
|
703
|
-
{
|
|
704
|
-
type: 'confirm',
|
|
705
|
-
name: 'confirm',
|
|
706
|
-
message: gateStatus === 'PASS'
|
|
707
|
-
? 'Proceed with push to remote?'
|
|
708
|
-
: 'Quality gate has CONCERNS. Proceed anyway?',
|
|
709
|
-
default: gateStatus === 'PASS'
|
|
710
|
-
}
|
|
711
|
-
]);
|
|
712
|
-
|
|
713
|
-
return confirm;
|
|
714
|
-
}
|
|
715
|
-
```
|
|
716
|
-
|
|
717
|
-
## Integration with @github-devops Agent
|
|
718
|
-
|
|
719
|
-
Called via `@github-devops *pre-push` command.
|
|
720
|
-
|
|
721
|
-
## Exit Codes
|
|
722
|
-
|
|
723
|
-
- `0` - All checks passed, user approved
|
|
724
|
-
- `1` - Quality gate failed (blocking)
|
|
725
|
-
- `2` - User declined to push
|
|
726
|
-
|
|
727
|
-
## Notes
|
|
728
|
-
|
|
729
|
-
- Works with ANY repository (framework or project)
|
|
730
|
-
- Gracefully handles missing npm scripts
|
|
731
|
-
- Security scan is mandatory (TR-3.14.11)
|
|
732
|
-
- User always has final approval
|
|
733
|
-
- Detailed logging for troubleshooting
|
|
1
|
+
# pre-push-quality-gate.md
|
|
2
|
+
|
|
3
|
+
**Task**: Pre-Push Quality Gate Validation (Repository-Agnostic)
|
|
4
|
+
|
|
5
|
+
**Purpose**: Execute comprehensive quality checks before pushing code to remote repository, ensuring code quality, tests, and security standards are met.
|
|
6
|
+
|
|
7
|
+
**When to use**: Before pushing code to GitHub, always via `@github-devops *pre-push` command.
|
|
8
|
+
|
|
9
|
+
## Execution Modes
|
|
10
|
+
|
|
11
|
+
**Choose your execution mode:**
|
|
12
|
+
|
|
13
|
+
### 1. YOLO Mode - Fast, Autonomous (0-1 prompts)
|
|
14
|
+
- Autonomous decision making with logging
|
|
15
|
+
- Minimal user interaction
|
|
16
|
+
- **Best for:** Simple, deterministic tasks
|
|
17
|
+
|
|
18
|
+
### 2. Interactive Mode - Balanced, Educational (5-10 prompts) **[DEFAULT]**
|
|
19
|
+
- Explicit decision checkpoints
|
|
20
|
+
- Educational explanations
|
|
21
|
+
- **Best for:** Learning, complex decisions
|
|
22
|
+
|
|
23
|
+
### 3. Pre-Flight Planning - Comprehensive Upfront Planning
|
|
24
|
+
- Task analysis phase (identify all ambiguities)
|
|
25
|
+
- Zero ambiguity execution
|
|
26
|
+
- **Best for:** Ambiguous requirements, critical work
|
|
27
|
+
|
|
28
|
+
**Parameter:** `mode` (optional, default: `interactive`)
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Task Definition (AIOS Task Format V1.0)
|
|
33
|
+
|
|
34
|
+
```yaml
|
|
35
|
+
task: githubDevopsPrePushQualityGate()
|
|
36
|
+
responsável: Gage (Automator)
|
|
37
|
+
responsavel_type: Agente
|
|
38
|
+
atomic_layer: Organism
|
|
39
|
+
|
|
40
|
+
**Entrada:**
|
|
41
|
+
- campo: task
|
|
42
|
+
tipo: string
|
|
43
|
+
origem: User Input
|
|
44
|
+
obrigatório: true
|
|
45
|
+
validação: Must be registered task
|
|
46
|
+
|
|
47
|
+
- campo: parameters
|
|
48
|
+
tipo: object
|
|
49
|
+
origem: User Input
|
|
50
|
+
obrigatório: false
|
|
51
|
+
validação: Valid task parameters
|
|
52
|
+
|
|
53
|
+
- campo: mode
|
|
54
|
+
tipo: string
|
|
55
|
+
origem: User Input
|
|
56
|
+
obrigatório: false
|
|
57
|
+
validação: yolo|interactive|pre-flight
|
|
58
|
+
|
|
59
|
+
**Saída:**
|
|
60
|
+
- campo: execution_result
|
|
61
|
+
tipo: object
|
|
62
|
+
destino: Memory
|
|
63
|
+
persistido: false
|
|
64
|
+
|
|
65
|
+
- campo: logs
|
|
66
|
+
tipo: array
|
|
67
|
+
destino: File (.ai/logs/*)
|
|
68
|
+
persistido: true
|
|
69
|
+
|
|
70
|
+
- campo: state
|
|
71
|
+
tipo: object
|
|
72
|
+
destino: State management
|
|
73
|
+
persistido: true
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## Pre-Conditions
|
|
79
|
+
|
|
80
|
+
**Purpose:** Validate prerequisites BEFORE task execution (blocking)
|
|
81
|
+
|
|
82
|
+
**Checklist:**
|
|
83
|
+
|
|
84
|
+
```yaml
|
|
85
|
+
pre-conditions:
|
|
86
|
+
- [ ] Task is registered; required parameters provided; dependencies met
|
|
87
|
+
tipo: pre-condition
|
|
88
|
+
blocker: true
|
|
89
|
+
validação: |
|
|
90
|
+
Check task is registered; required parameters provided; dependencies met
|
|
91
|
+
error_message: "Pre-condition failed: Task is registered; required parameters provided; dependencies met"
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## Post-Conditions
|
|
97
|
+
|
|
98
|
+
**Purpose:** Validate execution success AFTER task completes
|
|
99
|
+
|
|
100
|
+
**Checklist:**
|
|
101
|
+
|
|
102
|
+
```yaml
|
|
103
|
+
post-conditions:
|
|
104
|
+
- [ ] Task completed; exit code 0; expected outputs created
|
|
105
|
+
tipo: post-condition
|
|
106
|
+
blocker: true
|
|
107
|
+
validação: |
|
|
108
|
+
Verify task completed; exit code 0; expected outputs created
|
|
109
|
+
error_message: "Post-condition failed: Task completed; exit code 0; expected outputs created"
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## Acceptance Criteria
|
|
115
|
+
|
|
116
|
+
**Purpose:** Definitive pass/fail criteria for task completion
|
|
117
|
+
|
|
118
|
+
**Checklist:**
|
|
119
|
+
|
|
120
|
+
```yaml
|
|
121
|
+
acceptance-criteria:
|
|
122
|
+
- [ ] Task completed as expected; side effects documented
|
|
123
|
+
tipo: acceptance-criterion
|
|
124
|
+
blocker: true
|
|
125
|
+
validação: |
|
|
126
|
+
Assert task completed as expected; side effects documented
|
|
127
|
+
error_message: "Acceptance criterion not met: Task completed as expected; side effects documented"
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## Tools
|
|
133
|
+
|
|
134
|
+
**External/shared resources used by this task:**
|
|
135
|
+
|
|
136
|
+
- **Tool:** task-runner
|
|
137
|
+
- **Purpose:** Task execution and orchestration
|
|
138
|
+
- **Source:** .aios-core/core/task-runner.js
|
|
139
|
+
|
|
140
|
+
- **Tool:** logger
|
|
141
|
+
- **Purpose:** Execution logging and error tracking
|
|
142
|
+
- **Source:** .aios-core/utils/logger.js
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## Scripts
|
|
147
|
+
|
|
148
|
+
**Agent-specific code for this task:**
|
|
149
|
+
|
|
150
|
+
- **Script:** execute-task.js
|
|
151
|
+
- **Purpose:** Generic task execution wrapper
|
|
152
|
+
- **Language:** JavaScript
|
|
153
|
+
- **Location:** .aios-core/scripts/execute-task.js
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## Error Handling
|
|
158
|
+
|
|
159
|
+
**Strategy:** retry
|
|
160
|
+
|
|
161
|
+
**Common Errors:**
|
|
162
|
+
|
|
163
|
+
1. **Error:** Task Not Found
|
|
164
|
+
- **Cause:** Specified task not registered in system
|
|
165
|
+
- **Resolution:** Verify task name and registration
|
|
166
|
+
- **Recovery:** List available tasks, suggest similar
|
|
167
|
+
|
|
168
|
+
2. **Error:** Invalid Parameters
|
|
169
|
+
- **Cause:** Task parameters do not match expected schema
|
|
170
|
+
- **Resolution:** Validate parameters against task definition
|
|
171
|
+
- **Recovery:** Provide parameter template, reject execution
|
|
172
|
+
|
|
173
|
+
3. **Error:** Execution Timeout
|
|
174
|
+
- **Cause:** Task exceeds maximum execution time
|
|
175
|
+
- **Resolution:** Optimize task or increase timeout
|
|
176
|
+
- **Recovery:** Kill task, cleanup resources, log state
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## Performance
|
|
181
|
+
|
|
182
|
+
**Expected Metrics:**
|
|
183
|
+
|
|
184
|
+
```yaml
|
|
185
|
+
duration_expected: 5-15 min (estimated)
|
|
186
|
+
cost_estimated: $0.003-0.010
|
|
187
|
+
token_usage: ~3,000-10,000 tokens
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
**Optimization Notes:**
|
|
191
|
+
- Break into smaller workflows; implement checkpointing; use async processing where possible
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## Metadata
|
|
196
|
+
|
|
197
|
+
```yaml
|
|
198
|
+
story: N/A
|
|
199
|
+
version: 1.0.0
|
|
200
|
+
dependencies:
|
|
201
|
+
- N/A
|
|
202
|
+
tags:
|
|
203
|
+
- automation
|
|
204
|
+
- workflow
|
|
205
|
+
updated_at: 2025-11-17
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
## Prerequisites
|
|
212
|
+
- Git repository with changes to push
|
|
213
|
+
- package.json with npm scripts (gracefully handles missing scripts)
|
|
214
|
+
- Repository context detected (run `aios init` if needed)
|
|
215
|
+
|
|
216
|
+
## Quality Gate Checks
|
|
217
|
+
|
|
218
|
+
### 1. Repository Context Detection
|
|
219
|
+
|
|
220
|
+
```javascript
|
|
221
|
+
const { detectRepositoryContext } = require('./../scripts/repository-detector');
|
|
222
|
+
|
|
223
|
+
const context = detectRepositoryContext();
|
|
224
|
+
if (!context) {
|
|
225
|
+
console.error('❌ Unable to detect repository context');
|
|
226
|
+
console.error('Run "aios init" to configure installation mode');
|
|
227
|
+
process.exit(1);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
console.log(`\n🚀 Pre-Push Quality Gate`);
|
|
231
|
+
console.log(`Repository: ${context.repositoryUrl}`);
|
|
232
|
+
console.log(`Mode: ${context.mode}`);
|
|
233
|
+
console.log(`Package: ${context.packageName} v${context.packageVersion}\n`);
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
### 2. Check for Uncommitted Changes
|
|
237
|
+
|
|
238
|
+
```bash
|
|
239
|
+
git status --porcelain
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
If output is not empty, fail with message:
|
|
243
|
+
```
|
|
244
|
+
❌ Uncommitted changes detected!
|
|
245
|
+
|
|
246
|
+
Please commit or stash changes before pushing:
|
|
247
|
+
git add .
|
|
248
|
+
git commit -m "your message"
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
### 3. Check for Merge Conflicts
|
|
252
|
+
|
|
253
|
+
```bash
|
|
254
|
+
git diff --check
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
If conflicts detected, fail with message:
|
|
258
|
+
```
|
|
259
|
+
❌ Merge conflicts detected!
|
|
260
|
+
|
|
261
|
+
Resolve conflicts before pushing.
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
### 4. Run npm run lint (if script exists)
|
|
265
|
+
|
|
266
|
+
```javascript
|
|
267
|
+
function runNpmScript(scriptName, projectRoot) {
|
|
268
|
+
const packageJsonPath = path.join(projectRoot, 'package.json');
|
|
269
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
|
|
270
|
+
|
|
271
|
+
if (!packageJson.scripts || !packageJson.scripts[scriptName]) {
|
|
272
|
+
console.log(`⚠️ Script "${scriptName}" not found - skipping`);
|
|
273
|
+
return { skipped: true };
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
try {
|
|
277
|
+
execSync(`npm run ${scriptName}`, {
|
|
278
|
+
cwd: projectRoot,
|
|
279
|
+
stdio: 'inherit'
|
|
280
|
+
});
|
|
281
|
+
console.log(`✓ ${scriptName} PASSED`);
|
|
282
|
+
return { passed: true };
|
|
283
|
+
} catch (error) {
|
|
284
|
+
console.error(`❌ ${scriptName} FAILED`);
|
|
285
|
+
return { passed: false, error };
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
### 5. Run npm test (if script exists)
|
|
291
|
+
|
|
292
|
+
Same logic as lint, but for `npm test`.
|
|
293
|
+
|
|
294
|
+
### 6. Run npm run typecheck (if script exists)
|
|
295
|
+
|
|
296
|
+
Same logic as lint, but for `npm run typecheck`.
|
|
297
|
+
|
|
298
|
+
### 7. Run npm run build (if script exists)
|
|
299
|
+
|
|
300
|
+
Same logic as lint, but for `npm run build`.
|
|
301
|
+
|
|
302
|
+
### 8. Run CodeRabbit CLI Review (TR-3.14.12)
|
|
303
|
+
|
|
304
|
+
```javascript
|
|
305
|
+
const { execSync } = require('child_process');
|
|
306
|
+
|
|
307
|
+
function runCodeRabbitReview(projectRoot) {
|
|
308
|
+
console.log('\n🐰 Running CodeRabbit CLI Review...');
|
|
309
|
+
console.log('⏱️ This may take 7-30 minutes. Please wait...\n');
|
|
310
|
+
|
|
311
|
+
try {
|
|
312
|
+
// Construct WSL command with proper paths
|
|
313
|
+
const wslProjectPath = projectRoot
|
|
314
|
+
.replace(/\\/g, '/')
|
|
315
|
+
.replace(/^([A-Z]):/, (match, drive) => `/mnt/${drive.toLowerCase()}`);
|
|
316
|
+
|
|
317
|
+
const coderabbitCommand = `wsl bash -c 'cd ${wslProjectPath} && ~/.local/bin/coderabbit --prompt-only -t uncommitted'`;
|
|
318
|
+
|
|
319
|
+
console.log(`Executing: ${coderabbitCommand}\n`);
|
|
320
|
+
|
|
321
|
+
// Execute with 15-minute timeout
|
|
322
|
+
const output = execSync(coderabbitCommand, {
|
|
323
|
+
cwd: projectRoot,
|
|
324
|
+
encoding: 'utf8',
|
|
325
|
+
timeout: 900000, // 15 minutes
|
|
326
|
+
stdio: 'pipe',
|
|
327
|
+
maxBuffer: 10 * 1024 * 1024 // 10MB buffer
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
// Parse CodeRabbit output
|
|
331
|
+
const results = parseCodeRabbitOutput(output);
|
|
332
|
+
|
|
333
|
+
console.log(`\n✅ CodeRabbit Review Complete:`);
|
|
334
|
+
console.log(` - CRITICAL: ${results.critical}`);
|
|
335
|
+
console.log(` - HIGH: ${results.high}`);
|
|
336
|
+
console.log(` - MEDIUM: ${results.medium}`);
|
|
337
|
+
console.log(` - LOW: ${results.low}`);
|
|
338
|
+
|
|
339
|
+
// Determine gate impact
|
|
340
|
+
const gateImpact = determineCodeRabbitGate(results);
|
|
341
|
+
|
|
342
|
+
return { gateImpact, results, rawOutput: output };
|
|
343
|
+
} catch (error) {
|
|
344
|
+
// Handle timeout
|
|
345
|
+
if (error.killed && error.signal === 'SIGTERM') {
|
|
346
|
+
console.error('❌ CodeRabbit review timed out after 15 minutes');
|
|
347
|
+
console.error(' Review may still be processing. Check manually.');
|
|
348
|
+
return { gateImpact: 'FAIL', error: 'Timeout', timeout: true };
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
// Handle authentication errors
|
|
352
|
+
if (error.stderr && error.stderr.includes('not authenticated')) {
|
|
353
|
+
console.error('❌ CodeRabbit not authenticated');
|
|
354
|
+
console.error(' Run: wsl bash -c "~/.local/bin/coderabbit auth status"');
|
|
355
|
+
return { gateImpact: 'FAIL', error: 'Not authenticated' };
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
// Handle command not found
|
|
359
|
+
if (error.stderr && error.stderr.includes('command not found')) {
|
|
360
|
+
console.error('❌ CodeRabbit CLI not found in WSL');
|
|
361
|
+
console.error(' Expected location: ~/.local/bin/coderabbit');
|
|
362
|
+
console.error(' Verify: wsl bash -c "~/.local/bin/coderabbit --version"');
|
|
363
|
+
return { gateImpact: 'FAIL', error: 'Not installed' };
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
// Generic error with output for debugging
|
|
367
|
+
console.error('❌ CodeRabbit review failed:', error.message);
|
|
368
|
+
if (error.stdout) {
|
|
369
|
+
console.log('Output:', error.stdout.toString().substring(0, 500));
|
|
370
|
+
}
|
|
371
|
+
return { gateImpact: 'CONCERNS', error: error.message };
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
function parseCodeRabbitOutput(output) {
|
|
376
|
+
// CodeRabbit outputs issues with type markers
|
|
377
|
+
const lines = output.split('\n');
|
|
378
|
+
|
|
379
|
+
let critical = 0;
|
|
380
|
+
let high = 0;
|
|
381
|
+
let medium = 0;
|
|
382
|
+
let low = 0;
|
|
383
|
+
|
|
384
|
+
for (const line of lines) {
|
|
385
|
+
// Check for issue type markers
|
|
386
|
+
if (line.includes('Type: critical') || line.match(/\bCRITICAL\b/i)) {
|
|
387
|
+
critical++;
|
|
388
|
+
} else if (line.includes('Type: high') || line.match(/\bHIGH\b/i)) {
|
|
389
|
+
high++;
|
|
390
|
+
} else if (line.includes('Type: potential_issue') || line.match(/\bMEDIUM\b/i)) {
|
|
391
|
+
medium++;
|
|
392
|
+
} else if (line.includes('Type: refactor_suggestion') || line.match(/\bLOW\b/i)) {
|
|
393
|
+
low++;
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
return { critical, high, medium, low };
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
function determineCodeRabbitGate(results) {
|
|
401
|
+
// CRITICAL issues = auto-fail (block push)
|
|
402
|
+
if (results.critical > 0) {
|
|
403
|
+
console.log(`\n❌ FAIL: ${results.critical} CRITICAL issue(s) found - MUST FIX`);
|
|
404
|
+
return 'FAIL';
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
// HIGH issues = concerns (warn but allow push)
|
|
408
|
+
if (results.high > 0) {
|
|
409
|
+
console.log(`\n⚠️ CONCERNS: ${results.high} HIGH issue(s) found - recommend fix`);
|
|
410
|
+
return 'CONCERNS';
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
// Only MEDIUM or LOW = pass with notes
|
|
414
|
+
if (results.medium > 0 || results.low > 0) {
|
|
415
|
+
console.log(`\n✅ PASS: Only ${results.medium} MEDIUM and ${results.low} LOW issues`);
|
|
416
|
+
} else {
|
|
417
|
+
console.log(`\n✅ PASS: No issues found`);
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
return 'PASS';
|
|
421
|
+
}
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
**Usage in pre-push flow:**
|
|
425
|
+
```javascript
|
|
426
|
+
const coderabbitResult = runCodeRabbitReview(process.cwd());
|
|
427
|
+
|
|
428
|
+
if (coderabbitResult.gateImpact === 'FAIL') {
|
|
429
|
+
console.error('\n❌ CodeRabbit quality gate FAILED - cannot push');
|
|
430
|
+
process.exit(1);
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
if (coderabbitResult.gateImpact === 'CONCERNS') {
|
|
434
|
+
// Ask user for confirmation
|
|
435
|
+
const { confirm } = await inquirer.prompt([{
|
|
436
|
+
type: 'confirm',
|
|
437
|
+
name: 'confirm',
|
|
438
|
+
message: 'CodeRabbit found HIGH issues. Continue anyway?',
|
|
439
|
+
default: false
|
|
440
|
+
}]);
|
|
441
|
+
|
|
442
|
+
if (!confirm) {
|
|
443
|
+
console.log('Push cancelled - please address HIGH issues');
|
|
444
|
+
process.exit(2);
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
### 9. Run Security Scan (TR-3.14.11)
|
|
450
|
+
|
|
451
|
+
```javascript
|
|
452
|
+
const { execSync } = require('child_process');
|
|
453
|
+
const path = require('path');
|
|
454
|
+
|
|
455
|
+
function runSecurityScan(storyId, storyPath, projectRoot) {
|
|
456
|
+
console.log('\n🔒 Running Security Scan (SAST)...\n');
|
|
457
|
+
|
|
458
|
+
try {
|
|
459
|
+
// Execute security-scan.md task
|
|
460
|
+
const securityScanPath = path.join(__dirname, 'security-scan.md');
|
|
461
|
+
|
|
462
|
+
// For now, run security checks directly
|
|
463
|
+
const results = {
|
|
464
|
+
audit: runNpmAudit(projectRoot),
|
|
465
|
+
eslint: runESLintSecurity(projectRoot),
|
|
466
|
+
secrets: runSecretDetection(projectRoot)
|
|
467
|
+
};
|
|
468
|
+
|
|
469
|
+
// Determine gate impact
|
|
470
|
+
const gateImpact = determineSecurityGate(results);
|
|
471
|
+
|
|
472
|
+
console.log(`\nSecurity Scan Complete: ${gateImpact}`);
|
|
473
|
+
|
|
474
|
+
return { gateImpact, results };
|
|
475
|
+
} catch (error) {
|
|
476
|
+
console.error('❌ Security scan failed:', error.message);
|
|
477
|
+
return { gateImpact: 'FAIL', error };
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
function runNpmAudit(projectRoot) {
|
|
482
|
+
try {
|
|
483
|
+
const output = execSync('npm audit --audit-level=moderate --json', {
|
|
484
|
+
cwd: projectRoot
|
|
485
|
+
}).toString();
|
|
486
|
+
|
|
487
|
+
const results = JSON.parse(output);
|
|
488
|
+
const vulns = results.metadata?.vulnerabilities || {};
|
|
489
|
+
|
|
490
|
+
return {
|
|
491
|
+
critical: vulns.critical || 0,
|
|
492
|
+
high: vulns.high || 0,
|
|
493
|
+
moderate: vulns.moderate || 0,
|
|
494
|
+
low: vulns.low || 0,
|
|
495
|
+
gate: vulns.critical > 0 ? 'FAIL' : (vulns.high > 0 ? 'CONCERNS' : 'PASS')
|
|
496
|
+
};
|
|
497
|
+
} catch (error) {
|
|
498
|
+
// npm audit exits with 1 if vulnerabilities found
|
|
499
|
+
if (error.stdout) {
|
|
500
|
+
const results = JSON.parse(error.stdout.toString());
|
|
501
|
+
const vulns = results.metadata?.vulnerabilities || {};
|
|
502
|
+
|
|
503
|
+
return {
|
|
504
|
+
critical: vulns.critical || 0,
|
|
505
|
+
high: vulns.high || 0,
|
|
506
|
+
moderate: vulns.moderate || 0,
|
|
507
|
+
low: vulns.low || 0,
|
|
508
|
+
gate: vulns.critical > 0 ? 'FAIL' : (vulns.high > 0 ? 'CONCERNS' : 'PASS')
|
|
509
|
+
};
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
console.warn('⚠️ npm audit failed - skipping dependency check');
|
|
513
|
+
return { gate: 'PASS', skipped: true };
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
function runESLintSecurity(projectRoot) {
|
|
518
|
+
// Check if ESLint security config exists
|
|
519
|
+
const eslintConfigPath = path.join(projectRoot, '.eslintrc.security.json');
|
|
520
|
+
|
|
521
|
+
if (!fs.existsSync(eslintConfigPath)) {
|
|
522
|
+
console.log('⚠️ .eslintrc.security.json not found - skipping ESLint security');
|
|
523
|
+
return { gate: 'PASS', skipped: true };
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
try {
|
|
527
|
+
execSync('npx eslint . --ext .js,.ts --config .eslintrc.security.json', {
|
|
528
|
+
cwd: projectRoot,
|
|
529
|
+
stdio: 'pipe'
|
|
530
|
+
});
|
|
531
|
+
|
|
532
|
+
return { gate: 'PASS', issues: 0 };
|
|
533
|
+
} catch (error) {
|
|
534
|
+
// ESLint exits with 1 if issues found
|
|
535
|
+
const output = error.stdout?.toString() || '';
|
|
536
|
+
const errorCount = (output.match(/error/g) || []).length;
|
|
537
|
+
const warningCount = (output.match(/warning/g) || []).length;
|
|
538
|
+
|
|
539
|
+
return {
|
|
540
|
+
gate: errorCount > 0 ? 'FAIL' : (warningCount > 0 ? 'CONCERNS' : 'PASS'),
|
|
541
|
+
errors: errorCount,
|
|
542
|
+
warnings: warningCount
|
|
543
|
+
};
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
function runSecretDetection(projectRoot) {
|
|
548
|
+
try {
|
|
549
|
+
execSync('npx secretlint "**/*"', {
|
|
550
|
+
cwd: projectRoot,
|
|
551
|
+
stdio: 'pipe'
|
|
552
|
+
});
|
|
553
|
+
|
|
554
|
+
return { gate: 'PASS', secretsFound: 0 };
|
|
555
|
+
} catch (error) {
|
|
556
|
+
// secretlint exits with 1 if secrets found
|
|
557
|
+
return { gate: 'FAIL', secretsFound: 1 };
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
function determineSecurityGate(results) {
|
|
562
|
+
// Secrets are auto-fail
|
|
563
|
+
if (results.secrets.gate === 'FAIL') return 'FAIL';
|
|
564
|
+
|
|
565
|
+
// Any FAIL → overall FAIL
|
|
566
|
+
if (results.audit.gate === 'FAIL' || results.eslint.gate === 'FAIL') return 'FAIL';
|
|
567
|
+
|
|
568
|
+
// Any CONCERNS → overall CONCERNS
|
|
569
|
+
if (results.audit.gate === 'CONCERNS' || results.eslint.gate === 'CONCERNS') return 'CONCERNS';
|
|
570
|
+
|
|
571
|
+
// All PASS → overall PASS
|
|
572
|
+
return 'PASS';
|
|
573
|
+
}
|
|
574
|
+
```
|
|
575
|
+
|
|
576
|
+
### 10. Verify Story Status (Optional - if using story-driven workflow)
|
|
577
|
+
|
|
578
|
+
```javascript
|
|
579
|
+
function checkStoryStatus(storyPath) {
|
|
580
|
+
if (!storyPath || !fs.existsSync(storyPath)) {
|
|
581
|
+
console.log('⚠️ No story file specified - skipping story status check');
|
|
582
|
+
return { skipped: true };
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
const storyContent = fs.readFileSync(storyPath, 'utf8');
|
|
586
|
+
|
|
587
|
+
// Look for status: "Done" or status: "Ready for Review"
|
|
588
|
+
const statusMatch = storyContent.match(/status:\s*["']?(Done|Ready for Review|InProgress)["']?/i);
|
|
589
|
+
|
|
590
|
+
if (!statusMatch) {
|
|
591
|
+
console.log('⚠️ Unable to determine story status - skipping');
|
|
592
|
+
return { skipped: true };
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
const status = statusMatch[1];
|
|
596
|
+
|
|
597
|
+
if (status === 'Done' || status === 'Ready for Review') {
|
|
598
|
+
console.log(`✓ Story status: ${status}`);
|
|
599
|
+
return { passed: true, status };
|
|
600
|
+
} else {
|
|
601
|
+
console.log(`⚠️ Story status: ${status} (expected Done or Ready for Review)`);
|
|
602
|
+
return { passed: false, status };
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
```
|
|
606
|
+
|
|
607
|
+
## Summary Report
|
|
608
|
+
|
|
609
|
+
After all checks complete, present summary:
|
|
610
|
+
|
|
611
|
+
```
|
|
612
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
613
|
+
🚀 Pre-Push Quality Gate Summary
|
|
614
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
615
|
+
|
|
616
|
+
Repository: {repositoryUrl}
|
|
617
|
+
Package: {packageName} v{version}
|
|
618
|
+
Mode: {framework-development | project-development}
|
|
619
|
+
|
|
620
|
+
Quality Checks:
|
|
621
|
+
✓ No uncommitted changes
|
|
622
|
+
✓ No merge conflicts
|
|
623
|
+
✓ npm run lint PASSED
|
|
624
|
+
✓ npm test PASSED
|
|
625
|
+
✓ npm run typecheck PASSED
|
|
626
|
+
✓ npm run build PASSED
|
|
627
|
+
✓ Security scan PASSED
|
|
628
|
+
⚠️ Story status SKIPPED (no story file)
|
|
629
|
+
|
|
630
|
+
Security Scan Results:
|
|
631
|
+
✓ Dependencies: 0 critical, 0 high, 2 moderate, 5 low
|
|
632
|
+
✓ Code patterns: No security issues
|
|
633
|
+
✓ Secrets: No secrets detected
|
|
634
|
+
|
|
635
|
+
Overall Status: ✅ READY TO PUSH
|
|
636
|
+
|
|
637
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
638
|
+
|
|
639
|
+
Proceed with push to remote? (Y/n)
|
|
640
|
+
```
|
|
641
|
+
|
|
642
|
+
### If FAIL status:
|
|
643
|
+
|
|
644
|
+
```
|
|
645
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
646
|
+
❌ Pre-Push Quality Gate FAILED
|
|
647
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
648
|
+
|
|
649
|
+
Quality Checks:
|
|
650
|
+
❌ npm test FAILED
|
|
651
|
+
❌ Security scan FAILED (CRITICAL vulnerabilities)
|
|
652
|
+
|
|
653
|
+
Security Issues:
|
|
654
|
+
❌ Dependencies: 2 CRITICAL, 5 HIGH vulnerabilities
|
|
655
|
+
❌ Secrets: 1 API key detected in config/db.js
|
|
656
|
+
|
|
657
|
+
Overall Status: ❌ BLOCKED - Cannot push to remote
|
|
658
|
+
|
|
659
|
+
Action Required:
|
|
660
|
+
1. Fix failing tests
|
|
661
|
+
2. Run: npm audit fix --force
|
|
662
|
+
3. Remove secrets from codebase
|
|
663
|
+
4. Re-run quality gate
|
|
664
|
+
|
|
665
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
666
|
+
```
|
|
667
|
+
|
|
668
|
+
### If CONCERNS status:
|
|
669
|
+
|
|
670
|
+
```
|
|
671
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
672
|
+
⚠️ Pre-Push Quality Gate: CONCERNS
|
|
673
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
674
|
+
|
|
675
|
+
Quality Checks:
|
|
676
|
+
✓ All tests passed
|
|
677
|
+
⚠️ Security scan CONCERNS (HIGH vulnerabilities)
|
|
678
|
+
|
|
679
|
+
Security Issues:
|
|
680
|
+
⚠️ Dependencies: 0 CRITICAL, 3 HIGH, 10 MODERATE vulnerabilities
|
|
681
|
+
⚠️ Code patterns: 2 medium-severity issues
|
|
682
|
+
|
|
683
|
+
Overall Status: ⚠️ CONCERNS - Review recommended
|
|
684
|
+
|
|
685
|
+
Recommendations:
|
|
686
|
+
- Address HIGH vulnerabilities before production
|
|
687
|
+
- Review medium-severity code patterns
|
|
688
|
+
- Consider running: npm audit fix
|
|
689
|
+
|
|
690
|
+
Proceed with push anyway? (y/N)
|
|
691
|
+
```
|
|
692
|
+
|
|
693
|
+
## User Approval
|
|
694
|
+
|
|
695
|
+
```javascript
|
|
696
|
+
async function requestPushApproval(gateStatus) {
|
|
697
|
+
if (gateStatus === 'FAIL') {
|
|
698
|
+
console.log('\n❌ Quality gate FAILED. Cannot proceed with push.');
|
|
699
|
+
process.exit(1);
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
const { confirm } = await inquirer.prompt([
|
|
703
|
+
{
|
|
704
|
+
type: 'confirm',
|
|
705
|
+
name: 'confirm',
|
|
706
|
+
message: gateStatus === 'PASS'
|
|
707
|
+
? 'Proceed with push to remote?'
|
|
708
|
+
: 'Quality gate has CONCERNS. Proceed anyway?',
|
|
709
|
+
default: gateStatus === 'PASS'
|
|
710
|
+
}
|
|
711
|
+
]);
|
|
712
|
+
|
|
713
|
+
return confirm;
|
|
714
|
+
}
|
|
715
|
+
```
|
|
716
|
+
|
|
717
|
+
## Integration with @github-devops Agent
|
|
718
|
+
|
|
719
|
+
Called via `@github-devops *pre-push` command.
|
|
720
|
+
|
|
721
|
+
## Exit Codes
|
|
722
|
+
|
|
723
|
+
- `0` - All checks passed, user approved
|
|
724
|
+
- `1` - Quality gate failed (blocking)
|
|
725
|
+
- `2` - User declined to push
|
|
726
|
+
|
|
727
|
+
## Notes
|
|
728
|
+
|
|
729
|
+
- Works with ANY repository (framework or project)
|
|
730
|
+
- Gracefully handles missing npm scripts
|
|
731
|
+
- Security scan is mandatory (TR-3.14.11)
|
|
732
|
+
- User always has final approval
|
|
733
|
+
- Detailed logging for troubleshooting
|