aios-core 2.1.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/.session/current-session.json +14 -0
- package/.aios-core/cli/commands/generate/index.js +222 -0
- package/.aios-core/cli/commands/manifest/index.js +46 -0
- package/.aios-core/cli/commands/manifest/regenerate.js +96 -0
- package/.aios-core/cli/commands/manifest/validate.js +66 -0
- package/.aios-core/cli/commands/mcp/add.js +234 -0
- package/.aios-core/cli/commands/mcp/index.js +76 -0
- package/.aios-core/cli/commands/mcp/link.js +217 -0
- package/.aios-core/cli/commands/mcp/setup.js +164 -0
- package/.aios-core/cli/commands/mcp/status.js +183 -0
- package/.aios-core/cli/commands/metrics/cleanup.js +91 -0
- package/.aios-core/cli/commands/metrics/index.js +65 -0
- package/.aios-core/cli/commands/metrics/record.js +154 -0
- package/.aios-core/cli/commands/metrics/seed.js +126 -0
- package/.aios-core/cli/commands/metrics/show.js +209 -0
- package/.aios-core/cli/commands/migrate/analyze.js +353 -0
- package/.aios-core/cli/commands/migrate/backup.js +352 -0
- package/.aios-core/cli/commands/migrate/execute.js +292 -0
- package/.aios-core/cli/commands/migrate/index.js +441 -0
- package/.aios-core/cli/commands/migrate/rollback.js +323 -0
- package/.aios-core/cli/commands/migrate/update-imports.js +396 -0
- package/.aios-core/cli/commands/migrate/validate.js +452 -0
- package/.aios-core/cli/commands/qa/index.js +56 -0
- package/.aios-core/cli/commands/qa/run.js +163 -0
- package/.aios-core/cli/commands/qa/status.js +195 -0
- package/.aios-core/cli/commands/workers/formatters/info-formatter.js +274 -0
- package/.aios-core/cli/commands/workers/formatters/list-table.js +265 -0
- package/.aios-core/cli/commands/workers/formatters/list-tree.js +159 -0
- package/.aios-core/cli/commands/workers/index.js +56 -0
- package/.aios-core/cli/commands/workers/info.js +194 -0
- package/.aios-core/cli/commands/workers/list.js +214 -0
- package/.aios-core/cli/commands/workers/search-filters.js +185 -0
- package/.aios-core/cli/commands/workers/search-keyword.js +310 -0
- package/.aios-core/cli/commands/workers/search-semantic.js +293 -0
- package/.aios-core/cli/commands/workers/search.js +154 -0
- package/.aios-core/cli/commands/workers/utils/pagination.js +102 -0
- package/.aios-core/cli/index.js +128 -0
- package/.aios-core/cli/utils/output-formatter-cli.js +232 -0
- package/.aios-core/cli/utils/score-calculator.js +221 -0
- package/.aios-core/core/README.md +229 -0
- package/.aios-core/core/config/config-cache.js +233 -0
- package/.aios-core/core/config/config-loader.js +277 -0
- package/.aios-core/core/data/agent-config-requirements.yaml +368 -0
- package/.aios-core/core/data/aios-kb.md +924 -0
- package/.aios-core/core/data/workflow-patterns.yaml +267 -0
- package/.aios-core/core/docs/SHARD-TRANSLATION-GUIDE.md +335 -0
- package/.aios-core/core/docs/component-creation-guide.md +458 -0
- package/.aios-core/core/docs/session-update-pattern.md +307 -0
- package/.aios-core/core/docs/template-syntax.md +267 -0
- package/.aios-core/core/docs/troubleshooting-guide.md +625 -0
- package/.aios-core/core/elicitation/agent-elicitation.js +272 -0
- package/.aios-core/core/elicitation/elicitation-engine.js +479 -0
- package/.aios-core/core/elicitation/session-manager.js +320 -0
- package/.aios-core/core/elicitation/task-elicitation.js +281 -0
- package/.aios-core/core/elicitation/workflow-elicitation.js +315 -0
- package/.aios-core/core/index.esm.js +42 -0
- package/.aios-core/core/index.js +76 -0
- package/.aios-core/core/manifest/manifest-generator.js +386 -0
- package/.aios-core/core/manifest/manifest-validator.js +429 -0
- package/.aios-core/core/mcp/config-migrator.js +340 -0
- package/.aios-core/core/mcp/global-config-manager.js +369 -0
- package/.aios-core/core/mcp/index.js +34 -0
- package/.aios-core/core/mcp/os-detector.js +188 -0
- package/.aios-core/core/mcp/symlink-manager.js +413 -0
- package/.aios-core/core/migration/migration-config.yaml +83 -0
- package/.aios-core/core/migration/module-mapping.yaml +89 -0
- package/.aios-core/core/quality-gates/base-layer.js +134 -0
- package/.aios-core/core/quality-gates/checklist-generator.js +329 -0
- package/.aios-core/core/quality-gates/focus-area-recommender.js +359 -0
- package/.aios-core/core/quality-gates/human-review-orchestrator.js +529 -0
- package/.aios-core/core/quality-gates/layer1-precommit.js +336 -0
- package/.aios-core/core/quality-gates/layer2-pr-automation.js +324 -0
- package/.aios-core/core/quality-gates/layer3-human-review.js +348 -0
- package/.aios-core/core/quality-gates/notification-manager.js +550 -0
- package/.aios-core/core/quality-gates/quality-gate-config.yaml +86 -0
- package/.aios-core/core/quality-gates/quality-gate-manager.js +601 -0
- package/.aios-core/core/registry/README.md +179 -0
- package/.aios-core/core/registry/build-registry.js +452 -0
- package/.aios-core/core/registry/registry-loader.js +330 -0
- package/.aios-core/core/registry/registry-schema.json +166 -0
- package/.aios-core/core/registry/service-registry.json +6586 -0
- package/.aios-core/core/registry/validate-registry.js +340 -0
- package/.aios-core/core/session/context-detector.js +229 -0
- package/.aios-core/core/session/context-loader.js +288 -0
- package/.aios-core/core/utils/output-formatter.js +298 -0
- package/.aios-core/core/utils/security-utils.js +333 -0
- package/.aios-core/core/utils/yaml-validator.js +419 -0
- package/.aios-core/core-config.yaml +382 -0
- package/.aios-core/data/agent-config-requirements.yaml +368 -0
- package/.aios-core/data/aios-kb.md +924 -0
- package/.aios-core/data/technical-preferences.md +4 -0
- package/.aios-core/data/workflow-patterns.yaml +267 -0
- package/.aios-core/development/README.md +142 -0
- package/.aios-core/development/agent-teams/team-all.yaml +15 -0
- package/.aios-core/development/agent-teams/team-fullstack.yaml +18 -0
- package/.aios-core/development/agent-teams/team-ide-minimal.yaml +10 -0
- package/.aios-core/development/agent-teams/team-no-ui.yaml +13 -0
- package/.aios-core/development/agent-teams/team-qa-focused.yaml +155 -0
- package/.aios-core/development/agents/aios-master.md +339 -0
- package/.aios-core/development/agents/analyst.md +195 -0
- package/.aios-core/development/agents/architect.md +359 -0
- package/.aios-core/development/agents/data-engineer.md +468 -0
- package/.aios-core/development/agents/dev.md +390 -0
- package/.aios-core/development/agents/devops.md +398 -0
- package/.aios-core/development/agents/pm.md +198 -0
- package/.aios-core/development/agents/po.md +256 -0
- package/.aios-core/development/agents/qa.md +312 -0
- package/.aios-core/development/agents/sm.md +220 -0
- package/.aios-core/development/agents/ux-design-expert.md +451 -0
- package/.aios-core/development/scripts/agent-assignment-resolver.js +231 -0
- package/.aios-core/development/scripts/agent-config-loader.js +624 -0
- package/.aios-core/development/scripts/agent-exit-hooks.js +96 -0
- package/.aios-core/development/scripts/apply-inline-greeting-all-agents.js +146 -0
- package/.aios-core/development/scripts/audit-agent-config.js +380 -0
- package/.aios-core/development/scripts/backlog-manager.js +404 -0
- package/.aios-core/development/scripts/batch-update-agents-session-context.js +95 -0
- package/.aios-core/development/scripts/decision-context.js +228 -0
- package/.aios-core/development/scripts/decision-log-generator.js +293 -0
- package/.aios-core/development/scripts/decision-log-indexer.js +284 -0
- package/.aios-core/development/scripts/decision-recorder.js +168 -0
- package/.aios-core/development/scripts/dev-context-loader.js +297 -0
- package/.aios-core/development/scripts/generate-greeting.js +160 -0
- package/.aios-core/development/scripts/greeting-builder.js +866 -0
- package/.aios-core/development/scripts/greeting-config-cli.js +85 -0
- package/.aios-core/development/scripts/greeting-preference-manager.js +145 -0
- package/.aios-core/development/scripts/migrate-task-to-v2.js +377 -0
- package/.aios-core/development/scripts/story-index-generator.js +337 -0
- package/.aios-core/development/scripts/story-manager.js +375 -0
- package/.aios-core/development/scripts/story-update-hook.js +259 -0
- package/.aios-core/development/scripts/task-identifier-resolver.js +145 -0
- package/.aios-core/development/scripts/test-greeting-system.js +142 -0
- package/.aios-core/development/scripts/validate-task-v2.js +319 -0
- package/.aios-core/development/scripts/workflow-navigator.js +214 -0
- package/.aios-core/development/tasks/add-mcp.md +319 -0
- package/.aios-core/development/tasks/advanced-elicitation.md +319 -0
- package/.aios-core/development/tasks/analyst-facilitate-brainstorming.md +342 -0
- package/.aios-core/development/tasks/analyze-framework.md +697 -0
- package/.aios-core/development/tasks/analyze-performance.md +637 -0
- package/.aios-core/development/tasks/apply-qa-fixes.md +340 -0
- package/.aios-core/development/tasks/architect-analyze-impact.md +827 -0
- package/.aios-core/development/tasks/audit-codebase.md +429 -0
- package/.aios-core/development/tasks/audit-tailwind-config.md +270 -0
- package/.aios-core/development/tasks/audit-utilities.md +358 -0
- package/.aios-core/development/tasks/bootstrap-shadcn-library.md +286 -0
- package/.aios-core/development/tasks/brownfield-create-epic.md +486 -0
- package/.aios-core/development/tasks/brownfield-create-story.md +357 -0
- package/.aios-core/development/tasks/build-component.md +478 -0
- package/.aios-core/development/tasks/calculate-roi.md +455 -0
- package/.aios-core/development/tasks/ci-cd-configuration.md +764 -0
- package/.aios-core/development/tasks/cleanup-utilities.md +670 -0
- package/.aios-core/development/tasks/collaborative-edit.md +1109 -0
- package/.aios-core/development/tasks/compose-molecule.md +284 -0
- package/.aios-core/development/tasks/consolidate-patterns.md +414 -0
- package/.aios-core/development/tasks/correct-course.md +280 -0
- package/.aios-core/development/tasks/create-agent.md +322 -0
- package/.aios-core/development/tasks/create-brownfield-story.md +727 -0
- package/.aios-core/development/tasks/create-deep-research-prompt.md +499 -0
- package/.aios-core/development/tasks/create-doc.md +316 -0
- package/.aios-core/development/tasks/create-next-story.md +774 -0
- package/.aios-core/development/tasks/create-suite.md +284 -0
- package/.aios-core/development/tasks/create-task.md +372 -0
- package/.aios-core/development/tasks/create-workflow.md +371 -0
- package/.aios-core/development/tasks/db-analyze-hotpaths.md +572 -0
- package/.aios-core/development/tasks/db-apply-migration.md +381 -0
- package/.aios-core/development/tasks/db-bootstrap.md +642 -0
- package/.aios-core/development/tasks/db-domain-modeling.md +693 -0
- package/.aios-core/development/tasks/db-dry-run.md +293 -0
- package/.aios-core/development/tasks/db-env-check.md +260 -0
- package/.aios-core/development/tasks/db-expansion-pack-integration.md +663 -0
- package/.aios-core/development/tasks/db-explain.md +631 -0
- package/.aios-core/development/tasks/db-impersonate.md +495 -0
- package/.aios-core/development/tasks/db-load-csv.md +593 -0
- package/.aios-core/development/tasks/db-policy-apply.md +653 -0
- package/.aios-core/development/tasks/db-rls-audit.md +411 -0
- package/.aios-core/development/tasks/db-rollback.md +739 -0
- package/.aios-core/development/tasks/db-run-sql.md +613 -0
- package/.aios-core/development/tasks/db-schema-audit.md +1011 -0
- package/.aios-core/development/tasks/db-seed.md +390 -0
- package/.aios-core/development/tasks/db-smoke-test.md +351 -0
- package/.aios-core/development/tasks/db-snapshot.md +569 -0
- package/.aios-core/development/tasks/db-supabase-setup.md +712 -0
- package/.aios-core/development/tasks/db-verify-order.md +515 -0
- package/.aios-core/development/tasks/deprecate-component.md +957 -0
- package/.aios-core/development/tasks/dev-apply-qa-fixes.md +318 -0
- package/.aios-core/development/tasks/dev-backlog-debt.md +469 -0
- package/.aios-core/development/tasks/dev-develop-story.md +846 -0
- package/.aios-core/development/tasks/dev-improve-code-quality.md +873 -0
- package/.aios-core/development/tasks/dev-optimize-performance.md +1034 -0
- package/.aios-core/development/tasks/dev-suggest-refactoring.md +871 -0
- package/.aios-core/development/tasks/dev-validate-next-story.md +349 -0
- package/.aios-core/development/tasks/document-project.md +553 -0
- package/.aios-core/development/tasks/environment-bootstrap.md +1311 -0
- package/.aios-core/development/tasks/execute-checklist.md +301 -0
- package/.aios-core/development/tasks/export-design-tokens-dtcg.md +274 -0
- package/.aios-core/development/tasks/extend-pattern.md +269 -0
- package/.aios-core/development/tasks/extract-tokens.md +467 -0
- package/.aios-core/development/tasks/facilitate-brainstorming-session.md +518 -0
- package/.aios-core/development/tasks/generate-ai-frontend-prompt.md +261 -0
- package/.aios-core/development/tasks/generate-documentation.md +284 -0
- package/.aios-core/development/tasks/generate-migration-strategy.md +522 -0
- package/.aios-core/development/tasks/generate-shock-report.md +501 -0
- package/.aios-core/development/tasks/github-devops-github-pr-automation.md +427 -0
- package/.aios-core/development/tasks/github-devops-pre-push-quality-gate.md +733 -0
- package/.aios-core/development/tasks/github-devops-repository-cleanup.md +374 -0
- package/.aios-core/development/tasks/github-devops-version-management.md +483 -0
- package/.aios-core/development/tasks/improve-self.md +823 -0
- package/.aios-core/development/tasks/index-docs.md +388 -0
- package/.aios-core/development/tasks/init-project-status.md +506 -0
- package/.aios-core/development/tasks/integrate-expansion-pack.md +314 -0
- package/.aios-core/development/tasks/kb-mode-interaction.md +284 -0
- package/.aios-core/development/tasks/learn-patterns.md +901 -0
- package/.aios-core/development/tasks/mcp-workflow.md +437 -0
- package/.aios-core/development/tasks/modify-agent.md +382 -0
- package/.aios-core/development/tasks/modify-task.md +425 -0
- package/.aios-core/development/tasks/modify-workflow.md +466 -0
- package/.aios-core/development/tasks/po-backlog-add.md +370 -0
- package/.aios-core/development/tasks/po-manage-story-backlog.md +523 -0
- package/.aios-core/development/tasks/po-pull-story-from-clickup.md +540 -0
- package/.aios-core/development/tasks/po-pull-story.md +316 -0
- package/.aios-core/development/tasks/po-stories-index.md +351 -0
- package/.aios-core/development/tasks/po-sync-story-to-clickup.md +457 -0
- package/.aios-core/development/tasks/po-sync-story.md +303 -0
- package/.aios-core/development/tasks/pr-automation.md +701 -0
- package/.aios-core/development/tasks/propose-modification.md +843 -0
- package/.aios-core/development/tasks/qa-backlog-add-followup.md +425 -0
- package/.aios-core/development/tasks/qa-gate.md +374 -0
- package/.aios-core/development/tasks/qa-generate-tests.md +1175 -0
- package/.aios-core/development/tasks/qa-nfr-assess.md +558 -0
- package/.aios-core/development/tasks/qa-review-proposal.md +1158 -0
- package/.aios-core/development/tasks/qa-review-story.md +683 -0
- package/.aios-core/development/tasks/qa-risk-profile.md +567 -0
- package/.aios-core/development/tasks/qa-run-tests.md +277 -0
- package/.aios-core/development/tasks/qa-test-design.md +388 -0
- package/.aios-core/development/tasks/qa-trace-requirements.md +477 -0
- package/.aios-core/development/tasks/release-management.md +723 -0
- package/.aios-core/development/tasks/security-audit.md +554 -0
- package/.aios-core/development/tasks/security-scan.md +790 -0
- package/.aios-core/development/tasks/setup-database.md +741 -0
- package/.aios-core/development/tasks/setup-design-system.md +462 -0
- package/.aios-core/development/tasks/setup-github.md +874 -0
- package/.aios-core/development/tasks/setup-llm-routing.md +229 -0
- package/.aios-core/development/tasks/setup-mcp-docker.md +584 -0
- package/.aios-core/development/tasks/shard-doc.md +538 -0
- package/.aios-core/development/tasks/sm-create-next-story.md +480 -0
- package/.aios-core/development/tasks/sync-documentation.md +865 -0
- package/.aios-core/development/tasks/tailwind-upgrade.md +294 -0
- package/.aios-core/development/tasks/test-as-user.md +621 -0
- package/.aios-core/development/tasks/test-validation-task.md +171 -0
- package/.aios-core/development/tasks/undo-last.md +347 -0
- package/.aios-core/development/tasks/update-manifest.md +410 -0
- package/.aios-core/development/tasks/ux-create-wireframe.md +617 -0
- package/.aios-core/development/tasks/ux-ds-scan-artifact.md +672 -0
- package/.aios-core/development/tasks/ux-user-research.md +559 -0
- package/.aios-core/development/tasks/validate-next-story.md +423 -0
- package/.aios-core/development/tasks/validate-structure.md +243 -0
- package/.aios-core/development/workflows/README.md +84 -0
- package/.aios-core/development/workflows/brownfield-fullstack.yaml +297 -0
- package/.aios-core/development/workflows/brownfield-service.yaml +187 -0
- package/.aios-core/development/workflows/brownfield-ui.yaml +197 -0
- package/.aios-core/development/workflows/greenfield-fullstack.yaml +333 -0
- package/.aios-core/development/workflows/greenfield-service.yaml +206 -0
- package/.aios-core/development/workflows/greenfield-ui.yaml +235 -0
- package/.aios-core/docs/SHARD-TRANSLATION-GUIDE.md +335 -0
- package/.aios-core/docs/component-creation-guide.md +458 -0
- package/.aios-core/docs/session-update-pattern.md +307 -0
- package/.aios-core/docs/standards/AGENT-PERSONALIZATION-STANDARD-V1.md +572 -0
- package/.aios-core/docs/standards/AIOS-COLOR-PALETTE-QUICK-REFERENCE.md +185 -0
- package/.aios-core/docs/standards/AIOS-COLOR-PALETTE-V2.1.md +354 -0
- package/.aios-core/docs/standards/AIOS-FRAMEWORK-MASTER.md +1963 -0
- package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO-V2.1-COMPLETE.md +821 -0
- package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO-V2.1-SUMMARY.md +1190 -0
- package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO-V2.1.md +439 -0
- package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO-V2.2-SUMMARY.md +1339 -0
- package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO.md +5398 -0
- package/.aios-core/docs/standards/EXECUTOR-DECISION-TREE.md +697 -0
- package/.aios-core/docs/standards/OPEN-SOURCE-VS-SERVICE-DIFFERENCES.md +511 -0
- package/.aios-core/docs/standards/QUALITY-GATES-SPECIFICATION.md +556 -0
- package/.aios-core/docs/standards/STANDARDS-INDEX.md +210 -0
- package/.aios-core/docs/standards/STORY-TEMPLATE-V2-SPECIFICATION.md +550 -0
- package/.aios-core/docs/standards/TASK-FORMAT-SPECIFICATION-V1.md +1414 -0
- package/.aios-core/docs/standards/V3-ARCHITECTURAL-DECISIONS.md +523 -0
- package/.aios-core/docs/template-syntax.md +267 -0
- package/.aios-core/docs/troubleshooting-guide.md +625 -0
- package/.aios-core/elicitation/agent-elicitation.js +272 -0
- package/.aios-core/elicitation/task-elicitation.js +281 -0
- package/.aios-core/elicitation/workflow-elicitation.js +315 -0
- package/.aios-core/index.d.ts +8 -0
- package/.aios-core/index.esm.js +16 -0
- package/.aios-core/index.js +16 -0
- package/.aios-core/infrastructure/README.md +126 -0
- package/.aios-core/infrastructure/index.js +199 -0
- package/.aios-core/infrastructure/integrations/pm-adapters/README.md +59 -0
- package/.aios-core/infrastructure/integrations/pm-adapters/clickup-adapter.js +345 -0
- package/.aios-core/infrastructure/integrations/pm-adapters/github-adapter.js +392 -0
- package/.aios-core/infrastructure/integrations/pm-adapters/jira-adapter.js +448 -0
- package/.aios-core/infrastructure/integrations/pm-adapters/local-adapter.js +175 -0
- package/.aios-core/infrastructure/scripts/_archived/final-todo-count.js +122 -0
- package/.aios-core/infrastructure/scripts/_archived/fix-yaml-formatting.js +89 -0
- package/.aios-core/infrastructure/scripts/_archived/migration-generator.js +780 -0
- package/.aios-core/infrastructure/scripts/_archived/migration-path-generator.js +950 -0
- package/.aios-core/infrastructure/scripts/_archived/phase2-entrada-saida-errors.js +425 -0
- package/.aios-core/infrastructure/scripts/_archived/phase2-spot-check.js +132 -0
- package/.aios-core/infrastructure/scripts/_archived/phase3-tools-scripts-validation.js +381 -0
- package/.aios-core/infrastructure/scripts/_archived/phase4-metadata-performance.js +203 -0
- package/.aios-core/infrastructure/scripts/_archived/test-yaml-parsing.js +24 -0
- package/.aios-core/infrastructure/scripts/_archived/verify-yaml-fix.js +51 -0
- package/.aios-core/infrastructure/scripts/aios-validator.js +294 -0
- package/.aios-core/infrastructure/scripts/approval-workflow.js +643 -0
- package/.aios-core/infrastructure/scripts/atomic-layer-classifier.js +308 -0
- package/.aios-core/infrastructure/scripts/backup-manager.js +607 -0
- package/.aios-core/infrastructure/scripts/batch-creator.js +608 -0
- package/.aios-core/infrastructure/scripts/branch-manager.js +391 -0
- package/.aios-core/infrastructure/scripts/capability-analyzer.js +535 -0
- package/.aios-core/infrastructure/scripts/clickup-helpers.js +226 -0
- package/.aios-core/infrastructure/scripts/code-quality-improver.js +1312 -0
- package/.aios-core/infrastructure/scripts/commit-message-generator.js +850 -0
- package/.aios-core/infrastructure/scripts/component-generator.js +738 -0
- package/.aios-core/infrastructure/scripts/component-metadata.js +627 -0
- package/.aios-core/infrastructure/scripts/component-search.js +277 -0
- package/.aios-core/infrastructure/scripts/config-cache.js +322 -0
- package/.aios-core/infrastructure/scripts/config-loader.js +349 -0
- package/.aios-core/infrastructure/scripts/conflict-resolver.js +675 -0
- package/.aios-core/infrastructure/scripts/coverage-analyzer.js +882 -0
- package/.aios-core/infrastructure/scripts/dependency-analyzer.js +638 -0
- package/.aios-core/infrastructure/scripts/dependency-impact-analyzer.js +703 -0
- package/.aios-core/infrastructure/scripts/diff-generator.js +129 -0
- package/.aios-core/infrastructure/scripts/documentation-integrity/brownfield-analyzer.js +501 -0
- package/.aios-core/infrastructure/scripts/documentation-integrity/config-generator.js +329 -0
- package/.aios-core/infrastructure/scripts/documentation-integrity/deployment-config-loader.js +282 -0
- package/.aios-core/infrastructure/scripts/documentation-integrity/doc-generator.js +331 -0
- package/.aios-core/infrastructure/scripts/documentation-integrity/gitignore-generator.js +313 -0
- package/.aios-core/infrastructure/scripts/documentation-integrity/index.js +74 -0
- package/.aios-core/infrastructure/scripts/documentation-integrity/mode-detector.js +358 -0
- package/.aios-core/infrastructure/scripts/documentation-synchronizer.js +1432 -0
- package/.aios-core/infrastructure/scripts/framework-analyzer.js +746 -0
- package/.aios-core/infrastructure/scripts/git-config-detector.js +293 -0
- package/.aios-core/infrastructure/scripts/git-wrapper.js +443 -0
- package/.aios-core/infrastructure/scripts/improvement-engine.js +758 -0
- package/.aios-core/infrastructure/scripts/improvement-validator.js +710 -0
- package/.aios-core/infrastructure/scripts/llm-routing/install-llm-routing.js +267 -0
- package/.aios-core/infrastructure/scripts/llm-routing/templates/claude-free.cmd +80 -0
- package/.aios-core/infrastructure/scripts/llm-routing/templates/claude-free.sh +62 -0
- package/.aios-core/infrastructure/scripts/llm-routing/templates/claude-max.cmd +26 -0
- package/.aios-core/infrastructure/scripts/llm-routing/templates/claude-max.sh +18 -0
- package/.aios-core/infrastructure/scripts/modification-risk-assessment.js +970 -0
- package/.aios-core/infrastructure/scripts/modification-validator.js +555 -0
- package/.aios-core/infrastructure/scripts/output-formatter.js +297 -0
- package/.aios-core/infrastructure/scripts/performance-analyzer.js +758 -0
- package/.aios-core/infrastructure/scripts/performance-and-error-resolver.js +258 -0
- package/.aios-core/infrastructure/scripts/performance-optimizer.js +1902 -0
- package/.aios-core/infrastructure/scripts/performance-tracker.js +452 -0
- package/.aios-core/infrastructure/scripts/pm-adapter-factory.js +181 -0
- package/.aios-core/infrastructure/scripts/pm-adapter.js +134 -0
- package/.aios-core/infrastructure/scripts/project-status-loader.js +445 -0
- package/.aios-core/infrastructure/scripts/refactoring-suggester.js +1139 -0
- package/.aios-core/infrastructure/scripts/repository-detector.js +64 -0
- package/.aios-core/infrastructure/scripts/sandbox-tester.js +618 -0
- package/.aios-core/infrastructure/scripts/security-checker.js +359 -0
- package/.aios-core/infrastructure/scripts/source-tree-guardian/index.js +375 -0
- package/.aios-core/infrastructure/scripts/source-tree-guardian/manifest-generator.js +410 -0
- package/.aios-core/infrastructure/scripts/source-tree-guardian/rules/naming-rules.yaml +285 -0
- package/.aios-core/infrastructure/scripts/source-tree-guardian/rules/placement-rules.yaml +262 -0
- package/.aios-core/infrastructure/scripts/source-tree-guardian/validator.js +468 -0
- package/.aios-core/infrastructure/scripts/spot-check-validator.js +149 -0
- package/.aios-core/infrastructure/scripts/status-mapper.js +115 -0
- package/.aios-core/infrastructure/scripts/template-engine.js +240 -0
- package/.aios-core/infrastructure/scripts/template-validator.js +279 -0
- package/.aios-core/infrastructure/scripts/test-generator.js +844 -0
- package/.aios-core/infrastructure/scripts/test-quality-assessment.js +1081 -0
- package/.aios-core/infrastructure/scripts/test-utilities-fast.js +126 -0
- package/.aios-core/infrastructure/scripts/test-utilities.js +200 -0
- package/.aios-core/infrastructure/scripts/tool-resolver.js +360 -0
- package/.aios-core/infrastructure/scripts/transaction-manager.js +590 -0
- package/.aios-core/infrastructure/scripts/usage-analytics.js +634 -0
- package/.aios-core/infrastructure/scripts/validate-output-pattern.js +213 -0
- package/.aios-core/infrastructure/scripts/visual-impact-generator.js +1056 -0
- package/.aios-core/infrastructure/scripts/yaml-validator.js +397 -0
- package/.aios-core/infrastructure/templates/coderabbit.yaml.template +279 -0
- package/.aios-core/infrastructure/templates/core-config/core-config-brownfield.tmpl.yaml +182 -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 -0
- package/.aios-core/infrastructure/templates/github-workflows/ci.yml.template +169 -0
- package/.aios-core/infrastructure/templates/github-workflows/pr-automation.yml.template +330 -0
- package/.aios-core/infrastructure/templates/github-workflows/release.yml.template +196 -0
- 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/project-status-loader.test.js +394 -0
- package/.aios-core/infrastructure/tests/regression-suite-v2.md +621 -0
- package/.aios-core/infrastructure/tests/utilities-audit-results.json +501 -0
- package/.aios-core/infrastructure/tests/validate-module.js +97 -0
- package/.aios-core/infrastructure/tools/README.md +222 -0
- package/.aios-core/infrastructure/tools/cli/github-cli.yaml +200 -0
- package/.aios-core/infrastructure/tools/cli/llm-routing.yaml +126 -0
- package/.aios-core/infrastructure/tools/cli/railway-cli.yaml +260 -0
- package/.aios-core/infrastructure/tools/cli/supabase-cli.yaml +224 -0
- package/.aios-core/infrastructure/tools/local/ffmpeg.yaml +261 -0
- package/.aios-core/infrastructure/tools/mcp/21st-dev-magic.yaml +127 -0
- package/.aios-core/infrastructure/tools/mcp/browser.yaml +103 -0
- package/.aios-core/infrastructure/tools/mcp/clickup.yaml +534 -0
- package/.aios-core/infrastructure/tools/mcp/context7.yaml +78 -0
- package/.aios-core/infrastructure/tools/mcp/desktop-commander.yaml +180 -0
- package/.aios-core/infrastructure/tools/mcp/exa.yaml +103 -0
- package/.aios-core/infrastructure/tools/mcp/google-workspace.yaml +930 -0
- package/.aios-core/infrastructure/tools/mcp/n8n.yaml +551 -0
- package/.aios-core/infrastructure/tools/mcp/supabase.yaml +808 -0
- package/.aios-core/install-manifest.yaml +347 -0
- package/.aios-core/manifests/agents.csv +1 -0
- package/.aios-core/manifests/schema/manifest-schema.json +190 -0
- package/.aios-core/manifests/tasks.csv +121 -0
- package/.aios-core/manifests/workers.csv +204 -0
- package/.aios-core/package.json +103 -0
- package/.aios-core/product/README.md +56 -0
- package/.aios-core/product/checklists/architect-checklist.md +444 -0
- package/.aios-core/product/checklists/change-checklist.md +183 -0
- package/.aios-core/product/checklists/database-design-checklist.md +119 -0
- package/.aios-core/product/checklists/dba-predeploy-checklist.md +97 -0
- package/.aios-core/product/checklists/dba-rollback-checklist.md +99 -0
- package/.aios-core/product/checklists/pm-checklist.md +376 -0
- package/.aios-core/product/checklists/po-master-checklist.md +442 -0
- package/.aios-core/product/checklists/pre-push-checklist.md +108 -0
- package/.aios-core/product/checklists/release-checklist.md +122 -0
- package/.aios-core/product/checklists/story-dod-checklist.md +102 -0
- package/.aios-core/product/checklists/story-draft-checklist.md +216 -0
- package/.aios-core/product/data/brainstorming-techniques.md +37 -0
- package/.aios-core/product/data/elicitation-methods.md +135 -0
- package/.aios-core/product/data/mode-selection-best-practices.md +471 -0
- package/.aios-core/product/data/test-levels-framework.md +149 -0
- package/.aios-core/product/data/test-priorities-matrix.md +175 -0
- package/.aios-core/product/templates/1mcp-config.yaml +225 -0
- package/.aios-core/product/templates/activation-instructions-inline-greeting.yaml +63 -0
- package/.aios-core/product/templates/activation-instructions-template.md +258 -0
- package/.aios-core/product/templates/adr.hbs +125 -0
- package/.aios-core/product/templates/agent-template.yaml +121 -0
- package/.aios-core/product/templates/architecture-tmpl.yaml +651 -0
- package/.aios-core/product/templates/brainstorming-output-tmpl.yaml +156 -0
- package/.aios-core/product/templates/brownfield-architecture-tmpl.yaml +476 -0
- package/.aios-core/product/templates/brownfield-prd-tmpl.yaml +280 -0
- package/.aios-core/product/templates/changelog-template.md +134 -0
- package/.aios-core/product/templates/command-rationalization-matrix.md +152 -0
- package/.aios-core/product/templates/competitor-analysis-tmpl.yaml +293 -0
- package/.aios-core/product/templates/component-react-tmpl.tsx +98 -0
- package/.aios-core/product/templates/dbdr.hbs +241 -0
- package/.aios-core/product/templates/design-story-tmpl.yaml +587 -0
- package/.aios-core/product/templates/ds-artifact-analysis.md +70 -0
- package/.aios-core/product/templates/engine/elicitation.js +298 -0
- package/.aios-core/product/templates/engine/index.js +308 -0
- package/.aios-core/product/templates/engine/loader.js +231 -0
- package/.aios-core/product/templates/engine/renderer.js +343 -0
- package/.aios-core/product/templates/engine/schemas/adr.schema.json +102 -0
- package/.aios-core/product/templates/engine/schemas/dbdr.schema.json +205 -0
- package/.aios-core/product/templates/engine/schemas/epic.schema.json +175 -0
- package/.aios-core/product/templates/engine/schemas/pmdr.schema.json +175 -0
- package/.aios-core/product/templates/engine/schemas/prd-v2.schema.json +300 -0
- package/.aios-core/product/templates/engine/schemas/prd.schema.json +152 -0
- package/.aios-core/product/templates/engine/schemas/story.schema.json +222 -0
- package/.aios-core/product/templates/engine/schemas/task.schema.json +154 -0
- package/.aios-core/product/templates/engine/validator.js +294 -0
- package/.aios-core/product/templates/epic.hbs +212 -0
- package/.aios-core/product/templates/eslintrc-security.json +32 -0
- package/.aios-core/product/templates/front-end-architecture-tmpl.yaml +206 -0
- package/.aios-core/product/templates/front-end-spec-tmpl.yaml +349 -0
- package/.aios-core/product/templates/fullstack-architecture-tmpl.yaml +805 -0
- package/.aios-core/product/templates/github-actions-cd.yml +212 -0
- package/.aios-core/product/templates/github-actions-ci.yml +172 -0
- package/.aios-core/product/templates/github-pr-template.md +67 -0
- package/.aios-core/product/templates/gordon-mcp.yaml +140 -0
- package/.aios-core/product/templates/ide-rules/antigravity-rules.md +115 -0
- package/.aios-core/product/templates/ide-rules/claude-rules.md +221 -0
- package/.aios-core/product/templates/ide-rules/cline-rules.md +84 -0
- package/.aios-core/product/templates/ide-rules/copilot-rules.md +92 -0
- package/.aios-core/product/templates/ide-rules/cursor-rules.md +115 -0
- package/.aios-core/product/templates/ide-rules/gemini-rules.md +85 -0
- package/.aios-core/product/templates/ide-rules/roo-rules.md +86 -0
- package/.aios-core/product/templates/ide-rules/trae-rules.md +104 -0
- package/.aios-core/product/templates/ide-rules/windsurf-rules.md +80 -0
- package/.aios-core/product/templates/index-strategy-tmpl.yaml +53 -0
- package/.aios-core/product/templates/market-research-tmpl.yaml +252 -0
- package/.aios-core/product/templates/mcp-workflow.js +271 -0
- package/.aios-core/product/templates/migration-plan-tmpl.yaml +1022 -0
- package/.aios-core/product/templates/migration-strategy-tmpl.md +524 -0
- package/.aios-core/product/templates/personalized-agent-template.md +258 -0
- package/.aios-core/product/templates/personalized-checklist-template.md +340 -0
- package/.aios-core/product/templates/personalized-task-template-v2.md +905 -0
- package/.aios-core/product/templates/personalized-task-template.md +344 -0
- package/.aios-core/product/templates/personalized-template-file.yaml +322 -0
- package/.aios-core/product/templates/personalized-workflow-template.yaml +460 -0
- package/.aios-core/product/templates/pmdr.hbs +186 -0
- package/.aios-core/product/templates/prd-tmpl.yaml +202 -0
- package/.aios-core/product/templates/prd-v2.0.hbs +216 -0
- package/.aios-core/product/templates/prd.hbs +201 -0
- package/.aios-core/product/templates/project-brief-tmpl.yaml +221 -0
- package/.aios-core/product/templates/qa-gate-tmpl.yaml +240 -0
- package/.aios-core/product/templates/rls-policies-tmpl.yaml +1203 -0
- package/.aios-core/product/templates/schema-design-tmpl.yaml +428 -0
- package/.aios-core/product/templates/shock-report-tmpl.html +502 -0
- package/.aios-core/product/templates/state-persistence-tmpl.yaml +219 -0
- package/.aios-core/product/templates/story-tmpl.yaml +332 -0
- package/.aios-core/product/templates/story.hbs +263 -0
- package/.aios-core/product/templates/task-execution-report.md +495 -0
- package/.aios-core/product/templates/task-template.md +123 -0
- package/.aios-core/product/templates/task.hbs +170 -0
- package/.aios-core/product/templates/tmpl-comment-on-examples.sql +158 -0
- package/.aios-core/product/templates/tmpl-migration-script.sql +91 -0
- package/.aios-core/product/templates/tmpl-rls-granular-policies.sql +104 -0
- package/.aios-core/product/templates/tmpl-rls-kiss-policy.sql +10 -0
- package/.aios-core/product/templates/tmpl-rls-roles.sql +135 -0
- package/.aios-core/product/templates/tmpl-rls-simple.sql +77 -0
- package/.aios-core/product/templates/tmpl-rls-tenant.sql +152 -0
- package/.aios-core/product/templates/tmpl-rollback-script.sql +77 -0
- package/.aios-core/product/templates/tmpl-seed-data.sql +140 -0
- package/.aios-core/product/templates/tmpl-smoke-test.sql +16 -0
- package/.aios-core/product/templates/tmpl-staging-copy-merge.sql +139 -0
- package/.aios-core/product/templates/tmpl-stored-proc.sql +140 -0
- package/.aios-core/product/templates/tmpl-trigger.sql +152 -0
- package/.aios-core/product/templates/tmpl-view-materialized.sql +133 -0
- package/.aios-core/product/templates/tmpl-view.sql +177 -0
- package/.aios-core/product/templates/token-exports-css-tmpl.css +240 -0
- package/.aios-core/product/templates/token-exports-tailwind-tmpl.js +395 -0
- package/.aios-core/product/templates/tokens-schema-tmpl.yaml +305 -0
- package/.aios-core/product/templates/workflow-template.yaml +134 -0
- package/.aios-core/quality/metrics-collector.js +572 -0
- package/.aios-core/quality/metrics-hook.js +260 -0
- package/.aios-core/quality/schemas/quality-metrics.schema.json +233 -0
- package/.aios-core/quality/seed-metrics.js +336 -0
- package/.aios-core/scripts/README.md +354 -0
- package/.aios-core/scripts/aios-doc-template.md +325 -0
- package/.aios-core/scripts/batch-migrate-phase1.ps1 +36 -0
- package/.aios-core/scripts/batch-migrate-phase2.ps1 +88 -0
- package/.aios-core/scripts/batch-migrate-phase3.ps1 +45 -0
- package/.aios-core/scripts/command-execution-hook.js +201 -0
- package/.aios-core/scripts/context-detector.js +226 -0
- package/.aios-core/scripts/elicitation-engine.js +385 -0
- package/.aios-core/scripts/elicitation-session-manager.js +300 -0
- package/.aios-core/scripts/migrate-framework-docs.sh +300 -0
- package/.aios-core/scripts/session-context-loader.js +286 -0
- package/.aios-core/scripts/test-template-system.js +941 -0
- package/.aios-core/scripts/validate-phase1.ps1 +35 -0
- package/.aios-core/scripts/workflow-management.md +69 -0
- package/.aios-core/tasks/find-component.md.legacy +391 -0
- package/.aios-core/tasks/generate-commit-message.md.legacy +426 -0
- package/.aios-core/tasks/generate-migration.md.legacy +382 -0
- package/.aios-core/tasks/rollback-modification.md.legacy +307 -0
- package/.aios-core/tasks/update-tests.md.legacy +283 -0
- package/.aios-core/user-guide.md +1413 -0
- package/.aios-core/working-in-the-brownfield.md +361 -0
- package/.claude/CLAUDE.md +221 -0
- package/LICENSE +48 -0
- package/README.md +703 -0
- package/bin/aios-init-old.js +532 -0
- package/bin/aios-init-v4.js +390 -0
- package/bin/aios-init.backup-v1.1.4.js +352 -0
- package/bin/aios-init.js +736 -0
- package/bin/aios-minimal.js +26 -0
- package/bin/aios.js +279 -0
- package/bin/migrate-pm-config.js +219 -0
- package/bin/modules/env-config.js +436 -0
- package/bin/modules/mcp-installer.js +383 -0
- package/bin/utils/install-errors.js +339 -0
- package/bin/utils/install-transaction.js +445 -0
- package/index.d.ts +19 -0
- package/index.esm.js +21 -0
- package/index.js +94 -0
- package/package.json +161 -0
- package/packages/installer/package.json +39 -0
- package/packages/installer/src/config/configure-environment.js +312 -0
- package/packages/installer/src/config/templates/core-config-template.js +183 -0
- package/packages/installer/src/config/templates/env-template.js +127 -0
- package/packages/installer/src/config/validation/config-validator.js +243 -0
- package/packages/installer/src/detection/detect-project-type.js +81 -0
- package/packages/installer/src/wizard/wizard.js +244 -0
- package/packages/installer/tests/integration/environment-configuration.test.js +328 -0
- package/packages/installer/tests/integration/wizard-detection.test.js +349 -0
- package/packages/installer/tests/unit/config-validator.test.js +315 -0
- package/packages/installer/tests/unit/detection/detect-project-type.test.js +401 -0
- package/packages/installer/tests/unit/env-template.test.js +185 -0
- package/src/config/ide-configs.js +189 -0
- package/src/installer/aios-core-installer.js +319 -0
- package/src/installer/dependency-installer.js +335 -0
- package/src/utils/aios-colors.js +234 -0
- package/src/wizard/feedback.js +218 -0
- package/src/wizard/ide-config-generator.js +488 -0
- package/src/wizard/ide-selector.js +84 -0
- package/src/wizard/index.js +589 -0
- package/src/wizard/questions.js +249 -0
- package/src/wizard/validation/index.js +120 -0
- package/src/wizard/validation/report-generator.js +269 -0
- package/src/wizard/validation/troubleshooting-system.js +346 -0
- package/src/wizard/validation/validators/config-validator.js +362 -0
- package/src/wizard/validation/validators/dependency-validator.js +333 -0
- package/src/wizard/validation/validators/file-structure-validator.js +181 -0
- package/src/wizard/validation/validators/mcp-health-checker.js +310 -0
- package/src/wizard/validators.js +274 -0
- package/templates/squad/LICENSE +21 -0
- package/templates/squad/README.md +37 -0
- package/templates/squad/agents/example-agent.yaml +36 -0
- package/templates/squad/package.json +19 -0
- package/templates/squad/squad.yaml +25 -0
- package/templates/squad/tasks/example-task.yaml +46 -0
- package/templates/squad/templates/example-template.md +24 -0
- package/templates/squad/tests/example-agent.test.js +53 -0
- package/templates/squad/workflows/example-workflow.yaml +54 -0
- package/tools/package-builder.js +35 -0
|
@@ -0,0 +1,1158 @@
|
|
|
1
|
+
---
|
|
2
|
+
|
|
3
|
+
## Execution Modes
|
|
4
|
+
|
|
5
|
+
**Choose your execution mode:**
|
|
6
|
+
|
|
7
|
+
### 1. YOLO Mode - Fast, Autonomous (0-1 prompts)
|
|
8
|
+
- Autonomous decision making with logging
|
|
9
|
+
- Minimal user interaction
|
|
10
|
+
- **Best for:** Simple, deterministic tasks
|
|
11
|
+
|
|
12
|
+
### 2. Interactive Mode - Balanced, Educational (5-10 prompts) **[DEFAULT]**
|
|
13
|
+
- Explicit decision checkpoints
|
|
14
|
+
- Educational explanations
|
|
15
|
+
- **Best for:** Learning, complex decisions
|
|
16
|
+
|
|
17
|
+
### 3. Pre-Flight Planning - Comprehensive Upfront Planning
|
|
18
|
+
- Task analysis phase (identify all ambiguities)
|
|
19
|
+
- Zero ambiguity execution
|
|
20
|
+
- **Best for:** Ambiguous requirements, critical work
|
|
21
|
+
|
|
22
|
+
**Parameter:** `mode` (optional, default: `interactive`)
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Task Definition (AIOS Task Format V1.0)
|
|
27
|
+
|
|
28
|
+
```yaml
|
|
29
|
+
task: qaReviewProposal()
|
|
30
|
+
responsável: Quinn (Guardian)
|
|
31
|
+
responsavel_type: Agente
|
|
32
|
+
atomic_layer: Strategy
|
|
33
|
+
|
|
34
|
+
**Entrada:**
|
|
35
|
+
- campo: target
|
|
36
|
+
tipo: string
|
|
37
|
+
origem: User Input
|
|
38
|
+
obrigatório: true
|
|
39
|
+
validação: Must exist
|
|
40
|
+
|
|
41
|
+
- campo: criteria
|
|
42
|
+
tipo: array
|
|
43
|
+
origem: config
|
|
44
|
+
obrigatório: true
|
|
45
|
+
validação: Non-empty validation criteria
|
|
46
|
+
|
|
47
|
+
- campo: strict
|
|
48
|
+
tipo: boolean
|
|
49
|
+
origem: User Input
|
|
50
|
+
obrigatório: false
|
|
51
|
+
validação: Default: true
|
|
52
|
+
|
|
53
|
+
**Saída:**
|
|
54
|
+
- campo: validation_result
|
|
55
|
+
tipo: boolean
|
|
56
|
+
destino: Return value
|
|
57
|
+
persistido: false
|
|
58
|
+
|
|
59
|
+
- campo: errors
|
|
60
|
+
tipo: array
|
|
61
|
+
destino: Memory
|
|
62
|
+
persistido: false
|
|
63
|
+
|
|
64
|
+
- campo: report
|
|
65
|
+
tipo: object
|
|
66
|
+
destino: File (.ai/*.json)
|
|
67
|
+
persistido: true
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## Pre-Conditions
|
|
73
|
+
|
|
74
|
+
**Purpose:** Validate prerequisites BEFORE task execution (blocking)
|
|
75
|
+
|
|
76
|
+
**Checklist:**
|
|
77
|
+
|
|
78
|
+
```yaml
|
|
79
|
+
pre-conditions:
|
|
80
|
+
- [ ] Validation rules loaded; target available for validation
|
|
81
|
+
tipo: pre-condition
|
|
82
|
+
blocker: true
|
|
83
|
+
validação: |
|
|
84
|
+
Check validation rules loaded; target available for validation
|
|
85
|
+
error_message: "Pre-condition failed: Validation rules loaded; target available for validation"
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## Post-Conditions
|
|
91
|
+
|
|
92
|
+
**Purpose:** Validate execution success AFTER task completes
|
|
93
|
+
|
|
94
|
+
**Checklist:**
|
|
95
|
+
|
|
96
|
+
```yaml
|
|
97
|
+
post-conditions:
|
|
98
|
+
- [ ] Validation executed; results accurate; report generated
|
|
99
|
+
tipo: post-condition
|
|
100
|
+
blocker: true
|
|
101
|
+
validação: |
|
|
102
|
+
Verify validation executed; results accurate; report generated
|
|
103
|
+
error_message: "Post-condition failed: Validation executed; results accurate; report generated"
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## Acceptance Criteria
|
|
109
|
+
|
|
110
|
+
**Purpose:** Definitive pass/fail criteria for task completion
|
|
111
|
+
|
|
112
|
+
**Checklist:**
|
|
113
|
+
|
|
114
|
+
```yaml
|
|
115
|
+
acceptance-criteria:
|
|
116
|
+
- [ ] Validation rules applied; pass/fail accurate; actionable feedback
|
|
117
|
+
tipo: acceptance-criterion
|
|
118
|
+
blocker: true
|
|
119
|
+
validação: |
|
|
120
|
+
Assert validation rules applied; pass/fail accurate; actionable feedback
|
|
121
|
+
error_message: "Acceptance criterion not met: Validation rules applied; pass/fail accurate; actionable feedback"
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## Tools
|
|
127
|
+
|
|
128
|
+
**External/shared resources used by this task:**
|
|
129
|
+
|
|
130
|
+
- **Tool:** validation-engine
|
|
131
|
+
- **Purpose:** Rule-based validation and reporting
|
|
132
|
+
- **Source:** .aios-core/utils/validation-engine.js
|
|
133
|
+
|
|
134
|
+
- **Tool:** schema-validator
|
|
135
|
+
- **Purpose:** JSON/YAML schema validation
|
|
136
|
+
- **Source:** ajv or similar
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## Scripts
|
|
141
|
+
|
|
142
|
+
**Agent-specific code for this task:**
|
|
143
|
+
|
|
144
|
+
- **Script:** run-validation.js
|
|
145
|
+
- **Purpose:** Execute validation rules and generate report
|
|
146
|
+
- **Language:** JavaScript
|
|
147
|
+
- **Location:** .aios-core/scripts/run-validation.js
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## Error Handling
|
|
152
|
+
|
|
153
|
+
**Strategy:** retry
|
|
154
|
+
|
|
155
|
+
**Common Errors:**
|
|
156
|
+
|
|
157
|
+
1. **Error:** Validation Criteria Missing
|
|
158
|
+
- **Cause:** Required validation rules not defined
|
|
159
|
+
- **Resolution:** Ensure validation criteria loaded from config
|
|
160
|
+
- **Recovery:** Use default validation rules, log warning
|
|
161
|
+
|
|
162
|
+
2. **Error:** Invalid Schema
|
|
163
|
+
- **Cause:** Target does not match expected schema
|
|
164
|
+
- **Resolution:** Update schema or fix target structure
|
|
165
|
+
- **Recovery:** Detailed validation error report
|
|
166
|
+
|
|
167
|
+
3. **Error:** Dependency Missing
|
|
168
|
+
- **Cause:** Required dependency for validation not found
|
|
169
|
+
- **Resolution:** Install missing dependencies
|
|
170
|
+
- **Recovery:** Abort with clear dependency list
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## Performance
|
|
175
|
+
|
|
176
|
+
**Expected Metrics:**
|
|
177
|
+
|
|
178
|
+
```yaml
|
|
179
|
+
duration_expected: 5-20 min (estimated)
|
|
180
|
+
cost_estimated: $0.003-0.015
|
|
181
|
+
token_usage: ~2,000-8,000 tokens
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
**Optimization Notes:**
|
|
185
|
+
- Iterative analysis with depth limits; cache intermediate results; batch similar operations
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## Metadata
|
|
190
|
+
|
|
191
|
+
```yaml
|
|
192
|
+
story: N/A
|
|
193
|
+
version: 1.0.0
|
|
194
|
+
dependencies:
|
|
195
|
+
- N/A
|
|
196
|
+
tags:
|
|
197
|
+
- quality-assurance
|
|
198
|
+
- testing
|
|
199
|
+
updated_at: 2025-11-17
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
checklists:
|
|
205
|
+
- change-checklist.md
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
# Review Proposal - AIOS Developer Task
|
|
209
|
+
|
|
210
|
+
## Purpose
|
|
211
|
+
Review and provide feedback on modification proposals submitted through the collaborative modification system.
|
|
212
|
+
|
|
213
|
+
## Command Pattern
|
|
214
|
+
```
|
|
215
|
+
*review-proposal <proposal-id> [options]
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
## Parameters
|
|
219
|
+
- `proposal-id`: ID of the proposal to review
|
|
220
|
+
- `options`: Review configuration
|
|
221
|
+
|
|
222
|
+
### Options
|
|
223
|
+
- `--action <action>`: Review action (approve, reject, request-changes, comment)
|
|
224
|
+
- `--comment <text>`: Review comment or feedback
|
|
225
|
+
- `--conditions <text>`: Conditions for approval
|
|
226
|
+
- `--suggestions <file>`: File containing suggested changes
|
|
227
|
+
- `--priority <level>`: Update proposal priority
|
|
228
|
+
- `--assignees <users>`: Add/change assignees
|
|
229
|
+
- `--fast-review`: Skip detailed analysis
|
|
230
|
+
|
|
231
|
+
## Examples
|
|
232
|
+
```bash
|
|
233
|
+
# Approve proposal with conditions
|
|
234
|
+
*review-proposal proposal-1234567-abc123 --action approve --comment "Looks good with minor changes" --conditions "Add comprehensive tests before merging"
|
|
235
|
+
|
|
236
|
+
# Request changes with suggestions
|
|
237
|
+
*review-proposal proposal-1234567-def456 --action request-changes --comment "Need security improvements" --suggestions security-review.md
|
|
238
|
+
|
|
239
|
+
# Add comment without decision
|
|
240
|
+
*review-proposal proposal-1234567-ghi789 --action comment --comment "Please clarify the impact on API consumers"
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
## Implementation
|
|
244
|
+
|
|
245
|
+
```javascript
|
|
246
|
+
const fs = require('fs').promises;
|
|
247
|
+
const path = require('path');
|
|
248
|
+
const chalk = require('chalk');
|
|
249
|
+
const inquirer = require('inquirer');
|
|
250
|
+
|
|
251
|
+
class ReviewProposalTask {
|
|
252
|
+
constructor() {
|
|
253
|
+
this.taskName = 'review-proposal';
|
|
254
|
+
this.description = 'Review modification proposals';
|
|
255
|
+
this.rootPath = process.cwd();
|
|
256
|
+
this.proposalSystem = null;
|
|
257
|
+
this.impactAnalyzer = null;
|
|
258
|
+
this.notificationService = null;
|
|
259
|
+
this.diffGenerator = null;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
async execute(params) {
|
|
263
|
+
try {
|
|
264
|
+
console.log(chalk.blue('📋 AIOS Proposal Review'));
|
|
265
|
+
console.log(chalk.gray('Reviewing modification proposal\n'));
|
|
266
|
+
|
|
267
|
+
// Parse and validate parameters
|
|
268
|
+
const config = await this.parseParameters(params);
|
|
269
|
+
|
|
270
|
+
// Initialize dependencies
|
|
271
|
+
await this.initializeDependencies();
|
|
272
|
+
|
|
273
|
+
// Load proposal
|
|
274
|
+
console.log(chalk.gray('Loading proposal...'));
|
|
275
|
+
const proposal = await this.loadProposal(config.proposalId);
|
|
276
|
+
|
|
277
|
+
// Display proposal summary
|
|
278
|
+
await this.displayProposalSummary(proposal);
|
|
279
|
+
|
|
280
|
+
// Perform review analysis if not fast review
|
|
281
|
+
let reviewAnalysis = null;
|
|
282
|
+
if (!config.fastReview) {
|
|
283
|
+
console.log(chalk.gray('Analyzing proposal impact...'));
|
|
284
|
+
reviewAnalysis = await this.analyzeProposal(proposal);
|
|
285
|
+
await this.displayReviewAnalysis(reviewAnalysis);
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
// Get review details
|
|
289
|
+
const reviewDetails = await this.getReviewDetails(proposal, reviewAnalysis, config);
|
|
290
|
+
|
|
291
|
+
// Process review
|
|
292
|
+
console.log(chalk.gray('Processing review...'));
|
|
293
|
+
const result = await this.processReview(proposal, reviewDetails, config);
|
|
294
|
+
|
|
295
|
+
// Update proposal status
|
|
296
|
+
await this.updateProposalStatus(proposal, result);
|
|
297
|
+
|
|
298
|
+
// Notify relevant parties
|
|
299
|
+
await this.notifyReviewComplete(proposal, result);
|
|
300
|
+
|
|
301
|
+
// Display success
|
|
302
|
+
console.log(chalk.green('\n✅ Review submitted successfully'));
|
|
303
|
+
console.log(chalk.gray(` Proposal: ${proposal.proposalId}`));
|
|
304
|
+
console.log(chalk.gray(` Action: ${result.action}`));
|
|
305
|
+
console.log(chalk.gray(` Reviewer: ${result.reviewer}`));
|
|
306
|
+
|
|
307
|
+
if (result.nextSteps) {
|
|
308
|
+
console.log(chalk.blue('\n📌 Next Steps:'));
|
|
309
|
+
result.nextSteps.forEach((step, index) => {
|
|
310
|
+
console.log(chalk.gray(` ${index + 1}. ${step}`));
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
return {
|
|
315
|
+
success: true,
|
|
316
|
+
proposalId: proposal.proposalId,
|
|
317
|
+
reviewAction: result.action,
|
|
318
|
+
reviewStatus: result.status,
|
|
319
|
+
reviewer: result.reviewer,
|
|
320
|
+
timestamp: result.timestamp
|
|
321
|
+
};
|
|
322
|
+
|
|
323
|
+
} catch (error) {
|
|
324
|
+
console.error(chalk.red(`\n❌ Review failed: ${error.message}`));
|
|
325
|
+
throw error;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
async parseParameters(params) {
|
|
330
|
+
if (params.length < 1) {
|
|
331
|
+
throw new Error('Usage: *review-proposal <proposal-id> [options]');
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
const config = {
|
|
335
|
+
proposalId: params[0],
|
|
336
|
+
action: null,
|
|
337
|
+
comment: '',
|
|
338
|
+
conditions: '',
|
|
339
|
+
suggestions: null,
|
|
340
|
+
priority: null,
|
|
341
|
+
assignees: [],
|
|
342
|
+
fastReview: false
|
|
343
|
+
};
|
|
344
|
+
|
|
345
|
+
// Parse options
|
|
346
|
+
for (let i = 1; i < params.length; i++) {
|
|
347
|
+
const param = params[i];
|
|
348
|
+
|
|
349
|
+
if (param === '--fast-review') {
|
|
350
|
+
config.fastReview = true;
|
|
351
|
+
} else if (param.startsWith('--action') && params[i + 1]) {
|
|
352
|
+
config.action = params[++i];
|
|
353
|
+
} else if (param.startsWith('--comment') && params[i + 1]) {
|
|
354
|
+
config.comment = params[++i];
|
|
355
|
+
} else if (param.startsWith('--conditions') && params[i + 1]) {
|
|
356
|
+
config.conditions = params[++i];
|
|
357
|
+
} else if (param.startsWith('--suggestions') && params[i + 1]) {
|
|
358
|
+
config.suggestions = params[++i];
|
|
359
|
+
} else if (param.startsWith('--priority') && params[i + 1]) {
|
|
360
|
+
config.priority = params[++i];
|
|
361
|
+
} else if (param.startsWith('--assignees') && params[i + 1]) {
|
|
362
|
+
config.assignees = params[++i].split(',').map(a => a.trim());
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
// Validate action if provided
|
|
367
|
+
if (config.action) {
|
|
368
|
+
const validActions = ['approve', 'reject', 'request-changes', 'comment'];
|
|
369
|
+
if (!validActions.includes(config.action)) {
|
|
370
|
+
throw new Error(`Invalid action: ${config.action}. Must be one of: ${validActions.join(', ')}`);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
return config;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
async initializeDependencies() {
|
|
378
|
+
try {
|
|
379
|
+
const ProposalSystem = require('../scripts/proposal-system');
|
|
380
|
+
this.proposalSystem = new ProposalSystem({ rootPath: this.rootPath });
|
|
381
|
+
|
|
382
|
+
const ImpactAnalyzer = require('../scripts/dependency-impact-analyzer');
|
|
383
|
+
this.impactAnalyzer = new ImpactAnalyzer({ rootPath: this.rootPath });
|
|
384
|
+
|
|
385
|
+
const NotificationService = require('../scripts/notification-service');
|
|
386
|
+
this.notificationService = new NotificationService({ rootPath: this.rootPath });
|
|
387
|
+
|
|
388
|
+
// const DiffGenerator = require('../scripts/diff-generator'); // Archived in archived-utilities/ (Story 3.1.2)
|
|
389
|
+
// this.diffGenerator = new DiffGenerator({ rootPath: this.rootPath });
|
|
390
|
+
|
|
391
|
+
} catch (error) {
|
|
392
|
+
throw new Error(`Failed to initialize dependencies: ${error.message}`);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
async loadProposal(proposalId) {
|
|
397
|
+
try {
|
|
398
|
+
const proposalFile = path.join(this.rootPath, '.aios', 'proposals', `${proposalId}.json`);
|
|
399
|
+
const content = await fs.readFile(proposalFile, 'utf-8');
|
|
400
|
+
return JSON.parse(content);
|
|
401
|
+
} catch (error) {
|
|
402
|
+
if (error.code === 'ENOENT') {
|
|
403
|
+
throw new Error(`Proposal not found: ${proposalId}`);
|
|
404
|
+
}
|
|
405
|
+
throw error;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
async displayProposalSummary(proposal) {
|
|
410
|
+
console.log(chalk.blue('\n📄 Proposal Summary'));
|
|
411
|
+
console.log(chalk.gray('━'.repeat(50)));
|
|
412
|
+
|
|
413
|
+
console.log(`ID: ${chalk.white(proposal.proposalId)}`);
|
|
414
|
+
console.log(`Title: ${chalk.white(proposal.title)}`);
|
|
415
|
+
console.log(`Component: ${chalk.white(proposal.componentPath)}`);
|
|
416
|
+
console.log(`Type: ${chalk.white(proposal.modificationType)}`);
|
|
417
|
+
console.log(`Priority: ${this.formatPriority(proposal.priority)}`);
|
|
418
|
+
console.log(`Status: ${this.formatStatus(proposal.status)}`);
|
|
419
|
+
console.log(`Created by: ${chalk.white(proposal.metadata.createdBy)}`);
|
|
420
|
+
console.log(`Created at: ${chalk.white(new Date(proposal.metadata.createdAt).toLocaleString())}`);
|
|
421
|
+
|
|
422
|
+
if (proposal.assignees && proposal.assignees.length > 0) {
|
|
423
|
+
console.log(`Assignees: ${chalk.white(proposal.assignees.join(', '))}`);
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
if (proposal.tags && proposal.tags.length > 0) {
|
|
427
|
+
console.log(`Tags: ${chalk.gray(proposal.tags.join(', '))}`);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
console.log(chalk.blue('\n📝 Description:'));
|
|
431
|
+
console.log(chalk.gray(proposal.description || 'No description provided'));
|
|
432
|
+
|
|
433
|
+
// Show modification-specific info
|
|
434
|
+
if (proposal.modificationType === 'deprecate' && proposal.deprecationInfo) {
|
|
435
|
+
console.log(chalk.yellow('\n⚠️ Deprecation Info:'));
|
|
436
|
+
console.log(`Target removal: ${proposal.deprecationInfo.targetRemovalDate || 'Not specified'}`);
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
if (proposal.modificationType === 'enhance' && proposal.enhancementInfo) {
|
|
440
|
+
console.log(chalk.green('\n✨ Enhancement Info:'));
|
|
441
|
+
console.log(`New capabilities: ${proposal.enhancementInfo.newCapabilities.join(', ')}`);
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
if (proposal.modificationType === 'refactor' && proposal.refactorInfo) {
|
|
445
|
+
console.log(chalk.blue('\n🔧 Refactor Info:'));
|
|
446
|
+
console.log(`Breaking changes: ${proposal.refactorInfo.breakingChanges ? 'Yes' : 'No'}`);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
async analyzeProposal(proposal) {
|
|
451
|
+
const analysis = {
|
|
452
|
+
codeQuality: await this.analyzeCodeQuality(proposal),
|
|
453
|
+
impact: proposal.impactAnalysis || null,
|
|
454
|
+
conflicts: await this.checkForConflicts(proposal),
|
|
455
|
+
testCoverage: await this.analyzeTestCoverage(proposal),
|
|
456
|
+
securityIssues: await this.checkSecurityIssues(proposal),
|
|
457
|
+
recommendations: []
|
|
458
|
+
};
|
|
459
|
+
|
|
460
|
+
// Generate recommendations based on analysis
|
|
461
|
+
analysis.recommendations = this.generateRecommendations(analysis);
|
|
462
|
+
|
|
463
|
+
return analysis;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
async analyzeCodeQuality(proposal) {
|
|
467
|
+
try {
|
|
468
|
+
const component = await fs.readFile(
|
|
469
|
+
path.resolve(this.rootPath, proposal.componentPath),
|
|
470
|
+
'utf-8'
|
|
471
|
+
);
|
|
472
|
+
|
|
473
|
+
const quality = {
|
|
474
|
+
complexity: this.calculateComplexity(component),
|
|
475
|
+
maintainability: this.assessMaintainability(component),
|
|
476
|
+
documentation: this.checkDocumentation(component),
|
|
477
|
+
codeStyle: this.checkCodeStyle(component)
|
|
478
|
+
};
|
|
479
|
+
|
|
480
|
+
return quality;
|
|
481
|
+
} catch (error) {
|
|
482
|
+
return {
|
|
483
|
+
error: `Could not analyze code quality: ${error.message}`
|
|
484
|
+
};
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
async checkForConflicts(proposal) {
|
|
489
|
+
// Check for other pending proposals on the same component
|
|
490
|
+
const indexFile = path.join(this.rootPath, '.aios', 'proposals', 'index.json');
|
|
491
|
+
|
|
492
|
+
try {
|
|
493
|
+
const content = await fs.readFile(indexFile, 'utf-8');
|
|
494
|
+
const index = JSON.parse(content);
|
|
495
|
+
|
|
496
|
+
const conflicts = index.proposals.filter(p =>
|
|
497
|
+
p.proposalId !== proposal.proposalId &&
|
|
498
|
+
p.componentPath === proposal.componentPath &&
|
|
499
|
+
(p.status === 'pending_review' || p.status === 'approved')
|
|
500
|
+
);
|
|
501
|
+
|
|
502
|
+
return {
|
|
503
|
+
hasConflicts: conflicts.length > 0,
|
|
504
|
+
conflictingProposals: conflicts
|
|
505
|
+
};
|
|
506
|
+
} catch (error) {
|
|
507
|
+
return {
|
|
508
|
+
hasConflicts: false,
|
|
509
|
+
conflictingProposals: []
|
|
510
|
+
};
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
async analyzeTestCoverage(proposal) {
|
|
515
|
+
// Check if component has tests
|
|
516
|
+
const testPaths = [
|
|
517
|
+
path.join(this.rootPath, 'tests', 'unit', proposal.componentType, `${path.basename(proposal.componentPath, path.extname(proposal.componentPath))}.test.js`),
|
|
518
|
+
path.join(this.rootPath, 'tests', 'integration', proposal.componentType, `${path.basename(proposal.componentPath, path.extname(proposal.componentPath))}.test.js`)
|
|
519
|
+
];
|
|
520
|
+
|
|
521
|
+
let hasTests = false;
|
|
522
|
+
for (const testPath of testPaths) {
|
|
523
|
+
try {
|
|
524
|
+
await fs.access(testPath);
|
|
525
|
+
hasTests = true;
|
|
526
|
+
break;
|
|
527
|
+
} catch (error) {
|
|
528
|
+
// Test file doesn't exist
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
return {
|
|
533
|
+
hasTests: hasTests,
|
|
534
|
+
recommendation: hasTests ?
|
|
535
|
+
'Component has test coverage' :
|
|
536
|
+
'Component lacks test coverage - tests should be added'
|
|
537
|
+
};
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
async checkSecurityIssues(proposal) {
|
|
541
|
+
try {
|
|
542
|
+
const component = await fs.readFile(
|
|
543
|
+
path.resolve(this.rootPath, proposal.componentPath),
|
|
544
|
+
'utf-8'
|
|
545
|
+
);
|
|
546
|
+
|
|
547
|
+
const issues = [];
|
|
548
|
+
|
|
549
|
+
// Check for common security patterns
|
|
550
|
+
if (component.includes('eval(') || component.includes('Function(')) {
|
|
551
|
+
issues.push('Uses dynamic code execution (eval/Function)');
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
if (component.includes('innerHTML') || component.includes('dangerouslySetInnerHTML')) {
|
|
555
|
+
issues.push('Potential XSS vulnerability with innerHTML usage');
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
if (component.includes('exec(') || component.includes('spawn(')) {
|
|
559
|
+
issues.push('Executes external processes - needs security review');
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
if (component.includes('fs.') && proposal.modificationType === 'enhance') {
|
|
563
|
+
issues.push('File system operations in enhancement - verify path validation');
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
return {
|
|
567
|
+
hasIssues: issues.length > 0,
|
|
568
|
+
issues: issues
|
|
569
|
+
};
|
|
570
|
+
} catch (error) {
|
|
571
|
+
return {
|
|
572
|
+
hasIssues: false,
|
|
573
|
+
issues: []
|
|
574
|
+
};
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
async displayReviewAnalysis(analysis) {
|
|
579
|
+
console.log(chalk.blue('\n🔍 Review Analysis'));
|
|
580
|
+
console.log(chalk.gray('━'.repeat(50)));
|
|
581
|
+
|
|
582
|
+
// Code Quality
|
|
583
|
+
if (analysis.codeQuality && !analysis.codeQuality.error) {
|
|
584
|
+
console.log(chalk.blue('\n📊 Code Quality:'));
|
|
585
|
+
console.log(` Complexity: ${this.formatScore(analysis.codeQuality.complexity)}`);
|
|
586
|
+
console.log(` Maintainability: ${this.formatScore(analysis.codeQuality.maintainability)}`);
|
|
587
|
+
console.log(` Documentation: ${this.formatScore(analysis.codeQuality.documentation)}`);
|
|
588
|
+
console.log(` Code Style: ${this.formatScore(analysis.codeQuality.codeStyle)}`);
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
// Impact Analysis
|
|
592
|
+
if (analysis.impact) {
|
|
593
|
+
console.log(chalk.blue('\n💥 Impact Summary:'));
|
|
594
|
+
console.log(` Affected components: ${analysis.impact.affectedComponents || 'Unknown'}`);
|
|
595
|
+
console.log(` Risk level: ${this.formatRiskLevel(analysis.impact.riskLevel || 'Unknown')}`);
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
// Conflicts
|
|
599
|
+
if (analysis.conflicts.hasConflicts) {
|
|
600
|
+
console.log(chalk.yellow('\n⚠️ Conflicts Detected:'));
|
|
601
|
+
analysis.conflicts.conflictingProposals.forEach(conflict => {
|
|
602
|
+
console.log(` - ${conflict.proposalId}: ${conflict.title} (${conflict.status})`);
|
|
603
|
+
});
|
|
604
|
+
} else {
|
|
605
|
+
console.log(chalk.green('\n✅ No conflicts detected'));
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
// Test Coverage
|
|
609
|
+
console.log(chalk.blue('\n🧪 Test Coverage:'));
|
|
610
|
+
console.log(` ${analysis.testCoverage.recommendation}`);
|
|
611
|
+
|
|
612
|
+
// Security Issues
|
|
613
|
+
if (analysis.securityIssues.hasIssues) {
|
|
614
|
+
console.log(chalk.red('\n🔒 Security Concerns:'));
|
|
615
|
+
analysis.securityIssues.issues.forEach(issue => {
|
|
616
|
+
console.log(` - ${issue}`);
|
|
617
|
+
});
|
|
618
|
+
} else {
|
|
619
|
+
console.log(chalk.green('\n🔒 No security issues detected'));
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
// Recommendations
|
|
623
|
+
if (analysis.recommendations.length > 0) {
|
|
624
|
+
console.log(chalk.blue('\n💡 Recommendations:'));
|
|
625
|
+
analysis.recommendations.forEach((rec, index) => {
|
|
626
|
+
console.log(` ${index + 1}. ${rec}`);
|
|
627
|
+
});
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
async getReviewDetails(proposal, analysis, config) {
|
|
632
|
+
const details = {
|
|
633
|
+
action: config.action,
|
|
634
|
+
comment: config.comment,
|
|
635
|
+
conditions: config.conditions,
|
|
636
|
+
suggestions: null,
|
|
637
|
+
priority: config.priority,
|
|
638
|
+
assignees: config.assignees
|
|
639
|
+
};
|
|
640
|
+
|
|
641
|
+
// Load suggestions if provided
|
|
642
|
+
if (config.suggestions) {
|
|
643
|
+
try {
|
|
644
|
+
details.suggestions = await fs.readFile(config.suggestions, 'utf-8');
|
|
645
|
+
} catch (error) {
|
|
646
|
+
console.warn(chalk.yellow(`Could not load suggestions file: ${error.message}`));
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
// Interactive review if action not provided
|
|
651
|
+
if (!details.action) {
|
|
652
|
+
const questions = await this.buildReviewQuestions(proposal, analysis);
|
|
653
|
+
const answers = await inquirer.prompt(questions);
|
|
654
|
+
Object.assign(details, answers);
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
// Set reviewer info
|
|
658
|
+
details.reviewer = process.env.USER || 'aios-reviewer';
|
|
659
|
+
details.reviewTimestamp = new Date().toISOString();
|
|
660
|
+
|
|
661
|
+
return details;
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
async buildReviewQuestions(proposal, analysis) {
|
|
665
|
+
const questions = [];
|
|
666
|
+
|
|
667
|
+
// Main action
|
|
668
|
+
questions.push({
|
|
669
|
+
type: 'list',
|
|
670
|
+
name: 'action',
|
|
671
|
+
message: 'Review action:',
|
|
672
|
+
choices: [
|
|
673
|
+
{ name: '✅ Approve', value: 'approve' },
|
|
674
|
+
{ name: '❌ Reject', value: 'reject' },
|
|
675
|
+
{ name: '🔄 Request Changes', value: 'request-changes' },
|
|
676
|
+
{ name: '💬 Add Comment Only', value: 'comment' }
|
|
677
|
+
]
|
|
678
|
+
});
|
|
679
|
+
|
|
680
|
+
// Comment
|
|
681
|
+
questions.push({
|
|
682
|
+
type: 'editor',
|
|
683
|
+
name: 'comment',
|
|
684
|
+
message: 'Review comment:',
|
|
685
|
+
default: this.getCommentTemplate(proposal, analysis)
|
|
686
|
+
});
|
|
687
|
+
|
|
688
|
+
// Approval conditions
|
|
689
|
+
questions.push({
|
|
690
|
+
type: 'input',
|
|
691
|
+
name: 'conditions',
|
|
692
|
+
message: 'Conditions for approval (if any):',
|
|
693
|
+
when: (answers) => answers.action === 'approve'
|
|
694
|
+
});
|
|
695
|
+
|
|
696
|
+
// Priority update
|
|
697
|
+
questions.push({
|
|
698
|
+
type: 'list',
|
|
699
|
+
name: 'priority',
|
|
700
|
+
message: 'Update priority?',
|
|
701
|
+
choices: [
|
|
702
|
+
{ name: 'Keep current', value: null },
|
|
703
|
+
{ name: 'Low', value: 'low' },
|
|
704
|
+
{ name: 'Medium', value: 'medium' },
|
|
705
|
+
{ name: 'High', value: 'high' },
|
|
706
|
+
{ name: 'Critical', value: 'critical' }
|
|
707
|
+
],
|
|
708
|
+
default: 0
|
|
709
|
+
});
|
|
710
|
+
|
|
711
|
+
// Additional assignees
|
|
712
|
+
questions.push({
|
|
713
|
+
type: 'input',
|
|
714
|
+
name: 'additionalAssignees',
|
|
715
|
+
message: 'Add additional reviewers (comma-separated):',
|
|
716
|
+
when: (answers) => answers.action === 'request-changes',
|
|
717
|
+
filter: (input) => input ? input.split(',').map(a => a.trim()) : []
|
|
718
|
+
});
|
|
719
|
+
|
|
720
|
+
return questions;
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
async processReview(proposal, reviewDetails, config) {
|
|
724
|
+
const review = {
|
|
725
|
+
reviewId: `review-${Date.now()}-${Math.random().toString(36).substr(2, 6)}`,
|
|
726
|
+
proposalId: proposal.proposalId,
|
|
727
|
+
action: reviewDetails.action,
|
|
728
|
+
status: this.getReviewStatus(reviewDetails.action),
|
|
729
|
+
reviewer: reviewDetails.reviewer,
|
|
730
|
+
timestamp: reviewDetails.reviewTimestamp,
|
|
731
|
+
comment: reviewDetails.comment,
|
|
732
|
+
conditions: reviewDetails.conditions,
|
|
733
|
+
suggestions: reviewDetails.suggestions,
|
|
734
|
+
metadata: {
|
|
735
|
+
reviewDuration: this.calculateReviewDuration(proposal),
|
|
736
|
+
analysisPerformed: !config.fastReview
|
|
737
|
+
}
|
|
738
|
+
};
|
|
739
|
+
|
|
740
|
+
// Store review
|
|
741
|
+
await this.storeReview(proposal, review);
|
|
742
|
+
|
|
743
|
+
// Determine next steps
|
|
744
|
+
review.nextSteps = this.determineNextSteps(proposal, review);
|
|
745
|
+
|
|
746
|
+
return review;
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
async storeReview(proposal, review) {
|
|
750
|
+
const reviewsDir = path.join(this.rootPath, '.aios', 'proposals', 'reviews');
|
|
751
|
+
await fs.mkdir(reviewsDir, { recursive: true });
|
|
752
|
+
|
|
753
|
+
const reviewFile = path.join(reviewsDir, `${review.reviewId}.json`);
|
|
754
|
+
await fs.writeFile(reviewFile, JSON.stringify(review, null, 2));
|
|
755
|
+
|
|
756
|
+
// Update proposal with review reference
|
|
757
|
+
if (!proposal.reviews) {
|
|
758
|
+
proposal.reviews = [];
|
|
759
|
+
}
|
|
760
|
+
proposal.reviews.push({
|
|
761
|
+
reviewId: review.reviewId,
|
|
762
|
+
reviewer: review.reviewer,
|
|
763
|
+
action: review.action,
|
|
764
|
+
timestamp: review.timestamp
|
|
765
|
+
});
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
async updateProposalStatus(proposal, review) {
|
|
769
|
+
// Update status based on review action
|
|
770
|
+
switch (review.action) {
|
|
771
|
+
case 'approve':
|
|
772
|
+
proposal.status = 'approved';
|
|
773
|
+
proposal.approvedBy = review.reviewer;
|
|
774
|
+
proposal.approvalTimestamp = review.timestamp;
|
|
775
|
+
break;
|
|
776
|
+
case 'reject':
|
|
777
|
+
proposal.status = 'rejected';
|
|
778
|
+
proposal.rejectedBy = review.reviewer;
|
|
779
|
+
proposal.rejectionTimestamp = review.timestamp;
|
|
780
|
+
break;
|
|
781
|
+
case 'request-changes':
|
|
782
|
+
proposal.status = 'changes_requested';
|
|
783
|
+
proposal.lastReviewTimestamp = review.timestamp;
|
|
784
|
+
break;
|
|
785
|
+
case 'comment':
|
|
786
|
+
// Status remains unchanged for comments
|
|
787
|
+
proposal.lastCommentTimestamp = review.timestamp;
|
|
788
|
+
break;
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
// Update priority if changed
|
|
792
|
+
if (review.priority) {
|
|
793
|
+
proposal.priority = review.priority;
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
// Update assignees if changed
|
|
797
|
+
if (review.assignees && review.assignees.length > 0) {
|
|
798
|
+
proposal.assignees = [...new Set([...proposal.assignees, ...review.assignees])];
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
// Update metadata
|
|
802
|
+
proposal.metadata.lastModified = new Date().toISOString();
|
|
803
|
+
proposal.metadata.version++;
|
|
804
|
+
|
|
805
|
+
// Save updated proposal
|
|
806
|
+
const proposalFile = path.join(this.rootPath, '.aios', 'proposals', `${proposal.proposalId}.json`);
|
|
807
|
+
await fs.writeFile(proposalFile, JSON.stringify(proposal, null, 2));
|
|
808
|
+
|
|
809
|
+
// Update index
|
|
810
|
+
await this.updateProposalIndex(proposal);
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
async updateProposalIndex(proposal) {
|
|
814
|
+
const indexFile = path.join(this.rootPath, '.aios', 'proposals', 'index.json');
|
|
815
|
+
|
|
816
|
+
try {
|
|
817
|
+
const content = await fs.readFile(indexFile, 'utf-8');
|
|
818
|
+
const index = JSON.parse(content);
|
|
819
|
+
|
|
820
|
+
const proposalIndex = index.proposals.findIndex(p => p.proposalId === proposal.proposalId);
|
|
821
|
+
if (proposalIndex !== -1) {
|
|
822
|
+
index.proposals[proposalIndex].status = proposal.status;
|
|
823
|
+
index.proposals[proposalIndex].priority = proposal.priority;
|
|
824
|
+
index.proposals[proposalIndex].lastModified = proposal.metadata.lastModified;
|
|
825
|
+
}
|
|
826
|
+
|
|
827
|
+
await fs.writeFile(indexFile, JSON.stringify(index, null, 2));
|
|
828
|
+
} catch (error) {
|
|
829
|
+
console.warn(chalk.yellow(`Failed to update proposal index: ${error.message}`));
|
|
830
|
+
}
|
|
831
|
+
}
|
|
832
|
+
|
|
833
|
+
async notifyReviewComplete(proposal, review) {
|
|
834
|
+
try {
|
|
835
|
+
const notifications = [];
|
|
836
|
+
|
|
837
|
+
// Notify proposal creator
|
|
838
|
+
notifications.push({
|
|
839
|
+
recipient: proposal.metadata.createdBy,
|
|
840
|
+
type: 'review_complete',
|
|
841
|
+
proposalId: proposal.proposalId,
|
|
842
|
+
reviewAction: review.action,
|
|
843
|
+
reviewer: review.reviewer
|
|
844
|
+
});
|
|
845
|
+
|
|
846
|
+
// Notify assignees if action requires it
|
|
847
|
+
if (review.action === 'request-changes' && proposal.assignees) {
|
|
848
|
+
proposal.assignees.forEach(assignee => {
|
|
849
|
+
notifications.push({
|
|
850
|
+
recipient: assignee,
|
|
851
|
+
type: 'changes_requested',
|
|
852
|
+
proposalId: proposal.proposalId,
|
|
853
|
+
reviewer: review.reviewer,
|
|
854
|
+
comment: review.comment
|
|
855
|
+
});
|
|
856
|
+
});
|
|
857
|
+
}
|
|
858
|
+
|
|
859
|
+
// Send notifications
|
|
860
|
+
for (const notification of notifications) {
|
|
861
|
+
await this.notificationService.sendNotification(notification);
|
|
862
|
+
}
|
|
863
|
+
|
|
864
|
+
console.log(chalk.gray(` Notifications sent: ${notifications.length}`));
|
|
865
|
+
|
|
866
|
+
} catch (error) {
|
|
867
|
+
console.warn(chalk.yellow(`Failed to send notifications: ${error.message}`));
|
|
868
|
+
}
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
// Helper methods
|
|
872
|
+
|
|
873
|
+
calculateComplexity(component) {
|
|
874
|
+
// Simple complexity calculation based on code patterns
|
|
875
|
+
const functionCount = (component.match(/function\s+\w+/g) || []).length;
|
|
876
|
+
const methodCount = (component.match(/\w+\s*\([^)]*\)\s*{/g) || []).length;
|
|
877
|
+
const conditionalCount = (component.match(/if\s*\(|switch\s*\(/g) || []).length;
|
|
878
|
+
const loopCount = (component.match(/for\s*\(|while\s*\(|\.forEach|\.map/g) || []).length;
|
|
879
|
+
|
|
880
|
+
const complexity = functionCount + methodCount + conditionalCount + loopCount;
|
|
881
|
+
|
|
882
|
+
if (complexity > 50) return { score: 'high', value: complexity };
|
|
883
|
+
if (complexity > 20) return { score: 'medium', value: complexity };
|
|
884
|
+
return { score: 'low', value: complexity };
|
|
885
|
+
}
|
|
886
|
+
|
|
887
|
+
assessMaintainability(component) {
|
|
888
|
+
// Check for maintainability indicators
|
|
889
|
+
const hasComments = component.includes('//') || component.includes('/*');
|
|
890
|
+
const hasJSDoc = component.includes('/**');
|
|
891
|
+
const hasErrorHandling = component.includes('try') || component.includes('catch');
|
|
892
|
+
const hasModularStructure = component.includes('module.exports') || component.includes('export');
|
|
893
|
+
|
|
894
|
+
let score = 0;
|
|
895
|
+
if (hasComments) score += 25;
|
|
896
|
+
if (hasJSDoc) score += 25;
|
|
897
|
+
if (hasErrorHandling) score += 25;
|
|
898
|
+
if (hasModularStructure) score += 25;
|
|
899
|
+
|
|
900
|
+
return { score: score >= 75 ? 'good' : score >= 50 ? 'fair' : 'poor', value: score };
|
|
901
|
+
}
|
|
902
|
+
|
|
903
|
+
checkDocumentation(component) {
|
|
904
|
+
const docPatterns = [
|
|
905
|
+
/\/\*\*[\s\S]*?\*\//g, // JSDoc
|
|
906
|
+
/#+\s+\w+/g, // Markdown headers
|
|
907
|
+
/@param/g, // Parameter documentation
|
|
908
|
+
/@returns/g, // Return documentation
|
|
909
|
+
/@example/g // Example documentation
|
|
910
|
+
];
|
|
911
|
+
|
|
912
|
+
let docScore = 0;
|
|
913
|
+
docPatterns.forEach(pattern => {
|
|
914
|
+
const matches = component.match(pattern);
|
|
915
|
+
if (matches) docScore += matches.length;
|
|
916
|
+
});
|
|
917
|
+
|
|
918
|
+
return { score: docScore > 10 ? 'good' : docScore > 5 ? 'fair' : 'poor', value: docScore };
|
|
919
|
+
}
|
|
920
|
+
|
|
921
|
+
checkCodeStyle(component) {
|
|
922
|
+
// Basic code style checks
|
|
923
|
+
const issues = [];
|
|
924
|
+
|
|
925
|
+
if (component.includes('\t')) {
|
|
926
|
+
issues.push('Uses tabs instead of spaces');
|
|
927
|
+
}
|
|
928
|
+
|
|
929
|
+
const lines = component.split('\n');
|
|
930
|
+
const longLines = lines.filter(line => line.length > 120).length;
|
|
931
|
+
if (longLines > 0) {
|
|
932
|
+
issues.push(`${longLines} lines exceed 120 characters`);
|
|
933
|
+
}
|
|
934
|
+
|
|
935
|
+
if (!component.includes('use strict') && !component.includes('"use strict"')) {
|
|
936
|
+
issues.push('Missing strict mode declaration');
|
|
937
|
+
}
|
|
938
|
+
|
|
939
|
+
return {
|
|
940
|
+
score: issues.length === 0 ? 'good' : issues.length <= 2 ? 'fair' : 'poor',
|
|
941
|
+
issues: issues
|
|
942
|
+
};
|
|
943
|
+
}
|
|
944
|
+
|
|
945
|
+
generateRecommendations(analysis) {
|
|
946
|
+
const recommendations = [];
|
|
947
|
+
|
|
948
|
+
// Code quality recommendations
|
|
949
|
+
if (analysis.codeQuality && !analysis.codeQuality.error) {
|
|
950
|
+
if (analysis.codeQuality.complexity.score === 'high') {
|
|
951
|
+
recommendations.push('Consider refactoring to reduce code complexity');
|
|
952
|
+
}
|
|
953
|
+
if (analysis.codeQuality.documentation.score === 'poor') {
|
|
954
|
+
recommendations.push('Add comprehensive documentation and JSDoc comments');
|
|
955
|
+
}
|
|
956
|
+
if (analysis.codeQuality.maintainability.score === 'poor') {
|
|
957
|
+
recommendations.push('Improve code maintainability with better structure and error handling');
|
|
958
|
+
}
|
|
959
|
+
}
|
|
960
|
+
|
|
961
|
+
// Test coverage recommendations
|
|
962
|
+
if (!analysis.testCoverage.hasTests) {
|
|
963
|
+
recommendations.push('Add unit tests before approving this modification');
|
|
964
|
+
}
|
|
965
|
+
|
|
966
|
+
// Security recommendations
|
|
967
|
+
if (analysis.securityIssues.hasIssues) {
|
|
968
|
+
recommendations.push('Address security concerns before approval');
|
|
969
|
+
}
|
|
970
|
+
|
|
971
|
+
// Conflict recommendations
|
|
972
|
+
if (analysis.conflicts.hasConflicts) {
|
|
973
|
+
recommendations.push('Resolve conflicts with other pending proposals');
|
|
974
|
+
}
|
|
975
|
+
|
|
976
|
+
return recommendations;
|
|
977
|
+
}
|
|
978
|
+
|
|
979
|
+
getCommentTemplate(proposal, analysis) {
|
|
980
|
+
let template = `## Review for: ${proposal.title}\n\n`;
|
|
981
|
+
template += `### Summary\n[Provide your overall assessment]\n\n`;
|
|
982
|
+
|
|
983
|
+
if (analysis && analysis.recommendations.length > 0) {
|
|
984
|
+
template += `### Recommendations\n`;
|
|
985
|
+
analysis.recommendations.forEach((rec, index) => {
|
|
986
|
+
template += `${index + 1}. ${rec}\n`;
|
|
987
|
+
});
|
|
988
|
+
template += '\n';
|
|
989
|
+
}
|
|
990
|
+
|
|
991
|
+
template += `### Details\n[Add specific feedback and suggestions]\n`;
|
|
992
|
+
|
|
993
|
+
return template;
|
|
994
|
+
}
|
|
995
|
+
|
|
996
|
+
formatPriority(priority) {
|
|
997
|
+
const colors = {
|
|
998
|
+
low: chalk.gray,
|
|
999
|
+
medium: chalk.yellow,
|
|
1000
|
+
high: chalk.red,
|
|
1001
|
+
critical: chalk.red.bold
|
|
1002
|
+
};
|
|
1003
|
+
return colors[priority] ? colors[priority](priority.toUpperCase()) : priority;
|
|
1004
|
+
}
|
|
1005
|
+
|
|
1006
|
+
formatStatus(status) {
|
|
1007
|
+
const statusMap = {
|
|
1008
|
+
draft: chalk.gray('DRAFT'),
|
|
1009
|
+
pending_review: chalk.yellow('PENDING REVIEW'),
|
|
1010
|
+
approved: chalk.green('APPROVED'),
|
|
1011
|
+
rejected: chalk.red('REJECTED'),
|
|
1012
|
+
changes_requested: chalk.yellow('CHANGES REQUESTED'),
|
|
1013
|
+
in_progress: chalk.blue('IN PROGRESS'),
|
|
1014
|
+
completed: chalk.green('COMPLETED')
|
|
1015
|
+
};
|
|
1016
|
+
return statusMap[status] || status;
|
|
1017
|
+
}
|
|
1018
|
+
|
|
1019
|
+
formatScore(score) {
|
|
1020
|
+
if (typeof score === 'object') {
|
|
1021
|
+
const colors = {
|
|
1022
|
+
good: chalk.green,
|
|
1023
|
+
fair: chalk.yellow,
|
|
1024
|
+
poor: chalk.red,
|
|
1025
|
+
low: chalk.green,
|
|
1026
|
+
medium: chalk.yellow,
|
|
1027
|
+
high: chalk.red
|
|
1028
|
+
};
|
|
1029
|
+
const color = colors[score.score] || chalk.gray;
|
|
1030
|
+
return color(`${score.score.toUpperCase()} (${score.value})`);
|
|
1031
|
+
}
|
|
1032
|
+
return score;
|
|
1033
|
+
}
|
|
1034
|
+
|
|
1035
|
+
formatRiskLevel(level) {
|
|
1036
|
+
const colors = {
|
|
1037
|
+
low: chalk.green,
|
|
1038
|
+
medium: chalk.yellow,
|
|
1039
|
+
high: chalk.red,
|
|
1040
|
+
critical: chalk.red.bold
|
|
1041
|
+
};
|
|
1042
|
+
return colors[level] ? colors[level](level.toUpperCase()) : level;
|
|
1043
|
+
}
|
|
1044
|
+
|
|
1045
|
+
getReviewStatus(action) {
|
|
1046
|
+
const statusMap = {
|
|
1047
|
+
'approve': 'approved',
|
|
1048
|
+
'reject': 'rejected',
|
|
1049
|
+
'request-changes': 'changes_requested',
|
|
1050
|
+
'comment': 'commented'
|
|
1051
|
+
};
|
|
1052
|
+
return statusMap[action] || action;
|
|
1053
|
+
}
|
|
1054
|
+
|
|
1055
|
+
calculateReviewDuration(proposal) {
|
|
1056
|
+
const created = new Date(proposal.metadata.createdAt);
|
|
1057
|
+
const now = new Date();
|
|
1058
|
+
const duration = now - created;
|
|
1059
|
+
|
|
1060
|
+
const hours = Math.floor(duration / (1000 * 60 * 60));
|
|
1061
|
+
const days = Math.floor(hours / 24);
|
|
1062
|
+
|
|
1063
|
+
if (days > 0) {
|
|
1064
|
+
return `${days} day${days > 1 ? 's' : ''}`;
|
|
1065
|
+
}
|
|
1066
|
+
return `${hours} hour${hours !== 1 ? 's' : ''}`;
|
|
1067
|
+
}
|
|
1068
|
+
|
|
1069
|
+
determineNextSteps(proposal, review) {
|
|
1070
|
+
const steps = [];
|
|
1071
|
+
|
|
1072
|
+
switch (review.action) {
|
|
1073
|
+
case 'approve':
|
|
1074
|
+
steps.push('Proposal approved and ready for implementation');
|
|
1075
|
+
steps.push('Assignees will be notified to begin work');
|
|
1076
|
+
if (review.conditions) {
|
|
1077
|
+
steps.push(`Ensure conditions are met: ${review.conditions}`);
|
|
1078
|
+
}
|
|
1079
|
+
break;
|
|
1080
|
+
|
|
1081
|
+
case 'reject':
|
|
1082
|
+
steps.push('Proposal has been rejected');
|
|
1083
|
+
steps.push('Creator should address feedback before resubmission');
|
|
1084
|
+
break;
|
|
1085
|
+
|
|
1086
|
+
case 'request-changes':
|
|
1087
|
+
steps.push('Changes have been requested');
|
|
1088
|
+
steps.push('Proposal creator should address feedback');
|
|
1089
|
+
steps.push('Resubmit for review after making changes');
|
|
1090
|
+
break;
|
|
1091
|
+
|
|
1092
|
+
case 'comment':
|
|
1093
|
+
steps.push('Comment added to proposal');
|
|
1094
|
+
steps.push('No status change - review still pending');
|
|
1095
|
+
break;
|
|
1096
|
+
}
|
|
1097
|
+
|
|
1098
|
+
return steps;
|
|
1099
|
+
}
|
|
1100
|
+
}
|
|
1101
|
+
|
|
1102
|
+
module.exports = ReviewProposalTask;
|
|
1103
|
+
```
|
|
1104
|
+
|
|
1105
|
+
## Validation Rules
|
|
1106
|
+
|
|
1107
|
+
### Review Validation
|
|
1108
|
+
- Proposal must exist and be accessible
|
|
1109
|
+
- Review action must be valid
|
|
1110
|
+
- Reviewer must have appropriate permissions
|
|
1111
|
+
- Cannot review own proposals (in production)
|
|
1112
|
+
- Cannot approve high-risk changes without conditions
|
|
1113
|
+
|
|
1114
|
+
### Status Transitions
|
|
1115
|
+
- Draft → Pending Review (on submission)
|
|
1116
|
+
- Pending Review → Approved/Rejected/Changes Requested
|
|
1117
|
+
- Changes Requested → Pending Review (on update)
|
|
1118
|
+
- Approved → In Progress (on implementation start)
|
|
1119
|
+
- In Progress → Completed (on implementation finish)
|
|
1120
|
+
|
|
1121
|
+
### Review Requirements
|
|
1122
|
+
- All reviews must include comments
|
|
1123
|
+
- Approvals may include conditions
|
|
1124
|
+
- Rejections must include reasons
|
|
1125
|
+
- Change requests should include specific feedback
|
|
1126
|
+
|
|
1127
|
+
## Integration Points
|
|
1128
|
+
|
|
1129
|
+
### Proposal System
|
|
1130
|
+
- Loads and updates proposal data
|
|
1131
|
+
- Manages proposal lifecycle
|
|
1132
|
+
- Tracks review history
|
|
1133
|
+
- Handles status transitions
|
|
1134
|
+
|
|
1135
|
+
### Impact Analysis
|
|
1136
|
+
- Provides risk assessment for review
|
|
1137
|
+
- Identifies affected components
|
|
1138
|
+
- Helps inform review decisions
|
|
1139
|
+
- Highlights critical issues
|
|
1140
|
+
|
|
1141
|
+
### Notification Service
|
|
1142
|
+
- Notifies proposal creator of review
|
|
1143
|
+
- Alerts assignees of changes requested
|
|
1144
|
+
- Sends approval confirmations
|
|
1145
|
+
- Tracks notification delivery
|
|
1146
|
+
|
|
1147
|
+
### Diff Generator
|
|
1148
|
+
- Shows proposed changes clearly
|
|
1149
|
+
- Highlights modifications
|
|
1150
|
+
- Assists in code review
|
|
1151
|
+
- Supports multiple diff formats
|
|
1152
|
+
|
|
1153
|
+
## Security Considerations
|
|
1154
|
+
- Validate reviewer permissions
|
|
1155
|
+
- Audit all review actions
|
|
1156
|
+
- Prevent unauthorized status changes
|
|
1157
|
+
- Protect sensitive proposal information
|
|
1158
|
+
- Log all review activities for compliance
|