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
package/bin/commands/install.js
CHANGED
|
@@ -36,7 +36,11 @@ const {
|
|
|
36
36
|
warnNonInteractive,
|
|
37
37
|
} = require('../lib/detection');
|
|
38
38
|
const { promptLlmChoice } = require('../lib/prompts');
|
|
39
|
-
const {
|
|
39
|
+
const {
|
|
40
|
+
recordInstalledAgents,
|
|
41
|
+
reconcileInstalledAgents,
|
|
42
|
+
removeManagedGlobalSkills,
|
|
43
|
+
} = require('./uninstall');
|
|
40
44
|
const { verifyInstall } = require('./status');
|
|
41
45
|
// generateCommandMd is re-exported below for backward-compat (update.js imports it
|
|
42
46
|
// from ./install). regenerateAgentCommands is the shared Phase 2 helper.
|
|
@@ -44,6 +48,8 @@ const {
|
|
|
44
48
|
generateCommandMd,
|
|
45
49
|
regenerateAgentCommands,
|
|
46
50
|
} = require('../lib/command-generator');
|
|
51
|
+
const { deliverGlobalProviderAdapters, getGlobalCommandStagingDir } = require('../lib/global-provider-adapters');
|
|
52
|
+
const { assertProviderAdapterParity } = require('../lib/provider-parity');
|
|
47
53
|
// Follow-up #13 — wire the transactional backup/rollback engine into the
|
|
48
54
|
// installer so an in-place UPGRADE (upsert) that fails mid-flight is restored
|
|
49
55
|
// to its previous state instead of leaving ~/.sinapse half-updated.
|
|
@@ -59,6 +65,11 @@ async function cmdInstallGlobal(opts = {}) {
|
|
|
59
65
|
// Story 10.20 — Upsert detection
|
|
60
66
|
const force = Boolean(opts.force);
|
|
61
67
|
const reconfigure = Boolean(opts.reconfigure);
|
|
68
|
+
const globalOnly = Boolean(opts.globalOnly);
|
|
69
|
+
const requestedLlm = opts.llm || null;
|
|
70
|
+
if (requestedLlm && !['claude-code', 'codex', 'both'].includes(requestedLlm)) {
|
|
71
|
+
throw new Error(`Invalid --llm value: ${requestedLlm}. Use claude-code, codex, or both.`);
|
|
72
|
+
}
|
|
62
73
|
const existing = force ? { upsert: false } : detectExistingInstall();
|
|
63
74
|
const isUpsert = existing.upsert;
|
|
64
75
|
|
|
@@ -121,7 +132,9 @@ async function cmdInstallGlobal(opts = {}) {
|
|
|
121
132
|
// Story 10.35: --reconfigure forces prompt even in upsert mode
|
|
122
133
|
let llmChoice;
|
|
123
134
|
let llmWasReused = false;
|
|
124
|
-
if (
|
|
135
|
+
if (requestedLlm) {
|
|
136
|
+
llmChoice = requestedLlm;
|
|
137
|
+
} else if (isUpsert && !reconfigure && existing.llm) {
|
|
125
138
|
llmChoice = existing.llm;
|
|
126
139
|
llmWasReused = true;
|
|
127
140
|
const ideLabel = Array.isArray(llmChoice) ? llmChoice.join(', ') : String(llmChoice);
|
|
@@ -217,7 +230,7 @@ async function cmdInstallGlobal(opts = {}) {
|
|
|
217
230
|
// project-wizard WARN must NOT revert an otherwise-good global install.
|
|
218
231
|
const tx = createInstallTransaction();
|
|
219
232
|
const txPaths = buildTransactionPaths(llmChoice);
|
|
220
|
-
const {
|
|
233
|
+
const { activeAgentCount, totalDelta, squadsRefreshed, squadsAdded, meta } =
|
|
221
234
|
await runFatalPhasesTransactional({
|
|
222
235
|
tx,
|
|
223
236
|
isUpsert,
|
|
@@ -264,7 +277,10 @@ async function cmdInstallGlobal(opts = {}) {
|
|
|
264
277
|
|
|
265
278
|
// Phase 8: Install project-local files (.sinapse-ai/, .claude/, .env)
|
|
266
279
|
logger.always(`\n${CYAN}Phase 8:${NC} Installing project files in current directory`);
|
|
267
|
-
|
|
280
|
+
const skipProjectInstall = globalOnly || path.resolve(process.cwd()) === path.resolve(ROOT);
|
|
281
|
+
if (skipProjectInstall) {
|
|
282
|
+
logger.always(` ${YELLOW}SKIP${NC} Project files (${globalOnly ? '--global-only' : 'source checkout detected'})`);
|
|
283
|
+
} else try {
|
|
268
284
|
const wizardPath = path.join(ROOT, 'packages', 'installer', 'src', 'wizard', 'index.js');
|
|
269
285
|
if (fs.existsSync(wizardPath)) {
|
|
270
286
|
const { runWizard: executeWizard } = require(wizardPath);
|
|
@@ -300,19 +316,10 @@ async function cmdInstallGlobal(opts = {}) {
|
|
|
300
316
|
// greeting on @sinapse/@snps/-orqx). Re-copy the generated command files LAST so the
|
|
301
317
|
// rich, frontmatter'd stubs are always the final word. Idempotent.
|
|
302
318
|
try {
|
|
303
|
-
const
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
if (
|
|
307
|
-
const cmdFiles = fs.readdirSync(CLAUDE_COMMANDS_DIR).filter(f => f.endsWith('.md'));
|
|
308
|
-
for (const dir of reTargets) {
|
|
309
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
310
|
-
for (const f of cmdFiles) {
|
|
311
|
-
fs.copyFileSync(path.join(CLAUDE_COMMANDS_DIR, f), path.join(dir, f));
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
logger.always(` ${GREEN}OK${NC} Global agents reconciled (${cmdFiles.length} files — rich stubs authoritative)`);
|
|
315
|
-
}
|
|
319
|
+
const commandsDir = getGlobalCommandStagingDir({ llmChoice, sinapseHome: SINAPSE_HOME, claudeCommandsDir: CLAUDE_COMMANDS_DIR });
|
|
320
|
+
const reconciled = deliverGlobalProviderAdapters({ llmChoice, home: HOME, commandsDir });
|
|
321
|
+
const total = reconciled.claude.length + reconciled.codex.length + reconciled.skills.length;
|
|
322
|
+
if (total) logger.always(` ${GREEN}OK${NC} Global provider adapters reconciled (${total} artifacts)`);
|
|
316
323
|
} catch (e) {
|
|
317
324
|
logger.always(` ${YELLOW}WARN${NC} Global agent reconciliation: ${e.message}`);
|
|
318
325
|
}
|
|
@@ -324,9 +331,14 @@ async function cmdInstallGlobal(opts = {}) {
|
|
|
324
331
|
// printed above: if any check failed (✗), show a warning banner instead of an
|
|
325
332
|
// unconditional success banner. The exit code is intentionally left unchanged —
|
|
326
333
|
// this only changes the message, not the process result.
|
|
334
|
+
const verificationCommandsDir = getGlobalCommandStagingDir({
|
|
335
|
+
llmChoice,
|
|
336
|
+
sinapseHome: SINAPSE_HOME,
|
|
337
|
+
claudeCommandsDir: CLAUDE_COMMANDS_DIR,
|
|
338
|
+
});
|
|
327
339
|
const installVerified =
|
|
328
340
|
fs.existsSync(SINAPSE_HOME) &&
|
|
329
|
-
fs.existsSync(
|
|
341
|
+
fs.existsSync(verificationCommandsDir) &&
|
|
330
342
|
fs.existsSync(path.join(BIN_DIR, 'sinapse')) &&
|
|
331
343
|
fs.existsSync(path.join(SINAPSE_HOME, '.claude', 'rules', 'squad-awareness.md'));
|
|
332
344
|
|
|
@@ -347,12 +359,17 @@ async function cmdInstallGlobal(opts = {}) {
|
|
|
347
359
|
logger.always(`${YELLOW}══════════════════════════════════════════════════════════════${NC}`);
|
|
348
360
|
}
|
|
349
361
|
logger.always('');
|
|
350
|
-
logger.always(` ${BOLD}${squads.length} squads${NC} | ${BOLD}${
|
|
362
|
+
logger.always(` ${BOLD}${squads.length} squads${NC} | ${BOLD}${activeAgentCount} agents${NC} | ${BOLD}${activeAgentCount} native adapters${NC}`);
|
|
351
363
|
logger.always(` ${startCmd}`);
|
|
352
364
|
logger.always('');
|
|
353
365
|
logger.always(` ${BOLD}Try an agent:${NC}`);
|
|
354
|
-
|
|
355
|
-
|
|
366
|
+
if (llmChoice === 'codex') {
|
|
367
|
+
logger.always(` ${CYAN}$snps${NC}`);
|
|
368
|
+
logger.always(` ${CYAN}$sinapse-agent brand-orqx${NC}`);
|
|
369
|
+
} else {
|
|
370
|
+
logger.always(` ${CYAN}@sinapse-orqx${NC}`);
|
|
371
|
+
logger.always(` ${CYAN}@brand-orqx${NC}`);
|
|
372
|
+
}
|
|
356
373
|
logger.always('');
|
|
357
374
|
}
|
|
358
375
|
|
|
@@ -396,7 +413,13 @@ function buildTransactionPaths(llmChoice) {
|
|
|
396
413
|
CLAUDE_COMMANDS_DIR, // Phase 2 — generated /SINAPSE:agents:* command files
|
|
397
414
|
];
|
|
398
415
|
if (llmChoice === 'claude-code' || llmChoice === 'both') dirs.push(path.join(HOME, '.claude', 'agents'));
|
|
399
|
-
|
|
416
|
+
// A Claude-only provider switch removes stale Codex aliases during the fatal
|
|
417
|
+
// phases, so that cleanup must be covered by the same upgrade rollback.
|
|
418
|
+
if (llmChoice === 'claude-code') dirs.push(path.join(HOME, '.agents', 'skills'));
|
|
419
|
+
if (llmChoice === 'codex' || llmChoice === 'both') {
|
|
420
|
+
dirs.push(path.join(HOME, '.codex', 'agents'));
|
|
421
|
+
dirs.push(path.join(HOME, '.agents', 'skills'));
|
|
422
|
+
}
|
|
400
423
|
dirs.push(BIN_DIR); // Phase 4 — launcher(s)
|
|
401
424
|
|
|
402
425
|
const files = [path.join(HOME, '.claude', 'settings.json')]; // language save
|
|
@@ -469,7 +492,7 @@ async function runFatalPhasesTransactional({ tx, isUpsert, paths, runPhases, onR
|
|
|
469
492
|
* @param {string} ctx.llmChoice
|
|
470
493
|
* @param {Object} ctx.existing - detectExistingInstall() result
|
|
471
494
|
* @param {Object} ctx.logger
|
|
472
|
-
* @returns {{ writtenAgents: Set,
|
|
495
|
+
* @returns {{ writtenAgents: Set, activeAgentCount: number, totalDelta: Object, squadsRefreshed: number, squadsAdded: number, meta: Object }}
|
|
473
496
|
*/
|
|
474
497
|
function installFatalPhases({ squads, squadsDir, isUpsert, llmChoice, existing, logger }) {
|
|
475
498
|
// Phase 1: Copy squads to ~/.sinapse/
|
|
@@ -477,7 +500,6 @@ function installFatalPhases({ squads, squadsDir, isUpsert, llmChoice, existing,
|
|
|
477
500
|
fs.mkdirSync(SINAPSE_HOME, { recursive: true });
|
|
478
501
|
|
|
479
502
|
const squadsSrcBase = fs.existsSync(squadsDir) ? squadsDir : ROOT;
|
|
480
|
-
let totalAgents = 0;
|
|
481
503
|
const totalDelta = { added: 0, updated: 0, unchanged: 0, removed: 0 };
|
|
482
504
|
let squadsRefreshed = 0;
|
|
483
505
|
let squadsAdded = 0;
|
|
@@ -498,7 +520,6 @@ function installFatalPhases({ squads, squadsDir, isUpsert, llmChoice, existing,
|
|
|
498
520
|
copyDirSync(src, dest);
|
|
499
521
|
logger.always(` ${GREEN}OK${NC} ${squad.name} (${squad.agents} agents)`);
|
|
500
522
|
}
|
|
501
|
-
totalAgents += squad.agents;
|
|
502
523
|
}
|
|
503
524
|
|
|
504
525
|
// Copy sinapse/ orqx squad
|
|
@@ -516,47 +537,52 @@ function installFatalPhases({ squads, squadsDir, isUpsert, llmChoice, existing,
|
|
|
516
537
|
copyDirSync(sinapseMasterSrc, sinapseMasterDest);
|
|
517
538
|
}
|
|
518
539
|
const masterAgents = getAgentFiles(sinapseMasterDest).length;
|
|
519
|
-
totalAgents += masterAgents;
|
|
520
540
|
logger.always(` ${GREEN}OK${NC} sinapse (master, ${masterAgents} agents)`);
|
|
521
541
|
}
|
|
522
542
|
|
|
543
|
+
const coreDevelopmentSrc = path.join(ROOT, '.sinapse-ai', 'development');
|
|
544
|
+
const coreDevelopmentDest = path.join(SINAPSE_HOME, 'core');
|
|
545
|
+
if (fs.existsSync(coreDevelopmentSrc)) {
|
|
546
|
+
if (isUpsert) {
|
|
547
|
+
const delta = syncDirSync(coreDevelopmentSrc, coreDevelopmentDest);
|
|
548
|
+
totalDelta.added += delta.added;
|
|
549
|
+
totalDelta.updated += delta.updated;
|
|
550
|
+
totalDelta.unchanged += delta.unchanged;
|
|
551
|
+
totalDelta.removed += delta.removed;
|
|
552
|
+
} else {
|
|
553
|
+
rmDirSync(coreDevelopmentDest);
|
|
554
|
+
copyDirSync(coreDevelopmentSrc, coreDevelopmentDest);
|
|
555
|
+
}
|
|
556
|
+
const coreAgents = getAgentFiles(coreDevelopmentDest).length;
|
|
557
|
+
logger.always(` ${GREEN}OK${NC} core development (${coreAgents} agents)`);
|
|
558
|
+
}
|
|
559
|
+
|
|
523
560
|
// Phase 2: Generate agent commands (shared with `update` via command-generator).
|
|
524
561
|
logger.always(`\n${CYAN}Phase 2:${NC} Generating agent commands`);
|
|
525
|
-
const {
|
|
562
|
+
const commandStagingDir = getGlobalCommandStagingDir({ llmChoice, sinapseHome: SINAPSE_HOME, claudeCommandsDir: CLAUDE_COMMANDS_DIR });
|
|
563
|
+
const { writtenAgents, totalAgents } = regenerateAgentCommands({
|
|
526
564
|
sinapseHome: SINAPSE_HOME,
|
|
527
|
-
commandsDir:
|
|
565
|
+
commandsDir: commandStagingDir,
|
|
528
566
|
squads,
|
|
529
567
|
sinapseMasterDest,
|
|
568
|
+
coreDevelopmentDest,
|
|
530
569
|
});
|
|
531
570
|
logger.always(` ${GREEN}OK${NC} ${writtenAgents.size} total command files`);
|
|
532
571
|
|
|
533
572
|
// Phase 2b: Install global agents based on LLM choice
|
|
534
|
-
const
|
|
573
|
+
const globalAdapters = deliverGlobalProviderAdapters({ llmChoice, home: HOME, commandsDir: commandStagingDir });
|
|
574
|
+
const activeAgentCount = assertProviderAdapterParity(llmChoice, globalAdapters, totalAgents);
|
|
575
|
+
const installedAgentFilenames = new Set([...globalAdapters.claude, ...globalAdapters.codex]);
|
|
535
576
|
const installedIdes = [];
|
|
536
|
-
if (
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
fs.copyFileSync(path.join(CLAUDE_COMMANDS_DIR, f), path.join(globalAgentsDir, f));
|
|
541
|
-
installedAgentFilenames.add(f);
|
|
542
|
-
}
|
|
543
|
-
installedIdes.push('claude-code');
|
|
544
|
-
logger.always(` ${GREEN}OK${NC} Claude Code global agents (${writtenAgents.size})`);
|
|
545
|
-
}
|
|
546
|
-
|
|
547
|
-
if (llmChoice === 'codex' || llmChoice === 'both') {
|
|
548
|
-
const codexAgentsDir = path.join(HOME, '.codex', 'agents');
|
|
549
|
-
fs.mkdirSync(codexAgentsDir, { recursive: true });
|
|
550
|
-
for (const f of fs.readdirSync(CLAUDE_COMMANDS_DIR).filter(f => f.endsWith('.md'))) {
|
|
551
|
-
fs.copyFileSync(path.join(CLAUDE_COMMANDS_DIR, f), path.join(codexAgentsDir, f));
|
|
552
|
-
installedAgentFilenames.add(f);
|
|
553
|
-
}
|
|
554
|
-
installedIdes.push('codex');
|
|
555
|
-
logger.always(` ${GREEN}OK${NC} Codex global agents (${writtenAgents.size})`);
|
|
556
|
-
}
|
|
577
|
+
if (globalAdapters.claude.length) installedIdes.push('claude-code');
|
|
578
|
+
if (globalAdapters.codex.length) installedIdes.push('codex');
|
|
579
|
+
if (globalAdapters.claude.length) logger.always(` ${GREEN}OK${NC} Claude Code global agents (${globalAdapters.claude.length})`);
|
|
580
|
+
if (globalAdapters.codex.length) logger.always(` ${GREEN}OK${NC} Codex global agents (${globalAdapters.codex.length} TOML, ${globalAdapters.skills.length} skills)`);
|
|
557
581
|
|
|
558
582
|
// Audit 1 P0 (UN-1) — record manifest so uninstall can remove every file
|
|
559
583
|
// we wrote (not just `*-orqx.md`). Idempotent: re-install overwrites.
|
|
584
|
+
reconcileInstalledAgents(HOME, installedAgentFilenames);
|
|
585
|
+
if (llmChoice === 'claude-code') removeManagedGlobalSkills(HOME, { providers: ['codex'] });
|
|
560
586
|
recordInstalledAgents(installedAgentFilenames, installedIdes);
|
|
561
587
|
|
|
562
588
|
// Phase 3: Generate squad-awareness.md
|
|
@@ -580,8 +606,8 @@ function installFatalPhases({ squads, squadsDir, isUpsert, llmChoice, existing,
|
|
|
580
606
|
? existing.prevMeta.installedAt
|
|
581
607
|
: nowIso,
|
|
582
608
|
squads: squads.length,
|
|
583
|
-
agents:
|
|
584
|
-
commands:
|
|
609
|
+
agents: activeAgentCount,
|
|
610
|
+
commands: activeAgentCount,
|
|
585
611
|
llm: llmChoice,
|
|
586
612
|
platform: process.platform,
|
|
587
613
|
};
|
|
@@ -590,7 +616,7 @@ function installFatalPhases({ squads, squadsDir, isUpsert, llmChoice, existing,
|
|
|
590
616
|
}
|
|
591
617
|
atomicWriteFileSync(path.join(SINAPSE_HOME, 'metadata.json'), JSON.stringify(meta, null, 2));
|
|
592
618
|
|
|
593
|
-
return { writtenAgents,
|
|
619
|
+
return { writtenAgents, activeAgentCount, totalDelta, squadsRefreshed, squadsAdded, meta };
|
|
594
620
|
}
|
|
595
621
|
|
|
596
622
|
function generateSquadAwareness(sinapseDir, squads) {
|
package/bin/commands/status.js
CHANGED
|
@@ -5,9 +5,9 @@ const fs = require('fs');
|
|
|
5
5
|
const path = require('path');
|
|
6
6
|
const { getLogger } = require('../../.sinapse-ai/core/logger');
|
|
7
7
|
const {
|
|
8
|
+
HOME,
|
|
8
9
|
ROOT,
|
|
9
10
|
SINAPSE_HOME,
|
|
10
|
-
CLAUDE_COMMANDS_DIR,
|
|
11
11
|
BIN_DIR,
|
|
12
12
|
CYAN,
|
|
13
13
|
GREEN,
|
|
@@ -18,12 +18,13 @@ const {
|
|
|
18
18
|
} = require('../lib/constants');
|
|
19
19
|
const { header } = require('../lib/header');
|
|
20
20
|
const { getSquads } = require('../lib/squads');
|
|
21
|
+
const { hasManagedInstalledAgents } = require('./uninstall');
|
|
21
22
|
|
|
22
23
|
function verifyInstall() {
|
|
23
24
|
const logger = getLogger();
|
|
24
25
|
const checks = [
|
|
25
26
|
[fs.existsSync(SINAPSE_HOME), `${getSquads(SINAPSE_HOME).length} squads in ~/.sinapse/`],
|
|
26
|
-
[
|
|
27
|
+
[hasManagedInstalledAgents(HOME), 'Native provider agents installed'],
|
|
27
28
|
[fs.existsSync(path.join(BIN_DIR, 'sinapse')), 'Launcher at ~/bin/sinapse'],
|
|
28
29
|
[fs.existsSync(path.join(SINAPSE_HOME, '.claude', 'rules', 'squad-awareness.md')), 'squad-awareness.md'],
|
|
29
30
|
];
|
|
@@ -52,7 +53,7 @@ function cmdList() {
|
|
|
52
53
|
|
|
53
54
|
logger.always('');
|
|
54
55
|
logger.always(` ${BOLD}Total: ${GREEN}${totalAgents} agents${NC} | ${YELLOW}${totalTasks} tasks${NC}`);
|
|
55
|
-
logger.always(` ${BOLD}Invoke: ${CYAN}
|
|
56
|
+
logger.always(` ${BOLD}Invoke: ${CYAN}$sinapse-agent <agent-id>${NC}`);
|
|
56
57
|
logger.always('');
|
|
57
58
|
}
|
|
58
59
|
|
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
|
|
4
4
|
const fs = require('fs');
|
|
5
5
|
const path = require('path');
|
|
6
|
+
const crypto = require('crypto');
|
|
7
|
+
const legacyClaudeCommandHashes = require('../../packages/installer/src/migrations/legacy-claude-agent-command-hashes.json');
|
|
6
8
|
const { getLogger } = require('../../.sinapse-ai/core/logger');
|
|
7
9
|
const {
|
|
8
10
|
HOME,
|
|
@@ -58,22 +60,61 @@ async function removeGitHooksConfig(projectDir = process.cwd()) {
|
|
|
58
60
|
// and removes only those files (preserving anything the user added by hand).
|
|
59
61
|
const INSTALLED_AGENTS_MANIFEST = path.join(SINAPSE_HOME, 'installed-agents.json');
|
|
60
62
|
|
|
61
|
-
function
|
|
63
|
+
function installedAgentsManifestPath(home = HOME) {
|
|
64
|
+
return home === HOME
|
|
65
|
+
? INSTALLED_AGENTS_MANIFEST
|
|
66
|
+
: path.join(home, '.sinapse', 'installed-agents.json');
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function digestFile(filePath) {
|
|
62
70
|
try {
|
|
63
|
-
fs.
|
|
64
|
-
|
|
65
|
-
|
|
71
|
+
return crypto.createHash('sha256').update(fs.readFileSync(filePath)).digest('hex');
|
|
72
|
+
} catch {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function providerAgentPath(home, provider, filename) {
|
|
78
|
+
const providerDir = provider === 'codex'
|
|
79
|
+
? path.join(home, '.codex', 'agents')
|
|
80
|
+
: path.join(home, '.claude', 'agents');
|
|
81
|
+
return path.join(providerDir, filename);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function inferProviderFromAgentDir(dir) {
|
|
85
|
+
const normalized = path.resolve(dir).replace(/\\/g, '/').toLowerCase();
|
|
86
|
+
if (normalized.includes('/.codex/agents')) return 'codex';
|
|
87
|
+
if (normalized.includes('/.claude/agents')) return 'claude-code';
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function recordInstalledAgents(filenames, ides, home = HOME) {
|
|
92
|
+
try {
|
|
93
|
+
const manifestPath = installedAgentsManifestPath(home);
|
|
94
|
+
fs.mkdirSync(path.dirname(manifestPath), { recursive: true });
|
|
95
|
+
const artifacts = [...filenames].map((filename) => {
|
|
96
|
+
const provider = filename.endsWith('.toml') ? 'codex' : 'claude-code';
|
|
97
|
+
return {
|
|
98
|
+
provider,
|
|
99
|
+
filename,
|
|
100
|
+
sha256: digestFile(providerAgentPath(home, provider, filename)),
|
|
101
|
+
};
|
|
102
|
+
});
|
|
103
|
+
fs.writeFileSync(manifestPath, JSON.stringify({
|
|
104
|
+
version: 2,
|
|
66
105
|
timestamp: new Date().toISOString(),
|
|
67
106
|
ides,
|
|
68
107
|
filenames: [...filenames].sort(),
|
|
108
|
+
artifacts: artifacts.sort((a, b) => `${a.provider}/${a.filename}`.localeCompare(`${b.provider}/${b.filename}`)),
|
|
69
109
|
}, null, 2));
|
|
70
110
|
} catch { /* non-critical */ }
|
|
71
111
|
}
|
|
72
112
|
|
|
73
|
-
function readInstalledAgentsManifest() {
|
|
113
|
+
function readInstalledAgentsManifest(home = HOME) {
|
|
74
114
|
try {
|
|
75
|
-
|
|
76
|
-
|
|
115
|
+
const manifestPath = installedAgentsManifestPath(home);
|
|
116
|
+
if (!fs.existsSync(manifestPath)) return null;
|
|
117
|
+
const raw = fs.readFileSync(manifestPath, 'utf8');
|
|
77
118
|
const parsed = JSON.parse(raw);
|
|
78
119
|
if (!parsed || !Array.isArray(parsed.filenames)) return null;
|
|
79
120
|
return parsed;
|
|
@@ -82,35 +123,39 @@ function readInstalledAgentsManifest() {
|
|
|
82
123
|
}
|
|
83
124
|
}
|
|
84
125
|
|
|
85
|
-
function removeInstalledAgentsFrom(dir) {
|
|
126
|
+
function removeInstalledAgentsFrom(dir, manifestOverride = null) {
|
|
86
127
|
if (!fs.existsSync(dir)) return { removed: 0, existed: false };
|
|
87
128
|
let removed = 0;
|
|
129
|
+
const manifest = manifestOverride || readInstalledAgentsManifest();
|
|
130
|
+
const provider = inferProviderFromAgentDir(dir);
|
|
88
131
|
let candidates;
|
|
89
132
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
133
|
+
if (manifest?.version >= 2 && Array.isArray(manifest.artifacts)) {
|
|
134
|
+
candidates = manifest.artifacts.filter((artifact) => {
|
|
135
|
+
if (!artifact || typeof artifact.filename !== 'string') return false;
|
|
136
|
+
return provider ? artifact.provider === provider : true;
|
|
137
|
+
});
|
|
94
138
|
} else {
|
|
95
|
-
//
|
|
96
|
-
//
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
if (/-orqx\.md$/.test(f)) return true;
|
|
102
|
-
try {
|
|
103
|
-
const head = fs.readFileSync(path.join(dir, f), 'utf8').slice(0, 600);
|
|
104
|
-
return /^\s*name:\s*sinapse-/im.test(head);
|
|
105
|
-
} catch { return false; }
|
|
106
|
-
});
|
|
107
|
-
} catch { return { removed: 0, existed: true }; }
|
|
139
|
+
// Legacy manifests did not record provider or digests. Ownership must be
|
|
140
|
+
// proven by the marker in the actual provider directory before deletion.
|
|
141
|
+
const filenames = Array.isArray(manifest?.filenames)
|
|
142
|
+
? manifest.filenames
|
|
143
|
+
: fs.readdirSync(dir);
|
|
144
|
+
candidates = filenames.map((filename) => ({ filename, sha256: null, legacy: true }));
|
|
108
145
|
}
|
|
109
146
|
|
|
110
|
-
for (const
|
|
111
|
-
const filepath = path.join(dir,
|
|
147
|
+
for (const { filename, sha256, legacy } of candidates) {
|
|
148
|
+
const filepath = path.join(dir, filename);
|
|
112
149
|
if (!fs.existsSync(filepath)) continue;
|
|
113
150
|
try {
|
|
151
|
+
if (sha256) {
|
|
152
|
+
if (digestFile(filepath) !== sha256) continue;
|
|
153
|
+
} else {
|
|
154
|
+
// A v2 entry without a digest does not prove the installer wrote it.
|
|
155
|
+
if (!legacy) continue;
|
|
156
|
+
const content = fs.readFileSync(filepath, 'utf8');
|
|
157
|
+
if (!content.includes('SINAPSE-MANAGED:global-agent')) continue;
|
|
158
|
+
}
|
|
114
159
|
fs.unlinkSync(filepath);
|
|
115
160
|
removed++;
|
|
116
161
|
} catch { /* best-effort */ }
|
|
@@ -125,6 +170,168 @@ function removeOrqxAgentsFrom(dir) {
|
|
|
125
170
|
return removeInstalledAgentsFrom(dir);
|
|
126
171
|
}
|
|
127
172
|
|
|
173
|
+
const MANAGED_GLOBAL_SKILL_IDS = ['snps', 'sinapse', 'snps-orqx', 'sinapse-orqx', 'sinapse-agent'];
|
|
174
|
+
const MANAGED_GLOBAL_SKILL_MARKER = 'SINAPSE-MANAGED:global-skill';
|
|
175
|
+
|
|
176
|
+
function removeManagedGlobalSkills(home = HOME, options = {}) {
|
|
177
|
+
let removed = 0;
|
|
178
|
+
const providers = options.providers || ['codex', 'claude-code'];
|
|
179
|
+
const skillRoots = [];
|
|
180
|
+
if (providers.includes('codex')) skillRoots.push(path.join(home, '.agents', 'skills'));
|
|
181
|
+
if (providers.includes('claude-code')) skillRoots.push(path.join(home, '.claude', 'skills'));
|
|
182
|
+
for (const skillsRoot of skillRoots) {
|
|
183
|
+
for (const skillId of MANAGED_GLOBAL_SKILL_IDS) {
|
|
184
|
+
const skillDir = path.join(skillsRoot, skillId);
|
|
185
|
+
const skillPath = path.join(skillDir, 'SKILL.md');
|
|
186
|
+
if (!fs.existsSync(skillPath)) continue;
|
|
187
|
+
try {
|
|
188
|
+
const content = fs.readFileSync(skillPath, 'utf8');
|
|
189
|
+
if (!content.includes(MANAGED_GLOBAL_SKILL_MARKER)) continue;
|
|
190
|
+
fs.unlinkSync(skillPath);
|
|
191
|
+
if (fs.readdirSync(skillDir).length === 0) fs.rmdirSync(skillDir);
|
|
192
|
+
removed++;
|
|
193
|
+
} catch { /* best-effort */ }
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return { removed };
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
function reconcileInstalledAgents(home, desiredFilenames) {
|
|
200
|
+
const manifest = readInstalledAgentsManifest(home);
|
|
201
|
+
const desired = new Set(desiredFilenames);
|
|
202
|
+
const desiredByProvider = {
|
|
203
|
+
'claude-code': new Set([...desired].filter((name) => name.endsWith('.md'))),
|
|
204
|
+
codex: new Set([...desired].filter((name) => name.endsWith('.toml'))),
|
|
205
|
+
};
|
|
206
|
+
let removed = 0;
|
|
207
|
+
const legacyArtifacts = (manifest?.filenames || []).map((filename) => ({
|
|
208
|
+
provider: filename.endsWith('.toml') ? 'codex' : 'claude-code',
|
|
209
|
+
filename,
|
|
210
|
+
sha256: null,
|
|
211
|
+
}));
|
|
212
|
+
const manifestArtifacts = Array.isArray(manifest?.artifacts) ? manifest.artifacts : legacyArtifacts;
|
|
213
|
+
const manifestOwned = new Set(manifestArtifacts.map(({ provider, filename }) => `${provider}/${filename}`));
|
|
214
|
+
const versionedOwned = new Set(Array.isArray(manifest?.artifacts)
|
|
215
|
+
? manifestArtifacts.map(({ provider, filename }) => `${provider}/${filename}`)
|
|
216
|
+
: []);
|
|
217
|
+
const managedMarker = 'SINAPSE-MANAGED:global-agent';
|
|
218
|
+
for (const { provider, filename, sha256 } of manifestArtifacts) {
|
|
219
|
+
if (!desiredByProvider[provider] || desiredByProvider[provider].has(filename)) continue;
|
|
220
|
+
const filepath = providerAgentPath(home, provider, filename);
|
|
221
|
+
if (!fs.existsSync(filepath)) continue;
|
|
222
|
+
try {
|
|
223
|
+
const content = fs.readFileSync(filepath, 'utf8');
|
|
224
|
+
const digestMatches = Boolean(sha256) && digestFile(filepath) === sha256;
|
|
225
|
+
const legacyMarkerMatches = !Array.isArray(manifest?.artifacts) && content.includes(managedMarker);
|
|
226
|
+
if (sha256 ? !digestMatches : !legacyMarkerMatches) continue;
|
|
227
|
+
fs.unlinkSync(filepath);
|
|
228
|
+
removed++;
|
|
229
|
+
} catch { /* best-effort */ }
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
for (const [provider, providerDir, extension] of [
|
|
233
|
+
['claude-code', path.join(home, '.claude', 'agents'), '.md'],
|
|
234
|
+
['codex', path.join(home, '.codex', 'agents'), '.toml'],
|
|
235
|
+
['codex', path.join(home, '.codex', 'agents'), '.md'],
|
|
236
|
+
]) {
|
|
237
|
+
if (!fs.existsSync(providerDir)) continue;
|
|
238
|
+
for (const filename of fs.readdirSync(providerDir).filter((name) => name.endsWith(extension))) {
|
|
239
|
+
if (desiredByProvider[provider].has(filename)) continue;
|
|
240
|
+
const filepath = path.join(providerDir, filename);
|
|
241
|
+
try {
|
|
242
|
+
const content = fs.readFileSync(filepath, 'utf8');
|
|
243
|
+
if (versionedOwned.has(`${provider}/${filename}`)) continue;
|
|
244
|
+
if (!manifestOwned.has(`${provider}/${filename}`) && !content.includes(managedMarker)) continue;
|
|
245
|
+
// A manifest entry alone is not proof of current ownership: users can
|
|
246
|
+
// replace a formerly managed file. Only marked artifacts reach this
|
|
247
|
+
// sweep; exact recorded content was handled by the digest path above.
|
|
248
|
+
if (!content.includes(managedMarker)) continue;
|
|
249
|
+
fs.unlinkSync(filepath);
|
|
250
|
+
removed++;
|
|
251
|
+
} catch { /* best-effort */ }
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
const legacyCommands = path.join(home, '.claude', 'commands', 'SINAPSE', 'agents');
|
|
256
|
+
let legacyCommandDirectoryRemoved = false;
|
|
257
|
+
let legacyCommandsRemoved = 0;
|
|
258
|
+
let legacyCommandsPreserved = 0;
|
|
259
|
+
if (fs.existsSync(legacyCommands)) {
|
|
260
|
+
for (const entry of fs.readdirSync(legacyCommands, { withFileTypes: true })) {
|
|
261
|
+
const filePath = path.join(legacyCommands, entry.name);
|
|
262
|
+
if (!entry.isFile()) {
|
|
263
|
+
legacyCommandsPreserved++;
|
|
264
|
+
continue;
|
|
265
|
+
}
|
|
266
|
+
try {
|
|
267
|
+
const content = fs.readFileSync(filePath);
|
|
268
|
+
const digest = crypto.createHash('sha256').update(content).digest('hex');
|
|
269
|
+
const knownHashes = legacyClaudeCommandHashes.files[entry.name] || [];
|
|
270
|
+
if (!knownHashes.includes(digest)) {
|
|
271
|
+
legacyCommandsPreserved++;
|
|
272
|
+
continue;
|
|
273
|
+
}
|
|
274
|
+
fs.unlinkSync(filePath);
|
|
275
|
+
legacyCommandsRemoved++;
|
|
276
|
+
} catch {
|
|
277
|
+
legacyCommandsPreserved++;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
try {
|
|
281
|
+
if (fs.readdirSync(legacyCommands).length === 0) {
|
|
282
|
+
fs.rmdirSync(legacyCommands);
|
|
283
|
+
legacyCommandDirectoryRemoved = true;
|
|
284
|
+
}
|
|
285
|
+
} catch { /* best-effort */ }
|
|
286
|
+
}
|
|
287
|
+
return {
|
|
288
|
+
removed,
|
|
289
|
+
legacyCommandDirectoryRemoved,
|
|
290
|
+
legacyCommandsRemoved,
|
|
291
|
+
legacyCommandsPreserved,
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
function hasManagedInstalledAgents(home = HOME) {
|
|
296
|
+
const manifest = readInstalledAgentsManifest(home);
|
|
297
|
+
if (!manifest) {
|
|
298
|
+
for (const [providerDir, extensions] of [
|
|
299
|
+
[path.join(home, '.claude', 'agents'), new Set(['.md'])],
|
|
300
|
+
[path.join(home, '.codex', 'agents'), new Set(['.toml', '.md'])],
|
|
301
|
+
]) {
|
|
302
|
+
try {
|
|
303
|
+
for (const filename of fs.readdirSync(providerDir)) {
|
|
304
|
+
if (!extensions.has(path.extname(filename))) continue;
|
|
305
|
+
try {
|
|
306
|
+
const content = fs.readFileSync(path.join(providerDir, filename), 'utf8');
|
|
307
|
+
if (content.includes('SINAPSE-MANAGED:global-agent')) return true;
|
|
308
|
+
} catch { /* unreadable or non-regular entries are not evidence */ }
|
|
309
|
+
}
|
|
310
|
+
} catch { /* missing or unreadable provider dir */ }
|
|
311
|
+
}
|
|
312
|
+
return false;
|
|
313
|
+
}
|
|
314
|
+
const versioned = Array.isArray(manifest?.artifacts);
|
|
315
|
+
const artifacts = versioned
|
|
316
|
+
? manifest.artifacts
|
|
317
|
+
: (manifest?.filenames || []).map((filename) => ({
|
|
318
|
+
provider: filename.endsWith('.toml') ? 'codex' : 'claude-code',
|
|
319
|
+
filename,
|
|
320
|
+
sha256: null,
|
|
321
|
+
}));
|
|
322
|
+
return artifacts.some(({ provider, filename, sha256 }) => {
|
|
323
|
+
const filePath = providerAgentPath(home, provider, filename);
|
|
324
|
+
try {
|
|
325
|
+
const content = fs.readFileSync(filePath, 'utf8');
|
|
326
|
+
return sha256
|
|
327
|
+
? digestFile(filePath) === sha256
|
|
328
|
+
: !versioned && content.includes('SINAPSE-MANAGED:global-agent');
|
|
329
|
+
} catch {
|
|
330
|
+
return false;
|
|
331
|
+
}
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
|
|
128
335
|
// Story 10.40 — Strip SINAPSE-owned keys from ~/.claude/settings.json without
|
|
129
336
|
// touching anything else the user put there. Safe if the file is missing or
|
|
130
337
|
// already clean.
|
|
@@ -176,6 +383,7 @@ async function cmdUninstall(opts = {}) {
|
|
|
176
383
|
}
|
|
177
384
|
|
|
178
385
|
logger.always(`${BOLD}Uninstalling Sinapse...${NC}\n`);
|
|
386
|
+
const installedAgentsManifest = readInstalledAgentsManifest();
|
|
179
387
|
|
|
180
388
|
// Paths that are fully SINAPSE-owned (directory or launcher file)
|
|
181
389
|
const ownedItems = [
|
|
@@ -210,7 +418,7 @@ async function cmdUninstall(opts = {}) {
|
|
|
210
418
|
const claudeAgentsDir = path.join(HOME, '.claude', 'agents');
|
|
211
419
|
const codexAgentsDir = path.join(HOME, '.codex', 'agents');
|
|
212
420
|
|
|
213
|
-
const claudeRemoved = removeInstalledAgentsFrom(claudeAgentsDir);
|
|
421
|
+
const claudeRemoved = removeInstalledAgentsFrom(claudeAgentsDir, installedAgentsManifest);
|
|
214
422
|
if (!claudeRemoved.existed) {
|
|
215
423
|
logger.always(` ${YELLOW}-${NC} ~/.claude/agents/ SINAPSE files (dir not found)`);
|
|
216
424
|
} else if (claudeRemoved.removed === 0) {
|
|
@@ -219,7 +427,7 @@ async function cmdUninstall(opts = {}) {
|
|
|
219
427
|
logger.always(` ${GREEN}✓${NC} Removed ~/.claude/agents/ SINAPSE files (${claudeRemoved.removed} files)`);
|
|
220
428
|
}
|
|
221
429
|
|
|
222
|
-
const codexRemoved = removeInstalledAgentsFrom(codexAgentsDir);
|
|
430
|
+
const codexRemoved = removeInstalledAgentsFrom(codexAgentsDir, installedAgentsManifest);
|
|
223
431
|
if (!codexRemoved.existed) {
|
|
224
432
|
logger.always(` ${YELLOW}-${NC} ~/.codex/agents/ SINAPSE files (dir not found)`);
|
|
225
433
|
} else if (codexRemoved.removed === 0) {
|
|
@@ -229,6 +437,13 @@ async function cmdUninstall(opts = {}) {
|
|
|
229
437
|
}
|
|
230
438
|
|
|
231
439
|
// Story 10.40 — clean SINAPSE-owned keys from ~/.claude/settings.json
|
|
440
|
+
const skillsRemoved = removeManagedGlobalSkills(HOME);
|
|
441
|
+
if (skillsRemoved.removed > 0) {
|
|
442
|
+
logger.always(` ${GREEN}OK${NC} Removed global SINAPSE skills (${skillsRemoved.removed})`);
|
|
443
|
+
} else {
|
|
444
|
+
logger.always(` ${YELLOW}-${NC} Global SINAPSE skills (none present)`);
|
|
445
|
+
}
|
|
446
|
+
|
|
232
447
|
const settingsPath = path.join(HOME, '.claude', 'settings.json');
|
|
233
448
|
const settingsClean = cleanClaudeSettingsJson(settingsPath);
|
|
234
449
|
if (settingsClean.touched) {
|
|
@@ -259,6 +474,9 @@ module.exports = {
|
|
|
259
474
|
readInstalledAgentsManifest,
|
|
260
475
|
removeInstalledAgentsFrom,
|
|
261
476
|
removeOrqxAgentsFrom,
|
|
477
|
+
removeManagedGlobalSkills,
|
|
478
|
+
reconcileInstalledAgents,
|
|
479
|
+
hasManagedInstalledAgents,
|
|
262
480
|
cleanClaudeSettingsJson,
|
|
263
481
|
removeGitHooksConfig,
|
|
264
482
|
INSTALLED_AGENTS_MANIFEST,
|