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.
- package/dist/registry/scripts/domains/folders.js +55 -0
- package/dist/registry/scripts/learning/entry-authoring.js +13 -24
- package/dist/registry/scripts/learning/run-publication.js +5 -30
- package/dist/registry/stubs/jobs/ai-employee/ai-engineering/aeo-optimization.md +43 -0
- package/dist/registry/stubs/jobs/ai-employee/ai-engineering/author-ai-evals.md +33 -0
- package/dist/registry/stubs/jobs/ai-employee/ai-engineering/create-ai-agent.md +33 -0
- package/dist/registry/stubs/jobs/ai-employee/ai-engineering/create-hub-configured-agent.md +34 -0
- package/dist/registry/stubs/jobs/ai-employee/ai-engineering/enable-web-mcp.md +33 -0
- package/dist/registry/stubs/jobs/ai-employee/ai-engineering/evaluate-ai-agent.md +32 -0
- package/dist/registry/stubs/jobs/ai-employee/ai-engineering/mcp-server-creation.md +35 -0
- package/dist/registry/stubs/jobs/ai-employee/ai-engineering/publish-mcp-app.md +28 -0
- package/dist/registry/stubs/jobs/ai-employee/bank-compliance/banking-evidence-audit.md +32 -0
- package/dist/registry/stubs/jobs/ai-employee/bank-operations/kyc-case-review.md +32 -0
- package/dist/registry/stubs/jobs/ai-employee/career/career-networking.md +46 -0
- package/dist/registry/stubs/jobs/ai-employee/career/career-spec.md +41 -0
- package/dist/registry/stubs/jobs/ai-employee/career/career-trajectory-planning.md +41 -0
- package/dist/registry/stubs/jobs/ai-employee/career/job-applications-and-networking.md +40 -0
- package/dist/registry/stubs/jobs/ai-employee/career/job-search-strategy-and-application-plan.md +41 -0
- package/dist/registry/stubs/jobs/ai-employee/career/offer-negotiation.md +42 -0
- package/dist/registry/stubs/jobs/ai-employee/career/pitch-and-interview-prep.md +43 -0
- package/dist/registry/stubs/jobs/ai-employee/career/public-profile-updates.md +41 -0
- package/dist/registry/stubs/jobs/ai-employee/career/resilience-planning.md +38 -0
- package/dist/registry/stubs/jobs/ai-employee/career/resume-creation.md +40 -0
- package/dist/registry/stubs/jobs/ai-employee/customer/crm-case-resolution.md +33 -0
- package/dist/registry/stubs/jobs/ai-employee/customer/customer-health-review.md +36 -0
- package/dist/registry/stubs/jobs/ai-employee/customer/loyalty-program-management.md +35 -0
- package/dist/registry/stubs/jobs/ai-employee/customer/support-case-resolution.md +39 -0
- package/dist/registry/stubs/jobs/ai-employee/customer/support-playbook-evaluation.md +37 -0
- package/dist/registry/stubs/jobs/ai-employee/customer/support-queue-management.md +36 -0
- package/dist/registry/stubs/jobs/ai-employee/customer/support-sop-operationalization.md +36 -0
- package/dist/registry/stubs/jobs/ai-employee/customer/support-system-operationalization.md +34 -0
- package/dist/registry/stubs/jobs/ai-employee/customer/survey-campaign-management.md +36 -0
- package/dist/registry/stubs/jobs/ai-employee/customer/update-crm.md +32 -0
- package/dist/registry/stubs/jobs/ai-employee/customer/user-survey-management.md +34 -0
- package/dist/registry/stubs/jobs/ai-employee/design/brand-creation.md +34 -0
- package/dist/registry/stubs/jobs/ai-employee/design/branding-quality-audit.md +32 -0
- package/dist/registry/stubs/jobs/ai-employee/design/design-system-creation.md +35 -0
- package/dist/registry/stubs/jobs/ai-employee/design/ui-quality-assessment.md +34 -0
- package/dist/registry/stubs/jobs/ai-employee/design/user-facing-prototyping.md +31 -0
- package/dist/registry/stubs/jobs/ai-employee/design/user-journey-mapping.md +33 -0
- package/dist/registry/stubs/jobs/ai-employee/design/ux-research-synthesis.md +33 -0
- package/dist/registry/stubs/jobs/ai-employee/design/website-creation.md +32 -0
- package/dist/registry/stubs/jobs/ai-employee/dev-ops/cloud-application-deployment.md +35 -0
- package/dist/registry/stubs/jobs/ai-employee/dev-ops/cloud-cost-optimization.md +34 -0
- package/dist/registry/stubs/jobs/ai-employee/dev-ops/cloud-performance-diagnosis.md +33 -0
- package/dist/registry/stubs/jobs/ai-employee/dev-ops/cross-cloud-migration.md +42 -0
- package/dist/registry/stubs/jobs/ai-employee/dev-ops/incident-response.md +35 -0
- package/dist/registry/stubs/jobs/ai-employee/dev-ops/production-readiness-review.md +31 -0
- package/dist/registry/stubs/jobs/ai-employee/dev-ops/reliability-review.md +34 -0
- package/dist/registry/stubs/jobs/ai-employee/dev-ops/route-llm-spend-to-cloud-credits.md +36 -0
- package/dist/registry/stubs/jobs/ai-employee/dev-ops/run-on-remote-hub.md +30 -0
- package/dist/registry/stubs/jobs/ai-employee/dev-ops/set-up-cloud-cost-alerts.md +34 -0
- package/dist/registry/stubs/jobs/ai-employee/dev-ops/setup-remote-hub.md +32 -0
- package/dist/registry/stubs/jobs/ai-employee/dev-ops/slo-design-and-implementation.md +34 -0
- package/dist/registry/stubs/jobs/ai-employee/engineering/application-replication-workflow.md +42 -0
- package/dist/registry/stubs/jobs/ai-employee/engineering/code-refactoring.md +35 -0
- package/dist/registry/stubs/jobs/ai-employee/engineering/codebase-analysis-and-ideation.md +32 -0
- package/dist/registry/stubs/jobs/ai-employee/engineering/create-architecture.md +35 -0
- package/dist/registry/stubs/jobs/ai-employee/engineering/data-pipeline-design.md +30 -0
- package/dist/registry/stubs/jobs/ai-employee/engineering/data-platform-architecture.md +29 -0
- package/dist/registry/stubs/jobs/ai-employee/engineering/data-quality-monitoring.md +29 -0
- package/dist/registry/stubs/jobs/ai-employee/engineering/database-schema-design.md +30 -0
- package/dist/registry/stubs/jobs/ai-employee/engineering/feature-implementation.md +39 -0
- package/dist/registry/stubs/jobs/ai-employee/engineering/github-org-setup.md +32 -0
- package/dist/registry/stubs/jobs/ai-employee/engineering/gitlabs-to-github.md +44 -0
- package/dist/registry/stubs/jobs/ai-employee/engineering/google-workspace-setup.md +34 -0
- package/dist/registry/stubs/jobs/ai-employee/engineering/issue-preparation.md +28 -0
- package/dist/registry/stubs/jobs/ai-employee/engineering/large-refactor-plan.md +36 -0
- package/dist/registry/stubs/jobs/ai-employee/engineering/mobile-app-development.md +43 -0
- package/dist/registry/stubs/jobs/ai-employee/engineering/mobile-app-rejection-response.md +34 -0
- package/dist/registry/stubs/jobs/ai-employee/engineering/mobile-app-submission.md +37 -0
- package/dist/registry/stubs/jobs/ai-employee/engineering/project-scaffolding.md +39 -0
- package/dist/registry/stubs/jobs/ai-employee/engineering/system-migration.md +41 -0
- package/dist/registry/stubs/jobs/ai-employee/engineering/technical-design.md +34 -0
- package/dist/registry/stubs/jobs/ai-employee/engineering/work-completion.md +29 -0
- package/dist/registry/stubs/jobs/ai-employee/engineering/write-dev-docs.md +32 -0
- package/dist/registry/stubs/jobs/ai-employee/executive-assistance/analyze-transcript.md +32 -0
- package/dist/registry/stubs/jobs/ai-employee/executive-assistance/calendar-triage.md +31 -0
- package/dist/registry/stubs/jobs/ai-employee/executive-assistance/chief-of-staff-briefing.md +31 -0
- package/dist/registry/stubs/jobs/ai-employee/executive-assistance/executive-assistant.md +31 -0
- package/dist/registry/stubs/jobs/ai-employee/executive-assistance/meeting-preparation.md +31 -0
- package/dist/registry/stubs/jobs/ai-employee/finance/business-banking-setup.md +29 -0
- package/dist/registry/stubs/jobs/ai-employee/finance/cloud-credits-application.md +34 -0
- package/dist/registry/stubs/jobs/ai-employee/finance/community-funding-preparation.md +34 -0
- package/dist/registry/stubs/jobs/ai-employee/finance/financial-analysis.md +33 -0
- package/dist/registry/stubs/jobs/ai-employee/finance/fpa-and-forecasting.md +33 -0
- package/dist/registry/stubs/jobs/ai-employee/finance/fundraising-prospect-discovery.md +33 -0
- package/dist/registry/stubs/jobs/ai-employee/finance/investor-pitch-preparation.md +40 -0
- package/dist/registry/stubs/jobs/ai-employee/finance/invoice-generation.md +35 -0
- package/dist/registry/stubs/jobs/ai-employee/finance/monthly-close-review.md +32 -0
- package/dist/registry/stubs/jobs/ai-employee/finance/review-funding-preparation.md +33 -0
- package/dist/registry/stubs/jobs/ai-employee/finance/tax-strategy-planning.md +33 -0
- package/dist/registry/stubs/jobs/ai-employee/fraim/adhoc-prompt.md +33 -0
- package/dist/registry/stubs/jobs/ai-employee/fraim/contribute-to-fraim.md +30 -0
- package/dist/registry/stubs/jobs/ai-employee/fraim/file-fraim-issue.md +29 -0
- package/dist/registry/stubs/jobs/ai-employee/fraim/organizational-learning-synthesis.md +40 -0
- package/dist/registry/stubs/jobs/ai-employee/fraim/praise-fraim.md +32 -0
- package/dist/registry/stubs/jobs/ai-employee/fraim/share-with-others.md +30 -0
- package/dist/registry/stubs/jobs/ai-employee/fraim/sleep-on-learnings.md +41 -0
- package/dist/registry/stubs/jobs/ai-employee/fraim/troubleshoot-fraim.md +29 -0
- package/dist/registry/stubs/jobs/ai-employee/fraim/video-demo-to-sop.md +35 -0
- package/dist/registry/stubs/jobs/ai-employee/go-to-market/ad-performance-analysis.md +32 -0
- package/dist/registry/stubs/jobs/ai-employee/go-to-market/aeo-strategy.md +31 -0
- package/dist/registry/stubs/jobs/ai-employee/go-to-market/analyze-revenue-system.md +35 -0
- package/dist/registry/stubs/jobs/ai-employee/go-to-market/build-gtm-motion.md +37 -0
- package/dist/registry/stubs/jobs/ai-employee/go-to-market/build-gtm-stack.md +36 -0
- package/dist/registry/stubs/jobs/ai-employee/go-to-market/design-gtm-system.md +34 -0
- package/dist/registry/stubs/jobs/ai-employee/go-to-market/developer-advocacy.md +33 -0
- package/dist/registry/stubs/jobs/ai-employee/go-to-market/domain-registration-research.md +33 -0
- package/dist/registry/stubs/jobs/ai-employee/go-to-market/evangelist-content-development.md +35 -0
- package/dist/registry/stubs/jobs/ai-employee/go-to-market/funnel-analysis.md +35 -0
- package/dist/registry/stubs/jobs/ai-employee/go-to-market/growth-loop-design.md +35 -0
- package/dist/registry/stubs/jobs/ai-employee/go-to-market/linkedin-carousel-from-deck.md +33 -0
- package/dist/registry/stubs/jobs/ai-employee/go-to-market/linkedin-company-page-setup.md +32 -0
- package/dist/registry/stubs/jobs/ai-employee/go-to-market/marketing-analytics-review.md +34 -0
- package/dist/registry/stubs/jobs/ai-employee/go-to-market/marketing-content-creation.md +31 -0
- package/dist/registry/stubs/jobs/ai-employee/go-to-market/marketing-strategy-definition.md +35 -0
- package/dist/registry/stubs/jobs/ai-employee/go-to-market/notebooklm-content-generation.md +39 -0
- package/dist/registry/stubs/jobs/ai-employee/go-to-market/paid-social-strategy.md +34 -0
- package/dist/registry/stubs/jobs/ai-employee/go-to-market/plan-gtm-team.md +33 -0
- package/dist/registry/stubs/jobs/ai-employee/go-to-market/ppc-campaign-management.md +35 -0
- package/dist/registry/stubs/jobs/ai-employee/go-to-market/product-launch-management.md +29 -0
- package/dist/registry/stubs/jobs/ai-employee/go-to-market/promo-video-creation.md +33 -0
- package/dist/registry/stubs/jobs/ai-employee/go-to-market/seo-strategy.md +34 -0
- package/dist/registry/stubs/jobs/ai-employee/go-to-market/social-engagement-campaign.md +31 -0
- package/dist/registry/stubs/jobs/ai-employee/go-to-market/thought-leadership-engagement.md +32 -0
- package/dist/registry/stubs/jobs/ai-employee/go-to-market/tracking-and-attribution-setup.md +35 -0
- package/dist/registry/stubs/jobs/ai-employee/go-to-market/x-account-setup.md +33 -0
- package/dist/registry/stubs/jobs/ai-employee/inclusion/ai-fluency-program-design.md +30 -0
- package/dist/registry/stubs/jobs/ai-employee/inclusion/ai-governance-for-inclusion.md +33 -0
- package/dist/registry/stubs/jobs/ai-employee/inclusion/dei-toolkit-creation.md +31 -0
- package/dist/registry/stubs/jobs/ai-employee/inclusion/equity-pattern-analysis.md +31 -0
- package/dist/registry/stubs/jobs/ai-employee/inclusion/erg-sop-modernization.md +32 -0
- package/dist/registry/stubs/jobs/ai-employee/inclusion/executive-order-dei-impact-analysis.md +33 -0
- package/dist/registry/stubs/jobs/ai-employee/inclusion/inclusion-ai-readiness-audit.md +37 -0
- package/dist/registry/stubs/jobs/ai-employee/legal/business-annual-report-filing.md +37 -0
- package/dist/registry/stubs/jobs/ai-employee/legal/business-tax-registration.md +31 -0
- package/dist/registry/stubs/jobs/ai-employee/legal/cap-table-construction.md +31 -0
- package/dist/registry/stubs/jobs/ai-employee/legal/contract-review-analysis.md +36 -0
- package/dist/registry/stubs/jobs/ai-employee/legal/ein-application.md +31 -0
- package/dist/registry/stubs/jobs/ai-employee/legal/employment-structure-decision.md +29 -0
- package/dist/registry/stubs/jobs/ai-employee/legal/entity-type-selection.md +31 -0
- package/dist/registry/stubs/jobs/ai-employee/legal/founder-and-equity-agreements.md +31 -0
- package/dist/registry/stubs/jobs/ai-employee/legal/ip-assignment-agreement-creation.md +29 -0
- package/dist/registry/stubs/jobs/ai-employee/legal/nda-creation.md +33 -0
- package/dist/registry/stubs/jobs/ai-employee/legal/provisional-patent-application-creation.md +34 -0
- package/dist/registry/stubs/jobs/ai-employee/legal/saas-contract-package-creation.md +34 -0
- package/dist/registry/stubs/jobs/ai-employee/legal/state-incorporation-filing.md +31 -0
- package/dist/registry/stubs/jobs/ai-employee/legal/trademark-registration-management.md +34 -0
- package/dist/registry/stubs/jobs/ai-employee/legal/w9-creation.md +37 -0
- package/dist/registry/stubs/jobs/ai-employee/management/evolve-employee.md +44 -0
- package/dist/registry/stubs/jobs/ai-employee/management/fully-delegate.md +37 -0
- package/dist/registry/stubs/jobs/ai-employee/management/generate-productivity-report.md +35 -0
- package/dist/registry/stubs/jobs/ai-employee/management/graduate-job.md +24 -0
- package/dist/registry/stubs/jobs/ai-employee/management/issue-retrospective.md +30 -0
- package/dist/registry/stubs/jobs/ai-employee/management/manager-agreements.md +33 -0
- package/dist/registry/stubs/jobs/ai-employee/management/organization-onboarding.md +33 -0
- package/dist/registry/stubs/jobs/ai-employee/management/project-onboarding.md +33 -0
- package/dist/registry/stubs/jobs/ai-employee/management/send-stakeholder-update.md +31 -0
- package/dist/registry/stubs/jobs/ai-employee/people-ops/benefits-analysis-and-enrollment.md +31 -0
- package/dist/registry/stubs/jobs/ai-employee/people-ops/hr-business-partner-advisory.md +31 -0
- package/dist/registry/stubs/jobs/ai-employee/people-ops/new-hire-onboarding.md +32 -0
- package/dist/registry/stubs/jobs/ai-employee/people-ops/payroll-coordination.md +31 -0
- package/dist/registry/stubs/jobs/ai-employee/people-ops/performance-review-preparation.md +31 -0
- package/dist/registry/stubs/jobs/ai-employee/procurement/equipment-acceptance-and-supplier-retrospective.md +32 -0
- package/dist/registry/stubs/jobs/ai-employee/procurement/procurement-intake-and-strategy.md +32 -0
- package/dist/registry/stubs/jobs/ai-employee/procurement/procurement-negotiation-prep.md +32 -0
- package/dist/registry/stubs/jobs/ai-employee/procurement/proposal-response-evaluation.md +33 -0
- package/dist/registry/stubs/jobs/ai-employee/procurement/purchase-approval-and-po-package.md +32 -0
- package/dist/registry/stubs/jobs/ai-employee/procurement/rfp-response-preparation.md +30 -0
- package/dist/registry/stubs/jobs/ai-employee/procurement/rfx-package-authoring.md +32 -0
- package/dist/registry/stubs/jobs/ai-employee/procurement/supplier-discovery-and-qualification.md +32 -0
- package/dist/registry/stubs/jobs/ai-employee/procurement/supplier-performance-review.md +32 -0
- package/dist/registry/stubs/jobs/ai-employee/product/customer-prospect-discovery.md +42 -0
- package/dist/registry/stubs/jobs/ai-employee/product/experiment-tracking.md +30 -0
- package/dist/registry/stubs/jobs/ai-employee/product/feature-specification.md +33 -0
- package/dist/registry/stubs/jobs/ai-employee/product/independent-implementation-review.md +34 -0
- package/dist/registry/stubs/jobs/ai-employee/product/interview-preparation.md +34 -0
- package/dist/registry/stubs/jobs/ai-employee/product/mvp-validation-plan.md +30 -0
- package/dist/registry/stubs/jobs/ai-employee/product/participant-recruitment.md +38 -0
- package/dist/registry/stubs/jobs/ai-employee/product/process-interview-notes.md +42 -0
- package/dist/registry/stubs/jobs/ai-employee/product/review-customer-development.md +38 -0
- package/dist/registry/stubs/jobs/ai-employee/product/send-newsletter.md +30 -0
- package/dist/registry/stubs/jobs/ai-employee/product/send-thank-you-notes.md +30 -0
- package/dist/registry/stubs/jobs/ai-employee/product/triage-customer-needs.md +35 -0
- package/dist/registry/stubs/jobs/ai-employee/project-management/cross-functional-dependency-management.md +31 -0
- package/dist/registry/stubs/jobs/ai-employee/project-management/delivery-governance-review.md +30 -0
- package/dist/registry/stubs/jobs/ai-employee/project-management/operational-reporting.md +37 -0
- package/dist/registry/stubs/jobs/ai-employee/project-management/project-plan-creation.md +31 -0
- package/dist/registry/stubs/jobs/ai-employee/project-management/scrum-sprint-planning.md +33 -0
- package/dist/registry/stubs/jobs/ai-employee/project-management/sprint-planning.md +33 -0
- package/dist/registry/stubs/jobs/ai-employee/quality-assurance/accessibility-audit.md +33 -0
- package/dist/registry/stubs/jobs/ai-employee/quality-assurance/api-testing.md +34 -0
- package/dist/registry/stubs/jobs/ai-employee/quality-assurance/codebase-quality-assessment.md +37 -0
- package/dist/registry/stubs/jobs/ai-employee/quality-assurance/iterative-quality-improvement.md +37 -0
- package/dist/registry/stubs/jobs/ai-employee/quality-assurance/mutation-testing.md +30 -0
- package/dist/registry/stubs/jobs/ai-employee/quality-assurance/performance-quality-assessment.md +38 -0
- package/dist/registry/stubs/jobs/ai-employee/quality-assurance/stress-test-app-under-load.md +34 -0
- package/dist/registry/stubs/jobs/ai-employee/quality-assurance/test-authoring.md +31 -0
- package/dist/registry/stubs/jobs/ai-employee/quality-assurance/test-quality-assessment.md +34 -0
- package/dist/registry/stubs/jobs/ai-employee/quality-assurance/ui-polish-validation.md +45 -0
- package/dist/registry/stubs/jobs/ai-employee/quality-assurance/user-testing-and-bug-bash.md +32 -0
- package/dist/registry/stubs/jobs/ai-employee/recruiting/candidate-pipeline-management.md +34 -0
- package/dist/registry/stubs/jobs/ai-employee/recruiting/candidate-sourcing-and-ranking.md +35 -0
- package/dist/registry/stubs/jobs/ai-employee/recruiting/interview-coordination.md +34 -0
- package/dist/registry/stubs/jobs/ai-employee/recruiting/job-posting-and-sourcing.md +32 -0
- package/dist/registry/stubs/jobs/ai-employee/recruiting/offer-and-close-management.md +35 -0
- package/dist/registry/stubs/jobs/ai-employee/recruiting/role-intake-and-scorecard.md +33 -0
- package/dist/registry/stubs/jobs/ai-employee/recruiting/sourcing-funnel-recap.md +35 -0
- package/dist/registry/stubs/jobs/ai-employee/sales/account-strategy.md +34 -0
- package/dist/registry/stubs/jobs/ai-employee/sales/crm-pipeline-review.md +30 -0
- package/dist/registry/stubs/jobs/ai-employee/sales/deal-strategy.md +32 -0
- package/dist/registry/stubs/jobs/ai-employee/sales/outbound-sales-strategy.md +34 -0
- package/dist/registry/stubs/jobs/ai-employee/sales/proposal-development.md +31 -0
- package/dist/registry/stubs/jobs/ai-employee/sales/sales-coaching.md +33 -0
- package/dist/registry/stubs/jobs/ai-employee/sales/sales-discovery-preparation.md +33 -0
- package/dist/registry/stubs/jobs/ai-employee/salesforce/sf-build-automation.md +34 -0
- package/dist/registry/stubs/jobs/ai-employee/salesforce/sf-build-dashboard.md +35 -0
- package/dist/registry/stubs/jobs/ai-employee/salesforce/sf-config-deployment.md +35 -0
- package/dist/registry/stubs/jobs/ai-employee/salesforce/sf-data-management.md +34 -0
- package/dist/registry/stubs/jobs/ai-employee/salesforce/sf-org-health-check.md +38 -0
- package/dist/registry/stubs/jobs/ai-employee/salesforce/sf-user-and-access-management.md +35 -0
- package/dist/registry/stubs/jobs/ai-employee/security/compliance-continuous-monitoring.md +31 -0
- package/dist/registry/stubs/jobs/ai-employee/security/compliance-policy-authoring.md +31 -0
- package/dist/registry/stubs/jobs/ai-employee/security/compliance-questionnaire-response.md +32 -0
- package/dist/registry/stubs/jobs/ai-employee/security/compliance-requirements-detection.md +30 -0
- package/dist/registry/stubs/jobs/ai-employee/security/compliance-review.md +34 -0
- package/dist/registry/stubs/jobs/ai-employee/security/generate-audit-evidence.md +34 -0
- package/dist/registry/stubs/jobs/ai-employee/security/regulation-evidence-management.md +33 -0
- package/dist/registry/stubs/jobs/ai-employee/security/security-baseline-setup.md +32 -0
- package/dist/registry/stubs/jobs/ai-employee/security/security-review.md +32 -0
- package/dist/registry/stubs/jobs/ai-employee/security/soc2-evidence-management.md +32 -0
- package/dist/registry/stubs/jobs/ai-employee/security/vulnerability-triage-and-remediation.md +33 -0
- package/dist/registry/stubs/jobs/ai-employee/strategy/advisor-interview.md +29 -0
- package/dist/registry/stubs/jobs/ai-employee/strategy/advisory-board-development.md +31 -0
- package/dist/registry/stubs/jobs/ai-employee/strategy/advisory-board-selection.md +29 -0
- package/dist/registry/stubs/jobs/ai-employee/strategy/blue-sky-brainstorming.md +33 -0
- package/dist/registry/stubs/jobs/ai-employee/strategy/business-idea-validation-and-scoping.md +44 -0
- package/dist/registry/stubs/jobs/ai-employee/strategy/business-plan-creation.md +38 -0
- package/dist/registry/stubs/jobs/ai-employee/strategy/competitive-analysis.md +36 -0
- package/dist/registry/stubs/jobs/ai-employee/strategy/founder-market-fit-analysis.md +40 -0
- package/dist/registry/stubs/jobs/ai-employee/strategy/pricing-strategy-definition.md +40 -0
- package/dist/registry/stubs/jobs/ai-employee/strategy/problem-statement-crystallization.md +37 -0
- package/dist/registry/stubs/jobs/ai-employee/strategy/review-business-strategy.md +37 -0
- package/dist/registry/stubs/jobs/ai-employee/travel/travel-disruption-rebooking.md +33 -0
- package/dist/registry/stubs/jobs/ai-employee/travel/travel-fare-watch.md +33 -0
- package/dist/registry/stubs/jobs/ai-employee/travel/travel-planning.md +32 -0
- package/dist/registry/stubs/jobs/ai-manager/fraim/instruction-hygiene-review.md +34 -0
- package/dist/registry/stubs/jobs/ai-manager/management/analyze-why-you-messed-up.md +29 -0
- package/dist/registry/stubs/jobs/ai-manager/management/author-project-rules.md +31 -0
- package/dist/registry/stubs/jobs/ai-manager/management/create-clarity.md +30 -0
- package/dist/registry/stubs/jobs/ai-manager/management/explain-it.md +30 -0
- package/dist/registry/stubs/jobs/ai-manager/management/follow-your-mentor.md +29 -0
- package/dist/registry/stubs/jobs/ai-manager/management/hire-right-ai-for-the-job.md +29 -0
- package/dist/registry/stubs/jobs/ai-manager/management/hire-the-right-human-ai-manager.md +29 -0
- package/dist/registry/stubs/jobs/ai-manager/management/how-should-i-verify.md +32 -0
- package/dist/registry/stubs/jobs/ai-manager/management/need-pov.md +30 -0
- package/dist/registry/stubs/jobs/ai-manager/management/recognize-good-work.md +29 -0
- package/dist/registry/stubs/jobs/ai-manager/management/refine-core-values.md +29 -0
- package/dist/registry/stubs/jobs/ai-manager/management/shape-team.md +30 -0
- package/dist/registry/stubs/jobs/ai-manager/management/strong-pov.md +30 -0
- package/dist/registry/stubs/jobs/ai-manager/management/weak-pov.md +30 -0
- package/dist/registry/stubs/jobs/ai-manager/management/what-should-i-review.md +34 -0
- package/dist/src/cli/utils/remote-sync.js +0 -7
- package/dist/src/cli/utils/script-sync-utils.js +0 -4
- package/dist/src/config/learning-domains.js +12 -19
- package/dist/src/core/ai-mentor.js +2 -2
- package/dist/src/core/utils/domain-rule-assembler.js +78 -153
- package/dist/src/core/utils/include-resolver.js +25 -47
- package/dist/src/core/utils/local-registry-resolver.js +0 -51
- package/dist/src/local-mcp-server/learning-context-builder.js +36 -33
- package/dist/src/local-mcp-server/stdio-server.js +27 -59
- package/dist/src/services/mcp-service.js +15 -15
- package/dist/src/services/registry-service.js +0 -4
- package/package.json +3 -3
- package/dist/registry/domains.json +0 -159
- 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.
|
|
5
|
+
exports.appendRuleInstructions = appendRuleInstructions;
|
|
6
6
|
const crypto_1 = require("crypto");
|
|
7
|
-
const
|
|
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 ?
|
|
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
|
-
|
|
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
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 ??
|
|
126
|
-
|
|
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
|
-
|
|
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 (
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
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
|
-
/**
|
|
170
|
-
function
|
|
171
|
-
|
|
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
|
-
|
|
51
|
-
*
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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
|
-
|
|
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
|
-
|
|
103
|
-
}
|
|
104
|
-
return
|
|
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
|