fraim 2.0.362-next.4 → 2.0.362

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 (277) hide show
  1. package/dist/registry/scripts/domains/folders.js +55 -0
  2. package/dist/registry/scripts/learning/entry-authoring.js +13 -24
  3. package/dist/registry/scripts/learning/run-publication.js +5 -30
  4. package/dist/registry/stubs/jobs/ai-employee/ai-engineering/aeo-optimization.md +43 -0
  5. package/dist/registry/stubs/jobs/ai-employee/ai-engineering/author-ai-evals.md +33 -0
  6. package/dist/registry/stubs/jobs/ai-employee/ai-engineering/create-ai-agent.md +33 -0
  7. package/dist/registry/stubs/jobs/ai-employee/ai-engineering/create-hub-configured-agent.md +34 -0
  8. package/dist/registry/stubs/jobs/ai-employee/ai-engineering/enable-web-mcp.md +33 -0
  9. package/dist/registry/stubs/jobs/ai-employee/ai-engineering/evaluate-ai-agent.md +32 -0
  10. package/dist/registry/stubs/jobs/ai-employee/ai-engineering/mcp-server-creation.md +35 -0
  11. package/dist/registry/stubs/jobs/ai-employee/ai-engineering/publish-mcp-app.md +28 -0
  12. package/dist/registry/stubs/jobs/ai-employee/bank-compliance/banking-evidence-audit.md +32 -0
  13. package/dist/registry/stubs/jobs/ai-employee/bank-operations/kyc-case-review.md +32 -0
  14. package/dist/registry/stubs/jobs/ai-employee/career/career-networking.md +46 -0
  15. package/dist/registry/stubs/jobs/ai-employee/career/career-spec.md +41 -0
  16. package/dist/registry/stubs/jobs/ai-employee/career/career-trajectory-planning.md +41 -0
  17. package/dist/registry/stubs/jobs/ai-employee/career/job-applications-and-networking.md +40 -0
  18. package/dist/registry/stubs/jobs/ai-employee/career/job-search-strategy-and-application-plan.md +41 -0
  19. package/dist/registry/stubs/jobs/ai-employee/career/offer-negotiation.md +42 -0
  20. package/dist/registry/stubs/jobs/ai-employee/career/pitch-and-interview-prep.md +43 -0
  21. package/dist/registry/stubs/jobs/ai-employee/career/public-profile-updates.md +41 -0
  22. package/dist/registry/stubs/jobs/ai-employee/career/resilience-planning.md +38 -0
  23. package/dist/registry/stubs/jobs/ai-employee/career/resume-creation.md +40 -0
  24. package/dist/registry/stubs/jobs/ai-employee/customer/crm-case-resolution.md +33 -0
  25. package/dist/registry/stubs/jobs/ai-employee/customer/customer-health-review.md +36 -0
  26. package/dist/registry/stubs/jobs/ai-employee/customer/loyalty-program-management.md +35 -0
  27. package/dist/registry/stubs/jobs/ai-employee/customer/support-case-resolution.md +39 -0
  28. package/dist/registry/stubs/jobs/ai-employee/customer/support-playbook-evaluation.md +37 -0
  29. package/dist/registry/stubs/jobs/ai-employee/customer/support-queue-management.md +36 -0
  30. package/dist/registry/stubs/jobs/ai-employee/customer/support-sop-operationalization.md +36 -0
  31. package/dist/registry/stubs/jobs/ai-employee/customer/support-system-operationalization.md +34 -0
  32. package/dist/registry/stubs/jobs/ai-employee/customer/survey-campaign-management.md +36 -0
  33. package/dist/registry/stubs/jobs/ai-employee/customer/update-crm.md +32 -0
  34. package/dist/registry/stubs/jobs/ai-employee/customer/user-survey-management.md +34 -0
  35. package/dist/registry/stubs/jobs/ai-employee/design/brand-creation.md +34 -0
  36. package/dist/registry/stubs/jobs/ai-employee/design/branding-quality-audit.md +32 -0
  37. package/dist/registry/stubs/jobs/ai-employee/design/design-system-creation.md +35 -0
  38. package/dist/registry/stubs/jobs/ai-employee/design/ui-quality-assessment.md +34 -0
  39. package/dist/registry/stubs/jobs/ai-employee/design/user-facing-prototyping.md +31 -0
  40. package/dist/registry/stubs/jobs/ai-employee/design/user-journey-mapping.md +33 -0
  41. package/dist/registry/stubs/jobs/ai-employee/design/ux-research-synthesis.md +33 -0
  42. package/dist/registry/stubs/jobs/ai-employee/design/website-creation.md +32 -0
  43. package/dist/registry/stubs/jobs/ai-employee/dev-ops/cloud-application-deployment.md +35 -0
  44. package/dist/registry/stubs/jobs/ai-employee/dev-ops/cloud-cost-optimization.md +34 -0
  45. package/dist/registry/stubs/jobs/ai-employee/dev-ops/cloud-performance-diagnosis.md +33 -0
  46. package/dist/registry/stubs/jobs/ai-employee/dev-ops/cross-cloud-migration.md +42 -0
  47. package/dist/registry/stubs/jobs/ai-employee/dev-ops/incident-response.md +35 -0
  48. package/dist/registry/stubs/jobs/ai-employee/dev-ops/production-readiness-review.md +31 -0
  49. package/dist/registry/stubs/jobs/ai-employee/dev-ops/reliability-review.md +34 -0
  50. package/dist/registry/stubs/jobs/ai-employee/dev-ops/route-llm-spend-to-cloud-credits.md +36 -0
  51. package/dist/registry/stubs/jobs/ai-employee/dev-ops/run-on-remote-hub.md +30 -0
  52. package/dist/registry/stubs/jobs/ai-employee/dev-ops/set-up-cloud-cost-alerts.md +34 -0
  53. package/dist/registry/stubs/jobs/ai-employee/dev-ops/setup-remote-hub.md +32 -0
  54. package/dist/registry/stubs/jobs/ai-employee/dev-ops/slo-design-and-implementation.md +34 -0
  55. package/dist/registry/stubs/jobs/ai-employee/engineering/application-replication-workflow.md +42 -0
  56. package/dist/registry/stubs/jobs/ai-employee/engineering/code-refactoring.md +35 -0
  57. package/dist/registry/stubs/jobs/ai-employee/engineering/codebase-analysis-and-ideation.md +32 -0
  58. package/dist/registry/stubs/jobs/ai-employee/engineering/create-architecture.md +35 -0
  59. package/dist/registry/stubs/jobs/ai-employee/engineering/data-pipeline-design.md +30 -0
  60. package/dist/registry/stubs/jobs/ai-employee/engineering/data-platform-architecture.md +29 -0
  61. package/dist/registry/stubs/jobs/ai-employee/engineering/data-quality-monitoring.md +29 -0
  62. package/dist/registry/stubs/jobs/ai-employee/engineering/database-schema-design.md +30 -0
  63. package/dist/registry/stubs/jobs/ai-employee/engineering/feature-implementation.md +39 -0
  64. package/dist/registry/stubs/jobs/ai-employee/engineering/github-org-setup.md +32 -0
  65. package/dist/registry/stubs/jobs/ai-employee/engineering/gitlabs-to-github.md +44 -0
  66. package/dist/registry/stubs/jobs/ai-employee/engineering/google-workspace-setup.md +34 -0
  67. package/dist/registry/stubs/jobs/ai-employee/engineering/issue-preparation.md +28 -0
  68. package/dist/registry/stubs/jobs/ai-employee/engineering/large-refactor-plan.md +36 -0
  69. package/dist/registry/stubs/jobs/ai-employee/engineering/mobile-app-development.md +43 -0
  70. package/dist/registry/stubs/jobs/ai-employee/engineering/mobile-app-rejection-response.md +34 -0
  71. package/dist/registry/stubs/jobs/ai-employee/engineering/mobile-app-submission.md +37 -0
  72. package/dist/registry/stubs/jobs/ai-employee/engineering/project-scaffolding.md +39 -0
  73. package/dist/registry/stubs/jobs/ai-employee/engineering/system-migration.md +41 -0
  74. package/dist/registry/stubs/jobs/ai-employee/engineering/technical-design.md +34 -0
  75. package/dist/registry/stubs/jobs/ai-employee/engineering/work-completion.md +29 -0
  76. package/dist/registry/stubs/jobs/ai-employee/engineering/write-dev-docs.md +32 -0
  77. package/dist/registry/stubs/jobs/ai-employee/executive-assistance/analyze-transcript.md +32 -0
  78. package/dist/registry/stubs/jobs/ai-employee/executive-assistance/calendar-triage.md +31 -0
  79. package/dist/registry/stubs/jobs/ai-employee/executive-assistance/chief-of-staff-briefing.md +31 -0
  80. package/dist/registry/stubs/jobs/ai-employee/executive-assistance/executive-assistant.md +31 -0
  81. package/dist/registry/stubs/jobs/ai-employee/executive-assistance/meeting-preparation.md +31 -0
  82. package/dist/registry/stubs/jobs/ai-employee/finance/business-banking-setup.md +29 -0
  83. package/dist/registry/stubs/jobs/ai-employee/finance/cloud-credits-application.md +34 -0
  84. package/dist/registry/stubs/jobs/ai-employee/finance/community-funding-preparation.md +34 -0
  85. package/dist/registry/stubs/jobs/ai-employee/finance/financial-analysis.md +33 -0
  86. package/dist/registry/stubs/jobs/ai-employee/finance/fpa-and-forecasting.md +33 -0
  87. package/dist/registry/stubs/jobs/ai-employee/finance/fundraising-prospect-discovery.md +33 -0
  88. package/dist/registry/stubs/jobs/ai-employee/finance/investor-pitch-preparation.md +40 -0
  89. package/dist/registry/stubs/jobs/ai-employee/finance/invoice-generation.md +35 -0
  90. package/dist/registry/stubs/jobs/ai-employee/finance/monthly-close-review.md +32 -0
  91. package/dist/registry/stubs/jobs/ai-employee/finance/review-funding-preparation.md +33 -0
  92. package/dist/registry/stubs/jobs/ai-employee/finance/tax-strategy-planning.md +33 -0
  93. package/dist/registry/stubs/jobs/ai-employee/fraim/adhoc-prompt.md +33 -0
  94. package/dist/registry/stubs/jobs/ai-employee/fraim/contribute-to-fraim.md +30 -0
  95. package/dist/registry/stubs/jobs/ai-employee/fraim/file-fraim-issue.md +29 -0
  96. package/dist/registry/stubs/jobs/ai-employee/fraim/organizational-learning-synthesis.md +40 -0
  97. package/dist/registry/stubs/jobs/ai-employee/fraim/praise-fraim.md +32 -0
  98. package/dist/registry/stubs/jobs/ai-employee/fraim/share-with-others.md +30 -0
  99. package/dist/registry/stubs/jobs/ai-employee/fraim/sleep-on-learnings.md +41 -0
  100. package/dist/registry/stubs/jobs/ai-employee/fraim/troubleshoot-fraim.md +29 -0
  101. package/dist/registry/stubs/jobs/ai-employee/fraim/video-demo-to-sop.md +35 -0
  102. package/dist/registry/stubs/jobs/ai-employee/go-to-market/ad-performance-analysis.md +32 -0
  103. package/dist/registry/stubs/jobs/ai-employee/go-to-market/aeo-strategy.md +31 -0
  104. package/dist/registry/stubs/jobs/ai-employee/go-to-market/analyze-revenue-system.md +35 -0
  105. package/dist/registry/stubs/jobs/ai-employee/go-to-market/build-gtm-motion.md +37 -0
  106. package/dist/registry/stubs/jobs/ai-employee/go-to-market/build-gtm-stack.md +36 -0
  107. package/dist/registry/stubs/jobs/ai-employee/go-to-market/design-gtm-system.md +34 -0
  108. package/dist/registry/stubs/jobs/ai-employee/go-to-market/developer-advocacy.md +33 -0
  109. package/dist/registry/stubs/jobs/ai-employee/go-to-market/domain-registration-research.md +33 -0
  110. package/dist/registry/stubs/jobs/ai-employee/go-to-market/evangelist-content-development.md +35 -0
  111. package/dist/registry/stubs/jobs/ai-employee/go-to-market/funnel-analysis.md +35 -0
  112. package/dist/registry/stubs/jobs/ai-employee/go-to-market/growth-loop-design.md +35 -0
  113. package/dist/registry/stubs/jobs/ai-employee/go-to-market/linkedin-carousel-from-deck.md +33 -0
  114. package/dist/registry/stubs/jobs/ai-employee/go-to-market/linkedin-company-page-setup.md +32 -0
  115. package/dist/registry/stubs/jobs/ai-employee/go-to-market/marketing-analytics-review.md +34 -0
  116. package/dist/registry/stubs/jobs/ai-employee/go-to-market/marketing-content-creation.md +31 -0
  117. package/dist/registry/stubs/jobs/ai-employee/go-to-market/marketing-strategy-definition.md +35 -0
  118. package/dist/registry/stubs/jobs/ai-employee/go-to-market/notebooklm-content-generation.md +39 -0
  119. package/dist/registry/stubs/jobs/ai-employee/go-to-market/paid-social-strategy.md +34 -0
  120. package/dist/registry/stubs/jobs/ai-employee/go-to-market/plan-gtm-team.md +33 -0
  121. package/dist/registry/stubs/jobs/ai-employee/go-to-market/ppc-campaign-management.md +35 -0
  122. package/dist/registry/stubs/jobs/ai-employee/go-to-market/product-launch-management.md +29 -0
  123. package/dist/registry/stubs/jobs/ai-employee/go-to-market/promo-video-creation.md +33 -0
  124. package/dist/registry/stubs/jobs/ai-employee/go-to-market/seo-strategy.md +34 -0
  125. package/dist/registry/stubs/jobs/ai-employee/go-to-market/social-engagement-campaign.md +31 -0
  126. package/dist/registry/stubs/jobs/ai-employee/go-to-market/thought-leadership-engagement.md +32 -0
  127. package/dist/registry/stubs/jobs/ai-employee/go-to-market/tracking-and-attribution-setup.md +35 -0
  128. package/dist/registry/stubs/jobs/ai-employee/go-to-market/x-account-setup.md +33 -0
  129. package/dist/registry/stubs/jobs/ai-employee/inclusion/ai-fluency-program-design.md +30 -0
  130. package/dist/registry/stubs/jobs/ai-employee/inclusion/ai-governance-for-inclusion.md +33 -0
  131. package/dist/registry/stubs/jobs/ai-employee/inclusion/dei-toolkit-creation.md +31 -0
  132. package/dist/registry/stubs/jobs/ai-employee/inclusion/equity-pattern-analysis.md +31 -0
  133. package/dist/registry/stubs/jobs/ai-employee/inclusion/erg-sop-modernization.md +32 -0
  134. package/dist/registry/stubs/jobs/ai-employee/inclusion/executive-order-dei-impact-analysis.md +33 -0
  135. package/dist/registry/stubs/jobs/ai-employee/inclusion/inclusion-ai-readiness-audit.md +37 -0
  136. package/dist/registry/stubs/jobs/ai-employee/legal/business-annual-report-filing.md +37 -0
  137. package/dist/registry/stubs/jobs/ai-employee/legal/business-tax-registration.md +31 -0
  138. package/dist/registry/stubs/jobs/ai-employee/legal/cap-table-construction.md +31 -0
  139. package/dist/registry/stubs/jobs/ai-employee/legal/contract-review-analysis.md +36 -0
  140. package/dist/registry/stubs/jobs/ai-employee/legal/ein-application.md +31 -0
  141. package/dist/registry/stubs/jobs/ai-employee/legal/employment-structure-decision.md +29 -0
  142. package/dist/registry/stubs/jobs/ai-employee/legal/entity-type-selection.md +31 -0
  143. package/dist/registry/stubs/jobs/ai-employee/legal/founder-and-equity-agreements.md +31 -0
  144. package/dist/registry/stubs/jobs/ai-employee/legal/ip-assignment-agreement-creation.md +29 -0
  145. package/dist/registry/stubs/jobs/ai-employee/legal/nda-creation.md +33 -0
  146. package/dist/registry/stubs/jobs/ai-employee/legal/provisional-patent-application-creation.md +34 -0
  147. package/dist/registry/stubs/jobs/ai-employee/legal/saas-contract-package-creation.md +34 -0
  148. package/dist/registry/stubs/jobs/ai-employee/legal/state-incorporation-filing.md +31 -0
  149. package/dist/registry/stubs/jobs/ai-employee/legal/trademark-registration-management.md +34 -0
  150. package/dist/registry/stubs/jobs/ai-employee/legal/w9-creation.md +37 -0
  151. package/dist/registry/stubs/jobs/ai-employee/management/evolve-employee.md +44 -0
  152. package/dist/registry/stubs/jobs/ai-employee/management/fully-delegate.md +37 -0
  153. package/dist/registry/stubs/jobs/ai-employee/management/generate-productivity-report.md +35 -0
  154. package/dist/registry/stubs/jobs/ai-employee/management/graduate-job.md +24 -0
  155. package/dist/registry/stubs/jobs/ai-employee/management/issue-retrospective.md +30 -0
  156. package/dist/registry/stubs/jobs/ai-employee/management/manager-agreements.md +33 -0
  157. package/dist/registry/stubs/jobs/ai-employee/management/organization-onboarding.md +33 -0
  158. package/dist/registry/stubs/jobs/ai-employee/management/project-onboarding.md +33 -0
  159. package/dist/registry/stubs/jobs/ai-employee/management/send-stakeholder-update.md +31 -0
  160. package/dist/registry/stubs/jobs/ai-employee/people-ops/benefits-analysis-and-enrollment.md +31 -0
  161. package/dist/registry/stubs/jobs/ai-employee/people-ops/hr-business-partner-advisory.md +31 -0
  162. package/dist/registry/stubs/jobs/ai-employee/people-ops/new-hire-onboarding.md +32 -0
  163. package/dist/registry/stubs/jobs/ai-employee/people-ops/payroll-coordination.md +31 -0
  164. package/dist/registry/stubs/jobs/ai-employee/people-ops/performance-review-preparation.md +31 -0
  165. package/dist/registry/stubs/jobs/ai-employee/procurement/equipment-acceptance-and-supplier-retrospective.md +32 -0
  166. package/dist/registry/stubs/jobs/ai-employee/procurement/procurement-intake-and-strategy.md +32 -0
  167. package/dist/registry/stubs/jobs/ai-employee/procurement/procurement-negotiation-prep.md +32 -0
  168. package/dist/registry/stubs/jobs/ai-employee/procurement/proposal-response-evaluation.md +33 -0
  169. package/dist/registry/stubs/jobs/ai-employee/procurement/purchase-approval-and-po-package.md +32 -0
  170. package/dist/registry/stubs/jobs/ai-employee/procurement/rfp-response-preparation.md +30 -0
  171. package/dist/registry/stubs/jobs/ai-employee/procurement/rfx-package-authoring.md +32 -0
  172. package/dist/registry/stubs/jobs/ai-employee/procurement/supplier-discovery-and-qualification.md +32 -0
  173. package/dist/registry/stubs/jobs/ai-employee/procurement/supplier-performance-review.md +32 -0
  174. package/dist/registry/stubs/jobs/ai-employee/product/customer-prospect-discovery.md +42 -0
  175. package/dist/registry/stubs/jobs/ai-employee/product/experiment-tracking.md +30 -0
  176. package/dist/registry/stubs/jobs/ai-employee/product/feature-specification.md +33 -0
  177. package/dist/registry/stubs/jobs/ai-employee/product/independent-implementation-review.md +34 -0
  178. package/dist/registry/stubs/jobs/ai-employee/product/interview-preparation.md +34 -0
  179. package/dist/registry/stubs/jobs/ai-employee/product/mvp-validation-plan.md +30 -0
  180. package/dist/registry/stubs/jobs/ai-employee/product/participant-recruitment.md +38 -0
  181. package/dist/registry/stubs/jobs/ai-employee/product/process-interview-notes.md +42 -0
  182. package/dist/registry/stubs/jobs/ai-employee/product/review-customer-development.md +38 -0
  183. package/dist/registry/stubs/jobs/ai-employee/product/send-newsletter.md +30 -0
  184. package/dist/registry/stubs/jobs/ai-employee/product/send-thank-you-notes.md +30 -0
  185. package/dist/registry/stubs/jobs/ai-employee/product/triage-customer-needs.md +35 -0
  186. package/dist/registry/stubs/jobs/ai-employee/project-management/cross-functional-dependency-management.md +31 -0
  187. package/dist/registry/stubs/jobs/ai-employee/project-management/delivery-governance-review.md +30 -0
  188. package/dist/registry/stubs/jobs/ai-employee/project-management/operational-reporting.md +37 -0
  189. package/dist/registry/stubs/jobs/ai-employee/project-management/project-plan-creation.md +31 -0
  190. package/dist/registry/stubs/jobs/ai-employee/project-management/scrum-sprint-planning.md +33 -0
  191. package/dist/registry/stubs/jobs/ai-employee/project-management/sprint-planning.md +33 -0
  192. package/dist/registry/stubs/jobs/ai-employee/quality-assurance/accessibility-audit.md +33 -0
  193. package/dist/registry/stubs/jobs/ai-employee/quality-assurance/api-testing.md +34 -0
  194. package/dist/registry/stubs/jobs/ai-employee/quality-assurance/codebase-quality-assessment.md +37 -0
  195. package/dist/registry/stubs/jobs/ai-employee/quality-assurance/iterative-quality-improvement.md +37 -0
  196. package/dist/registry/stubs/jobs/ai-employee/quality-assurance/mutation-testing.md +30 -0
  197. package/dist/registry/stubs/jobs/ai-employee/quality-assurance/performance-quality-assessment.md +38 -0
  198. package/dist/registry/stubs/jobs/ai-employee/quality-assurance/stress-test-app-under-load.md +34 -0
  199. package/dist/registry/stubs/jobs/ai-employee/quality-assurance/test-authoring.md +31 -0
  200. package/dist/registry/stubs/jobs/ai-employee/quality-assurance/test-quality-assessment.md +34 -0
  201. package/dist/registry/stubs/jobs/ai-employee/quality-assurance/ui-polish-validation.md +45 -0
  202. package/dist/registry/stubs/jobs/ai-employee/quality-assurance/user-testing-and-bug-bash.md +32 -0
  203. package/dist/registry/stubs/jobs/ai-employee/recruiting/candidate-pipeline-management.md +34 -0
  204. package/dist/registry/stubs/jobs/ai-employee/recruiting/candidate-sourcing-and-ranking.md +35 -0
  205. package/dist/registry/stubs/jobs/ai-employee/recruiting/interview-coordination.md +34 -0
  206. package/dist/registry/stubs/jobs/ai-employee/recruiting/job-posting-and-sourcing.md +32 -0
  207. package/dist/registry/stubs/jobs/ai-employee/recruiting/offer-and-close-management.md +35 -0
  208. package/dist/registry/stubs/jobs/ai-employee/recruiting/role-intake-and-scorecard.md +33 -0
  209. package/dist/registry/stubs/jobs/ai-employee/recruiting/sourcing-funnel-recap.md +35 -0
  210. package/dist/registry/stubs/jobs/ai-employee/sales/account-strategy.md +34 -0
  211. package/dist/registry/stubs/jobs/ai-employee/sales/crm-pipeline-review.md +30 -0
  212. package/dist/registry/stubs/jobs/ai-employee/sales/deal-strategy.md +32 -0
  213. package/dist/registry/stubs/jobs/ai-employee/sales/outbound-sales-strategy.md +34 -0
  214. package/dist/registry/stubs/jobs/ai-employee/sales/proposal-development.md +31 -0
  215. package/dist/registry/stubs/jobs/ai-employee/sales/sales-coaching.md +33 -0
  216. package/dist/registry/stubs/jobs/ai-employee/sales/sales-discovery-preparation.md +33 -0
  217. package/dist/registry/stubs/jobs/ai-employee/salesforce/sf-build-automation.md +34 -0
  218. package/dist/registry/stubs/jobs/ai-employee/salesforce/sf-build-dashboard.md +35 -0
  219. package/dist/registry/stubs/jobs/ai-employee/salesforce/sf-config-deployment.md +35 -0
  220. package/dist/registry/stubs/jobs/ai-employee/salesforce/sf-data-management.md +34 -0
  221. package/dist/registry/stubs/jobs/ai-employee/salesforce/sf-org-health-check.md +38 -0
  222. package/dist/registry/stubs/jobs/ai-employee/salesforce/sf-user-and-access-management.md +35 -0
  223. package/dist/registry/stubs/jobs/ai-employee/security/compliance-continuous-monitoring.md +31 -0
  224. package/dist/registry/stubs/jobs/ai-employee/security/compliance-policy-authoring.md +31 -0
  225. package/dist/registry/stubs/jobs/ai-employee/security/compliance-questionnaire-response.md +32 -0
  226. package/dist/registry/stubs/jobs/ai-employee/security/compliance-requirements-detection.md +30 -0
  227. package/dist/registry/stubs/jobs/ai-employee/security/compliance-review.md +34 -0
  228. package/dist/registry/stubs/jobs/ai-employee/security/generate-audit-evidence.md +34 -0
  229. package/dist/registry/stubs/jobs/ai-employee/security/regulation-evidence-management.md +33 -0
  230. package/dist/registry/stubs/jobs/ai-employee/security/security-baseline-setup.md +32 -0
  231. package/dist/registry/stubs/jobs/ai-employee/security/security-review.md +32 -0
  232. package/dist/registry/stubs/jobs/ai-employee/security/soc2-evidence-management.md +32 -0
  233. package/dist/registry/stubs/jobs/ai-employee/security/vulnerability-triage-and-remediation.md +33 -0
  234. package/dist/registry/stubs/jobs/ai-employee/strategy/advisor-interview.md +29 -0
  235. package/dist/registry/stubs/jobs/ai-employee/strategy/advisory-board-development.md +31 -0
  236. package/dist/registry/stubs/jobs/ai-employee/strategy/advisory-board-selection.md +29 -0
  237. package/dist/registry/stubs/jobs/ai-employee/strategy/blue-sky-brainstorming.md +33 -0
  238. package/dist/registry/stubs/jobs/ai-employee/strategy/business-idea-validation-and-scoping.md +44 -0
  239. package/dist/registry/stubs/jobs/ai-employee/strategy/business-plan-creation.md +38 -0
  240. package/dist/registry/stubs/jobs/ai-employee/strategy/competitive-analysis.md +36 -0
  241. package/dist/registry/stubs/jobs/ai-employee/strategy/founder-market-fit-analysis.md +40 -0
  242. package/dist/registry/stubs/jobs/ai-employee/strategy/pricing-strategy-definition.md +40 -0
  243. package/dist/registry/stubs/jobs/ai-employee/strategy/problem-statement-crystallization.md +37 -0
  244. package/dist/registry/stubs/jobs/ai-employee/strategy/review-business-strategy.md +37 -0
  245. package/dist/registry/stubs/jobs/ai-employee/travel/travel-disruption-rebooking.md +33 -0
  246. package/dist/registry/stubs/jobs/ai-employee/travel/travel-fare-watch.md +33 -0
  247. package/dist/registry/stubs/jobs/ai-employee/travel/travel-planning.md +32 -0
  248. package/dist/registry/stubs/jobs/ai-manager/fraim/instruction-hygiene-review.md +34 -0
  249. package/dist/registry/stubs/jobs/ai-manager/management/analyze-why-you-messed-up.md +29 -0
  250. package/dist/registry/stubs/jobs/ai-manager/management/author-project-rules.md +31 -0
  251. package/dist/registry/stubs/jobs/ai-manager/management/create-clarity.md +30 -0
  252. package/dist/registry/stubs/jobs/ai-manager/management/explain-it.md +30 -0
  253. package/dist/registry/stubs/jobs/ai-manager/management/follow-your-mentor.md +29 -0
  254. package/dist/registry/stubs/jobs/ai-manager/management/hire-right-ai-for-the-job.md +29 -0
  255. package/dist/registry/stubs/jobs/ai-manager/management/hire-the-right-human-ai-manager.md +29 -0
  256. package/dist/registry/stubs/jobs/ai-manager/management/how-should-i-verify.md +32 -0
  257. package/dist/registry/stubs/jobs/ai-manager/management/need-pov.md +30 -0
  258. package/dist/registry/stubs/jobs/ai-manager/management/recognize-good-work.md +29 -0
  259. package/dist/registry/stubs/jobs/ai-manager/management/refine-core-values.md +29 -0
  260. package/dist/registry/stubs/jobs/ai-manager/management/shape-team.md +30 -0
  261. package/dist/registry/stubs/jobs/ai-manager/management/strong-pov.md +30 -0
  262. package/dist/registry/stubs/jobs/ai-manager/management/weak-pov.md +30 -0
  263. package/dist/registry/stubs/jobs/ai-manager/management/what-should-i-review.md +34 -0
  264. package/dist/src/cli/utils/remote-sync.js +0 -7
  265. package/dist/src/cli/utils/script-sync-utils.js +0 -4
  266. package/dist/src/config/learning-domains.js +12 -19
  267. package/dist/src/core/ai-mentor.js +2 -2
  268. package/dist/src/core/utils/domain-rule-assembler.js +78 -153
  269. package/dist/src/core/utils/include-resolver.js +25 -47
  270. package/dist/src/core/utils/local-registry-resolver.js +0 -51
  271. package/dist/src/local-mcp-server/learning-context-builder.js +36 -33
  272. package/dist/src/local-mcp-server/stdio-server.js +27 -59
  273. package/dist/src/services/mcp-service.js +15 -15
  274. package/dist/src/services/registry-service.js +0 -4
  275. package/package.json +3 -3
  276. package/dist/registry/domains.json +0 -159
  277. package/dist/registry/scripts/domains/catalog.js +0 -112
@@ -2,9 +2,10 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.withRuleDeliveryTimeout = withRuleDeliveryTimeout;
4
4
  exports.assembleDomainRules = assembleDomainRules;
5
- exports.attachRuleAssembly = attachRuleAssembly;
5
+ exports.appendRuleInstructions = appendRuleInstructions;
6
6
  const crypto_1 = require("crypto");
7
- const catalog_1 = require("../../../registry/scripts/domains/catalog");
7
+ const folders_1 = require("../../../registry/scripts/domains/folders");
8
+ const include_resolver_1 = require("./include-resolver");
8
9
  const inheritance_parser_1 = require("./inheritance-parser");
9
10
  class RuleFetchTimeout extends Error {
10
11
  }
@@ -31,176 +32,100 @@ async function withRuleDeliveryTimeout(operation, timeoutMs = 5000) {
31
32
  async function assembleDomainRules(options) {
32
33
  const timeoutMs = Math.max(1, Math.min(options.timeoutMs ?? 5000, 30000));
33
34
  const metadata = {
34
- domain: options.jobPath ? null : 'global', catalogVersion: null,
35
+ domain: options.jobPath ? (0, folders_1.jobDomainFromRegistryPath)(options.jobPath) : 'global',
35
36
  selection: options.jobPath ? 'unknown' : 'connect', artifacts: [], warnings: [], complete: false,
36
37
  };
37
38
  const warn = (code, path, message, source) => {
38
39
  metadata.warnings.push({ code, path, ...(options.jobPath ? { jobPath: options.jobPath } : {}),
39
40
  domain: metadata.domain, message,
40
41
  ...(source ? { source: source.scope ?? source.source, hash: (0, crypto_1.createHash)('sha256').update(source.content).digest('hex') } : {}),
41
- recovery: `Restore or sync ${path} in its effective source, then refresh the current job instructions. Record this incident and its recovery in bound job evidence.`,
42
- resolved: false });
42
+ recovery: `Restore or sync ${path} in its effective source, then refresh the current job instructions. Record this incident and its recovery in bound job evidence.` });
43
43
  };
44
- let paths = ['rules/constitution.md'];
45
- // Connect has no job/domain selection. Its fixed constitution must not wait
46
- // on an unrelated catalog read (or report a catalog failure as missing policy).
44
+ const paths = options.jobPath ? [...folders_1.GLOBAL_RULE_PATHS] : ['rules/constitution.md'];
47
45
  if (options.jobPath) {
48
- try {
49
- const resolved = await withRuleDeliveryTimeout(options.resolveFile('domains.json'), timeoutMs);
50
- const value = JSON.parse(resolved.content);
51
- if (!value || typeof value !== 'object' || value.schemaVersion !== 2
52
- || !value.domains || typeof value.domains !== 'object'
53
- || Array.isArray(value.domains))
54
- throw new Error('Invalid domain catalog');
55
- const catalog = value;
56
- metadata.catalogVersion = Number.isInteger(catalog.mapVersion) && catalog.mapVersion >= 3 ? catalog.mapVersion : null;
57
- Object.assign(metadata, (0, catalog_1.selectCatalogDomain)(catalog, options.jobPath));
58
- if ((0, catalog_1.validateDomainCatalog)(value).length)
59
- warn('CATALOG_INVALID', 'domains.json', 'Some domain configuration is invalid; retain the constitution and available safe rule paths.', resolved);
60
- for (const warning of resolved.resolutionWarnings ?? [])
61
- warn('CATALOG_SOURCE_FALLBACK', 'domains.json', warning, resolved);
62
- for (const domain of new Set(options.jobPath ? ['global', ...(metadata.domain ? [metadata.domain] : [])] : [])) {
63
- const rules = catalog.domains[domain]?.rules;
64
- if (Array.isArray(rules))
65
- paths.push(...rules.filter(path => (0, catalog_1.isSafeRegistryPath)(path, 'rules')));
66
- }
67
- if (metadata.selection === 'unknown')
68
- warn('DOMAIN_UNKNOWN', 'domains.json', 'The job folder has no configured domain; configure rules for that folder in domains.json.');
69
- }
70
- catch (error) {
71
- warn(error instanceof RuleFetchTimeout ? 'CATALOG_FETCH_TIMEOUT' : 'CATALOG_UNAVAILABLE', 'domains.json', 'The effective domain catalog is unavailable or invalid; independently load the constitution.');
46
+ if (metadata.domain) {
47
+ metadata.selection = 'mapped';
48
+ paths.push((0, folders_1.domainRulePath)(metadata.domain));
72
49
  }
50
+ else
51
+ warn('DOMAIN_UNKNOWN', options.jobPath, 'The job must live in a domain folder.');
73
52
  }
74
- const resolveRule = async (path, ancestors = [], rootPath = path, deadline = Date.now() + timeoutMs) => {
75
- if (!(0, catalog_1.isSafeRegistryPath)(path, 'rules') || ancestors.includes(path) || ancestors.length >= 10)
76
- throw new RuleSourceFault(path);
77
- let resolved;
78
- try {
79
- resolved = await withRuleDeliveryTimeout(options.resolveFile(path), Math.max(1, deadline - Date.now()));
80
- }
81
- catch (error) {
82
- if (error instanceof RuleFetchTimeout)
83
- throw error;
84
- throw new RuleSourceFault(path);
85
- }
86
- if (!resolved.content.trim())
87
- throw new RuleSourceFault(path, resolved);
88
- if (resolved.content.includes('\u0000') || resolved.content.includes('\ufffd'))
89
- throw new RuleSourceFault(path, resolved);
90
- const frontmatter = resolved.content.match(/^---\r?\n([\s\S]+?)\r?\n---/);
91
- if (frontmatter?.[1].trim().startsWith('{')) {
92
- try {
93
- JSON.parse(frontmatter[1]);
94
- }
95
- catch {
96
- throw new RuleSourceFault(path, resolved);
97
- }
98
- }
99
- if (new inheritance_parser_1.InheritanceParser().parse(resolved.content).hasImports)
100
- throw new RuleSourceFault(path, resolved);
101
- const includes = [...resolved.content.matchAll(/\{\{\s*include:\s*([^}]+)\}\}/g)];
102
- // Reject malformed directives before traversing or certifying this source's
103
- // children. Its caller can then retain valid sibling fragments independently.
104
- const literalContent = resolved.content.replace(/\{\{\s*include:\s*([^}]+)\}\}/g, '');
105
- if (includes.some(match => !match[1].trim()) || /\{\{\s*(?:include|import)\s*:/.test(literalContent)) {
106
- throw new RuleSourceFault(path, resolved);
107
- }
108
- if (!includes.length)
109
- return resolved;
110
- const expanded = await Promise.all(includes.map(async (match) => {
111
- const childPath = match[1].trim();
112
- try {
113
- const child = await resolveRule(childPath, [...ancestors, path], rootPath, deadline);
114
- (metadata.includedArtifacts ??= []).push({ path: childPath, source: child.source,
115
- ...(child.scope ? { scope: child.scope } : {}), inherited: child.inherited,
116
- hash: (0, crypto_1.createHash)('sha256').update(child.content).digest('hex') });
117
- for (const warning of child.resolutionWarnings ?? []) {
118
- warn('RULE_SOURCE_FALLBACK', childPath, warning, child);
119
- metadata.warnings[metadata.warnings.length - 1].affectedPath = rootPath;
53
+ const results = await Promise.all([...new Set(paths)].map(async (rootPath) => {
54
+ const sources = new Map();
55
+ const deadline = Date.now() + timeoutMs;
56
+ const reader = {
57
+ getJob: async () => null,
58
+ listItems: async () => [],
59
+ getFile: async (path) => {
60
+ if (!(0, folders_1.isSafeRegistryPath)(path, 'rules'))
61
+ throw new RuleSourceFault(path);
62
+ let resolved;
63
+ try {
64
+ resolved = await withRuleDeliveryTimeout(options.resolveFile(path), Math.max(1, deadline - Date.now()));
65
+ }
66
+ catch (error) {
67
+ if (error instanceof RuleFetchTimeout)
68
+ throw error;
69
+ throw new RuleSourceFault(path);
70
+ }
71
+ sources.set(path, resolved);
72
+ const content = resolved.content;
73
+ if (!content.trim() || content.includes('\u0000') || content.includes('\ufffd'))
74
+ throw new RuleSourceFault(path, resolved);
75
+ const frontmatter = content.match(/^---\r?\n([\s\S]+?)\r?\n---/);
76
+ if (frontmatter?.[1].trim().startsWith('{')) {
77
+ try {
78
+ JSON.parse(frontmatter[1]);
79
+ }
80
+ catch {
81
+ throw new RuleSourceFault(path, resolved);
82
+ }
120
83
  }
121
- return child.content;
84
+ const directives = [...content.matchAll(/\{\{\s*include:\s*([^}]+)\}\}/g)];
85
+ const remaining = content.replace(/\{\{\s*include:\s*([^}]+)\}\}/g, '');
86
+ if (new inheritance_parser_1.InheritanceParser().parse(content).hasImports || directives.some(match => !match[1].trim()) || /\{\{\s*(?:include|import)\s*:/.test(remaining))
87
+ throw new RuleSourceFault(path, resolved);
88
+ return content;
122
89
  }
123
- catch (error) {
90
+ };
91
+ const content = await (0, include_resolver_1.resolveIncludes)('{{include:' + rootPath + '}}', reader, undefined, undefined, {
92
+ onResolved: (path, content) => {
93
+ const source = sources.get(path);
94
+ if (!content.trim())
95
+ throw new RuleSourceFault(path, source);
96
+ const artifact = { path, source: source.source, ...(source.scope ? { scope: source.scope } : {}), inherited: source.inherited,
97
+ hash: (0, crypto_1.createHash)('sha256').update(content).digest('hex') };
98
+ if (path === rootPath)
99
+ metadata.artifacts.push(artifact);
100
+ else
101
+ (metadata.includedArtifacts ??= []).push(artifact);
102
+ for (const warning of source.resolutionWarnings ?? []) {
103
+ warn('RULE_SOURCE_FALLBACK', path, warning, source);
104
+ if (path !== rootPath)
105
+ metadata.warnings[metadata.warnings.length - 1].affectedPath = rootPath;
106
+ }
107
+ },
108
+ onError: (path, error) => {
124
109
  const fault = error instanceof RuleSourceFault ? error : undefined;
125
- warn(error instanceof RuleFetchTimeout ? 'RULE_FETCH_TIMEOUT' : 'RULE_UNAVAILABLE', fault?.path ?? childPath, 'Included rule source is missing, empty, invalid, cyclic or unavailable; available sibling guidance remains in force.', fault?.resolved);
126
- metadata.warnings[metadata.warnings.length - 1].affectedPath = rootPath;
110
+ warn(error instanceof RuleFetchTimeout ? 'RULE_FETCH_TIMEOUT' : 'RULE_UNAVAILABLE', fault?.path ?? path, 'Rule source is missing, empty, invalid, cyclic or unavailable; other available rules remain in force.', fault?.resolved);
111
+ if (path !== rootPath)
112
+ metadata.warnings[metadata.warnings.length - 1].affectedPath = rootPath;
127
113
  return '';
128
114
  }
129
- }));
130
- let index = 0;
131
- const content = resolved.content.replace(/\{\{\s*include:\s*([^}]+)\}\}/g, () => expanded[index++]);
132
- if (!content.trim())
133
- throw new RuleSourceFault(path, resolved);
134
- return { ...resolved, content };
135
- };
136
- const results = await Promise.all([...new Set(paths)].map(async (path) => {
137
- let resolved;
138
- try {
139
- resolved = await resolveRule(path);
140
- if (/\{\{\s*(?:include|import)\s*:/.test(resolved.content)) {
141
- throw new Error('Unresolved rule source');
142
- }
143
- return { path, resolved };
144
- }
145
- catch (error) {
146
- return { path, error, resolved };
147
- }
115
+ });
116
+ return { path: rootPath, content };
148
117
  }));
149
118
  const bodies = [];
150
- for (const result of results) {
151
- if ('error' in result) {
152
- const fault = result.error instanceof RuleSourceFault ? result.error : undefined;
153
- warn(result.error instanceof RuleFetchTimeout ? 'RULE_FETCH_TIMEOUT' : 'RULE_UNAVAILABLE', fault?.path ?? result.path, 'Rule source is missing, empty, invalid, cyclic or unavailable; other available rules remain in force.', fault?.resolved ?? result.resolved);
154
- if (fault && fault.path !== result.path)
155
- metadata.warnings[metadata.warnings.length - 1].affectedPath = result.path;
156
- continue;
157
- }
158
- const resolved = result.resolved;
159
- metadata.artifacts.push({ path: result.path, source: resolved.source, ...(resolved.scope ? { scope: resolved.scope } : {}),
160
- inherited: resolved.inherited, hash: (0, crypto_1.createHash)('sha256').update(resolved.content).digest('hex') });
161
- for (const warning of resolved.resolutionWarnings ?? [])
162
- warn('RULE_SOURCE_FALLBACK', result.path, warning, resolved);
163
- bodies.push(`### ${result.path}\n\n${resolved.content}`);
164
- }
119
+ for (const result of results)
120
+ if (result.content.trim())
121
+ bodies.push(`### ${result.path}\n\n${result.content}`);
122
+ // Keep the global/domain order stable even when independent reads finish out of order.
123
+ metadata.artifacts.sort((a, b) => paths.indexOf(a.path) - paths.indexOf(b.path));
165
124
  metadata.complete = metadata.warnings.length === 0;
166
125
  const warnings = metadata.warnings.map(warning => `- ${warning.code}: ${warning.message} ${warning.recovery}`);
167
126
  return { text: ['## Applicable rules', ...bodies, ...(warnings.length ? ['### Rule delivery warnings', ...warnings] : [])].join('\n\n'), metadata };
168
127
  }
169
- /** Replace only the advertised rule block; keep phase content and warning history. */
170
- function attachRuleAssembly(response, assembly) {
171
- const content = [...(response.content ?? [])];
172
- const previous = response.structuredContent?.ruleAssembly;
173
- const warnings = [...assembly.metadata.warnings];
174
- const incidentKey = (warning) => `${warning.code}:${warning.path}:${warning.hash ?? ''}`;
175
- const priorWarnings = Array.isArray(previous?.warnings) ? previous.warnings : [];
176
- const validWarning = (warning) => !!warning && typeof warning === 'object'
177
- && ['code', 'path', 'message', 'recovery'].every(key => typeof warning[key] === 'string')
178
- && typeof warning.resolved === 'boolean';
179
- if (previous && (!Array.isArray(previous.warnings) || priorWarnings.some(warning => !validWarning(warning)))) {
180
- warnings.push({ code: 'ASSEMBLY_METADATA_INVALID', path: 'ruleAssembly.warnings', domain: assembly.metadata.domain,
181
- message: 'Prior rule delivery incident metadata is invalid; available rules remain in force.',
182
- recovery: 'Refresh the current instructions and retain the invalid delivery incident in bound job evidence.', resolved: false });
183
- }
184
- for (const prior of priorWarnings.filter(validWarning)) {
185
- if (warnings.some(warning => incidentKey(warning) === incidentKey(prior)))
186
- continue;
187
- const recovered = prior.path === 'domains.json'
188
- ? assembly.metadata.catalogVersion !== null && assembly.metadata.selection !== 'unknown'
189
- && !assembly.metadata.warnings.some(warning => warning.path === prior.path)
190
- : (prior.affectedPath
191
- ? assembly.metadata.artifacts.some(artifact => artifact.path === prior.affectedPath)
192
- && (assembly.metadata.includedArtifacts ?? []).some(artifact => artifact.path === prior.path)
193
- : assembly.metadata.artifacts.some(artifact => artifact.path === prior.path))
194
- && !assembly.metadata.warnings.some(warning => warning.path === prior.path);
195
- warnings.push({ ...prior, resolved: prior.resolved || recovered });
196
- }
197
- const previousIndex = previous?.contentBlockIndex;
198
- const index = Number.isInteger(previousIndex) && previousIndex >= 0 && previousIndex < content.length ? previousIndex : content.length;
199
- const retained = warnings.filter(warning => !assembly.metadata.warnings.includes(warning));
200
- const history = retained.length ? '\n\n### Prior rule delivery incidents\n' + retained.map(warning => `- ${warning.code} (${warning.resolved ? 'recovered' : 'unresolved'}): ${warning.path}. ${warning.recovery}`).join('\n') : '';
201
- content[index] = { type: 'text', text: assembly.text + history };
202
- return { ...response, content, structuredContent: { ...response.structuredContent,
203
- ruleAssembly: { ...assembly.metadata, warnings,
204
- complete: assembly.metadata.complete && warnings.every(warning => warning.resolved),
205
- contentBlockIndex: index } } };
128
+ /** Deliver instructions as text; assembly diagnostics stay with the caller. */
129
+ function appendRuleInstructions(response, assembly) {
130
+ return { ...response, content: [...(response.content ?? []), { type: 'text', text: assembly.text }] };
206
131
  }
@@ -46,60 +46,38 @@ function resolveIncludesWithIndex(content, fileIndex) {
46
46
  }
47
47
  return result;
48
48
  }
49
- /**
50
- * Asynchronously resolve {{include:path}} directives in content using a RegistryResolver.
51
- *
52
- * @param content - Raw content that may contain {{include:path}} directives
53
- * @param resolver - RegistryResolver instance
54
- * @param basePath - Path of the current file, used to resolve relative ./ includes
55
- * @param dedup - Optional session-level dedup hook (issue #801)
56
- * @returns Content with all resolvable includes inlined
57
- */
58
- async function resolveIncludes(content, resolver, basePath, dedup) {
59
- let result = content;
60
- let pass = 0;
61
- while (result.includes('{{include:') && pass < exports.MAX_INCLUDE_PASSES) {
62
- // Collect all unique includes in this pass
63
- const matches = result.match(/\{\{include:([^}]+)\}\}/g);
64
- if (!matches)
65
- break;
66
- const uniqueMatches = Array.from(new Set(matches));
67
- for (const match of uniqueMatches) {
68
- const filePath = match.match(/\{\{include:([^}]+)\}\}/)[1].trim();
69
- let targetPath = filePath;
70
- if (filePath.startsWith('./') && basePath) {
71
- // Resolve relative to the directory of the current file
72
- const dir = basePath.includes('/') ? basePath.substring(0, basePath.lastIndexOf('/')) : '';
73
- targetPath = dir ? `${dir}/${filePath.substring(2)}` : filePath.substring(2);
74
- }
75
- // Session-level dedup (issue #801): if this target's full content was
76
- // already emitted earlier in the session, substitute a backreference
77
- // rather than fetching and inlining it again.
78
- if (dedup && dedup.isAlreadyEmitted(targetPath)) {
49
+ async function resolveIncludes(content, resolver, basePath, dedup, options = {}) {
50
+ const expand = async (body, base, ancestors) => {
51
+ const pattern = /\{\{\s*include:\s*([^}]+)\}\}/g;
52
+ const matches = [...new Set(body.match(pattern) ?? [])];
53
+ let result = body;
54
+ for (const match of matches) {
55
+ const filePath = match.match(/\{\{\s*include:\s*([^}]+)\}\}/)[1].trim();
56
+ const dir = base?.includes('/') ? base.substring(0, base.lastIndexOf('/')) : '';
57
+ const targetPath = filePath.startsWith('./') ? (dir ? dir + '/' : '') + filePath.substring(2) : filePath;
58
+ if (dedup?.isAlreadyEmitted(targetPath)) {
79
59
  result = result.split(match).join(dedup.backreference(targetPath));
80
60
  continue;
81
61
  }
82
62
  try {
63
+ if (ancestors.includes(targetPath) || ancestors.length >= exports.MAX_INCLUDE_PASSES)
64
+ throw new Error('Cyclic include or maximum include depth exceeded');
83
65
  const fileContent = await resolver.getFile(targetPath);
84
- if (fileContent !== null) {
85
- // Recursively resolve includes in the newly fetched content
86
- const resolvedContent = await resolveIncludes(fileContent, resolver, targetPath, dedup);
87
- // Replace all occurrences of this specific include
88
- result = result.split(match).join(resolvedContent);
89
- // Mark as emitted only after a successful full inline, so a failed
90
- // fetch never causes a later occurrence to be silently backreferenced.
91
- if (dedup)
92
- dedup.recordEmitted(targetPath);
93
- }
94
- else {
95
- console.warn(`⚠️ Include file not found via resolver: ${targetPath} (original: ${filePath}, base: ${basePath})`);
96
- }
66
+ if (fileContent === null)
67
+ throw new Error('Include file unavailable: ' + targetPath);
68
+ const resolvedContent = await expand(fileContent, targetPath, [...ancestors, targetPath]);
69
+ options.onResolved?.(targetPath, resolvedContent);
70
+ result = result.split(match).join(resolvedContent);
71
+ dedup?.recordEmitted(targetPath);
97
72
  }
98
73
  catch (error) {
99
- console.error(`❌ Failed to resolve include via resolver: ${targetPath}`, error);
74
+ if (options.onError)
75
+ result = result.split(match).join(options.onError(targetPath, error));
76
+ else
77
+ console.warn('Failed to resolve include ' + targetPath + ': ' + String(error));
100
78
  }
101
79
  }
102
- pass++;
103
- }
104
- return result;
80
+ return result;
81
+ };
82
+ return expand(content, basePath, basePath ? [basePath] : []);
105
83
  }
@@ -46,7 +46,6 @@ const path_1 = require("path");
46
46
  const inheritance_parser_1 = require("./inheritance-parser");
47
47
  const job_parser_1 = require("./job-parser");
48
48
  const project_fraim_paths_1 = require("./project-fraim-paths");
49
- const catalog_1 = require("../../../registry/scripts/domains/catalog");
50
49
  class LocalRegistryResolver {
51
50
  constructor(options) {
52
51
  this.workspaceRoot = options.workspaceRoot;
@@ -201,13 +200,6 @@ class LocalRegistryResolver {
201
200
  const normalizedPath = path.replace(/\\/g, '/').replace(/^\/+/, '');
202
201
  const parts = normalizedPath.split('/');
203
202
  const type = parts[0];
204
- if (normalizedPath === 'domains.json') {
205
- if (this.effectiveFraimDir)
206
- return (0, path_1.join)(this.effectiveFraimDir, 'domains.json');
207
- const machineCatalog = (0, path_1.join)((0, project_fraim_paths_1.getUserFraimDirPath)(), 'domains.json');
208
- this.onLocalDependency?.(machineCatalog, 'file');
209
- return (0, fs_1.existsSync)(machineCatalog) ? machineCatalog : this.getFraimPath('domains.json');
210
- }
211
203
  if (type === 'jobs' || type === 'workflows') {
212
204
  if (parts.length >= 3 && (parts[1] === 'ai-employee' || parts[1] === 'ai-manager')) {
213
205
  return (0, path_1.join)(this.getSyncedCatalogRoot(parts[1], type), ...parts.slice(2));
@@ -546,47 +538,6 @@ class LocalRegistryResolver {
546
538
  * @param path - Registry path (e.g., "workflows/product-building/spec.md")
547
539
  * @returns Resolved file with metadata
548
540
  */
549
- async resolveDomainCatalog() {
550
- const path = 'domains.json';
551
- const localBaseline = this.readSyncedLocalFile(path) ?? this.readWorkspaceRegistryFile(path);
552
- let content = localBaseline ?? await this.fetchRemoteWithFallback(path);
553
- let source = localBaseline === null ? 'remote' : 'local';
554
- let scope;
555
- let catalog = JSON.parse(content);
556
- const resolutionWarnings = [];
557
- let projectContent = null;
558
- if (this.hasLocalOverride(path)) {
559
- try {
560
- const candidate = this.readLocalOverride(path);
561
- if (!this.shouldFilter || !this.shouldFilter(candidate))
562
- projectContent = candidate;
563
- }
564
- catch {
565
- resolutionWarnings.push('Project domain configuration could not be read; available earlier configuration retained.');
566
- }
567
- }
568
- const layers = [
569
- { content: this.readOrgOverlayFile(path, resolutionWarnings), scope: 'org' },
570
- { content: this.readManagerOverlayFile(path, resolutionWarnings), scope: 'manager' },
571
- ...(this.managerLocalRoot !== this.managerCacheRoot ? [{ content: this.readManagerLocalOverlayFile(path, resolutionWarnings), scope: 'manager' }] : []),
572
- { content: projectContent, scope: 'project' },
573
- ];
574
- for (const layer of layers) {
575
- if (layer.content === null)
576
- continue;
577
- try {
578
- catalog = (0, catalog_1.mergeDomainCatalog)(catalog, JSON.parse(layer.content));
579
- }
580
- catch {
581
- resolutionWarnings.push('Invalid ' + layer.scope + ' domain configuration; available earlier configuration retained.');
582
- continue;
583
- }
584
- content = JSON.stringify(catalog);
585
- source = 'local';
586
- scope = layer.scope;
587
- }
588
- return { content, source, ...(scope ? { scope } : {}), personalized: !!scope, inherited: !!scope, ...(resolutionWarnings.length ? { resolutionWarnings } : {}) };
589
- }
590
541
  assertDependenciesObserved() {
591
542
  if (this.dependencyFailure)
592
543
  throw this.dependencyFailure.error;
@@ -606,8 +557,6 @@ class LocalRegistryResolver {
606
557
  return warnings.length ? { ...resolved, resolutionWarnings: [...warnings, ...(resolved.resolutionWarnings ?? [])] } : resolved;
607
558
  }
608
559
  async resolveFileWithWarnings(path, options, applyInheritance, warnings) {
609
- if (this.normalizeRegistryPath(path) === 'domains.json')
610
- return this.resolveDomainCatalog();
611
560
  const includeMetadata = options.includeMetadata ?? true;
612
561
  const stripMcpHeader = options.stripMcpHeader ?? false;
613
562
  const resolveContent = (content, personalized = true) => applyInheritance