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,957 +1,957 @@
|
|
|
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: deprecateComponent()
|
|
30
|
-
responsƔvel: Dex (Builder)
|
|
31
|
-
responsavel_type: Agente
|
|
32
|
-
atomic_layer: Molecule
|
|
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: 2-5 min (estimated)
|
|
180
|
-
cost_estimated: $0.001-0.003
|
|
181
|
-
token_usage: ~1,000-3,000 tokens
|
|
182
|
-
```
|
|
183
|
-
|
|
184
|
-
**Optimization Notes:**
|
|
185
|
-
- Parallelize independent operations; reuse atom results; implement early exits
|
|
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
|
-
- automation
|
|
198
|
-
- workflow
|
|
199
|
-
updated_at: 2025-11-17
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
---
|
|
203
|
-
|
|
204
|
-
tools:
|
|
205
|
-
- github-cli
|
|
206
|
-
# TODO: Create deprecation-checklist.md for validation (follow-up story needed)
|
|
207
|
-
# checklists:
|
|
208
|
-
# - deprecation-checklist.md
|
|
209
|
-
---
|
|
210
|
-
|
|
211
|
-
# Deprecate Component - AIOS Developer Task
|
|
212
|
-
|
|
213
|
-
## Purpose
|
|
214
|
-
Mark framework components as deprecated with timeline management and migration path generation.
|
|
215
|
-
|
|
216
|
-
## Command Pattern
|
|
217
|
-
```
|
|
218
|
-
*deprecate-component <component-type> <component-name> [options]
|
|
219
|
-
```
|
|
220
|
-
|
|
221
|
-
## Parameters
|
|
222
|
-
- `component-type`: Type of component (agent, task, workflow, util)
|
|
223
|
-
- `component-name`: Name/ID of the component to deprecate
|
|
224
|
-
- `options`: Deprecation configuration and timeline
|
|
225
|
-
|
|
226
|
-
### Options
|
|
227
|
-
- `--removal-version <version>`: Target version for removal (default: next major)
|
|
228
|
-
- `--replacement <name>`: Replacement component name
|
|
229
|
-
- `--reason <text>`: Deprecation reason
|
|
230
|
-
- `--migration-guide <path>`: Path to migration guide
|
|
231
|
-
- `--immediate`: Mark for immediate deprecation warnings
|
|
232
|
-
- `--timeline <months>`: Deprecation timeline in months (default: 6)
|
|
233
|
-
- `--severity <level>`: Deprecation severity (low, medium, high, critical)
|
|
234
|
-
|
|
235
|
-
## Examples
|
|
236
|
-
```bash
|
|
237
|
-
# Deprecate an agent with replacement
|
|
238
|
-
*deprecate-component agent weather-fetcher --replacement weather-service --reason "Performance optimization" --timeline 3
|
|
239
|
-
|
|
240
|
-
# Deprecate a utility with migration guide
|
|
241
|
-
*deprecate-component util old-logger --replacement @aios/logger --migration-guide docs/migration/logger.md --severity high
|
|
242
|
-
|
|
243
|
-
# Immediate deprecation for security issue
|
|
244
|
-
*deprecate-component task insecure-parser --immediate --reason "Security vulnerability" --severity critical
|
|
245
|
-
|
|
246
|
-
# Deprecate workflow with custom removal version
|
|
247
|
-
*deprecate-component workflow legacy-processor --removal-version 3.0.0 --timeline 12
|
|
248
|
-
```
|
|
249
|
-
|
|
250
|
-
## Implementation
|
|
251
|
-
|
|
252
|
-
```javascript
|
|
253
|
-
const fs = require('fs').promises;
|
|
254
|
-
const path = require('path');
|
|
255
|
-
const chalk = require('chalk');
|
|
256
|
-
const inquirer = require('inquirer');
|
|
257
|
-
|
|
258
|
-
class DeprecateComponentTask {
|
|
259
|
-
constructor() {
|
|
260
|
-
this.taskName = 'deprecate-component';
|
|
261
|
-
this.description = 'Mark framework components as deprecated with timeline management';
|
|
262
|
-
this.rootPath = process.cwd();
|
|
263
|
-
this.deprecationManager = null;
|
|
264
|
-
this.usageTracker = null;
|
|
265
|
-
this.componentSearch = null;
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
async execute(params) {
|
|
269
|
-
try {
|
|
270
|
-
console.log(chalk.blue('š« AIOS Component Deprecation'));
|
|
271
|
-
console.log(chalk.gray('Marking component as deprecated with timeline management\n'));
|
|
272
|
-
|
|
273
|
-
// Parse and validate parameters
|
|
274
|
-
const config = await this.parseParameters(params);
|
|
275
|
-
|
|
276
|
-
// Initialize dependencies
|
|
277
|
-
await this.initializeDependencies();
|
|
278
|
-
|
|
279
|
-
// Find target component
|
|
280
|
-
const component = await this.findComponent(config.componentType, config.componentName);
|
|
281
|
-
if (!component) {
|
|
282
|
-
throw new Error(`Component not found: ${config.componentType}/${config.componentName}`);
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
// Check current deprecation status
|
|
286
|
-
const currentStatus = await this.checkDeprecationStatus(component);
|
|
287
|
-
if (currentStatus.deprecated && !config.force) {
|
|
288
|
-
console.log(chalk.yellow(`ā ļø Component ${component.name} is already deprecated`));
|
|
289
|
-
|
|
290
|
-
const { action } = await inquirer.prompt([{
|
|
291
|
-
type: 'list',
|
|
292
|
-
name: 'action',
|
|
293
|
-
message: 'Component is already deprecated. What would you like to do?',
|
|
294
|
-
choices: [
|
|
295
|
-
{ name: 'Update deprecation details', value: 'update' },
|
|
296
|
-
{ name: 'View current deprecation info', value: 'view' },
|
|
297
|
-
{ name: 'Cancel operation', value: 'cancel' }
|
|
298
|
-
]
|
|
299
|
-
}]);
|
|
300
|
-
|
|
301
|
-
if (action === 'cancel') {
|
|
302
|
-
console.log(chalk.gray('Operation cancelled'));
|
|
303
|
-
return;
|
|
304
|
-
} else if (action === 'view') {
|
|
305
|
-
await this.displayDeprecationInfo(component, currentStatus);
|
|
306
|
-
return;
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
// Analyze component usage
|
|
311
|
-
console.log(chalk.gray('Analyzing component usage...'));
|
|
312
|
-
const usageAnalysis = await this.analyzeComponentUsage(component);
|
|
313
|
-
|
|
314
|
-
// Generate deprecation plan
|
|
315
|
-
const deprecationPlan = await this.generateDeprecationPlan(component, config, usageAnalysis);
|
|
316
|
-
|
|
317
|
-
// Display deprecation summary
|
|
318
|
-
await this.displayDeprecationSummary(component, deprecationPlan);
|
|
319
|
-
|
|
320
|
-
// Request confirmation
|
|
321
|
-
const confirmed = await this.requestConfirmation(deprecationPlan);
|
|
322
|
-
if (!confirmed) {
|
|
323
|
-
console.log(chalk.gray('Deprecation cancelled'));
|
|
324
|
-
return;
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
// Execute deprecation
|
|
328
|
-
const deprecationResult = await this.executeDeprecation(component, deprecationPlan);
|
|
329
|
-
|
|
330
|
-
// Update documentation
|
|
331
|
-
await this.updateDocumentation(component, deprecationPlan);
|
|
332
|
-
|
|
333
|
-
// Generate migration artifacts
|
|
334
|
-
if (deprecationPlan.migrationRequired) {
|
|
335
|
-
await this.generateMigrationArtifacts(component, deprecationPlan);
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
// Schedule deprecation tasks
|
|
339
|
-
await this.scheduleDeprecationTasks(component, deprecationPlan);
|
|
340
|
-
|
|
341
|
-
// Display success summary
|
|
342
|
-
console.log(chalk.green('\nā
Component deprecation completed successfully'));
|
|
343
|
-
console.log(chalk.gray(` Component: ${component.type}/${component.name}`));
|
|
344
|
-
console.log(chalk.gray(` Deprecation ID: ${deprecationResult.deprecationId}`));
|
|
345
|
-
console.log(chalk.gray(` Timeline: ${deprecationPlan.timeline} months`));
|
|
346
|
-
console.log(chalk.gray(` Removal planned: ${deprecationPlan.removalVersion}`));
|
|
347
|
-
|
|
348
|
-
if (deprecationPlan.usageCount > 0) {
|
|
349
|
-
console.log(chalk.yellow(` ā ļø Found ${deprecationPlan.usageCount} usage(s) that need migration`));
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
return {
|
|
353
|
-
success: true,
|
|
354
|
-
deprecationId: deprecationResult.deprecationId,
|
|
355
|
-
component: component,
|
|
356
|
-
timeline: deprecationPlan.timeline,
|
|
357
|
-
usageCount: deprecationPlan.usageCount,
|
|
358
|
-
migrationRequired: deprecationPlan.migrationRequired
|
|
359
|
-
};
|
|
360
|
-
|
|
361
|
-
} catch (error) {
|
|
362
|
-
console.error(chalk.red(`\nā Component deprecation failed: ${error.message}`));
|
|
363
|
-
throw error;
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
async parseParameters(params) {
|
|
368
|
-
if (params.length < 2) {
|
|
369
|
-
throw new Error('Usage: *deprecate-component <component-type> <component-name> [options]');
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
const config = {
|
|
373
|
-
componentType: params[0],
|
|
374
|
-
componentName: params[1],
|
|
375
|
-
removalVersion: null,
|
|
376
|
-
replacement: null,
|
|
377
|
-
reason: null,
|
|
378
|
-
migrationGuide: null,
|
|
379
|
-
immediate: false,
|
|
380
|
-
timeline: 6,
|
|
381
|
-
severity: 'medium',
|
|
382
|
-
force: false
|
|
383
|
-
};
|
|
384
|
-
|
|
385
|
-
// Parse options
|
|
386
|
-
for (let i = 2; i < params.length; i++) {
|
|
387
|
-
const param = params[i];
|
|
388
|
-
|
|
389
|
-
if (param === '--immediate') {
|
|
390
|
-
config.immediate = true;
|
|
391
|
-
} else if (param === '--force') {
|
|
392
|
-
config.force = true;
|
|
393
|
-
} else if (param.startsWith('--removal-version') && params[i + 1]) {
|
|
394
|
-
config.removalVersion = params[++i];
|
|
395
|
-
} else if (param.startsWith('--replacement') && params[i + 1]) {
|
|
396
|
-
config.replacement = params[++i];
|
|
397
|
-
} else if (param.startsWith('--reason') && params[i + 1]) {
|
|
398
|
-
config.reason = params[++i];
|
|
399
|
-
} else if (param.startsWith('--migration-guide') && params[i + 1]) {
|
|
400
|
-
config.migrationGuide = params[++i];
|
|
401
|
-
} else if (param.startsWith('--timeline') && params[i + 1]) {
|
|
402
|
-
config.timeline = parseInt(params[++i]) || 6;
|
|
403
|
-
} else if (param.startsWith('--severity') && params[i + 1]) {
|
|
404
|
-
config.severity = params[++i];
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
// Validate component type
|
|
409
|
-
const validTypes = ['agent', 'task', 'workflow', 'util'];
|
|
410
|
-
if (!validTypes.includes(config.componentType)) {
|
|
411
|
-
throw new Error(`Invalid component type: ${config.componentType}. Must be one of: ${validTypes.join(', ')}`);
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
// Validate severity
|
|
415
|
-
const validSeverities = ['low', 'medium', 'high', 'critical'];
|
|
416
|
-
if (!validSeverities.includes(config.severity)) {
|
|
417
|
-
throw new Error(`Invalid severity: ${config.severity}. Must be one of: ${validSeverities.join(', ')}`);
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
return config;
|
|
421
|
-
}
|
|
422
|
-
|
|
423
|
-
async initializeDependencies() {
|
|
424
|
-
try {
|
|
425
|
-
// Initialize deprecation manager
|
|
426
|
-
// const DeprecationManager = require('../scripts/deprecation-manager'); // Archived in Story 3.18
|
|
427
|
-
// this.deprecationManager = new DeprecationManager({ rootPath: this.rootPath });
|
|
428
|
-
// await this.deprecationManager.initialize();
|
|
429
|
-
|
|
430
|
-
// Initialize usage tracker
|
|
431
|
-
// const UsageTracker = require('../scripts/usage-tracker'); // Archived in Story 3.18
|
|
432
|
-
// this.usageTracker = new UsageTracker({ rootPath: this.rootPath });
|
|
433
|
-
|
|
434
|
-
// Initialize component search
|
|
435
|
-
const ComponentSearch = require('../scripts/component-search');
|
|
436
|
-
this.componentSearch = new ComponentSearch({ rootPath: this.rootPath });
|
|
437
|
-
|
|
438
|
-
} catch (error) {
|
|
439
|
-
throw new Error(`Failed to initialize dependencies: ${error.message}`);
|
|
440
|
-
}
|
|
441
|
-
}
|
|
442
|
-
|
|
443
|
-
async findComponent(componentType, componentName) {
|
|
444
|
-
const component = await this.componentSearch.findComponent(componentType, componentName);
|
|
445
|
-
|
|
446
|
-
if (!component) {
|
|
447
|
-
// Suggest similar components
|
|
448
|
-
const suggestions = await this.componentSearch.findSimilarComponents(componentType, componentName);
|
|
449
|
-
if (suggestions.length > 0) {
|
|
450
|
-
console.log(chalk.yellow('\nDid you mean one of these?'));
|
|
451
|
-
suggestions.forEach(suggestion => {
|
|
452
|
-
console.log(chalk.gray(` - ${suggestion.type}/${suggestion.name}`));
|
|
453
|
-
});
|
|
454
|
-
}
|
|
455
|
-
return null;
|
|
456
|
-
}
|
|
457
|
-
|
|
458
|
-
return component;
|
|
459
|
-
}
|
|
460
|
-
|
|
461
|
-
async checkDeprecationStatus(component) {
|
|
462
|
-
return await this.deprecationManager.getDeprecationStatus(component.id);
|
|
463
|
-
}
|
|
464
|
-
|
|
465
|
-
async analyzeComponentUsage(component) {
|
|
466
|
-
const usageAnalysis = await this.usageTracker.analyzeComponentUsage(component.id, {
|
|
467
|
-
includeTests: false,
|
|
468
|
-
includeDocs: false,
|
|
469
|
-
scanDepth: 'full'
|
|
470
|
-
});
|
|
471
|
-
|
|
472
|
-
return {
|
|
473
|
-
usageCount: usageAnalysis.total_references,
|
|
474
|
-
usageLocations: usageAnalysis.usage_locations,
|
|
475
|
-
dependentComponents: usageAnalysis.dependent_components,
|
|
476
|
-
externalReferences: usageAnalysis.external_references
|
|
477
|
-
};
|
|
478
|
-
}
|
|
479
|
-
|
|
480
|
-
async generateDeprecationPlan(component, config, usageAnalysis) {
|
|
481
|
-
const plan = {
|
|
482
|
-
componentId: component.id,
|
|
483
|
-
componentType: component.type,
|
|
484
|
-
componentName: component.name,
|
|
485
|
-
deprecationTimestamp: new Date().toISOString(),
|
|
486
|
-
removalVersion: config.removalVersion || await this.calculateRemovalVersion(config.timeline),
|
|
487
|
-
replacement: config.replacement,
|
|
488
|
-
reason: config.reason || 'Component deprecated',
|
|
489
|
-
migrationGuide: config.migrationGuide,
|
|
490
|
-
immediate: config.immediate,
|
|
491
|
-
timeline: config.timeline,
|
|
492
|
-
severity: config.severity,
|
|
493
|
-
usageCount: usageAnalysis.usageCount,
|
|
494
|
-
migrationRequired: usageAnalysis.usageCount > 0,
|
|
495
|
-
affectedComponents: usageAnalysis.dependentComponents,
|
|
496
|
-
deprecationActions: [],
|
|
497
|
-
notifications: []
|
|
498
|
-
};
|
|
499
|
-
|
|
500
|
-
// Generate deprecation actions
|
|
501
|
-
plan.deprecationActions = await this.generateDeprecationActions(component, plan, usageAnalysis);
|
|
502
|
-
|
|
503
|
-
// Generate notification plan
|
|
504
|
-
plan.notifications = this.generateNotificationPlan(plan);
|
|
505
|
-
|
|
506
|
-
return plan;
|
|
507
|
-
}
|
|
508
|
-
|
|
509
|
-
async calculateRemovalVersion(timelineMonths) {
|
|
510
|
-
// Get current version from package.json or version tracker
|
|
511
|
-
try {
|
|
512
|
-
const packagePath = path.join(this.rootPath, 'package.json');
|
|
513
|
-
const packageContent = await fs.readFile(packagePath, 'utf-8');
|
|
514
|
-
const packageInfo = JSON.parse(packageContent);
|
|
515
|
-
const currentVersion = packageInfo.version || '1.0.0';
|
|
516
|
-
|
|
517
|
-
// Calculate removal version based on timeline
|
|
518
|
-
const [major, minor, patch] = currentVersion.split('.').map(Number);
|
|
519
|
-
|
|
520
|
-
if (timelineMonths >= 12) {
|
|
521
|
-
return `${major + 1}.0.0`;
|
|
522
|
-
} else if (timelineMonths >= 6) {
|
|
523
|
-
return `${major}.${minor + 1}.0`;
|
|
524
|
-
} else {
|
|
525
|
-
return `${major}.${minor}.${patch + 10}`;
|
|
526
|
-
}
|
|
527
|
-
} catch (error) {
|
|
528
|
-
return '2.0.0'; // Fallback version
|
|
529
|
-
}
|
|
530
|
-
}
|
|
531
|
-
|
|
532
|
-
async generateDeprecationActions(component, plan, usageAnalysis) {
|
|
533
|
-
const actions = [];
|
|
534
|
-
|
|
535
|
-
// Add deprecation metadata
|
|
536
|
-
actions.push({
|
|
537
|
-
type: 'add_deprecation_metadata',
|
|
538
|
-
description: 'Add deprecation metadata to component',
|
|
539
|
-
target: component.filePath,
|
|
540
|
-
metadata: {
|
|
541
|
-
deprecated: true,
|
|
542
|
-
deprecatedSince: plan.deprecationTimestamp,
|
|
543
|
-
removalPlanned: plan.removalVersion,
|
|
544
|
-
replacement: plan.replacement,
|
|
545
|
-
reason: plan.reason
|
|
546
|
-
}
|
|
547
|
-
});
|
|
548
|
-
|
|
549
|
-
// Add deprecation comments/warnings
|
|
550
|
-
actions.push({
|
|
551
|
-
type: 'add_deprecation_warnings',
|
|
552
|
-
description: 'Add deprecation warnings to component code',
|
|
553
|
-
target: component.filePath,
|
|
554
|
-
warningType: component.type === 'agent' ? 'yaml_comment' : 'code_comment'
|
|
555
|
-
});
|
|
556
|
-
|
|
557
|
-
// Update component registration
|
|
558
|
-
if (component.registrationFile) {
|
|
559
|
-
actions.push({
|
|
560
|
-
type: 'update_component_registry',
|
|
561
|
-
description: 'Mark component as deprecated in registry',
|
|
562
|
-
target: component.registrationFile,
|
|
563
|
-
deprecationStatus: true
|
|
564
|
-
});
|
|
565
|
-
}
|
|
566
|
-
|
|
567
|
-
// Generate usage warnings
|
|
568
|
-
if (usageAnalysis.usageCount > 0) {
|
|
569
|
-
for (const usage of usageAnalysis.usageLocations) {
|
|
570
|
-
actions.push({
|
|
571
|
-
type: 'add_usage_warning',
|
|
572
|
-
description: `Add deprecation warning at usage site: ${usage.file}`,
|
|
573
|
-
target: usage.file,
|
|
574
|
-
line: usage.line,
|
|
575
|
-
warningMessage: this.generateUsageWarning(component, plan)
|
|
576
|
-
});
|
|
577
|
-
}
|
|
578
|
-
}
|
|
579
|
-
|
|
580
|
-
return actions;
|
|
581
|
-
}
|
|
582
|
-
|
|
583
|
-
generateUsageWarning(component, plan) {
|
|
584
|
-
let warning = `DEPRECATED: ${component.type}/${component.name} is deprecated`;
|
|
585
|
-
|
|
586
|
-
if (plan.replacement) {
|
|
587
|
-
warning += ` - use ${plan.replacement} instead`;
|
|
588
|
-
}
|
|
589
|
-
|
|
590
|
-
if (plan.removalVersion) {
|
|
591
|
-
warning += ` (removal planned in ${plan.removalVersion})`;
|
|
592
|
-
}
|
|
593
|
-
|
|
594
|
-
return warning;
|
|
595
|
-
}
|
|
596
|
-
|
|
597
|
-
generateNotificationPlan(plan) {
|
|
598
|
-
const notifications = [];
|
|
599
|
-
|
|
600
|
-
// Immediate notification for high/critical severity
|
|
601
|
-
if (plan.severity === 'high' || plan.severity === 'critical') {
|
|
602
|
-
notifications.push({
|
|
603
|
-
type: 'immediate_alert',
|
|
604
|
-
message: `High priority deprecation: ${plan.componentType}/${plan.componentName}`,
|
|
605
|
-
channels: ['console', 'log']
|
|
606
|
-
});
|
|
607
|
-
}
|
|
608
|
-
|
|
609
|
-
// Timeline-based notifications
|
|
610
|
-
if (plan.timeline >= 6) {
|
|
611
|
-
notifications.push({
|
|
612
|
-
type: 'scheduled_reminder',
|
|
613
|
-
schedule: 'monthly',
|
|
614
|
-
message: `Reminder: ${plan.componentName} deprecation (${plan.timeline} months remaining)`
|
|
615
|
-
});
|
|
616
|
-
}
|
|
617
|
-
|
|
618
|
-
// Pre-removal warning
|
|
619
|
-
notifications.push({
|
|
620
|
-
type: 'pre_removal_warning',
|
|
621
|
-
schedule: '1_month_before_removal',
|
|
622
|
-
message: `Final warning: ${plan.componentName} will be removed in ${plan.removalVersion}`
|
|
623
|
-
});
|
|
624
|
-
|
|
625
|
-
return notifications;
|
|
626
|
-
}
|
|
627
|
-
|
|
628
|
-
async displayDeprecationSummary(component, plan) {
|
|
629
|
-
console.log(chalk.blue('\nš Deprecation Summary'));
|
|
630
|
-
console.log(chalk.gray('ā'.repeat(50)));
|
|
631
|
-
|
|
632
|
-
console.log(`Component: ${chalk.white(component.type)}/${chalk.white(component.name)}`);
|
|
633
|
-
console.log(`Location: ${chalk.gray(component.filePath)}`);
|
|
634
|
-
console.log(`Reason: ${chalk.yellow(plan.reason)}`);
|
|
635
|
-
console.log(`Severity: ${this.getSeverityColor(plan.severity)(plan.severity)}`);
|
|
636
|
-
console.log(`Timeline: ${chalk.white(plan.timeline)} months`);
|
|
637
|
-
console.log(`Removal Version: ${chalk.white(plan.removalVersion)}`);
|
|
638
|
-
|
|
639
|
-
if (plan.replacement) {
|
|
640
|
-
console.log(`Replacement: ${chalk.green(plan.replacement)}`);
|
|
641
|
-
}
|
|
642
|
-
|
|
643
|
-
if (plan.usageCount > 0) {
|
|
644
|
-
console.log(`\n${chalk.yellow('ā ļø Usage Analysis:')}`);
|
|
645
|
-
console.log(` Found ${chalk.white(plan.usageCount)} usage(s) across ${plan.affectedComponents.length} component(s)`);
|
|
646
|
-
}
|
|
647
|
-
|
|
648
|
-
console.log(`\n${chalk.blue('Planned Actions:')}`);
|
|
649
|
-
plan.deprecationActions.forEach((action, index) => {
|
|
650
|
-
console.log(` ${index + 1}. ${action.description}`);
|
|
651
|
-
});
|
|
652
|
-
}
|
|
653
|
-
|
|
654
|
-
getSeverityColor(severity) {
|
|
655
|
-
const colors = {
|
|
656
|
-
low: chalk.green,
|
|
657
|
-
medium: chalk.yellow,
|
|
658
|
-
high: chalk.orange || chalk.yellow,
|
|
659
|
-
critical: chalk.red
|
|
660
|
-
};
|
|
661
|
-
return colors[severity] || chalk.white;
|
|
662
|
-
}
|
|
663
|
-
|
|
664
|
-
async requestConfirmation(plan) {
|
|
665
|
-
const { confirmed } = await inquirer.prompt([{
|
|
666
|
-
type: 'confirm',
|
|
667
|
-
name: 'confirmed',
|
|
668
|
-
message: `Proceed with deprecating ${plan.componentType}/${plan.componentName}?`,
|
|
669
|
-
default: false
|
|
670
|
-
}]);
|
|
671
|
-
|
|
672
|
-
return confirmed;
|
|
673
|
-
}
|
|
674
|
-
|
|
675
|
-
async executeDeprecation(component, plan) {
|
|
676
|
-
const deprecationId = `dep-${Date.now()}-${Math.random().toString(36).substr(2, 6)}`;
|
|
677
|
-
|
|
678
|
-
console.log(chalk.gray('\nExecuting deprecation actions...'));
|
|
679
|
-
|
|
680
|
-
const results = {
|
|
681
|
-
deprecationId,
|
|
682
|
-
actionsExecuted: 0,
|
|
683
|
-
actionsFailed: 0,
|
|
684
|
-
errors: []
|
|
685
|
-
};
|
|
686
|
-
|
|
687
|
-
for (const action of plan.deprecationActions) {
|
|
688
|
-
try {
|
|
689
|
-
await this.executeDeprecationAction(action);
|
|
690
|
-
results.actionsExecuted++;
|
|
691
|
-
console.log(chalk.gray(` ā ${action.description}`));
|
|
692
|
-
} catch (error) {
|
|
693
|
-
results.actionsFailed++;
|
|
694
|
-
results.errors.push({
|
|
695
|
-
action: action.type,
|
|
696
|
-
error: error.message
|
|
697
|
-
});
|
|
698
|
-
console.log(chalk.red(` ā ${action.description}: ${error.message}`));
|
|
699
|
-
}
|
|
700
|
-
}
|
|
701
|
-
|
|
702
|
-
// Record deprecation in system
|
|
703
|
-
await this.deprecationManager.recordDeprecation(component.id, {
|
|
704
|
-
deprecationId,
|
|
705
|
-
timestamp: plan.deprecationTimestamp,
|
|
706
|
-
plan: plan,
|
|
707
|
-
results: results
|
|
708
|
-
});
|
|
709
|
-
|
|
710
|
-
return results;
|
|
711
|
-
}
|
|
712
|
-
|
|
713
|
-
async executeDeprecationAction(action) {
|
|
714
|
-
switch (action.type) {
|
|
715
|
-
case 'add_deprecation_metadata':
|
|
716
|
-
return await this.addDeprecationMetadata(action.target, action.metadata);
|
|
717
|
-
|
|
718
|
-
case 'add_deprecation_warnings':
|
|
719
|
-
return await this.addDeprecationWarnings(action.target, action.warningType);
|
|
720
|
-
|
|
721
|
-
case 'update_component_registry':
|
|
722
|
-
return await this.updateComponentRegistry(action.target, action.deprecationStatus);
|
|
723
|
-
|
|
724
|
-
case 'add_usage_warning':
|
|
725
|
-
return await this.addUsageWarning(action.target, action.line, action.warningMessage);
|
|
726
|
-
|
|
727
|
-
default:
|
|
728
|
-
throw new Error(`Unknown deprecation action type: ${action.type}`);
|
|
729
|
-
}
|
|
730
|
-
}
|
|
731
|
-
|
|
732
|
-
async addDeprecationMetadata(filePath, metadata) {
|
|
733
|
-
// Implementation depends on file type
|
|
734
|
-
// For now, add to a separate metadata file
|
|
735
|
-
const metadataPath = path.join(path.dirname(filePath), '.deprecation-metadata.json');
|
|
736
|
-
|
|
737
|
-
let existingMetadata = {};
|
|
738
|
-
try {
|
|
739
|
-
const content = await fs.readFile(metadataPath, 'utf-8');
|
|
740
|
-
existingMetadata = JSON.parse(content);
|
|
741
|
-
} catch (error) {
|
|
742
|
-
// File doesn't exist, start fresh
|
|
743
|
-
}
|
|
744
|
-
|
|
745
|
-
existingMetadata[path.basename(filePath)] = metadata;
|
|
746
|
-
|
|
747
|
-
await fs.writeFile(metadataPath, JSON.stringify(existingMetadata, null, 2));
|
|
748
|
-
}
|
|
749
|
-
|
|
750
|
-
async addDeprecationWarnings(filePath, warningType) {
|
|
751
|
-
const content = await fs.readFile(filePath, 'utf-8');
|
|
752
|
-
|
|
753
|
-
if (warningType === 'yaml_comment') {
|
|
754
|
-
// Add YAML comment for agent files
|
|
755
|
-
const warningComment = '# DEPRECATED: This agent is deprecated and will be removed in a future version\n';
|
|
756
|
-
const updatedContent = warningComment + content;
|
|
757
|
-
await fs.writeFile(filePath, updatedContent);
|
|
758
|
-
} else {
|
|
759
|
-
// Add code comment for other files
|
|
760
|
-
const warningComment = '// DEPRECATED: This component is deprecated and will be removed in a future version\n';
|
|
761
|
-
const updatedContent = warningComment + content;
|
|
762
|
-
await fs.writeFile(filePath, updatedContent);
|
|
763
|
-
}
|
|
764
|
-
}
|
|
765
|
-
|
|
766
|
-
async updateComponentRegistry(registryPath, deprecationStatus) {
|
|
767
|
-
// Update component registry to mark as deprecated
|
|
768
|
-
// Implementation would depend on registry format
|
|
769
|
-
console.log(chalk.gray(`Would update registry at ${registryPath}`));
|
|
770
|
-
}
|
|
771
|
-
|
|
772
|
-
async addUsageWarning(filePath, lineNumber, warningMessage) {
|
|
773
|
-
// Add deprecation warning comment near usage
|
|
774
|
-
console.log(chalk.gray(`Would add warning to ${filePath}:${lineNumber}: ${warningMessage}`));
|
|
775
|
-
}
|
|
776
|
-
|
|
777
|
-
async updateDocumentation(component, plan) {
|
|
778
|
-
// Update component documentation with deprecation notice
|
|
779
|
-
const docsPath = this.findComponentDocumentation(component);
|
|
780
|
-
if (docsPath) {
|
|
781
|
-
// Add deprecation notice to documentation
|
|
782
|
-
console.log(chalk.gray(`Updating documentation at ${docsPath}`));
|
|
783
|
-
}
|
|
784
|
-
}
|
|
785
|
-
|
|
786
|
-
async generateMigrationArtifacts(component, plan) {
|
|
787
|
-
if (!plan.replacement) return;
|
|
788
|
-
|
|
789
|
-
// Generate migration guide
|
|
790
|
-
const migrationGuidePath = path.join(
|
|
791
|
-
this.rootPath,
|
|
792
|
-
'docs',
|
|
793
|
-
'migrations',
|
|
794
|
-
`${component.name}-to-${plan.replacement}.md`
|
|
795
|
-
);
|
|
796
|
-
|
|
797
|
-
const migrationGuideContent = this.generateMigrationGuideContent(component, plan);
|
|
798
|
-
|
|
799
|
-
await fs.mkdir(path.dirname(migrationGuidePath), { recursive: true });
|
|
800
|
-
await fs.writeFile(migrationGuidePath, migrationGuideContent);
|
|
801
|
-
|
|
802
|
-
console.log(chalk.gray(`Generated migration guide: ${migrationGuidePath}`));
|
|
803
|
-
}
|
|
804
|
-
|
|
805
|
-
generateMigrationGuideContent(component, plan) {
|
|
806
|
-
return `# Migration Guide: ${component.name} ā ${plan.replacement}
|
|
807
|
-
|
|
808
|
-
## Overview
|
|
809
|
-
The ${component.type} \`${component.name}\` has been deprecated and will be removed in version ${plan.removalVersion}.
|
|
810
|
-
|
|
811
|
-
## Reason for Deprecation
|
|
812
|
-
${plan.reason}
|
|
813
|
-
|
|
814
|
-
## Migration Steps
|
|
815
|
-
1. Replace usage of \`${component.name}\` with \`${plan.replacement}\`
|
|
816
|
-
2. Update any configuration references
|
|
817
|
-
3. Test the replacement functionality
|
|
818
|
-
4. Remove any deprecated imports/references
|
|
819
|
-
|
|
820
|
-
## Timeline
|
|
821
|
-
- Deprecated: ${new Date(plan.deprecationTimestamp).toLocaleDateString()}
|
|
822
|
-
- Removal planned: Version ${plan.removalVersion}
|
|
823
|
-
- Timeline: ${plan.timeline} months
|
|
824
|
-
|
|
825
|
-
## Need Help?
|
|
826
|
-
If you encounter issues during migration, please refer to the documentation or contact support.
|
|
827
|
-
`;
|
|
828
|
-
}
|
|
829
|
-
|
|
830
|
-
async scheduleDeprecationTasks(component, plan) {
|
|
831
|
-
// Schedule future tasks for deprecation timeline
|
|
832
|
-
const tasks = [
|
|
833
|
-
{
|
|
834
|
-
type: 'deprecation_reminder',
|
|
835
|
-
scheduledFor: this.calculateReminderDate(plan.timeline),
|
|
836
|
-
component: component.id,
|
|
837
|
-
message: `Deprecation reminder for ${component.name}`
|
|
838
|
-
},
|
|
839
|
-
{
|
|
840
|
-
type: 'removal_preparation',
|
|
841
|
-
scheduledFor: this.calculateRemovalDate(plan.timeline),
|
|
842
|
-
component: component.id,
|
|
843
|
-
message: `Prepare for removal of ${component.name}`
|
|
844
|
-
}
|
|
845
|
-
];
|
|
846
|
-
|
|
847
|
-
for (const task of tasks) {
|
|
848
|
-
await this.deprecationManager.scheduleTask(task);
|
|
849
|
-
}
|
|
850
|
-
}
|
|
851
|
-
|
|
852
|
-
calculateReminderDate(timelineMonths) {
|
|
853
|
-
const reminderDate = new Date();
|
|
854
|
-
reminderDate.setMonth(reminderDate.getMonth() + Math.floor(timelineMonths / 2));
|
|
855
|
-
return reminderDate.toISOString();
|
|
856
|
-
}
|
|
857
|
-
|
|
858
|
-
calculateRemovalDate(timelineMonths) {
|
|
859
|
-
const removalDate = new Date();
|
|
860
|
-
removalDate.setMonth(removalDate.getMonth() + timelineMonths);
|
|
861
|
-
return removalDate.toISOString();
|
|
862
|
-
}
|
|
863
|
-
|
|
864
|
-
findComponentDocumentation(component) {
|
|
865
|
-
// Find documentation file for component
|
|
866
|
-
return null; // Placeholder
|
|
867
|
-
}
|
|
868
|
-
|
|
869
|
-
async displayDeprecationInfo(component, deprecationStatus) {
|
|
870
|
-
console.log(chalk.blue('\nš Current Deprecation Status'));
|
|
871
|
-
console.log(chalk.gray('ā'.repeat(50)));
|
|
872
|
-
|
|
873
|
-
console.log(`Component: ${component.type}/${component.name}`);
|
|
874
|
-
console.log(`Deprecated Since: ${new Date(deprecationStatus.deprecatedSince).toLocaleDateString()}`);
|
|
875
|
-
console.log(`Removal Planned: ${deprecationStatus.removalVersion}`);
|
|
876
|
-
console.log(`Reason: ${deprecationStatus.reason}`);
|
|
877
|
-
|
|
878
|
-
if (deprecationStatus.replacement) {
|
|
879
|
-
console.log(`Replacement: ${deprecationStatus.replacement}`);
|
|
880
|
-
}
|
|
881
|
-
}
|
|
882
|
-
}
|
|
883
|
-
|
|
884
|
-
module.exports = DeprecateComponentTask;
|
|
885
|
-
```
|
|
886
|
-
|
|
887
|
-
## Validation Rules
|
|
888
|
-
|
|
889
|
-
### Input Validation
|
|
890
|
-
- Component type must be valid (agent, task, workflow, util)
|
|
891
|
-
- Component must exist in the framework
|
|
892
|
-
- Severity must be valid level
|
|
893
|
-
- Timeline must be positive number
|
|
894
|
-
|
|
895
|
-
### Safety Checks
|
|
896
|
-
- Warn if component has high usage
|
|
897
|
-
- Require confirmation for critical components
|
|
898
|
-
- Prevent accidental deprecation of core components
|
|
899
|
-
|
|
900
|
-
### Deprecation Requirements
|
|
901
|
-
- Must specify removal timeline
|
|
902
|
-
- Should provide replacement when available
|
|
903
|
-
- Must include deprecation reason
|
|
904
|
-
- Should generate migration artifacts
|
|
905
|
-
|
|
906
|
-
## Integration Points
|
|
907
|
-
|
|
908
|
-
### Deprecation Manager
|
|
909
|
-
- Records deprecation metadata
|
|
910
|
-
- Tracks deprecation timeline
|
|
911
|
-
- Manages scheduled tasks
|
|
912
|
-
- Provides deprecation status
|
|
913
|
-
|
|
914
|
-
### Usage Tracker
|
|
915
|
-
- Analyzes component usage across codebase
|
|
916
|
-
- Identifies dependent components
|
|
917
|
-
- Tracks usage patterns over time
|
|
918
|
-
- Provides impact analysis
|
|
919
|
-
|
|
920
|
-
### Migration Generator
|
|
921
|
-
- Creates migration guides
|
|
922
|
-
- Generates replacement suggestions
|
|
923
|
-
- Provides automated migration scripts
|
|
924
|
-
- Tracks migration progress
|
|
925
|
-
|
|
926
|
-
## Output Structure
|
|
927
|
-
|
|
928
|
-
### Success Response
|
|
929
|
-
```json
|
|
930
|
-
{
|
|
931
|
-
"success": true,
|
|
932
|
-
"deprecationId": "dep-1234567890-abc123",
|
|
933
|
-
"component": {
|
|
934
|
-
"type": "agent",
|
|
935
|
-
"name": "weather-fetcher",
|
|
936
|
-
"filePath": "/path/to/component"
|
|
937
|
-
},
|
|
938
|
-
"timeline": 6,
|
|
939
|
-
"usageCount": 3,
|
|
940
|
-
"migrationRequired": true
|
|
941
|
-
}
|
|
942
|
-
```
|
|
943
|
-
|
|
944
|
-
### Error Response
|
|
945
|
-
```json
|
|
946
|
-
{
|
|
947
|
-
"success": false,
|
|
948
|
-
"error": "Component not found: agent/invalid-name",
|
|
949
|
-
"suggestions": ["weather-service", "weather-api"]
|
|
950
|
-
}
|
|
951
|
-
```
|
|
952
|
-
|
|
953
|
-
## Security Considerations
|
|
954
|
-
- Validate all file paths to prevent directory traversal
|
|
955
|
-
- Sanitize user input for deprecation reasons
|
|
956
|
-
- Require appropriate permissions for component modification
|
|
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: deprecateComponent()
|
|
30
|
+
responsƔvel: Dex (Builder)
|
|
31
|
+
responsavel_type: Agente
|
|
32
|
+
atomic_layer: Molecule
|
|
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: 2-5 min (estimated)
|
|
180
|
+
cost_estimated: $0.001-0.003
|
|
181
|
+
token_usage: ~1,000-3,000 tokens
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
**Optimization Notes:**
|
|
185
|
+
- Parallelize independent operations; reuse atom results; implement early exits
|
|
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
|
+
- automation
|
|
198
|
+
- workflow
|
|
199
|
+
updated_at: 2025-11-17
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
tools:
|
|
205
|
+
- github-cli
|
|
206
|
+
# TODO: Create deprecation-checklist.md for validation (follow-up story needed)
|
|
207
|
+
# checklists:
|
|
208
|
+
# - deprecation-checklist.md
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
# Deprecate Component - AIOS Developer Task
|
|
212
|
+
|
|
213
|
+
## Purpose
|
|
214
|
+
Mark framework components as deprecated with timeline management and migration path generation.
|
|
215
|
+
|
|
216
|
+
## Command Pattern
|
|
217
|
+
```
|
|
218
|
+
*deprecate-component <component-type> <component-name> [options]
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
## Parameters
|
|
222
|
+
- `component-type`: Type of component (agent, task, workflow, util)
|
|
223
|
+
- `component-name`: Name/ID of the component to deprecate
|
|
224
|
+
- `options`: Deprecation configuration and timeline
|
|
225
|
+
|
|
226
|
+
### Options
|
|
227
|
+
- `--removal-version <version>`: Target version for removal (default: next major)
|
|
228
|
+
- `--replacement <name>`: Replacement component name
|
|
229
|
+
- `--reason <text>`: Deprecation reason
|
|
230
|
+
- `--migration-guide <path>`: Path to migration guide
|
|
231
|
+
- `--immediate`: Mark for immediate deprecation warnings
|
|
232
|
+
- `--timeline <months>`: Deprecation timeline in months (default: 6)
|
|
233
|
+
- `--severity <level>`: Deprecation severity (low, medium, high, critical)
|
|
234
|
+
|
|
235
|
+
## Examples
|
|
236
|
+
```bash
|
|
237
|
+
# Deprecate an agent with replacement
|
|
238
|
+
*deprecate-component agent weather-fetcher --replacement weather-service --reason "Performance optimization" --timeline 3
|
|
239
|
+
|
|
240
|
+
# Deprecate a utility with migration guide
|
|
241
|
+
*deprecate-component util old-logger --replacement @aios/logger --migration-guide docs/migration/logger.md --severity high
|
|
242
|
+
|
|
243
|
+
# Immediate deprecation for security issue
|
|
244
|
+
*deprecate-component task insecure-parser --immediate --reason "Security vulnerability" --severity critical
|
|
245
|
+
|
|
246
|
+
# Deprecate workflow with custom removal version
|
|
247
|
+
*deprecate-component workflow legacy-processor --removal-version 3.0.0 --timeline 12
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
## Implementation
|
|
251
|
+
|
|
252
|
+
```javascript
|
|
253
|
+
const fs = require('fs').promises;
|
|
254
|
+
const path = require('path');
|
|
255
|
+
const chalk = require('chalk');
|
|
256
|
+
const inquirer = require('inquirer');
|
|
257
|
+
|
|
258
|
+
class DeprecateComponentTask {
|
|
259
|
+
constructor() {
|
|
260
|
+
this.taskName = 'deprecate-component';
|
|
261
|
+
this.description = 'Mark framework components as deprecated with timeline management';
|
|
262
|
+
this.rootPath = process.cwd();
|
|
263
|
+
this.deprecationManager = null;
|
|
264
|
+
this.usageTracker = null;
|
|
265
|
+
this.componentSearch = null;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
async execute(params) {
|
|
269
|
+
try {
|
|
270
|
+
console.log(chalk.blue('š« AIOS Component Deprecation'));
|
|
271
|
+
console.log(chalk.gray('Marking component as deprecated with timeline management\n'));
|
|
272
|
+
|
|
273
|
+
// Parse and validate parameters
|
|
274
|
+
const config = await this.parseParameters(params);
|
|
275
|
+
|
|
276
|
+
// Initialize dependencies
|
|
277
|
+
await this.initializeDependencies();
|
|
278
|
+
|
|
279
|
+
// Find target component
|
|
280
|
+
const component = await this.findComponent(config.componentType, config.componentName);
|
|
281
|
+
if (!component) {
|
|
282
|
+
throw new Error(`Component not found: ${config.componentType}/${config.componentName}`);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// Check current deprecation status
|
|
286
|
+
const currentStatus = await this.checkDeprecationStatus(component);
|
|
287
|
+
if (currentStatus.deprecated && !config.force) {
|
|
288
|
+
console.log(chalk.yellow(`ā ļø Component ${component.name} is already deprecated`));
|
|
289
|
+
|
|
290
|
+
const { action } = await inquirer.prompt([{
|
|
291
|
+
type: 'list',
|
|
292
|
+
name: 'action',
|
|
293
|
+
message: 'Component is already deprecated. What would you like to do?',
|
|
294
|
+
choices: [
|
|
295
|
+
{ name: 'Update deprecation details', value: 'update' },
|
|
296
|
+
{ name: 'View current deprecation info', value: 'view' },
|
|
297
|
+
{ name: 'Cancel operation', value: 'cancel' }
|
|
298
|
+
]
|
|
299
|
+
}]);
|
|
300
|
+
|
|
301
|
+
if (action === 'cancel') {
|
|
302
|
+
console.log(chalk.gray('Operation cancelled'));
|
|
303
|
+
return;
|
|
304
|
+
} else if (action === 'view') {
|
|
305
|
+
await this.displayDeprecationInfo(component, currentStatus);
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// Analyze component usage
|
|
311
|
+
console.log(chalk.gray('Analyzing component usage...'));
|
|
312
|
+
const usageAnalysis = await this.analyzeComponentUsage(component);
|
|
313
|
+
|
|
314
|
+
// Generate deprecation plan
|
|
315
|
+
const deprecationPlan = await this.generateDeprecationPlan(component, config, usageAnalysis);
|
|
316
|
+
|
|
317
|
+
// Display deprecation summary
|
|
318
|
+
await this.displayDeprecationSummary(component, deprecationPlan);
|
|
319
|
+
|
|
320
|
+
// Request confirmation
|
|
321
|
+
const confirmed = await this.requestConfirmation(deprecationPlan);
|
|
322
|
+
if (!confirmed) {
|
|
323
|
+
console.log(chalk.gray('Deprecation cancelled'));
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
// Execute deprecation
|
|
328
|
+
const deprecationResult = await this.executeDeprecation(component, deprecationPlan);
|
|
329
|
+
|
|
330
|
+
// Update documentation
|
|
331
|
+
await this.updateDocumentation(component, deprecationPlan);
|
|
332
|
+
|
|
333
|
+
// Generate migration artifacts
|
|
334
|
+
if (deprecationPlan.migrationRequired) {
|
|
335
|
+
await this.generateMigrationArtifacts(component, deprecationPlan);
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
// Schedule deprecation tasks
|
|
339
|
+
await this.scheduleDeprecationTasks(component, deprecationPlan);
|
|
340
|
+
|
|
341
|
+
// Display success summary
|
|
342
|
+
console.log(chalk.green('\nā
Component deprecation completed successfully'));
|
|
343
|
+
console.log(chalk.gray(` Component: ${component.type}/${component.name}`));
|
|
344
|
+
console.log(chalk.gray(` Deprecation ID: ${deprecationResult.deprecationId}`));
|
|
345
|
+
console.log(chalk.gray(` Timeline: ${deprecationPlan.timeline} months`));
|
|
346
|
+
console.log(chalk.gray(` Removal planned: ${deprecationPlan.removalVersion}`));
|
|
347
|
+
|
|
348
|
+
if (deprecationPlan.usageCount > 0) {
|
|
349
|
+
console.log(chalk.yellow(` ā ļø Found ${deprecationPlan.usageCount} usage(s) that need migration`));
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
return {
|
|
353
|
+
success: true,
|
|
354
|
+
deprecationId: deprecationResult.deprecationId,
|
|
355
|
+
component: component,
|
|
356
|
+
timeline: deprecationPlan.timeline,
|
|
357
|
+
usageCount: deprecationPlan.usageCount,
|
|
358
|
+
migrationRequired: deprecationPlan.migrationRequired
|
|
359
|
+
};
|
|
360
|
+
|
|
361
|
+
} catch (error) {
|
|
362
|
+
console.error(chalk.red(`\nā Component deprecation failed: ${error.message}`));
|
|
363
|
+
throw error;
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
async parseParameters(params) {
|
|
368
|
+
if (params.length < 2) {
|
|
369
|
+
throw new Error('Usage: *deprecate-component <component-type> <component-name> [options]');
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
const config = {
|
|
373
|
+
componentType: params[0],
|
|
374
|
+
componentName: params[1],
|
|
375
|
+
removalVersion: null,
|
|
376
|
+
replacement: null,
|
|
377
|
+
reason: null,
|
|
378
|
+
migrationGuide: null,
|
|
379
|
+
immediate: false,
|
|
380
|
+
timeline: 6,
|
|
381
|
+
severity: 'medium',
|
|
382
|
+
force: false
|
|
383
|
+
};
|
|
384
|
+
|
|
385
|
+
// Parse options
|
|
386
|
+
for (let i = 2; i < params.length; i++) {
|
|
387
|
+
const param = params[i];
|
|
388
|
+
|
|
389
|
+
if (param === '--immediate') {
|
|
390
|
+
config.immediate = true;
|
|
391
|
+
} else if (param === '--force') {
|
|
392
|
+
config.force = true;
|
|
393
|
+
} else if (param.startsWith('--removal-version') && params[i + 1]) {
|
|
394
|
+
config.removalVersion = params[++i];
|
|
395
|
+
} else if (param.startsWith('--replacement') && params[i + 1]) {
|
|
396
|
+
config.replacement = params[++i];
|
|
397
|
+
} else if (param.startsWith('--reason') && params[i + 1]) {
|
|
398
|
+
config.reason = params[++i];
|
|
399
|
+
} else if (param.startsWith('--migration-guide') && params[i + 1]) {
|
|
400
|
+
config.migrationGuide = params[++i];
|
|
401
|
+
} else if (param.startsWith('--timeline') && params[i + 1]) {
|
|
402
|
+
config.timeline = parseInt(params[++i]) || 6;
|
|
403
|
+
} else if (param.startsWith('--severity') && params[i + 1]) {
|
|
404
|
+
config.severity = params[++i];
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
// Validate component type
|
|
409
|
+
const validTypes = ['agent', 'task', 'workflow', 'util'];
|
|
410
|
+
if (!validTypes.includes(config.componentType)) {
|
|
411
|
+
throw new Error(`Invalid component type: ${config.componentType}. Must be one of: ${validTypes.join(', ')}`);
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
// Validate severity
|
|
415
|
+
const validSeverities = ['low', 'medium', 'high', 'critical'];
|
|
416
|
+
if (!validSeverities.includes(config.severity)) {
|
|
417
|
+
throw new Error(`Invalid severity: ${config.severity}. Must be one of: ${validSeverities.join(', ')}`);
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
return config;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
async initializeDependencies() {
|
|
424
|
+
try {
|
|
425
|
+
// Initialize deprecation manager
|
|
426
|
+
// const DeprecationManager = require('../scripts/deprecation-manager'); // Archived in Story 3.18
|
|
427
|
+
// this.deprecationManager = new DeprecationManager({ rootPath: this.rootPath });
|
|
428
|
+
// await this.deprecationManager.initialize();
|
|
429
|
+
|
|
430
|
+
// Initialize usage tracker
|
|
431
|
+
// const UsageTracker = require('../scripts/usage-tracker'); // Archived in Story 3.18
|
|
432
|
+
// this.usageTracker = new UsageTracker({ rootPath: this.rootPath });
|
|
433
|
+
|
|
434
|
+
// Initialize component search
|
|
435
|
+
const ComponentSearch = require('../scripts/component-search');
|
|
436
|
+
this.componentSearch = new ComponentSearch({ rootPath: this.rootPath });
|
|
437
|
+
|
|
438
|
+
} catch (error) {
|
|
439
|
+
throw new Error(`Failed to initialize dependencies: ${error.message}`);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
async findComponent(componentType, componentName) {
|
|
444
|
+
const component = await this.componentSearch.findComponent(componentType, componentName);
|
|
445
|
+
|
|
446
|
+
if (!component) {
|
|
447
|
+
// Suggest similar components
|
|
448
|
+
const suggestions = await this.componentSearch.findSimilarComponents(componentType, componentName);
|
|
449
|
+
if (suggestions.length > 0) {
|
|
450
|
+
console.log(chalk.yellow('\nDid you mean one of these?'));
|
|
451
|
+
suggestions.forEach(suggestion => {
|
|
452
|
+
console.log(chalk.gray(` - ${suggestion.type}/${suggestion.name}`));
|
|
453
|
+
});
|
|
454
|
+
}
|
|
455
|
+
return null;
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
return component;
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
async checkDeprecationStatus(component) {
|
|
462
|
+
return await this.deprecationManager.getDeprecationStatus(component.id);
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
async analyzeComponentUsage(component) {
|
|
466
|
+
const usageAnalysis = await this.usageTracker.analyzeComponentUsage(component.id, {
|
|
467
|
+
includeTests: false,
|
|
468
|
+
includeDocs: false,
|
|
469
|
+
scanDepth: 'full'
|
|
470
|
+
});
|
|
471
|
+
|
|
472
|
+
return {
|
|
473
|
+
usageCount: usageAnalysis.total_references,
|
|
474
|
+
usageLocations: usageAnalysis.usage_locations,
|
|
475
|
+
dependentComponents: usageAnalysis.dependent_components,
|
|
476
|
+
externalReferences: usageAnalysis.external_references
|
|
477
|
+
};
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
async generateDeprecationPlan(component, config, usageAnalysis) {
|
|
481
|
+
const plan = {
|
|
482
|
+
componentId: component.id,
|
|
483
|
+
componentType: component.type,
|
|
484
|
+
componentName: component.name,
|
|
485
|
+
deprecationTimestamp: new Date().toISOString(),
|
|
486
|
+
removalVersion: config.removalVersion || await this.calculateRemovalVersion(config.timeline),
|
|
487
|
+
replacement: config.replacement,
|
|
488
|
+
reason: config.reason || 'Component deprecated',
|
|
489
|
+
migrationGuide: config.migrationGuide,
|
|
490
|
+
immediate: config.immediate,
|
|
491
|
+
timeline: config.timeline,
|
|
492
|
+
severity: config.severity,
|
|
493
|
+
usageCount: usageAnalysis.usageCount,
|
|
494
|
+
migrationRequired: usageAnalysis.usageCount > 0,
|
|
495
|
+
affectedComponents: usageAnalysis.dependentComponents,
|
|
496
|
+
deprecationActions: [],
|
|
497
|
+
notifications: []
|
|
498
|
+
};
|
|
499
|
+
|
|
500
|
+
// Generate deprecation actions
|
|
501
|
+
plan.deprecationActions = await this.generateDeprecationActions(component, plan, usageAnalysis);
|
|
502
|
+
|
|
503
|
+
// Generate notification plan
|
|
504
|
+
plan.notifications = this.generateNotificationPlan(plan);
|
|
505
|
+
|
|
506
|
+
return plan;
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
async calculateRemovalVersion(timelineMonths) {
|
|
510
|
+
// Get current version from package.json or version tracker
|
|
511
|
+
try {
|
|
512
|
+
const packagePath = path.join(this.rootPath, 'package.json');
|
|
513
|
+
const packageContent = await fs.readFile(packagePath, 'utf-8');
|
|
514
|
+
const packageInfo = JSON.parse(packageContent);
|
|
515
|
+
const currentVersion = packageInfo.version || '1.0.0';
|
|
516
|
+
|
|
517
|
+
// Calculate removal version based on timeline
|
|
518
|
+
const [major, minor, patch] = currentVersion.split('.').map(Number);
|
|
519
|
+
|
|
520
|
+
if (timelineMonths >= 12) {
|
|
521
|
+
return `${major + 1}.0.0`;
|
|
522
|
+
} else if (timelineMonths >= 6) {
|
|
523
|
+
return `${major}.${minor + 1}.0`;
|
|
524
|
+
} else {
|
|
525
|
+
return `${major}.${minor}.${patch + 10}`;
|
|
526
|
+
}
|
|
527
|
+
} catch (error) {
|
|
528
|
+
return '2.0.0'; // Fallback version
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
async generateDeprecationActions(component, plan, usageAnalysis) {
|
|
533
|
+
const actions = [];
|
|
534
|
+
|
|
535
|
+
// Add deprecation metadata
|
|
536
|
+
actions.push({
|
|
537
|
+
type: 'add_deprecation_metadata',
|
|
538
|
+
description: 'Add deprecation metadata to component',
|
|
539
|
+
target: component.filePath,
|
|
540
|
+
metadata: {
|
|
541
|
+
deprecated: true,
|
|
542
|
+
deprecatedSince: plan.deprecationTimestamp,
|
|
543
|
+
removalPlanned: plan.removalVersion,
|
|
544
|
+
replacement: plan.replacement,
|
|
545
|
+
reason: plan.reason
|
|
546
|
+
}
|
|
547
|
+
});
|
|
548
|
+
|
|
549
|
+
// Add deprecation comments/warnings
|
|
550
|
+
actions.push({
|
|
551
|
+
type: 'add_deprecation_warnings',
|
|
552
|
+
description: 'Add deprecation warnings to component code',
|
|
553
|
+
target: component.filePath,
|
|
554
|
+
warningType: component.type === 'agent' ? 'yaml_comment' : 'code_comment'
|
|
555
|
+
});
|
|
556
|
+
|
|
557
|
+
// Update component registration
|
|
558
|
+
if (component.registrationFile) {
|
|
559
|
+
actions.push({
|
|
560
|
+
type: 'update_component_registry',
|
|
561
|
+
description: 'Mark component as deprecated in registry',
|
|
562
|
+
target: component.registrationFile,
|
|
563
|
+
deprecationStatus: true
|
|
564
|
+
});
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
// Generate usage warnings
|
|
568
|
+
if (usageAnalysis.usageCount > 0) {
|
|
569
|
+
for (const usage of usageAnalysis.usageLocations) {
|
|
570
|
+
actions.push({
|
|
571
|
+
type: 'add_usage_warning',
|
|
572
|
+
description: `Add deprecation warning at usage site: ${usage.file}`,
|
|
573
|
+
target: usage.file,
|
|
574
|
+
line: usage.line,
|
|
575
|
+
warningMessage: this.generateUsageWarning(component, plan)
|
|
576
|
+
});
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
return actions;
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
generateUsageWarning(component, plan) {
|
|
584
|
+
let warning = `DEPRECATED: ${component.type}/${component.name} is deprecated`;
|
|
585
|
+
|
|
586
|
+
if (plan.replacement) {
|
|
587
|
+
warning += ` - use ${plan.replacement} instead`;
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
if (plan.removalVersion) {
|
|
591
|
+
warning += ` (removal planned in ${plan.removalVersion})`;
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
return warning;
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
generateNotificationPlan(plan) {
|
|
598
|
+
const notifications = [];
|
|
599
|
+
|
|
600
|
+
// Immediate notification for high/critical severity
|
|
601
|
+
if (plan.severity === 'high' || plan.severity === 'critical') {
|
|
602
|
+
notifications.push({
|
|
603
|
+
type: 'immediate_alert',
|
|
604
|
+
message: `High priority deprecation: ${plan.componentType}/${plan.componentName}`,
|
|
605
|
+
channels: ['console', 'log']
|
|
606
|
+
});
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
// Timeline-based notifications
|
|
610
|
+
if (plan.timeline >= 6) {
|
|
611
|
+
notifications.push({
|
|
612
|
+
type: 'scheduled_reminder',
|
|
613
|
+
schedule: 'monthly',
|
|
614
|
+
message: `Reminder: ${plan.componentName} deprecation (${plan.timeline} months remaining)`
|
|
615
|
+
});
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
// Pre-removal warning
|
|
619
|
+
notifications.push({
|
|
620
|
+
type: 'pre_removal_warning',
|
|
621
|
+
schedule: '1_month_before_removal',
|
|
622
|
+
message: `Final warning: ${plan.componentName} will be removed in ${plan.removalVersion}`
|
|
623
|
+
});
|
|
624
|
+
|
|
625
|
+
return notifications;
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
async displayDeprecationSummary(component, plan) {
|
|
629
|
+
console.log(chalk.blue('\nš Deprecation Summary'));
|
|
630
|
+
console.log(chalk.gray('ā'.repeat(50)));
|
|
631
|
+
|
|
632
|
+
console.log(`Component: ${chalk.white(component.type)}/${chalk.white(component.name)}`);
|
|
633
|
+
console.log(`Location: ${chalk.gray(component.filePath)}`);
|
|
634
|
+
console.log(`Reason: ${chalk.yellow(plan.reason)}`);
|
|
635
|
+
console.log(`Severity: ${this.getSeverityColor(plan.severity)(plan.severity)}`);
|
|
636
|
+
console.log(`Timeline: ${chalk.white(plan.timeline)} months`);
|
|
637
|
+
console.log(`Removal Version: ${chalk.white(plan.removalVersion)}`);
|
|
638
|
+
|
|
639
|
+
if (plan.replacement) {
|
|
640
|
+
console.log(`Replacement: ${chalk.green(plan.replacement)}`);
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
if (plan.usageCount > 0) {
|
|
644
|
+
console.log(`\n${chalk.yellow('ā ļø Usage Analysis:')}`);
|
|
645
|
+
console.log(` Found ${chalk.white(plan.usageCount)} usage(s) across ${plan.affectedComponents.length} component(s)`);
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
console.log(`\n${chalk.blue('Planned Actions:')}`);
|
|
649
|
+
plan.deprecationActions.forEach((action, index) => {
|
|
650
|
+
console.log(` ${index + 1}. ${action.description}`);
|
|
651
|
+
});
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
getSeverityColor(severity) {
|
|
655
|
+
const colors = {
|
|
656
|
+
low: chalk.green,
|
|
657
|
+
medium: chalk.yellow,
|
|
658
|
+
high: chalk.orange || chalk.yellow,
|
|
659
|
+
critical: chalk.red
|
|
660
|
+
};
|
|
661
|
+
return colors[severity] || chalk.white;
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
async requestConfirmation(plan) {
|
|
665
|
+
const { confirmed } = await inquirer.prompt([{
|
|
666
|
+
type: 'confirm',
|
|
667
|
+
name: 'confirmed',
|
|
668
|
+
message: `Proceed with deprecating ${plan.componentType}/${plan.componentName}?`,
|
|
669
|
+
default: false
|
|
670
|
+
}]);
|
|
671
|
+
|
|
672
|
+
return confirmed;
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
async executeDeprecation(component, plan) {
|
|
676
|
+
const deprecationId = `dep-${Date.now()}-${Math.random().toString(36).substr(2, 6)}`;
|
|
677
|
+
|
|
678
|
+
console.log(chalk.gray('\nExecuting deprecation actions...'));
|
|
679
|
+
|
|
680
|
+
const results = {
|
|
681
|
+
deprecationId,
|
|
682
|
+
actionsExecuted: 0,
|
|
683
|
+
actionsFailed: 0,
|
|
684
|
+
errors: []
|
|
685
|
+
};
|
|
686
|
+
|
|
687
|
+
for (const action of plan.deprecationActions) {
|
|
688
|
+
try {
|
|
689
|
+
await this.executeDeprecationAction(action);
|
|
690
|
+
results.actionsExecuted++;
|
|
691
|
+
console.log(chalk.gray(` ā ${action.description}`));
|
|
692
|
+
} catch (error) {
|
|
693
|
+
results.actionsFailed++;
|
|
694
|
+
results.errors.push({
|
|
695
|
+
action: action.type,
|
|
696
|
+
error: error.message
|
|
697
|
+
});
|
|
698
|
+
console.log(chalk.red(` ā ${action.description}: ${error.message}`));
|
|
699
|
+
}
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
// Record deprecation in system
|
|
703
|
+
await this.deprecationManager.recordDeprecation(component.id, {
|
|
704
|
+
deprecationId,
|
|
705
|
+
timestamp: plan.deprecationTimestamp,
|
|
706
|
+
plan: plan,
|
|
707
|
+
results: results
|
|
708
|
+
});
|
|
709
|
+
|
|
710
|
+
return results;
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
async executeDeprecationAction(action) {
|
|
714
|
+
switch (action.type) {
|
|
715
|
+
case 'add_deprecation_metadata':
|
|
716
|
+
return await this.addDeprecationMetadata(action.target, action.metadata);
|
|
717
|
+
|
|
718
|
+
case 'add_deprecation_warnings':
|
|
719
|
+
return await this.addDeprecationWarnings(action.target, action.warningType);
|
|
720
|
+
|
|
721
|
+
case 'update_component_registry':
|
|
722
|
+
return await this.updateComponentRegistry(action.target, action.deprecationStatus);
|
|
723
|
+
|
|
724
|
+
case 'add_usage_warning':
|
|
725
|
+
return await this.addUsageWarning(action.target, action.line, action.warningMessage);
|
|
726
|
+
|
|
727
|
+
default:
|
|
728
|
+
throw new Error(`Unknown deprecation action type: ${action.type}`);
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
async addDeprecationMetadata(filePath, metadata) {
|
|
733
|
+
// Implementation depends on file type
|
|
734
|
+
// For now, add to a separate metadata file
|
|
735
|
+
const metadataPath = path.join(path.dirname(filePath), '.deprecation-metadata.json');
|
|
736
|
+
|
|
737
|
+
let existingMetadata = {};
|
|
738
|
+
try {
|
|
739
|
+
const content = await fs.readFile(metadataPath, 'utf-8');
|
|
740
|
+
existingMetadata = JSON.parse(content);
|
|
741
|
+
} catch (error) {
|
|
742
|
+
// File doesn't exist, start fresh
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
existingMetadata[path.basename(filePath)] = metadata;
|
|
746
|
+
|
|
747
|
+
await fs.writeFile(metadataPath, JSON.stringify(existingMetadata, null, 2));
|
|
748
|
+
}
|
|
749
|
+
|
|
750
|
+
async addDeprecationWarnings(filePath, warningType) {
|
|
751
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
752
|
+
|
|
753
|
+
if (warningType === 'yaml_comment') {
|
|
754
|
+
// Add YAML comment for agent files
|
|
755
|
+
const warningComment = '# DEPRECATED: This agent is deprecated and will be removed in a future version\n';
|
|
756
|
+
const updatedContent = warningComment + content;
|
|
757
|
+
await fs.writeFile(filePath, updatedContent);
|
|
758
|
+
} else {
|
|
759
|
+
// Add code comment for other files
|
|
760
|
+
const warningComment = '// DEPRECATED: This component is deprecated and will be removed in a future version\n';
|
|
761
|
+
const updatedContent = warningComment + content;
|
|
762
|
+
await fs.writeFile(filePath, updatedContent);
|
|
763
|
+
}
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
async updateComponentRegistry(registryPath, deprecationStatus) {
|
|
767
|
+
// Update component registry to mark as deprecated
|
|
768
|
+
// Implementation would depend on registry format
|
|
769
|
+
console.log(chalk.gray(`Would update registry at ${registryPath}`));
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
async addUsageWarning(filePath, lineNumber, warningMessage) {
|
|
773
|
+
// Add deprecation warning comment near usage
|
|
774
|
+
console.log(chalk.gray(`Would add warning to ${filePath}:${lineNumber}: ${warningMessage}`));
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
async updateDocumentation(component, plan) {
|
|
778
|
+
// Update component documentation with deprecation notice
|
|
779
|
+
const docsPath = this.findComponentDocumentation(component);
|
|
780
|
+
if (docsPath) {
|
|
781
|
+
// Add deprecation notice to documentation
|
|
782
|
+
console.log(chalk.gray(`Updating documentation at ${docsPath}`));
|
|
783
|
+
}
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
async generateMigrationArtifacts(component, plan) {
|
|
787
|
+
if (!plan.replacement) return;
|
|
788
|
+
|
|
789
|
+
// Generate migration guide
|
|
790
|
+
const migrationGuidePath = path.join(
|
|
791
|
+
this.rootPath,
|
|
792
|
+
'docs',
|
|
793
|
+
'migrations',
|
|
794
|
+
`${component.name}-to-${plan.replacement}.md`
|
|
795
|
+
);
|
|
796
|
+
|
|
797
|
+
const migrationGuideContent = this.generateMigrationGuideContent(component, plan);
|
|
798
|
+
|
|
799
|
+
await fs.mkdir(path.dirname(migrationGuidePath), { recursive: true });
|
|
800
|
+
await fs.writeFile(migrationGuidePath, migrationGuideContent);
|
|
801
|
+
|
|
802
|
+
console.log(chalk.gray(`Generated migration guide: ${migrationGuidePath}`));
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
generateMigrationGuideContent(component, plan) {
|
|
806
|
+
return `# Migration Guide: ${component.name} ā ${plan.replacement}
|
|
807
|
+
|
|
808
|
+
## Overview
|
|
809
|
+
The ${component.type} \`${component.name}\` has been deprecated and will be removed in version ${plan.removalVersion}.
|
|
810
|
+
|
|
811
|
+
## Reason for Deprecation
|
|
812
|
+
${plan.reason}
|
|
813
|
+
|
|
814
|
+
## Migration Steps
|
|
815
|
+
1. Replace usage of \`${component.name}\` with \`${plan.replacement}\`
|
|
816
|
+
2. Update any configuration references
|
|
817
|
+
3. Test the replacement functionality
|
|
818
|
+
4. Remove any deprecated imports/references
|
|
819
|
+
|
|
820
|
+
## Timeline
|
|
821
|
+
- Deprecated: ${new Date(plan.deprecationTimestamp).toLocaleDateString()}
|
|
822
|
+
- Removal planned: Version ${plan.removalVersion}
|
|
823
|
+
- Timeline: ${plan.timeline} months
|
|
824
|
+
|
|
825
|
+
## Need Help?
|
|
826
|
+
If you encounter issues during migration, please refer to the documentation or contact support.
|
|
827
|
+
`;
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
async scheduleDeprecationTasks(component, plan) {
|
|
831
|
+
// Schedule future tasks for deprecation timeline
|
|
832
|
+
const tasks = [
|
|
833
|
+
{
|
|
834
|
+
type: 'deprecation_reminder',
|
|
835
|
+
scheduledFor: this.calculateReminderDate(plan.timeline),
|
|
836
|
+
component: component.id,
|
|
837
|
+
message: `Deprecation reminder for ${component.name}`
|
|
838
|
+
},
|
|
839
|
+
{
|
|
840
|
+
type: 'removal_preparation',
|
|
841
|
+
scheduledFor: this.calculateRemovalDate(plan.timeline),
|
|
842
|
+
component: component.id,
|
|
843
|
+
message: `Prepare for removal of ${component.name}`
|
|
844
|
+
}
|
|
845
|
+
];
|
|
846
|
+
|
|
847
|
+
for (const task of tasks) {
|
|
848
|
+
await this.deprecationManager.scheduleTask(task);
|
|
849
|
+
}
|
|
850
|
+
}
|
|
851
|
+
|
|
852
|
+
calculateReminderDate(timelineMonths) {
|
|
853
|
+
const reminderDate = new Date();
|
|
854
|
+
reminderDate.setMonth(reminderDate.getMonth() + Math.floor(timelineMonths / 2));
|
|
855
|
+
return reminderDate.toISOString();
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
calculateRemovalDate(timelineMonths) {
|
|
859
|
+
const removalDate = new Date();
|
|
860
|
+
removalDate.setMonth(removalDate.getMonth() + timelineMonths);
|
|
861
|
+
return removalDate.toISOString();
|
|
862
|
+
}
|
|
863
|
+
|
|
864
|
+
findComponentDocumentation(component) {
|
|
865
|
+
// Find documentation file for component
|
|
866
|
+
return null; // Placeholder
|
|
867
|
+
}
|
|
868
|
+
|
|
869
|
+
async displayDeprecationInfo(component, deprecationStatus) {
|
|
870
|
+
console.log(chalk.blue('\nš Current Deprecation Status'));
|
|
871
|
+
console.log(chalk.gray('ā'.repeat(50)));
|
|
872
|
+
|
|
873
|
+
console.log(`Component: ${component.type}/${component.name}`);
|
|
874
|
+
console.log(`Deprecated Since: ${new Date(deprecationStatus.deprecatedSince).toLocaleDateString()}`);
|
|
875
|
+
console.log(`Removal Planned: ${deprecationStatus.removalVersion}`);
|
|
876
|
+
console.log(`Reason: ${deprecationStatus.reason}`);
|
|
877
|
+
|
|
878
|
+
if (deprecationStatus.replacement) {
|
|
879
|
+
console.log(`Replacement: ${deprecationStatus.replacement}`);
|
|
880
|
+
}
|
|
881
|
+
}
|
|
882
|
+
}
|
|
883
|
+
|
|
884
|
+
module.exports = DeprecateComponentTask;
|
|
885
|
+
```
|
|
886
|
+
|
|
887
|
+
## Validation Rules
|
|
888
|
+
|
|
889
|
+
### Input Validation
|
|
890
|
+
- Component type must be valid (agent, task, workflow, util)
|
|
891
|
+
- Component must exist in the framework
|
|
892
|
+
- Severity must be valid level
|
|
893
|
+
- Timeline must be positive number
|
|
894
|
+
|
|
895
|
+
### Safety Checks
|
|
896
|
+
- Warn if component has high usage
|
|
897
|
+
- Require confirmation for critical components
|
|
898
|
+
- Prevent accidental deprecation of core components
|
|
899
|
+
|
|
900
|
+
### Deprecation Requirements
|
|
901
|
+
- Must specify removal timeline
|
|
902
|
+
- Should provide replacement when available
|
|
903
|
+
- Must include deprecation reason
|
|
904
|
+
- Should generate migration artifacts
|
|
905
|
+
|
|
906
|
+
## Integration Points
|
|
907
|
+
|
|
908
|
+
### Deprecation Manager
|
|
909
|
+
- Records deprecation metadata
|
|
910
|
+
- Tracks deprecation timeline
|
|
911
|
+
- Manages scheduled tasks
|
|
912
|
+
- Provides deprecation status
|
|
913
|
+
|
|
914
|
+
### Usage Tracker
|
|
915
|
+
- Analyzes component usage across codebase
|
|
916
|
+
- Identifies dependent components
|
|
917
|
+
- Tracks usage patterns over time
|
|
918
|
+
- Provides impact analysis
|
|
919
|
+
|
|
920
|
+
### Migration Generator
|
|
921
|
+
- Creates migration guides
|
|
922
|
+
- Generates replacement suggestions
|
|
923
|
+
- Provides automated migration scripts
|
|
924
|
+
- Tracks migration progress
|
|
925
|
+
|
|
926
|
+
## Output Structure
|
|
927
|
+
|
|
928
|
+
### Success Response
|
|
929
|
+
```json
|
|
930
|
+
{
|
|
931
|
+
"success": true,
|
|
932
|
+
"deprecationId": "dep-1234567890-abc123",
|
|
933
|
+
"component": {
|
|
934
|
+
"type": "agent",
|
|
935
|
+
"name": "weather-fetcher",
|
|
936
|
+
"filePath": "/path/to/component"
|
|
937
|
+
},
|
|
938
|
+
"timeline": 6,
|
|
939
|
+
"usageCount": 3,
|
|
940
|
+
"migrationRequired": true
|
|
941
|
+
}
|
|
942
|
+
```
|
|
943
|
+
|
|
944
|
+
### Error Response
|
|
945
|
+
```json
|
|
946
|
+
{
|
|
947
|
+
"success": false,
|
|
948
|
+
"error": "Component not found: agent/invalid-name",
|
|
949
|
+
"suggestions": ["weather-service", "weather-api"]
|
|
950
|
+
}
|
|
951
|
+
```
|
|
952
|
+
|
|
953
|
+
## Security Considerations
|
|
954
|
+
- Validate all file paths to prevent directory traversal
|
|
955
|
+
- Sanitize user input for deprecation reasons
|
|
956
|
+
- Require appropriate permissions for component modification
|
|
957
957
|
- Log all deprecation actions for audit trail
|