sinapse-ai 1.24.0 → 1.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/sinapse/SKILL.md +10 -0
- package/.agents/skills/sinapse-agent/SKILL.md +22 -0
- package/.agents/skills/sinapse-analyst/SKILL.md +29 -0
- package/.agents/skills/sinapse-animations/SKILL.md +28 -0
- package/.agents/skills/sinapse-architect/SKILL.md +31 -0
- package/.agents/skills/sinapse-brand/SKILL.md +28 -0
- package/.agents/skills/sinapse-claude/SKILL.md +28 -0
- package/.agents/skills/sinapse-cloning/SKILL.md +28 -0
- package/.agents/skills/sinapse-commercial/SKILL.md +28 -0
- package/.agents/skills/sinapse-content/SKILL.md +28 -0
- package/.agents/skills/sinapse-copy/SKILL.md +28 -0
- package/.agents/skills/sinapse-council/SKILL.md +28 -0
- package/.agents/skills/sinapse-courses/SKILL.md +28 -0
- package/.agents/skills/sinapse-cyber/SKILL.md +28 -0
- package/.agents/skills/sinapse-data-engineer/SKILL.md +31 -0
- package/.agents/skills/sinapse-design/SKILL.md +28 -0
- package/.agents/skills/sinapse-dev/SKILL.md +31 -0
- package/.agents/skills/sinapse-devops/SKILL.md +31 -0
- package/.agents/skills/sinapse-finance/SKILL.md +28 -0
- package/.agents/skills/sinapse-growth/SKILL.md +28 -0
- package/.agents/skills/sinapse-loop/SKILL.md +35 -0
- package/.agents/skills/sinapse-orqx/SKILL.md +44 -0
- package/.agents/skills/sinapse-paidmedia/SKILL.md +28 -0
- package/.agents/skills/sinapse-pm/SKILL.md +31 -0
- package/.agents/skills/sinapse-po/SKILL.md +31 -0
- package/.agents/skills/sinapse-product/SKILL.md +28 -0
- package/.agents/skills/sinapse-qa/SKILL.md +31 -0
- package/.agents/skills/sinapse-research/SKILL.md +28 -0
- package/.agents/skills/sinapse-sm/SKILL.md +27 -0
- package/.agents/skills/sinapse-spec-driven/SKILL.md +35 -0
- package/.agents/skills/sinapse-squad-creator/SKILL.md +31 -0
- package/.agents/skills/sinapse-storytelling/SKILL.md +28 -0
- package/.agents/skills/sinapse-swarm/SKILL.md +28 -0
- package/.agents/skills/sinapse-ux-design-expert/SKILL.md +24 -0
- package/.agents/skills/snps/SKILL.md +10 -0
- package/.agents/skills/snps-orqx/SKILL.md +10 -0
- package/.claude/agents/README.md +67 -0
- package/.claude/agents/sinapse-ad-copywriter.md +14 -0
- package/.claude/agents/sinapse-agent-forger.md +14 -0
- package/.claude/agents/sinapse-analyst.md +14 -0
- package/.claude/agents/sinapse-animation-interpreter.md +14 -0
- package/.claude/agents/sinapse-animation-performance-engineer.md +14 -0
- package/.claude/agents/sinapse-animations-orqx.md +14 -0
- package/.claude/agents/sinapse-architect.md +14 -0
- package/.claude/agents/sinapse-assessment-creator.md +14 -0
- package/.claude/agents/sinapse-audience-intelligence.md +14 -0
- package/.claude/agents/sinapse-blake-snyder.md +14 -0
- package/.claude/agents/sinapse-brand-archetype-strategist.md +14 -0
- package/.claude/agents/sinapse-brand-auditor.md +14 -0
- package/.claude/agents/sinapse-brand-collateral-designer.md +14 -0
- package/.claude/agents/sinapse-brand-compiler.md +14 -0
- package/.claude/agents/sinapse-brand-creative-engineer.md +14 -0
- package/.claude/agents/sinapse-brand-culture-architect.md +14 -0
- package/.claude/agents/sinapse-brand-growth-strategist.md +14 -0
- package/.claude/agents/sinapse-brand-identity-designer.md +14 -0
- package/.claude/agents/sinapse-brand-motion-vfx.md +14 -0
- package/.claude/agents/sinapse-brand-naming-specialist.md +14 -0
- package/.claude/agents/sinapse-brand-orqx.md +14 -0
- package/.claude/agents/sinapse-brand-positioning-strategist.md +14 -0
- package/.claude/agents/sinapse-brand-sonic-designer.md +14 -0
- package/.claude/agents/sinapse-brand-strategist.md +14 -0
- package/.claude/agents/sinapse-brand-system-architect.md +14 -0
- package/.claude/agents/sinapse-brand-voice-writer.md +14 -0
- package/.claude/agents/sinapse-brene-brown.md +14 -0
- package/.claude/agents/sinapse-budget-controller.md +14 -0
- package/.claude/agents/sinapse-campaign-analyst.md +14 -0
- package/.claude/agents/sinapse-charlie-munger.md +14 -0
- package/.claude/agents/sinapse-claude-mastery-chief.md +14 -0
- package/.claude/agents/sinapse-cloning-orqx.md +14 -0
- package/.claude/agents/sinapse-cloud-security-engineer.md +14 -0
- package/.claude/agents/sinapse-cognitive-extractor.md +14 -0
- package/.claude/agents/sinapse-commercial-orqx.md +14 -0
- package/.claude/agents/sinapse-competitive-intelligence.md +14 -0
- package/.claude/agents/sinapse-compliance-officer.md +14 -0
- package/.claude/agents/sinapse-config-engineer.md +14 -0
- package/.claude/agents/sinapse-content-analyst.md +14 -0
- package/.claude/agents/sinapse-content-capturer.md +14 -0
- package/.claude/agents/sinapse-content-engineer.md +14 -0
- package/.claude/agents/sinapse-content-governor.md +14 -0
- package/.claude/agents/sinapse-content-orqx.md +14 -0
- package/.claude/agents/sinapse-content-writer.md +14 -0
- package/.claude/agents/sinapse-conversion-writer.md +14 -0
- package/.claude/agents/sinapse-copy-editor.md +14 -0
- package/.claude/agents/sinapse-copy-orqx.md +14 -0
- package/.claude/agents/sinapse-copy-strategist.md +14 -0
- package/.claude/agents/sinapse-cost-optimizer.md +14 -0
- package/.claude/agents/sinapse-council-orqx.md +14 -0
- package/.claude/agents/sinapse-courses-orqx.md +14 -0
- package/.claude/agents/sinapse-creative-strategist.md +14 -0
- package/.claude/agents/sinapse-cro-persuasion.md +14 -0
- package/.claude/agents/sinapse-cro-specialist.md +14 -0
- package/.claude/agents/sinapse-cs-business-auditor.md +14 -0
- package/.claude/agents/sinapse-cs-client-success.md +14 -0
- package/.claude/agents/sinapse-cs-crm-specialist.md +14 -0
- package/.claude/agents/sinapse-cs-funnel-architect.md +14 -0
- package/.claude/agents/sinapse-cs-lead-generation-strategist.md +14 -0
- package/.claude/agents/sinapse-cs-offer-designer.md +14 -0
- package/.claude/agents/sinapse-cs-revops-analyst.md +14 -0
- package/.claude/agents/sinapse-cs-sales-closer.md +14 -0
- package/.claude/agents/sinapse-cs-sales-enablement.md +14 -0
- package/.claude/agents/sinapse-css-motion-artist.md +14 -0
- package/.claude/agents/sinapse-curriculum-designer.md +14 -0
- package/.claude/agents/sinapse-cyber-orqx.md +14 -0
- package/.claude/agents/sinapse-dan-harmon.md +14 -0
- package/.claude/agents/sinapse-data-engineer.md +14 -0
- package/.claude/agents/sinapse-data-synthesizer.md +14 -0
- package/.claude/agents/sinapse-deep-researcher.md +14 -0
- package/.claude/agents/sinapse-derek-sivers.md +14 -0
- package/.claude/agents/sinapse-design-orqx.md +14 -0
- package/.claude/agents/sinapse-design-system.md +14 -0
- package/.claude/agents/sinapse-developer.md +14 -0
- package/.claude/agents/sinapse-devops.md +14 -0
- package/.claude/agents/sinapse-direct-response-writer.md +14 -0
- package/.claude/agents/sinapse-dx-accessibility-specialist.md +14 -0
- package/.claude/agents/sinapse-dx-design-system-architect.md +14 -0
- package/.claude/agents/sinapse-dx-frontend-engineer.md +14 -0
- package/.claude/agents/sinapse-dx-interaction-designer.md +14 -0
- package/.claude/agents/sinapse-dx-performance-engineer.md +14 -0
- package/.claude/agents/sinapse-dx-ui-designer.md +14 -0
- package/.claude/agents/sinapse-dx-ux-strategist.md +14 -0
- package/.claude/agents/sinapse-editorial-strategist.md +14 -0
- package/.claude/agents/sinapse-email-sequence-strategist.md +14 -0
- package/.claude/agents/sinapse-finance-orqx.md +14 -0
- package/.claude/agents/sinapse-fiscal-compliance-br.md +14 -0
- package/.claude/agents/sinapse-forecast-strategist.md +14 -0
- package/.claude/agents/sinapse-funnel-copywriter.md +14 -0
- package/.claude/agents/sinapse-ga-analytics-engineer.md +14 -0
- package/.claude/agents/sinapse-ga-campaign-analyst.md +14 -0
- package/.claude/agents/sinapse-ga-cro-specialist.md +14 -0
- package/.claude/agents/sinapse-ga-data-analyst.md +14 -0
- package/.claude/agents/sinapse-ga-growth-hacker.md +14 -0
- package/.claude/agents/sinapse-ga-seo-strategist.md +14 -0
- package/.claude/agents/sinapse-generative-particle-engineer.md +14 -0
- package/.claude/agents/sinapse-google-ads-specialist.md +14 -0
- package/.claude/agents/sinapse-growth-orqx.md +14 -0
- package/.claude/agents/sinapse-headline-specialist.md +14 -0
- package/.claude/agents/sinapse-hooks-architect.md +14 -0
- package/.claude/agents/sinapse-incident-responder.md +14 -0
- package/.claude/agents/sinapse-joseph-campbell.md +14 -0
- package/.claude/agents/sinapse-kb-architect.md +14 -0
- package/.claude/agents/sinapse-keith-johnstone.md +14 -0
- package/.claude/agents/sinapse-kindra-hall.md +14 -0
- package/.claude/agents/sinapse-launch-strategist.md +14 -0
- package/.claude/agents/sinapse-lesson-architect.md +14 -0
- package/.claude/agents/sinapse-long-form-writer.md +14 -0
- package/.claude/agents/sinapse-market-analyst.md +14 -0
- package/.claude/agents/sinapse-marshall-ganz.md +14 -0
- package/.claude/agents/sinapse-mcp-integrator.md +14 -0
- package/.claude/agents/sinapse-meta-ads-specialist.md +14 -0
- package/.claude/agents/sinapse-mind-synthesizer.md +14 -0
- package/.claude/agents/sinapse-motion-choreographer.md +14 -0
- package/.claude/agents/sinapse-nancy-duarte.md +14 -0
- package/.claude/agents/sinapse-naval-ravikant.md +14 -0
- package/.claude/agents/sinapse-network-security-engineer.md +14 -0
- package/.claude/agents/sinapse-oren-klaff.md +14 -0
- package/.claude/agents/sinapse-paidmedia-orqx.md +14 -0
- package/.claude/agents/sinapse-park-howell.md +14 -0
- package/.claude/agents/sinapse-patrick-lencioni.md +14 -0
- package/.claude/agents/sinapse-penetration-tester.md +14 -0
- package/.claude/agents/sinapse-performance-engineer.md +14 -0
- package/.claude/agents/sinapse-persuasion-psychologist.md +14 -0
- package/.claude/agents/sinapse-peter-thiel.md +14 -0
- package/.claude/agents/sinapse-platform-aesthetic-director.md +14 -0
- package/.claude/agents/sinapse-platform-specialist.md +14 -0
- package/.claude/agents/sinapse-pm-creative-performance-analyst.md +14 -0
- package/.claude/agents/sinapse-pm-youtube-ads-specialist.md +14 -0
- package/.claude/agents/sinapse-premium-packaging-strategist.md +14 -0
- package/.claude/agents/sinapse-pricing-strategist.md +14 -0
- package/.claude/agents/sinapse-product-lead.md +14 -0
- package/.claude/agents/sinapse-product-orqx.md +14 -0
- package/.claude/agents/sinapse-product-surface-director.md +14 -0
- package/.claude/agents/sinapse-production-director.md +14 -0
- package/.claude/agents/sinapse-profitability-analyst.md +14 -0
- package/.claude/agents/sinapse-project-integrator.md +14 -0
- package/.claude/agents/sinapse-project-lead.md +14 -0
- package/.claude/agents/sinapse-proof-architect.md +14 -0
- package/.claude/agents/sinapse-ps-client-product-manager.md +14 -0
- package/.claude/agents/sinapse-ps-delivery-manager.md +14 -0
- package/.claude/agents/sinapse-ps-discovery-lead.md +14 -0
- package/.claude/agents/sinapse-ps-product-analyst.md +14 -0
- package/.claude/agents/sinapse-ps-product-ops-specialist.md +14 -0
- package/.claude/agents/sinapse-ps-product-strategist.md +14 -0
- package/.claude/agents/sinapse-quality-gate.md +14 -0
- package/.claude/agents/sinapse-ray-dalio.md +14 -0
- package/.claude/agents/sinapse-reid-hoffman.md +14 -0
- package/.claude/agents/sinapse-research-orqx.md +14 -0
- package/.claude/agents/sinapse-revenue-analyst.md +14 -0
- package/.claude/agents/sinapse-roadmap-sentinel.md +14 -0
- package/.claude/agents/sinapse-scroll-narrative-engineer.md +14 -0
- package/.claude/agents/sinapse-shader-artist.md +14 -0
- package/.claude/agents/sinapse-signal-intelligence.md +14 -0
- package/.claude/agents/sinapse-simon-sinek.md +14 -0
- package/.claude/agents/sinapse-skill-craftsman.md +14 -0
- package/.claude/agents/sinapse-slide-designer.md +14 -0
- package/.claude/agents/sinapse-snps-orqx.md +14 -0
- package/.claude/agents/sinapse-soc-analyst.md +14 -0
- package/.claude/agents/sinapse-sop-extractor.md +14 -0
- package/.claude/agents/sinapse-source-hunter.md +14 -0
- package/.claude/agents/sinapse-sprint-lead.md +14 -0
- package/.claude/agents/sinapse-squad-assembler.md +14 -0
- package/.claude/agents/sinapse-squad-creator.md +14 -0
- package/.claude/agents/sinapse-storytelling-orqx.md +14 -0
- package/.claude/agents/sinapse-swarm-orqx.md +14 -0
- package/.claude/agents/sinapse-threat-analyst.md +14 -0
- package/.claude/agents/sinapse-threejs-architect.md +14 -0
- package/.claude/agents/sinapse-trend-forecaster.md +14 -0
- package/.claude/agents/sinapse-ux-design-expert.md +14 -0
- package/.claude/agents/sinapse-ux-designer.md +14 -0
- package/.claude/agents/sinapse-yvon-chouinard.md +14 -0
- package/.claude/rules/software-engineering-applicability.md +13 -0
- package/.claude/skill-manifest.json +41 -0
- package/.claude/skills/api-review.md +50 -0
- package/.claude/skills/component-check.md +47 -0
- package/.claude/skills/db-review.md +41 -0
- package/.claude/skills/sinapse/SKILL.md +11 -0
- package/.claude/skills/sinapse-agent/SKILL.md +11 -0
- package/.claude/skills/sinapse-analyst/SKILL.md +11 -0
- package/.claude/skills/sinapse-animations/SKILL.md +11 -0
- package/.claude/skills/sinapse-architect/SKILL.md +11 -0
- package/.claude/skills/sinapse-brand/SKILL.md +11 -0
- package/.claude/skills/sinapse-claude/SKILL.md +11 -0
- package/.claude/skills/sinapse-cloning/SKILL.md +11 -0
- package/.claude/skills/sinapse-commercial/SKILL.md +11 -0
- package/.claude/skills/sinapse-content/SKILL.md +11 -0
- package/.claude/skills/sinapse-copy/SKILL.md +11 -0
- package/.claude/skills/sinapse-council/SKILL.md +11 -0
- package/.claude/skills/sinapse-courses/SKILL.md +11 -0
- package/.claude/skills/sinapse-cyber/SKILL.md +11 -0
- package/.claude/skills/sinapse-data-engineer/SKILL.md +11 -0
- package/.claude/skills/sinapse-design/SKILL.md +11 -0
- package/.claude/skills/sinapse-dev/SKILL.md +11 -0
- package/.claude/skills/sinapse-devops/SKILL.md +11 -0
- package/.claude/skills/sinapse-finance/SKILL.md +11 -0
- package/.claude/skills/sinapse-growth/SKILL.md +11 -0
- package/.claude/skills/sinapse-loop/SKILL.md +11 -0
- package/.claude/skills/sinapse-orqx/SKILL.md +11 -0
- package/.claude/skills/sinapse-paidmedia/SKILL.md +11 -0
- package/.claude/skills/sinapse-pm/SKILL.md +11 -0
- package/.claude/skills/sinapse-po/SKILL.md +11 -0
- package/.claude/skills/sinapse-product/SKILL.md +11 -0
- package/.claude/skills/sinapse-qa/SKILL.md +11 -0
- package/.claude/skills/sinapse-research/SKILL.md +11 -0
- package/.claude/skills/sinapse-sm/SKILL.md +11 -0
- package/.claude/skills/sinapse-spec-driven/SKILL.md +11 -0
- package/.claude/skills/sinapse-squad-creator/SKILL.md +11 -0
- package/.claude/skills/sinapse-storytelling/SKILL.md +11 -0
- package/.claude/skills/sinapse-swarm/SKILL.md +11 -0
- package/.claude/skills/sinapse-ux-design-expert/SKILL.md +11 -0
- package/.claude/skills/snps/SKILL.md +11 -0
- package/.claude/skills/snps-orqx/SKILL.md +11 -0
- package/.claude/skills/story-update.md +52 -0
- package/.claude/skills/test-guard.md +41 -0
- package/.codex/agents/ad-copywriter.toml +3 -0
- package/.codex/agents/agent-forger.toml +3 -0
- package/.codex/agents/analyst.toml +3 -0
- package/.codex/agents/animation-interpreter.toml +3 -0
- package/.codex/agents/animation-performance-engineer.toml +3 -0
- package/.codex/agents/animations-orqx.toml +3 -0
- package/.codex/agents/architect.toml +3 -0
- package/.codex/agents/assessment-creator.toml +3 -0
- package/.codex/agents/audience-intelligence.toml +3 -0
- package/.codex/agents/blake-snyder.toml +3 -0
- package/.codex/agents/brand-archetype-strategist.toml +3 -0
- package/.codex/agents/brand-auditor.toml +3 -0
- package/.codex/agents/brand-collateral-designer.toml +3 -0
- package/.codex/agents/brand-compiler.toml +3 -0
- package/.codex/agents/brand-creative-engineer.toml +3 -0
- package/.codex/agents/brand-culture-architect.toml +3 -0
- package/.codex/agents/brand-growth-strategist.toml +3 -0
- package/.codex/agents/brand-identity-designer.toml +3 -0
- package/.codex/agents/brand-motion-vfx.toml +3 -0
- package/.codex/agents/brand-naming-specialist.toml +3 -0
- package/.codex/agents/brand-orqx.toml +3 -0
- package/.codex/agents/brand-positioning-strategist.toml +3 -0
- package/.codex/agents/brand-sonic-designer.toml +3 -0
- package/.codex/agents/brand-strategist.toml +3 -0
- package/.codex/agents/brand-system-architect.toml +3 -0
- package/.codex/agents/brand-voice-writer.toml +3 -0
- package/.codex/agents/brene-brown.toml +3 -0
- package/.codex/agents/budget-controller.toml +3 -0
- package/.codex/agents/campaign-analyst.toml +3 -0
- package/.codex/agents/charlie-munger.toml +3 -0
- package/.codex/agents/claude-mastery-chief.toml +3 -0
- package/.codex/agents/cloning-orqx.toml +3 -0
- package/.codex/agents/cloud-security-engineer.toml +3 -0
- package/.codex/agents/cognitive-extractor.toml +3 -0
- package/.codex/agents/commercial-orqx.toml +3 -0
- package/.codex/agents/competitive-intelligence.toml +3 -0
- package/.codex/agents/compliance-officer.toml +3 -0
- package/.codex/agents/config-engineer.toml +3 -0
- package/.codex/agents/content-analyst.toml +3 -0
- package/.codex/agents/content-capturer.toml +3 -0
- package/.codex/agents/content-engineer.toml +3 -0
- package/.codex/agents/content-governor.toml +3 -0
- package/.codex/agents/content-orqx.toml +3 -0
- package/.codex/agents/content-writer.toml +3 -0
- package/.codex/agents/conversion-writer.toml +3 -0
- package/.codex/agents/copy-editor.toml +3 -0
- package/.codex/agents/copy-orqx.toml +3 -0
- package/.codex/agents/copy-strategist.toml +3 -0
- package/.codex/agents/cost-optimizer.toml +3 -0
- package/.codex/agents/council-orqx.toml +3 -0
- package/.codex/agents/courses-orqx.toml +3 -0
- package/.codex/agents/creative-strategist.toml +3 -0
- package/.codex/agents/cro-persuasion.toml +3 -0
- package/.codex/agents/cro-specialist.toml +3 -0
- package/.codex/agents/cs-business-auditor.toml +3 -0
- package/.codex/agents/cs-client-success.toml +3 -0
- package/.codex/agents/cs-crm-specialist.toml +3 -0
- package/.codex/agents/cs-funnel-architect.toml +3 -0
- package/.codex/agents/cs-lead-generation-strategist.toml +3 -0
- package/.codex/agents/cs-offer-designer.toml +3 -0
- package/.codex/agents/cs-revops-analyst.toml +3 -0
- package/.codex/agents/cs-sales-closer.toml +3 -0
- package/.codex/agents/cs-sales-enablement.toml +3 -0
- package/.codex/agents/css-motion-artist.toml +3 -0
- package/.codex/agents/curriculum-designer.toml +3 -0
- package/.codex/agents/cyber-orqx.toml +3 -0
- package/.codex/agents/dan-harmon.toml +3 -0
- package/.codex/agents/data-engineer.toml +3 -0
- package/.codex/agents/data-synthesizer.toml +3 -0
- package/.codex/agents/deep-researcher.toml +3 -0
- package/.codex/agents/derek-sivers.toml +3 -0
- package/.codex/agents/design-orqx.toml +3 -0
- package/.codex/agents/design-system.toml +3 -0
- package/.codex/agents/developer.toml +3 -0
- package/.codex/agents/devops.toml +3 -0
- package/.codex/agents/direct-response-writer.toml +3 -0
- package/.codex/agents/dx-accessibility-specialist.toml +3 -0
- package/.codex/agents/dx-design-system-architect.toml +3 -0
- package/.codex/agents/dx-frontend-engineer.toml +3 -0
- package/.codex/agents/dx-interaction-designer.toml +3 -0
- package/.codex/agents/dx-performance-engineer.toml +3 -0
- package/.codex/agents/dx-ui-designer.toml +3 -0
- package/.codex/agents/dx-ux-strategist.toml +3 -0
- package/.codex/agents/editorial-strategist.toml +3 -0
- package/.codex/agents/email-sequence-strategist.toml +3 -0
- package/.codex/agents/finance-orqx.toml +3 -0
- package/.codex/agents/fiscal-compliance-br.toml +3 -0
- package/.codex/agents/forecast-strategist.toml +3 -0
- package/.codex/agents/funnel-copywriter.toml +3 -0
- package/.codex/agents/ga-analytics-engineer.toml +3 -0
- package/.codex/agents/ga-campaign-analyst.toml +3 -0
- package/.codex/agents/ga-cro-specialist.toml +3 -0
- package/.codex/agents/ga-data-analyst.toml +3 -0
- package/.codex/agents/ga-growth-hacker.toml +3 -0
- package/.codex/agents/ga-seo-strategist.toml +3 -0
- package/.codex/agents/generative-particle-engineer.toml +3 -0
- package/.codex/agents/google-ads-specialist.toml +3 -0
- package/.codex/agents/growth-orqx.toml +3 -0
- package/.codex/agents/headline-specialist.toml +3 -0
- package/.codex/agents/hooks-architect.toml +3 -0
- package/.codex/agents/incident-responder.toml +3 -0
- package/.codex/agents/joseph-campbell.toml +3 -0
- package/.codex/agents/kb-architect.toml +3 -0
- package/.codex/agents/keith-johnstone.toml +3 -0
- package/.codex/agents/kindra-hall.toml +3 -0
- package/.codex/agents/launch-strategist.toml +3 -0
- package/.codex/agents/lesson-architect.toml +3 -0
- package/.codex/agents/long-form-writer.toml +3 -0
- package/.codex/agents/market-analyst.toml +3 -0
- package/.codex/agents/marshall-ganz.toml +3 -0
- package/.codex/agents/mcp-integrator.toml +3 -0
- package/.codex/agents/meta-ads-specialist.toml +3 -0
- package/.codex/agents/mind-synthesizer.toml +3 -0
- package/.codex/agents/motion-choreographer.toml +3 -0
- package/.codex/agents/nancy-duarte.toml +3 -0
- package/.codex/agents/naval-ravikant.toml +3 -0
- package/.codex/agents/network-security-engineer.toml +3 -0
- package/.codex/agents/oren-klaff.toml +3 -0
- package/.codex/agents/paidmedia-orqx.toml +3 -0
- package/.codex/agents/park-howell.toml +3 -0
- package/.codex/agents/patrick-lencioni.toml +3 -0
- package/.codex/agents/penetration-tester.toml +3 -0
- package/.codex/agents/performance-engineer.toml +3 -0
- package/.codex/agents/persuasion-psychologist.toml +3 -0
- package/.codex/agents/peter-thiel.toml +3 -0
- package/.codex/agents/platform-aesthetic-director.toml +3 -0
- package/.codex/agents/platform-specialist.toml +3 -0
- package/.codex/agents/pm-creative-performance-analyst.toml +3 -0
- package/.codex/agents/pm-youtube-ads-specialist.toml +3 -0
- package/.codex/agents/premium-packaging-strategist.toml +3 -0
- package/.codex/agents/pricing-strategist.toml +3 -0
- package/.codex/agents/product-lead.toml +3 -0
- package/.codex/agents/product-orqx.toml +3 -0
- package/.codex/agents/product-surface-director.toml +3 -0
- package/.codex/agents/production-director.toml +3 -0
- package/.codex/agents/profitability-analyst.toml +3 -0
- package/.codex/agents/project-integrator.toml +3 -0
- package/.codex/agents/project-lead.toml +3 -0
- package/.codex/agents/proof-architect.toml +3 -0
- package/.codex/agents/ps-client-product-manager.toml +3 -0
- package/.codex/agents/ps-delivery-manager.toml +3 -0
- package/.codex/agents/ps-discovery-lead.toml +3 -0
- package/.codex/agents/ps-product-analyst.toml +3 -0
- package/.codex/agents/ps-product-ops-specialist.toml +3 -0
- package/.codex/agents/ps-product-strategist.toml +3 -0
- package/.codex/agents/quality-gate.toml +3 -0
- package/.codex/agents/ray-dalio.toml +3 -0
- package/.codex/agents/reid-hoffman.toml +3 -0
- package/.codex/agents/research-orqx.toml +3 -0
- package/.codex/agents/revenue-analyst.toml +3 -0
- package/.codex/agents/roadmap-sentinel.toml +3 -0
- package/.codex/agents/scroll-narrative-engineer.toml +3 -0
- package/.codex/agents/shader-artist.toml +3 -0
- package/.codex/agents/signal-intelligence.toml +3 -0
- package/.codex/agents/simon-sinek.toml +3 -0
- package/.codex/agents/skill-craftsman.toml +3 -0
- package/.codex/agents/slide-designer.toml +3 -0
- package/.codex/agents/snps-orqx.toml +3 -0
- package/.codex/agents/soc-analyst.toml +3 -0
- package/.codex/agents/sop-extractor.toml +3 -0
- package/.codex/agents/source-hunter.toml +3 -0
- package/.codex/agents/sprint-lead.toml +3 -0
- package/.codex/agents/squad-assembler.toml +3 -0
- package/.codex/agents/squad-creator.toml +3 -0
- package/.codex/agents/storytelling-orqx.toml +3 -0
- package/.codex/agents/swarm-orqx.toml +3 -0
- package/.codex/agents/threat-analyst.toml +3 -0
- package/.codex/agents/threejs-architect.toml +3 -0
- package/.codex/agents/trend-forecaster.toml +3 -0
- package/.codex/agents/ux-design-expert.toml +3 -0
- package/.codex/agents/ux-designer.toml +3 -0
- package/.codex/agents/yvon-chouinard.toml +3 -0
- package/.codex/catalog.json +19 -4
- package/.codex/command-registry.json +94 -0
- package/.codex/config.toml +8 -0
- package/.codex/delegation-matrix.json +39 -25
- package/.codex/delegation-parity.json +46 -41
- package/.codex/hooks/claude-compat.cjs +547 -0
- package/.codex/hooks.json +123 -0
- package/.codex/scripts/resolve-codex-agent.js +30 -1
- package/.codex/scripts/resolve-codex-workflow.js +283 -0
- package/.codex/scripts/sinapse-codex.js +309 -0
- package/.codex/scripts/sync-codex-native.js +614 -0
- package/.codex/scripts/validate-codex-native.js +287 -0
- package/.codex/skills/react-bits-frontend/SKILL.md +66 -0
- package/.codex/skills/react-bits-frontend/agents/openai.yaml +4 -0
- package/.codex/skills/react-bits-frontend/references/corpus-map.md +29 -0
- package/.codex/skills/sinapse/SKILL.md +10 -0
- package/.codex/skills/sinapse-agent/SKILL.md +22 -0
- package/.codex/skills/sinapse-claude/SKILL.md +1 -1
- package/.codex/skills/sinapse-loop/SKILL.md +35 -0
- package/.codex/skills/sinapse-orqx/SKILL.md +33 -14
- package/.codex/skills/sinapse-spec-driven/SKILL.md +35 -0
- package/.codex/skills/snps/SKILL.md +10 -0
- package/.codex/skills/snps-orqx/SKILL.md +10 -0
- package/.sinapse-ai/data/entity-registry.yaml +57 -31
- package/.sinapse-ai/install-manifest.yaml +5 -5
- package/.sinapse-ai/product/templates/statusline/agent-badges.json +37 -37
- package/AGENTS.md +5 -4
- package/CHANGELOG.md +27 -3
- package/README.en.md +1 -1
- package/README.md +25 -10
- package/bin/commands/install.js +56 -41
- package/bin/commands/uninstall.js +57 -4
- package/bin/commands/update.js +32 -21
- package/bin/lib/command-generator.js +25 -3
- package/bin/lib/global-provider-adapters.js +136 -0
- package/bin/utils/validate-publish.js +43 -10
- package/docs/framework/codex-parity/codex-native-runtime-v2.md +230 -0
- package/docs/framework/codex-parity/codex-workflow-task-parity.md +21 -7
- package/docs/framework/react-bits/animations.md +49 -0
- package/docs/framework/react-bits/audit-findings.md +103 -0
- package/docs/framework/react-bits/backgrounds.md +63 -0
- package/docs/framework/react-bits/catalog-summary.json +61 -0
- package/docs/framework/react-bits/components.md +58 -0
- package/docs/framework/react-bits/implementation-playbook.md +161 -0
- package/docs/framework/react-bits/index.md +130 -0
- package/docs/framework/react-bits/inventory.json +9333 -0
- package/docs/framework/react-bits/text-animations.md +41 -0
- package/docs/framework/software-engineering-applicability.md +31 -0
- package/docs/getting-started.md +6 -2
- package/docs/installation/README.md +2 -2
- package/package.json +18 -5
- package/packages/engineering-applicability/fixtures.json +52 -0
- package/packages/engineering-applicability/index.js +150 -0
- package/packages/installer/src/installer/sinapse-ai-installer.js +87 -2
- package/packages/installer/src/updater/index.js +34 -13
- package/packages/installer/src/wizard/feedback.js +1 -1
- package/packages/installer/src/wizard/ide-config-generator.js +18 -0
- package/packages/installer/src/wizard/index.js +101 -74
- package/scripts/gen-agent-badges.js +17 -1
- package/scripts/release-readiness.js +9 -3
- package/scripts/research/generate-react-bits-catalog.mjs +206 -0
- package/scripts/sync-provider-adapters.js +203 -0
- package/scripts/validate-provider-adapters.js +127 -0
- package/squads/squad-animations/knowledge-base/react-bits-operational-guide.md +43 -0
- package/squads/squad-animations/squad.yaml +10 -5
- package/squads/squad-animations/tasks/orchestrate-react-bits-frontend.md +60 -0
|
@@ -20,10 +20,11 @@ const fs = require('fs-extra');
|
|
|
20
20
|
const path = require('path');
|
|
21
21
|
const os = require('os');
|
|
22
22
|
const https = require('https');
|
|
23
|
-
const {
|
|
23
|
+
const { execFileSync } = require('child_process');
|
|
24
24
|
const { hashFile, hashesMatch } = require('../installer/file-hasher');
|
|
25
25
|
const { PostInstallValidator, formatReport: formatValidationReport } = require('../installer/post-install-validator');
|
|
26
26
|
const { _testing: { installGlobalAgents } } = require('../wizard/index');
|
|
27
|
+
const { installSinapseCore } = require('../installer/sinapse-ai-installer');
|
|
27
28
|
|
|
28
29
|
/**
|
|
29
30
|
* Update status types
|
|
@@ -601,20 +602,35 @@ class SINAPSEUpdater {
|
|
|
601
602
|
|
|
602
603
|
try {
|
|
603
604
|
// Use npm to update the package
|
|
604
|
-
const
|
|
605
|
-
this.log(`Running: ${
|
|
605
|
+
const packageSpec = `sinapse-ai@${targetVersion}`;
|
|
606
|
+
this.log(`Running: npm install ${packageSpec} --save-exact`);
|
|
606
607
|
|
|
607
|
-
|
|
608
|
+
execFileSync(process.platform === 'win32' ? 'npm.cmd' : 'npm', ['install', packageSpec, '--save-exact'], {
|
|
608
609
|
cwd: this.projectRoot,
|
|
609
610
|
stdio: this.options.verbose ? 'inherit' : 'pipe',
|
|
610
611
|
timeout: 120000, // 2 minutes
|
|
611
612
|
});
|
|
612
613
|
|
|
613
|
-
|
|
614
|
-
|
|
614
|
+
const recordedProviders = Array.isArray(this.versionInfo?.providers)
|
|
615
|
+
? this.versionInfo.providers
|
|
616
|
+
: [];
|
|
617
|
+
const includeClaude = recordedProviders.length > 0
|
|
618
|
+
? recordedProviders.includes('claude-code')
|
|
619
|
+
: fs.existsSync(path.join(this.projectRoot, '.claude', 'skill-manifest.json'));
|
|
620
|
+
const includeCodex = recordedProviders.length > 0
|
|
621
|
+
? recordedProviders.includes('codex')
|
|
622
|
+
: fs.existsSync(path.join(this.projectRoot, '.codex', 'catalog.json'))
|
|
623
|
+
&& fs.existsSync(path.join(this.projectRoot, '.agents', 'skills', 'sinapse-agent', 'SKILL.md'));
|
|
624
|
+
const delivery = await installSinapseCore({
|
|
625
|
+
targetDir: this.projectRoot,
|
|
626
|
+
includeClaude,
|
|
627
|
+
includeCodex,
|
|
628
|
+
overwriteManagedAdapters: true,
|
|
629
|
+
});
|
|
630
|
+
if (!delivery.success) throw new Error(`Framework payload reconciliation failed: ${delivery.errors.join('; ')}`);
|
|
615
631
|
|
|
616
|
-
|
|
617
|
-
|
|
632
|
+
result.success = true;
|
|
633
|
+
result.filesUpdated = 1 + delivery.installedFiles.length;
|
|
618
634
|
|
|
619
635
|
return result;
|
|
620
636
|
} catch (error) {
|
|
@@ -637,6 +653,7 @@ class SINAPSEUpdater {
|
|
|
637
653
|
installedAt: new Date().toISOString(),
|
|
638
654
|
updatedAt: new Date().toISOString(),
|
|
639
655
|
mode: this.versionInfo?.mode || 'project-development',
|
|
656
|
+
providers: Array.isArray(this.versionInfo?.providers) ? this.versionInfo.providers : [],
|
|
640
657
|
fileHashes: {}, // Will be populated by file copy
|
|
641
658
|
};
|
|
642
659
|
|
|
@@ -764,14 +781,14 @@ class SINAPSEUpdater {
|
|
|
764
781
|
const installResult = await installGlobalAgents();
|
|
765
782
|
result.installed = installResult.count;
|
|
766
783
|
if (installResult.errors.length > 0) {
|
|
767
|
-
console.log(` Agent install warnings: ${installResult.errors.join(', ')}`);
|
|
784
|
+
console.log(` Agent install warnings: ${sanitizeLogText(installResult.errors.join(', '))}`);
|
|
768
785
|
}
|
|
769
786
|
|
|
770
787
|
result.migrated = true;
|
|
771
788
|
console.log(` v6 migration complete: ${result.removed} removed, ${result.installed} installed`);
|
|
772
789
|
} catch (error) {
|
|
773
790
|
// Migration errors should not block the update
|
|
774
|
-
console.log(` v6 migration warning: ${error.message}`);
|
|
791
|
+
console.log(` v6 migration warning: ${sanitizeLogText(error.message)}`);
|
|
775
792
|
}
|
|
776
793
|
|
|
777
794
|
return result;
|
|
@@ -788,13 +805,17 @@ class SINAPSEUpdater {
|
|
|
788
805
|
*/
|
|
789
806
|
log(message) {
|
|
790
807
|
if (this.options.verbose) {
|
|
791
|
-
|
|
792
|
-
const sanitized = String(message).replace(/[\x00-\x08\x0B-\x1F\x7F]/g, '');
|
|
808
|
+
const sanitized = sanitizeLogText(message);
|
|
793
809
|
console.log(`[SINAPSEUpdater] ${sanitized}`);
|
|
794
810
|
}
|
|
795
811
|
}
|
|
796
812
|
}
|
|
797
813
|
|
|
814
|
+
function sanitizeLogText(value) {
|
|
815
|
+
// eslint-disable-next-line no-control-regex
|
|
816
|
+
return String(value).replace(/[\x00-\x1F\x7F\u2028\u2029]/g, ' ');
|
|
817
|
+
}
|
|
818
|
+
|
|
798
819
|
/**
|
|
799
820
|
* Format update check result for console
|
|
800
821
|
*
|
|
@@ -920,5 +941,5 @@ module.exports = {
|
|
|
920
941
|
FileAction,
|
|
921
942
|
formatCheckResult,
|
|
922
943
|
formatUpdateResult,
|
|
944
|
+
sanitizeLogText,
|
|
923
945
|
};
|
|
924
|
-
|
|
@@ -22,7 +22,7 @@ const { t } = require('./i18n');
|
|
|
22
22
|
* Do NOT inline these numbers elsewhere in this file — reference `ECOSYSTEM`
|
|
23
23
|
* so there is exactly one place to update when `sync:counts` changes.
|
|
24
24
|
*/
|
|
25
|
-
const ECOSYSTEM = Object.freeze({ squads: 17, agents: 172, tasks: '1,
|
|
25
|
+
const ECOSYSTEM = Object.freeze({ squads: 17, agents: 172, tasks: '1,411' });
|
|
26
26
|
|
|
27
27
|
/**
|
|
28
28
|
* Create and start a spinner with SINAPSE styling
|
|
@@ -544,6 +544,9 @@ async function copyClaudeHooksFolder(projectRoot) {
|
|
|
544
544
|
'enforce-story-gate.cjs',
|
|
545
545
|
'doc-first-gate.cjs',
|
|
546
546
|
'enforce-framework-boundary.cjs',
|
|
547
|
+
'enforce-permission-mode.cjs',
|
|
548
|
+
'enforce-nsn-guard.cjs',
|
|
549
|
+
'verify-packages.cjs',
|
|
547
550
|
'secret-scanning.cjs',
|
|
548
551
|
'write-path-validation.cjs',
|
|
549
552
|
// Frente 4.3 — DORA + OTel telemetry hooks (STREAM A)
|
|
@@ -619,6 +622,21 @@ const HOOK_EVENT_MAP = {
|
|
|
619
622
|
matcher: 'Write|Edit',
|
|
620
623
|
timeout: 5,
|
|
621
624
|
},
|
|
625
|
+
'enforce-permission-mode.cjs': {
|
|
626
|
+
event: 'PreToolUse',
|
|
627
|
+
matcher: 'Write|Edit|Bash',
|
|
628
|
+
timeout: 5,
|
|
629
|
+
},
|
|
630
|
+
'enforce-nsn-guard.cjs': {
|
|
631
|
+
event: 'PreToolUse',
|
|
632
|
+
matcher: 'Write|Edit',
|
|
633
|
+
timeout: 5,
|
|
634
|
+
},
|
|
635
|
+
'verify-packages.cjs': {
|
|
636
|
+
event: 'PreToolUse',
|
|
637
|
+
matcher: 'Bash',
|
|
638
|
+
timeout: 10,
|
|
639
|
+
},
|
|
622
640
|
'write-path-validation.cjs': {
|
|
623
641
|
event: 'PreToolUse',
|
|
624
642
|
matcher: 'Write|Edit',
|
|
@@ -88,6 +88,11 @@ async function writeClaudeSettings(language, projectDir = process.cwd()) {
|
|
|
88
88
|
}
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
+
async function writeProviderLanguageSettings({ selectedLLM, language, projectDir = process.cwd() }) {
|
|
92
|
+
if (!language || !shouldConfigureClaude(selectedLLM)) return false;
|
|
93
|
+
return writeClaudeSettings(language, projectDir);
|
|
94
|
+
}
|
|
95
|
+
|
|
91
96
|
/** Detect system locale and return wizard language code. */
|
|
92
97
|
function detectSystemLocale() {
|
|
93
98
|
try {
|
|
@@ -285,6 +290,14 @@ function llmLabel(selectedLLM) {
|
|
|
285
290
|
}
|
|
286
291
|
}
|
|
287
292
|
|
|
293
|
+
function shouldConfigureClaude(selectedLLM) {
|
|
294
|
+
return selectedLLM === 'claude-code' || selectedLLM === 'both';
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
function shouldConfigureCodex(selectedLLM) {
|
|
298
|
+
return selectedLLM === 'codex' || selectedLLM === 'both';
|
|
299
|
+
}
|
|
300
|
+
|
|
288
301
|
/**
|
|
289
302
|
* 18 orqx agent definitions to install globally (17 squad orqx + 1 master).
|
|
290
303
|
* Each entry maps agent-id to its squad directory name.
|
|
@@ -512,6 +525,7 @@ async function runWizard(options = {}) {
|
|
|
512
525
|
sinapseCoreResult = await installSinapseCore({
|
|
513
526
|
targetDir: process.cwd(),
|
|
514
527
|
includeCodex: (answers.selectedLLM || 'claude-code') !== 'claude-code',
|
|
528
|
+
includeClaude: (answers.selectedLLM || 'claude-code') !== 'codex',
|
|
515
529
|
onProgress: (_status) => {
|
|
516
530
|
// Silent progress - spinner handles feedback
|
|
517
531
|
},
|
|
@@ -557,7 +571,8 @@ async function runWizard(options = {}) {
|
|
|
557
571
|
|
|
558
572
|
// Install global orqx agent definitions to ~/.claude/agents/ (only for Claude Code)
|
|
559
573
|
const selectedLLM = answers.selectedLLM || 'claude-code';
|
|
560
|
-
|
|
574
|
+
const targetProjectRoot = process.cwd();
|
|
575
|
+
if (shouldConfigureClaude(selectedLLM)) {
|
|
561
576
|
console.log('\n🤖 ' + t('installingGlobalAgents'));
|
|
562
577
|
try {
|
|
563
578
|
const globalAgentsResult = await installGlobalAgents();
|
|
@@ -708,100 +723,106 @@ async function runWizard(options = {}) {
|
|
|
708
723
|
// Legacy per-squad IDE copy path removed; sync pipeline handles IDE propagation.
|
|
709
724
|
}
|
|
710
725
|
|
|
726
|
+
if (shouldConfigureClaude(selectedLLM)) {
|
|
711
727
|
// Story INS-4.3: Wire settings.json boundary generator after .sinapse-ai/ copy
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
728
|
+
console.log('\n🔒 ' + t('generatingBoundaryRules'));
|
|
729
|
+
try {
|
|
730
|
+
const settingsGenerator = require('../../../../.sinapse-ai/infrastructure/scripts/generate-settings-json');
|
|
731
|
+
settingsGenerator.generate(process.cwd());
|
|
732
|
+
const settingsContent = await fse.readFile(path.join(process.cwd(), '.claude', 'settings.json'), 'utf8').catch(() => '{}');
|
|
733
|
+
const settingsParsed = JSON.parse(settingsContent);
|
|
734
|
+
const denyCount = (settingsParsed.permissions && settingsParsed.permissions.deny) ? settingsParsed.permissions.deny.length : 0;
|
|
735
|
+
console.log(`✅ settings.json: generated (${denyCount} deny rules)`);
|
|
736
|
+
answers.settingsGenerated = true;
|
|
737
|
+
answers.settingsDenyCount = denyCount;
|
|
738
|
+
} catch (error) {
|
|
739
|
+
console.warn(`⚠️ settings.json generation failed: ${error.message} — run 'sinapse doctor --fix' post-install`);
|
|
740
|
+
answers.settingsGenerated = false;
|
|
741
|
+
}
|
|
726
742
|
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
743
|
+
// Story INS-4.3: Copy skills (Gap #11)
|
|
744
|
+
console.log('\n📚 ' + t('copyingSkills'));
|
|
745
|
+
try {
|
|
746
|
+
const skillsResult = await copySkillFiles(process.cwd());
|
|
747
|
+
if (skillsResult.skipped) {
|
|
748
|
+
console.log(' ℹ️ Skills: source not found (skipped)');
|
|
749
|
+
} else {
|
|
750
|
+
console.log(`✅ Skills: ${skillsResult.count} copied`);
|
|
751
|
+
}
|
|
752
|
+
answers.skillsCopied = skillsResult.count;
|
|
753
|
+
answers.skillsSkipped = skillsResult.skipped;
|
|
754
|
+
} catch (error) {
|
|
755
|
+
console.warn(`⚠️ Skills copy failed: ${error.message}`);
|
|
756
|
+
answers.skillsCopied = 0;
|
|
735
757
|
}
|
|
736
|
-
answers.skillsCopied = skillsResult.count;
|
|
737
|
-
answers.skillsSkipped = skillsResult.skipped;
|
|
738
|
-
} catch (error) {
|
|
739
|
-
console.warn(`⚠️ Skills copy failed: ${error.message}`);
|
|
740
|
-
answers.skillsCopied = 0;
|
|
741
|
-
}
|
|
742
758
|
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
759
|
+
// Story INS-4.3: Copy extra commands (Gap #12)
|
|
760
|
+
console.log('\n📋 ' + t('copyingExtraCommands'));
|
|
761
|
+
try {
|
|
762
|
+
const commandsResult = await copyExtraCommandFiles(process.cwd());
|
|
763
|
+
if (commandsResult.skipped) {
|
|
764
|
+
console.log(' ℹ️ Extra commands: source not found (skipped)');
|
|
765
|
+
} else {
|
|
766
|
+
console.log(`✅ Commands: ${commandsResult.count} extras copied`);
|
|
767
|
+
}
|
|
768
|
+
answers.extraCommandsCopied = commandsResult.count;
|
|
769
|
+
answers.extraCommandsSkipped = commandsResult.skipped;
|
|
770
|
+
} catch (error) {
|
|
771
|
+
console.warn(`⚠️ Extra commands copy failed: ${error.message}`);
|
|
772
|
+
answers.extraCommandsCopied = 0;
|
|
751
773
|
}
|
|
752
|
-
answers.extraCommandsCopied = commandsResult.count;
|
|
753
|
-
answers.extraCommandsSkipped = commandsResult.skipped;
|
|
754
|
-
} catch (error) {
|
|
755
|
-
console.warn(`⚠️ Extra commands copy failed: ${error.message}`);
|
|
756
|
-
answers.extraCommandsCopied = 0;
|
|
757
|
-
}
|
|
758
774
|
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
const savedCwd = process.cwd();
|
|
763
|
-
try {
|
|
764
|
-
process.chdir(targetProjectRoot);
|
|
765
|
-
await commandSync({ quiet: true });
|
|
766
|
-
answers.ideSyncStatus = 'synced';
|
|
767
|
-
console.log('✅ IDE sync: synced');
|
|
768
|
-
|
|
769
|
-
// Validate sync output (commandValidate does not support quiet — suppress its console output)
|
|
770
|
-
const _origLog = console.log;
|
|
771
|
-
console.log = () => {};
|
|
775
|
+
// Story INS-4.5: IDE Sync — transform agents/skills/commands for each configured IDE
|
|
776
|
+
console.log('\n🔄 ' + t('runningIdeSync'));
|
|
777
|
+
const savedCwd = process.cwd();
|
|
772
778
|
try {
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
779
|
+
process.chdir(targetProjectRoot);
|
|
780
|
+
await commandSync({ quiet: true });
|
|
781
|
+
answers.ideSyncStatus = 'synced';
|
|
782
|
+
console.log('✅ IDE sync: synced');
|
|
783
|
+
|
|
784
|
+
// Validate sync output (commandValidate does not support quiet — suppress its console output)
|
|
785
|
+
const _origLog = console.log;
|
|
786
|
+
console.log = () => {};
|
|
787
|
+
try {
|
|
788
|
+
await commandValidate({ quiet: true });
|
|
789
|
+
answers.ideSyncValidation = 'pass';
|
|
790
|
+
} catch {
|
|
791
|
+
answers.ideSyncValidation = 'drift';
|
|
792
|
+
} finally {
|
|
793
|
+
console.log = _origLog;
|
|
794
|
+
}
|
|
795
|
+
if (answers.ideSyncValidation === 'drift') {
|
|
796
|
+
console.warn('⚠️ ' + t('ideSyncDriftWarning'));
|
|
797
|
+
}
|
|
798
|
+
} catch (syncError) {
|
|
799
|
+
console.warn(`⚠️ IDE sync failed: ${syncError.message} — run 'sinapse doctor --fix' post-install`);
|
|
800
|
+
answers.ideSyncStatus = 'failed';
|
|
801
|
+
answers.ideSyncValidation = 'skipped';
|
|
777
802
|
} finally {
|
|
778
|
-
|
|
779
|
-
}
|
|
780
|
-
if (answers.ideSyncValidation === 'drift') {
|
|
781
|
-
console.warn('⚠️ ' + t('ideSyncDriftWarning'));
|
|
803
|
+
process.chdir(savedCwd);
|
|
782
804
|
}
|
|
783
|
-
|
|
784
|
-
console.warn(`⚠️ IDE sync failed: ${syncError.message} — run 'sinapse doctor --fix' post-install`);
|
|
785
|
-
answers.ideSyncStatus = 'failed';
|
|
786
|
-
answers.ideSyncValidation = 'skipped';
|
|
787
|
-
} finally {
|
|
788
|
-
process.chdir(savedCwd);
|
|
805
|
+
|
|
789
806
|
}
|
|
790
807
|
|
|
791
808
|
// Codex local-first sync: the ide-sync above drives claude-code only now,
|
|
792
809
|
// so .codex/agents + .codex/skills are regenerated here from the canonical
|
|
793
810
|
// source (the static .codex payload — scripts/tasks/JSONs — was already
|
|
794
811
|
// copied by installSinapseCore when Codex was selected). Codex installs only.
|
|
795
|
-
if (selectedLLM
|
|
812
|
+
if (shouldConfigureCodex(selectedLLM)) {
|
|
796
813
|
console.log('\n🔄 ' + t('runningCodexSync'));
|
|
797
814
|
const savedCwdCodex = process.cwd();
|
|
798
815
|
try {
|
|
799
816
|
const { syncCodexLocalFirst } = require('../../../../.sinapse-ai/infrastructure/scripts/sync-codex-local-first');
|
|
817
|
+
const { syncCodexNativeAgents } = require('../../../../.codex/scripts/sync-codex-native');
|
|
800
818
|
process.chdir(targetProjectRoot);
|
|
801
819
|
const codexResult = syncCodexLocalFirst({ projectRoot: targetProjectRoot, quiet: true });
|
|
820
|
+
const nativeResult = codexResult.ok
|
|
821
|
+
? syncCodexNativeAgents(targetProjectRoot)
|
|
822
|
+
: { total: 0 };
|
|
802
823
|
answers.codexSyncStatus = codexResult.ok ? 'synced' : 'failed';
|
|
803
824
|
const m = codexResult.metrics || {};
|
|
804
|
-
console.log(`✅ Codex sync: ${codexResult.ok ? 'synced' : 'issues'} (${m.codexAgents || 0} agents, ${m.codexSkills || 0} skills)`);
|
|
825
|
+
console.log(`✅ Codex sync: ${codexResult.ok ? 'synced' : 'issues'} (${m.codexAgents || 0} adapters, ${nativeResult.total || 0} native agents, ${m.codexSkills || 0} compatibility skills)`);
|
|
805
826
|
} catch (codexErr) {
|
|
806
827
|
console.warn(`⚠️ Codex sync failed: ${codexErr.message} — run 'npm run sync:ide:codex' post-install`);
|
|
807
828
|
answers.codexSyncStatus = 'failed';
|
|
@@ -877,8 +898,11 @@ async function runWizard(options = {}) {
|
|
|
877
898
|
});
|
|
878
899
|
|
|
879
900
|
// Story ACT-12: Write language to Claude Code settings.json
|
|
880
|
-
if (answers.language) {
|
|
881
|
-
const langWritten = await
|
|
901
|
+
if (answers.language && shouldConfigureClaude(selectedLLM)) {
|
|
902
|
+
const langWritten = await writeProviderLanguageSettings({
|
|
903
|
+
selectedLLM,
|
|
904
|
+
language: answers.language,
|
|
905
|
+
});
|
|
882
906
|
if (langWritten) {
|
|
883
907
|
console.log(' - Language written to .claude/settings.json');
|
|
884
908
|
} else {
|
|
@@ -1266,6 +1290,7 @@ module.exports = {
|
|
|
1266
1290
|
// Exported for testing
|
|
1267
1291
|
_testing: {
|
|
1268
1292
|
writeClaudeSettings,
|
|
1293
|
+
writeProviderLanguageSettings,
|
|
1269
1294
|
getExistingLanguage,
|
|
1270
1295
|
LANGUAGE_MAP,
|
|
1271
1296
|
detectProjectType,
|
|
@@ -1274,6 +1299,8 @@ module.exports = {
|
|
|
1274
1299
|
detectSystemLocale,
|
|
1275
1300
|
llmToIDEs,
|
|
1276
1301
|
llmLabel,
|
|
1302
|
+
shouldConfigureClaude,
|
|
1303
|
+
shouldConfigureCodex,
|
|
1277
1304
|
installGlobalAgents,
|
|
1278
1305
|
buildAgentTemplate,
|
|
1279
1306
|
generateAgentsMd,
|
|
@@ -96,8 +96,24 @@ for (const b of badges) if (!b.icon) { b.icon = squadIcon[b.squad] || '◆'; b.h
|
|
|
96
96
|
// The badge uses only the FIRST name (never the full name).
|
|
97
97
|
for (const b of badges) b.name = b.name.split(/\s+/)[0];
|
|
98
98
|
|
|
99
|
+
// Some source .md files carry the emoji as a LITERAL escape sequence
|
|
100
|
+
// ("\U0001F9E0" as text). Decode at generation time so every consumer
|
|
101
|
+
// (statusline, selo block) receives the real glyph — never garbage.
|
|
102
|
+
function decodeEmoji(e) {
|
|
103
|
+
if (typeof e !== 'string' || !e) return e;
|
|
104
|
+
if (!e.includes('\\u') && !e.includes('\\U')) return e;
|
|
105
|
+
try {
|
|
106
|
+
const decoded = e
|
|
107
|
+
.replace(/\\U([0-9A-Fa-f]{8})/g, (_, h) => String.fromCodePoint(parseInt(h, 16)))
|
|
108
|
+
.replace(/\\u([0-9A-Fa-f]{4})/g, (_, h) => String.fromCharCode(parseInt(h, 16)));
|
|
109
|
+
return decoded || e;
|
|
110
|
+
} catch {
|
|
111
|
+
return e;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
99
115
|
const out = {};
|
|
100
|
-
for (const b of badges) out[b.id] = { emoji: b.icon, area: b.area, name: b.name };
|
|
116
|
+
for (const b of badges) out[b.id] = { emoji: decodeEmoji(b.icon), area: b.area, name: b.name };
|
|
101
117
|
fs.writeFileSync(OUT, JSON.stringify(out, null, 2));
|
|
102
118
|
|
|
103
119
|
const generic = badges.filter((b) => b.icon === '◆').length;
|
|
@@ -48,6 +48,9 @@ const GATES = [
|
|
|
48
48
|
{ id: 'parity', name: 'Cross-IDE parity (10.18)', cmd: ['npm', 'run', 'validate:parity', '--silent'] },
|
|
49
49
|
{ id: 'manifest', name: 'Install manifest', cmd: ['npm', 'run', 'validate:manifest', '--silent'] },
|
|
50
50
|
{ id: 'install-docs', name: 'Install docs', cmd: ['npm', 'run', 'validate:docs', '--silent'] },
|
|
51
|
+
{ id: 'providers', name: 'Native providers', cmd: ['npm', 'run', 'validate:providers', '--silent'] },
|
|
52
|
+
{ id: 'engineering', name: 'Engineering applicability', cmd: ['npm', 'run', 'validate:engineering-applicability', '--silent'] },
|
|
53
|
+
{ id: 'publish', name: 'Publish safety', cmd: ['npm', 'run', 'validate:publish', '--silent'] },
|
|
51
54
|
];
|
|
52
55
|
|
|
53
56
|
function parseArgs(argv = process.argv.slice(2)) {
|
|
@@ -60,10 +63,13 @@ function parseArgs(argv = process.argv.slice(2)) {
|
|
|
60
63
|
|
|
61
64
|
function runGate(gate) {
|
|
62
65
|
const start = Date.now();
|
|
63
|
-
const
|
|
66
|
+
const npmCli = gate.cmd[0] === 'npm' ? process.env.npm_execpath : null;
|
|
67
|
+
const executable = npmCli ? process.execPath : gate.cmd[0];
|
|
68
|
+
const args = npmCli ? [npmCli, ...gate.cmd.slice(1)] : gate.cmd.slice(1);
|
|
69
|
+
const result = spawnSync(executable, args, {
|
|
64
70
|
cwd: PROJECT_ROOT,
|
|
65
71
|
encoding: 'utf8',
|
|
66
|
-
shell:
|
|
72
|
+
shell: false,
|
|
67
73
|
});
|
|
68
74
|
const elapsed = Date.now() - start;
|
|
69
75
|
return {
|
|
@@ -72,7 +78,7 @@ function runGate(gate) {
|
|
|
72
78
|
status: result.status === 0 ? 'PASS' : 'FAIL',
|
|
73
79
|
exitCode: result.status,
|
|
74
80
|
elapsedMs: elapsed,
|
|
75
|
-
stderr: result.stderr ? result.stderr.split('\n').slice(-5).join('\n') : '',
|
|
81
|
+
stderr: result.stderr ? result.stderr.split('\n').slice(-5).join('\n') : (result.error?.message || ''),
|
|
76
82
|
};
|
|
77
83
|
}
|
|
78
84
|
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { execFileSync } from 'node:child_process';
|
|
4
|
+
import { existsSync, readdirSync, readFileSync, writeFileSync, mkdirSync, statSync } from 'node:fs';
|
|
5
|
+
import { basename, join, resolve } from 'node:path';
|
|
6
|
+
import { pathToFileURL } from 'node:url';
|
|
7
|
+
|
|
8
|
+
const args = process.argv.slice(2);
|
|
9
|
+
const valueOf = flag => {
|
|
10
|
+
const index = args.indexOf(flag);
|
|
11
|
+
return index === -1 ? undefined : args[index + 1];
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
const repo = resolve(valueOf('--repo') || '../.tmp-react-bits-research');
|
|
15
|
+
const output = resolve(valueOf('--output') || 'docs/framework/react-bits');
|
|
16
|
+
const infoPath = join(repo, 'src', 'constants', 'Information.js');
|
|
17
|
+
|
|
18
|
+
if (!existsSync(join(repo, '.git')) || !existsSync(infoPath)) {
|
|
19
|
+
throw new Error(`React Bits checkout not found or incomplete: ${repo}`);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const sha = execFileSync('git', ['-C', repo, 'rev-parse', 'HEAD'], { encoding: 'utf8' }).trim();
|
|
23
|
+
const commitDate = execFileSync('git', ['-C', repo, 'show', '-s', '--format=%cI', 'HEAD'], {
|
|
24
|
+
encoding: 'utf8'
|
|
25
|
+
}).trim();
|
|
26
|
+
const { componentMetadata, VARIANTS } = await import(`${pathToFileURL(infoPath).href}?sha=${sha}`);
|
|
27
|
+
|
|
28
|
+
if (!componentMetadata || !Array.isArray(VARIANTS) || VARIANTS.length !== 4) {
|
|
29
|
+
throw new Error('Required React Bits metadata exports are missing or changed');
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const categories = ['Animations', 'TextAnimations', 'Components', 'Backgrounds'];
|
|
33
|
+
const categorySlugs = {
|
|
34
|
+
Animations: 'animations',
|
|
35
|
+
TextAnimations: 'text-animations',
|
|
36
|
+
Components: 'components',
|
|
37
|
+
Backgrounds: 'backgrounds'
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
const walk = directory =>
|
|
41
|
+
readdirSync(directory, { withFileTypes: true }).flatMap(entry => {
|
|
42
|
+
const path = join(directory, entry.name);
|
|
43
|
+
return entry.isDirectory() ? walk(path) : [path];
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
const codeMetadataFiles = walk(join(repo, 'src', 'constants', 'code')).filter(path => path.endsWith('.js'));
|
|
47
|
+
const codeMetadata = new Map();
|
|
48
|
+
|
|
49
|
+
for (const path of codeMetadataFiles) {
|
|
50
|
+
const source = readFileSync(path, 'utf8');
|
|
51
|
+
const sourceMatch = source.match(/@(?:content|ts-default)\/([^/]+)\/([^/]+)\//);
|
|
52
|
+
if (!sourceMatch) continue;
|
|
53
|
+
const dependencyMatch = source.match(/dependencies\s*:\s*([`'"])([\s\S]*?)\1/);
|
|
54
|
+
const dependencies = dependencyMatch
|
|
55
|
+
? dependencyMatch[2].replace(/^\s*(?:npm|pnpm|yarn|bun)\s+(?:i|install|add)\s+/, '').trim()
|
|
56
|
+
: '';
|
|
57
|
+
codeMetadata.set(`${sourceMatch[1]}/${sourceMatch[2]}`.toLowerCase(), { dependencies, path });
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const findComponentDirectory = (category, name) => {
|
|
61
|
+
const root = join(repo, 'src', 'ts-default', category);
|
|
62
|
+
const match = readdirSync(root, { withFileTypes: true }).find(
|
|
63
|
+
entry => entry.isDirectory() && entry.name.toLowerCase() === name.toLowerCase()
|
|
64
|
+
);
|
|
65
|
+
if (!match) throw new Error(`Missing TS source directory for ${category}/${name}`);
|
|
66
|
+
return join(root, match.name);
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
const extractProps = source => {
|
|
70
|
+
const blocks = [];
|
|
71
|
+
const declarations = /(?:type|interface)\s+\w*Props\w*(?:\s+extends[^\{]+)?\s*(?:=\s*)?\{/g;
|
|
72
|
+
for (const match of source.matchAll(declarations)) {
|
|
73
|
+
let depth = 1;
|
|
74
|
+
let cursor = match.index + match[0].length;
|
|
75
|
+
const start = cursor;
|
|
76
|
+
while (cursor < source.length && depth > 0) {
|
|
77
|
+
if (source[cursor] === '{') depth += 1;
|
|
78
|
+
if (source[cursor] === '}') depth -= 1;
|
|
79
|
+
cursor += 1;
|
|
80
|
+
}
|
|
81
|
+
blocks.push(source.slice(start, cursor - 1));
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const props = new Set();
|
|
85
|
+
for (const block of blocks) {
|
|
86
|
+
for (const line of block.split('\n')) {
|
|
87
|
+
const match = line.match(/^\s*(?:readonly\s+)?([A-Za-z_$][\w$]*)\??\s*:/);
|
|
88
|
+
if (match) props.add(match[1]);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return [...props];
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
const escapeCell = value => String(value || '').replaceAll('|', '\\|').replaceAll('\n', ' ');
|
|
95
|
+
const entries = Object.entries(componentMetadata).map(([key, metadata]) => {
|
|
96
|
+
const directory = findComponentDirectory(metadata.category, metadata.name);
|
|
97
|
+
const sourceFile = readdirSync(directory).find(file => file.endsWith('.tsx'));
|
|
98
|
+
if (!sourceFile) throw new Error(`Missing TSX source for ${key}`);
|
|
99
|
+
const source = readFileSync(join(directory, sourceFile), 'utf8');
|
|
100
|
+
const demoPath = join(repo, 'src', 'demo', metadata.category, `${metadata.name}Demo.jsx`);
|
|
101
|
+
const demo = existsSync(demoPath) ? readFileSync(demoPath, 'utf8') : '';
|
|
102
|
+
const demoProps = [...demo.matchAll(/\bname\s*:\s*['"]([^'"]+)['"]/g)].map(match => match[1]);
|
|
103
|
+
const props = [...new Set(demoProps.length ? demoProps : extractProps(source))];
|
|
104
|
+
const code = codeMetadata.get(key.toLowerCase()) || codeMetadata.get(
|
|
105
|
+
`${metadata.category}/${basename(directory)}`.toLowerCase()
|
|
106
|
+
);
|
|
107
|
+
if (!code) throw new Error(`Missing code metadata for ${key}`);
|
|
108
|
+
|
|
109
|
+
const variantConfig = {
|
|
110
|
+
'JS-CSS': { root: 'content', extension: 'jsx' },
|
|
111
|
+
'JS-TW': { root: 'tailwind', extension: 'jsx' },
|
|
112
|
+
'TS-CSS': { root: 'ts-default', extension: 'tsx' },
|
|
113
|
+
'TS-TW': { root: 'ts-tailwind', extension: 'tsx' }
|
|
114
|
+
};
|
|
115
|
+
const declaredVariants = metadata.variants || VARIANTS;
|
|
116
|
+
const variants = Object.fromEntries(declaredVariants.map(variant => {
|
|
117
|
+
const config = variantConfig[variant];
|
|
118
|
+
const sourcePath = join(repo, 'src', config.root, metadata.category, basename(directory), `${basename(directory)}.${config.extension}`);
|
|
119
|
+
const registryPath = join(repo, 'public', 'r', `${metadata.name}-${variant}.json`);
|
|
120
|
+
if (!existsSync(sourcePath) || !existsSync(registryPath)) throw new Error(`Missing published variant ${key}/${variant}`);
|
|
121
|
+
const registry = JSON.parse(readFileSync(registryPath, 'utf8'));
|
|
122
|
+
const sourceBytes = statSync(sourcePath).size;
|
|
123
|
+
return [variant, {
|
|
124
|
+
source: sourcePath.slice(repo.length + 1).replaceAll('\\', '/'),
|
|
125
|
+
sourceBytes,
|
|
126
|
+
functional: sourceBytes > 0,
|
|
127
|
+
dependencies: registry.dependencies || [],
|
|
128
|
+
registryDependencies: registry.registryDependencies || []
|
|
129
|
+
}];
|
|
130
|
+
}));
|
|
131
|
+
|
|
132
|
+
return {
|
|
133
|
+
key,
|
|
134
|
+
...metadata,
|
|
135
|
+
documentedDependencies: code.dependencies ? code.dependencies.split(/\s+/).filter(Boolean) : [],
|
|
136
|
+
dependencies: [...new Set(Object.values(variants).flatMap(variant => variant.dependencies))],
|
|
137
|
+
props,
|
|
138
|
+
variants,
|
|
139
|
+
sourceDirectory: basename(directory),
|
|
140
|
+
sourceFile
|
|
141
|
+
};
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
mkdirSync(output, { recursive: true });
|
|
145
|
+
for (const category of categories) {
|
|
146
|
+
const list = entries.filter(entry => entry.category === category).sort((a, b) => a.name.localeCompare(b.name));
|
|
147
|
+
const lines = [
|
|
148
|
+
`# React Bits - ${category}`,
|
|
149
|
+
'',
|
|
150
|
+
`> Snapshot oficial: \`${sha}\` (${commitDate}). Total nesta categoria: **${list.length}**.`,
|
|
151
|
+
'',
|
|
152
|
+
'Cada item abaixo aponta para a documentacao e para o codigo TypeScript/CSS oficial fixado no commit pesquisado.',
|
|
153
|
+
'',
|
|
154
|
+
'| Componente | O que faz | Dependencias | Props publicas | Variantes |',
|
|
155
|
+
'|---|---|---|---|---|'
|
|
156
|
+
];
|
|
157
|
+
|
|
158
|
+
for (const entry of list) {
|
|
159
|
+
const sourceUrl = `https://github.com/DavidHDev/react-bits/tree/${sha}/src/ts-default/${entry.category}/${entry.sourceDirectory}`;
|
|
160
|
+
const label = `[${entry.name}](${entry.docsUrl}) ([fonte](${sourceUrl}))`;
|
|
161
|
+
const props = entry.props.length ? entry.props.map(prop => `\`${prop}\``).join(', ') : 'children / DOM props';
|
|
162
|
+
const variantStatus = Object.entries(entry.variants)
|
|
163
|
+
.map(([variant, details]) => details.functional ? variant : `${variant} (VAZIA no upstream)`)
|
|
164
|
+
.join(', ');
|
|
165
|
+
const dependencies = entry.dependencies.length ? entry.dependencies.join(' ') : 'none';
|
|
166
|
+
lines.push(
|
|
167
|
+
`| ${label} | ${escapeCell(entry.description)} | \`${escapeCell(dependencies)}\` | ${escapeCell(props)} | ${variantStatus} |`
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
lines.push('', '## Comandos por componente', '');
|
|
172
|
+
lines.push('Substituir `<Component>` pelo nome exato da primeira coluna:');
|
|
173
|
+
lines.push('', '```bash');
|
|
174
|
+
lines.push('npx shadcn@latest add @react-bits/<Component>-TS-TW');
|
|
175
|
+
lines.push('npx shadcn@latest add https://reactbits.dev/r/<Component>-TS-TW');
|
|
176
|
+
lines.push('npx jsrepo@latest add https://reactbits.dev/r/<Component>-TS-TW');
|
|
177
|
+
lines.push('```', '');
|
|
178
|
+
writeFileSync(join(output, `${categorySlugs[category]}.md`), `${lines.join('\n')}\n`);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
const dependencyCounts = new Map();
|
|
182
|
+
for (const entry of entries) {
|
|
183
|
+
const packages = entry.dependencies;
|
|
184
|
+
for (const packageName of packages) dependencyCounts.set(packageName, (dependencyCounts.get(packageName) || 0) + 1);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
const incompleteVariants = entries.flatMap(entry => Object.entries(entry.variants)
|
|
188
|
+
.filter(([, details]) => !details.functional)
|
|
189
|
+
.map(([variant, details]) => ({ component: entry.name, category: entry.category, variant, source: details.source })));
|
|
190
|
+
|
|
191
|
+
const summary = {
|
|
192
|
+
source: 'https://github.com/DavidHDev/react-bits',
|
|
193
|
+
sha,
|
|
194
|
+
commitDate,
|
|
195
|
+
total: entries.length,
|
|
196
|
+
categories: Object.fromEntries(categories.map(category => [category, entries.filter(item => item.category === category).length])),
|
|
197
|
+
variants: VARIANTS,
|
|
198
|
+
registryItems: entries.reduce((total, entry) => total + Object.keys(entry.variants).length, 0),
|
|
199
|
+
documentedProps: entries.reduce((total, entry) => total + entry.props.length, 0),
|
|
200
|
+
incompleteVariants,
|
|
201
|
+
dependencies: Object.fromEntries([...dependencyCounts.entries()].sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0])))
|
|
202
|
+
};
|
|
203
|
+
writeFileSync(join(output, 'catalog-summary.json'), `${JSON.stringify(summary, null, 2)}\n`);
|
|
204
|
+
writeFileSync(join(output, 'inventory.json'), `${JSON.stringify({ ...summary, components: entries }, null, 2)}\n`);
|
|
205
|
+
|
|
206
|
+
process.stdout.write(`${JSON.stringify(summary, null, 2)}\n`);
|