sinapse-ai 9.3.0 → 9.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/CLAUDE.md +60 -341
- package/.claude/hooks/enforce-architecture-first.py +197 -197
- package/.claude/hooks/enforce-git-push-authority.sh +25 -4
- package/.claude/hooks/mind-clone-governance.py +193 -193
- package/.claude/hooks/read-protection.py +152 -152
- package/.claude/hooks/sql-governance.py +183 -183
- package/.claude/hooks/verify-packages.cjs +83 -0
- package/.claude/hooks/write-path-validation.py +195 -195
- package/.claude/rules/agent-authority.md +6 -0
- package/.claude/rules/agent-handoff.md +5 -0
- package/.claude/rules/cross-squad-routing.md +5 -0
- package/.claude/rules/hook-governance.md +7 -0
- package/.claude/rules/mandatory-delegation.md +24 -0
- package/.claude/rules/mcp-usage.md +3 -1
- package/.claude/rules/project-intelligence.md +63 -0
- package/.claude/rules/response-format.md +4 -0
- package/.claude/rules/safe-collaboration.md +14 -2
- package/.claude/rules/security-data-protection.md +27 -0
- package/.claude/rules/squad-awareness.md +96 -68
- package/.claude/rules/token-economy.md +148 -0
- package/.claude/rules/tool-examples.md +6 -0
- package/.claude/rules/workflow-execution.md +7 -0
- package/.codex/agents/analyst.md +342 -71
- package/.codex/agents/architect.md +533 -68
- package/.codex/agents/data-engineer.md +530 -106
- package/.codex/agents/developer.md +657 -0
- package/.codex/agents/devops.md +639 -69
- package/.codex/agents/product-lead.md +362 -0
- package/.codex/agents/project-lead.md +405 -0
- package/.codex/agents/quality-gate.md +538 -0
- package/.codex/agents/sinapse-orqx.md +9 -7
- package/.codex/agents/sprint-lead.md +315 -0
- package/.codex/agents/squad-creator.md +402 -0
- package/.codex/agents/ux-design-expert.md +523 -0
- package/.codex/delegation-matrix.json +756 -44
- package/.codex/handoff-packet.schema.json +30 -6
- package/.sinapse-ai/core/code-intel/registry-syncer.js +56 -3
- package/.sinapse-ai/core/doctor/checks/agent-memory.js +5 -1
- package/.sinapse-ai/core/doctor/checks/claude-md.js +4 -1
- package/.sinapse-ai/core/doctor/checks/code-intel.js +5 -1
- package/.sinapse-ai/core/doctor/checks/commands-count.js +4 -1
- package/.sinapse-ai/core/doctor/checks/constitution-consistency.js +4 -1
- package/.sinapse-ai/core/doctor/checks/core-config.js +4 -1
- package/.sinapse-ai/core/doctor/checks/entity-registry.js +6 -1
- package/.sinapse-ai/core/doctor/checks/git-hooks.js +5 -1
- package/.sinapse-ai/core/doctor/checks/graph-dashboard.js +4 -1
- package/.sinapse-ai/core/doctor/checks/hooks-claude-count.js +5 -1
- package/.sinapse-ai/core/doctor/checks/ide-sync.js +4 -1
- package/.sinapse-ai/core/doctor/checks/node-version.js +4 -1
- package/.sinapse-ai/core/doctor/checks/npm-packages.js +4 -1
- package/.sinapse-ai/core/doctor/checks/rules-files.js +4 -1
- package/.sinapse-ai/core/doctor/checks/settings-json.js +4 -1
- package/.sinapse-ai/core/doctor/checks/skills-count.js +4 -1
- package/.sinapse-ai/core/doctor/index.js +157 -50
- package/.sinapse-ai/core/ids/registry-updater.js +6 -1
- package/.sinapse-ai/core/logger/index.js +319 -0
- package/.sinapse-ai/core/orchestration/terminal-spawner.js +2 -2
- package/.sinapse-ai/core/telemetry/index.js +247 -0
- package/.sinapse-ai/data/entity-registry.yaml +1060 -808
- package/.sinapse-ai/development/agents/analyst.md +90 -0
- package/.sinapse-ai/development/agents/architect.md +78 -0
- package/.sinapse-ai/development/agents/data-engineer.md +38 -0
- package/.sinapse-ai/development/agents/developer.md +97 -0
- package/.sinapse-ai/development/agents/devops.md +121 -0
- package/.sinapse-ai/development/agents/product-lead.md +27 -0
- package/.sinapse-ai/development/agents/project-lead.md +28 -0
- package/.sinapse-ai/development/agents/quality-gate.md +89 -0
- package/.sinapse-ai/development/agents/sprint-lead/MEMORY.md +8 -0
- package/.sinapse-ai/development/agents/sprint-lead.md +28 -0
- package/.sinapse-ai/development/agents/squad-creator.md +58 -0
- package/.sinapse-ai/development/agents/ux-design-expert.md +28 -0
- package/.sinapse-ai/development/checklists/agent-quality-gate.md +27 -0
- package/.sinapse-ai/development/checklists/brownfield-compatibility-checklist.md +20 -0
- package/.sinapse-ai/development/checklists/code-review-checklist.md +106 -0
- package/.sinapse-ai/development/checklists/issue-triage-checklist.md +9 -0
- package/.sinapse-ai/development/checklists/memory-audit-checklist.md +16 -0
- package/.sinapse-ai/development/checklists/pr-quality-checklist.md +72 -0
- package/.sinapse-ai/development/checklists/security-deployment-checklist.md +54 -0
- package/.sinapse-ai/development/checklists/self-critique-checklist.md +19 -1
- package/.sinapse-ai/development/knowledge-base/agent-communication-protocol.md +127 -0
- package/.sinapse-ai/development/knowledge-base/database-scaling-patterns.md +374 -0
- package/.sinapse-ai/development/knowledge-base/environment-deployment-patterns.md +353 -0
- package/.sinapse-ai/development/knowledge-base/gotchas-patterns.md +224 -0
- package/.sinapse-ai/development/knowledge-base/infrastructure-decision-framework.md +221 -0
- package/.sinapse-ai/development/knowledge-base/security-pre-deploy-checklist.md +410 -0
- package/.sinapse-ai/development/knowledge-base/software-architecture-patterns.md +299 -0
- package/.sinapse-ai/development/knowledge-base/token-economy-guide.md +198 -0
- package/.sinapse-ai/development/scripts/populate-entity-registry.js +5 -1
- package/.sinapse-ai/development/skills/captcha-handler.md +82 -0
- package/.sinapse-ai/development/skills/chrome-brain.md +81 -0
- package/.sinapse-ai/development/skills/debug.md +57 -0
- package/.sinapse-ai/development/skills/deploy-readiness.md +93 -0
- package/.sinapse-ai/development/skills/fast-review.md +69 -0
- package/.sinapse-ai/development/skills/model-router.md +92 -0
- package/.sinapse-ai/development/skills/research-synthesis.md +77 -0
- package/.sinapse-ai/development/skills/security-scan.md +73 -0
- package/.sinapse-ai/development/skills/sinapse-methodology.md +175 -0
- package/.sinapse-ai/development/skills/story-fast-track.md +71 -0
- package/.sinapse-ai/development/skills/verify.md +53 -0
- package/.sinapse-ai/development/tasks/dev-develop-story.md +10 -0
- package/.sinapse-ai/development/tasks/environment-promotion-pipeline.md +582 -0
- package/.sinapse-ai/development/tasks/generate-agent-handoff.md +223 -0
- package/.sinapse-ai/development/tasks/infrastructure-assessment.md +432 -0
- package/.sinapse-ai/development/tasks/load-testing-setup.md +611 -0
- package/.sinapse-ai/development/tasks/observability-blueprint.md +562 -0
- package/.sinapse-ai/development/templates/legal/breach-notification-tmpl.md +113 -0
- package/.sinapse-ai/development/templates/legal/privacy-policy-tmpl.md +93 -0
- package/.sinapse-ai/development/templates/legal/terms-of-service-tmpl.md +85 -0
- package/.sinapse-ai/development/templates/service-template/README.md.hbs +159 -159
- package/.sinapse-ai/development/templates/service-template/__tests__/index.test.ts.hbs +238 -238
- package/.sinapse-ai/development/templates/service-template/client.ts.hbs +404 -404
- package/.sinapse-ai/development/templates/service-template/errors.ts.hbs +183 -183
- package/.sinapse-ai/development/templates/service-template/index.ts.hbs +121 -121
- package/.sinapse-ai/development/templates/service-template/package.json.hbs +88 -88
- package/.sinapse-ai/development/templates/service-template/types.ts.hbs +146 -146
- package/.sinapse-ai/development/templates/squad/agent-template.md +17 -4
- package/.sinapse-ai/development/templates/squad/checklist-template.md +13 -5
- package/.sinapse-ai/development/templates/squad/task-template.md +7 -0
- package/.sinapse-ai/development/templates/squad/workflow-template.yaml +7 -0
- package/.sinapse-ai/development/templates/squad-template/LICENSE +22 -22
- package/.sinapse-ai/development/workflows/fast-track.yaml +87 -0
- package/.sinapse-ai/development/workflows/story-development-cycle.yaml +40 -1
- package/.sinapse-ai/hooks/ids-post-commit.js +22 -0
- package/.sinapse-ai/infrastructure/contracts/compatibility/README.md +42 -0
- package/.sinapse-ai/infrastructure/contracts/compatibility/sinapse-current.yaml +35 -0
- package/.sinapse-ai/infrastructure/scripts/llm-routing/templates/claude-free-tracked.cmd +127 -127
- package/.sinapse-ai/infrastructure/scripts/llm-routing/templates/deepseek-proxy.cmd +71 -71
- package/.sinapse-ai/infrastructure/scripts/llm-routing/templates/deepseek-usage.cmd +51 -51
- package/.sinapse-ai/infrastructure/scripts/pr-review-ai.js +16 -13
- package/.sinapse-ai/infrastructure/scripts/setup-project-infra.js +128 -0
- package/.sinapse-ai/infrastructure/scripts/test-discovery.js +8 -3
- package/.sinapse-ai/infrastructure/scripts/validate-codex-delegation.js +3 -1
- package/.sinapse-ai/infrastructure/scripts/validate-manifest-parity.js +380 -0
- package/.sinapse-ai/infrastructure/scripts/validate-parity.js +76 -25
- package/.sinapse-ai/infrastructure/templates/coderabbit.yaml.template +280 -280
- package/.sinapse-ai/infrastructure/templates/config/env.example +16 -0
- package/.sinapse-ai/infrastructure/templates/config/gitignore-additions.tmpl +59 -0
- package/.sinapse-ai/infrastructure/templates/github/CODEOWNERS.template +12 -0
- package/.sinapse-ai/infrastructure/templates/github/PULL_REQUEST_TEMPLATE.md +29 -0
- package/.sinapse-ai/infrastructure/templates/github/ci-template.yml +77 -0
- package/.sinapse-ai/infrastructure/templates/github/issue-templates/bug_report.md +34 -0
- package/.sinapse-ai/infrastructure/templates/github/issue-templates/feature_request.md +19 -0
- package/.sinapse-ai/infrastructure/templates/github-workflows/ci.yml.template +170 -170
- package/.sinapse-ai/infrastructure/templates/github-workflows/pr-automation.yml.template +331 -331
- package/.sinapse-ai/infrastructure/templates/github-workflows/release.yml.template +197 -197
- package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-brownfield-merge.tmpl +19 -19
- package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-node.tmpl +86 -86
- package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-python.tmpl +146 -146
- package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-sinapse-base.tmpl +64 -64
- package/.sinapse-ai/infrastructure/templates/sinapse-sync.yaml.template +183 -183
- package/.sinapse-ai/install-manifest.yaml +333 -162
- package/.sinapse-ai/local-config.yaml.template +65 -65
- package/.sinapse-ai/monitor/hooks/lib/__init__.py +2 -2
- package/.sinapse-ai/monitor/hooks/lib/enrich.py +59 -59
- package/.sinapse-ai/monitor/hooks/lib/send_event.py +48 -48
- package/.sinapse-ai/monitor/hooks/notification.py +30 -30
- package/.sinapse-ai/monitor/hooks/post_tool_use.py +46 -46
- package/.sinapse-ai/monitor/hooks/pre_compact.py +30 -30
- package/.sinapse-ai/monitor/hooks/pre_tool_use.py +41 -41
- package/.sinapse-ai/monitor/hooks/stop.py +30 -30
- package/.sinapse-ai/monitor/hooks/subagent_stop.py +30 -30
- package/.sinapse-ai/monitor/hooks/user_prompt_submit.py +39 -39
- package/.sinapse-ai/product/templates/adr.hbs +126 -126
- package/.sinapse-ai/product/templates/dbdr.hbs +242 -242
- package/.sinapse-ai/product/templates/epic.hbs +213 -213
- package/.sinapse-ai/product/templates/pmdr.hbs +187 -187
- package/.sinapse-ai/product/templates/prd-v2.0.hbs +217 -217
- package/.sinapse-ai/product/templates/prd.hbs +202 -202
- package/.sinapse-ai/product/templates/story-tmpl.yaml +59 -0
- package/.sinapse-ai/product/templates/story.hbs +264 -264
- package/.sinapse-ai/product/templates/task.hbs +171 -171
- package/.sinapse-ai/product/templates/tmpl-comment-on-examples.sql +159 -159
- package/.sinapse-ai/product/templates/tmpl-migration-script.sql +92 -92
- package/.sinapse-ai/product/templates/tmpl-rls-granular-policies.sql +105 -105
- package/.sinapse-ai/product/templates/tmpl-rls-kiss-policy.sql +11 -11
- package/.sinapse-ai/product/templates/tmpl-rls-roles.sql +136 -136
- package/.sinapse-ai/product/templates/tmpl-rls-simple.sql +78 -78
- package/.sinapse-ai/product/templates/tmpl-rls-tenant.sql +153 -153
- package/.sinapse-ai/product/templates/tmpl-rollback-script.sql +78 -78
- package/.sinapse-ai/product/templates/tmpl-seed-data.sql +141 -141
- package/.sinapse-ai/product/templates/tmpl-smoke-test.sql +17 -17
- package/.sinapse-ai/product/templates/tmpl-staging-copy-merge.sql +140 -140
- package/.sinapse-ai/product/templates/tmpl-stored-proc.sql +141 -141
- package/.sinapse-ai/product/templates/tmpl-trigger.sql +153 -153
- package/.sinapse-ai/product/templates/tmpl-view-materialized.sql +134 -134
- package/.sinapse-ai/product/templates/tmpl-view.sql +178 -178
- package/.sinapse-ai/scripts/diagnostics/health-dashboard/package-lock.json +427 -355
- package/LICENSE +34 -34
- package/README.en.md +167 -20
- package/README.md +190 -22
- package/bin/cli.js +510 -196
- package/bin/postinstall.js +564 -0
- package/bin/sinapse-cli +283 -283
- package/bin/sinapse-graph.js +9 -0
- package/bin/sinapse-init.js +36 -4
- package/bin/sinapse-minimal.js +20 -9
- package/bin/sinapse.js +202 -122
- package/bin/utils/deprecation-warning.js +46 -0
- package/bin/utils/pre-push-safety.js +14 -0
- package/docs/TELEMETRY.md +131 -0
- package/docs/chrome-brain-upgrade-plan.md +624 -0
- package/docs/codex-integration-process.md +22 -0
- package/docs/codex-parity-program.md +27 -0
- package/docs/framework/orqx-plan.md +1 -1
- package/docs/ide-integration.md +36 -0
- package/docs/installation/chrome-brain.md +17 -7
- package/docs/mega-upgrade-orchestration-plan.md +71 -0
- package/docs/pt/contributing.md +20 -0
- package/docs/research-synthesis-for-upgrade.md +511 -0
- package/docs/security-audit-report.md +306 -0
- package/package.json +20 -8
- package/packages/installer/src/config/configure-environment.js +19 -44
- package/packages/installer/src/detection/detect-project-type.js +181 -63
- package/packages/installer/src/installer/manifest-signature.js +32 -17
- package/packages/installer/src/wizard/i18n.js +12 -0
- package/packages/installer/src/wizard/ide-config-generator.js +8 -39
- package/packages/installer/src/wizard/index.js +119 -14
- package/packages/installer/src/wizard/questions.js +2 -3
- package/packages/installer/tests/integration/environment-configuration.test.js +7 -5
- package/packages/installer/tests/unit/detection/detect-project-type.test.js +138 -1
- package/packages/installer/tests/unit/doctor/doctor-orchestrator.test.js +3 -3
- package/packages/sinapse-install/bin/edmcp.js +0 -0
- package/packages/sinapse-install/bin/sinapse-install.js +0 -0
- package/packages/sinapse-pro-cli/bin/sinapse-pro.js +0 -0
- package/scripts/check-markdown-links.py +353 -353
- package/scripts/coverage-report-summary.js +169 -0
- package/scripts/generate-install-manifest.js +6 -2
- package/scripts/release-readiness.js +169 -0
- package/scripts/test-install-matrix-local.sh +153 -0
- package/scripts/validate-install-docs.js +394 -0
- package/scripts/validate-no-external-refs.js +376 -0
- package/scripts/validate-squad-orqx.js +302 -0
- package/scripts/validate-story-meta.js +263 -0
- package/squads/claude-code-mastery/CHANGELOG.md +1 -1
- package/squads/claude-code-mastery/README.md +2 -2
- package/squads/claude-code-mastery/knowledge-base/claude-code-internals-reference.md +927 -0
- package/squads/claude-code-mastery/squad.yaml +1 -1
- package/squads/squad-artdir/README.md +90 -0
- package/squads/squad-artdir/agents/accessibility-guardian.md +184 -0
- package/squads/squad-artdir/agents/artdir-orqx.md +145 -0
- package/squads/squad-artdir/agents/color-psychologist.md +166 -0
- package/squads/squad-artdir/agents/cro-persuasion.md +161 -0
- package/squads/squad-artdir/agents/design-system-architect.md +100 -0
- package/squads/squad-artdir/agents/ia-architect.md +169 -0
- package/squads/squad-artdir/agents/interaction-designer.md +162 -0
- package/squads/squad-artdir/agents/layout-engineer.md +163 -0
- package/squads/squad-artdir/agents/motion-architect.md +185 -0
- package/squads/squad-artdir/agents/platform-aesthetic-director.md +84 -0
- package/squads/squad-artdir/agents/premium-packaging-strategist.md +107 -0
- package/squads/squad-artdir/agents/product-surface-director.md +86 -0
- package/squads/squad-artdir/agents/type-systemist.md +138 -0
- package/squads/squad-artdir/agents/visual-strategist.md +127 -0
- package/squads/squad-artdir/checklists/seven-pillars-validation-checklist.md +172 -0
- package/squads/squad-artdir/knowledge-base/case-nyo-ia-reference.md +289 -0
- package/squads/squad-artdir/knowledge-base/deliverables-templates.md +457 -0
- package/squads/squad-artdir/knowledge-base/motion-technique-catalog.md +247 -0
- package/squads/squad-artdir/knowledge-base/premium-packaging-principles.md +133 -0
- package/squads/squad-artdir/knowledge-base/psychological-toolkit.md +229 -0
- package/squads/squad-artdir/knowledge-base/saas-art-direction-canon.md +242 -0
- package/squads/squad-artdir/knowledge-base/seven-pillars-framework.md +289 -0
- package/squads/squad-artdir/knowledge-base/ten-pillars-framework.md +221 -0
- package/squads/squad-artdir/package.json +20 -0
- package/squads/squad-artdir/squad.yaml +271 -0
- package/squads/squad-artdir/tasks/audit-conversion.md +97 -0
- package/squads/squad-artdir/tasks/audit-drift-multi-surface.md +55 -0
- package/squads/squad-artdir/tasks/consult-saas-canon.md +54 -0
- package/squads/squad-artdir/tasks/create-art-direction-brief.md +110 -0
- package/squads/squad-artdir/tasks/create-premium-packaging-brief.md +61 -0
- package/squads/squad-artdir/tasks/create-wireflow.md +84 -0
- package/squads/squad-artdir/tasks/design-color-system.md +81 -0
- package/squads/squad-artdir/tasks/design-product-surface.md +60 -0
- package/squads/squad-artdir/tasks/design-token-system.md +58 -0
- package/squads/squad-artdir/tasks/diagnose-visual-language.md +92 -0
- package/squads/squad-artdir/tasks/first-5-minutes-choreography.md +65 -0
- package/squads/squad-artdir/tasks/specify-motion-system.md +84 -0
- package/squads/squad-artdir/tasks/validate-against-pillars.md +143 -0
- package/squads/squad-artdir/templates/art-direction-brief-template.md +215 -0
- package/squads/squad-artdir/workflows/conversion-audit-cycle.yaml +78 -0
- package/squads/squad-artdir/workflows/full-art-direction-cycle.yaml +98 -0
- package/squads/squad-artdir/workflows/saas-platform-art-direction-cycle.yaml +174 -0
- package/squads/squad-brand/knowledge-base/ai-visual-generation-canon.md +234 -0
- package/squads/squad-brand/knowledge-base/archetype-brand-mapping.md +12 -1
- package/squads/squad-brand/knowledge-base/brand-activism-cultural-branding.md +216 -0
- package/squads/squad-brand/knowledge-base/brand-audit-criteria.md +58 -0
- package/squads/squad-brand/knowledge-base/brand-digital-strategy.md +188 -0
- package/squads/squad-brand/knowledge-base/brand-legal-ip.md +222 -0
- package/squads/squad-brand/knowledge-base/brand-naming-framework.md +163 -0
- package/squads/squad-brand/knowledge-base/branding-master-reference.md +1001 -0
- package/squads/squad-brand/knowledge-base/color-psychology.md +25 -12
- package/squads/squad-brand/knowledge-base/employer-personal-branding.md +206 -0
- package/squads/squad-brand/knowledge-base/routing-catalog.md +34 -0
- package/squads/squad-brand/knowledge-base/sonic-branding-principles.md +6 -1
- package/squads/squad-brand/knowledge-base/typography-personality.md +34 -0
- package/squads/squad-brand/squad.yaml +20 -6
- package/squads/squad-claude/knowledge-base/context-window-optimization.md +334 -0
- package/squads/squad-claude/knowledge-base/knowledge-architecture-reference.md +403 -0
- package/squads/squad-claude/knowledge-base/memory-systems-reference.md +412 -0
- package/squads/squad-claude/knowledge-base/obsidian-claude-integration.md +423 -0
- package/squads/squad-claude/knowledge-base/retrieval-augmented-generation.md +320 -0
- package/squads/squad-claude/knowledge-base/skill-creation-patterns.md +380 -0
- package/squads/squad-claude/knowledge-base/swarm-orchestration-patterns.md +411 -0
- package/squads/squad-cloning/knowledge-base/clone-quality-assurance.md +211 -0
- package/squads/squad-cloning/knowledge-base/confidence-scoring.md +51 -0
- package/squads/squad-cloning/knowledge-base/cross-squad-deployment.md +47 -0
- package/squads/squad-cloning/knowledge-base/ethical-guidelines.md +237 -0
- package/squads/squad-cloning/knowledge-base/knowledge-graph-for-clones.md +295 -0
- package/squads/squad-cloning/knowledge-base/memory-architecture-for-clones.md +229 -0
- package/squads/squad-cloning/knowledge-base/multi-agent-deployment-patterns.md +320 -0
- package/squads/squad-cloning/knowledge-base/skill-standard-for-clones.md +262 -0
- package/squads/squad-cloning/knowledge-base/sop-extraction-guide.md +243 -0
- package/squads/squad-commercial/knowledge-base/account-based-selling.md +206 -0
- package/squads/squad-commercial/knowledge-base/ai-as-competitive-infrastructure.md +14 -0
- package/squads/squad-commercial/knowledge-base/ai-in-sales.md +199 -0
- package/squads/squad-commercial/knowledge-base/brazilian-sales-context.md +195 -0
- package/squads/squad-commercial/knowledge-base/customer-success-operations.md +83 -2
- package/squads/squad-commercial/knowledge-base/prospecting-pipeline-generation.md +69 -0
- package/squads/squad-commercial/knowledge-base/sales-enablement-playbook.md +260 -0
- package/squads/squad-commercial/knowledge-base/sales-methodology-comparison.md +185 -0
- package/squads/squad-commercial/knowledge-base/sales-revenue-master-reference.md +1123 -0
- package/squads/squad-content/knowledge-base/ai-native-content-loop.md +220 -0
- package/squads/squad-content/knowledge-base/brazilian-content-context.md +176 -0
- package/squads/squad-content/knowledge-base/competitor-analysis-methods.md +40 -1
- package/squads/squad-content/knowledge-base/content-architecture-taxonomy.md +206 -0
- package/squads/squad-content/knowledge-base/content-formats-encyclopedia.md +58 -1
- package/squads/squad-content/knowledge-base/content-references-bibliography.md +130 -0
- package/squads/squad-content/knowledge-base/content-strategy-master-reference.md +1097 -0
- package/squads/squad-content/knowledge-base/content-tech-stack.md +150 -0
- package/squads/squad-content/knowledge-base/copywriting-formulas-library.md +188 -0
- package/squads/squad-content/knowledge-base/email-newsletter-strategy.md +161 -0
- package/squads/squad-content/knowledge-base/platform-algorithm-intelligence.md +86 -1
- package/squads/squad-content/knowledge-base/signal-intelligence-v2.md +234 -0
- package/squads/squad-content/knowledge-base/social-algorithms-master-reference.md +1007 -0
- package/squads/squad-content/knowledge-base/task-ownership-map.md +235 -0
- package/squads/squad-content/knowledge-base/video-audio-content-playbook.md +218 -0
- package/squads/squad-content/squad.yaml +187 -27
- package/squads/squad-copy/knowledge-base/ai-copy-human-loop-canon.md +235 -0
- package/squads/squad-copy/knowledge-base/ai-copy-production.md +254 -0
- package/squads/squad-copy/knowledge-base/brazilian-copywriting-context.md +242 -0
- package/squads/squad-copy/knowledge-base/email-copywriting-system.md +299 -0
- package/squads/squad-copy/knowledge-base/landing-page-copy-architecture.md +267 -0
- package/squads/squad-copy/knowledge-base/power-words-catalog.md +205 -0
- package/squads/squad-copy/knowledge-base/seo-copywriting.md +255 -0
- package/squads/squad-copy/knowledge-base/video-script-copywriting.md +239 -0
- package/squads/squad-copy/squad.yaml +19 -4
- package/squads/squad-council/knowledge-base/brand-strategy-models.md +193 -0
- package/squads/squad-council/knowledge-base/growth-strategy-models.md +267 -0
- package/squads/squad-council/knowledge-base/innovation-disruption-frameworks.md +193 -0
- package/squads/squad-council/knowledge-base/market-analysis-frameworks.md +240 -0
- package/squads/squad-council/knowledge-base/organizational-leadership-models.md +212 -0
- package/squads/squad-council/knowledge-base/sales-strategy-models.md +215 -0
- package/squads/squad-courses/knowledge-base/course-launch-strategy.md +251 -0
- package/squads/squad-courses/knowledge-base/domain-advocacia-curriculum.md +385 -0
- package/squads/squad-courses/knowledge-base/domain-contabilidade-curriculum.md +266 -0
- package/squads/squad-courses/knowledge-base/platform-comparison.md +68 -0
- package/squads/squad-courses/knowledge-base/video-production-guide.md +70 -0
- package/squads/squad-cybersecurity/knowledge-base/cloud-security-reference.md +363 -0
- package/squads/squad-cybersecurity/knowledge-base/compliance-frameworks.md +273 -0
- package/squads/squad-cybersecurity/knowledge-base/database-security.md +438 -0
- package/squads/squad-cybersecurity/knowledge-base/incident-response-playbook.md +420 -0
- package/squads/squad-cybersecurity/knowledge-base/network-security-reference.md +477 -0
- package/squads/squad-cybersecurity/knowledge-base/penetration-testing-methodology.md +350 -0
- package/squads/squad-cybersecurity/knowledge-base/vulnerability-management.md +349 -0
- package/squads/squad-design/knowledge-base/brazilian-design-context.md +223 -0
- package/squads/squad-design/knowledge-base/component-api-patterns.md +208 -4
- package/squads/squad-design/knowledge-base/cross-surface-token-canon.md +209 -0
- package/squads/squad-design/knowledge-base/design-system-master-reference.md +1302 -0
- package/squads/squad-design/knowledge-base/design-systems-frameworks.md +91 -1
- package/squads/squad-design/knowledge-base/responsive-modern-css.md +96 -4
- package/squads/squad-design/knowledge-base/wcag-aria-reference.md +117 -5
- package/squads/squad-design/knowledge-base/web-performance-reference.md +127 -4
- package/squads/squad-design/squad.yaml +19 -4
- package/squads/squad-finance/knowledge-base/brazilian-taxation.md +263 -0
- package/squads/squad-finance/knowledge-base/contabilidade-master-reference.md +998 -0
- package/squads/squad-finance/knowledge-base/finance-master-reference.md +946 -0
- package/squads/squad-finance/knowledge-base/financial-reporting-analysis.md +316 -0
- package/squads/squad-finance/knowledge-base/fintech-brazilian-context.md +242 -0
- package/squads/squad-finance/knowledge-base/fpa-planning-frameworks.md +286 -0
- package/squads/squad-finance/knowledge-base/ma-and-transactions.md +285 -0
- package/squads/squad-finance/knowledge-base/risk-management.md +233 -0
- package/squads/squad-finance/knowledge-base/startups-venture-capital.md +337 -0
- package/squads/squad-growth/knowledge-base/ai-growth-playbook.md +216 -0
- package/squads/squad-growth/knowledge-base/attribution-models.md +78 -0
- package/squads/squad-growth/knowledge-base/brazilian-growth-context.md +208 -0
- package/squads/squad-growth/knowledge-base/community-led-growth.md +175 -0
- package/squads/squad-growth/knowledge-base/content-marketing-flywheel.md +190 -0
- package/squads/squad-growth/knowledge-base/email-lifecycle-framework.md +192 -0
- package/squads/squad-growth/knowledge-base/growth-frameworks-catalog.md +82 -0
- package/squads/squad-growth/knowledge-base/growth-master-reference.md +1168 -0
- package/squads/squad-growth/knowledge-base/routing-catalog.md +53 -11
- package/squads/squad-paidmedia/knowledge-base/audiences-segmentation-deep.md +285 -0
- package/squads/squad-paidmedia/knowledge-base/creative-strategy-deep.md +294 -0
- package/squads/squad-paidmedia/knowledge-base/google-ads-account-architecture.md +87 -0
- package/squads/squad-paidmedia/knowledge-base/meta-ads-campaign-architecture.md +76 -0
- package/squads/squad-paidmedia/knowledge-base/paid-media-metrics-reference.md +117 -0
- package/squads/squad-paidmedia/knowledge-base/paid-traffic-master-reference.md +1308 -0
- package/squads/squad-paidmedia/knowledge-base/routing-catalog.md +95 -18
- package/squads/squad-paidmedia/knowledge-base/traffic-masters-frameworks.md +71 -0
- package/squads/squad-product/knowledge-base/brazilian-product-context.md +284 -0
- package/squads/squad-product/knowledge-base/discovery-methodology-playbook.md +141 -0
- package/squads/squad-product/knowledge-base/pm-frameworks-reference.md +125 -9
- package/squads/squad-product/knowledge-base/product-analytics-formulas.md +72 -0
- package/squads/squad-product/knowledge-base/product-led-growth-reference.md +155 -13
- package/squads/squad-product/knowledge-base/product-market-fit-framework.md +222 -0
- package/squads/squad-product/knowledge-base/routing-catalog.md +32 -0
- package/squads/squad-research/knowledge-base/agentic-second-brain-reference.md +591 -0
- package/squads/squad-research/knowledge-base/ai-augmented-research.md +212 -0
- package/squads/squad-research/knowledge-base/brazilian-market-research-sources.md +197 -0
- package/squads/squad-research/knowledge-base/community-platforms-reference.md +786 -0
- package/squads/squad-research/knowledge-base/community-research-methods.md +194 -0
- package/squads/squad-research/knowledge-base/mixed-methods-research-design.md +168 -0
- package/squads/squad-research/knowledge-base/network-effects-analysis.md +192 -0
- package/squads/squad-research/knowledge-base/qualitative-research-deep-methods.md +202 -0
- package/squads/squad-research/knowledge-base/quantitative-research-methods.md +208 -0
- package/squads/squad-research/knowledge-base/research-frameworks-encyclopedia.md +40 -0
- package/squads/squad-research/knowledge-base/research-synthesis-frameworks.md +223 -0
- package/squads/squad-storytelling/knowledge-base/brand-mythology-framework.md +236 -0
- package/squads/squad-storytelling/knowledge-base/brazilian-storytelling-context.md +237 -0
- package/squads/squad-storytelling/knowledge-base/data-storytelling.md +232 -0
- package/squads/squad-storytelling/knowledge-base/improv-storytelling.md +226 -0
- package/squads/squad-storytelling/knowledge-base/persuasion-narrative-techniques.md +269 -0
- package/squads/squad-storytelling/knowledge-base/social-movement-narratives.md +191 -0
- package/squads/squad-storytelling/knowledge-base/video-storytelling.md +252 -0
- package/.sinapse-ai/core/registry/service-registry.json +0 -6346
- package/.sinapse-ai/data/registry-update-log.jsonl +0 -1307
- package/.sinapse-ai/manifests/agents.csv +0 -29
- package/.sinapse-ai/manifests/tasks.csv +0 -204
- package/.sinapse-ai/manifests/workers.csv +0 -196
- package/squads/claude-code-mastery/data/swarm-orchestration-patterns.yaml +0 -378
- package/squads/squad-animations/knowledge-base/framer-motion-complete-reference.md +0 -710
- package/squads/squad-animations/knowledge-base/web-animations-api-view-transitions.md +0 -478
- package/squads/squad-growth/tasks/calculate-sample-size.md +0 -121
- package/squads/squad-paidmedia/tasks/calculate-sample-size.md +0 -57
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* SINAPSE Logger — unified logging abstraction
|
|
5
|
+
* @story A.2 - Logger & Verbose Flag Refactor
|
|
6
|
+
*
|
|
7
|
+
* Levels:
|
|
8
|
+
* error = 0 (always shown, except nothing is shown in --json mode until flush)
|
|
9
|
+
* warn = 1 (default floor — shown unless --quiet)
|
|
10
|
+
* info = 2 (shown on --verbose)
|
|
11
|
+
* debug = 3 (shown on --debug)
|
|
12
|
+
*
|
|
13
|
+
* Flag resolution priority (highest wins):
|
|
14
|
+
* --quiet > --debug > --verbose > default(warn)
|
|
15
|
+
*
|
|
16
|
+
* Extra modes:
|
|
17
|
+
* --json Structured output: all human text is suppressed; logger accumulates a
|
|
18
|
+
* JSON summary which is flushed at process exit (flush() also callable).
|
|
19
|
+
*
|
|
20
|
+
* First-run detection:
|
|
21
|
+
* ASCII art header is gated by level (info+) OR the absence of
|
|
22
|
+
* ~/.sinapse/.first-run-done. The first run creates this flag file.
|
|
23
|
+
*
|
|
24
|
+
* Design constraints (from story Dev Notes):
|
|
25
|
+
* - Zero external deps (pure Node stdlib).
|
|
26
|
+
* - Safe on repeated require() from bin/cli.js and bin/sinapse.js in same process.
|
|
27
|
+
* - Tests can call createLogger({ level, json }) to build isolated instances.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
const fs = require('fs');
|
|
31
|
+
const os = require('os');
|
|
32
|
+
const path = require('path');
|
|
33
|
+
|
|
34
|
+
const LEVELS = Object.freeze({
|
|
35
|
+
error: 0,
|
|
36
|
+
warn: 1,
|
|
37
|
+
info: 2,
|
|
38
|
+
debug: 3,
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
const LEVEL_NAMES = Object.freeze(['error', 'warn', 'info', 'debug']);
|
|
42
|
+
|
|
43
|
+
const DEFAULT_LEVEL = 'warn';
|
|
44
|
+
|
|
45
|
+
const SINAPSE_HOME = path.join(os.homedir(), '.sinapse');
|
|
46
|
+
const FIRST_RUN_FLAG = path.join(SINAPSE_HOME, '.first-run-done');
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Resolve level from parsed flags. Higher verbosity wins unless --quiet is set.
|
|
50
|
+
* --quiet beats everything else (error only).
|
|
51
|
+
* @param {{ quiet?: boolean, debug?: boolean, verbose?: boolean }} flags
|
|
52
|
+
* @returns {'error'|'warn'|'info'|'debug'}
|
|
53
|
+
*/
|
|
54
|
+
function resolveLevel(flags = {}) {
|
|
55
|
+
if (flags.quiet) return 'error';
|
|
56
|
+
if (flags.debug) return 'debug';
|
|
57
|
+
if (flags.verbose) return 'info';
|
|
58
|
+
return DEFAULT_LEVEL;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Parse verbosity/output flags from an argv-like array (process.argv.slice(2)).
|
|
63
|
+
* Non-destructive — returns a plain object, does not mutate the input.
|
|
64
|
+
* @param {string[]} argv
|
|
65
|
+
*/
|
|
66
|
+
function parseFlags(argv) {
|
|
67
|
+
const a = Array.isArray(argv) ? argv : [];
|
|
68
|
+
const has = (name) => a.includes(name);
|
|
69
|
+
return {
|
|
70
|
+
quiet: has('--quiet') || has('-q'),
|
|
71
|
+
verbose: has('--verbose') || has('-v'),
|
|
72
|
+
debug: has('--debug'),
|
|
73
|
+
json: has('--json'),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Detect whether this is a first run. True when the flag file does NOT exist.
|
|
79
|
+
* Any filesystem error is treated as "not first run" to avoid breaking headless
|
|
80
|
+
* environments (safer default: stay quiet).
|
|
81
|
+
*/
|
|
82
|
+
function isFirstRun() {
|
|
83
|
+
try {
|
|
84
|
+
return !fs.existsSync(FIRST_RUN_FLAG);
|
|
85
|
+
} catch {
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Mark first run as done by touching the flag file. Idempotent and failure-tolerant.
|
|
92
|
+
*/
|
|
93
|
+
function markFirstRunDone() {
|
|
94
|
+
try {
|
|
95
|
+
if (!fs.existsSync(SINAPSE_HOME)) {
|
|
96
|
+
fs.mkdirSync(SINAPSE_HOME, { recursive: true });
|
|
97
|
+
}
|
|
98
|
+
if (!fs.existsSync(FIRST_RUN_FLAG)) {
|
|
99
|
+
fs.writeFileSync(FIRST_RUN_FLAG, `${new Date().toISOString()}\n`, 'utf8');
|
|
100
|
+
}
|
|
101
|
+
} catch {
|
|
102
|
+
/* non-fatal — first-run detection will just keep asking */
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Build a logger instance.
|
|
108
|
+
* @param {object} [opts]
|
|
109
|
+
* @param {'error'|'warn'|'info'|'debug'} [opts.level] explicit level (overrides flags)
|
|
110
|
+
* @param {boolean} [opts.json] json mode
|
|
111
|
+
* @param {NodeJS.WritableStream} [opts.stdout] stdout sink (testable)
|
|
112
|
+
* @param {NodeJS.WritableStream} [opts.stderr] stderr sink (testable)
|
|
113
|
+
*/
|
|
114
|
+
function createLogger(opts = {}) {
|
|
115
|
+
const level = opts.level && LEVELS[opts.level] !== undefined ? opts.level : DEFAULT_LEVEL;
|
|
116
|
+
const threshold = LEVELS[level];
|
|
117
|
+
const json = Boolean(opts.json);
|
|
118
|
+
const stdout = opts.stdout || process.stdout;
|
|
119
|
+
const stderr = opts.stderr || process.stderr;
|
|
120
|
+
|
|
121
|
+
// JSON-mode accumulator. Flushed as a single JSON object on flush() or process exit.
|
|
122
|
+
const jsonState = {
|
|
123
|
+
status: 'ok',
|
|
124
|
+
version: null,
|
|
125
|
+
agents: [],
|
|
126
|
+
warnings: [],
|
|
127
|
+
errors: [],
|
|
128
|
+
messages: [],
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
function emit(channel, lvl, args) {
|
|
132
|
+
if (json) {
|
|
133
|
+
const text = args
|
|
134
|
+
.map((a) => (a instanceof Error ? a.stack || a.message : typeof a === 'object' ? safeStringify(a) : String(a)))
|
|
135
|
+
.join(' ');
|
|
136
|
+
if (lvl === 'error') jsonState.errors.push(text);
|
|
137
|
+
else if (lvl === 'warn') jsonState.warnings.push(text);
|
|
138
|
+
else jsonState.messages.push({ level: lvl, text });
|
|
139
|
+
if (lvl === 'error') jsonState.status = 'error';
|
|
140
|
+
else if (lvl === 'warn' && jsonState.status === 'ok') jsonState.status = 'warn';
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
const stream = channel === 'stderr' ? stderr : stdout;
|
|
144
|
+
try {
|
|
145
|
+
stream.write(`${formatArgs(args)}\n`);
|
|
146
|
+
} catch {
|
|
147
|
+
/* broken pipe / closed stream — swallow */
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function formatArgs(args) {
|
|
152
|
+
return args
|
|
153
|
+
.map((a) => {
|
|
154
|
+
if (a instanceof Error) return a.stack || a.message;
|
|
155
|
+
if (typeof a === 'object' && a !== null) return safeStringify(a);
|
|
156
|
+
return String(a);
|
|
157
|
+
})
|
|
158
|
+
.join(' ');
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const api = {
|
|
162
|
+
level,
|
|
163
|
+
threshold,
|
|
164
|
+
json,
|
|
165
|
+
|
|
166
|
+
isEnabled(lvl) {
|
|
167
|
+
return LEVELS[lvl] !== undefined && LEVELS[lvl] <= threshold;
|
|
168
|
+
},
|
|
169
|
+
|
|
170
|
+
error(...args) {
|
|
171
|
+
// error is always captured (level 0)
|
|
172
|
+
emit('stderr', 'error', args);
|
|
173
|
+
},
|
|
174
|
+
|
|
175
|
+
warn(...args) {
|
|
176
|
+
if (threshold >= LEVELS.warn) emit('stderr', 'warn', args);
|
|
177
|
+
},
|
|
178
|
+
|
|
179
|
+
info(...args) {
|
|
180
|
+
if (threshold >= LEVELS.info) emit('stdout', 'info', args);
|
|
181
|
+
},
|
|
182
|
+
|
|
183
|
+
debug(...args) {
|
|
184
|
+
if (threshold >= LEVELS.debug) emit('stdout', 'debug', args);
|
|
185
|
+
},
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Write raw text to stdout at info-or-higher. Used by commands that need
|
|
189
|
+
* to render tables / long output that should NOT appear on default runs.
|
|
190
|
+
*/
|
|
191
|
+
print(...args) {
|
|
192
|
+
if (json) {
|
|
193
|
+
jsonState.messages.push({ level: 'info', text: formatArgs(args) });
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
if (threshold >= LEVELS.info) {
|
|
197
|
+
try {
|
|
198
|
+
stdout.write(`${formatArgs(args)}\n`);
|
|
199
|
+
} catch { /* ignore */ }
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Always-on stdout write. For output that MUST appear at default level
|
|
205
|
+
* (e.g. one-line status: "SINAPSE ready."). Respects --json and --quiet.
|
|
206
|
+
* --quiet: suppressed unless this is a direct error.
|
|
207
|
+
*/
|
|
208
|
+
always(...args) {
|
|
209
|
+
if (json) {
|
|
210
|
+
jsonState.messages.push({ level: 'always', text: formatArgs(args) });
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
if (threshold === LEVELS.error) return; // --quiet
|
|
214
|
+
try {
|
|
215
|
+
stdout.write(`${formatArgs(args)}\n`);
|
|
216
|
+
} catch { /* ignore */ }
|
|
217
|
+
},
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Set the package version on the JSON state. Harmless in non-json mode.
|
|
221
|
+
*/
|
|
222
|
+
setVersion(version) {
|
|
223
|
+
jsonState.version = version;
|
|
224
|
+
},
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Push an agent entry into the JSON state. Harmless in non-json mode.
|
|
228
|
+
*/
|
|
229
|
+
addAgent(name, meta = {}) {
|
|
230
|
+
jsonState.agents.push({ name, ...meta });
|
|
231
|
+
},
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Flush the JSON state to stdout as a single structured object.
|
|
235
|
+
* Safe to call multiple times — no-op after the first call.
|
|
236
|
+
*/
|
|
237
|
+
flush() {
|
|
238
|
+
if (!json || api._flushed) return;
|
|
239
|
+
api._flushed = true;
|
|
240
|
+
try {
|
|
241
|
+
stdout.write(`${JSON.stringify(jsonState)}\n`);
|
|
242
|
+
} catch { /* ignore */ }
|
|
243
|
+
},
|
|
244
|
+
|
|
245
|
+
_jsonState: jsonState,
|
|
246
|
+
_flushed: false,
|
|
247
|
+
};
|
|
248
|
+
|
|
249
|
+
return api;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Build the process-wide logger from process.argv. Cached: repeated calls return
|
|
254
|
+
* the same instance so `bin/cli.js` and `bin/sinapse.js` share state in a single run.
|
|
255
|
+
*/
|
|
256
|
+
let _singleton = null;
|
|
257
|
+
|
|
258
|
+
function getLogger(argvOverride) {
|
|
259
|
+
if (_singleton) return _singleton;
|
|
260
|
+
const argv = argvOverride || process.argv.slice(2);
|
|
261
|
+
const flags = parseFlags(argv);
|
|
262
|
+
_singleton = createLogger({
|
|
263
|
+
level: resolveLevel(flags),
|
|
264
|
+
json: flags.json,
|
|
265
|
+
});
|
|
266
|
+
_singleton._flags = flags;
|
|
267
|
+
|
|
268
|
+
// Ensure JSON state is flushed on process exit so --json is reliable.
|
|
269
|
+
if (flags.json) {
|
|
270
|
+
const flush = () => { try { _singleton.flush(); } catch { /* noop */ } };
|
|
271
|
+
process.on('exit', flush);
|
|
272
|
+
process.on('beforeExit', flush);
|
|
273
|
+
}
|
|
274
|
+
return _singleton;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/** Reset the singleton (tests only). */
|
|
278
|
+
function _resetLogger() {
|
|
279
|
+
_singleton = null;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Decide whether the ASCII art header should be shown.
|
|
284
|
+
*
|
|
285
|
+
* show if: level >= info (i.e. --verbose or --debug)
|
|
286
|
+
* OR first run (no flag file)
|
|
287
|
+
*
|
|
288
|
+
* never show in --json mode or --quiet mode.
|
|
289
|
+
*/
|
|
290
|
+
function shouldShowHeader(logger) {
|
|
291
|
+
if (!logger) return false;
|
|
292
|
+
if (logger.json) return false;
|
|
293
|
+
if (logger.threshold === LEVELS.error) return false; // --quiet
|
|
294
|
+
if (logger.threshold >= LEVELS.info) return true; // --verbose / --debug
|
|
295
|
+
return isFirstRun();
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
function safeStringify(value) {
|
|
299
|
+
try {
|
|
300
|
+
return JSON.stringify(value);
|
|
301
|
+
} catch {
|
|
302
|
+
return '[unserializable]';
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
module.exports = {
|
|
307
|
+
LEVELS,
|
|
308
|
+
LEVEL_NAMES,
|
|
309
|
+
DEFAULT_LEVEL,
|
|
310
|
+
FIRST_RUN_FLAG,
|
|
311
|
+
createLogger,
|
|
312
|
+
getLogger,
|
|
313
|
+
parseFlags,
|
|
314
|
+
resolveLevel,
|
|
315
|
+
isFirstRun,
|
|
316
|
+
markFirstRunDone,
|
|
317
|
+
shouldShowHeader,
|
|
318
|
+
_resetLogger,
|
|
319
|
+
};
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
|
|
13
13
|
'use strict';
|
|
14
14
|
|
|
15
|
-
const { spawn, execSync } = require('child_process');
|
|
15
|
+
const { spawn, execSync, execFileSync } = require('child_process');
|
|
16
16
|
const fs = require('fs').promises;
|
|
17
17
|
const fsSync = require('fs');
|
|
18
18
|
const path = require('path');
|
|
@@ -554,7 +554,7 @@ async function spawnAgent(agent, task, options = {}) {
|
|
|
554
554
|
SINAPSE_OUTPUT_DIR: opts.outputDir,
|
|
555
555
|
};
|
|
556
556
|
|
|
557
|
-
const result =
|
|
557
|
+
const result = execFileSync('bash', [scriptPath, ...args], {
|
|
558
558
|
encoding: 'utf8',
|
|
559
559
|
timeout: opts.timeout,
|
|
560
560
|
env,
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* SINAPSE Telemetry — STUB (opt-in, disabled by default)
|
|
5
|
+
* @story C.1 — Exit Codes, Auto-Doctor & Opt-in Telemetry
|
|
6
|
+
*
|
|
7
|
+
* IMPORTANT (contributors):
|
|
8
|
+
* This is a STUB implementation. It does NOT make real network requests.
|
|
9
|
+
* Calling `send(event)` when telemetry is enabled logs the payload at debug
|
|
10
|
+
* level and stops there.
|
|
11
|
+
*
|
|
12
|
+
* TODO(follow-up-story): wire a real HTTPS endpoint once the privacy policy
|
|
13
|
+
* at docs/TELEMETRY.md has been reviewed by legal and the endpoint URL is
|
|
14
|
+
* confirmed. Until then, NO real data leaves the user's machine.
|
|
15
|
+
*
|
|
16
|
+
* Contract (see Story C.1 ACs):
|
|
17
|
+
* AC 4 — Exported methods: enable(), disable(), isEnabled(), send(event).
|
|
18
|
+
* AC 5 — Disabled by default. `send()` is a no-op when disabled.
|
|
19
|
+
* AC 6 — `enable()` persists a flag to ~/.sinapse/config.json. CLI wrapper
|
|
20
|
+
* shows the confirmation message to the user.
|
|
21
|
+
* AC 7 — `SINAPSE_TELEMETRY=1` env var overrides the config file.
|
|
22
|
+
* AC 8 — Payload is anonymized: only { category, platform, version, timestamp }.
|
|
23
|
+
* NO user paths, NO usernames, NO file names, NO PII.
|
|
24
|
+
* AC 9 — send() logs at debug level only. No HTTP.
|
|
25
|
+
*
|
|
26
|
+
* Zero external deps (pure Node stdlib). Safe to require() anywhere.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
const fs = require('fs');
|
|
30
|
+
const os = require('os');
|
|
31
|
+
const path = require('path');
|
|
32
|
+
|
|
33
|
+
// ─── Config file location ────────────────────────────────────────────────────
|
|
34
|
+
// Stored under ~/.sinapse/config.json so it is per-user (not per-project) and
|
|
35
|
+
// does not pollute the project directory.
|
|
36
|
+
|
|
37
|
+
function sinapseHome() {
|
|
38
|
+
return path.join(os.homedir(), '.sinapse');
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function configPath() {
|
|
42
|
+
return path.join(sinapseHome(), 'config.json');
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// ─── Predefined failure categories (AC 8) ────────────────────────────────────
|
|
46
|
+
// Adding a new category? Add it here AND in docs/TELEMETRY.md so the privacy
|
|
47
|
+
// policy stays in sync with the code.
|
|
48
|
+
|
|
49
|
+
const FAILURE_CATEGORIES = Object.freeze([
|
|
50
|
+
'doctor-fail',
|
|
51
|
+
'sync-ide-fail',
|
|
52
|
+
'permission-error',
|
|
53
|
+
'runtime-dir-fail',
|
|
54
|
+
'unknown',
|
|
55
|
+
]);
|
|
56
|
+
|
|
57
|
+
// ─── Allowed platforms (AC 8) ────────────────────────────────────────────────
|
|
58
|
+
|
|
59
|
+
const ALLOWED_PLATFORMS = Object.freeze(['win32', 'darwin', 'linux']);
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Normalize process.platform to one of the allowed values. Any exotic platform
|
|
63
|
+
* (aix, freebsd, openbsd, sunos, ...) is coerced to 'linux' to avoid leaking a
|
|
64
|
+
* fingerprint. NEVER returns the raw platform string.
|
|
65
|
+
* @returns {'win32'|'darwin'|'linux'}
|
|
66
|
+
*/
|
|
67
|
+
function normalizePlatform() {
|
|
68
|
+
const p = process.platform;
|
|
69
|
+
if (p === 'win32' || p === 'darwin' || p === 'linux') return p;
|
|
70
|
+
return 'linux';
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// ─── Version reading ─────────────────────────────────────────────────────────
|
|
74
|
+
|
|
75
|
+
let _cachedVersion = null;
|
|
76
|
+
function readVersion() {
|
|
77
|
+
if (_cachedVersion) return _cachedVersion;
|
|
78
|
+
try {
|
|
79
|
+
const pkg = require(path.resolve(__dirname, '..', '..', '..', 'package.json'));
|
|
80
|
+
_cachedVersion = pkg && pkg.version ? String(pkg.version) : 'unknown';
|
|
81
|
+
} catch {
|
|
82
|
+
_cachedVersion = 'unknown';
|
|
83
|
+
}
|
|
84
|
+
return _cachedVersion;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// ─── Config file read / write ────────────────────────────────────────────────
|
|
88
|
+
// All filesystem calls are fail-safe: a corrupt or missing config.json MUST
|
|
89
|
+
// NEVER crash the caller. Telemetry is best-effort.
|
|
90
|
+
|
|
91
|
+
function readConfig() {
|
|
92
|
+
try {
|
|
93
|
+
const p = configPath();
|
|
94
|
+
if (!fs.existsSync(p)) return {};
|
|
95
|
+
const raw = fs.readFileSync(p, 'utf8');
|
|
96
|
+
const parsed = JSON.parse(raw);
|
|
97
|
+
return (parsed && typeof parsed === 'object') ? parsed : {};
|
|
98
|
+
} catch {
|
|
99
|
+
return {};
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function writeConfig(cfg) {
|
|
104
|
+
try {
|
|
105
|
+
const home = sinapseHome();
|
|
106
|
+
if (!fs.existsSync(home)) {
|
|
107
|
+
fs.mkdirSync(home, { recursive: true });
|
|
108
|
+
}
|
|
109
|
+
fs.writeFileSync(configPath(), `${JSON.stringify(cfg, null, 2)}\n`, 'utf8');
|
|
110
|
+
return true;
|
|
111
|
+
} catch {
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// ─── Public API ──────────────────────────────────────────────────────────────
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* AC 5 + AC 7 — Is telemetry currently enabled?
|
|
120
|
+
*
|
|
121
|
+
* Resolution order (highest priority first):
|
|
122
|
+
* 1. SINAPSE_TELEMETRY=1 env var → TRUE (overrides config file)
|
|
123
|
+
* 2. SINAPSE_TELEMETRY=0 env var → FALSE (explicit opt-out wins too)
|
|
124
|
+
* 3. ~/.sinapse/config.json { "telemetry": true|false }
|
|
125
|
+
* 4. Default → FALSE
|
|
126
|
+
*
|
|
127
|
+
* @returns {boolean}
|
|
128
|
+
*/
|
|
129
|
+
function isEnabled() {
|
|
130
|
+
const envVar = process.env.SINAPSE_TELEMETRY;
|
|
131
|
+
if (envVar === '1' || envVar === 'true') return true;
|
|
132
|
+
if (envVar === '0' || envVar === 'false') return false;
|
|
133
|
+
const cfg = readConfig();
|
|
134
|
+
return cfg.telemetry === true;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* AC 6 — Persist opt-in to config file. Returns true on success.
|
|
139
|
+
* Does NOT print any message (CLI layer owns the user-facing copy).
|
|
140
|
+
* @returns {boolean}
|
|
141
|
+
*/
|
|
142
|
+
function enable() {
|
|
143
|
+
const cfg = readConfig();
|
|
144
|
+
cfg.telemetry = true;
|
|
145
|
+
return writeConfig(cfg);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Persist opt-out to config file. Returns true on success.
|
|
150
|
+
* @returns {boolean}
|
|
151
|
+
*/
|
|
152
|
+
function disable() {
|
|
153
|
+
const cfg = readConfig();
|
|
154
|
+
cfg.telemetry = false;
|
|
155
|
+
return writeConfig(cfg);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* AC 8 — Build an anonymized payload from a category.
|
|
160
|
+
* Only { category, platform, version, timestamp } is included.
|
|
161
|
+
* Unknown categories are coerced to 'unknown' to prevent category-sprawl and
|
|
162
|
+
* to keep the schema predictable for the (future) real endpoint.
|
|
163
|
+
*
|
|
164
|
+
* @param {string} category
|
|
165
|
+
* @returns {{category:string,platform:'win32'|'darwin'|'linux',version:string,timestamp:string}}
|
|
166
|
+
*/
|
|
167
|
+
function buildPayload(category) {
|
|
168
|
+
const safeCategory = FAILURE_CATEGORIES.includes(category) ? category : 'unknown';
|
|
169
|
+
return {
|
|
170
|
+
category: safeCategory,
|
|
171
|
+
platform: normalizePlatform(),
|
|
172
|
+
version: readVersion(),
|
|
173
|
+
timestamp: new Date().toISOString(),
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* AC 5 + AC 9 — Send a telemetry event.
|
|
179
|
+
*
|
|
180
|
+
* When disabled → no-op (no network call, no log).
|
|
181
|
+
* When enabled → build anonymized payload, log at debug level, and return it.
|
|
182
|
+
*
|
|
183
|
+
* NOTE: This stub does NOT make any HTTP request. A follow-up story will add
|
|
184
|
+
* the real endpoint after legal review of docs/TELEMETRY.md.
|
|
185
|
+
*
|
|
186
|
+
* @param {{category?: string}} event
|
|
187
|
+
* @param {{logger?: object}} [opts] — inject a logger for tests; defaults to
|
|
188
|
+
* the shared SINAPSE logger if available, otherwise console.
|
|
189
|
+
* @returns {null|object} the payload that would have been sent, or null if disabled
|
|
190
|
+
*/
|
|
191
|
+
function send(event = {}, opts = {}) {
|
|
192
|
+
if (!isEnabled()) return null;
|
|
193
|
+
const payload = buildPayload(event && event.category);
|
|
194
|
+
const logger = opts.logger || _getDefaultLogger();
|
|
195
|
+
try {
|
|
196
|
+
if (logger && typeof logger.debug === 'function') {
|
|
197
|
+
logger.debug('[telemetry stub]', JSON.stringify(payload));
|
|
198
|
+
}
|
|
199
|
+
} catch {
|
|
200
|
+
/* never throw from telemetry */
|
|
201
|
+
}
|
|
202
|
+
// TODO(follow-up-story): POST payload to real endpoint here.
|
|
203
|
+
return payload;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// ─── Default logger resolution ──────────────────────────────────────────────
|
|
207
|
+
// Try the shared SINAPSE logger first (so telemetry respects --debug/--quiet),
|
|
208
|
+
// but fall back to a console shim if it's unavailable (e.g. during very early
|
|
209
|
+
// bootstrap or in isolated tests).
|
|
210
|
+
|
|
211
|
+
let _defaultLogger = null;
|
|
212
|
+
function _getDefaultLogger() {
|
|
213
|
+
if (_defaultLogger) return _defaultLogger;
|
|
214
|
+
try {
|
|
215
|
+
const { getLogger } = require('../logger');
|
|
216
|
+
_defaultLogger = getLogger();
|
|
217
|
+
} catch {
|
|
218
|
+
_defaultLogger = {
|
|
219
|
+
debug: (...args) => { try { console.debug(...args); } catch { /* ignore */ } },
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
return _defaultLogger;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// Test helper — reset internal caches between tests. Not part of the public
|
|
226
|
+
// contract; do not use in production code.
|
|
227
|
+
function _reset() {
|
|
228
|
+
_cachedVersion = null;
|
|
229
|
+
_defaultLogger = null;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
module.exports = {
|
|
233
|
+
// Public API (AC 4)
|
|
234
|
+
enable,
|
|
235
|
+
disable,
|
|
236
|
+
isEnabled,
|
|
237
|
+
send,
|
|
238
|
+
// Helpers exposed for tests + CLI command
|
|
239
|
+
buildPayload,
|
|
240
|
+
normalizePlatform,
|
|
241
|
+
readVersion,
|
|
242
|
+
configPath,
|
|
243
|
+
sinapseHome,
|
|
244
|
+
FAILURE_CATEGORIES,
|
|
245
|
+
ALLOWED_PLATFORMS,
|
|
246
|
+
_reset,
|
|
247
|
+
};
|