aios-core 2.1.6 ā 2.2.1
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 +704 -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 -11
- 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/tools/diagnose-installation.js +266 -0
- package/tools/diagnose-npx-issue.ps1 +96 -0
- package/tools/quick-diagnose.cmd +85 -0
- package/tools/quick-diagnose.ps1 +117 -0
- 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,871 +1,871 @@
|
|
|
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: devSuggestRefactoring()
|
|
30
|
-
responsƔvel: Dex (Builder)
|
|
31
|
-
responsavel_type: Agente
|
|
32
|
-
atomic_layer: Strategy
|
|
33
|
-
|
|
34
|
-
**Entrada:**
|
|
35
|
-
- campo: task
|
|
36
|
-
tipo: string
|
|
37
|
-
origem: User Input
|
|
38
|
-
obrigatório: true
|
|
39
|
-
validação: Must be registered task
|
|
40
|
-
|
|
41
|
-
- campo: parameters
|
|
42
|
-
tipo: object
|
|
43
|
-
origem: User Input
|
|
44
|
-
obrigatório: false
|
|
45
|
-
validação: Valid task parameters
|
|
46
|
-
|
|
47
|
-
- campo: mode
|
|
48
|
-
tipo: string
|
|
49
|
-
origem: User Input
|
|
50
|
-
obrigatório: false
|
|
51
|
-
validação: yolo|interactive|pre-flight
|
|
52
|
-
|
|
53
|
-
**SaĆda:**
|
|
54
|
-
- campo: execution_result
|
|
55
|
-
tipo: object
|
|
56
|
-
destino: Memory
|
|
57
|
-
persistido: false
|
|
58
|
-
|
|
59
|
-
- campo: logs
|
|
60
|
-
tipo: array
|
|
61
|
-
destino: File (.ai/logs/*)
|
|
62
|
-
persistido: true
|
|
63
|
-
|
|
64
|
-
- campo: state
|
|
65
|
-
tipo: object
|
|
66
|
-
destino: State management
|
|
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
|
-
- [ ] Task is registered; required parameters provided; dependencies met
|
|
81
|
-
tipo: pre-condition
|
|
82
|
-
blocker: true
|
|
83
|
-
validação: |
|
|
84
|
-
Check task is registered; required parameters provided; dependencies met
|
|
85
|
-
error_message: "Pre-condition failed: Task is registered; required parameters provided; dependencies met"
|
|
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
|
-
- [ ] Task completed; exit code 0; expected outputs created
|
|
99
|
-
tipo: post-condition
|
|
100
|
-
blocker: true
|
|
101
|
-
validação: |
|
|
102
|
-
Verify task completed; exit code 0; expected outputs created
|
|
103
|
-
error_message: "Post-condition failed: Task completed; exit code 0; expected outputs created"
|
|
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
|
-
- [ ] Task completed as expected; side effects documented
|
|
117
|
-
tipo: acceptance-criterion
|
|
118
|
-
blocker: true
|
|
119
|
-
validação: |
|
|
120
|
-
Assert task completed as expected; side effects documented
|
|
121
|
-
error_message: "Acceptance criterion not met: Task completed as expected; side effects documented"
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
---
|
|
125
|
-
|
|
126
|
-
## Tools
|
|
127
|
-
|
|
128
|
-
**External/shared resources used by this task:**
|
|
129
|
-
|
|
130
|
-
- **Tool:** task-runner
|
|
131
|
-
- **Purpose:** Task execution and orchestration
|
|
132
|
-
- **Source:** .aios-core/core/task-runner.js
|
|
133
|
-
|
|
134
|
-
- **Tool:** logger
|
|
135
|
-
- **Purpose:** Execution logging and error tracking
|
|
136
|
-
- **Source:** .aios-core/utils/logger.js
|
|
137
|
-
|
|
138
|
-
---
|
|
139
|
-
|
|
140
|
-
## Scripts
|
|
141
|
-
|
|
142
|
-
**Agent-specific code for this task:**
|
|
143
|
-
|
|
144
|
-
- **Script:** execute-task.js
|
|
145
|
-
- **Purpose:** Generic task execution wrapper
|
|
146
|
-
- **Language:** JavaScript
|
|
147
|
-
- **Location:** .aios-core/scripts/execute-task.js
|
|
148
|
-
|
|
149
|
-
---
|
|
150
|
-
|
|
151
|
-
## Error Handling
|
|
152
|
-
|
|
153
|
-
**Strategy:** retry
|
|
154
|
-
|
|
155
|
-
**Common Errors:**
|
|
156
|
-
|
|
157
|
-
1. **Error:** Task Not Found
|
|
158
|
-
- **Cause:** Specified task not registered in system
|
|
159
|
-
- **Resolution:** Verify task name and registration
|
|
160
|
-
- **Recovery:** List available tasks, suggest similar
|
|
161
|
-
|
|
162
|
-
2. **Error:** Invalid Parameters
|
|
163
|
-
- **Cause:** Task parameters do not match expected schema
|
|
164
|
-
- **Resolution:** Validate parameters against task definition
|
|
165
|
-
- **Recovery:** Provide parameter template, reject execution
|
|
166
|
-
|
|
167
|
-
3. **Error:** Execution Timeout
|
|
168
|
-
- **Cause:** Task exceeds maximum execution time
|
|
169
|
-
- **Resolution:** Optimize task or increase timeout
|
|
170
|
-
- **Recovery:** Kill task, cleanup resources, log state
|
|
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
|
-
- development
|
|
198
|
-
- code
|
|
199
|
-
updated_at: 2025-11-17
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
---
|
|
203
|
-
|
|
204
|
-
checklists:
|
|
205
|
-
- dev-master-checklist.md
|
|
206
|
-
---
|
|
207
|
-
|
|
208
|
-
# Suggest Refactoring - AIOS Developer Task
|
|
209
|
-
|
|
210
|
-
## Purpose
|
|
211
|
-
Analyze code and suggest automated refactoring opportunities to improve code quality, maintainability, and performance.
|
|
212
|
-
|
|
213
|
-
## Command Pattern
|
|
214
|
-
```
|
|
215
|
-
*suggest-refactoring <path> [options]
|
|
216
|
-
```
|
|
217
|
-
|
|
218
|
-
## Parameters
|
|
219
|
-
- `path`: File or directory path to analyze
|
|
220
|
-
- `options`: Refactoring analysis configuration
|
|
221
|
-
|
|
222
|
-
### Options
|
|
223
|
-
- `--patterns <types>`: Comma-separated refactoring patterns to check
|
|
224
|
-
- `--threshold <level>`: Minimum impact threshold (1-10, default: 3)
|
|
225
|
-
- `--limit <count>`: Maximum suggestions per file (default: 10)
|
|
226
|
-
- `--apply <id>`: Apply specific suggestion by ID
|
|
227
|
-
- `--apply-all`: Apply all suggestions with confirmation
|
|
228
|
-
- `--export <file>`: Export suggestions to file
|
|
229
|
-
- `--recursive`: Analyze directories recursively
|
|
230
|
-
- `--exclude <patterns>`: Exclude file patterns (e.g., "*.test.js")
|
|
231
|
-
- `--dry-run`: Show what would be changed without applying
|
|
232
|
-
|
|
233
|
-
## Refactoring Patterns
|
|
234
|
-
- `extract_method`: Extract long methods into smaller ones
|
|
235
|
-
- `extract_variable`: Extract complex expressions
|
|
236
|
-
- `introduce_parameter_object`: Group related parameters
|
|
237
|
-
- `replace_conditional`: Replace conditionals with polymorphism
|
|
238
|
-
- `inline_temp`: Inline single-use variables
|
|
239
|
-
- `remove_dead_code`: Remove unreachable code
|
|
240
|
-
- `consolidate_duplicates`: Extract duplicate code
|
|
241
|
-
- `simplify_conditionals`: Flatten nested conditionals
|
|
242
|
-
- `replace_magic_numbers`: Extract constants
|
|
243
|
-
- `decompose_class`: Split large classes
|
|
244
|
-
|
|
245
|
-
## Examples
|
|
246
|
-
```bash
|
|
247
|
-
# Analyze single file
|
|
248
|
-
*suggest-refactoring aios-core/scripts/complex-utility.js
|
|
249
|
-
|
|
250
|
-
# Analyze directory with specific patterns
|
|
251
|
-
*suggest-refactoring aios-core/agents --patterns extract_method,decompose_class --recursive
|
|
252
|
-
|
|
253
|
-
# Apply high-impact suggestions
|
|
254
|
-
*suggest-refactoring aios-core/utils --threshold 7 --apply-all
|
|
255
|
-
|
|
256
|
-
# Export suggestions for review
|
|
257
|
-
*suggest-refactoring . --recursive --export refactoring-report.json
|
|
258
|
-
|
|
259
|
-
# Dry run to see changes
|
|
260
|
-
*suggest-refactoring aios-core/agents/developer.md --apply ref-001 --dry-run
|
|
261
|
-
```
|
|
262
|
-
|
|
263
|
-
## Implementation
|
|
264
|
-
|
|
265
|
-
```javascript
|
|
266
|
-
const fs = require('fs').promises;
|
|
267
|
-
const path = require('path');
|
|
268
|
-
const chalk = require('chalk');
|
|
269
|
-
const inquirer = require('inquirer');
|
|
270
|
-
const glob = require('glob').promises;
|
|
271
|
-
|
|
272
|
-
class SuggestRefactoringTask {
|
|
273
|
-
constructor() {
|
|
274
|
-
this.taskName = 'suggest-refactoring';
|
|
275
|
-
this.description = 'Suggest automated refactoring opportunities';
|
|
276
|
-
this.rootPath = process.cwd();
|
|
277
|
-
this.refactoringSuggester = null;
|
|
278
|
-
this.suggestions = [];
|
|
279
|
-
this.appliedRefactorings = [];
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
async execute(params) {
|
|
283
|
-
try {
|
|
284
|
-
console.log(chalk.blue('š§ AIOS Refactoring Analysis'));
|
|
285
|
-
console.log(chalk.gray('Analyzing code for refactoring opportunities\n'));
|
|
286
|
-
|
|
287
|
-
// Parse parameters
|
|
288
|
-
const config = await this.parseParameters(params);
|
|
289
|
-
|
|
290
|
-
// Initialize dependencies
|
|
291
|
-
await this.initializeDependencies();
|
|
292
|
-
|
|
293
|
-
// Get files to analyze
|
|
294
|
-
const files = await this.getFilesToAnalyze(config);
|
|
295
|
-
|
|
296
|
-
if (files.length === 0) {
|
|
297
|
-
console.log(chalk.yellow('No files found to analyze'));
|
|
298
|
-
return { success: true, suggestions: [] };
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
console.log(chalk.gray(`Found ${files.length} files to analyze\n`));
|
|
302
|
-
|
|
303
|
-
// Execute based on mode
|
|
304
|
-
if (config.apply) {
|
|
305
|
-
// Apply specific suggestion
|
|
306
|
-
await this.applySuggestion(config.apply, config);
|
|
307
|
-
} else if (config.applyAll) {
|
|
308
|
-
// Analyze and apply all suggestions
|
|
309
|
-
await this.analyzeFiles(files, config);
|
|
310
|
-
await this.applyAllSuggestions(config);
|
|
311
|
-
} else {
|
|
312
|
-
// Just analyze and show suggestions
|
|
313
|
-
await this.analyzeFiles(files, config);
|
|
314
|
-
await this.displaySuggestions(config);
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
// Export if requested
|
|
318
|
-
if (config.export) {
|
|
319
|
-
await this.exportSuggestions(config.export);
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
return {
|
|
323
|
-
success: true,
|
|
324
|
-
filesAnalyzed: files.length,
|
|
325
|
-
totalSuggestions: this.suggestions.length,
|
|
326
|
-
appliedRefactorings: this.appliedRefactorings.length
|
|
327
|
-
};
|
|
328
|
-
|
|
329
|
-
} catch (error) {
|
|
330
|
-
console.error(chalk.red(`\nā Refactoring analysis failed: ${error.message}`));
|
|
331
|
-
throw error;
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
async parseParameters(params) {
|
|
336
|
-
if (params.length < 1) {
|
|
337
|
-
throw new Error('Usage: *suggest-refactoring <path> [options]');
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
const config = {
|
|
341
|
-
targetPath: params[0],
|
|
342
|
-
patterns: null,
|
|
343
|
-
threshold: 3,
|
|
344
|
-
limit: 10,
|
|
345
|
-
apply: null,
|
|
346
|
-
applyAll: false,
|
|
347
|
-
export: null,
|
|
348
|
-
recursive: false,
|
|
349
|
-
exclude: [],
|
|
350
|
-
dryRun: false
|
|
351
|
-
};
|
|
352
|
-
|
|
353
|
-
// Parse options
|
|
354
|
-
for (let i = 1; i < params.length; i++) {
|
|
355
|
-
const param = params[i];
|
|
356
|
-
|
|
357
|
-
if (param === '--recursive') {
|
|
358
|
-
config.recursive = true;
|
|
359
|
-
} else if (param === '--apply-all') {
|
|
360
|
-
config.applyAll = true;
|
|
361
|
-
} else if (param === '--dry-run') {
|
|
362
|
-
config.dryRun = true;
|
|
363
|
-
} else if (param.startsWith('--patterns') && params[i + 1]) {
|
|
364
|
-
config.patterns = params[++i].split(',').map(p => p.trim());
|
|
365
|
-
} else if (param.startsWith('--threshold') && params[i + 1]) {
|
|
366
|
-
config.threshold = parseInt(params[++i]);
|
|
367
|
-
} else if (param.startsWith('--limit') && params[i + 1]) {
|
|
368
|
-
config.limit = parseInt(params[++i]);
|
|
369
|
-
} else if (param.startsWith('--apply') && params[i + 1]) {
|
|
370
|
-
config.apply = params[++i];
|
|
371
|
-
} else if (param.startsWith('--export') && params[i + 1]) {
|
|
372
|
-
config.export = params[++i];
|
|
373
|
-
} else if (param.startsWith('--exclude') && params[i + 1]) {
|
|
374
|
-
config.exclude = params[++i].split(',').map(e => e.trim());
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
// Validate threshold
|
|
379
|
-
if (config.threshold < 1 || config.threshold > 10) {
|
|
380
|
-
throw new Error('Threshold must be between 1 and 10');
|
|
381
|
-
}
|
|
382
|
-
|
|
383
|
-
return config;
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
async initializeDependencies() {
|
|
387
|
-
try {
|
|
388
|
-
const RefactoringSuggester = require('../scripts/refactoring-suggester');
|
|
389
|
-
this.refactoringSuggester = new RefactoringSuggester({ rootPath: this.rootPath });
|
|
390
|
-
|
|
391
|
-
} catch (error) {
|
|
392
|
-
throw new Error(`Failed to initialize dependencies: ${error.message}`);
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
async getFilesToAnalyze(config) {
|
|
397
|
-
const targetPath = path.resolve(this.rootPath, config.targetPath);
|
|
398
|
-
const files = [];
|
|
399
|
-
|
|
400
|
-
try {
|
|
401
|
-
const stats = await fs.stat(targetPath);
|
|
402
|
-
|
|
403
|
-
if (stats.isFile()) {
|
|
404
|
-
// Single file
|
|
405
|
-
if (this.shouldAnalyzeFile(targetPath, config)) {
|
|
406
|
-
files.push(targetPath);
|
|
407
|
-
}
|
|
408
|
-
} else if (stats.isDirectory()) {
|
|
409
|
-
// Directory
|
|
410
|
-
const pattern = config.recursive ? '**/*.{js,jsx,ts,tsx}' : '*.{js,jsx,ts,tsx}';
|
|
411
|
-
const globPattern = path.join(targetPath, pattern);
|
|
412
|
-
|
|
413
|
-
const matches = await glob(globPattern, {
|
|
414
|
-
ignore: config.exclude.map(e => path.join(targetPath, '**', e)),
|
|
415
|
-
nodir: true
|
|
416
|
-
});
|
|
417
|
-
|
|
418
|
-
for (const match of matches) {
|
|
419
|
-
if (this.shouldAnalyzeFile(match, config)) {
|
|
420
|
-
files.push(match);
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
} catch (error) {
|
|
425
|
-
console.warn(chalk.yellow(`Cannot access ${targetPath}: ${error.message}`));
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
return files;
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
shouldAnalyzeFile(filePath, config) {
|
|
432
|
-
// Skip test files unless explicitly included
|
|
433
|
-
if (filePath.includes('.test.') || filePath.includes('.spec.')) {
|
|
434
|
-
return false;
|
|
435
|
-
}
|
|
436
|
-
|
|
437
|
-
// Skip minified files
|
|
438
|
-
if (filePath.includes('.min.')) {
|
|
439
|
-
return false;
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
// Skip node_modules
|
|
443
|
-
if (filePath.includes('node_modules')) {
|
|
444
|
-
return false;
|
|
445
|
-
}
|
|
446
|
-
|
|
447
|
-
// Check file extension
|
|
448
|
-
const ext = path.extname(filePath);
|
|
449
|
-
return ['.js', '.jsx', '.ts', '.tsx'].includes(ext);
|
|
450
|
-
}
|
|
451
|
-
|
|
452
|
-
async analyzeFiles(files, config) {
|
|
453
|
-
console.log(chalk.blue('š Analyzing files...'));
|
|
454
|
-
|
|
455
|
-
const progressInterval = Math.max(1, Math.floor(files.length / 20));
|
|
456
|
-
|
|
457
|
-
for (let i = 0; i < files.length; i++) {
|
|
458
|
-
const file = files[i];
|
|
459
|
-
|
|
460
|
-
try {
|
|
461
|
-
const result = await this.refactoringSuggester.analyzeCode(file, {
|
|
462
|
-
patterns: config.patterns
|
|
463
|
-
});
|
|
464
|
-
|
|
465
|
-
if (result.suggestions && result.suggestions.length > 0) {
|
|
466
|
-
// Filter by threshold and limit
|
|
467
|
-
const filteredSuggestions = result.suggestions
|
|
468
|
-
.filter(s => s.impact >= config.threshold)
|
|
469
|
-
.slice(0, config.limit);
|
|
470
|
-
|
|
471
|
-
// Add to global suggestions with unique IDs
|
|
472
|
-
for (const suggestion of filteredSuggestions) {
|
|
473
|
-
suggestion.id = `ref-${this.suggestions.length + 1}`;
|
|
474
|
-
suggestion.file = path.relative(this.rootPath, file);
|
|
475
|
-
this.suggestions.push(suggestion);
|
|
476
|
-
}
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
// Show progress
|
|
480
|
-
if (i % progressInterval === 0) {
|
|
481
|
-
const progress = Math.floor((i / files.length) * 100);
|
|
482
|
-
process.stdout.write(`\rProgress: ${progress}%`);
|
|
483
|
-
}
|
|
484
|
-
|
|
485
|
-
} catch (error) {
|
|
486
|
-
console.warn(chalk.yellow(`\nFailed to analyze ${file}: ${error.message}`));
|
|
487
|
-
}
|
|
488
|
-
}
|
|
489
|
-
|
|
490
|
-
console.log('\rProgress: 100%\n');
|
|
491
|
-
}
|
|
492
|
-
|
|
493
|
-
async displaySuggestions(config) {
|
|
494
|
-
if (this.suggestions.length === 0) {
|
|
495
|
-
console.log(chalk.yellow('No refactoring suggestions found above threshold'));
|
|
496
|
-
return;
|
|
497
|
-
}
|
|
498
|
-
|
|
499
|
-
console.log(chalk.blue(`\nš Found ${this.suggestions.length} refactoring suggestions:\n`));
|
|
500
|
-
|
|
501
|
-
// Group by file
|
|
502
|
-
const byFile = {};
|
|
503
|
-
for (const suggestion of this.suggestions) {
|
|
504
|
-
if (!byFile[suggestion.file]) {
|
|
505
|
-
byFile[suggestion.file] = [];
|
|
506
|
-
}
|
|
507
|
-
byFile[suggestion.file].push(suggestion);
|
|
508
|
-
}
|
|
509
|
-
|
|
510
|
-
// Display suggestions
|
|
511
|
-
for (const [file, suggestions] of Object.entries(byFile)) {
|
|
512
|
-
console.log(chalk.blue(`\nš ${file}`));
|
|
513
|
-
console.log(chalk.gray('ā'.repeat(50)));
|
|
514
|
-
|
|
515
|
-
for (const suggestion of suggestions) {
|
|
516
|
-
this.displaySuggestion(suggestion);
|
|
517
|
-
}
|
|
518
|
-
}
|
|
519
|
-
|
|
520
|
-
// Show statistics
|
|
521
|
-
this.displayStatistics();
|
|
522
|
-
|
|
523
|
-
// Show next steps
|
|
524
|
-
console.log(chalk.blue('\nš Next Steps:'));
|
|
525
|
-
console.log('1. Review suggestions carefully');
|
|
526
|
-
console.log(`2. Apply specific suggestion: *suggest-refactoring ${config.targetPath} --apply <id>`);
|
|
527
|
-
console.log(`3. Apply all suggestions: *suggest-refactoring ${config.targetPath} --apply-all`);
|
|
528
|
-
console.log(`4. Export for team review: *suggest-refactoring ${config.targetPath} --export report.json`);
|
|
529
|
-
}
|
|
530
|
-
|
|
531
|
-
displaySuggestion(suggestion) {
|
|
532
|
-
const priorityColors = {
|
|
533
|
-
high: chalk.red,
|
|
534
|
-
medium: chalk.yellow,
|
|
535
|
-
low: chalk.gray
|
|
536
|
-
};
|
|
537
|
-
|
|
538
|
-
const priorityColor = priorityColors[suggestion.priority] || chalk.gray;
|
|
539
|
-
|
|
540
|
-
console.log(`\n${chalk.gray(suggestion.id)} ${priorityColor(`[${suggestion.priority.toUpperCase()}]`)} ${suggestion.description}`);
|
|
541
|
-
console.log(` ${chalk.gray('Location:')} Lines ${suggestion.location.start}-${suggestion.location.end}`);
|
|
542
|
-
console.log(` ${chalk.gray('Impact:')} ${this.formatImpact(suggestion.impact)}`);
|
|
543
|
-
console.log(` ${chalk.gray('Type:')} ${suggestion.pattern}`);
|
|
544
|
-
console.log(` ${chalk.gray('Details:')} ${suggestion.details}`);
|
|
545
|
-
|
|
546
|
-
if (suggestion.suggestedRefactoring && suggestion.suggestedRefactoring.action) {
|
|
547
|
-
console.log(` ${chalk.gray('Action:')} ${suggestion.suggestedRefactoring.action}`);
|
|
548
|
-
}
|
|
549
|
-
}
|
|
550
|
-
|
|
551
|
-
formatImpact(impact) {
|
|
552
|
-
const bar = 'ā'.repeat(impact) + 'ā'.repeat(10 - impact);
|
|
553
|
-
|
|
554
|
-
if (impact >= 8) {
|
|
555
|
-
return chalk.red(bar) + ` (${impact}/10)`;
|
|
556
|
-
} else if (impact >= 5) {
|
|
557
|
-
return chalk.yellow(bar) + ` (${impact}/10)`;
|
|
558
|
-
} else {
|
|
559
|
-
return chalk.gray(bar) + ` (${impact}/10)`;
|
|
560
|
-
}
|
|
561
|
-
}
|
|
562
|
-
|
|
563
|
-
async applySuggestion(suggestionId, config) {
|
|
564
|
-
const suggestion = this.suggestions.find(s => s.id === suggestionId);
|
|
565
|
-
|
|
566
|
-
if (!suggestion) {
|
|
567
|
-
// Try to load from previous analysis
|
|
568
|
-
const loaded = await this.loadSuggestion(suggestionId);
|
|
569
|
-
if (!loaded) {
|
|
570
|
-
throw new Error(`Suggestion not found: ${suggestionId}`);
|
|
571
|
-
}
|
|
572
|
-
suggestion = loaded;
|
|
573
|
-
}
|
|
574
|
-
|
|
575
|
-
console.log(chalk.blue('\nš§ Applying Refactoring'));
|
|
576
|
-
console.log(chalk.gray('ā'.repeat(50)));
|
|
577
|
-
this.displaySuggestion(suggestion);
|
|
578
|
-
|
|
579
|
-
if (config.dryRun) {
|
|
580
|
-
console.log(chalk.yellow('\nā ļø DRY RUN - No changes will be made'));
|
|
581
|
-
await this.showRefactoringPreview(suggestion);
|
|
582
|
-
return;
|
|
583
|
-
}
|
|
584
|
-
|
|
585
|
-
// Confirm application
|
|
586
|
-
const { confirm } = await inquirer.prompt([{
|
|
587
|
-
type: 'confirm',
|
|
588
|
-
name: 'confirm',
|
|
589
|
-
message: 'Apply this refactoring?',
|
|
590
|
-
default: true
|
|
591
|
-
}]);
|
|
592
|
-
|
|
593
|
-
if (!confirm) {
|
|
594
|
-
console.log(chalk.gray('Refactoring cancelled'));
|
|
595
|
-
return;
|
|
596
|
-
}
|
|
597
|
-
|
|
598
|
-
// Apply the refactoring
|
|
599
|
-
try {
|
|
600
|
-
const result = await this.refactoringSuggester.applySuggestion(suggestion);
|
|
601
|
-
|
|
602
|
-
if (result.success) {
|
|
603
|
-
console.log(chalk.green('ā
Refactoring applied successfully'));
|
|
604
|
-
this.appliedRefactorings.push({
|
|
605
|
-
suggestion,
|
|
606
|
-
result,
|
|
607
|
-
timestamp: new Date().toISOString()
|
|
608
|
-
});
|
|
609
|
-
|
|
610
|
-
// Show changes
|
|
611
|
-
for (const change of result.changes) {
|
|
612
|
-
console.log(chalk.gray(` - ${change.description}`));
|
|
613
|
-
}
|
|
614
|
-
} else {
|
|
615
|
-
console.error(chalk.red(`Failed to apply refactoring: ${result.error}`));
|
|
616
|
-
}
|
|
617
|
-
} catch (error) {
|
|
618
|
-
console.error(chalk.red(`Error applying refactoring: ${error.message}`));
|
|
619
|
-
}
|
|
620
|
-
}
|
|
621
|
-
|
|
622
|
-
async applyAllSuggestions(config) {
|
|
623
|
-
if (this.suggestions.length === 0) {
|
|
624
|
-
console.log(chalk.yellow('No suggestions to apply'));
|
|
625
|
-
return;
|
|
626
|
-
}
|
|
627
|
-
|
|
628
|
-
console.log(chalk.blue(`\nš§ Applying ${this.suggestions.length} refactorings`));
|
|
629
|
-
|
|
630
|
-
// Group by type for better user experience
|
|
631
|
-
const byType = {};
|
|
632
|
-
for (const suggestion of this.suggestions) {
|
|
633
|
-
if (!byType[suggestion.type]) {
|
|
634
|
-
byType[suggestion.type] = [];
|
|
635
|
-
}
|
|
636
|
-
byType[suggestion.type].push(suggestion);
|
|
637
|
-
}
|
|
638
|
-
|
|
639
|
-
// Show summary
|
|
640
|
-
console.log(chalk.gray('\nRefactorings by type:'));
|
|
641
|
-
for (const [type, suggestions] of Object.entries(byType)) {
|
|
642
|
-
console.log(` ${type}: ${suggestions.length}`);
|
|
643
|
-
}
|
|
644
|
-
|
|
645
|
-
if (config.dryRun) {
|
|
646
|
-
console.log(chalk.yellow('\nā ļø DRY RUN - No changes will be made'));
|
|
647
|
-
return;
|
|
648
|
-
}
|
|
649
|
-
|
|
650
|
-
// Confirm batch application
|
|
651
|
-
const { confirmAll } = await inquirer.prompt([{
|
|
652
|
-
type: 'confirm',
|
|
653
|
-
name: 'confirmAll',
|
|
654
|
-
message: `Apply all ${this.suggestions.length} refactorings?`,
|
|
655
|
-
default: false
|
|
656
|
-
}]);
|
|
657
|
-
|
|
658
|
-
if (!confirmAll) {
|
|
659
|
-
// Ask for individual confirmation
|
|
660
|
-
await this.applySelectiveSuggestions(config);
|
|
661
|
-
return;
|
|
662
|
-
}
|
|
663
|
-
|
|
664
|
-
// Apply all suggestions
|
|
665
|
-
let applied = 0;
|
|
666
|
-
let failed = 0;
|
|
667
|
-
|
|
668
|
-
for (const suggestion of this.suggestions) {
|
|
669
|
-
try {
|
|
670
|
-
console.log(chalk.gray(`\nApplying ${suggestion.id}: ${suggestion.description}`));
|
|
671
|
-
|
|
672
|
-
const result = await this.refactoringSuggester.applySuggestion(suggestion);
|
|
673
|
-
|
|
674
|
-
if (result.success) {
|
|
675
|
-
applied++;
|
|
676
|
-
this.appliedRefactorings.push({
|
|
677
|
-
suggestion,
|
|
678
|
-
result,
|
|
679
|
-
timestamp: new Date().toISOString()
|
|
680
|
-
});
|
|
681
|
-
} else {
|
|
682
|
-
failed++;
|
|
683
|
-
console.error(chalk.red(` Failed: ${result.error}`));
|
|
684
|
-
}
|
|
685
|
-
} catch (error) {
|
|
686
|
-
failed++;
|
|
687
|
-
console.error(chalk.red(` Error: ${error.message}`));
|
|
688
|
-
}
|
|
689
|
-
}
|
|
690
|
-
|
|
691
|
-
console.log(chalk.blue('\nš Application Summary:'));
|
|
692
|
-
console.log(chalk.green(` ā
Applied: ${applied}`));
|
|
693
|
-
if (failed > 0) {
|
|
694
|
-
console.log(chalk.red(` ā Failed: ${failed}`));
|
|
695
|
-
}
|
|
696
|
-
}
|
|
697
|
-
|
|
698
|
-
async applySelectiveSuggestions(config) {
|
|
699
|
-
const choices = this.suggestions.map(s => ({
|
|
700
|
-
name: `${s.id} - ${s.description} (${s.file})`,
|
|
701
|
-
value: s.id,
|
|
702
|
-
checked: s.impact >= 7 // Pre-check high impact
|
|
703
|
-
}));
|
|
704
|
-
|
|
705
|
-
const { selected } = await inquirer.prompt([{
|
|
706
|
-
type: 'checkbox',
|
|
707
|
-
name: 'selected',
|
|
708
|
-
message: 'Select refactorings to apply:',
|
|
709
|
-
choices,
|
|
710
|
-
pageSize: 15
|
|
711
|
-
}]);
|
|
712
|
-
|
|
713
|
-
if (selected.length === 0) {
|
|
714
|
-
console.log(chalk.gray('No refactorings selected'));
|
|
715
|
-
return;
|
|
716
|
-
}
|
|
717
|
-
|
|
718
|
-
// Apply selected suggestions
|
|
719
|
-
for (const id of selected) {
|
|
720
|
-
const suggestion = this.suggestions.find(s => s.id === id);
|
|
721
|
-
await this.applySuggestion(id, config);
|
|
722
|
-
}
|
|
723
|
-
}
|
|
724
|
-
|
|
725
|
-
async showRefactoringPreview(suggestion) {
|
|
726
|
-
console.log(chalk.blue('\nš Refactoring Preview:'));
|
|
727
|
-
|
|
728
|
-
// This would show actual code changes
|
|
729
|
-
// For now, show the refactoring plan
|
|
730
|
-
if (suggestion.suggestedRefactoring) {
|
|
731
|
-
console.log(chalk.gray(JSON.stringify(suggestion.suggestedRefactoring, null, 2)));
|
|
732
|
-
}
|
|
733
|
-
}
|
|
734
|
-
|
|
735
|
-
async loadSuggestion(suggestionId) {
|
|
736
|
-
// Try to load from cache or previous export
|
|
737
|
-
const cacheFile = path.join(this.rootPath, '.aios', 'refactoring', `${suggestionId}.json`);
|
|
738
|
-
|
|
739
|
-
try {
|
|
740
|
-
const content = await fs.readFile(cacheFile, 'utf-8');
|
|
741
|
-
return JSON.parse(content);
|
|
742
|
-
} catch (error) {
|
|
743
|
-
return null;
|
|
744
|
-
}
|
|
745
|
-
}
|
|
746
|
-
|
|
747
|
-
async exportSuggestions(exportPath) {
|
|
748
|
-
console.log(chalk.blue('\nš¤ Exporting suggestions...'));
|
|
749
|
-
|
|
750
|
-
const exportData = {
|
|
751
|
-
version: 1,
|
|
752
|
-
exportDate: new Date().toISOString(),
|
|
753
|
-
analysisPath: this.rootPath,
|
|
754
|
-
totalSuggestions: this.suggestions.length,
|
|
755
|
-
statistics: this.refactoringSuggester.getStatistics(),
|
|
756
|
-
suggestions: this.suggestions.map(s => ({
|
|
757
|
-
...s,
|
|
758
|
-
file: s.file || s.filePath
|
|
759
|
-
}))
|
|
760
|
-
};
|
|
761
|
-
|
|
762
|
-
await fs.writeFile(exportPath, JSON.stringify(exportData, null, 2));
|
|
763
|
-
console.log(chalk.green(`ā
Exported ${this.suggestions.length} suggestions to: ${exportPath}`));
|
|
764
|
-
}
|
|
765
|
-
|
|
766
|
-
displayStatistics() {
|
|
767
|
-
const stats = this.refactoringSuggester.getStatistics();
|
|
768
|
-
|
|
769
|
-
console.log(chalk.blue('\nš Refactoring Statistics:'));
|
|
770
|
-
console.log(chalk.gray('ā'.repeat(50)));
|
|
771
|
-
|
|
772
|
-
console.log(`Total suggestions: ${stats.totalSuggestions}`);
|
|
773
|
-
console.log(`Average impact: ${stats.averageImpact}/10`);
|
|
774
|
-
|
|
775
|
-
console.log('\nBy priority:');
|
|
776
|
-
for (const [priority, count] of Object.entries(stats.byPriority)) {
|
|
777
|
-
console.log(` ${priority}: ${count}`);
|
|
778
|
-
}
|
|
779
|
-
|
|
780
|
-
console.log('\nBy type:');
|
|
781
|
-
const sortedTypes = Object.entries(stats.byType)
|
|
782
|
-
.sort(([,a], [,b]) => b - a)
|
|
783
|
-
.slice(0, 5);
|
|
784
|
-
|
|
785
|
-
for (const [type, count] of sortedTypes) {
|
|
786
|
-
console.log(` ${type}: ${count}`);
|
|
787
|
-
}
|
|
788
|
-
}
|
|
789
|
-
}
|
|
790
|
-
|
|
791
|
-
module.exports = SuggestRefactoringTask;
|
|
792
|
-
```
|
|
793
|
-
|
|
794
|
-
## Integration Points
|
|
795
|
-
|
|
796
|
-
### Refactoring Suggester
|
|
797
|
-
- Core analysis engine
|
|
798
|
-
- Pattern detection
|
|
799
|
-
- Suggestion generation
|
|
800
|
-
- Refactoring application
|
|
801
|
-
|
|
802
|
-
### AST Processing
|
|
803
|
-
- Code parsing
|
|
804
|
-
- Pattern matching
|
|
805
|
-
- Code transformation
|
|
806
|
-
- Generation
|
|
807
|
-
|
|
808
|
-
### Pattern Library
|
|
809
|
-
- Refactoring patterns
|
|
810
|
-
- Detection algorithms
|
|
811
|
-
- Application strategies
|
|
812
|
-
- Success metrics
|
|
813
|
-
|
|
814
|
-
### Code Metrics
|
|
815
|
-
- Complexity analysis
|
|
816
|
-
- Code quality metrics
|
|
817
|
-
- Impact calculation
|
|
818
|
-
- Priority assignment
|
|
819
|
-
|
|
820
|
-
## Refactoring Workflow
|
|
821
|
-
|
|
822
|
-
### Analysis Phase
|
|
823
|
-
1. Parse code into AST
|
|
824
|
-
2. Calculate code metrics
|
|
825
|
-
3. Run pattern detectors
|
|
826
|
-
4. Generate suggestions
|
|
827
|
-
5. Prioritize by impact
|
|
828
|
-
|
|
829
|
-
### Review Phase
|
|
830
|
-
1. Display suggestions
|
|
831
|
-
2. Group by file/type
|
|
832
|
-
3. Show impact analysis
|
|
833
|
-
4. Provide preview
|
|
834
|
-
5. Export for review
|
|
835
|
-
|
|
836
|
-
### Application Phase
|
|
837
|
-
1. Confirm changes
|
|
838
|
-
2. Create backup
|
|
839
|
-
3. Apply transformation
|
|
840
|
-
4. Validate result
|
|
841
|
-
5. Update metrics
|
|
842
|
-
|
|
843
|
-
## Best Practices
|
|
844
|
-
|
|
845
|
-
### Safe Refactoring
|
|
846
|
-
- Always backup before changes
|
|
847
|
-
- Validate syntax after refactoring
|
|
848
|
-
- Run tests after changes
|
|
849
|
-
- Use dry-run for preview
|
|
850
|
-
- Apply incrementally
|
|
851
|
-
|
|
852
|
-
### Pattern Selection
|
|
853
|
-
- Start with high-impact patterns
|
|
854
|
-
- Focus on code hotspots
|
|
855
|
-
- Consider team preferences
|
|
856
|
-
- Respect coding standards
|
|
857
|
-
- Monitor effectiveness
|
|
858
|
-
|
|
859
|
-
### Continuous Improvement
|
|
860
|
-
- Track refactoring success
|
|
861
|
-
- Learn from applied patterns
|
|
862
|
-
- Update pattern library
|
|
863
|
-
- Share successful refactorings
|
|
864
|
-
- Measure code quality trends
|
|
865
|
-
|
|
866
|
-
## Security Considerations
|
|
867
|
-
- Validate refactoring safety
|
|
868
|
-
- Preserve functionality
|
|
869
|
-
- Maintain security patterns
|
|
870
|
-
- Audit changes
|
|
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: devSuggestRefactoring()
|
|
30
|
+
responsƔvel: Dex (Builder)
|
|
31
|
+
responsavel_type: Agente
|
|
32
|
+
atomic_layer: Strategy
|
|
33
|
+
|
|
34
|
+
**Entrada:**
|
|
35
|
+
- campo: task
|
|
36
|
+
tipo: string
|
|
37
|
+
origem: User Input
|
|
38
|
+
obrigatório: true
|
|
39
|
+
validação: Must be registered task
|
|
40
|
+
|
|
41
|
+
- campo: parameters
|
|
42
|
+
tipo: object
|
|
43
|
+
origem: User Input
|
|
44
|
+
obrigatório: false
|
|
45
|
+
validação: Valid task parameters
|
|
46
|
+
|
|
47
|
+
- campo: mode
|
|
48
|
+
tipo: string
|
|
49
|
+
origem: User Input
|
|
50
|
+
obrigatório: false
|
|
51
|
+
validação: yolo|interactive|pre-flight
|
|
52
|
+
|
|
53
|
+
**SaĆda:**
|
|
54
|
+
- campo: execution_result
|
|
55
|
+
tipo: object
|
|
56
|
+
destino: Memory
|
|
57
|
+
persistido: false
|
|
58
|
+
|
|
59
|
+
- campo: logs
|
|
60
|
+
tipo: array
|
|
61
|
+
destino: File (.ai/logs/*)
|
|
62
|
+
persistido: true
|
|
63
|
+
|
|
64
|
+
- campo: state
|
|
65
|
+
tipo: object
|
|
66
|
+
destino: State management
|
|
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
|
+
- [ ] Task is registered; required parameters provided; dependencies met
|
|
81
|
+
tipo: pre-condition
|
|
82
|
+
blocker: true
|
|
83
|
+
validação: |
|
|
84
|
+
Check task is registered; required parameters provided; dependencies met
|
|
85
|
+
error_message: "Pre-condition failed: Task is registered; required parameters provided; dependencies met"
|
|
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
|
+
- [ ] Task completed; exit code 0; expected outputs created
|
|
99
|
+
tipo: post-condition
|
|
100
|
+
blocker: true
|
|
101
|
+
validação: |
|
|
102
|
+
Verify task completed; exit code 0; expected outputs created
|
|
103
|
+
error_message: "Post-condition failed: Task completed; exit code 0; expected outputs created"
|
|
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
|
+
- [ ] Task completed as expected; side effects documented
|
|
117
|
+
tipo: acceptance-criterion
|
|
118
|
+
blocker: true
|
|
119
|
+
validação: |
|
|
120
|
+
Assert task completed as expected; side effects documented
|
|
121
|
+
error_message: "Acceptance criterion not met: Task completed as expected; side effects documented"
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## Tools
|
|
127
|
+
|
|
128
|
+
**External/shared resources used by this task:**
|
|
129
|
+
|
|
130
|
+
- **Tool:** task-runner
|
|
131
|
+
- **Purpose:** Task execution and orchestration
|
|
132
|
+
- **Source:** .aios-core/core/task-runner.js
|
|
133
|
+
|
|
134
|
+
- **Tool:** logger
|
|
135
|
+
- **Purpose:** Execution logging and error tracking
|
|
136
|
+
- **Source:** .aios-core/utils/logger.js
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## Scripts
|
|
141
|
+
|
|
142
|
+
**Agent-specific code for this task:**
|
|
143
|
+
|
|
144
|
+
- **Script:** execute-task.js
|
|
145
|
+
- **Purpose:** Generic task execution wrapper
|
|
146
|
+
- **Language:** JavaScript
|
|
147
|
+
- **Location:** .aios-core/scripts/execute-task.js
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## Error Handling
|
|
152
|
+
|
|
153
|
+
**Strategy:** retry
|
|
154
|
+
|
|
155
|
+
**Common Errors:**
|
|
156
|
+
|
|
157
|
+
1. **Error:** Task Not Found
|
|
158
|
+
- **Cause:** Specified task not registered in system
|
|
159
|
+
- **Resolution:** Verify task name and registration
|
|
160
|
+
- **Recovery:** List available tasks, suggest similar
|
|
161
|
+
|
|
162
|
+
2. **Error:** Invalid Parameters
|
|
163
|
+
- **Cause:** Task parameters do not match expected schema
|
|
164
|
+
- **Resolution:** Validate parameters against task definition
|
|
165
|
+
- **Recovery:** Provide parameter template, reject execution
|
|
166
|
+
|
|
167
|
+
3. **Error:** Execution Timeout
|
|
168
|
+
- **Cause:** Task exceeds maximum execution time
|
|
169
|
+
- **Resolution:** Optimize task or increase timeout
|
|
170
|
+
- **Recovery:** Kill task, cleanup resources, log state
|
|
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
|
+
- development
|
|
198
|
+
- code
|
|
199
|
+
updated_at: 2025-11-17
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
checklists:
|
|
205
|
+
- dev-master-checklist.md
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
# Suggest Refactoring - AIOS Developer Task
|
|
209
|
+
|
|
210
|
+
## Purpose
|
|
211
|
+
Analyze code and suggest automated refactoring opportunities to improve code quality, maintainability, and performance.
|
|
212
|
+
|
|
213
|
+
## Command Pattern
|
|
214
|
+
```
|
|
215
|
+
*suggest-refactoring <path> [options]
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
## Parameters
|
|
219
|
+
- `path`: File or directory path to analyze
|
|
220
|
+
- `options`: Refactoring analysis configuration
|
|
221
|
+
|
|
222
|
+
### Options
|
|
223
|
+
- `--patterns <types>`: Comma-separated refactoring patterns to check
|
|
224
|
+
- `--threshold <level>`: Minimum impact threshold (1-10, default: 3)
|
|
225
|
+
- `--limit <count>`: Maximum suggestions per file (default: 10)
|
|
226
|
+
- `--apply <id>`: Apply specific suggestion by ID
|
|
227
|
+
- `--apply-all`: Apply all suggestions with confirmation
|
|
228
|
+
- `--export <file>`: Export suggestions to file
|
|
229
|
+
- `--recursive`: Analyze directories recursively
|
|
230
|
+
- `--exclude <patterns>`: Exclude file patterns (e.g., "*.test.js")
|
|
231
|
+
- `--dry-run`: Show what would be changed without applying
|
|
232
|
+
|
|
233
|
+
## Refactoring Patterns
|
|
234
|
+
- `extract_method`: Extract long methods into smaller ones
|
|
235
|
+
- `extract_variable`: Extract complex expressions
|
|
236
|
+
- `introduce_parameter_object`: Group related parameters
|
|
237
|
+
- `replace_conditional`: Replace conditionals with polymorphism
|
|
238
|
+
- `inline_temp`: Inline single-use variables
|
|
239
|
+
- `remove_dead_code`: Remove unreachable code
|
|
240
|
+
- `consolidate_duplicates`: Extract duplicate code
|
|
241
|
+
- `simplify_conditionals`: Flatten nested conditionals
|
|
242
|
+
- `replace_magic_numbers`: Extract constants
|
|
243
|
+
- `decompose_class`: Split large classes
|
|
244
|
+
|
|
245
|
+
## Examples
|
|
246
|
+
```bash
|
|
247
|
+
# Analyze single file
|
|
248
|
+
*suggest-refactoring aios-core/scripts/complex-utility.js
|
|
249
|
+
|
|
250
|
+
# Analyze directory with specific patterns
|
|
251
|
+
*suggest-refactoring aios-core/agents --patterns extract_method,decompose_class --recursive
|
|
252
|
+
|
|
253
|
+
# Apply high-impact suggestions
|
|
254
|
+
*suggest-refactoring aios-core/utils --threshold 7 --apply-all
|
|
255
|
+
|
|
256
|
+
# Export suggestions for review
|
|
257
|
+
*suggest-refactoring . --recursive --export refactoring-report.json
|
|
258
|
+
|
|
259
|
+
# Dry run to see changes
|
|
260
|
+
*suggest-refactoring aios-core/agents/developer.md --apply ref-001 --dry-run
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
## Implementation
|
|
264
|
+
|
|
265
|
+
```javascript
|
|
266
|
+
const fs = require('fs').promises;
|
|
267
|
+
const path = require('path');
|
|
268
|
+
const chalk = require('chalk');
|
|
269
|
+
const inquirer = require('inquirer');
|
|
270
|
+
const glob = require('glob').promises;
|
|
271
|
+
|
|
272
|
+
class SuggestRefactoringTask {
|
|
273
|
+
constructor() {
|
|
274
|
+
this.taskName = 'suggest-refactoring';
|
|
275
|
+
this.description = 'Suggest automated refactoring opportunities';
|
|
276
|
+
this.rootPath = process.cwd();
|
|
277
|
+
this.refactoringSuggester = null;
|
|
278
|
+
this.suggestions = [];
|
|
279
|
+
this.appliedRefactorings = [];
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
async execute(params) {
|
|
283
|
+
try {
|
|
284
|
+
console.log(chalk.blue('š§ AIOS Refactoring Analysis'));
|
|
285
|
+
console.log(chalk.gray('Analyzing code for refactoring opportunities\n'));
|
|
286
|
+
|
|
287
|
+
// Parse parameters
|
|
288
|
+
const config = await this.parseParameters(params);
|
|
289
|
+
|
|
290
|
+
// Initialize dependencies
|
|
291
|
+
await this.initializeDependencies();
|
|
292
|
+
|
|
293
|
+
// Get files to analyze
|
|
294
|
+
const files = await this.getFilesToAnalyze(config);
|
|
295
|
+
|
|
296
|
+
if (files.length === 0) {
|
|
297
|
+
console.log(chalk.yellow('No files found to analyze'));
|
|
298
|
+
return { success: true, suggestions: [] };
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
console.log(chalk.gray(`Found ${files.length} files to analyze\n`));
|
|
302
|
+
|
|
303
|
+
// Execute based on mode
|
|
304
|
+
if (config.apply) {
|
|
305
|
+
// Apply specific suggestion
|
|
306
|
+
await this.applySuggestion(config.apply, config);
|
|
307
|
+
} else if (config.applyAll) {
|
|
308
|
+
// Analyze and apply all suggestions
|
|
309
|
+
await this.analyzeFiles(files, config);
|
|
310
|
+
await this.applyAllSuggestions(config);
|
|
311
|
+
} else {
|
|
312
|
+
// Just analyze and show suggestions
|
|
313
|
+
await this.analyzeFiles(files, config);
|
|
314
|
+
await this.displaySuggestions(config);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// Export if requested
|
|
318
|
+
if (config.export) {
|
|
319
|
+
await this.exportSuggestions(config.export);
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
return {
|
|
323
|
+
success: true,
|
|
324
|
+
filesAnalyzed: files.length,
|
|
325
|
+
totalSuggestions: this.suggestions.length,
|
|
326
|
+
appliedRefactorings: this.appliedRefactorings.length
|
|
327
|
+
};
|
|
328
|
+
|
|
329
|
+
} catch (error) {
|
|
330
|
+
console.error(chalk.red(`\nā Refactoring analysis failed: ${error.message}`));
|
|
331
|
+
throw error;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
async parseParameters(params) {
|
|
336
|
+
if (params.length < 1) {
|
|
337
|
+
throw new Error('Usage: *suggest-refactoring <path> [options]');
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
const config = {
|
|
341
|
+
targetPath: params[0],
|
|
342
|
+
patterns: null,
|
|
343
|
+
threshold: 3,
|
|
344
|
+
limit: 10,
|
|
345
|
+
apply: null,
|
|
346
|
+
applyAll: false,
|
|
347
|
+
export: null,
|
|
348
|
+
recursive: false,
|
|
349
|
+
exclude: [],
|
|
350
|
+
dryRun: false
|
|
351
|
+
};
|
|
352
|
+
|
|
353
|
+
// Parse options
|
|
354
|
+
for (let i = 1; i < params.length; i++) {
|
|
355
|
+
const param = params[i];
|
|
356
|
+
|
|
357
|
+
if (param === '--recursive') {
|
|
358
|
+
config.recursive = true;
|
|
359
|
+
} else if (param === '--apply-all') {
|
|
360
|
+
config.applyAll = true;
|
|
361
|
+
} else if (param === '--dry-run') {
|
|
362
|
+
config.dryRun = true;
|
|
363
|
+
} else if (param.startsWith('--patterns') && params[i + 1]) {
|
|
364
|
+
config.patterns = params[++i].split(',').map(p => p.trim());
|
|
365
|
+
} else if (param.startsWith('--threshold') && params[i + 1]) {
|
|
366
|
+
config.threshold = parseInt(params[++i]);
|
|
367
|
+
} else if (param.startsWith('--limit') && params[i + 1]) {
|
|
368
|
+
config.limit = parseInt(params[++i]);
|
|
369
|
+
} else if (param.startsWith('--apply') && params[i + 1]) {
|
|
370
|
+
config.apply = params[++i];
|
|
371
|
+
} else if (param.startsWith('--export') && params[i + 1]) {
|
|
372
|
+
config.export = params[++i];
|
|
373
|
+
} else if (param.startsWith('--exclude') && params[i + 1]) {
|
|
374
|
+
config.exclude = params[++i].split(',').map(e => e.trim());
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
// Validate threshold
|
|
379
|
+
if (config.threshold < 1 || config.threshold > 10) {
|
|
380
|
+
throw new Error('Threshold must be between 1 and 10');
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
return config;
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
async initializeDependencies() {
|
|
387
|
+
try {
|
|
388
|
+
const RefactoringSuggester = require('../scripts/refactoring-suggester');
|
|
389
|
+
this.refactoringSuggester = new RefactoringSuggester({ rootPath: this.rootPath });
|
|
390
|
+
|
|
391
|
+
} catch (error) {
|
|
392
|
+
throw new Error(`Failed to initialize dependencies: ${error.message}`);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
async getFilesToAnalyze(config) {
|
|
397
|
+
const targetPath = path.resolve(this.rootPath, config.targetPath);
|
|
398
|
+
const files = [];
|
|
399
|
+
|
|
400
|
+
try {
|
|
401
|
+
const stats = await fs.stat(targetPath);
|
|
402
|
+
|
|
403
|
+
if (stats.isFile()) {
|
|
404
|
+
// Single file
|
|
405
|
+
if (this.shouldAnalyzeFile(targetPath, config)) {
|
|
406
|
+
files.push(targetPath);
|
|
407
|
+
}
|
|
408
|
+
} else if (stats.isDirectory()) {
|
|
409
|
+
// Directory
|
|
410
|
+
const pattern = config.recursive ? '**/*.{js,jsx,ts,tsx}' : '*.{js,jsx,ts,tsx}';
|
|
411
|
+
const globPattern = path.join(targetPath, pattern);
|
|
412
|
+
|
|
413
|
+
const matches = await glob(globPattern, {
|
|
414
|
+
ignore: config.exclude.map(e => path.join(targetPath, '**', e)),
|
|
415
|
+
nodir: true
|
|
416
|
+
});
|
|
417
|
+
|
|
418
|
+
for (const match of matches) {
|
|
419
|
+
if (this.shouldAnalyzeFile(match, config)) {
|
|
420
|
+
files.push(match);
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
} catch (error) {
|
|
425
|
+
console.warn(chalk.yellow(`Cannot access ${targetPath}: ${error.message}`));
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
return files;
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
shouldAnalyzeFile(filePath, config) {
|
|
432
|
+
// Skip test files unless explicitly included
|
|
433
|
+
if (filePath.includes('.test.') || filePath.includes('.spec.')) {
|
|
434
|
+
return false;
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
// Skip minified files
|
|
438
|
+
if (filePath.includes('.min.')) {
|
|
439
|
+
return false;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
// Skip node_modules
|
|
443
|
+
if (filePath.includes('node_modules')) {
|
|
444
|
+
return false;
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
// Check file extension
|
|
448
|
+
const ext = path.extname(filePath);
|
|
449
|
+
return ['.js', '.jsx', '.ts', '.tsx'].includes(ext);
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
async analyzeFiles(files, config) {
|
|
453
|
+
console.log(chalk.blue('š Analyzing files...'));
|
|
454
|
+
|
|
455
|
+
const progressInterval = Math.max(1, Math.floor(files.length / 20));
|
|
456
|
+
|
|
457
|
+
for (let i = 0; i < files.length; i++) {
|
|
458
|
+
const file = files[i];
|
|
459
|
+
|
|
460
|
+
try {
|
|
461
|
+
const result = await this.refactoringSuggester.analyzeCode(file, {
|
|
462
|
+
patterns: config.patterns
|
|
463
|
+
});
|
|
464
|
+
|
|
465
|
+
if (result.suggestions && result.suggestions.length > 0) {
|
|
466
|
+
// Filter by threshold and limit
|
|
467
|
+
const filteredSuggestions = result.suggestions
|
|
468
|
+
.filter(s => s.impact >= config.threshold)
|
|
469
|
+
.slice(0, config.limit);
|
|
470
|
+
|
|
471
|
+
// Add to global suggestions with unique IDs
|
|
472
|
+
for (const suggestion of filteredSuggestions) {
|
|
473
|
+
suggestion.id = `ref-${this.suggestions.length + 1}`;
|
|
474
|
+
suggestion.file = path.relative(this.rootPath, file);
|
|
475
|
+
this.suggestions.push(suggestion);
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
// Show progress
|
|
480
|
+
if (i % progressInterval === 0) {
|
|
481
|
+
const progress = Math.floor((i / files.length) * 100);
|
|
482
|
+
process.stdout.write(`\rProgress: ${progress}%`);
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
} catch (error) {
|
|
486
|
+
console.warn(chalk.yellow(`\nFailed to analyze ${file}: ${error.message}`));
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
console.log('\rProgress: 100%\n');
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
async displaySuggestions(config) {
|
|
494
|
+
if (this.suggestions.length === 0) {
|
|
495
|
+
console.log(chalk.yellow('No refactoring suggestions found above threshold'));
|
|
496
|
+
return;
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
console.log(chalk.blue(`\nš Found ${this.suggestions.length} refactoring suggestions:\n`));
|
|
500
|
+
|
|
501
|
+
// Group by file
|
|
502
|
+
const byFile = {};
|
|
503
|
+
for (const suggestion of this.suggestions) {
|
|
504
|
+
if (!byFile[suggestion.file]) {
|
|
505
|
+
byFile[suggestion.file] = [];
|
|
506
|
+
}
|
|
507
|
+
byFile[suggestion.file].push(suggestion);
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
// Display suggestions
|
|
511
|
+
for (const [file, suggestions] of Object.entries(byFile)) {
|
|
512
|
+
console.log(chalk.blue(`\nš ${file}`));
|
|
513
|
+
console.log(chalk.gray('ā'.repeat(50)));
|
|
514
|
+
|
|
515
|
+
for (const suggestion of suggestions) {
|
|
516
|
+
this.displaySuggestion(suggestion);
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
// Show statistics
|
|
521
|
+
this.displayStatistics();
|
|
522
|
+
|
|
523
|
+
// Show next steps
|
|
524
|
+
console.log(chalk.blue('\nš Next Steps:'));
|
|
525
|
+
console.log('1. Review suggestions carefully');
|
|
526
|
+
console.log(`2. Apply specific suggestion: *suggest-refactoring ${config.targetPath} --apply <id>`);
|
|
527
|
+
console.log(`3. Apply all suggestions: *suggest-refactoring ${config.targetPath} --apply-all`);
|
|
528
|
+
console.log(`4. Export for team review: *suggest-refactoring ${config.targetPath} --export report.json`);
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
displaySuggestion(suggestion) {
|
|
532
|
+
const priorityColors = {
|
|
533
|
+
high: chalk.red,
|
|
534
|
+
medium: chalk.yellow,
|
|
535
|
+
low: chalk.gray
|
|
536
|
+
};
|
|
537
|
+
|
|
538
|
+
const priorityColor = priorityColors[suggestion.priority] || chalk.gray;
|
|
539
|
+
|
|
540
|
+
console.log(`\n${chalk.gray(suggestion.id)} ${priorityColor(`[${suggestion.priority.toUpperCase()}]`)} ${suggestion.description}`);
|
|
541
|
+
console.log(` ${chalk.gray('Location:')} Lines ${suggestion.location.start}-${suggestion.location.end}`);
|
|
542
|
+
console.log(` ${chalk.gray('Impact:')} ${this.formatImpact(suggestion.impact)}`);
|
|
543
|
+
console.log(` ${chalk.gray('Type:')} ${suggestion.pattern}`);
|
|
544
|
+
console.log(` ${chalk.gray('Details:')} ${suggestion.details}`);
|
|
545
|
+
|
|
546
|
+
if (suggestion.suggestedRefactoring && suggestion.suggestedRefactoring.action) {
|
|
547
|
+
console.log(` ${chalk.gray('Action:')} ${suggestion.suggestedRefactoring.action}`);
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
formatImpact(impact) {
|
|
552
|
+
const bar = 'ā'.repeat(impact) + 'ā'.repeat(10 - impact);
|
|
553
|
+
|
|
554
|
+
if (impact >= 8) {
|
|
555
|
+
return chalk.red(bar) + ` (${impact}/10)`;
|
|
556
|
+
} else if (impact >= 5) {
|
|
557
|
+
return chalk.yellow(bar) + ` (${impact}/10)`;
|
|
558
|
+
} else {
|
|
559
|
+
return chalk.gray(bar) + ` (${impact}/10)`;
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
async applySuggestion(suggestionId, config) {
|
|
564
|
+
const suggestion = this.suggestions.find(s => s.id === suggestionId);
|
|
565
|
+
|
|
566
|
+
if (!suggestion) {
|
|
567
|
+
// Try to load from previous analysis
|
|
568
|
+
const loaded = await this.loadSuggestion(suggestionId);
|
|
569
|
+
if (!loaded) {
|
|
570
|
+
throw new Error(`Suggestion not found: ${suggestionId}`);
|
|
571
|
+
}
|
|
572
|
+
suggestion = loaded;
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
console.log(chalk.blue('\nš§ Applying Refactoring'));
|
|
576
|
+
console.log(chalk.gray('ā'.repeat(50)));
|
|
577
|
+
this.displaySuggestion(suggestion);
|
|
578
|
+
|
|
579
|
+
if (config.dryRun) {
|
|
580
|
+
console.log(chalk.yellow('\nā ļø DRY RUN - No changes will be made'));
|
|
581
|
+
await this.showRefactoringPreview(suggestion);
|
|
582
|
+
return;
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
// Confirm application
|
|
586
|
+
const { confirm } = await inquirer.prompt([{
|
|
587
|
+
type: 'confirm',
|
|
588
|
+
name: 'confirm',
|
|
589
|
+
message: 'Apply this refactoring?',
|
|
590
|
+
default: true
|
|
591
|
+
}]);
|
|
592
|
+
|
|
593
|
+
if (!confirm) {
|
|
594
|
+
console.log(chalk.gray('Refactoring cancelled'));
|
|
595
|
+
return;
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
// Apply the refactoring
|
|
599
|
+
try {
|
|
600
|
+
const result = await this.refactoringSuggester.applySuggestion(suggestion);
|
|
601
|
+
|
|
602
|
+
if (result.success) {
|
|
603
|
+
console.log(chalk.green('ā
Refactoring applied successfully'));
|
|
604
|
+
this.appliedRefactorings.push({
|
|
605
|
+
suggestion,
|
|
606
|
+
result,
|
|
607
|
+
timestamp: new Date().toISOString()
|
|
608
|
+
});
|
|
609
|
+
|
|
610
|
+
// Show changes
|
|
611
|
+
for (const change of result.changes) {
|
|
612
|
+
console.log(chalk.gray(` - ${change.description}`));
|
|
613
|
+
}
|
|
614
|
+
} else {
|
|
615
|
+
console.error(chalk.red(`Failed to apply refactoring: ${result.error}`));
|
|
616
|
+
}
|
|
617
|
+
} catch (error) {
|
|
618
|
+
console.error(chalk.red(`Error applying refactoring: ${error.message}`));
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
async applyAllSuggestions(config) {
|
|
623
|
+
if (this.suggestions.length === 0) {
|
|
624
|
+
console.log(chalk.yellow('No suggestions to apply'));
|
|
625
|
+
return;
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
console.log(chalk.blue(`\nš§ Applying ${this.suggestions.length} refactorings`));
|
|
629
|
+
|
|
630
|
+
// Group by type for better user experience
|
|
631
|
+
const byType = {};
|
|
632
|
+
for (const suggestion of this.suggestions) {
|
|
633
|
+
if (!byType[suggestion.type]) {
|
|
634
|
+
byType[suggestion.type] = [];
|
|
635
|
+
}
|
|
636
|
+
byType[suggestion.type].push(suggestion);
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
// Show summary
|
|
640
|
+
console.log(chalk.gray('\nRefactorings by type:'));
|
|
641
|
+
for (const [type, suggestions] of Object.entries(byType)) {
|
|
642
|
+
console.log(` ${type}: ${suggestions.length}`);
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
if (config.dryRun) {
|
|
646
|
+
console.log(chalk.yellow('\nā ļø DRY RUN - No changes will be made'));
|
|
647
|
+
return;
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
// Confirm batch application
|
|
651
|
+
const { confirmAll } = await inquirer.prompt([{
|
|
652
|
+
type: 'confirm',
|
|
653
|
+
name: 'confirmAll',
|
|
654
|
+
message: `Apply all ${this.suggestions.length} refactorings?`,
|
|
655
|
+
default: false
|
|
656
|
+
}]);
|
|
657
|
+
|
|
658
|
+
if (!confirmAll) {
|
|
659
|
+
// Ask for individual confirmation
|
|
660
|
+
await this.applySelectiveSuggestions(config);
|
|
661
|
+
return;
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
// Apply all suggestions
|
|
665
|
+
let applied = 0;
|
|
666
|
+
let failed = 0;
|
|
667
|
+
|
|
668
|
+
for (const suggestion of this.suggestions) {
|
|
669
|
+
try {
|
|
670
|
+
console.log(chalk.gray(`\nApplying ${suggestion.id}: ${suggestion.description}`));
|
|
671
|
+
|
|
672
|
+
const result = await this.refactoringSuggester.applySuggestion(suggestion);
|
|
673
|
+
|
|
674
|
+
if (result.success) {
|
|
675
|
+
applied++;
|
|
676
|
+
this.appliedRefactorings.push({
|
|
677
|
+
suggestion,
|
|
678
|
+
result,
|
|
679
|
+
timestamp: new Date().toISOString()
|
|
680
|
+
});
|
|
681
|
+
} else {
|
|
682
|
+
failed++;
|
|
683
|
+
console.error(chalk.red(` Failed: ${result.error}`));
|
|
684
|
+
}
|
|
685
|
+
} catch (error) {
|
|
686
|
+
failed++;
|
|
687
|
+
console.error(chalk.red(` Error: ${error.message}`));
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
|
|
691
|
+
console.log(chalk.blue('\nš Application Summary:'));
|
|
692
|
+
console.log(chalk.green(` ā
Applied: ${applied}`));
|
|
693
|
+
if (failed > 0) {
|
|
694
|
+
console.log(chalk.red(` ā Failed: ${failed}`));
|
|
695
|
+
}
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
async applySelectiveSuggestions(config) {
|
|
699
|
+
const choices = this.suggestions.map(s => ({
|
|
700
|
+
name: `${s.id} - ${s.description} (${s.file})`,
|
|
701
|
+
value: s.id,
|
|
702
|
+
checked: s.impact >= 7 // Pre-check high impact
|
|
703
|
+
}));
|
|
704
|
+
|
|
705
|
+
const { selected } = await inquirer.prompt([{
|
|
706
|
+
type: 'checkbox',
|
|
707
|
+
name: 'selected',
|
|
708
|
+
message: 'Select refactorings to apply:',
|
|
709
|
+
choices,
|
|
710
|
+
pageSize: 15
|
|
711
|
+
}]);
|
|
712
|
+
|
|
713
|
+
if (selected.length === 0) {
|
|
714
|
+
console.log(chalk.gray('No refactorings selected'));
|
|
715
|
+
return;
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
// Apply selected suggestions
|
|
719
|
+
for (const id of selected) {
|
|
720
|
+
const suggestion = this.suggestions.find(s => s.id === id);
|
|
721
|
+
await this.applySuggestion(id, config);
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
async showRefactoringPreview(suggestion) {
|
|
726
|
+
console.log(chalk.blue('\nš Refactoring Preview:'));
|
|
727
|
+
|
|
728
|
+
// This would show actual code changes
|
|
729
|
+
// For now, show the refactoring plan
|
|
730
|
+
if (suggestion.suggestedRefactoring) {
|
|
731
|
+
console.log(chalk.gray(JSON.stringify(suggestion.suggestedRefactoring, null, 2)));
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
async loadSuggestion(suggestionId) {
|
|
736
|
+
// Try to load from cache or previous export
|
|
737
|
+
const cacheFile = path.join(this.rootPath, '.aios', 'refactoring', `${suggestionId}.json`);
|
|
738
|
+
|
|
739
|
+
try {
|
|
740
|
+
const content = await fs.readFile(cacheFile, 'utf-8');
|
|
741
|
+
return JSON.parse(content);
|
|
742
|
+
} catch (error) {
|
|
743
|
+
return null;
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
async exportSuggestions(exportPath) {
|
|
748
|
+
console.log(chalk.blue('\nš¤ Exporting suggestions...'));
|
|
749
|
+
|
|
750
|
+
const exportData = {
|
|
751
|
+
version: 1,
|
|
752
|
+
exportDate: new Date().toISOString(),
|
|
753
|
+
analysisPath: this.rootPath,
|
|
754
|
+
totalSuggestions: this.suggestions.length,
|
|
755
|
+
statistics: this.refactoringSuggester.getStatistics(),
|
|
756
|
+
suggestions: this.suggestions.map(s => ({
|
|
757
|
+
...s,
|
|
758
|
+
file: s.file || s.filePath
|
|
759
|
+
}))
|
|
760
|
+
};
|
|
761
|
+
|
|
762
|
+
await fs.writeFile(exportPath, JSON.stringify(exportData, null, 2));
|
|
763
|
+
console.log(chalk.green(`ā
Exported ${this.suggestions.length} suggestions to: ${exportPath}`));
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
displayStatistics() {
|
|
767
|
+
const stats = this.refactoringSuggester.getStatistics();
|
|
768
|
+
|
|
769
|
+
console.log(chalk.blue('\nš Refactoring Statistics:'));
|
|
770
|
+
console.log(chalk.gray('ā'.repeat(50)));
|
|
771
|
+
|
|
772
|
+
console.log(`Total suggestions: ${stats.totalSuggestions}`);
|
|
773
|
+
console.log(`Average impact: ${stats.averageImpact}/10`);
|
|
774
|
+
|
|
775
|
+
console.log('\nBy priority:');
|
|
776
|
+
for (const [priority, count] of Object.entries(stats.byPriority)) {
|
|
777
|
+
console.log(` ${priority}: ${count}`);
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
console.log('\nBy type:');
|
|
781
|
+
const sortedTypes = Object.entries(stats.byType)
|
|
782
|
+
.sort(([,a], [,b]) => b - a)
|
|
783
|
+
.slice(0, 5);
|
|
784
|
+
|
|
785
|
+
for (const [type, count] of sortedTypes) {
|
|
786
|
+
console.log(` ${type}: ${count}`);
|
|
787
|
+
}
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
module.exports = SuggestRefactoringTask;
|
|
792
|
+
```
|
|
793
|
+
|
|
794
|
+
## Integration Points
|
|
795
|
+
|
|
796
|
+
### Refactoring Suggester
|
|
797
|
+
- Core analysis engine
|
|
798
|
+
- Pattern detection
|
|
799
|
+
- Suggestion generation
|
|
800
|
+
- Refactoring application
|
|
801
|
+
|
|
802
|
+
### AST Processing
|
|
803
|
+
- Code parsing
|
|
804
|
+
- Pattern matching
|
|
805
|
+
- Code transformation
|
|
806
|
+
- Generation
|
|
807
|
+
|
|
808
|
+
### Pattern Library
|
|
809
|
+
- Refactoring patterns
|
|
810
|
+
- Detection algorithms
|
|
811
|
+
- Application strategies
|
|
812
|
+
- Success metrics
|
|
813
|
+
|
|
814
|
+
### Code Metrics
|
|
815
|
+
- Complexity analysis
|
|
816
|
+
- Code quality metrics
|
|
817
|
+
- Impact calculation
|
|
818
|
+
- Priority assignment
|
|
819
|
+
|
|
820
|
+
## Refactoring Workflow
|
|
821
|
+
|
|
822
|
+
### Analysis Phase
|
|
823
|
+
1. Parse code into AST
|
|
824
|
+
2. Calculate code metrics
|
|
825
|
+
3. Run pattern detectors
|
|
826
|
+
4. Generate suggestions
|
|
827
|
+
5. Prioritize by impact
|
|
828
|
+
|
|
829
|
+
### Review Phase
|
|
830
|
+
1. Display suggestions
|
|
831
|
+
2. Group by file/type
|
|
832
|
+
3. Show impact analysis
|
|
833
|
+
4. Provide preview
|
|
834
|
+
5. Export for review
|
|
835
|
+
|
|
836
|
+
### Application Phase
|
|
837
|
+
1. Confirm changes
|
|
838
|
+
2. Create backup
|
|
839
|
+
3. Apply transformation
|
|
840
|
+
4. Validate result
|
|
841
|
+
5. Update metrics
|
|
842
|
+
|
|
843
|
+
## Best Practices
|
|
844
|
+
|
|
845
|
+
### Safe Refactoring
|
|
846
|
+
- Always backup before changes
|
|
847
|
+
- Validate syntax after refactoring
|
|
848
|
+
- Run tests after changes
|
|
849
|
+
- Use dry-run for preview
|
|
850
|
+
- Apply incrementally
|
|
851
|
+
|
|
852
|
+
### Pattern Selection
|
|
853
|
+
- Start with high-impact patterns
|
|
854
|
+
- Focus on code hotspots
|
|
855
|
+
- Consider team preferences
|
|
856
|
+
- Respect coding standards
|
|
857
|
+
- Monitor effectiveness
|
|
858
|
+
|
|
859
|
+
### Continuous Improvement
|
|
860
|
+
- Track refactoring success
|
|
861
|
+
- Learn from applied patterns
|
|
862
|
+
- Update pattern library
|
|
863
|
+
- Share successful refactorings
|
|
864
|
+
- Measure code quality trends
|
|
865
|
+
|
|
866
|
+
## Security Considerations
|
|
867
|
+
- Validate refactoring safety
|
|
868
|
+
- Preserve functionality
|
|
869
|
+
- Maintain security patterns
|
|
870
|
+
- Audit changes
|
|
871
871
|
- Test thoroughly
|