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.
Files changed (607) hide show
  1. package/.aios-core/.session/current-session.json +14 -0
  2. package/.aios-core/cli/commands/generate/index.js +222 -0
  3. package/.aios-core/cli/commands/manifest/index.js +46 -0
  4. package/.aios-core/cli/commands/manifest/regenerate.js +96 -0
  5. package/.aios-core/cli/commands/manifest/validate.js +66 -0
  6. package/.aios-core/cli/commands/mcp/add.js +234 -0
  7. package/.aios-core/cli/commands/mcp/index.js +76 -0
  8. package/.aios-core/cli/commands/mcp/link.js +217 -0
  9. package/.aios-core/cli/commands/mcp/setup.js +164 -0
  10. package/.aios-core/cli/commands/mcp/status.js +183 -0
  11. package/.aios-core/cli/commands/metrics/cleanup.js +91 -0
  12. package/.aios-core/cli/commands/metrics/index.js +65 -0
  13. package/.aios-core/cli/commands/metrics/record.js +154 -0
  14. package/.aios-core/cli/commands/metrics/seed.js +126 -0
  15. package/.aios-core/cli/commands/metrics/show.js +209 -0
  16. package/.aios-core/cli/commands/migrate/analyze.js +353 -0
  17. package/.aios-core/cli/commands/migrate/backup.js +352 -0
  18. package/.aios-core/cli/commands/migrate/execute.js +292 -0
  19. package/.aios-core/cli/commands/migrate/index.js +441 -0
  20. package/.aios-core/cli/commands/migrate/rollback.js +323 -0
  21. package/.aios-core/cli/commands/migrate/update-imports.js +396 -0
  22. package/.aios-core/cli/commands/migrate/validate.js +452 -0
  23. package/.aios-core/cli/commands/qa/index.js +56 -0
  24. package/.aios-core/cli/commands/qa/run.js +163 -0
  25. package/.aios-core/cli/commands/qa/status.js +195 -0
  26. package/.aios-core/cli/commands/workers/formatters/info-formatter.js +274 -0
  27. package/.aios-core/cli/commands/workers/formatters/list-table.js +265 -0
  28. package/.aios-core/cli/commands/workers/formatters/list-tree.js +159 -0
  29. package/.aios-core/cli/commands/workers/index.js +56 -0
  30. package/.aios-core/cli/commands/workers/info.js +194 -0
  31. package/.aios-core/cli/commands/workers/list.js +214 -0
  32. package/.aios-core/cli/commands/workers/search-filters.js +185 -0
  33. package/.aios-core/cli/commands/workers/search-keyword.js +310 -0
  34. package/.aios-core/cli/commands/workers/search-semantic.js +293 -0
  35. package/.aios-core/cli/commands/workers/search.js +154 -0
  36. package/.aios-core/cli/commands/workers/utils/pagination.js +102 -0
  37. package/.aios-core/cli/index.js +128 -0
  38. package/.aios-core/cli/utils/output-formatter-cli.js +232 -0
  39. package/.aios-core/cli/utils/score-calculator.js +221 -0
  40. package/.aios-core/core/README.md +229 -0
  41. package/.aios-core/core/config/config-cache.js +233 -0
  42. package/.aios-core/core/config/config-loader.js +277 -0
  43. package/.aios-core/core/data/agent-config-requirements.yaml +368 -0
  44. package/.aios-core/core/data/aios-kb.md +924 -0
  45. package/.aios-core/core/data/workflow-patterns.yaml +267 -0
  46. package/.aios-core/core/docs/SHARD-TRANSLATION-GUIDE.md +335 -0
  47. package/.aios-core/core/docs/component-creation-guide.md +458 -0
  48. package/.aios-core/core/docs/session-update-pattern.md +307 -0
  49. package/.aios-core/core/docs/template-syntax.md +267 -0
  50. package/.aios-core/core/docs/troubleshooting-guide.md +625 -0
  51. package/.aios-core/core/elicitation/agent-elicitation.js +272 -0
  52. package/.aios-core/core/elicitation/elicitation-engine.js +479 -0
  53. package/.aios-core/core/elicitation/session-manager.js +320 -0
  54. package/.aios-core/core/elicitation/task-elicitation.js +281 -0
  55. package/.aios-core/core/elicitation/workflow-elicitation.js +315 -0
  56. package/.aios-core/core/index.esm.js +42 -0
  57. package/.aios-core/core/index.js +76 -0
  58. package/.aios-core/core/manifest/manifest-generator.js +386 -0
  59. package/.aios-core/core/manifest/manifest-validator.js +429 -0
  60. package/.aios-core/core/mcp/config-migrator.js +340 -0
  61. package/.aios-core/core/mcp/global-config-manager.js +369 -0
  62. package/.aios-core/core/mcp/index.js +34 -0
  63. package/.aios-core/core/mcp/os-detector.js +188 -0
  64. package/.aios-core/core/mcp/symlink-manager.js +413 -0
  65. package/.aios-core/core/migration/migration-config.yaml +83 -0
  66. package/.aios-core/core/migration/module-mapping.yaml +89 -0
  67. package/.aios-core/core/quality-gates/base-layer.js +134 -0
  68. package/.aios-core/core/quality-gates/checklist-generator.js +329 -0
  69. package/.aios-core/core/quality-gates/focus-area-recommender.js +359 -0
  70. package/.aios-core/core/quality-gates/human-review-orchestrator.js +529 -0
  71. package/.aios-core/core/quality-gates/layer1-precommit.js +336 -0
  72. package/.aios-core/core/quality-gates/layer2-pr-automation.js +324 -0
  73. package/.aios-core/core/quality-gates/layer3-human-review.js +348 -0
  74. package/.aios-core/core/quality-gates/notification-manager.js +550 -0
  75. package/.aios-core/core/quality-gates/quality-gate-config.yaml +86 -0
  76. package/.aios-core/core/quality-gates/quality-gate-manager.js +601 -0
  77. package/.aios-core/core/registry/README.md +179 -0
  78. package/.aios-core/core/registry/build-registry.js +452 -0
  79. package/.aios-core/core/registry/registry-loader.js +330 -0
  80. package/.aios-core/core/registry/registry-schema.json +166 -0
  81. package/.aios-core/core/registry/service-registry.json +6586 -0
  82. package/.aios-core/core/registry/validate-registry.js +340 -0
  83. package/.aios-core/core/session/context-detector.js +229 -0
  84. package/.aios-core/core/session/context-loader.js +288 -0
  85. package/.aios-core/core/utils/output-formatter.js +298 -0
  86. package/.aios-core/core/utils/security-utils.js +333 -0
  87. package/.aios-core/core/utils/yaml-validator.js +419 -0
  88. package/.aios-core/core-config.yaml +382 -0
  89. package/.aios-core/data/agent-config-requirements.yaml +368 -0
  90. package/.aios-core/data/aios-kb.md +924 -0
  91. package/.aios-core/data/technical-preferences.md +4 -0
  92. package/.aios-core/data/workflow-patterns.yaml +267 -0
  93. package/.aios-core/development/README.md +142 -0
  94. package/.aios-core/development/agent-teams/team-all.yaml +15 -0
  95. package/.aios-core/development/agent-teams/team-fullstack.yaml +18 -0
  96. package/.aios-core/development/agent-teams/team-ide-minimal.yaml +10 -0
  97. package/.aios-core/development/agent-teams/team-no-ui.yaml +13 -0
  98. package/.aios-core/development/agent-teams/team-qa-focused.yaml +155 -0
  99. package/.aios-core/development/agents/aios-master.md +339 -0
  100. package/.aios-core/development/agents/analyst.md +195 -0
  101. package/.aios-core/development/agents/architect.md +359 -0
  102. package/.aios-core/development/agents/data-engineer.md +468 -0
  103. package/.aios-core/development/agents/dev.md +390 -0
  104. package/.aios-core/development/agents/devops.md +398 -0
  105. package/.aios-core/development/agents/pm.md +198 -0
  106. package/.aios-core/development/agents/po.md +256 -0
  107. package/.aios-core/development/agents/qa.md +312 -0
  108. package/.aios-core/development/agents/sm.md +220 -0
  109. package/.aios-core/development/agents/ux-design-expert.md +451 -0
  110. package/.aios-core/development/scripts/agent-assignment-resolver.js +231 -0
  111. package/.aios-core/development/scripts/agent-config-loader.js +624 -0
  112. package/.aios-core/development/scripts/agent-exit-hooks.js +96 -0
  113. package/.aios-core/development/scripts/apply-inline-greeting-all-agents.js +146 -0
  114. package/.aios-core/development/scripts/audit-agent-config.js +380 -0
  115. package/.aios-core/development/scripts/backlog-manager.js +404 -0
  116. package/.aios-core/development/scripts/batch-update-agents-session-context.js +95 -0
  117. package/.aios-core/development/scripts/decision-context.js +228 -0
  118. package/.aios-core/development/scripts/decision-log-generator.js +293 -0
  119. package/.aios-core/development/scripts/decision-log-indexer.js +284 -0
  120. package/.aios-core/development/scripts/decision-recorder.js +168 -0
  121. package/.aios-core/development/scripts/dev-context-loader.js +297 -0
  122. package/.aios-core/development/scripts/generate-greeting.js +160 -0
  123. package/.aios-core/development/scripts/greeting-builder.js +866 -0
  124. package/.aios-core/development/scripts/greeting-config-cli.js +85 -0
  125. package/.aios-core/development/scripts/greeting-preference-manager.js +145 -0
  126. package/.aios-core/development/scripts/migrate-task-to-v2.js +377 -0
  127. package/.aios-core/development/scripts/story-index-generator.js +337 -0
  128. package/.aios-core/development/scripts/story-manager.js +375 -0
  129. package/.aios-core/development/scripts/story-update-hook.js +259 -0
  130. package/.aios-core/development/scripts/task-identifier-resolver.js +145 -0
  131. package/.aios-core/development/scripts/test-greeting-system.js +142 -0
  132. package/.aios-core/development/scripts/validate-task-v2.js +319 -0
  133. package/.aios-core/development/scripts/workflow-navigator.js +214 -0
  134. package/.aios-core/development/tasks/add-mcp.md +319 -0
  135. package/.aios-core/development/tasks/advanced-elicitation.md +319 -0
  136. package/.aios-core/development/tasks/analyst-facilitate-brainstorming.md +342 -0
  137. package/.aios-core/development/tasks/analyze-framework.md +697 -0
  138. package/.aios-core/development/tasks/analyze-performance.md +637 -0
  139. package/.aios-core/development/tasks/apply-qa-fixes.md +340 -0
  140. package/.aios-core/development/tasks/architect-analyze-impact.md +827 -0
  141. package/.aios-core/development/tasks/audit-codebase.md +429 -0
  142. package/.aios-core/development/tasks/audit-tailwind-config.md +270 -0
  143. package/.aios-core/development/tasks/audit-utilities.md +358 -0
  144. package/.aios-core/development/tasks/bootstrap-shadcn-library.md +286 -0
  145. package/.aios-core/development/tasks/brownfield-create-epic.md +486 -0
  146. package/.aios-core/development/tasks/brownfield-create-story.md +357 -0
  147. package/.aios-core/development/tasks/build-component.md +478 -0
  148. package/.aios-core/development/tasks/calculate-roi.md +455 -0
  149. package/.aios-core/development/tasks/ci-cd-configuration.md +764 -0
  150. package/.aios-core/development/tasks/cleanup-utilities.md +670 -0
  151. package/.aios-core/development/tasks/collaborative-edit.md +1109 -0
  152. package/.aios-core/development/tasks/compose-molecule.md +284 -0
  153. package/.aios-core/development/tasks/consolidate-patterns.md +414 -0
  154. package/.aios-core/development/tasks/correct-course.md +280 -0
  155. package/.aios-core/development/tasks/create-agent.md +322 -0
  156. package/.aios-core/development/tasks/create-brownfield-story.md +727 -0
  157. package/.aios-core/development/tasks/create-deep-research-prompt.md +499 -0
  158. package/.aios-core/development/tasks/create-doc.md +316 -0
  159. package/.aios-core/development/tasks/create-next-story.md +774 -0
  160. package/.aios-core/development/tasks/create-suite.md +284 -0
  161. package/.aios-core/development/tasks/create-task.md +372 -0
  162. package/.aios-core/development/tasks/create-workflow.md +371 -0
  163. package/.aios-core/development/tasks/db-analyze-hotpaths.md +572 -0
  164. package/.aios-core/development/tasks/db-apply-migration.md +381 -0
  165. package/.aios-core/development/tasks/db-bootstrap.md +642 -0
  166. package/.aios-core/development/tasks/db-domain-modeling.md +693 -0
  167. package/.aios-core/development/tasks/db-dry-run.md +293 -0
  168. package/.aios-core/development/tasks/db-env-check.md +260 -0
  169. package/.aios-core/development/tasks/db-expansion-pack-integration.md +663 -0
  170. package/.aios-core/development/tasks/db-explain.md +631 -0
  171. package/.aios-core/development/tasks/db-impersonate.md +495 -0
  172. package/.aios-core/development/tasks/db-load-csv.md +593 -0
  173. package/.aios-core/development/tasks/db-policy-apply.md +653 -0
  174. package/.aios-core/development/tasks/db-rls-audit.md +411 -0
  175. package/.aios-core/development/tasks/db-rollback.md +739 -0
  176. package/.aios-core/development/tasks/db-run-sql.md +613 -0
  177. package/.aios-core/development/tasks/db-schema-audit.md +1011 -0
  178. package/.aios-core/development/tasks/db-seed.md +390 -0
  179. package/.aios-core/development/tasks/db-smoke-test.md +351 -0
  180. package/.aios-core/development/tasks/db-snapshot.md +569 -0
  181. package/.aios-core/development/tasks/db-supabase-setup.md +712 -0
  182. package/.aios-core/development/tasks/db-verify-order.md +515 -0
  183. package/.aios-core/development/tasks/deprecate-component.md +957 -0
  184. package/.aios-core/development/tasks/dev-apply-qa-fixes.md +318 -0
  185. package/.aios-core/development/tasks/dev-backlog-debt.md +469 -0
  186. package/.aios-core/development/tasks/dev-develop-story.md +846 -0
  187. package/.aios-core/development/tasks/dev-improve-code-quality.md +873 -0
  188. package/.aios-core/development/tasks/dev-optimize-performance.md +1034 -0
  189. package/.aios-core/development/tasks/dev-suggest-refactoring.md +871 -0
  190. package/.aios-core/development/tasks/dev-validate-next-story.md +349 -0
  191. package/.aios-core/development/tasks/document-project.md +553 -0
  192. package/.aios-core/development/tasks/environment-bootstrap.md +1311 -0
  193. package/.aios-core/development/tasks/execute-checklist.md +301 -0
  194. package/.aios-core/development/tasks/export-design-tokens-dtcg.md +274 -0
  195. package/.aios-core/development/tasks/extend-pattern.md +269 -0
  196. package/.aios-core/development/tasks/extract-tokens.md +467 -0
  197. package/.aios-core/development/tasks/facilitate-brainstorming-session.md +518 -0
  198. package/.aios-core/development/tasks/generate-ai-frontend-prompt.md +261 -0
  199. package/.aios-core/development/tasks/generate-documentation.md +284 -0
  200. package/.aios-core/development/tasks/generate-migration-strategy.md +522 -0
  201. package/.aios-core/development/tasks/generate-shock-report.md +501 -0
  202. package/.aios-core/development/tasks/github-devops-github-pr-automation.md +427 -0
  203. package/.aios-core/development/tasks/github-devops-pre-push-quality-gate.md +733 -0
  204. package/.aios-core/development/tasks/github-devops-repository-cleanup.md +374 -0
  205. package/.aios-core/development/tasks/github-devops-version-management.md +483 -0
  206. package/.aios-core/development/tasks/improve-self.md +823 -0
  207. package/.aios-core/development/tasks/index-docs.md +388 -0
  208. package/.aios-core/development/tasks/init-project-status.md +506 -0
  209. package/.aios-core/development/tasks/integrate-expansion-pack.md +314 -0
  210. package/.aios-core/development/tasks/kb-mode-interaction.md +284 -0
  211. package/.aios-core/development/tasks/learn-patterns.md +901 -0
  212. package/.aios-core/development/tasks/mcp-workflow.md +437 -0
  213. package/.aios-core/development/tasks/modify-agent.md +382 -0
  214. package/.aios-core/development/tasks/modify-task.md +425 -0
  215. package/.aios-core/development/tasks/modify-workflow.md +466 -0
  216. package/.aios-core/development/tasks/po-backlog-add.md +370 -0
  217. package/.aios-core/development/tasks/po-manage-story-backlog.md +523 -0
  218. package/.aios-core/development/tasks/po-pull-story-from-clickup.md +540 -0
  219. package/.aios-core/development/tasks/po-pull-story.md +316 -0
  220. package/.aios-core/development/tasks/po-stories-index.md +351 -0
  221. package/.aios-core/development/tasks/po-sync-story-to-clickup.md +457 -0
  222. package/.aios-core/development/tasks/po-sync-story.md +303 -0
  223. package/.aios-core/development/tasks/pr-automation.md +701 -0
  224. package/.aios-core/development/tasks/propose-modification.md +843 -0
  225. package/.aios-core/development/tasks/qa-backlog-add-followup.md +425 -0
  226. package/.aios-core/development/tasks/qa-gate.md +374 -0
  227. package/.aios-core/development/tasks/qa-generate-tests.md +1175 -0
  228. package/.aios-core/development/tasks/qa-nfr-assess.md +558 -0
  229. package/.aios-core/development/tasks/qa-review-proposal.md +1158 -0
  230. package/.aios-core/development/tasks/qa-review-story.md +683 -0
  231. package/.aios-core/development/tasks/qa-risk-profile.md +567 -0
  232. package/.aios-core/development/tasks/qa-run-tests.md +277 -0
  233. package/.aios-core/development/tasks/qa-test-design.md +388 -0
  234. package/.aios-core/development/tasks/qa-trace-requirements.md +477 -0
  235. package/.aios-core/development/tasks/release-management.md +723 -0
  236. package/.aios-core/development/tasks/security-audit.md +554 -0
  237. package/.aios-core/development/tasks/security-scan.md +790 -0
  238. package/.aios-core/development/tasks/setup-database.md +741 -0
  239. package/.aios-core/development/tasks/setup-design-system.md +462 -0
  240. package/.aios-core/development/tasks/setup-github.md +874 -0
  241. package/.aios-core/development/tasks/setup-llm-routing.md +229 -0
  242. package/.aios-core/development/tasks/setup-mcp-docker.md +584 -0
  243. package/.aios-core/development/tasks/shard-doc.md +538 -0
  244. package/.aios-core/development/tasks/sm-create-next-story.md +480 -0
  245. package/.aios-core/development/tasks/sync-documentation.md +865 -0
  246. package/.aios-core/development/tasks/tailwind-upgrade.md +294 -0
  247. package/.aios-core/development/tasks/test-as-user.md +621 -0
  248. package/.aios-core/development/tasks/test-validation-task.md +171 -0
  249. package/.aios-core/development/tasks/undo-last.md +347 -0
  250. package/.aios-core/development/tasks/update-manifest.md +410 -0
  251. package/.aios-core/development/tasks/ux-create-wireframe.md +617 -0
  252. package/.aios-core/development/tasks/ux-ds-scan-artifact.md +672 -0
  253. package/.aios-core/development/tasks/ux-user-research.md +559 -0
  254. package/.aios-core/development/tasks/validate-next-story.md +423 -0
  255. package/.aios-core/development/tasks/validate-structure.md +243 -0
  256. package/.aios-core/development/workflows/README.md +84 -0
  257. package/.aios-core/development/workflows/brownfield-fullstack.yaml +297 -0
  258. package/.aios-core/development/workflows/brownfield-service.yaml +187 -0
  259. package/.aios-core/development/workflows/brownfield-ui.yaml +197 -0
  260. package/.aios-core/development/workflows/greenfield-fullstack.yaml +333 -0
  261. package/.aios-core/development/workflows/greenfield-service.yaml +206 -0
  262. package/.aios-core/development/workflows/greenfield-ui.yaml +235 -0
  263. package/.aios-core/docs/SHARD-TRANSLATION-GUIDE.md +335 -0
  264. package/.aios-core/docs/component-creation-guide.md +458 -0
  265. package/.aios-core/docs/session-update-pattern.md +307 -0
  266. package/.aios-core/docs/standards/AGENT-PERSONALIZATION-STANDARD-V1.md +572 -0
  267. package/.aios-core/docs/standards/AIOS-COLOR-PALETTE-QUICK-REFERENCE.md +185 -0
  268. package/.aios-core/docs/standards/AIOS-COLOR-PALETTE-V2.1.md +354 -0
  269. package/.aios-core/docs/standards/AIOS-FRAMEWORK-MASTER.md +1963 -0
  270. package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO-V2.1-COMPLETE.md +821 -0
  271. package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO-V2.1-SUMMARY.md +1190 -0
  272. package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO-V2.1.md +439 -0
  273. package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO-V2.2-SUMMARY.md +1339 -0
  274. package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO.md +5398 -0
  275. package/.aios-core/docs/standards/EXECUTOR-DECISION-TREE.md +697 -0
  276. package/.aios-core/docs/standards/OPEN-SOURCE-VS-SERVICE-DIFFERENCES.md +511 -0
  277. package/.aios-core/docs/standards/QUALITY-GATES-SPECIFICATION.md +556 -0
  278. package/.aios-core/docs/standards/STANDARDS-INDEX.md +210 -0
  279. package/.aios-core/docs/standards/STORY-TEMPLATE-V2-SPECIFICATION.md +550 -0
  280. package/.aios-core/docs/standards/TASK-FORMAT-SPECIFICATION-V1.md +1414 -0
  281. package/.aios-core/docs/standards/V3-ARCHITECTURAL-DECISIONS.md +523 -0
  282. package/.aios-core/docs/template-syntax.md +267 -0
  283. package/.aios-core/docs/troubleshooting-guide.md +625 -0
  284. package/.aios-core/elicitation/agent-elicitation.js +272 -0
  285. package/.aios-core/elicitation/task-elicitation.js +281 -0
  286. package/.aios-core/elicitation/workflow-elicitation.js +315 -0
  287. package/.aios-core/index.d.ts +8 -0
  288. package/.aios-core/index.esm.js +16 -0
  289. package/.aios-core/index.js +16 -0
  290. package/.aios-core/infrastructure/README.md +126 -0
  291. package/.aios-core/infrastructure/index.js +199 -0
  292. package/.aios-core/infrastructure/integrations/pm-adapters/README.md +59 -0
  293. package/.aios-core/infrastructure/integrations/pm-adapters/clickup-adapter.js +345 -0
  294. package/.aios-core/infrastructure/integrations/pm-adapters/github-adapter.js +392 -0
  295. package/.aios-core/infrastructure/integrations/pm-adapters/jira-adapter.js +448 -0
  296. package/.aios-core/infrastructure/integrations/pm-adapters/local-adapter.js +175 -0
  297. package/.aios-core/infrastructure/scripts/_archived/final-todo-count.js +122 -0
  298. package/.aios-core/infrastructure/scripts/_archived/fix-yaml-formatting.js +89 -0
  299. package/.aios-core/infrastructure/scripts/_archived/migration-generator.js +780 -0
  300. package/.aios-core/infrastructure/scripts/_archived/migration-path-generator.js +950 -0
  301. package/.aios-core/infrastructure/scripts/_archived/phase2-entrada-saida-errors.js +425 -0
  302. package/.aios-core/infrastructure/scripts/_archived/phase2-spot-check.js +132 -0
  303. package/.aios-core/infrastructure/scripts/_archived/phase3-tools-scripts-validation.js +381 -0
  304. package/.aios-core/infrastructure/scripts/_archived/phase4-metadata-performance.js +203 -0
  305. package/.aios-core/infrastructure/scripts/_archived/test-yaml-parsing.js +24 -0
  306. package/.aios-core/infrastructure/scripts/_archived/verify-yaml-fix.js +51 -0
  307. package/.aios-core/infrastructure/scripts/aios-validator.js +294 -0
  308. package/.aios-core/infrastructure/scripts/approval-workflow.js +643 -0
  309. package/.aios-core/infrastructure/scripts/atomic-layer-classifier.js +308 -0
  310. package/.aios-core/infrastructure/scripts/backup-manager.js +607 -0
  311. package/.aios-core/infrastructure/scripts/batch-creator.js +608 -0
  312. package/.aios-core/infrastructure/scripts/branch-manager.js +391 -0
  313. package/.aios-core/infrastructure/scripts/capability-analyzer.js +535 -0
  314. package/.aios-core/infrastructure/scripts/clickup-helpers.js +226 -0
  315. package/.aios-core/infrastructure/scripts/code-quality-improver.js +1312 -0
  316. package/.aios-core/infrastructure/scripts/commit-message-generator.js +850 -0
  317. package/.aios-core/infrastructure/scripts/component-generator.js +738 -0
  318. package/.aios-core/infrastructure/scripts/component-metadata.js +627 -0
  319. package/.aios-core/infrastructure/scripts/component-search.js +277 -0
  320. package/.aios-core/infrastructure/scripts/config-cache.js +322 -0
  321. package/.aios-core/infrastructure/scripts/config-loader.js +349 -0
  322. package/.aios-core/infrastructure/scripts/conflict-resolver.js +675 -0
  323. package/.aios-core/infrastructure/scripts/coverage-analyzer.js +882 -0
  324. package/.aios-core/infrastructure/scripts/dependency-analyzer.js +638 -0
  325. package/.aios-core/infrastructure/scripts/dependency-impact-analyzer.js +703 -0
  326. package/.aios-core/infrastructure/scripts/diff-generator.js +129 -0
  327. package/.aios-core/infrastructure/scripts/documentation-integrity/brownfield-analyzer.js +501 -0
  328. package/.aios-core/infrastructure/scripts/documentation-integrity/config-generator.js +329 -0
  329. package/.aios-core/infrastructure/scripts/documentation-integrity/deployment-config-loader.js +282 -0
  330. package/.aios-core/infrastructure/scripts/documentation-integrity/doc-generator.js +331 -0
  331. package/.aios-core/infrastructure/scripts/documentation-integrity/gitignore-generator.js +313 -0
  332. package/.aios-core/infrastructure/scripts/documentation-integrity/index.js +74 -0
  333. package/.aios-core/infrastructure/scripts/documentation-integrity/mode-detector.js +358 -0
  334. package/.aios-core/infrastructure/scripts/documentation-synchronizer.js +1432 -0
  335. package/.aios-core/infrastructure/scripts/framework-analyzer.js +746 -0
  336. package/.aios-core/infrastructure/scripts/git-config-detector.js +293 -0
  337. package/.aios-core/infrastructure/scripts/git-wrapper.js +443 -0
  338. package/.aios-core/infrastructure/scripts/improvement-engine.js +758 -0
  339. package/.aios-core/infrastructure/scripts/improvement-validator.js +710 -0
  340. package/.aios-core/infrastructure/scripts/llm-routing/install-llm-routing.js +267 -0
  341. package/.aios-core/infrastructure/scripts/llm-routing/templates/claude-free.cmd +80 -0
  342. package/.aios-core/infrastructure/scripts/llm-routing/templates/claude-free.sh +62 -0
  343. package/.aios-core/infrastructure/scripts/llm-routing/templates/claude-max.cmd +26 -0
  344. package/.aios-core/infrastructure/scripts/llm-routing/templates/claude-max.sh +18 -0
  345. package/.aios-core/infrastructure/scripts/modification-risk-assessment.js +970 -0
  346. package/.aios-core/infrastructure/scripts/modification-validator.js +555 -0
  347. package/.aios-core/infrastructure/scripts/output-formatter.js +297 -0
  348. package/.aios-core/infrastructure/scripts/performance-analyzer.js +758 -0
  349. package/.aios-core/infrastructure/scripts/performance-and-error-resolver.js +258 -0
  350. package/.aios-core/infrastructure/scripts/performance-optimizer.js +1902 -0
  351. package/.aios-core/infrastructure/scripts/performance-tracker.js +452 -0
  352. package/.aios-core/infrastructure/scripts/pm-adapter-factory.js +181 -0
  353. package/.aios-core/infrastructure/scripts/pm-adapter.js +134 -0
  354. package/.aios-core/infrastructure/scripts/project-status-loader.js +445 -0
  355. package/.aios-core/infrastructure/scripts/refactoring-suggester.js +1139 -0
  356. package/.aios-core/infrastructure/scripts/repository-detector.js +64 -0
  357. package/.aios-core/infrastructure/scripts/sandbox-tester.js +618 -0
  358. package/.aios-core/infrastructure/scripts/security-checker.js +359 -0
  359. package/.aios-core/infrastructure/scripts/source-tree-guardian/index.js +375 -0
  360. package/.aios-core/infrastructure/scripts/source-tree-guardian/manifest-generator.js +410 -0
  361. package/.aios-core/infrastructure/scripts/source-tree-guardian/rules/naming-rules.yaml +285 -0
  362. package/.aios-core/infrastructure/scripts/source-tree-guardian/rules/placement-rules.yaml +262 -0
  363. package/.aios-core/infrastructure/scripts/source-tree-guardian/validator.js +468 -0
  364. package/.aios-core/infrastructure/scripts/spot-check-validator.js +149 -0
  365. package/.aios-core/infrastructure/scripts/status-mapper.js +115 -0
  366. package/.aios-core/infrastructure/scripts/template-engine.js +240 -0
  367. package/.aios-core/infrastructure/scripts/template-validator.js +279 -0
  368. package/.aios-core/infrastructure/scripts/test-generator.js +844 -0
  369. package/.aios-core/infrastructure/scripts/test-quality-assessment.js +1081 -0
  370. package/.aios-core/infrastructure/scripts/test-utilities-fast.js +126 -0
  371. package/.aios-core/infrastructure/scripts/test-utilities.js +200 -0
  372. package/.aios-core/infrastructure/scripts/tool-resolver.js +360 -0
  373. package/.aios-core/infrastructure/scripts/transaction-manager.js +590 -0
  374. package/.aios-core/infrastructure/scripts/usage-analytics.js +634 -0
  375. package/.aios-core/infrastructure/scripts/validate-output-pattern.js +213 -0
  376. package/.aios-core/infrastructure/scripts/visual-impact-generator.js +1056 -0
  377. package/.aios-core/infrastructure/scripts/yaml-validator.js +397 -0
  378. package/.aios-core/infrastructure/templates/coderabbit.yaml.template +279 -0
  379. package/.aios-core/infrastructure/templates/core-config/core-config-brownfield.tmpl.yaml +182 -0
  380. package/.aios-core/infrastructure/templates/core-config/core-config-greenfield.tmpl.yaml +127 -0
  381. package/.aios-core/infrastructure/templates/github-workflows/README.md +109 -0
  382. package/.aios-core/infrastructure/templates/github-workflows/ci.yml.template +169 -0
  383. package/.aios-core/infrastructure/templates/github-workflows/pr-automation.yml.template +330 -0
  384. package/.aios-core/infrastructure/templates/github-workflows/release.yml.template +196 -0
  385. package/.aios-core/infrastructure/templates/gitignore/gitignore-aios-base.tmpl +63 -0
  386. package/.aios-core/infrastructure/templates/gitignore/gitignore-brownfield-merge.tmpl +18 -0
  387. package/.aios-core/infrastructure/templates/gitignore/gitignore-node.tmpl +85 -0
  388. package/.aios-core/infrastructure/templates/gitignore/gitignore-python.tmpl +145 -0
  389. package/.aios-core/infrastructure/templates/project-docs/coding-standards-tmpl.md +346 -0
  390. package/.aios-core/infrastructure/templates/project-docs/source-tree-tmpl.md +177 -0
  391. package/.aios-core/infrastructure/templates/project-docs/tech-stack-tmpl.md +267 -0
  392. package/.aios-core/infrastructure/tests/project-status-loader.test.js +394 -0
  393. package/.aios-core/infrastructure/tests/regression-suite-v2.md +621 -0
  394. package/.aios-core/infrastructure/tests/utilities-audit-results.json +501 -0
  395. package/.aios-core/infrastructure/tests/validate-module.js +97 -0
  396. package/.aios-core/infrastructure/tools/README.md +222 -0
  397. package/.aios-core/infrastructure/tools/cli/github-cli.yaml +200 -0
  398. package/.aios-core/infrastructure/tools/cli/llm-routing.yaml +126 -0
  399. package/.aios-core/infrastructure/tools/cli/railway-cli.yaml +260 -0
  400. package/.aios-core/infrastructure/tools/cli/supabase-cli.yaml +224 -0
  401. package/.aios-core/infrastructure/tools/local/ffmpeg.yaml +261 -0
  402. package/.aios-core/infrastructure/tools/mcp/21st-dev-magic.yaml +127 -0
  403. package/.aios-core/infrastructure/tools/mcp/browser.yaml +103 -0
  404. package/.aios-core/infrastructure/tools/mcp/clickup.yaml +534 -0
  405. package/.aios-core/infrastructure/tools/mcp/context7.yaml +78 -0
  406. package/.aios-core/infrastructure/tools/mcp/desktop-commander.yaml +180 -0
  407. package/.aios-core/infrastructure/tools/mcp/exa.yaml +103 -0
  408. package/.aios-core/infrastructure/tools/mcp/google-workspace.yaml +930 -0
  409. package/.aios-core/infrastructure/tools/mcp/n8n.yaml +551 -0
  410. package/.aios-core/infrastructure/tools/mcp/supabase.yaml +808 -0
  411. package/.aios-core/install-manifest.yaml +347 -0
  412. package/.aios-core/manifests/agents.csv +1 -0
  413. package/.aios-core/manifests/schema/manifest-schema.json +190 -0
  414. package/.aios-core/manifests/tasks.csv +121 -0
  415. package/.aios-core/manifests/workers.csv +204 -0
  416. package/.aios-core/package.json +103 -0
  417. package/.aios-core/product/README.md +56 -0
  418. package/.aios-core/product/checklists/architect-checklist.md +444 -0
  419. package/.aios-core/product/checklists/change-checklist.md +183 -0
  420. package/.aios-core/product/checklists/database-design-checklist.md +119 -0
  421. package/.aios-core/product/checklists/dba-predeploy-checklist.md +97 -0
  422. package/.aios-core/product/checklists/dba-rollback-checklist.md +99 -0
  423. package/.aios-core/product/checklists/pm-checklist.md +376 -0
  424. package/.aios-core/product/checklists/po-master-checklist.md +442 -0
  425. package/.aios-core/product/checklists/pre-push-checklist.md +108 -0
  426. package/.aios-core/product/checklists/release-checklist.md +122 -0
  427. package/.aios-core/product/checklists/story-dod-checklist.md +102 -0
  428. package/.aios-core/product/checklists/story-draft-checklist.md +216 -0
  429. package/.aios-core/product/data/brainstorming-techniques.md +37 -0
  430. package/.aios-core/product/data/elicitation-methods.md +135 -0
  431. package/.aios-core/product/data/mode-selection-best-practices.md +471 -0
  432. package/.aios-core/product/data/test-levels-framework.md +149 -0
  433. package/.aios-core/product/data/test-priorities-matrix.md +175 -0
  434. package/.aios-core/product/templates/1mcp-config.yaml +225 -0
  435. package/.aios-core/product/templates/activation-instructions-inline-greeting.yaml +63 -0
  436. package/.aios-core/product/templates/activation-instructions-template.md +258 -0
  437. package/.aios-core/product/templates/adr.hbs +125 -0
  438. package/.aios-core/product/templates/agent-template.yaml +121 -0
  439. package/.aios-core/product/templates/architecture-tmpl.yaml +651 -0
  440. package/.aios-core/product/templates/brainstorming-output-tmpl.yaml +156 -0
  441. package/.aios-core/product/templates/brownfield-architecture-tmpl.yaml +476 -0
  442. package/.aios-core/product/templates/brownfield-prd-tmpl.yaml +280 -0
  443. package/.aios-core/product/templates/changelog-template.md +134 -0
  444. package/.aios-core/product/templates/command-rationalization-matrix.md +152 -0
  445. package/.aios-core/product/templates/competitor-analysis-tmpl.yaml +293 -0
  446. package/.aios-core/product/templates/component-react-tmpl.tsx +98 -0
  447. package/.aios-core/product/templates/dbdr.hbs +241 -0
  448. package/.aios-core/product/templates/design-story-tmpl.yaml +587 -0
  449. package/.aios-core/product/templates/ds-artifact-analysis.md +70 -0
  450. package/.aios-core/product/templates/engine/elicitation.js +298 -0
  451. package/.aios-core/product/templates/engine/index.js +308 -0
  452. package/.aios-core/product/templates/engine/loader.js +231 -0
  453. package/.aios-core/product/templates/engine/renderer.js +343 -0
  454. package/.aios-core/product/templates/engine/schemas/adr.schema.json +102 -0
  455. package/.aios-core/product/templates/engine/schemas/dbdr.schema.json +205 -0
  456. package/.aios-core/product/templates/engine/schemas/epic.schema.json +175 -0
  457. package/.aios-core/product/templates/engine/schemas/pmdr.schema.json +175 -0
  458. package/.aios-core/product/templates/engine/schemas/prd-v2.schema.json +300 -0
  459. package/.aios-core/product/templates/engine/schemas/prd.schema.json +152 -0
  460. package/.aios-core/product/templates/engine/schemas/story.schema.json +222 -0
  461. package/.aios-core/product/templates/engine/schemas/task.schema.json +154 -0
  462. package/.aios-core/product/templates/engine/validator.js +294 -0
  463. package/.aios-core/product/templates/epic.hbs +212 -0
  464. package/.aios-core/product/templates/eslintrc-security.json +32 -0
  465. package/.aios-core/product/templates/front-end-architecture-tmpl.yaml +206 -0
  466. package/.aios-core/product/templates/front-end-spec-tmpl.yaml +349 -0
  467. package/.aios-core/product/templates/fullstack-architecture-tmpl.yaml +805 -0
  468. package/.aios-core/product/templates/github-actions-cd.yml +212 -0
  469. package/.aios-core/product/templates/github-actions-ci.yml +172 -0
  470. package/.aios-core/product/templates/github-pr-template.md +67 -0
  471. package/.aios-core/product/templates/gordon-mcp.yaml +140 -0
  472. package/.aios-core/product/templates/ide-rules/antigravity-rules.md +115 -0
  473. package/.aios-core/product/templates/ide-rules/claude-rules.md +221 -0
  474. package/.aios-core/product/templates/ide-rules/cline-rules.md +84 -0
  475. package/.aios-core/product/templates/ide-rules/copilot-rules.md +92 -0
  476. package/.aios-core/product/templates/ide-rules/cursor-rules.md +115 -0
  477. package/.aios-core/product/templates/ide-rules/gemini-rules.md +85 -0
  478. package/.aios-core/product/templates/ide-rules/roo-rules.md +86 -0
  479. package/.aios-core/product/templates/ide-rules/trae-rules.md +104 -0
  480. package/.aios-core/product/templates/ide-rules/windsurf-rules.md +80 -0
  481. package/.aios-core/product/templates/index-strategy-tmpl.yaml +53 -0
  482. package/.aios-core/product/templates/market-research-tmpl.yaml +252 -0
  483. package/.aios-core/product/templates/mcp-workflow.js +271 -0
  484. package/.aios-core/product/templates/migration-plan-tmpl.yaml +1022 -0
  485. package/.aios-core/product/templates/migration-strategy-tmpl.md +524 -0
  486. package/.aios-core/product/templates/personalized-agent-template.md +258 -0
  487. package/.aios-core/product/templates/personalized-checklist-template.md +340 -0
  488. package/.aios-core/product/templates/personalized-task-template-v2.md +905 -0
  489. package/.aios-core/product/templates/personalized-task-template.md +344 -0
  490. package/.aios-core/product/templates/personalized-template-file.yaml +322 -0
  491. package/.aios-core/product/templates/personalized-workflow-template.yaml +460 -0
  492. package/.aios-core/product/templates/pmdr.hbs +186 -0
  493. package/.aios-core/product/templates/prd-tmpl.yaml +202 -0
  494. package/.aios-core/product/templates/prd-v2.0.hbs +216 -0
  495. package/.aios-core/product/templates/prd.hbs +201 -0
  496. package/.aios-core/product/templates/project-brief-tmpl.yaml +221 -0
  497. package/.aios-core/product/templates/qa-gate-tmpl.yaml +240 -0
  498. package/.aios-core/product/templates/rls-policies-tmpl.yaml +1203 -0
  499. package/.aios-core/product/templates/schema-design-tmpl.yaml +428 -0
  500. package/.aios-core/product/templates/shock-report-tmpl.html +502 -0
  501. package/.aios-core/product/templates/state-persistence-tmpl.yaml +219 -0
  502. package/.aios-core/product/templates/story-tmpl.yaml +332 -0
  503. package/.aios-core/product/templates/story.hbs +263 -0
  504. package/.aios-core/product/templates/task-execution-report.md +495 -0
  505. package/.aios-core/product/templates/task-template.md +123 -0
  506. package/.aios-core/product/templates/task.hbs +170 -0
  507. package/.aios-core/product/templates/tmpl-comment-on-examples.sql +158 -0
  508. package/.aios-core/product/templates/tmpl-migration-script.sql +91 -0
  509. package/.aios-core/product/templates/tmpl-rls-granular-policies.sql +104 -0
  510. package/.aios-core/product/templates/tmpl-rls-kiss-policy.sql +10 -0
  511. package/.aios-core/product/templates/tmpl-rls-roles.sql +135 -0
  512. package/.aios-core/product/templates/tmpl-rls-simple.sql +77 -0
  513. package/.aios-core/product/templates/tmpl-rls-tenant.sql +152 -0
  514. package/.aios-core/product/templates/tmpl-rollback-script.sql +77 -0
  515. package/.aios-core/product/templates/tmpl-seed-data.sql +140 -0
  516. package/.aios-core/product/templates/tmpl-smoke-test.sql +16 -0
  517. package/.aios-core/product/templates/tmpl-staging-copy-merge.sql +139 -0
  518. package/.aios-core/product/templates/tmpl-stored-proc.sql +140 -0
  519. package/.aios-core/product/templates/tmpl-trigger.sql +152 -0
  520. package/.aios-core/product/templates/tmpl-view-materialized.sql +133 -0
  521. package/.aios-core/product/templates/tmpl-view.sql +177 -0
  522. package/.aios-core/product/templates/token-exports-css-tmpl.css +240 -0
  523. package/.aios-core/product/templates/token-exports-tailwind-tmpl.js +395 -0
  524. package/.aios-core/product/templates/tokens-schema-tmpl.yaml +305 -0
  525. package/.aios-core/product/templates/workflow-template.yaml +134 -0
  526. package/.aios-core/quality/metrics-collector.js +572 -0
  527. package/.aios-core/quality/metrics-hook.js +260 -0
  528. package/.aios-core/quality/schemas/quality-metrics.schema.json +233 -0
  529. package/.aios-core/quality/seed-metrics.js +336 -0
  530. package/.aios-core/scripts/README.md +354 -0
  531. package/.aios-core/scripts/aios-doc-template.md +325 -0
  532. package/.aios-core/scripts/batch-migrate-phase1.ps1 +36 -0
  533. package/.aios-core/scripts/batch-migrate-phase2.ps1 +88 -0
  534. package/.aios-core/scripts/batch-migrate-phase3.ps1 +45 -0
  535. package/.aios-core/scripts/command-execution-hook.js +201 -0
  536. package/.aios-core/scripts/context-detector.js +226 -0
  537. package/.aios-core/scripts/elicitation-engine.js +385 -0
  538. package/.aios-core/scripts/elicitation-session-manager.js +300 -0
  539. package/.aios-core/scripts/migrate-framework-docs.sh +300 -0
  540. package/.aios-core/scripts/session-context-loader.js +286 -0
  541. package/.aios-core/scripts/test-template-system.js +941 -0
  542. package/.aios-core/scripts/validate-phase1.ps1 +35 -0
  543. package/.aios-core/scripts/workflow-management.md +69 -0
  544. package/.aios-core/tasks/find-component.md.legacy +391 -0
  545. package/.aios-core/tasks/generate-commit-message.md.legacy +426 -0
  546. package/.aios-core/tasks/generate-migration.md.legacy +382 -0
  547. package/.aios-core/tasks/rollback-modification.md.legacy +307 -0
  548. package/.aios-core/tasks/update-tests.md.legacy +283 -0
  549. package/.aios-core/user-guide.md +1413 -0
  550. package/.aios-core/working-in-the-brownfield.md +361 -0
  551. package/.claude/CLAUDE.md +221 -0
  552. package/LICENSE +48 -0
  553. package/README.md +703 -0
  554. package/bin/aios-init-old.js +532 -0
  555. package/bin/aios-init-v4.js +390 -0
  556. package/bin/aios-init.backup-v1.1.4.js +352 -0
  557. package/bin/aios-init.js +736 -0
  558. package/bin/aios-minimal.js +26 -0
  559. package/bin/aios.js +279 -0
  560. package/bin/migrate-pm-config.js +219 -0
  561. package/bin/modules/env-config.js +436 -0
  562. package/bin/modules/mcp-installer.js +383 -0
  563. package/bin/utils/install-errors.js +339 -0
  564. package/bin/utils/install-transaction.js +445 -0
  565. package/index.d.ts +19 -0
  566. package/index.esm.js +21 -0
  567. package/index.js +94 -0
  568. package/package.json +161 -0
  569. package/packages/installer/package.json +39 -0
  570. package/packages/installer/src/config/configure-environment.js +312 -0
  571. package/packages/installer/src/config/templates/core-config-template.js +183 -0
  572. package/packages/installer/src/config/templates/env-template.js +127 -0
  573. package/packages/installer/src/config/validation/config-validator.js +243 -0
  574. package/packages/installer/src/detection/detect-project-type.js +81 -0
  575. package/packages/installer/src/wizard/wizard.js +244 -0
  576. package/packages/installer/tests/integration/environment-configuration.test.js +328 -0
  577. package/packages/installer/tests/integration/wizard-detection.test.js +349 -0
  578. package/packages/installer/tests/unit/config-validator.test.js +315 -0
  579. package/packages/installer/tests/unit/detection/detect-project-type.test.js +401 -0
  580. package/packages/installer/tests/unit/env-template.test.js +185 -0
  581. package/src/config/ide-configs.js +189 -0
  582. package/src/installer/aios-core-installer.js +319 -0
  583. package/src/installer/dependency-installer.js +335 -0
  584. package/src/utils/aios-colors.js +234 -0
  585. package/src/wizard/feedback.js +218 -0
  586. package/src/wizard/ide-config-generator.js +488 -0
  587. package/src/wizard/ide-selector.js +84 -0
  588. package/src/wizard/index.js +589 -0
  589. package/src/wizard/questions.js +249 -0
  590. package/src/wizard/validation/index.js +120 -0
  591. package/src/wizard/validation/report-generator.js +269 -0
  592. package/src/wizard/validation/troubleshooting-system.js +346 -0
  593. package/src/wizard/validation/validators/config-validator.js +362 -0
  594. package/src/wizard/validation/validators/dependency-validator.js +333 -0
  595. package/src/wizard/validation/validators/file-structure-validator.js +181 -0
  596. package/src/wizard/validation/validators/mcp-health-checker.js +310 -0
  597. package/src/wizard/validators.js +274 -0
  598. package/templates/squad/LICENSE +21 -0
  599. package/templates/squad/README.md +37 -0
  600. package/templates/squad/agents/example-agent.yaml +36 -0
  601. package/templates/squad/package.json +19 -0
  602. package/templates/squad/squad.yaml +25 -0
  603. package/templates/squad/tasks/example-task.yaml +46 -0
  604. package/templates/squad/templates/example-template.md +24 -0
  605. package/templates/squad/tests/example-agent.test.js +53 -0
  606. package/templates/squad/workflows/example-workflow.yaml +54 -0
  607. 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
+ };