sinapse-ai 1.24.0 → 1.25.1
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/react-bits-frontend/SKILL.md +66 -0
- package/.agents/skills/react-bits-frontend/agents/openai.yaml +4 -0
- package/.agents/skills/react-bits-frontend/references/corpus-map.md +29 -0
- package/.agents/skills/sinapse/SKILL.md +10 -0
- package/.agents/skills/sinapse-agent/SKILL.md +22 -0
- package/{.codex → .agents}/skills/sinapse-claude/SKILL.md +1 -1
- package/.agents/skills/sinapse-loop/SKILL.md +35 -0
- package/.agents/skills/sinapse-orqx/SKILL.md +44 -0
- package/.agents/skills/sinapse-spec-driven/SKILL.md +35 -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/settings.json +170 -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 +20 -5
- 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 +304 -0
- package/.codex/scripts/sync-codex-native.js +581 -0
- package/.codex/scripts/validate-codex-native.js +277 -0
- package/.codex/tasks/onboard-sinapse-codex.md +1 -1
- package/.sinapse-ai/data/entity-registry.yaml +91 -39
- 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 +23 -7
- package/README.en.md +1 -1
- package/README.md +25 -10
- package/bin/cli.js +8 -1
- package/bin/commands/help.js +3 -2
- package/bin/commands/install.js +79 -53
- package/bin/commands/status.js +4 -3
- package/bin/commands/uninstall.js +247 -29
- package/bin/commands/update.js +38 -23
- package/bin/lib/command-generator.js +25 -3
- package/bin/lib/global-provider-adapters.js +199 -0
- package/bin/lib/provider-parity.js +22 -0
- package/bin/postinstall.js +11 -11
- package/bin/utils/validate-publish.js +43 -10
- package/docs/framework/codex-parity/codex-integration-process.md +6 -7
- package/docs/framework/codex-parity/codex-native-runtime-v2.md +230 -0
- package/docs/framework/codex-parity/codex-parity-program.md +4 -4
- package/docs/framework/codex-parity/codex-total-parity-orchestration-plan.md +1 -1
- 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/guides/codex-config.md +2 -2
- package/docs/guides/development-setup.md +1 -2
- package/docs/guides/ide-integration.md +6 -6
- package/docs/guides/quality-gates.md +2 -2
- package/docs/ide-integration.md +2 -2
- package/docs/installation/README.md +2 -2
- package/docs/installation/faq.md +1 -1
- package/docs/installation/troubleshooting.md +2 -2
- package/docs/installation/v4-quick-start.md +1 -1
- package/docs/pt/contributing.md +1 -1
- package/docs/pt/guides/development-setup.md +1 -2
- package/docs/pt/guides/quality-gates.md +2 -2
- package/docs/pt/ide-integration.md +6 -6
- package/docs/pt/installation/faq.md +1 -1
- package/docs/pt/installation/troubleshooting.md +2 -3
- package/docs/pt/installation/v4-quick-start.md +1 -2
- package/docs/pt/platforms/claude-code.md +4 -4
- package/docs/sinapse-agent-flows/analyst-system.md +1 -1
- package/docs/sinapse-agent-flows/architect-system.md +1 -1
- package/docs/sinapse-agent-flows/data-engineer-system.md +1 -1
- package/docs/sinapse-agent-flows/dev-system.md +1 -1
- package/docs/sinapse-agent-flows/pm-system.md +1 -1
- package/docs/sinapse-agent-flows/qa-system.md +1 -1
- package/docs/sinapse-agent-flows/sm-system.md +1 -1
- package/docs/sinapse-agent-flows/snps-orqx-system.md +1 -1
- package/docs/sinapse-agent-flows/squad-creator-system.md +2 -2
- package/docs/sinapse-agent-flows/ux-design-expert-system.md +1 -1
- package/package.json +37 -19
- package/packages/engineering-applicability/fixtures.json +52 -0
- package/packages/engineering-applicability/index.js +150 -0
- package/packages/installer/src/config/ide-configs.js +1 -1
- package/packages/installer/src/installer/sinapse-ai-installer.js +359 -2
- package/packages/installer/src/migrations/legacy-claude-agent-command-hashes.json +36 -0
- package/packages/installer/src/migrations/legacy-codex-native-skill-hashes.json +42 -0
- package/packages/installer/src/updater/index.js +51 -13
- package/packages/installer/src/wizard/feedback.js +1 -1
- package/packages/installer/src/wizard/ide-config-generator.js +22 -0
- package/packages/installer/src/wizard/index.js +106 -75
- 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-codex-command-registry.js +101 -0
- package/scripts/validate-provider-adapters.js +243 -0
- package/squads/claude-code-mastery/agents/skill-craftsman.md +2 -2
- package/squads/claude-code-mastery/knowledge-base/skill-creation-patterns.md +1 -1
- 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
- package/squads/squad-design/agents/ux-designer.md +1 -1
- package/.codex/skills/sinapse-orqx/SKILL.md +0 -25
- /package/{.codex → .agents}/skills/sinapse-analyst/SKILL.md +0 -0
- /package/{.codex → .agents}/skills/sinapse-animations/SKILL.md +0 -0
- /package/{.codex → .agents}/skills/sinapse-architect/SKILL.md +0 -0
- /package/{.codex → .agents}/skills/sinapse-brand/SKILL.md +0 -0
- /package/{.codex → .agents}/skills/sinapse-cloning/SKILL.md +0 -0
- /package/{.codex → .agents}/skills/sinapse-commercial/SKILL.md +0 -0
- /package/{.codex → .agents}/skills/sinapse-content/SKILL.md +0 -0
- /package/{.codex → .agents}/skills/sinapse-copy/SKILL.md +0 -0
- /package/{.codex → .agents}/skills/sinapse-council/SKILL.md +0 -0
- /package/{.codex → .agents}/skills/sinapse-courses/SKILL.md +0 -0
- /package/{.codex → .agents}/skills/sinapse-cyber/SKILL.md +0 -0
- /package/{.codex → .agents}/skills/sinapse-data-engineer/SKILL.md +0 -0
- /package/{.codex → .agents}/skills/sinapse-design/SKILL.md +0 -0
- /package/{.codex → .agents}/skills/sinapse-dev/SKILL.md +0 -0
- /package/{.codex → .agents}/skills/sinapse-devops/SKILL.md +0 -0
- /package/{.codex → .agents}/skills/sinapse-finance/SKILL.md +0 -0
- /package/{.codex → .agents}/skills/sinapse-growth/SKILL.md +0 -0
- /package/{.codex → .agents}/skills/sinapse-paidmedia/SKILL.md +0 -0
- /package/{.codex → .agents}/skills/sinapse-pm/SKILL.md +0 -0
- /package/{.codex → .agents}/skills/sinapse-po/SKILL.md +0 -0
- /package/{.codex → .agents}/skills/sinapse-product/SKILL.md +0 -0
- /package/{.codex → .agents}/skills/sinapse-qa/SKILL.md +0 -0
- /package/{.codex → .agents}/skills/sinapse-research/SKILL.md +0 -0
- /package/{.codex → .agents}/skills/sinapse-sm/SKILL.md +0 -0
- /package/{.codex → .agents}/skills/sinapse-squad-creator/SKILL.md +0 -0
- /package/{.codex → .agents}/skills/sinapse-storytelling/SKILL.md +0 -0
- /package/{.codex → .agents}/skills/sinapse-swarm/SKILL.md +0 -0
- /package/{.codex → .agents}/skills/sinapse-ux-design-expert/SKILL.md +0 -0
|
@@ -18,6 +18,7 @@ const crossSpawn = require('cross-spawn');
|
|
|
18
18
|
const { getIDEConfig } = require('../config/ide-configs');
|
|
19
19
|
const { validateProjectName } = require('./validators');
|
|
20
20
|
const { getMergeStrategy, hasMergeStrategy } = require('../merger/index.js');
|
|
21
|
+
const { reconcileLegacyClaudeAgentCommands } = require('../installer/sinapse-ai-installer');
|
|
21
22
|
|
|
22
23
|
/**
|
|
23
24
|
* Render template with variables
|
|
@@ -373,6 +374,9 @@ async function generateIDEConfigs(selectedIDEs, wizardState, options = {}) {
|
|
|
373
374
|
|
|
374
375
|
// Copy agent files to IDE-specific agent folder
|
|
375
376
|
if (ide.agentFolder) {
|
|
377
|
+
if (ideKey === 'claude-code') {
|
|
378
|
+
await reconcileLegacyClaudeAgentCommands(projectRoot);
|
|
379
|
+
}
|
|
376
380
|
spinner.start(`Copying agents to ${ide.agentFolder}...`);
|
|
377
381
|
const agentFiles = await copyAgentFiles(projectRoot, ide.agentFolder, ide);
|
|
378
382
|
createdFiles.push(...agentFiles);
|
|
@@ -544,6 +548,9 @@ async function copyClaudeHooksFolder(projectRoot) {
|
|
|
544
548
|
'enforce-story-gate.cjs',
|
|
545
549
|
'doc-first-gate.cjs',
|
|
546
550
|
'enforce-framework-boundary.cjs',
|
|
551
|
+
'enforce-permission-mode.cjs',
|
|
552
|
+
'enforce-nsn-guard.cjs',
|
|
553
|
+
'verify-packages.cjs',
|
|
547
554
|
'secret-scanning.cjs',
|
|
548
555
|
'write-path-validation.cjs',
|
|
549
556
|
// Frente 4.3 — DORA + OTel telemetry hooks (STREAM A)
|
|
@@ -619,6 +626,21 @@ const HOOK_EVENT_MAP = {
|
|
|
619
626
|
matcher: 'Write|Edit',
|
|
620
627
|
timeout: 5,
|
|
621
628
|
},
|
|
629
|
+
'enforce-permission-mode.cjs': {
|
|
630
|
+
event: 'PreToolUse',
|
|
631
|
+
matcher: 'Write|Edit|Bash',
|
|
632
|
+
timeout: 5,
|
|
633
|
+
},
|
|
634
|
+
'enforce-nsn-guard.cjs': {
|
|
635
|
+
event: 'PreToolUse',
|
|
636
|
+
matcher: 'Write|Edit',
|
|
637
|
+
timeout: 5,
|
|
638
|
+
},
|
|
639
|
+
'verify-packages.cjs': {
|
|
640
|
+
event: 'PreToolUse',
|
|
641
|
+
matcher: 'Bash',
|
|
642
|
+
timeout: 10,
|
|
643
|
+
},
|
|
622
644
|
'write-path-validation.cjs': {
|
|
623
645
|
event: 'PreToolUse',
|
|
624
646
|
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
|
},
|
|
@@ -522,6 +536,10 @@ async function runWizard(options = {}) {
|
|
|
522
536
|
const installed = pillars.filter(p => sinapseCoreResult.installedFolders.includes(p));
|
|
523
537
|
const aux = sinapseCoreResult.installedFolders.filter(f => !pillars.includes(f));
|
|
524
538
|
console.log(`✅ SINAPSE core: ${sinapseCoreResult.installedFiles.length} files (${installed.length} pillars, ${aux.length} modules)`);
|
|
539
|
+
const cleanup = sinapseCoreResult.codexLegacySkillReconciliation;
|
|
540
|
+
if (cleanup && (cleanup.removed || cleanup.migrated || cleanup.quarantined || cleanup.ambiguous.length)) {
|
|
541
|
+
console.log(`SINAPSE Codex skill cleanup: ${cleanup.removed} removed, ${cleanup.migrated} migrated, ${cleanup.quarantined} quarantined, ${cleanup.ambiguous.length} ambiguous`);
|
|
542
|
+
}
|
|
525
543
|
}
|
|
526
544
|
answers.sinapseCoreInstalled = true;
|
|
527
545
|
answers.sinapseCoreResult = sinapseCoreResult;
|
|
@@ -557,7 +575,8 @@ async function runWizard(options = {}) {
|
|
|
557
575
|
|
|
558
576
|
// Install global orqx agent definitions to ~/.claude/agents/ (only for Claude Code)
|
|
559
577
|
const selectedLLM = answers.selectedLLM || 'claude-code';
|
|
560
|
-
|
|
578
|
+
const targetProjectRoot = process.cwd();
|
|
579
|
+
if (shouldConfigureClaude(selectedLLM)) {
|
|
561
580
|
console.log('\n🤖 ' + t('installingGlobalAgents'));
|
|
562
581
|
try {
|
|
563
582
|
const globalAgentsResult = await installGlobalAgents();
|
|
@@ -708,100 +727,106 @@ async function runWizard(options = {}) {
|
|
|
708
727
|
// Legacy per-squad IDE copy path removed; sync pipeline handles IDE propagation.
|
|
709
728
|
}
|
|
710
729
|
|
|
730
|
+
if (shouldConfigureClaude(selectedLLM)) {
|
|
711
731
|
// 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
|
-
|
|
732
|
+
console.log('\n🔒 ' + t('generatingBoundaryRules'));
|
|
733
|
+
try {
|
|
734
|
+
const settingsGenerator = require('../../../../.sinapse-ai/infrastructure/scripts/generate-settings-json');
|
|
735
|
+
settingsGenerator.generate(process.cwd());
|
|
736
|
+
const settingsContent = await fse.readFile(path.join(process.cwd(), '.claude', 'settings.json'), 'utf8').catch(() => '{}');
|
|
737
|
+
const settingsParsed = JSON.parse(settingsContent);
|
|
738
|
+
const denyCount = (settingsParsed.permissions && settingsParsed.permissions.deny) ? settingsParsed.permissions.deny.length : 0;
|
|
739
|
+
console.log(`✅ settings.json: generated (${denyCount} deny rules)`);
|
|
740
|
+
answers.settingsGenerated = true;
|
|
741
|
+
answers.settingsDenyCount = denyCount;
|
|
742
|
+
} catch (error) {
|
|
743
|
+
console.warn(`⚠️ settings.json generation failed: ${error.message} — run 'sinapse doctor --fix' post-install`);
|
|
744
|
+
answers.settingsGenerated = false;
|
|
745
|
+
}
|
|
726
746
|
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
747
|
+
// Story INS-4.3: Copy skills (Gap #11)
|
|
748
|
+
console.log('\n📚 ' + t('copyingSkills'));
|
|
749
|
+
try {
|
|
750
|
+
const skillsResult = await copySkillFiles(process.cwd());
|
|
751
|
+
if (skillsResult.skipped) {
|
|
752
|
+
console.log(' ℹ️ Skills: source not found (skipped)');
|
|
753
|
+
} else {
|
|
754
|
+
console.log(`✅ Skills: ${skillsResult.count} copied`);
|
|
755
|
+
}
|
|
756
|
+
answers.skillsCopied = skillsResult.count;
|
|
757
|
+
answers.skillsSkipped = skillsResult.skipped;
|
|
758
|
+
} catch (error) {
|
|
759
|
+
console.warn(`⚠️ Skills copy failed: ${error.message}`);
|
|
760
|
+
answers.skillsCopied = 0;
|
|
735
761
|
}
|
|
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
762
|
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
763
|
+
// Story INS-4.3: Copy extra commands (Gap #12)
|
|
764
|
+
console.log('\n📋 ' + t('copyingExtraCommands'));
|
|
765
|
+
try {
|
|
766
|
+
const commandsResult = await copyExtraCommandFiles(process.cwd());
|
|
767
|
+
if (commandsResult.skipped) {
|
|
768
|
+
console.log(' ℹ️ Extra commands: source not found (skipped)');
|
|
769
|
+
} else {
|
|
770
|
+
console.log(`✅ Commands: ${commandsResult.count} extras copied`);
|
|
771
|
+
}
|
|
772
|
+
answers.extraCommandsCopied = commandsResult.count;
|
|
773
|
+
answers.extraCommandsSkipped = commandsResult.skipped;
|
|
774
|
+
} catch (error) {
|
|
775
|
+
console.warn(`⚠️ Extra commands copy failed: ${error.message}`);
|
|
776
|
+
answers.extraCommandsCopied = 0;
|
|
751
777
|
}
|
|
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
778
|
|
|
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 = () => {};
|
|
779
|
+
// Story INS-4.5: IDE Sync — transform agents/skills/commands for each configured IDE
|
|
780
|
+
console.log('\n🔄 ' + t('runningIdeSync'));
|
|
781
|
+
const savedCwd = process.cwd();
|
|
772
782
|
try {
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
783
|
+
process.chdir(targetProjectRoot);
|
|
784
|
+
await commandSync({ quiet: true });
|
|
785
|
+
answers.ideSyncStatus = 'synced';
|
|
786
|
+
console.log('✅ IDE sync: synced');
|
|
787
|
+
|
|
788
|
+
// Validate sync output (commandValidate does not support quiet — suppress its console output)
|
|
789
|
+
const _origLog = console.log;
|
|
790
|
+
console.log = () => {};
|
|
791
|
+
try {
|
|
792
|
+
await commandValidate({ quiet: true });
|
|
793
|
+
answers.ideSyncValidation = 'pass';
|
|
794
|
+
} catch {
|
|
795
|
+
answers.ideSyncValidation = 'drift';
|
|
796
|
+
} finally {
|
|
797
|
+
console.log = _origLog;
|
|
798
|
+
}
|
|
799
|
+
if (answers.ideSyncValidation === 'drift') {
|
|
800
|
+
console.warn('⚠️ ' + t('ideSyncDriftWarning'));
|
|
801
|
+
}
|
|
802
|
+
} catch (syncError) {
|
|
803
|
+
console.warn(`⚠️ IDE sync failed: ${syncError.message} — run 'sinapse doctor --fix' post-install`);
|
|
804
|
+
answers.ideSyncStatus = 'failed';
|
|
805
|
+
answers.ideSyncValidation = 'skipped';
|
|
777
806
|
} finally {
|
|
778
|
-
|
|
779
|
-
}
|
|
780
|
-
if (answers.ideSyncValidation === 'drift') {
|
|
781
|
-
console.warn('⚠️ ' + t('ideSyncDriftWarning'));
|
|
807
|
+
process.chdir(savedCwd);
|
|
782
808
|
}
|
|
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);
|
|
809
|
+
|
|
789
810
|
}
|
|
790
811
|
|
|
791
812
|
// Codex local-first sync: the ide-sync above drives claude-code only now,
|
|
792
|
-
// so .codex/agents + .
|
|
813
|
+
// so .codex/agents + .agents/skills are regenerated here from the canonical
|
|
793
814
|
// source (the static .codex payload — scripts/tasks/JSONs — was already
|
|
794
815
|
// copied by installSinapseCore when Codex was selected). Codex installs only.
|
|
795
|
-
if (selectedLLM
|
|
816
|
+
if (shouldConfigureCodex(selectedLLM)) {
|
|
796
817
|
console.log('\n🔄 ' + t('runningCodexSync'));
|
|
797
818
|
const savedCwdCodex = process.cwd();
|
|
798
819
|
try {
|
|
799
820
|
const { syncCodexLocalFirst } = require('../../../../.sinapse-ai/infrastructure/scripts/sync-codex-local-first');
|
|
821
|
+
const { syncCodexNativeAgents } = require('../../../../.codex/scripts/sync-codex-native');
|
|
800
822
|
process.chdir(targetProjectRoot);
|
|
801
823
|
const codexResult = syncCodexLocalFirst({ projectRoot: targetProjectRoot, quiet: true });
|
|
824
|
+
const nativeResult = codexResult.ok
|
|
825
|
+
? syncCodexNativeAgents(targetProjectRoot)
|
|
826
|
+
: { total: 0 };
|
|
802
827
|
answers.codexSyncStatus = codexResult.ok ? 'synced' : 'failed';
|
|
803
828
|
const m = codexResult.metrics || {};
|
|
804
|
-
console.log(`✅ Codex sync: ${codexResult.ok ? 'synced' : 'issues'} (${m.codexAgents || 0} agents, ${m.codexSkills || 0} skills)`);
|
|
829
|
+
console.log(`✅ Codex sync: ${codexResult.ok ? 'synced' : 'issues'} (${m.codexAgents || 0} adapters, ${nativeResult.total || 0} native agents, ${m.codexSkills || 0} native skills)`);
|
|
805
830
|
} catch (codexErr) {
|
|
806
831
|
console.warn(`⚠️ Codex sync failed: ${codexErr.message} — run 'npm run sync:ide:codex' post-install`);
|
|
807
832
|
answers.codexSyncStatus = 'failed';
|
|
@@ -877,8 +902,11 @@ async function runWizard(options = {}) {
|
|
|
877
902
|
});
|
|
878
903
|
|
|
879
904
|
// Story ACT-12: Write language to Claude Code settings.json
|
|
880
|
-
if (answers.language) {
|
|
881
|
-
const langWritten = await
|
|
905
|
+
if (answers.language && shouldConfigureClaude(selectedLLM)) {
|
|
906
|
+
const langWritten = await writeProviderLanguageSettings({
|
|
907
|
+
selectedLLM,
|
|
908
|
+
language: answers.language,
|
|
909
|
+
});
|
|
882
910
|
if (langWritten) {
|
|
883
911
|
console.log(' - Language written to .claude/settings.json');
|
|
884
912
|
} else {
|
|
@@ -1266,6 +1294,7 @@ module.exports = {
|
|
|
1266
1294
|
// Exported for testing
|
|
1267
1295
|
_testing: {
|
|
1268
1296
|
writeClaudeSettings,
|
|
1297
|
+
writeProviderLanguageSettings,
|
|
1269
1298
|
getExistingLanguage,
|
|
1270
1299
|
LANGUAGE_MAP,
|
|
1271
1300
|
detectProjectType,
|
|
@@ -1274,6 +1303,8 @@ module.exports = {
|
|
|
1274
1303
|
detectSystemLocale,
|
|
1275
1304
|
llmToIDEs,
|
|
1276
1305
|
llmLabel,
|
|
1306
|
+
shouldConfigureClaude,
|
|
1307
|
+
shouldConfigureCodex,
|
|
1277
1308
|
installGlobalAgents,
|
|
1278
1309
|
buildAgentTemplate,
|
|
1279
1310
|
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`);
|