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,337 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Story Index Generator for AIOS Framework
|
|
3
|
+
*
|
|
4
|
+
* Scans docs/stories/ directory and generates comprehensive story index
|
|
5
|
+
* with metadata extraction, epic grouping, and markdown table formatting.
|
|
6
|
+
*
|
|
7
|
+
* @module story-index-generator
|
|
8
|
+
* @version 1.0.0
|
|
9
|
+
* @created 2025-01-16 (Story 6.1.2.6)
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
const fs = require('fs').promises;
|
|
13
|
+
const path = require('path');
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Status emoji mapping
|
|
17
|
+
*/
|
|
18
|
+
const STATUS_EMOJI = {
|
|
19
|
+
'Draft': 'đ',
|
|
20
|
+
'Approved': 'â
',
|
|
21
|
+
'Ready for Dev': 'đ',
|
|
22
|
+
'In Progress': 'âī¸',
|
|
23
|
+
'Ready for Review': 'đ',
|
|
24
|
+
'Completed': 'â
',
|
|
25
|
+
'On Hold': 'â¸ī¸',
|
|
26
|
+
'Cancelled': 'â',
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Priority emoji mapping
|
|
31
|
+
*/
|
|
32
|
+
const PRIORITY_EMOJI = {
|
|
33
|
+
'Critical': 'đ´',
|
|
34
|
+
'High': 'đ ',
|
|
35
|
+
'Medium': 'đĄ',
|
|
36
|
+
'Low': 'đĸ',
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Extracts metadata from story markdown file
|
|
41
|
+
*
|
|
42
|
+
* @param {string} filePath - Path to story file
|
|
43
|
+
* @returns {Promise<Object|null>} Story metadata or null if parsing fails
|
|
44
|
+
*/
|
|
45
|
+
async function extractStoryMetadata(filePath) {
|
|
46
|
+
try {
|
|
47
|
+
const content = await fs.readFile(filePath, 'utf8');
|
|
48
|
+
const lines = content.split('\n');
|
|
49
|
+
|
|
50
|
+
const metadata = {
|
|
51
|
+
filePath,
|
|
52
|
+
fileName: path.basename(filePath),
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
// Extract from YAML frontmatter or metadata section
|
|
56
|
+
let inYamlBlock = false;
|
|
57
|
+
let inMetadataSection = false;
|
|
58
|
+
|
|
59
|
+
for (let i = 0; i < lines.length; i++) {
|
|
60
|
+
const line = lines[i].trim();
|
|
61
|
+
|
|
62
|
+
// YAML frontmatter detection
|
|
63
|
+
if (line === '---' && i < 10) {
|
|
64
|
+
inYamlBlock = !inYamlBlock;
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Metadata section detection
|
|
69
|
+
if (line.startsWith('## Metadata') || line.startsWith('# Metadata')) {
|
|
70
|
+
inMetadataSection = true;
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (line.startsWith('## ') || line.startsWith('# ')) {
|
|
75
|
+
inMetadataSection = false;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
if (inYamlBlock || inMetadataSection) {
|
|
79
|
+
// Extract key-value pairs
|
|
80
|
+
const match = line.match(/^[-*]?\s*\*?\*?([A-Za-z\s]+)\*?\*?:\s*(.+)$/);
|
|
81
|
+
if (match) {
|
|
82
|
+
const key = match[1].trim().toLowerCase().replace(/\s+/g, '_');
|
|
83
|
+
const value = match[2].trim().replace(/^`|`$/g, '');
|
|
84
|
+
|
|
85
|
+
// Map to standard fields
|
|
86
|
+
if (key === 'story_id' || key === 'id') metadata.storyId = value;
|
|
87
|
+
if (key === 'title') metadata.title = value;
|
|
88
|
+
if (key === 'epic') metadata.epic = value;
|
|
89
|
+
if (key === 'status') metadata.status = value;
|
|
90
|
+
if (key === 'priority') metadata.priority = value;
|
|
91
|
+
if (key === 'owner' || key === 'assigned_to') metadata.owner = value;
|
|
92
|
+
if (key === 'estimate' || key === 'effort') metadata.estimate = value;
|
|
93
|
+
if (key === 'created') metadata.created = value;
|
|
94
|
+
if (key === 'updated') metadata.updated = value;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Stop after metadata section
|
|
99
|
+
if (i > 100) break;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Extract title from first H1 if not in metadata
|
|
103
|
+
if (!metadata.title) {
|
|
104
|
+
const h1Match = content.match(/^#\s+(.+)$/m);
|
|
105
|
+
if (h1Match) {
|
|
106
|
+
metadata.title = h1Match[1].trim();
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Extract story ID from filename if not in metadata
|
|
111
|
+
if (!metadata.storyId) {
|
|
112
|
+
const idMatch = metadata.fileName.match(/story-?([\d.]+)/i);
|
|
113
|
+
if (idMatch) {
|
|
114
|
+
metadata.storyId = idMatch[1];
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return metadata;
|
|
119
|
+
} catch (error) {
|
|
120
|
+
console.error(`Failed to extract metadata from ${filePath}:`, error.message);
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Scans stories directory recursively
|
|
127
|
+
*
|
|
128
|
+
* @param {string} dirPath - Directory path to scan
|
|
129
|
+
* @param {Array} stories - Accumulated stories array
|
|
130
|
+
* @returns {Promise<Array>} Array of story metadata objects
|
|
131
|
+
*/
|
|
132
|
+
async function scanStoriesDirectory(dirPath, stories = []) {
|
|
133
|
+
try {
|
|
134
|
+
const entries = await fs.readdir(dirPath, { withFileTypes: true });
|
|
135
|
+
|
|
136
|
+
for (const entry of entries) {
|
|
137
|
+
const fullPath = path.join(dirPath, entry.name);
|
|
138
|
+
|
|
139
|
+
if (entry.isDirectory()) {
|
|
140
|
+
// Recursively scan subdirectories
|
|
141
|
+
await scanStoriesDirectory(fullPath, stories);
|
|
142
|
+
} else if (entry.isFile() && entry.name.match(/\.md$/i)) {
|
|
143
|
+
// Process markdown files
|
|
144
|
+
const metadata = await extractStoryMetadata(fullPath);
|
|
145
|
+
if (metadata && metadata.storyId) {
|
|
146
|
+
stories.push(metadata);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
return stories;
|
|
152
|
+
} catch (error) {
|
|
153
|
+
console.error(`Failed to scan directory ${dirPath}:`, error.message);
|
|
154
|
+
return stories;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Groups stories by epic
|
|
160
|
+
*
|
|
161
|
+
* @param {Array} stories - Array of story metadata
|
|
162
|
+
* @returns {Object} Stories grouped by epic
|
|
163
|
+
*/
|
|
164
|
+
function groupStoriesByEpic(stories) {
|
|
165
|
+
const grouped = {};
|
|
166
|
+
|
|
167
|
+
stories.forEach(story => {
|
|
168
|
+
const epic = story.epic || 'Unassigned';
|
|
169
|
+
if (!grouped[epic]) {
|
|
170
|
+
grouped[epic] = [];
|
|
171
|
+
}
|
|
172
|
+
grouped[epic].push(story);
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
// Sort stories within each epic by story ID
|
|
176
|
+
Object.keys(grouped).forEach(epic => {
|
|
177
|
+
grouped[epic].sort((a, b) => {
|
|
178
|
+
const aId = a.storyId.split('.').map(Number);
|
|
179
|
+
const bId = b.storyId.split('.').map(Number);
|
|
180
|
+
|
|
181
|
+
for (let i = 0; i < Math.max(aId.length, bId.length); i++) {
|
|
182
|
+
const aNum = aId[i] || 0;
|
|
183
|
+
const bNum = bId[i] || 0;
|
|
184
|
+
if (aNum !== bNum) return aNum - bNum;
|
|
185
|
+
}
|
|
186
|
+
return 0;
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
return grouped;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Generates markdown table row for story
|
|
195
|
+
*
|
|
196
|
+
* @param {Object} story - Story metadata
|
|
197
|
+
* @param {string} baseDir - Base directory for relative paths
|
|
198
|
+
* @returns {string} Markdown table row
|
|
199
|
+
*/
|
|
200
|
+
function generateStoryRow(story, baseDir = 'docs/stories') {
|
|
201
|
+
const statusEmoji = STATUS_EMOJI[story.status] || 'â';
|
|
202
|
+
const priorityEmoji = story.priority ? PRIORITY_EMOJI[story.priority] : '';
|
|
203
|
+
|
|
204
|
+
// Create relative path for link
|
|
205
|
+
const relativePath = path.relative(baseDir, story.filePath).replace(/\\/g, '/');
|
|
206
|
+
const link = `[${story.title || story.fileName}](${relativePath})`;
|
|
207
|
+
|
|
208
|
+
return `| ${story.storyId} | ${link} | ${statusEmoji} ${story.status || 'Unknown'} | ${priorityEmoji} ${story.priority || 'N/A'} | ${story.owner || 'Unassigned'} | ${story.estimate || 'TBD'} |`;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Generates complete story index markdown
|
|
213
|
+
*
|
|
214
|
+
* @param {Array} stories - Array of story metadata
|
|
215
|
+
* @returns {string} Complete markdown content
|
|
216
|
+
*/
|
|
217
|
+
function generateIndexMarkdown(stories) {
|
|
218
|
+
const grouped = groupStoriesByEpic(stories);
|
|
219
|
+
const epics = Object.keys(grouped).sort();
|
|
220
|
+
|
|
221
|
+
let markdown = `# Story Index
|
|
222
|
+
|
|
223
|
+
**Generated:** ${new Date().toISOString()}
|
|
224
|
+
**Total Stories:** ${stories.length}
|
|
225
|
+
**Epics:** ${epics.length}
|
|
226
|
+
|
|
227
|
+
---
|
|
228
|
+
|
|
229
|
+
## đ Summary by Status
|
|
230
|
+
|
|
231
|
+
`;
|
|
232
|
+
|
|
233
|
+
// Status summary
|
|
234
|
+
const statusCounts = {};
|
|
235
|
+
stories.forEach(story => {
|
|
236
|
+
const status = story.status || 'Unknown';
|
|
237
|
+
statusCounts[status] = (statusCounts[status] || 0) + 1;
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
Object.entries(statusCounts)
|
|
241
|
+
.sort((a, b) => b[1] - a[1])
|
|
242
|
+
.forEach(([status, count]) => {
|
|
243
|
+
const emoji = STATUS_EMOJI[status] || 'â';
|
|
244
|
+
markdown += `- ${emoji} **${status}**: ${count}\n`;
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
markdown += '\n---\n\n## đ Stories by Epic\n\n';
|
|
248
|
+
|
|
249
|
+
// Stories grouped by epic
|
|
250
|
+
epics.forEach(epic => {
|
|
251
|
+
const epicStories = grouped[epic];
|
|
252
|
+
markdown += `### ${epic} (${epicStories.length} stories)\n\n`;
|
|
253
|
+
markdown += '| Story ID | Title | Status | Priority | Owner | Estimate |\n';
|
|
254
|
+
markdown += '|----------|-------|--------|----------|-------|----------|\n';
|
|
255
|
+
|
|
256
|
+
epicStories.forEach(story => {
|
|
257
|
+
markdown += generateStoryRow(story) + '\n';
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
markdown += '\n';
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
markdown += '---\n\n';
|
|
264
|
+
markdown += '## đ Legend\n\n';
|
|
265
|
+
markdown += '### Status\n';
|
|
266
|
+
Object.entries(STATUS_EMOJI).forEach(([status, emoji]) => {
|
|
267
|
+
markdown += `- ${emoji} **${status}**\n`;
|
|
268
|
+
});
|
|
269
|
+
markdown += '\n### Priority\n';
|
|
270
|
+
Object.entries(PRIORITY_EMOJI).forEach(([priority, emoji]) => {
|
|
271
|
+
markdown += `- ${emoji} **${priority}**\n`;
|
|
272
|
+
});
|
|
273
|
+
|
|
274
|
+
markdown += '\n---\n\n';
|
|
275
|
+
markdown += '*Auto-generated by AIOS Story Index Generator (Story 6.1.2.6)*\n';
|
|
276
|
+
markdown += '*Update: Run `npm run stories:index` or `node .aios-core/scripts/story-index-generator.js docs/stories`*\n';
|
|
277
|
+
|
|
278
|
+
return markdown;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* Generates story index file
|
|
283
|
+
*
|
|
284
|
+
* @param {string} storiesDir - Path to stories directory
|
|
285
|
+
* @param {string} outputPath - Path to output index file
|
|
286
|
+
* @returns {Promise<Object>} Generation results
|
|
287
|
+
*/
|
|
288
|
+
async function generateStoryIndex(storiesDir = 'docs/stories', outputPath = null) {
|
|
289
|
+
const output = outputPath || path.join(storiesDir, 'index.md');
|
|
290
|
+
|
|
291
|
+
console.log(`đ Scanning stories in: ${storiesDir}`);
|
|
292
|
+
|
|
293
|
+
const stories = await scanStoriesDirectory(storiesDir);
|
|
294
|
+
|
|
295
|
+
console.log(`â
Found ${stories.length} stories`);
|
|
296
|
+
|
|
297
|
+
const markdown = generateIndexMarkdown(stories);
|
|
298
|
+
|
|
299
|
+
await fs.writeFile(output, markdown, 'utf8');
|
|
300
|
+
|
|
301
|
+
console.log(`â
Story index generated: ${output}`);
|
|
302
|
+
|
|
303
|
+
return {
|
|
304
|
+
totalStories: stories.length,
|
|
305
|
+
outputPath: output,
|
|
306
|
+
stories,
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// CLI execution support
|
|
311
|
+
if (require.main === module) {
|
|
312
|
+
const storiesDir = process.argv[2] || 'docs/stories';
|
|
313
|
+
const outputPath = process.argv[3] || null;
|
|
314
|
+
|
|
315
|
+
generateStoryIndex(storiesDir, outputPath)
|
|
316
|
+
.then(result => {
|
|
317
|
+
console.log('\nđ Generation Complete!');
|
|
318
|
+
console.log(`Total Stories: ${result.totalStories}`);
|
|
319
|
+
console.log(`Output: ${result.outputPath}`);
|
|
320
|
+
process.exit(0);
|
|
321
|
+
})
|
|
322
|
+
.catch(error => {
|
|
323
|
+
console.error('â Generation failed:', error);
|
|
324
|
+
process.exit(1);
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
module.exports = {
|
|
329
|
+
generateStoryIndex,
|
|
330
|
+
extractStoryMetadata,
|
|
331
|
+
scanStoriesDirectory,
|
|
332
|
+
groupStoriesByEpic,
|
|
333
|
+
generateIndexMarkdown,
|
|
334
|
+
generateStoryRow,
|
|
335
|
+
STATUS_EMOJI,
|
|
336
|
+
PRIORITY_EMOJI,
|
|
337
|
+
};
|
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
// File: common/utils/story-manager.js
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Story Manager - Handles story file operations and ClickUp synchronization
|
|
5
|
+
*
|
|
6
|
+
* This module provides utilities for:
|
|
7
|
+
* - Reading and parsing story .md files
|
|
8
|
+
* - Saving story files with automatic ClickUp sync
|
|
9
|
+
* - Managing story frontmatter and metadata
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
const fs = require('fs').promises;
|
|
13
|
+
const path = require('path');
|
|
14
|
+
const yaml = require('js-yaml');
|
|
15
|
+
const { syncStoryToClickUp, detectChanges } = require('./story-update-hook');
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Resolves the ClickUp MCP tool
|
|
19
|
+
* Tries tool-resolver first (for tests), falls back to global references
|
|
20
|
+
*/
|
|
21
|
+
async function getClickUpTool() {
|
|
22
|
+
try {
|
|
23
|
+
// Try using tool-resolver (test environment or future production)
|
|
24
|
+
const { resolveTool } = require('../../infrastructure/scripts/tool-resolver');
|
|
25
|
+
return await resolveTool('clickup');
|
|
26
|
+
} catch (error) {
|
|
27
|
+
// Fall back to global references (current production pattern)
|
|
28
|
+
return {
|
|
29
|
+
createTask: global.mcp__clickup__create_task,
|
|
30
|
+
updateTask: global.mcp__clickup__update_task,
|
|
31
|
+
getTask: global.mcp__clickup__get_task,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Parses a story markdown file into structured data
|
|
38
|
+
*
|
|
39
|
+
* @param {string} storyFilePath - Absolute path to story .md file
|
|
40
|
+
* @returns {Promise<object>} Parsed story content
|
|
41
|
+
*/
|
|
42
|
+
async function parseStoryFile(storyFilePath) {
|
|
43
|
+
const fileContent = await fs.readFile(storyFilePath, 'utf-8');
|
|
44
|
+
|
|
45
|
+
// Extract frontmatter
|
|
46
|
+
const frontmatterMatch = fileContent.match(/^---\n([\s\S]*?)\n---/);
|
|
47
|
+
const frontmatter = frontmatterMatch ? yaml.load(frontmatterMatch[1]) : {};
|
|
48
|
+
|
|
49
|
+
// Extract full markdown (without frontmatter)
|
|
50
|
+
const fullMarkdown = frontmatterMatch
|
|
51
|
+
? fileContent.substring(frontmatterMatch[0].length).trim()
|
|
52
|
+
: fileContent.trim();
|
|
53
|
+
|
|
54
|
+
// Parse story sections
|
|
55
|
+
const statusMatch = fileContent.match(/\*\*Status:\*\* (.+)/);
|
|
56
|
+
const status = statusMatch ? statusMatch[1] : 'Draft';
|
|
57
|
+
|
|
58
|
+
// Parse tasks (checkbox items)
|
|
59
|
+
const taskMatches = fileContent.matchAll(/^- \[([ x])\] (.+)$/gm);
|
|
60
|
+
const tasks = Array.from(taskMatches).map(match => ({
|
|
61
|
+
completed: match[1] === 'x',
|
|
62
|
+
text: match[2],
|
|
63
|
+
}));
|
|
64
|
+
|
|
65
|
+
// Extract File List section
|
|
66
|
+
const fileListMatch = fileContent.match(/### File List\n\n([\s\S]*?)(?=\n##|$)/);
|
|
67
|
+
const fileList = fileListMatch ? fileListMatch[1].trim().split('\n') : [];
|
|
68
|
+
|
|
69
|
+
// Extract Dev Notes section
|
|
70
|
+
const devNotesMatch = fileContent.match(/## Dev Notes\n\n([\s\S]*?)(?=\n##|$)/);
|
|
71
|
+
const devNotes = devNotesMatch ? devNotesMatch[1].trim() : '';
|
|
72
|
+
|
|
73
|
+
// Extract Acceptance Criteria section
|
|
74
|
+
const acMatch = fileContent.match(/## Acceptance Criteria\n\n([\s\S]*?)(?=\n##|$)/);
|
|
75
|
+
const acceptanceCriteria = acMatch ? acMatch[1].trim() : '';
|
|
76
|
+
|
|
77
|
+
return {
|
|
78
|
+
frontmatter,
|
|
79
|
+
fullMarkdown,
|
|
80
|
+
status,
|
|
81
|
+
tasks,
|
|
82
|
+
fileList,
|
|
83
|
+
devNotes,
|
|
84
|
+
acceptanceCriteria,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Saves a story file and triggers ClickUp synchronization
|
|
90
|
+
*
|
|
91
|
+
* @param {string} storyFilePath - Absolute path to story .md file
|
|
92
|
+
* @param {string} content - New story content
|
|
93
|
+
* @param {boolean} skipSync - Skip ClickUp sync (default: false)
|
|
94
|
+
* @returns {Promise<object>} Save and sync result
|
|
95
|
+
*/
|
|
96
|
+
async function saveStoryFile(storyFilePath, content, skipSync = false) {
|
|
97
|
+
try {
|
|
98
|
+
// Read previous version for change detection
|
|
99
|
+
let previousContentString = '';
|
|
100
|
+
try {
|
|
101
|
+
previousContentString = await fs.readFile(storyFilePath, 'utf-8');
|
|
102
|
+
} catch (error) {
|
|
103
|
+
// File might not exist yet (new story)
|
|
104
|
+
console.log('No previous version found - creating new story file');
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Write new content
|
|
108
|
+
await fs.writeFile(storyFilePath, content, 'utf-8');
|
|
109
|
+
console.log(`â
Story file saved: ${path.basename(storyFilePath)}`);
|
|
110
|
+
|
|
111
|
+
// Skip sync if requested or no previous version
|
|
112
|
+
if (skipSync || !previousContentString) {
|
|
113
|
+
return { saved: true, synced: false, reason: skipSync ? 'skip_requested' : 'new_file' };
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Detect changes between previous and current content
|
|
117
|
+
const changes = detectChanges(previousContentString, content);
|
|
118
|
+
|
|
119
|
+
// Extract metadata from current content
|
|
120
|
+
const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
|
|
121
|
+
const frontmatter = frontmatterMatch ? yaml.load(frontmatterMatch[1]) : {};
|
|
122
|
+
|
|
123
|
+
// Create storyFile object for sync
|
|
124
|
+
const storyFile = {
|
|
125
|
+
metadata: {
|
|
126
|
+
clickup_task_id: frontmatter?.clickup?.task_id,
|
|
127
|
+
},
|
|
128
|
+
content: content,
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
// Sync to ClickUp if there are changes
|
|
132
|
+
await syncStoryToClickUp(storyFile, changes);
|
|
133
|
+
|
|
134
|
+
const hasChanges = changes.status.changed ||
|
|
135
|
+
changes.tasksCompleted.length > 0 ||
|
|
136
|
+
changes.filesAdded.length > 0 ||
|
|
137
|
+
changes.devNotesAdded ||
|
|
138
|
+
changes.acceptanceCriteriaChanged;
|
|
139
|
+
|
|
140
|
+
if (hasChanges) {
|
|
141
|
+
console.log('â
Story synced to ClickUp');
|
|
142
|
+
return { saved: true, synced: true, changes: Object.keys(changes).filter(k => changes[k] && changes[k] !== false).length };
|
|
143
|
+
} else {
|
|
144
|
+
console.log('âšī¸ No sync needed: no changes detected');
|
|
145
|
+
return { saved: true, synced: false, reason: 'no_changes' };
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
} catch (error) {
|
|
149
|
+
console.error(`Error saving story file: ${error.message}`);
|
|
150
|
+
throw error;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Updates frontmatter in a story file
|
|
156
|
+
*
|
|
157
|
+
* @param {string} storyFilePath - Absolute path to story .md file
|
|
158
|
+
* @param {object} updates - Frontmatter fields to update
|
|
159
|
+
* @returns {Promise<object>} Updated frontmatter object
|
|
160
|
+
*/
|
|
161
|
+
async function updateFrontmatter(storyFilePath, updates) {
|
|
162
|
+
const fileContent = await fs.readFile(storyFilePath, 'utf-8');
|
|
163
|
+
|
|
164
|
+
// Extract existing frontmatter
|
|
165
|
+
const frontmatterMatch = fileContent.match(/^---\n([\s\S]*?)\n---/);
|
|
166
|
+
const existingFrontmatter = frontmatterMatch ? yaml.load(frontmatterMatch[1]) : {};
|
|
167
|
+
|
|
168
|
+
// Merge updates
|
|
169
|
+
const updatedFrontmatter = { ...existingFrontmatter, ...updates };
|
|
170
|
+
|
|
171
|
+
// Serialize back to YAML
|
|
172
|
+
const newFrontmatterYaml = yaml.dump(updatedFrontmatter);
|
|
173
|
+
|
|
174
|
+
// Replace frontmatter in file content
|
|
175
|
+
const contentWithoutFrontmatter = frontmatterMatch
|
|
176
|
+
? fileContent.substring(frontmatterMatch[0].length)
|
|
177
|
+
: fileContent;
|
|
178
|
+
|
|
179
|
+
const newContent = `---\n${newFrontmatterYaml}---${contentWithoutFrontmatter}`;
|
|
180
|
+
|
|
181
|
+
// Save without triggering sync (to avoid recursion)
|
|
182
|
+
await saveStoryFile(storyFilePath, newContent, true);
|
|
183
|
+
|
|
184
|
+
// Return the updated frontmatter
|
|
185
|
+
return updatedFrontmatter;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Updates the last_sync timestamp in story frontmatter
|
|
190
|
+
*
|
|
191
|
+
* @param {string} storyFilePath - Absolute path to story .md file
|
|
192
|
+
* @returns {Promise<void>}
|
|
193
|
+
*/
|
|
194
|
+
async function updateFrontmatterTimestamp(storyFilePath) {
|
|
195
|
+
const timestamp = new Date().toISOString();
|
|
196
|
+
await updateFrontmatter(storyFilePath, {
|
|
197
|
+
clickup: {
|
|
198
|
+
last_sync: timestamp,
|
|
199
|
+
},
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Creates a story task in ClickUp as a subtask of an Epic
|
|
205
|
+
*
|
|
206
|
+
* Implements AC2: Story Creation as ClickUp Subtask
|
|
207
|
+
* Creates story with correct parent relationship, tags, and custom fields
|
|
208
|
+
*
|
|
209
|
+
* @param {object} options - Story creation options
|
|
210
|
+
* @param {number} options.epicNum - Epic number
|
|
211
|
+
* @param {number} options.storyNum - Story number
|
|
212
|
+
* @param {number} [options.subStoryNum] - Optional substory number for nested stories
|
|
213
|
+
* @param {string} options.title - Story title
|
|
214
|
+
* @param {string} options.epicTaskId - Parent Epic task ID
|
|
215
|
+
* @param {string} options.listName - ClickUp list name (typically "Backlog")
|
|
216
|
+
* @param {string} options.storyContent - Full story markdown content
|
|
217
|
+
* @param {string} [options.storyFilePath] - Path to story file (auto-generated if not provided)
|
|
218
|
+
* @returns {Promise<object>} Created task info: { taskId, url }
|
|
219
|
+
* @throws {Error} If ClickUp task creation fails or validation fails
|
|
220
|
+
*/
|
|
221
|
+
async function createStoryInClickUp({
|
|
222
|
+
epicNum,
|
|
223
|
+
storyNum,
|
|
224
|
+
subStoryNum = null,
|
|
225
|
+
title,
|
|
226
|
+
epicTaskId,
|
|
227
|
+
listName,
|
|
228
|
+
storyContent,
|
|
229
|
+
storyFilePath,
|
|
230
|
+
}) {
|
|
231
|
+
// Validation
|
|
232
|
+
if (typeof epicNum !== 'number') {
|
|
233
|
+
throw new Error('epic_number must be a number');
|
|
234
|
+
}
|
|
235
|
+
if (typeof storyNum !== 'number' && isNaN(Number(storyNum))) {
|
|
236
|
+
throw new Error('story_number must be numeric');
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// Format story identifier
|
|
240
|
+
const storyId = subStoryNum
|
|
241
|
+
? `${epicNum}.${subStoryNum}.${storyNum}`
|
|
242
|
+
: `${epicNum}.${storyNum}`;
|
|
243
|
+
|
|
244
|
+
const storyName = `Story ${storyId}: ${title}`;
|
|
245
|
+
|
|
246
|
+
// Generate tags: ["story", "epic-{epicNum}", "story-{storyId}"]
|
|
247
|
+
const tags = ['story', `epic-${epicNum}`, `story-${storyId}`];
|
|
248
|
+
|
|
249
|
+
// Auto-generate file path if not provided
|
|
250
|
+
const filePath = storyFilePath || `docs/stories/${storyId}.${title.toLowerCase().replace(/\s+/g, '-')}.md`;
|
|
251
|
+
|
|
252
|
+
// Prepare custom fields
|
|
253
|
+
const customFields = [
|
|
254
|
+
{ id: 'epic_number', value: epicNum },
|
|
255
|
+
{ id: 'story_number', value: storyId },
|
|
256
|
+
{ id: 'story_file_path', value: filePath },
|
|
257
|
+
{ id: 'story-status', value: 'Draft' },
|
|
258
|
+
];
|
|
259
|
+
|
|
260
|
+
try {
|
|
261
|
+
console.log(`Creating story ${storyName} in ClickUp...`);
|
|
262
|
+
|
|
263
|
+
// Get ClickUp tool
|
|
264
|
+
const clickUpTool = await getClickUpTool();
|
|
265
|
+
|
|
266
|
+
// Create task with parent relationship
|
|
267
|
+
const result = await clickUpTool.createTask({
|
|
268
|
+
listName: listName,
|
|
269
|
+
name: storyName,
|
|
270
|
+
parent: epicTaskId, // Creates as subtask
|
|
271
|
+
markdown_description: storyContent,
|
|
272
|
+
tags: tags,
|
|
273
|
+
custom_fields: customFields,
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
console.log(`â
Story created in ClickUp: ${result.id}`);
|
|
277
|
+
|
|
278
|
+
return {
|
|
279
|
+
taskId: result.id,
|
|
280
|
+
url: result.url || `https://app.clickup.com/t/${result.id}`,
|
|
281
|
+
};
|
|
282
|
+
|
|
283
|
+
} catch (error) {
|
|
284
|
+
console.error('Error creating story in ClickUp:', error);
|
|
285
|
+
throw new Error(`Failed to create story in ClickUp: ${error.message}`);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* Sync story to configured PM tool (adapter-aware)
|
|
291
|
+
* @param {string} storyPath - Path to story YAML file
|
|
292
|
+
* @returns {Promise<{success: boolean, url?: string, error?: string}>}
|
|
293
|
+
*/
|
|
294
|
+
async function syncStoryToPM(storyPath) {
|
|
295
|
+
try {
|
|
296
|
+
const { getPMAdapter } = require('../../infrastructure/scripts/pm-adapter-factory');
|
|
297
|
+
const adapter = getPMAdapter();
|
|
298
|
+
|
|
299
|
+
console.log(`đ¤ Syncing to ${adapter.getName()}...`);
|
|
300
|
+
|
|
301
|
+
const result = await adapter.syncStory(storyPath);
|
|
302
|
+
|
|
303
|
+
if (result.success) {
|
|
304
|
+
console.log('â
Story synced successfully');
|
|
305
|
+
if (result.url) {
|
|
306
|
+
console.log(` URL: ${result.url}`);
|
|
307
|
+
}
|
|
308
|
+
} else {
|
|
309
|
+
console.error(`â Sync failed: ${result.error}`);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
return result;
|
|
313
|
+
} catch (error) {
|
|
314
|
+
console.error('Error syncing story:', error);
|
|
315
|
+
return {
|
|
316
|
+
success: false,
|
|
317
|
+
error: error.message,
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* Pull story updates from configured PM tool (adapter-aware)
|
|
324
|
+
* @param {string} storyId - Story ID (e.g., "3.20")
|
|
325
|
+
* @returns {Promise<{success: boolean, updates?: object, error?: string}>}
|
|
326
|
+
*/
|
|
327
|
+
async function pullStoryFromPM(storyId) {
|
|
328
|
+
try {
|
|
329
|
+
const { getPMAdapter, isPMToolConfigured } = require('../../infrastructure/scripts/pm-adapter-factory');
|
|
330
|
+
|
|
331
|
+
if (!isPMToolConfigured()) {
|
|
332
|
+
console.log('âšī¸ Local-only mode: No PM tool configured');
|
|
333
|
+
return {
|
|
334
|
+
success: true,
|
|
335
|
+
updates: null,
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
const adapter = getPMAdapter();
|
|
340
|
+
|
|
341
|
+
console.log(`đĨ Pulling from ${adapter.getName()}...`);
|
|
342
|
+
|
|
343
|
+
const result = await adapter.pullStory(storyId);
|
|
344
|
+
|
|
345
|
+
if (result.success) {
|
|
346
|
+
if (result.updates) {
|
|
347
|
+
console.log('đĨ Updates found:', result.updates);
|
|
348
|
+
} else {
|
|
349
|
+
console.log('â
Story is up to date');
|
|
350
|
+
}
|
|
351
|
+
} else {
|
|
352
|
+
console.error(`â Pull failed: ${result.error}`);
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
return result;
|
|
356
|
+
} catch (error) {
|
|
357
|
+
console.error('Error pulling story:', error);
|
|
358
|
+
return {
|
|
359
|
+
success: false,
|
|
360
|
+
error: error.message,
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
module.exports = {
|
|
366
|
+
parseStoryFile,
|
|
367
|
+
saveStoryFile,
|
|
368
|
+
updateFrontmatter,
|
|
369
|
+
updateStoryFrontmatter: updateFrontmatter, // Alias for test compatibility
|
|
370
|
+
updateFrontmatterTimestamp,
|
|
371
|
+
createStoryInClickUp,
|
|
372
|
+
// PM adapter-aware functions (Story 3.20)
|
|
373
|
+
syncStoryToPM,
|
|
374
|
+
pullStoryFromPM,
|
|
375
|
+
};
|