aios-core 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.aios-core/.session/current-session.json +14 -0
- package/.aios-core/cli/commands/generate/index.js +222 -0
- package/.aios-core/cli/commands/manifest/index.js +46 -0
- package/.aios-core/cli/commands/manifest/regenerate.js +96 -0
- package/.aios-core/cli/commands/manifest/validate.js +66 -0
- package/.aios-core/cli/commands/mcp/add.js +234 -0
- package/.aios-core/cli/commands/mcp/index.js +76 -0
- package/.aios-core/cli/commands/mcp/link.js +217 -0
- package/.aios-core/cli/commands/mcp/setup.js +164 -0
- package/.aios-core/cli/commands/mcp/status.js +183 -0
- package/.aios-core/cli/commands/metrics/cleanup.js +91 -0
- package/.aios-core/cli/commands/metrics/index.js +65 -0
- package/.aios-core/cli/commands/metrics/record.js +154 -0
- package/.aios-core/cli/commands/metrics/seed.js +126 -0
- package/.aios-core/cli/commands/metrics/show.js +209 -0
- package/.aios-core/cli/commands/migrate/analyze.js +353 -0
- package/.aios-core/cli/commands/migrate/backup.js +352 -0
- package/.aios-core/cli/commands/migrate/execute.js +292 -0
- package/.aios-core/cli/commands/migrate/index.js +441 -0
- package/.aios-core/cli/commands/migrate/rollback.js +323 -0
- package/.aios-core/cli/commands/migrate/update-imports.js +396 -0
- package/.aios-core/cli/commands/migrate/validate.js +452 -0
- package/.aios-core/cli/commands/qa/index.js +56 -0
- package/.aios-core/cli/commands/qa/run.js +163 -0
- package/.aios-core/cli/commands/qa/status.js +195 -0
- package/.aios-core/cli/commands/workers/formatters/info-formatter.js +274 -0
- package/.aios-core/cli/commands/workers/formatters/list-table.js +265 -0
- package/.aios-core/cli/commands/workers/formatters/list-tree.js +159 -0
- package/.aios-core/cli/commands/workers/index.js +56 -0
- package/.aios-core/cli/commands/workers/info.js +194 -0
- package/.aios-core/cli/commands/workers/list.js +214 -0
- package/.aios-core/cli/commands/workers/search-filters.js +185 -0
- package/.aios-core/cli/commands/workers/search-keyword.js +310 -0
- package/.aios-core/cli/commands/workers/search-semantic.js +293 -0
- package/.aios-core/cli/commands/workers/search.js +154 -0
- package/.aios-core/cli/commands/workers/utils/pagination.js +102 -0
- package/.aios-core/cli/index.js +128 -0
- package/.aios-core/cli/utils/output-formatter-cli.js +232 -0
- package/.aios-core/cli/utils/score-calculator.js +221 -0
- package/.aios-core/core/README.md +229 -0
- package/.aios-core/core/config/config-cache.js +233 -0
- package/.aios-core/core/config/config-loader.js +277 -0
- package/.aios-core/core/data/agent-config-requirements.yaml +368 -0
- package/.aios-core/core/data/aios-kb.md +924 -0
- package/.aios-core/core/data/workflow-patterns.yaml +267 -0
- package/.aios-core/core/docs/SHARD-TRANSLATION-GUIDE.md +335 -0
- package/.aios-core/core/docs/component-creation-guide.md +458 -0
- package/.aios-core/core/docs/session-update-pattern.md +307 -0
- package/.aios-core/core/docs/template-syntax.md +267 -0
- package/.aios-core/core/docs/troubleshooting-guide.md +625 -0
- package/.aios-core/core/elicitation/agent-elicitation.js +272 -0
- package/.aios-core/core/elicitation/elicitation-engine.js +479 -0
- package/.aios-core/core/elicitation/session-manager.js +320 -0
- package/.aios-core/core/elicitation/task-elicitation.js +281 -0
- package/.aios-core/core/elicitation/workflow-elicitation.js +315 -0
- package/.aios-core/core/index.esm.js +42 -0
- package/.aios-core/core/index.js +76 -0
- package/.aios-core/core/manifest/manifest-generator.js +386 -0
- package/.aios-core/core/manifest/manifest-validator.js +429 -0
- package/.aios-core/core/mcp/config-migrator.js +340 -0
- package/.aios-core/core/mcp/global-config-manager.js +369 -0
- package/.aios-core/core/mcp/index.js +34 -0
- package/.aios-core/core/mcp/os-detector.js +188 -0
- package/.aios-core/core/mcp/symlink-manager.js +413 -0
- package/.aios-core/core/migration/migration-config.yaml +83 -0
- package/.aios-core/core/migration/module-mapping.yaml +89 -0
- package/.aios-core/core/quality-gates/base-layer.js +134 -0
- package/.aios-core/core/quality-gates/checklist-generator.js +329 -0
- package/.aios-core/core/quality-gates/focus-area-recommender.js +359 -0
- package/.aios-core/core/quality-gates/human-review-orchestrator.js +529 -0
- package/.aios-core/core/quality-gates/layer1-precommit.js +336 -0
- package/.aios-core/core/quality-gates/layer2-pr-automation.js +324 -0
- package/.aios-core/core/quality-gates/layer3-human-review.js +348 -0
- package/.aios-core/core/quality-gates/notification-manager.js +550 -0
- package/.aios-core/core/quality-gates/quality-gate-config.yaml +86 -0
- package/.aios-core/core/quality-gates/quality-gate-manager.js +601 -0
- package/.aios-core/core/registry/README.md +179 -0
- package/.aios-core/core/registry/build-registry.js +452 -0
- package/.aios-core/core/registry/registry-loader.js +330 -0
- package/.aios-core/core/registry/registry-schema.json +166 -0
- package/.aios-core/core/registry/service-registry.json +6586 -0
- package/.aios-core/core/registry/validate-registry.js +340 -0
- package/.aios-core/core/session/context-detector.js +229 -0
- package/.aios-core/core/session/context-loader.js +288 -0
- package/.aios-core/core/utils/output-formatter.js +298 -0
- package/.aios-core/core/utils/security-utils.js +333 -0
- package/.aios-core/core/utils/yaml-validator.js +419 -0
- package/.aios-core/core-config.yaml +382 -0
- package/.aios-core/data/agent-config-requirements.yaml +368 -0
- package/.aios-core/data/aios-kb.md +924 -0
- package/.aios-core/data/technical-preferences.md +4 -0
- package/.aios-core/data/workflow-patterns.yaml +267 -0
- package/.aios-core/development/README.md +142 -0
- package/.aios-core/development/agent-teams/team-all.yaml +15 -0
- package/.aios-core/development/agent-teams/team-fullstack.yaml +18 -0
- package/.aios-core/development/agent-teams/team-ide-minimal.yaml +10 -0
- package/.aios-core/development/agent-teams/team-no-ui.yaml +13 -0
- package/.aios-core/development/agent-teams/team-qa-focused.yaml +155 -0
- package/.aios-core/development/agents/aios-master.md +339 -0
- package/.aios-core/development/agents/analyst.md +195 -0
- package/.aios-core/development/agents/architect.md +359 -0
- package/.aios-core/development/agents/data-engineer.md +468 -0
- package/.aios-core/development/agents/dev.md +390 -0
- package/.aios-core/development/agents/devops.md +398 -0
- package/.aios-core/development/agents/pm.md +198 -0
- package/.aios-core/development/agents/po.md +256 -0
- package/.aios-core/development/agents/qa.md +312 -0
- package/.aios-core/development/agents/sm.md +220 -0
- package/.aios-core/development/agents/ux-design-expert.md +451 -0
- package/.aios-core/development/scripts/agent-assignment-resolver.js +231 -0
- package/.aios-core/development/scripts/agent-config-loader.js +624 -0
- package/.aios-core/development/scripts/agent-exit-hooks.js +96 -0
- package/.aios-core/development/scripts/apply-inline-greeting-all-agents.js +146 -0
- package/.aios-core/development/scripts/audit-agent-config.js +380 -0
- package/.aios-core/development/scripts/backlog-manager.js +404 -0
- package/.aios-core/development/scripts/batch-update-agents-session-context.js +95 -0
- package/.aios-core/development/scripts/decision-context.js +228 -0
- package/.aios-core/development/scripts/decision-log-generator.js +293 -0
- package/.aios-core/development/scripts/decision-log-indexer.js +284 -0
- package/.aios-core/development/scripts/decision-recorder.js +168 -0
- package/.aios-core/development/scripts/dev-context-loader.js +297 -0
- package/.aios-core/development/scripts/generate-greeting.js +160 -0
- package/.aios-core/development/scripts/greeting-builder.js +866 -0
- package/.aios-core/development/scripts/greeting-config-cli.js +85 -0
- package/.aios-core/development/scripts/greeting-preference-manager.js +145 -0
- package/.aios-core/development/scripts/migrate-task-to-v2.js +377 -0
- package/.aios-core/development/scripts/story-index-generator.js +337 -0
- package/.aios-core/development/scripts/story-manager.js +375 -0
- package/.aios-core/development/scripts/story-update-hook.js +259 -0
- package/.aios-core/development/scripts/task-identifier-resolver.js +145 -0
- package/.aios-core/development/scripts/test-greeting-system.js +142 -0
- package/.aios-core/development/scripts/validate-task-v2.js +319 -0
- package/.aios-core/development/scripts/workflow-navigator.js +214 -0
- package/.aios-core/development/tasks/add-mcp.md +319 -0
- package/.aios-core/development/tasks/advanced-elicitation.md +319 -0
- package/.aios-core/development/tasks/analyst-facilitate-brainstorming.md +342 -0
- package/.aios-core/development/tasks/analyze-framework.md +697 -0
- package/.aios-core/development/tasks/analyze-performance.md +637 -0
- package/.aios-core/development/tasks/apply-qa-fixes.md +340 -0
- package/.aios-core/development/tasks/architect-analyze-impact.md +827 -0
- package/.aios-core/development/tasks/audit-codebase.md +429 -0
- package/.aios-core/development/tasks/audit-tailwind-config.md +270 -0
- package/.aios-core/development/tasks/audit-utilities.md +358 -0
- package/.aios-core/development/tasks/bootstrap-shadcn-library.md +286 -0
- package/.aios-core/development/tasks/brownfield-create-epic.md +486 -0
- package/.aios-core/development/tasks/brownfield-create-story.md +357 -0
- package/.aios-core/development/tasks/build-component.md +478 -0
- package/.aios-core/development/tasks/calculate-roi.md +455 -0
- package/.aios-core/development/tasks/ci-cd-configuration.md +764 -0
- package/.aios-core/development/tasks/cleanup-utilities.md +670 -0
- package/.aios-core/development/tasks/collaborative-edit.md +1109 -0
- package/.aios-core/development/tasks/compose-molecule.md +284 -0
- package/.aios-core/development/tasks/consolidate-patterns.md +414 -0
- package/.aios-core/development/tasks/correct-course.md +280 -0
- package/.aios-core/development/tasks/create-agent.md +322 -0
- package/.aios-core/development/tasks/create-brownfield-story.md +727 -0
- package/.aios-core/development/tasks/create-deep-research-prompt.md +499 -0
- package/.aios-core/development/tasks/create-doc.md +316 -0
- package/.aios-core/development/tasks/create-next-story.md +774 -0
- package/.aios-core/development/tasks/create-suite.md +284 -0
- package/.aios-core/development/tasks/create-task.md +372 -0
- package/.aios-core/development/tasks/create-workflow.md +371 -0
- package/.aios-core/development/tasks/db-analyze-hotpaths.md +572 -0
- package/.aios-core/development/tasks/db-apply-migration.md +381 -0
- package/.aios-core/development/tasks/db-bootstrap.md +642 -0
- package/.aios-core/development/tasks/db-domain-modeling.md +693 -0
- package/.aios-core/development/tasks/db-dry-run.md +293 -0
- package/.aios-core/development/tasks/db-env-check.md +260 -0
- package/.aios-core/development/tasks/db-expansion-pack-integration.md +663 -0
- package/.aios-core/development/tasks/db-explain.md +631 -0
- package/.aios-core/development/tasks/db-impersonate.md +495 -0
- package/.aios-core/development/tasks/db-load-csv.md +593 -0
- package/.aios-core/development/tasks/db-policy-apply.md +653 -0
- package/.aios-core/development/tasks/db-rls-audit.md +411 -0
- package/.aios-core/development/tasks/db-rollback.md +739 -0
- package/.aios-core/development/tasks/db-run-sql.md +613 -0
- package/.aios-core/development/tasks/db-schema-audit.md +1011 -0
- package/.aios-core/development/tasks/db-seed.md +390 -0
- package/.aios-core/development/tasks/db-smoke-test.md +351 -0
- package/.aios-core/development/tasks/db-snapshot.md +569 -0
- package/.aios-core/development/tasks/db-supabase-setup.md +712 -0
- package/.aios-core/development/tasks/db-verify-order.md +515 -0
- package/.aios-core/development/tasks/deprecate-component.md +957 -0
- package/.aios-core/development/tasks/dev-apply-qa-fixes.md +318 -0
- package/.aios-core/development/tasks/dev-backlog-debt.md +469 -0
- package/.aios-core/development/tasks/dev-develop-story.md +846 -0
- package/.aios-core/development/tasks/dev-improve-code-quality.md +873 -0
- package/.aios-core/development/tasks/dev-optimize-performance.md +1034 -0
- package/.aios-core/development/tasks/dev-suggest-refactoring.md +871 -0
- package/.aios-core/development/tasks/dev-validate-next-story.md +349 -0
- package/.aios-core/development/tasks/document-project.md +553 -0
- package/.aios-core/development/tasks/environment-bootstrap.md +1311 -0
- package/.aios-core/development/tasks/execute-checklist.md +301 -0
- package/.aios-core/development/tasks/export-design-tokens-dtcg.md +274 -0
- package/.aios-core/development/tasks/extend-pattern.md +269 -0
- package/.aios-core/development/tasks/extract-tokens.md +467 -0
- package/.aios-core/development/tasks/facilitate-brainstorming-session.md +518 -0
- package/.aios-core/development/tasks/generate-ai-frontend-prompt.md +261 -0
- package/.aios-core/development/tasks/generate-documentation.md +284 -0
- package/.aios-core/development/tasks/generate-migration-strategy.md +522 -0
- package/.aios-core/development/tasks/generate-shock-report.md +501 -0
- package/.aios-core/development/tasks/github-devops-github-pr-automation.md +427 -0
- package/.aios-core/development/tasks/github-devops-pre-push-quality-gate.md +733 -0
- package/.aios-core/development/tasks/github-devops-repository-cleanup.md +374 -0
- package/.aios-core/development/tasks/github-devops-version-management.md +483 -0
- package/.aios-core/development/tasks/improve-self.md +823 -0
- package/.aios-core/development/tasks/index-docs.md +388 -0
- package/.aios-core/development/tasks/init-project-status.md +506 -0
- package/.aios-core/development/tasks/integrate-expansion-pack.md +314 -0
- package/.aios-core/development/tasks/kb-mode-interaction.md +284 -0
- package/.aios-core/development/tasks/learn-patterns.md +901 -0
- package/.aios-core/development/tasks/mcp-workflow.md +437 -0
- package/.aios-core/development/tasks/modify-agent.md +382 -0
- package/.aios-core/development/tasks/modify-task.md +425 -0
- package/.aios-core/development/tasks/modify-workflow.md +466 -0
- package/.aios-core/development/tasks/po-backlog-add.md +370 -0
- package/.aios-core/development/tasks/po-manage-story-backlog.md +523 -0
- package/.aios-core/development/tasks/po-pull-story-from-clickup.md +540 -0
- package/.aios-core/development/tasks/po-pull-story.md +316 -0
- package/.aios-core/development/tasks/po-stories-index.md +351 -0
- package/.aios-core/development/tasks/po-sync-story-to-clickup.md +457 -0
- package/.aios-core/development/tasks/po-sync-story.md +303 -0
- package/.aios-core/development/tasks/pr-automation.md +701 -0
- package/.aios-core/development/tasks/propose-modification.md +843 -0
- package/.aios-core/development/tasks/qa-backlog-add-followup.md +425 -0
- package/.aios-core/development/tasks/qa-gate.md +374 -0
- package/.aios-core/development/tasks/qa-generate-tests.md +1175 -0
- package/.aios-core/development/tasks/qa-nfr-assess.md +558 -0
- package/.aios-core/development/tasks/qa-review-proposal.md +1158 -0
- package/.aios-core/development/tasks/qa-review-story.md +683 -0
- package/.aios-core/development/tasks/qa-risk-profile.md +567 -0
- package/.aios-core/development/tasks/qa-run-tests.md +277 -0
- package/.aios-core/development/tasks/qa-test-design.md +388 -0
- package/.aios-core/development/tasks/qa-trace-requirements.md +477 -0
- package/.aios-core/development/tasks/release-management.md +723 -0
- package/.aios-core/development/tasks/security-audit.md +554 -0
- package/.aios-core/development/tasks/security-scan.md +790 -0
- package/.aios-core/development/tasks/setup-database.md +741 -0
- package/.aios-core/development/tasks/setup-design-system.md +462 -0
- package/.aios-core/development/tasks/setup-github.md +874 -0
- package/.aios-core/development/tasks/setup-llm-routing.md +229 -0
- package/.aios-core/development/tasks/setup-mcp-docker.md +584 -0
- package/.aios-core/development/tasks/shard-doc.md +538 -0
- package/.aios-core/development/tasks/sm-create-next-story.md +480 -0
- package/.aios-core/development/tasks/sync-documentation.md +865 -0
- package/.aios-core/development/tasks/tailwind-upgrade.md +294 -0
- package/.aios-core/development/tasks/test-as-user.md +621 -0
- package/.aios-core/development/tasks/test-validation-task.md +171 -0
- package/.aios-core/development/tasks/undo-last.md +347 -0
- package/.aios-core/development/tasks/update-manifest.md +410 -0
- package/.aios-core/development/tasks/ux-create-wireframe.md +617 -0
- package/.aios-core/development/tasks/ux-ds-scan-artifact.md +672 -0
- package/.aios-core/development/tasks/ux-user-research.md +559 -0
- package/.aios-core/development/tasks/validate-next-story.md +423 -0
- package/.aios-core/development/tasks/validate-structure.md +243 -0
- package/.aios-core/development/workflows/README.md +84 -0
- package/.aios-core/development/workflows/brownfield-fullstack.yaml +297 -0
- package/.aios-core/development/workflows/brownfield-service.yaml +187 -0
- package/.aios-core/development/workflows/brownfield-ui.yaml +197 -0
- package/.aios-core/development/workflows/greenfield-fullstack.yaml +333 -0
- package/.aios-core/development/workflows/greenfield-service.yaml +206 -0
- package/.aios-core/development/workflows/greenfield-ui.yaml +235 -0
- package/.aios-core/docs/SHARD-TRANSLATION-GUIDE.md +335 -0
- package/.aios-core/docs/component-creation-guide.md +458 -0
- package/.aios-core/docs/session-update-pattern.md +307 -0
- package/.aios-core/docs/standards/AGENT-PERSONALIZATION-STANDARD-V1.md +572 -0
- package/.aios-core/docs/standards/AIOS-COLOR-PALETTE-QUICK-REFERENCE.md +185 -0
- package/.aios-core/docs/standards/AIOS-COLOR-PALETTE-V2.1.md +354 -0
- package/.aios-core/docs/standards/AIOS-FRAMEWORK-MASTER.md +1963 -0
- package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO-V2.1-COMPLETE.md +821 -0
- package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO-V2.1-SUMMARY.md +1190 -0
- package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO-V2.1.md +439 -0
- package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO-V2.2-SUMMARY.md +1339 -0
- package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO.md +5398 -0
- package/.aios-core/docs/standards/EXECUTOR-DECISION-TREE.md +697 -0
- package/.aios-core/docs/standards/OPEN-SOURCE-VS-SERVICE-DIFFERENCES.md +511 -0
- package/.aios-core/docs/standards/QUALITY-GATES-SPECIFICATION.md +556 -0
- package/.aios-core/docs/standards/STANDARDS-INDEX.md +210 -0
- package/.aios-core/docs/standards/STORY-TEMPLATE-V2-SPECIFICATION.md +550 -0
- package/.aios-core/docs/standards/TASK-FORMAT-SPECIFICATION-V1.md +1414 -0
- package/.aios-core/docs/standards/V3-ARCHITECTURAL-DECISIONS.md +523 -0
- package/.aios-core/docs/template-syntax.md +267 -0
- package/.aios-core/docs/troubleshooting-guide.md +625 -0
- package/.aios-core/elicitation/agent-elicitation.js +272 -0
- package/.aios-core/elicitation/task-elicitation.js +281 -0
- package/.aios-core/elicitation/workflow-elicitation.js +315 -0
- package/.aios-core/index.d.ts +8 -0
- package/.aios-core/index.esm.js +16 -0
- package/.aios-core/index.js +16 -0
- package/.aios-core/infrastructure/README.md +126 -0
- package/.aios-core/infrastructure/index.js +199 -0
- package/.aios-core/infrastructure/integrations/pm-adapters/README.md +59 -0
- package/.aios-core/infrastructure/integrations/pm-adapters/clickup-adapter.js +345 -0
- package/.aios-core/infrastructure/integrations/pm-adapters/github-adapter.js +392 -0
- package/.aios-core/infrastructure/integrations/pm-adapters/jira-adapter.js +448 -0
- package/.aios-core/infrastructure/integrations/pm-adapters/local-adapter.js +175 -0
- package/.aios-core/infrastructure/scripts/_archived/final-todo-count.js +122 -0
- package/.aios-core/infrastructure/scripts/_archived/fix-yaml-formatting.js +89 -0
- package/.aios-core/infrastructure/scripts/_archived/migration-generator.js +780 -0
- package/.aios-core/infrastructure/scripts/_archived/migration-path-generator.js +950 -0
- package/.aios-core/infrastructure/scripts/_archived/phase2-entrada-saida-errors.js +425 -0
- package/.aios-core/infrastructure/scripts/_archived/phase2-spot-check.js +132 -0
- package/.aios-core/infrastructure/scripts/_archived/phase3-tools-scripts-validation.js +381 -0
- package/.aios-core/infrastructure/scripts/_archived/phase4-metadata-performance.js +203 -0
- package/.aios-core/infrastructure/scripts/_archived/test-yaml-parsing.js +24 -0
- package/.aios-core/infrastructure/scripts/_archived/verify-yaml-fix.js +51 -0
- package/.aios-core/infrastructure/scripts/aios-validator.js +294 -0
- package/.aios-core/infrastructure/scripts/approval-workflow.js +643 -0
- package/.aios-core/infrastructure/scripts/atomic-layer-classifier.js +308 -0
- package/.aios-core/infrastructure/scripts/backup-manager.js +607 -0
- package/.aios-core/infrastructure/scripts/batch-creator.js +608 -0
- package/.aios-core/infrastructure/scripts/branch-manager.js +391 -0
- package/.aios-core/infrastructure/scripts/capability-analyzer.js +535 -0
- package/.aios-core/infrastructure/scripts/clickup-helpers.js +226 -0
- package/.aios-core/infrastructure/scripts/code-quality-improver.js +1312 -0
- package/.aios-core/infrastructure/scripts/commit-message-generator.js +850 -0
- package/.aios-core/infrastructure/scripts/component-generator.js +738 -0
- package/.aios-core/infrastructure/scripts/component-metadata.js +627 -0
- package/.aios-core/infrastructure/scripts/component-search.js +277 -0
- package/.aios-core/infrastructure/scripts/config-cache.js +322 -0
- package/.aios-core/infrastructure/scripts/config-loader.js +349 -0
- package/.aios-core/infrastructure/scripts/conflict-resolver.js +675 -0
- package/.aios-core/infrastructure/scripts/coverage-analyzer.js +882 -0
- package/.aios-core/infrastructure/scripts/dependency-analyzer.js +638 -0
- package/.aios-core/infrastructure/scripts/dependency-impact-analyzer.js +703 -0
- package/.aios-core/infrastructure/scripts/diff-generator.js +129 -0
- package/.aios-core/infrastructure/scripts/documentation-integrity/brownfield-analyzer.js +501 -0
- package/.aios-core/infrastructure/scripts/documentation-integrity/config-generator.js +329 -0
- package/.aios-core/infrastructure/scripts/documentation-integrity/deployment-config-loader.js +282 -0
- package/.aios-core/infrastructure/scripts/documentation-integrity/doc-generator.js +331 -0
- package/.aios-core/infrastructure/scripts/documentation-integrity/gitignore-generator.js +313 -0
- package/.aios-core/infrastructure/scripts/documentation-integrity/index.js +74 -0
- package/.aios-core/infrastructure/scripts/documentation-integrity/mode-detector.js +358 -0
- package/.aios-core/infrastructure/scripts/documentation-synchronizer.js +1432 -0
- package/.aios-core/infrastructure/scripts/framework-analyzer.js +746 -0
- package/.aios-core/infrastructure/scripts/git-config-detector.js +293 -0
- package/.aios-core/infrastructure/scripts/git-wrapper.js +443 -0
- package/.aios-core/infrastructure/scripts/improvement-engine.js +758 -0
- package/.aios-core/infrastructure/scripts/improvement-validator.js +710 -0
- package/.aios-core/infrastructure/scripts/llm-routing/install-llm-routing.js +267 -0
- package/.aios-core/infrastructure/scripts/llm-routing/templates/claude-free.cmd +80 -0
- package/.aios-core/infrastructure/scripts/llm-routing/templates/claude-free.sh +62 -0
- package/.aios-core/infrastructure/scripts/llm-routing/templates/claude-max.cmd +26 -0
- package/.aios-core/infrastructure/scripts/llm-routing/templates/claude-max.sh +18 -0
- package/.aios-core/infrastructure/scripts/modification-risk-assessment.js +970 -0
- package/.aios-core/infrastructure/scripts/modification-validator.js +555 -0
- package/.aios-core/infrastructure/scripts/output-formatter.js +297 -0
- package/.aios-core/infrastructure/scripts/performance-analyzer.js +758 -0
- package/.aios-core/infrastructure/scripts/performance-and-error-resolver.js +258 -0
- package/.aios-core/infrastructure/scripts/performance-optimizer.js +1902 -0
- package/.aios-core/infrastructure/scripts/performance-tracker.js +452 -0
- package/.aios-core/infrastructure/scripts/pm-adapter-factory.js +181 -0
- package/.aios-core/infrastructure/scripts/pm-adapter.js +134 -0
- package/.aios-core/infrastructure/scripts/project-status-loader.js +445 -0
- package/.aios-core/infrastructure/scripts/refactoring-suggester.js +1139 -0
- package/.aios-core/infrastructure/scripts/repository-detector.js +64 -0
- package/.aios-core/infrastructure/scripts/sandbox-tester.js +618 -0
- package/.aios-core/infrastructure/scripts/security-checker.js +359 -0
- package/.aios-core/infrastructure/scripts/source-tree-guardian/index.js +375 -0
- package/.aios-core/infrastructure/scripts/source-tree-guardian/manifest-generator.js +410 -0
- package/.aios-core/infrastructure/scripts/source-tree-guardian/rules/naming-rules.yaml +285 -0
- package/.aios-core/infrastructure/scripts/source-tree-guardian/rules/placement-rules.yaml +262 -0
- package/.aios-core/infrastructure/scripts/source-tree-guardian/validator.js +468 -0
- package/.aios-core/infrastructure/scripts/spot-check-validator.js +149 -0
- package/.aios-core/infrastructure/scripts/status-mapper.js +115 -0
- package/.aios-core/infrastructure/scripts/template-engine.js +240 -0
- package/.aios-core/infrastructure/scripts/template-validator.js +279 -0
- package/.aios-core/infrastructure/scripts/test-generator.js +844 -0
- package/.aios-core/infrastructure/scripts/test-quality-assessment.js +1081 -0
- package/.aios-core/infrastructure/scripts/test-utilities-fast.js +126 -0
- package/.aios-core/infrastructure/scripts/test-utilities.js +200 -0
- package/.aios-core/infrastructure/scripts/tool-resolver.js +360 -0
- package/.aios-core/infrastructure/scripts/transaction-manager.js +590 -0
- package/.aios-core/infrastructure/scripts/usage-analytics.js +634 -0
- package/.aios-core/infrastructure/scripts/validate-output-pattern.js +213 -0
- package/.aios-core/infrastructure/scripts/visual-impact-generator.js +1056 -0
- package/.aios-core/infrastructure/scripts/yaml-validator.js +397 -0
- package/.aios-core/infrastructure/templates/coderabbit.yaml.template +279 -0
- package/.aios-core/infrastructure/templates/core-config/core-config-brownfield.tmpl.yaml +182 -0
- package/.aios-core/infrastructure/templates/core-config/core-config-greenfield.tmpl.yaml +127 -0
- package/.aios-core/infrastructure/templates/github-workflows/README.md +109 -0
- package/.aios-core/infrastructure/templates/github-workflows/ci.yml.template +169 -0
- package/.aios-core/infrastructure/templates/github-workflows/pr-automation.yml.template +330 -0
- package/.aios-core/infrastructure/templates/github-workflows/release.yml.template +196 -0
- package/.aios-core/infrastructure/templates/gitignore/gitignore-aios-base.tmpl +63 -0
- package/.aios-core/infrastructure/templates/gitignore/gitignore-brownfield-merge.tmpl +18 -0
- package/.aios-core/infrastructure/templates/gitignore/gitignore-node.tmpl +85 -0
- package/.aios-core/infrastructure/templates/gitignore/gitignore-python.tmpl +145 -0
- package/.aios-core/infrastructure/templates/project-docs/coding-standards-tmpl.md +346 -0
- package/.aios-core/infrastructure/templates/project-docs/source-tree-tmpl.md +177 -0
- package/.aios-core/infrastructure/templates/project-docs/tech-stack-tmpl.md +267 -0
- package/.aios-core/infrastructure/tests/project-status-loader.test.js +394 -0
- package/.aios-core/infrastructure/tests/regression-suite-v2.md +621 -0
- package/.aios-core/infrastructure/tests/utilities-audit-results.json +501 -0
- package/.aios-core/infrastructure/tests/validate-module.js +97 -0
- package/.aios-core/infrastructure/tools/README.md +222 -0
- package/.aios-core/infrastructure/tools/cli/github-cli.yaml +200 -0
- package/.aios-core/infrastructure/tools/cli/llm-routing.yaml +126 -0
- package/.aios-core/infrastructure/tools/cli/railway-cli.yaml +260 -0
- package/.aios-core/infrastructure/tools/cli/supabase-cli.yaml +224 -0
- package/.aios-core/infrastructure/tools/local/ffmpeg.yaml +261 -0
- package/.aios-core/infrastructure/tools/mcp/21st-dev-magic.yaml +127 -0
- package/.aios-core/infrastructure/tools/mcp/browser.yaml +103 -0
- package/.aios-core/infrastructure/tools/mcp/clickup.yaml +534 -0
- package/.aios-core/infrastructure/tools/mcp/context7.yaml +78 -0
- package/.aios-core/infrastructure/tools/mcp/desktop-commander.yaml +180 -0
- package/.aios-core/infrastructure/tools/mcp/exa.yaml +103 -0
- package/.aios-core/infrastructure/tools/mcp/google-workspace.yaml +930 -0
- package/.aios-core/infrastructure/tools/mcp/n8n.yaml +551 -0
- package/.aios-core/infrastructure/tools/mcp/supabase.yaml +808 -0
- package/.aios-core/install-manifest.yaml +347 -0
- package/.aios-core/manifests/agents.csv +1 -0
- package/.aios-core/manifests/schema/manifest-schema.json +190 -0
- package/.aios-core/manifests/tasks.csv +121 -0
- package/.aios-core/manifests/workers.csv +204 -0
- package/.aios-core/package.json +103 -0
- package/.aios-core/product/README.md +56 -0
- package/.aios-core/product/checklists/architect-checklist.md +444 -0
- package/.aios-core/product/checklists/change-checklist.md +183 -0
- package/.aios-core/product/checklists/database-design-checklist.md +119 -0
- package/.aios-core/product/checklists/dba-predeploy-checklist.md +97 -0
- package/.aios-core/product/checklists/dba-rollback-checklist.md +99 -0
- package/.aios-core/product/checklists/pm-checklist.md +376 -0
- package/.aios-core/product/checklists/po-master-checklist.md +442 -0
- package/.aios-core/product/checklists/pre-push-checklist.md +108 -0
- package/.aios-core/product/checklists/release-checklist.md +122 -0
- package/.aios-core/product/checklists/story-dod-checklist.md +102 -0
- package/.aios-core/product/checklists/story-draft-checklist.md +216 -0
- package/.aios-core/product/data/brainstorming-techniques.md +37 -0
- package/.aios-core/product/data/elicitation-methods.md +135 -0
- package/.aios-core/product/data/mode-selection-best-practices.md +471 -0
- package/.aios-core/product/data/test-levels-framework.md +149 -0
- package/.aios-core/product/data/test-priorities-matrix.md +175 -0
- package/.aios-core/product/templates/1mcp-config.yaml +225 -0
- package/.aios-core/product/templates/activation-instructions-inline-greeting.yaml +63 -0
- package/.aios-core/product/templates/activation-instructions-template.md +258 -0
- package/.aios-core/product/templates/adr.hbs +125 -0
- package/.aios-core/product/templates/agent-template.yaml +121 -0
- package/.aios-core/product/templates/architecture-tmpl.yaml +651 -0
- package/.aios-core/product/templates/brainstorming-output-tmpl.yaml +156 -0
- package/.aios-core/product/templates/brownfield-architecture-tmpl.yaml +476 -0
- package/.aios-core/product/templates/brownfield-prd-tmpl.yaml +280 -0
- package/.aios-core/product/templates/changelog-template.md +134 -0
- package/.aios-core/product/templates/command-rationalization-matrix.md +152 -0
- package/.aios-core/product/templates/competitor-analysis-tmpl.yaml +293 -0
- package/.aios-core/product/templates/component-react-tmpl.tsx +98 -0
- package/.aios-core/product/templates/dbdr.hbs +241 -0
- package/.aios-core/product/templates/design-story-tmpl.yaml +587 -0
- package/.aios-core/product/templates/ds-artifact-analysis.md +70 -0
- package/.aios-core/product/templates/engine/elicitation.js +298 -0
- package/.aios-core/product/templates/engine/index.js +308 -0
- package/.aios-core/product/templates/engine/loader.js +231 -0
- package/.aios-core/product/templates/engine/renderer.js +343 -0
- package/.aios-core/product/templates/engine/schemas/adr.schema.json +102 -0
- package/.aios-core/product/templates/engine/schemas/dbdr.schema.json +205 -0
- package/.aios-core/product/templates/engine/schemas/epic.schema.json +175 -0
- package/.aios-core/product/templates/engine/schemas/pmdr.schema.json +175 -0
- package/.aios-core/product/templates/engine/schemas/prd-v2.schema.json +300 -0
- package/.aios-core/product/templates/engine/schemas/prd.schema.json +152 -0
- package/.aios-core/product/templates/engine/schemas/story.schema.json +222 -0
- package/.aios-core/product/templates/engine/schemas/task.schema.json +154 -0
- package/.aios-core/product/templates/engine/validator.js +294 -0
- package/.aios-core/product/templates/epic.hbs +212 -0
- package/.aios-core/product/templates/eslintrc-security.json +32 -0
- package/.aios-core/product/templates/front-end-architecture-tmpl.yaml +206 -0
- package/.aios-core/product/templates/front-end-spec-tmpl.yaml +349 -0
- package/.aios-core/product/templates/fullstack-architecture-tmpl.yaml +805 -0
- package/.aios-core/product/templates/github-actions-cd.yml +212 -0
- package/.aios-core/product/templates/github-actions-ci.yml +172 -0
- package/.aios-core/product/templates/github-pr-template.md +67 -0
- package/.aios-core/product/templates/gordon-mcp.yaml +140 -0
- package/.aios-core/product/templates/ide-rules/antigravity-rules.md +115 -0
- package/.aios-core/product/templates/ide-rules/claude-rules.md +221 -0
- package/.aios-core/product/templates/ide-rules/cline-rules.md +84 -0
- package/.aios-core/product/templates/ide-rules/copilot-rules.md +92 -0
- package/.aios-core/product/templates/ide-rules/cursor-rules.md +115 -0
- package/.aios-core/product/templates/ide-rules/gemini-rules.md +85 -0
- package/.aios-core/product/templates/ide-rules/roo-rules.md +86 -0
- package/.aios-core/product/templates/ide-rules/trae-rules.md +104 -0
- package/.aios-core/product/templates/ide-rules/windsurf-rules.md +80 -0
- package/.aios-core/product/templates/index-strategy-tmpl.yaml +53 -0
- package/.aios-core/product/templates/market-research-tmpl.yaml +252 -0
- package/.aios-core/product/templates/mcp-workflow.js +271 -0
- package/.aios-core/product/templates/migration-plan-tmpl.yaml +1022 -0
- package/.aios-core/product/templates/migration-strategy-tmpl.md +524 -0
- package/.aios-core/product/templates/personalized-agent-template.md +258 -0
- package/.aios-core/product/templates/personalized-checklist-template.md +340 -0
- package/.aios-core/product/templates/personalized-task-template-v2.md +905 -0
- package/.aios-core/product/templates/personalized-task-template.md +344 -0
- package/.aios-core/product/templates/personalized-template-file.yaml +322 -0
- package/.aios-core/product/templates/personalized-workflow-template.yaml +460 -0
- package/.aios-core/product/templates/pmdr.hbs +186 -0
- package/.aios-core/product/templates/prd-tmpl.yaml +202 -0
- package/.aios-core/product/templates/prd-v2.0.hbs +216 -0
- package/.aios-core/product/templates/prd.hbs +201 -0
- package/.aios-core/product/templates/project-brief-tmpl.yaml +221 -0
- package/.aios-core/product/templates/qa-gate-tmpl.yaml +240 -0
- package/.aios-core/product/templates/rls-policies-tmpl.yaml +1203 -0
- package/.aios-core/product/templates/schema-design-tmpl.yaml +428 -0
- package/.aios-core/product/templates/shock-report-tmpl.html +502 -0
- package/.aios-core/product/templates/state-persistence-tmpl.yaml +219 -0
- package/.aios-core/product/templates/story-tmpl.yaml +332 -0
- package/.aios-core/product/templates/story.hbs +263 -0
- package/.aios-core/product/templates/task-execution-report.md +495 -0
- package/.aios-core/product/templates/task-template.md +123 -0
- package/.aios-core/product/templates/task.hbs +170 -0
- package/.aios-core/product/templates/tmpl-comment-on-examples.sql +158 -0
- package/.aios-core/product/templates/tmpl-migration-script.sql +91 -0
- package/.aios-core/product/templates/tmpl-rls-granular-policies.sql +104 -0
- package/.aios-core/product/templates/tmpl-rls-kiss-policy.sql +10 -0
- package/.aios-core/product/templates/tmpl-rls-roles.sql +135 -0
- package/.aios-core/product/templates/tmpl-rls-simple.sql +77 -0
- package/.aios-core/product/templates/tmpl-rls-tenant.sql +152 -0
- package/.aios-core/product/templates/tmpl-rollback-script.sql +77 -0
- package/.aios-core/product/templates/tmpl-seed-data.sql +140 -0
- package/.aios-core/product/templates/tmpl-smoke-test.sql +16 -0
- package/.aios-core/product/templates/tmpl-staging-copy-merge.sql +139 -0
- package/.aios-core/product/templates/tmpl-stored-proc.sql +140 -0
- package/.aios-core/product/templates/tmpl-trigger.sql +152 -0
- package/.aios-core/product/templates/tmpl-view-materialized.sql +133 -0
- package/.aios-core/product/templates/tmpl-view.sql +177 -0
- package/.aios-core/product/templates/token-exports-css-tmpl.css +240 -0
- package/.aios-core/product/templates/token-exports-tailwind-tmpl.js +395 -0
- package/.aios-core/product/templates/tokens-schema-tmpl.yaml +305 -0
- package/.aios-core/product/templates/workflow-template.yaml +134 -0
- package/.aios-core/quality/metrics-collector.js +572 -0
- package/.aios-core/quality/metrics-hook.js +260 -0
- package/.aios-core/quality/schemas/quality-metrics.schema.json +233 -0
- package/.aios-core/quality/seed-metrics.js +336 -0
- package/.aios-core/scripts/README.md +354 -0
- package/.aios-core/scripts/aios-doc-template.md +325 -0
- package/.aios-core/scripts/batch-migrate-phase1.ps1 +36 -0
- package/.aios-core/scripts/batch-migrate-phase2.ps1 +88 -0
- package/.aios-core/scripts/batch-migrate-phase3.ps1 +45 -0
- package/.aios-core/scripts/command-execution-hook.js +201 -0
- package/.aios-core/scripts/context-detector.js +226 -0
- package/.aios-core/scripts/elicitation-engine.js +385 -0
- package/.aios-core/scripts/elicitation-session-manager.js +300 -0
- package/.aios-core/scripts/migrate-framework-docs.sh +300 -0
- package/.aios-core/scripts/session-context-loader.js +286 -0
- package/.aios-core/scripts/test-template-system.js +941 -0
- package/.aios-core/scripts/validate-phase1.ps1 +35 -0
- package/.aios-core/scripts/workflow-management.md +69 -0
- package/.aios-core/tasks/find-component.md.legacy +391 -0
- package/.aios-core/tasks/generate-commit-message.md.legacy +426 -0
- package/.aios-core/tasks/generate-migration.md.legacy +382 -0
- package/.aios-core/tasks/rollback-modification.md.legacy +307 -0
- package/.aios-core/tasks/update-tests.md.legacy +283 -0
- package/.aios-core/user-guide.md +1413 -0
- package/.aios-core/working-in-the-brownfield.md +361 -0
- package/.claude/CLAUDE.md +221 -0
- package/LICENSE +48 -0
- package/README.md +703 -0
- package/bin/aios-init-old.js +532 -0
- package/bin/aios-init-v4.js +390 -0
- package/bin/aios-init.backup-v1.1.4.js +352 -0
- package/bin/aios-init.js +736 -0
- package/bin/aios-minimal.js +26 -0
- package/bin/aios.js +279 -0
- package/bin/migrate-pm-config.js +219 -0
- package/bin/modules/env-config.js +436 -0
- package/bin/modules/mcp-installer.js +383 -0
- package/bin/utils/install-errors.js +339 -0
- package/bin/utils/install-transaction.js +445 -0
- package/index.d.ts +19 -0
- package/index.esm.js +21 -0
- package/index.js +94 -0
- package/package.json +161 -0
- package/packages/installer/package.json +39 -0
- package/packages/installer/src/config/configure-environment.js +312 -0
- package/packages/installer/src/config/templates/core-config-template.js +183 -0
- package/packages/installer/src/config/templates/env-template.js +127 -0
- package/packages/installer/src/config/validation/config-validator.js +243 -0
- package/packages/installer/src/detection/detect-project-type.js +81 -0
- package/packages/installer/src/wizard/wizard.js +244 -0
- package/packages/installer/tests/integration/environment-configuration.test.js +328 -0
- package/packages/installer/tests/integration/wizard-detection.test.js +349 -0
- package/packages/installer/tests/unit/config-validator.test.js +315 -0
- package/packages/installer/tests/unit/detection/detect-project-type.test.js +401 -0
- package/packages/installer/tests/unit/env-template.test.js +185 -0
- package/src/config/ide-configs.js +189 -0
- package/src/installer/aios-core-installer.js +319 -0
- package/src/installer/dependency-installer.js +335 -0
- package/src/utils/aios-colors.js +234 -0
- package/src/wizard/feedback.js +218 -0
- package/src/wizard/ide-config-generator.js +488 -0
- package/src/wizard/ide-selector.js +84 -0
- package/src/wizard/index.js +589 -0
- package/src/wizard/questions.js +249 -0
- package/src/wizard/validation/index.js +120 -0
- package/src/wizard/validation/report-generator.js +269 -0
- package/src/wizard/validation/troubleshooting-system.js +346 -0
- package/src/wizard/validation/validators/config-validator.js +362 -0
- package/src/wizard/validation/validators/dependency-validator.js +333 -0
- package/src/wizard/validation/validators/file-structure-validator.js +181 -0
- package/src/wizard/validation/validators/mcp-health-checker.js +310 -0
- package/src/wizard/validators.js +274 -0
- package/templates/squad/LICENSE +21 -0
- package/templates/squad/README.md +37 -0
- package/templates/squad/agents/example-agent.yaml +36 -0
- package/templates/squad/package.json +19 -0
- package/templates/squad/squad.yaml +25 -0
- package/templates/squad/tasks/example-task.yaml +46 -0
- package/templates/squad/templates/example-template.md +24 -0
- package/templates/squad/tests/example-agent.test.js +53 -0
- package/templates/squad/workflows/example-workflow.yaml +54 -0
- package/tools/package-builder.js +35 -0
|
@@ -0,0 +1,1109 @@
|
|
|
1
|
+
---
|
|
2
|
+
|
|
3
|
+
# collaborative-edit
|
|
4
|
+
|
|
5
|
+
## Execution Modes
|
|
6
|
+
|
|
7
|
+
**Choose your execution mode:**
|
|
8
|
+
|
|
9
|
+
### 1. YOLO Mode - Fast, Autonomous (0-1 prompts)
|
|
10
|
+
- Autonomous decision making with logging
|
|
11
|
+
- Minimal user interaction
|
|
12
|
+
- **Best for:** Simple, deterministic tasks
|
|
13
|
+
|
|
14
|
+
### 2. Interactive Mode - Balanced, Educational (5-10 prompts) **[DEFAULT]**
|
|
15
|
+
- Explicit decision checkpoints
|
|
16
|
+
- Educational explanations
|
|
17
|
+
- **Best for:** Learning, complex decisions
|
|
18
|
+
|
|
19
|
+
### 3. Pre-Flight Planning - Comprehensive Upfront Planning
|
|
20
|
+
- Task analysis phase (identify all ambiguities)
|
|
21
|
+
- Zero ambiguity execution
|
|
22
|
+
- **Best for:** Ambiguous requirements, critical work
|
|
23
|
+
|
|
24
|
+
**Parameter:** `mode` (optional, default: `interactive`)
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Task Definition (AIOS Task Format V1.0)
|
|
29
|
+
|
|
30
|
+
```yaml
|
|
31
|
+
task: collaborativeEdit()
|
|
32
|
+
responsƔvel: River (Facilitator)
|
|
33
|
+
responsavel_type: Agente
|
|
34
|
+
atomic_layer: Molecule
|
|
35
|
+
|
|
36
|
+
**Entrada:**
|
|
37
|
+
- campo: task
|
|
38
|
+
tipo: string
|
|
39
|
+
origem: User Input
|
|
40
|
+
obrigatório: true
|
|
41
|
+
validação: Must be registered task
|
|
42
|
+
|
|
43
|
+
- campo: parameters
|
|
44
|
+
tipo: object
|
|
45
|
+
origem: User Input
|
|
46
|
+
obrigatório: false
|
|
47
|
+
validação: Valid task parameters
|
|
48
|
+
|
|
49
|
+
- campo: mode
|
|
50
|
+
tipo: string
|
|
51
|
+
origem: User Input
|
|
52
|
+
obrigatório: false
|
|
53
|
+
validação: yolo|interactive|pre-flight
|
|
54
|
+
|
|
55
|
+
**SaĆda:**
|
|
56
|
+
- campo: execution_result
|
|
57
|
+
tipo: object
|
|
58
|
+
destino: Memory
|
|
59
|
+
persistido: false
|
|
60
|
+
|
|
61
|
+
- campo: logs
|
|
62
|
+
tipo: array
|
|
63
|
+
destino: File (.ai/logs/*)
|
|
64
|
+
persistido: true
|
|
65
|
+
|
|
66
|
+
- campo: state
|
|
67
|
+
tipo: object
|
|
68
|
+
destino: State management
|
|
69
|
+
persistido: true
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## Pre-Conditions
|
|
75
|
+
|
|
76
|
+
**Purpose:** Validate prerequisites BEFORE task execution (blocking)
|
|
77
|
+
|
|
78
|
+
**Checklist:**
|
|
79
|
+
|
|
80
|
+
```yaml
|
|
81
|
+
pre-conditions:
|
|
82
|
+
- [ ] Task is registered; required parameters provided; dependencies met
|
|
83
|
+
tipo: pre-condition
|
|
84
|
+
blocker: true
|
|
85
|
+
validação: |
|
|
86
|
+
Check task is registered; required parameters provided; dependencies met
|
|
87
|
+
error_message: "Pre-condition failed: Task is registered; required parameters provided; dependencies met"
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Post-Conditions
|
|
93
|
+
|
|
94
|
+
**Purpose:** Validate execution success AFTER task completes
|
|
95
|
+
|
|
96
|
+
**Checklist:**
|
|
97
|
+
|
|
98
|
+
```yaml
|
|
99
|
+
post-conditions:
|
|
100
|
+
- [ ] Task completed; exit code 0; expected outputs created
|
|
101
|
+
tipo: post-condition
|
|
102
|
+
blocker: true
|
|
103
|
+
validação: |
|
|
104
|
+
Verify task completed; exit code 0; expected outputs created
|
|
105
|
+
error_message: "Post-condition failed: Task completed; exit code 0; expected outputs created"
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## Acceptance Criteria
|
|
111
|
+
|
|
112
|
+
**Purpose:** Definitive pass/fail criteria for task completion
|
|
113
|
+
|
|
114
|
+
**Checklist:**
|
|
115
|
+
|
|
116
|
+
```yaml
|
|
117
|
+
acceptance-criteria:
|
|
118
|
+
- [ ] Task completed as expected; side effects documented
|
|
119
|
+
tipo: acceptance-criterion
|
|
120
|
+
blocker: true
|
|
121
|
+
validação: |
|
|
122
|
+
Assert task completed as expected; side effects documented
|
|
123
|
+
error_message: "Acceptance criterion not met: Task completed as expected; side effects documented"
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## Tools
|
|
129
|
+
|
|
130
|
+
**External/shared resources used by this task:**
|
|
131
|
+
|
|
132
|
+
- **Tool:** task-runner
|
|
133
|
+
- **Purpose:** Task execution and orchestration
|
|
134
|
+
- **Source:** .aios-core/core/task-runner.js
|
|
135
|
+
|
|
136
|
+
- **Tool:** logger
|
|
137
|
+
- **Purpose:** Execution logging and error tracking
|
|
138
|
+
- **Source:** .aios-core/utils/logger.js
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## Scripts
|
|
143
|
+
|
|
144
|
+
**Agent-specific code for this task:**
|
|
145
|
+
|
|
146
|
+
- **Script:** execute-task.js
|
|
147
|
+
- **Purpose:** Generic task execution wrapper
|
|
148
|
+
- **Language:** JavaScript
|
|
149
|
+
- **Location:** .aios-core/scripts/execute-task.js
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## Error Handling
|
|
154
|
+
|
|
155
|
+
**Strategy:** retry
|
|
156
|
+
|
|
157
|
+
**Common Errors:**
|
|
158
|
+
|
|
159
|
+
1. **Error:** Task Not Found
|
|
160
|
+
- **Cause:** Specified task not registered in system
|
|
161
|
+
- **Resolution:** Verify task name and registration
|
|
162
|
+
- **Recovery:** List available tasks, suggest similar
|
|
163
|
+
|
|
164
|
+
2. **Error:** Invalid Parameters
|
|
165
|
+
- **Cause:** Task parameters do not match expected schema
|
|
166
|
+
- **Resolution:** Validate parameters against task definition
|
|
167
|
+
- **Recovery:** Provide parameter template, reject execution
|
|
168
|
+
|
|
169
|
+
3. **Error:** Execution Timeout
|
|
170
|
+
- **Cause:** Task exceeds maximum execution time
|
|
171
|
+
- **Resolution:** Optimize task or increase timeout
|
|
172
|
+
- **Recovery:** Kill task, cleanup resources, log state
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## Performance
|
|
177
|
+
|
|
178
|
+
**Expected Metrics:**
|
|
179
|
+
|
|
180
|
+
```yaml
|
|
181
|
+
duration_expected: 2-5 min (estimated)
|
|
182
|
+
cost_estimated: $0.001-0.003
|
|
183
|
+
token_usage: ~1,000-3,000 tokens
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
**Optimization Notes:**
|
|
187
|
+
- Parallelize independent operations; reuse atom results; implement early exits
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## Metadata
|
|
192
|
+
|
|
193
|
+
```yaml
|
|
194
|
+
story: N/A
|
|
195
|
+
version: 1.0.0
|
|
196
|
+
dependencies:
|
|
197
|
+
- N/A
|
|
198
|
+
tags:
|
|
199
|
+
- automation
|
|
200
|
+
- workflow
|
|
201
|
+
updated_at: 2025-11-17
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
# No checklists needed - this task manages real-time collaborative editing sessions, no document validation required
|
|
207
|
+
tools:
|
|
208
|
+
- github-cli
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
# Collaborative Edit - AIOS Developer Task
|
|
212
|
+
|
|
213
|
+
## Purpose
|
|
214
|
+
Create and manage collaborative editing sessions for real-time component modification with multiple participants.
|
|
215
|
+
|
|
216
|
+
## Command Pattern
|
|
217
|
+
```
|
|
218
|
+
*collaborative-edit <action> [options]
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
## Actions
|
|
222
|
+
- `start`: Start a new collaborative editing session
|
|
223
|
+
- `join`: Join an existing session
|
|
224
|
+
- `leave`: Leave current session
|
|
225
|
+
- `end`: End a collaborative session
|
|
226
|
+
- `status`: Check session status
|
|
227
|
+
|
|
228
|
+
## Parameters
|
|
229
|
+
### Start Session
|
|
230
|
+
- `--component <path>`: Component to edit collaboratively
|
|
231
|
+
- `--participants <users>`: Initial participants (comma-separated)
|
|
232
|
+
- `--mode <mode>`: Editing mode (live, turn-based, review)
|
|
233
|
+
- `--timeout <minutes>`: Session timeout
|
|
234
|
+
|
|
235
|
+
### Join Session
|
|
236
|
+
- `--session-id <id>`: Session ID to join
|
|
237
|
+
- `--role <role>`: Participant role (editor, reviewer, observer)
|
|
238
|
+
|
|
239
|
+
## Examples
|
|
240
|
+
```bash
|
|
241
|
+
# Start collaborative editing session
|
|
242
|
+
*collaborative-edit start --component aios-core/agents/data-agent.md --participants alice,bob --mode live
|
|
243
|
+
|
|
244
|
+
# Join existing session
|
|
245
|
+
*collaborative-edit join --session-id session-1234567890 --role editor
|
|
246
|
+
|
|
247
|
+
# Check session status
|
|
248
|
+
*collaborative-edit status --session-id session-1234567890
|
|
249
|
+
|
|
250
|
+
# End session and merge changes
|
|
251
|
+
*collaborative-edit end --session-id session-1234567890 --merge-strategy collaborative
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
## Implementation
|
|
255
|
+
|
|
256
|
+
```javascript
|
|
257
|
+
const fs = require('fs').promises;
|
|
258
|
+
const path = require('path');
|
|
259
|
+
const chalk = require('chalk');
|
|
260
|
+
const inquirer = require('inquirer');
|
|
261
|
+
const EventEmitter = require('events');
|
|
262
|
+
|
|
263
|
+
class CollaborativeEditTask extends EventEmitter {
|
|
264
|
+
constructor() {
|
|
265
|
+
super();
|
|
266
|
+
this.taskName = 'collaborative-edit';
|
|
267
|
+
this.description = 'Manage collaborative editing sessions';
|
|
268
|
+
this.rootPath = process.cwd();
|
|
269
|
+
this.sessionDir = path.join(this.rootPath, '.aios', 'sessions');
|
|
270
|
+
this.synchronizer = null;
|
|
271
|
+
this.conflictManager = null;
|
|
272
|
+
this.currentSession = null;
|
|
273
|
+
this.editHistory = [];
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
async execute(params) {
|
|
277
|
+
try {
|
|
278
|
+
console.log(chalk.blue('š„ AIOS Collaborative Editing'));
|
|
279
|
+
console.log(chalk.gray('Real-time collaborative modification system\n'));
|
|
280
|
+
|
|
281
|
+
// Parse action and parameters
|
|
282
|
+
const { action, config } = await this.parseParameters(params);
|
|
283
|
+
|
|
284
|
+
// Initialize dependencies
|
|
285
|
+
await this.initializeDependencies();
|
|
286
|
+
|
|
287
|
+
// Execute action
|
|
288
|
+
let result;
|
|
289
|
+
switch (action) {
|
|
290
|
+
case 'start':
|
|
291
|
+
result = await this.startSession(config);
|
|
292
|
+
break;
|
|
293
|
+
case 'join':
|
|
294
|
+
result = await this.joinSession(config);
|
|
295
|
+
break;
|
|
296
|
+
case 'leave':
|
|
297
|
+
result = await this.leaveSession(config);
|
|
298
|
+
break;
|
|
299
|
+
case 'end':
|
|
300
|
+
result = await this.endSession(config);
|
|
301
|
+
break;
|
|
302
|
+
case 'status':
|
|
303
|
+
result = await this.getSessionStatus(config);
|
|
304
|
+
break;
|
|
305
|
+
default:
|
|
306
|
+
throw new Error(`Unknown action: ${action}`);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
return result;
|
|
310
|
+
|
|
311
|
+
} catch (error) {
|
|
312
|
+
console.error(chalk.red(`\nā Collaborative edit failed: ${error.message}`));
|
|
313
|
+
throw error;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
async parseParameters(params) {
|
|
318
|
+
if (params.length < 1) {
|
|
319
|
+
throw new Error('Usage: *collaborative-edit <action> [options]');
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
const action = params[0];
|
|
323
|
+
const config = {
|
|
324
|
+
sessionId: null,
|
|
325
|
+
componentPath: null,
|
|
326
|
+
participants: [],
|
|
327
|
+
mode: 'live',
|
|
328
|
+
timeout: 60,
|
|
329
|
+
role: 'editor',
|
|
330
|
+
mergeStrategy: 'collaborative'
|
|
331
|
+
};
|
|
332
|
+
|
|
333
|
+
// Parse options
|
|
334
|
+
for (let i = 1; i < params.length; i++) {
|
|
335
|
+
const param = params[i];
|
|
336
|
+
|
|
337
|
+
if (param.startsWith('--session-id') && params[i + 1]) {
|
|
338
|
+
config.sessionId = params[++i];
|
|
339
|
+
} else if (param.startsWith('--component') && params[i + 1]) {
|
|
340
|
+
config.componentPath = params[++i];
|
|
341
|
+
} else if (param.startsWith('--participants') && params[i + 1]) {
|
|
342
|
+
config.participants = params[++i].split(',').map(p => p.trim());
|
|
343
|
+
} else if (param.startsWith('--mode') && params[i + 1]) {
|
|
344
|
+
config.mode = params[++i];
|
|
345
|
+
} else if (param.startsWith('--timeout') && params[i + 1]) {
|
|
346
|
+
config.timeout = parseInt(params[++i]);
|
|
347
|
+
} else if (param.startsWith('--role') && params[i + 1]) {
|
|
348
|
+
config.role = params[++i];
|
|
349
|
+
} else if (param.startsWith('--merge-strategy') && params[i + 1]) {
|
|
350
|
+
config.mergeStrategy = params[++i];
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
// Validate action
|
|
355
|
+
const validActions = ['start', 'join', 'leave', 'end', 'status'];
|
|
356
|
+
if (!validActions.includes(action)) {
|
|
357
|
+
throw new Error(`Invalid action: ${action}. Must be one of: ${validActions.join(', ')}`);
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
return { action, config };
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
async initializeDependencies() {
|
|
364
|
+
// const ModificationSynchronizer = require('../scripts/modification-synchronizer'); // Archived in archived-utilities/ (Story 3.1.3)
|
|
365
|
+
// this.synchronizer = new ModificationSynchronizer({ rootPath: this.rootPath }); // Archived in archived-utilities/ (Story 3.1.3)
|
|
366
|
+
// await this.synchronizer.initialize(); // Archived in archived-utilities/ (Story 3.1.3)
|
|
367
|
+
|
|
368
|
+
// const ConflictManager = require('../scripts/conflict-manager'); // Archived in archived-utilities/ (Story 3.1.2)
|
|
369
|
+
// this.conflictManager = new ConflictManager({ rootPath: this.rootPath }); // Archived in archived-utilities/ (Story 3.1.2)
|
|
370
|
+
|
|
371
|
+
await fs.mkdir(this.sessionDir, { recursive: true });
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
async startSession(config) {
|
|
375
|
+
console.log(chalk.blue('š Starting collaborative session...'));
|
|
376
|
+
|
|
377
|
+
// Validate component exists
|
|
378
|
+
const component = await this.validateComponent(config.componentPath);
|
|
379
|
+
|
|
380
|
+
// Generate session ID
|
|
381
|
+
const sessionId = `session-${Date.now()}-${Math.random().toString(36).substr(2, 6)}`;
|
|
382
|
+
|
|
383
|
+
// Create session
|
|
384
|
+
const session = {
|
|
385
|
+
id: sessionId,
|
|
386
|
+
componentPath: config.componentPath,
|
|
387
|
+
componentType: component.type,
|
|
388
|
+
participants: [
|
|
389
|
+
{
|
|
390
|
+
id: process.env.USER || 'initiator',
|
|
391
|
+
role: 'owner',
|
|
392
|
+
joinedAt: new Date().toISOString(),
|
|
393
|
+
status: 'active'
|
|
394
|
+
}
|
|
395
|
+
],
|
|
396
|
+
mode: config.mode,
|
|
397
|
+
status: 'active',
|
|
398
|
+
createdAt: new Date().toISOString(),
|
|
399
|
+
timeout: config.timeout,
|
|
400
|
+
editHistory: [],
|
|
401
|
+
locks: new Map(),
|
|
402
|
+
metadata: {
|
|
403
|
+
originalContent: component.content,
|
|
404
|
+
currentContent: component.content,
|
|
405
|
+
version: 0
|
|
406
|
+
}
|
|
407
|
+
};
|
|
408
|
+
|
|
409
|
+
// Add initial participants
|
|
410
|
+
for (const participant of config.participants) {
|
|
411
|
+
if (participant !== session.participants[0].id) {
|
|
412
|
+
session.participants.push({
|
|
413
|
+
id: participant,
|
|
414
|
+
role: 'editor',
|
|
415
|
+
joinedAt: new Date().toISOString(),
|
|
416
|
+
status: 'invited'
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
// Save session
|
|
422
|
+
await this.saveSession(session);
|
|
423
|
+
|
|
424
|
+
// Start synchronization
|
|
425
|
+
await this.synchronizer.startSync();
|
|
426
|
+
|
|
427
|
+
// Create collaborative workspace
|
|
428
|
+
await this.createCollaborativeWorkspace(session);
|
|
429
|
+
|
|
430
|
+
// Set as current session
|
|
431
|
+
this.currentSession = session;
|
|
432
|
+
|
|
433
|
+
// Start real-time monitoring
|
|
434
|
+
this.startRealtimeMonitoring(session);
|
|
435
|
+
|
|
436
|
+
console.log(chalk.green('\nā
Collaborative session created'));
|
|
437
|
+
console.log(chalk.gray(` Session ID: ${sessionId}`));
|
|
438
|
+
console.log(chalk.gray(` Component: ${config.componentPath}`));
|
|
439
|
+
console.log(chalk.gray(` Mode: ${config.mode}`));
|
|
440
|
+
console.log(chalk.gray(` Participants: ${session.participants.length}`));
|
|
441
|
+
|
|
442
|
+
if (config.mode === 'live') {
|
|
443
|
+
console.log(chalk.blue('\nš” Live editing enabled - changes sync in real-time'));
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
return {
|
|
447
|
+
success: true,
|
|
448
|
+
sessionId: sessionId,
|
|
449
|
+
componentPath: config.componentPath,
|
|
450
|
+
participants: session.participants,
|
|
451
|
+
mode: config.mode,
|
|
452
|
+
workspace: await this.getWorkspaceInfo(session)
|
|
453
|
+
};
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
async joinSession(config) {
|
|
457
|
+
if (!config.sessionId) {
|
|
458
|
+
throw new Error('Session ID required to join');
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
console.log(chalk.blue(`š Joining session ${config.sessionId}...`));
|
|
462
|
+
|
|
463
|
+
// Load session
|
|
464
|
+
const session = await this.loadSession(config.sessionId);
|
|
465
|
+
|
|
466
|
+
if (session.status !== 'active') {
|
|
467
|
+
throw new Error('Session is not active');
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
// Check if already participant
|
|
471
|
+
const participantId = process.env.USER || 'user';
|
|
472
|
+
let participant = session.participants.find(p => p.id === participantId);
|
|
473
|
+
|
|
474
|
+
if (!participant) {
|
|
475
|
+
// Add new participant
|
|
476
|
+
participant = {
|
|
477
|
+
id: participantId,
|
|
478
|
+
role: config.role,
|
|
479
|
+
joinedAt: new Date().toISOString(),
|
|
480
|
+
status: 'active'
|
|
481
|
+
};
|
|
482
|
+
session.participants.push(participant);
|
|
483
|
+
} else {
|
|
484
|
+
// Update existing participant
|
|
485
|
+
participant.status = 'active';
|
|
486
|
+
participant.role = config.role;
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
// Update session
|
|
490
|
+
await this.saveSession(session);
|
|
491
|
+
|
|
492
|
+
// Set as current session
|
|
493
|
+
this.currentSession = session;
|
|
494
|
+
|
|
495
|
+
// Subscribe to updates
|
|
496
|
+
await this.subscribeToSessionUpdates(session);
|
|
497
|
+
|
|
498
|
+
// Load current state
|
|
499
|
+
const workspace = await this.loadWorkspace(session);
|
|
500
|
+
|
|
501
|
+
console.log(chalk.green('\nā
Joined collaborative session'));
|
|
502
|
+
console.log(chalk.gray(` Role: ${config.role}`));
|
|
503
|
+
console.log(chalk.gray(` Active participants: ${session.participants.filter(p => p.status === 'active').length}`));
|
|
504
|
+
console.log(chalk.gray(` Current version: ${session.metadata.version}`));
|
|
505
|
+
|
|
506
|
+
// Show current editing status
|
|
507
|
+
if (session.mode === 'turn-based') {
|
|
508
|
+
const currentEditor = this.getCurrentEditor(session);
|
|
509
|
+
console.log(chalk.yellow(`\nā³ Current editor: ${currentEditor || 'None'}`));
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
return {
|
|
513
|
+
success: true,
|
|
514
|
+
sessionId: session.id,
|
|
515
|
+
role: config.role,
|
|
516
|
+
workspace: workspace,
|
|
517
|
+
participants: session.participants.filter(p => p.status === 'active')
|
|
518
|
+
};
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
async leaveSession(config) {
|
|
522
|
+
const sessionId = config.sessionId || (this.currentSession && this.currentSession.id);
|
|
523
|
+
|
|
524
|
+
if (!sessionId) {
|
|
525
|
+
throw new Error('No active session to leave');
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
console.log(chalk.blue(`š Leaving session ${sessionId}...`));
|
|
529
|
+
|
|
530
|
+
// Load session
|
|
531
|
+
const session = await this.loadSession(sessionId);
|
|
532
|
+
|
|
533
|
+
// Update participant status
|
|
534
|
+
const participantId = process.env.USER || 'user';
|
|
535
|
+
const participant = session.participants.find(p => p.id === participantId);
|
|
536
|
+
|
|
537
|
+
if (participant) {
|
|
538
|
+
participant.status = 'left';
|
|
539
|
+
participant.leftAt = new Date().toISOString();
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
// Save any pending changes
|
|
543
|
+
if (this.currentSession && this.editHistory.length > 0) {
|
|
544
|
+
await this.saveEditHistory(session);
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
// Update session
|
|
548
|
+
await this.saveSession(session);
|
|
549
|
+
|
|
550
|
+
// Clear current session
|
|
551
|
+
this.currentSession = null;
|
|
552
|
+
|
|
553
|
+
console.log(chalk.green('ā
Left collaborative session'));
|
|
554
|
+
|
|
555
|
+
return {
|
|
556
|
+
success: true,
|
|
557
|
+
sessionId: sessionId
|
|
558
|
+
};
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
async endSession(config) {
|
|
562
|
+
if (!config.sessionId) {
|
|
563
|
+
throw new Error('Session ID required to end session');
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
console.log(chalk.blue(`š Ending session ${config.sessionId}...`));
|
|
567
|
+
|
|
568
|
+
// Load session
|
|
569
|
+
const session = await this.loadSession(config.sessionId);
|
|
570
|
+
|
|
571
|
+
// Check permissions
|
|
572
|
+
const participantId = process.env.USER || 'user';
|
|
573
|
+
const participant = session.participants.find(p => p.id === participantId);
|
|
574
|
+
|
|
575
|
+
if (!participant || participant.role !== 'owner') {
|
|
576
|
+
throw new Error('Only session owner can end the session');
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
// Finalize all pending edits
|
|
580
|
+
await this.finalizeEdits(session);
|
|
581
|
+
|
|
582
|
+
// Merge changes
|
|
583
|
+
console.log(chalk.gray('Merging collaborative changes...'));
|
|
584
|
+
const mergeResult = await this.mergeCollaborativeChanges(session, config.mergeStrategy);
|
|
585
|
+
|
|
586
|
+
// Update session status
|
|
587
|
+
session.status = 'completed';
|
|
588
|
+
session.endedAt = new Date().toISOString();
|
|
589
|
+
session.mergeResult = mergeResult;
|
|
590
|
+
|
|
591
|
+
// Save final session state
|
|
592
|
+
await this.saveSession(session);
|
|
593
|
+
|
|
594
|
+
// Stop synchronization
|
|
595
|
+
await this.synchronizer.stopSync();
|
|
596
|
+
|
|
597
|
+
// Archive session
|
|
598
|
+
await this.archiveSession(session);
|
|
599
|
+
|
|
600
|
+
console.log(chalk.green('\nā
Collaborative session ended'));
|
|
601
|
+
console.log(chalk.gray(` Total edits: ${session.editHistory.length}`));
|
|
602
|
+
console.log(chalk.gray(` Participants: ${session.participants.length}`));
|
|
603
|
+
console.log(chalk.gray(` Duration: ${this.calculateDuration(session)}`));
|
|
604
|
+
|
|
605
|
+
if (mergeResult.success) {
|
|
606
|
+
console.log(chalk.green(` Changes merged successfully`));
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
return {
|
|
610
|
+
success: true,
|
|
611
|
+
sessionId: session.id,
|
|
612
|
+
mergeResult: mergeResult,
|
|
613
|
+
statistics: this.getSessionStatistics(session)
|
|
614
|
+
};
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
async getSessionStatus(config) {
|
|
618
|
+
const sessionId = config.sessionId || (this.currentSession && this.currentSession.id);
|
|
619
|
+
|
|
620
|
+
if (!sessionId) {
|
|
621
|
+
// Show all active sessions
|
|
622
|
+
return await this.listActiveSessions();
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
// Load specific session
|
|
626
|
+
const session = await this.loadSession(sessionId);
|
|
627
|
+
|
|
628
|
+
console.log(chalk.blue('\nš Session Status'));
|
|
629
|
+
console.log(chalk.gray('ā'.repeat(50)));
|
|
630
|
+
|
|
631
|
+
console.log(`ID: ${chalk.white(session.id)}`);
|
|
632
|
+
console.log(`Component: ${chalk.white(session.componentPath)}`);
|
|
633
|
+
console.log(`Status: ${this.formatStatus(session.status)}`);
|
|
634
|
+
console.log(`Mode: ${chalk.white(session.mode)}`);
|
|
635
|
+
console.log(`Created: ${chalk.white(new Date(session.createdAt).toLocaleString())}`);
|
|
636
|
+
|
|
637
|
+
console.log(chalk.blue('\nš„ Participants:'));
|
|
638
|
+
session.participants.forEach(p => {
|
|
639
|
+
const status = p.status === 'active' ? chalk.green('ā') : chalk.gray('ā');
|
|
640
|
+
console.log(` ${status} ${p.id} (${p.role})`);
|
|
641
|
+
});
|
|
642
|
+
|
|
643
|
+
console.log(chalk.blue('\nš Edit History:'));
|
|
644
|
+
console.log(` Total edits: ${session.editHistory.length}`);
|
|
645
|
+
console.log(` Current version: ${session.metadata.version}`);
|
|
646
|
+
|
|
647
|
+
if (session.editHistory.length > 0) {
|
|
648
|
+
const recentEdits = session.editHistory.slice(-5);
|
|
649
|
+
console.log(' Recent edits:');
|
|
650
|
+
recentEdits.forEach(edit => {
|
|
651
|
+
console.log(` - ${edit.author} at ${new Date(edit.timestamp).toLocaleTimeString()}`);
|
|
652
|
+
});
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
if (session.mode === 'turn-based') {
|
|
656
|
+
const currentEditor = this.getCurrentEditor(session);
|
|
657
|
+
console.log(chalk.yellow(`\nā³ Current turn: ${currentEditor || 'None'}`));
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
return {
|
|
661
|
+
success: true,
|
|
662
|
+
session: session,
|
|
663
|
+
activeParticipants: session.participants.filter(p => p.status === 'active').length,
|
|
664
|
+
isCurrentSession: sessionId === (this.currentSession && this.currentSession.id)
|
|
665
|
+
};
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
// Helper methods
|
|
669
|
+
|
|
670
|
+
async validateComponent(componentPath) {
|
|
671
|
+
const fullPath = path.resolve(this.rootPath, componentPath);
|
|
672
|
+
|
|
673
|
+
try {
|
|
674
|
+
const stats = await fs.stat(fullPath);
|
|
675
|
+
if (!stats.isFile()) {
|
|
676
|
+
throw new Error('Component path must be a file');
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
const content = await fs.readFile(fullPath, 'utf-8');
|
|
680
|
+
const type = this.detectComponentType(fullPath);
|
|
681
|
+
|
|
682
|
+
return {
|
|
683
|
+
path: componentPath,
|
|
684
|
+
fullPath: fullPath,
|
|
685
|
+
type: type,
|
|
686
|
+
content: content,
|
|
687
|
+
size: stats.size
|
|
688
|
+
};
|
|
689
|
+
|
|
690
|
+
} catch (error) {
|
|
691
|
+
if (error.code === 'ENOENT') {
|
|
692
|
+
throw new Error(`Component not found: ${componentPath}`);
|
|
693
|
+
}
|
|
694
|
+
throw error;
|
|
695
|
+
}
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
detectComponentType(filePath) {
|
|
699
|
+
if (filePath.includes('/agents/')) return 'agent';
|
|
700
|
+
if (filePath.includes('/tasks/')) return 'task';
|
|
701
|
+
if (filePath.includes('/workflows/')) return 'workflow';
|
|
702
|
+
if (filePath.includes('/utils/')) return 'util';
|
|
703
|
+
return 'unknown';
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
async saveSession(session) {
|
|
707
|
+
const sessionFile = path.join(this.sessionDir, `${session.id}.json`);
|
|
708
|
+
await fs.writeFile(sessionFile, JSON.stringify(session, null, 2));
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
async loadSession(sessionId) {
|
|
712
|
+
const sessionFile = path.join(this.sessionDir, `${sessionId}.json`);
|
|
713
|
+
|
|
714
|
+
try {
|
|
715
|
+
const content = await fs.readFile(sessionFile, 'utf-8');
|
|
716
|
+
return JSON.parse(content);
|
|
717
|
+
} catch (error) {
|
|
718
|
+
if (error.code === 'ENOENT') {
|
|
719
|
+
throw new Error(`Session not found: ${sessionId}`);
|
|
720
|
+
}
|
|
721
|
+
throw error;
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
async createCollaborativeWorkspace(session) {
|
|
726
|
+
const workspaceDir = path.join(this.sessionDir, session.id, 'workspace');
|
|
727
|
+
await fs.mkdir(workspaceDir, { recursive: true });
|
|
728
|
+
|
|
729
|
+
// Create working copy
|
|
730
|
+
const workingFile = path.join(workspaceDir, 'working.txt');
|
|
731
|
+
await fs.writeFile(workingFile, session.metadata.originalContent);
|
|
732
|
+
|
|
733
|
+
// Create version history
|
|
734
|
+
const versionDir = path.join(workspaceDir, 'versions');
|
|
735
|
+
await fs.mkdir(versionDir, { recursive: true });
|
|
736
|
+
|
|
737
|
+
const v0File = path.join(versionDir, 'v0.txt');
|
|
738
|
+
await fs.writeFile(v0File, session.metadata.originalContent);
|
|
739
|
+
|
|
740
|
+
// Create edit log
|
|
741
|
+
const editLog = path.join(workspaceDir, 'edits.jsonl');
|
|
742
|
+
await fs.writeFile(editLog, '');
|
|
743
|
+
|
|
744
|
+
return workspaceDir;
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
async loadWorkspace(session) {
|
|
748
|
+
const workspaceDir = path.join(this.sessionDir, session.id, 'workspace');
|
|
749
|
+
const workingFile = path.join(workspaceDir, 'working.txt');
|
|
750
|
+
|
|
751
|
+
const currentContent = await fs.readFile(workingFile, 'utf-8');
|
|
752
|
+
|
|
753
|
+
return {
|
|
754
|
+
workspaceDir: workspaceDir,
|
|
755
|
+
currentContent: currentContent,
|
|
756
|
+
version: session.metadata.version,
|
|
757
|
+
lastEdit: session.editHistory.length > 0 ?
|
|
758
|
+
session.editHistory[session.editHistory.length - 1] : null
|
|
759
|
+
};
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
startRealtimeMonitoring(session) {
|
|
763
|
+
if (session.mode !== 'live') return;
|
|
764
|
+
|
|
765
|
+
// Set up file watcher for workspace
|
|
766
|
+
const workspaceDir = path.join(this.sessionDir, session.id, 'workspace');
|
|
767
|
+
const workingFile = path.join(workspaceDir, 'working.txt');
|
|
768
|
+
|
|
769
|
+
// Monitor for changes
|
|
770
|
+
let lastContent = session.metadata.currentContent;
|
|
771
|
+
|
|
772
|
+
this.monitorInterval = setInterval(async () => {
|
|
773
|
+
try {
|
|
774
|
+
const currentContent = await fs.readFile(workingFile, 'utf-8');
|
|
775
|
+
if (currentContent !== lastContent) {
|
|
776
|
+
// Detect and broadcast changes
|
|
777
|
+
const edit = {
|
|
778
|
+
id: `edit-${Date.now()}`,
|
|
779
|
+
author: process.env.USER || 'unknown',
|
|
780
|
+
timestamp: new Date().toISOString(),
|
|
781
|
+
type: 'content_change',
|
|
782
|
+
diff: this.generateDiff(lastContent, currentContent)
|
|
783
|
+
};
|
|
784
|
+
|
|
785
|
+
await this.broadcastEdit(session, edit);
|
|
786
|
+
lastContent = currentContent;
|
|
787
|
+
}
|
|
788
|
+
} catch (error) {
|
|
789
|
+
// Workspace may have been cleaned up
|
|
790
|
+
}
|
|
791
|
+
}, 1000); // Check every second
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
async subscribeToSessionUpdates(session) {
|
|
795
|
+
// Subscribe to edit broadcasts
|
|
796
|
+
const editLog = path.join(this.sessionDir, session.id, 'workspace', 'edits.jsonl');
|
|
797
|
+
|
|
798
|
+
// Watch for new edits
|
|
799
|
+
let lastSize = 0;
|
|
800
|
+
this.watchInterval = setInterval(async () => {
|
|
801
|
+
try {
|
|
802
|
+
const stats = await fs.stat(editLog);
|
|
803
|
+
if (stats.size > lastSize) {
|
|
804
|
+
// Read new edits
|
|
805
|
+
const content = await fs.readFile(editLog, 'utf-8');
|
|
806
|
+
const lines = content.trim().split('\n');
|
|
807
|
+
const newEdits = lines.slice(this.editHistory.length);
|
|
808
|
+
|
|
809
|
+
for (const line of newEdits) {
|
|
810
|
+
if (line) {
|
|
811
|
+
const edit = JSON.parse(line);
|
|
812
|
+
await this.applyRemoteEdit(session, edit);
|
|
813
|
+
this.editHistory.push(edit);
|
|
814
|
+
}
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
lastSize = stats.size;
|
|
818
|
+
}
|
|
819
|
+
} catch (error) {
|
|
820
|
+
// Edit log may not exist yet
|
|
821
|
+
}
|
|
822
|
+
}, 500); // Check every 500ms
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
async broadcastEdit(session, edit) {
|
|
826
|
+
// Add to session history
|
|
827
|
+
session.editHistory.push(edit);
|
|
828
|
+
session.metadata.version++;
|
|
829
|
+
|
|
830
|
+
// Write to edit log
|
|
831
|
+
const editLog = path.join(this.sessionDir, session.id, 'workspace', 'edits.jsonl');
|
|
832
|
+
await fs.appendFile(editLog, JSON.stringify(edit) + '\n');
|
|
833
|
+
|
|
834
|
+
// Save session state
|
|
835
|
+
await this.saveSession(session);
|
|
836
|
+
|
|
837
|
+
// Emit event
|
|
838
|
+
this.emit('edit_broadcast', { sessionId: session.id, edit });
|
|
839
|
+
}
|
|
840
|
+
|
|
841
|
+
async applyRemoteEdit(session, edit) {
|
|
842
|
+
if (edit.author === (process.env.USER || 'unknown')) {
|
|
843
|
+
return; // Skip own edits
|
|
844
|
+
}
|
|
845
|
+
|
|
846
|
+
console.log(chalk.gray(`š ${edit.author} made changes`));
|
|
847
|
+
|
|
848
|
+
// Apply edit to workspace
|
|
849
|
+
const workingFile = path.join(this.sessionDir, session.id, 'workspace', 'working.txt');
|
|
850
|
+
|
|
851
|
+
if (edit.type === 'content_change' && edit.content) {
|
|
852
|
+
await fs.writeFile(workingFile, edit.content);
|
|
853
|
+
}
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
generateDiff(oldContent, newContent) {
|
|
857
|
+
// Simple diff generation
|
|
858
|
+
const oldLines = oldContent.split('\n');
|
|
859
|
+
const newLines = newContent.split('\n');
|
|
860
|
+
|
|
861
|
+
const diff = {
|
|
862
|
+
additions: 0,
|
|
863
|
+
deletions: 0,
|
|
864
|
+
changes: []
|
|
865
|
+
};
|
|
866
|
+
|
|
867
|
+
// Compare lines
|
|
868
|
+
const maxLines = Math.max(oldLines.length, newLines.length);
|
|
869
|
+
for (let i = 0; i < maxLines; i++) {
|
|
870
|
+
if (oldLines[i] !== newLines[i]) {
|
|
871
|
+
if (i >= oldLines.length) {
|
|
872
|
+
diff.additions++;
|
|
873
|
+
diff.changes.push({ type: 'add', line: i, content: newLines[i] });
|
|
874
|
+
} else if (i >= newLines.length) {
|
|
875
|
+
diff.deletions++;
|
|
876
|
+
diff.changes.push({ type: 'delete', line: i, content: oldLines[i] });
|
|
877
|
+
} else {
|
|
878
|
+
diff.changes.push({ type: 'modify', line: i, old: oldLines[i], new: newLines[i] });
|
|
879
|
+
}
|
|
880
|
+
}
|
|
881
|
+
}
|
|
882
|
+
|
|
883
|
+
return diff;
|
|
884
|
+
}
|
|
885
|
+
|
|
886
|
+
getCurrentEditor(session) {
|
|
887
|
+
if (session.mode !== 'turn-based') return null;
|
|
888
|
+
|
|
889
|
+
// Find current turn holder
|
|
890
|
+
const activeTurn = session.editHistory.find(edit =>
|
|
891
|
+
edit.type === 'turn_taken' && !edit.completed
|
|
892
|
+
);
|
|
893
|
+
|
|
894
|
+
return activeTurn ? activeTurn.author : null;
|
|
895
|
+
}
|
|
896
|
+
|
|
897
|
+
async saveEditHistory(session) {
|
|
898
|
+
// Save current edit state
|
|
899
|
+
const workspaceDir = path.join(this.sessionDir, session.id, 'workspace');
|
|
900
|
+
const versionDir = path.join(workspaceDir, 'versions');
|
|
901
|
+
|
|
902
|
+
const versionFile = path.join(versionDir, `v${session.metadata.version}.txt`);
|
|
903
|
+
const workingFile = path.join(workspaceDir, 'working.txt');
|
|
904
|
+
|
|
905
|
+
const content = await fs.readFile(workingFile, 'utf-8');
|
|
906
|
+
await fs.writeFile(versionFile, content);
|
|
907
|
+
}
|
|
908
|
+
|
|
909
|
+
async finalizeEdits(session) {
|
|
910
|
+
// Ensure all edits are saved
|
|
911
|
+
await this.saveEditHistory(session);
|
|
912
|
+
|
|
913
|
+
// Clear any locks
|
|
914
|
+
session.locks = new Map();
|
|
915
|
+
|
|
916
|
+
// Mark all participants as inactive
|
|
917
|
+
session.participants.forEach(p => {
|
|
918
|
+
if (p.status === 'active') {
|
|
919
|
+
p.status = 'completed';
|
|
920
|
+
}
|
|
921
|
+
});
|
|
922
|
+
}
|
|
923
|
+
|
|
924
|
+
async mergeCollaborativeChanges(session, strategy) {
|
|
925
|
+
const result = {
|
|
926
|
+
success: false,
|
|
927
|
+
finalContent: null,
|
|
928
|
+
mergeDetails: []
|
|
929
|
+
};
|
|
930
|
+
|
|
931
|
+
try {
|
|
932
|
+
const workingFile = path.join(this.sessionDir, session.id, 'workspace', 'working.txt');
|
|
933
|
+
const finalContent = await fs.readFile(workingFile, 'utf-8');
|
|
934
|
+
|
|
935
|
+
// Apply to actual component
|
|
936
|
+
const componentPath = path.resolve(this.rootPath, session.componentPath);
|
|
937
|
+
await fs.writeFile(componentPath, finalContent);
|
|
938
|
+
|
|
939
|
+
result.success = true;
|
|
940
|
+
result.finalContent = finalContent;
|
|
941
|
+
result.mergeDetails.push(`Applied final collaborative edits using ${strategy} strategy`);
|
|
942
|
+
|
|
943
|
+
} catch (error) {
|
|
944
|
+
result.mergeDetails.push(`Merge failed: ${error.message}`);
|
|
945
|
+
}
|
|
946
|
+
|
|
947
|
+
return result;
|
|
948
|
+
}
|
|
949
|
+
|
|
950
|
+
calculateDuration(session) {
|
|
951
|
+
const start = new Date(session.createdAt);
|
|
952
|
+
const end = session.endedAt ? new Date(session.endedAt) : new Date();
|
|
953
|
+
|
|
954
|
+
const duration = end - start;
|
|
955
|
+
const minutes = Math.floor(duration / 60000);
|
|
956
|
+
const hours = Math.floor(minutes / 60);
|
|
957
|
+
|
|
958
|
+
if (hours > 0) {
|
|
959
|
+
return `${hours}h ${minutes % 60}m`;
|
|
960
|
+
}
|
|
961
|
+
return `${minutes}m`;
|
|
962
|
+
}
|
|
963
|
+
|
|
964
|
+
async archiveSession(session) {
|
|
965
|
+
const archiveDir = path.join(this.sessionDir, 'archive');
|
|
966
|
+
await fs.mkdir(archiveDir, { recursive: true });
|
|
967
|
+
|
|
968
|
+
const archiveFile = path.join(archiveDir, `${session.id}.json`);
|
|
969
|
+
await fs.writeFile(archiveFile, JSON.stringify(session, null, 2));
|
|
970
|
+
|
|
971
|
+
// Clean up active session files
|
|
972
|
+
const sessionFile = path.join(this.sessionDir, `${session.id}.json`);
|
|
973
|
+
await fs.unlink(sessionFile);
|
|
974
|
+
}
|
|
975
|
+
|
|
976
|
+
async listActiveSessions() {
|
|
977
|
+
console.log(chalk.blue('\nš Active Collaborative Sessions'));
|
|
978
|
+
console.log(chalk.gray('ā'.repeat(50)));
|
|
979
|
+
|
|
980
|
+
const files = await fs.readdir(this.sessionDir);
|
|
981
|
+
const sessions = [];
|
|
982
|
+
|
|
983
|
+
for (const file of files) {
|
|
984
|
+
if (file.endsWith('.json') && !file.startsWith('archive')) {
|
|
985
|
+
try {
|
|
986
|
+
const session = await this.loadSession(file.replace('.json', ''));
|
|
987
|
+
if (session.status === 'active') {
|
|
988
|
+
sessions.push(session);
|
|
989
|
+
}
|
|
990
|
+
} catch (error) {
|
|
991
|
+
// Skip invalid files
|
|
992
|
+
}
|
|
993
|
+
}
|
|
994
|
+
}
|
|
995
|
+
|
|
996
|
+
if (sessions.length === 0) {
|
|
997
|
+
console.log(chalk.gray('No active sessions'));
|
|
998
|
+
} else {
|
|
999
|
+
sessions.forEach(session => {
|
|
1000
|
+
console.log(`\n${chalk.white(session.id)}`);
|
|
1001
|
+
console.log(` Component: ${session.componentPath}`);
|
|
1002
|
+
console.log(` Mode: ${session.mode}`);
|
|
1003
|
+
console.log(` Participants: ${session.participants.filter(p => p.status === 'active').length}`);
|
|
1004
|
+
console.log(` Started: ${new Date(session.createdAt).toLocaleString()}`);
|
|
1005
|
+
});
|
|
1006
|
+
}
|
|
1007
|
+
|
|
1008
|
+
return {
|
|
1009
|
+
success: true,
|
|
1010
|
+
activeSessions: sessions.length,
|
|
1011
|
+
sessions: sessions.map(s => ({
|
|
1012
|
+
id: s.id,
|
|
1013
|
+
component: s.componentPath,
|
|
1014
|
+
participants: s.participants.length,
|
|
1015
|
+
mode: s.mode
|
|
1016
|
+
}))
|
|
1017
|
+
};
|
|
1018
|
+
}
|
|
1019
|
+
|
|
1020
|
+
getSessionStatistics(session) {
|
|
1021
|
+
const stats = {
|
|
1022
|
+
totalEdits: session.editHistory.length,
|
|
1023
|
+
participants: session.participants.length,
|
|
1024
|
+
activeParticipants: session.participants.filter(p => p.status === 'active').length,
|
|
1025
|
+
duration: this.calculateDuration(session),
|
|
1026
|
+
editsByAuthor: {}
|
|
1027
|
+
};
|
|
1028
|
+
|
|
1029
|
+
// Count edits by author
|
|
1030
|
+
session.editHistory.forEach(edit => {
|
|
1031
|
+
if (!stats.editsByAuthor[edit.author]) {
|
|
1032
|
+
stats.editsByAuthor[edit.author] = 0;
|
|
1033
|
+
}
|
|
1034
|
+
stats.editsByAuthor[edit.author]++;
|
|
1035
|
+
});
|
|
1036
|
+
|
|
1037
|
+
return stats;
|
|
1038
|
+
}
|
|
1039
|
+
|
|
1040
|
+
formatStatus(status) {
|
|
1041
|
+
const statusMap = {
|
|
1042
|
+
active: chalk.green('ACTIVE'),
|
|
1043
|
+
completed: chalk.blue('COMPLETED'),
|
|
1044
|
+
cancelled: chalk.red('CANCELLED'),
|
|
1045
|
+
error: chalk.red('ERROR')
|
|
1046
|
+
};
|
|
1047
|
+
return statusMap[status] || status;
|
|
1048
|
+
}
|
|
1049
|
+
|
|
1050
|
+
// Cleanup
|
|
1051
|
+
cleanup() {
|
|
1052
|
+
if (this.monitorInterval) {
|
|
1053
|
+
clearInterval(this.monitorInterval);
|
|
1054
|
+
}
|
|
1055
|
+
if (this.watchInterval) {
|
|
1056
|
+
clearInterval(this.watchInterval);
|
|
1057
|
+
}
|
|
1058
|
+
}
|
|
1059
|
+
}
|
|
1060
|
+
|
|
1061
|
+
module.exports = CollaborativeEditTask;
|
|
1062
|
+
```
|
|
1063
|
+
|
|
1064
|
+
## Validation Rules
|
|
1065
|
+
|
|
1066
|
+
### Session Management
|
|
1067
|
+
- Only one active session per component allowed
|
|
1068
|
+
- Session owner has administrative privileges
|
|
1069
|
+
- Participants must be invited or have appropriate permissions
|
|
1070
|
+
- Sessions timeout after specified duration
|
|
1071
|
+
- All edits must be tracked and versioned
|
|
1072
|
+
|
|
1073
|
+
### Editing Modes
|
|
1074
|
+
- **Live**: Real-time collaborative editing with instant sync
|
|
1075
|
+
- **Turn-based**: Sequential editing with explicit turn management
|
|
1076
|
+
- **Review**: Changes require approval before applying
|
|
1077
|
+
|
|
1078
|
+
### Conflict Prevention
|
|
1079
|
+
- Automatic locking for turn-based editing
|
|
1080
|
+
- Real-time conflict detection for live editing
|
|
1081
|
+
- Version tracking for all changes
|
|
1082
|
+
- Rollback capability for problematic edits
|
|
1083
|
+
|
|
1084
|
+
## Integration Points
|
|
1085
|
+
|
|
1086
|
+
### Modification Synchronizer
|
|
1087
|
+
- Handles real-time synchronization of edits
|
|
1088
|
+
- Manages edit broadcasting and receiving
|
|
1089
|
+
- Tracks version consistency
|
|
1090
|
+
- Handles network interruptions
|
|
1091
|
+
|
|
1092
|
+
### Conflict Manager
|
|
1093
|
+
- Detects and resolves editing conflicts
|
|
1094
|
+
- Manages locks and turn-based access
|
|
1095
|
+
- Handles merge strategies
|
|
1096
|
+
- Provides conflict visualization
|
|
1097
|
+
|
|
1098
|
+
### Notification Service
|
|
1099
|
+
- Notifies participants of session events
|
|
1100
|
+
- Alerts on turn changes
|
|
1101
|
+
- Broadcasts edit notifications
|
|
1102
|
+
- Handles session invitations
|
|
1103
|
+
|
|
1104
|
+
## Security Considerations
|
|
1105
|
+
- Validate participant permissions
|
|
1106
|
+
- Encrypt sensitive session data
|
|
1107
|
+
- Audit all collaborative actions
|
|
1108
|
+
- Prevent unauthorized access to sessions
|
|
1109
|
+
- Secure communication channels
|