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.
Files changed (432) hide show
  1. package/.claude/CLAUDE.md +60 -341
  2. package/.claude/hooks/enforce-architecture-first.py +197 -197
  3. package/.claude/hooks/enforce-git-push-authority.sh +25 -4
  4. package/.claude/hooks/mind-clone-governance.py +193 -193
  5. package/.claude/hooks/read-protection.py +152 -152
  6. package/.claude/hooks/sql-governance.py +183 -183
  7. package/.claude/hooks/verify-packages.cjs +83 -0
  8. package/.claude/hooks/write-path-validation.py +195 -195
  9. package/.claude/rules/agent-authority.md +6 -0
  10. package/.claude/rules/agent-handoff.md +5 -0
  11. package/.claude/rules/cross-squad-routing.md +5 -0
  12. package/.claude/rules/hook-governance.md +7 -0
  13. package/.claude/rules/mandatory-delegation.md +24 -0
  14. package/.claude/rules/mcp-usage.md +3 -1
  15. package/.claude/rules/project-intelligence.md +63 -0
  16. package/.claude/rules/response-format.md +4 -0
  17. package/.claude/rules/safe-collaboration.md +14 -2
  18. package/.claude/rules/security-data-protection.md +27 -0
  19. package/.claude/rules/squad-awareness.md +96 -68
  20. package/.claude/rules/token-economy.md +148 -0
  21. package/.claude/rules/tool-examples.md +6 -0
  22. package/.claude/rules/workflow-execution.md +7 -0
  23. package/.codex/agents/analyst.md +342 -71
  24. package/.codex/agents/architect.md +533 -68
  25. package/.codex/agents/data-engineer.md +530 -106
  26. package/.codex/agents/developer.md +657 -0
  27. package/.codex/agents/devops.md +639 -69
  28. package/.codex/agents/product-lead.md +362 -0
  29. package/.codex/agents/project-lead.md +405 -0
  30. package/.codex/agents/quality-gate.md +538 -0
  31. package/.codex/agents/sinapse-orqx.md +9 -7
  32. package/.codex/agents/sprint-lead.md +315 -0
  33. package/.codex/agents/squad-creator.md +402 -0
  34. package/.codex/agents/ux-design-expert.md +523 -0
  35. package/.codex/delegation-matrix.json +756 -44
  36. package/.codex/handoff-packet.schema.json +30 -6
  37. package/.sinapse-ai/core/code-intel/registry-syncer.js +56 -3
  38. package/.sinapse-ai/core/doctor/checks/agent-memory.js +5 -1
  39. package/.sinapse-ai/core/doctor/checks/claude-md.js +4 -1
  40. package/.sinapse-ai/core/doctor/checks/code-intel.js +5 -1
  41. package/.sinapse-ai/core/doctor/checks/commands-count.js +4 -1
  42. package/.sinapse-ai/core/doctor/checks/constitution-consistency.js +4 -1
  43. package/.sinapse-ai/core/doctor/checks/core-config.js +4 -1
  44. package/.sinapse-ai/core/doctor/checks/entity-registry.js +6 -1
  45. package/.sinapse-ai/core/doctor/checks/git-hooks.js +5 -1
  46. package/.sinapse-ai/core/doctor/checks/graph-dashboard.js +4 -1
  47. package/.sinapse-ai/core/doctor/checks/hooks-claude-count.js +5 -1
  48. package/.sinapse-ai/core/doctor/checks/ide-sync.js +4 -1
  49. package/.sinapse-ai/core/doctor/checks/node-version.js +4 -1
  50. package/.sinapse-ai/core/doctor/checks/npm-packages.js +4 -1
  51. package/.sinapse-ai/core/doctor/checks/rules-files.js +4 -1
  52. package/.sinapse-ai/core/doctor/checks/settings-json.js +4 -1
  53. package/.sinapse-ai/core/doctor/checks/skills-count.js +4 -1
  54. package/.sinapse-ai/core/doctor/index.js +157 -50
  55. package/.sinapse-ai/core/ids/registry-updater.js +6 -1
  56. package/.sinapse-ai/core/logger/index.js +319 -0
  57. package/.sinapse-ai/core/orchestration/terminal-spawner.js +2 -2
  58. package/.sinapse-ai/core/telemetry/index.js +247 -0
  59. package/.sinapse-ai/data/entity-registry.yaml +1060 -808
  60. package/.sinapse-ai/development/agents/analyst.md +90 -0
  61. package/.sinapse-ai/development/agents/architect.md +78 -0
  62. package/.sinapse-ai/development/agents/data-engineer.md +38 -0
  63. package/.sinapse-ai/development/agents/developer.md +97 -0
  64. package/.sinapse-ai/development/agents/devops.md +121 -0
  65. package/.sinapse-ai/development/agents/product-lead.md +27 -0
  66. package/.sinapse-ai/development/agents/project-lead.md +28 -0
  67. package/.sinapse-ai/development/agents/quality-gate.md +89 -0
  68. package/.sinapse-ai/development/agents/sprint-lead/MEMORY.md +8 -0
  69. package/.sinapse-ai/development/agents/sprint-lead.md +28 -0
  70. package/.sinapse-ai/development/agents/squad-creator.md +58 -0
  71. package/.sinapse-ai/development/agents/ux-design-expert.md +28 -0
  72. package/.sinapse-ai/development/checklists/agent-quality-gate.md +27 -0
  73. package/.sinapse-ai/development/checklists/brownfield-compatibility-checklist.md +20 -0
  74. package/.sinapse-ai/development/checklists/code-review-checklist.md +106 -0
  75. package/.sinapse-ai/development/checklists/issue-triage-checklist.md +9 -0
  76. package/.sinapse-ai/development/checklists/memory-audit-checklist.md +16 -0
  77. package/.sinapse-ai/development/checklists/pr-quality-checklist.md +72 -0
  78. package/.sinapse-ai/development/checklists/security-deployment-checklist.md +54 -0
  79. package/.sinapse-ai/development/checklists/self-critique-checklist.md +19 -1
  80. package/.sinapse-ai/development/knowledge-base/agent-communication-protocol.md +127 -0
  81. package/.sinapse-ai/development/knowledge-base/database-scaling-patterns.md +374 -0
  82. package/.sinapse-ai/development/knowledge-base/environment-deployment-patterns.md +353 -0
  83. package/.sinapse-ai/development/knowledge-base/gotchas-patterns.md +224 -0
  84. package/.sinapse-ai/development/knowledge-base/infrastructure-decision-framework.md +221 -0
  85. package/.sinapse-ai/development/knowledge-base/security-pre-deploy-checklist.md +410 -0
  86. package/.sinapse-ai/development/knowledge-base/software-architecture-patterns.md +299 -0
  87. package/.sinapse-ai/development/knowledge-base/token-economy-guide.md +198 -0
  88. package/.sinapse-ai/development/scripts/populate-entity-registry.js +5 -1
  89. package/.sinapse-ai/development/skills/captcha-handler.md +82 -0
  90. package/.sinapse-ai/development/skills/chrome-brain.md +81 -0
  91. package/.sinapse-ai/development/skills/debug.md +57 -0
  92. package/.sinapse-ai/development/skills/deploy-readiness.md +93 -0
  93. package/.sinapse-ai/development/skills/fast-review.md +69 -0
  94. package/.sinapse-ai/development/skills/model-router.md +92 -0
  95. package/.sinapse-ai/development/skills/research-synthesis.md +77 -0
  96. package/.sinapse-ai/development/skills/security-scan.md +73 -0
  97. package/.sinapse-ai/development/skills/sinapse-methodology.md +175 -0
  98. package/.sinapse-ai/development/skills/story-fast-track.md +71 -0
  99. package/.sinapse-ai/development/skills/verify.md +53 -0
  100. package/.sinapse-ai/development/tasks/dev-develop-story.md +10 -0
  101. package/.sinapse-ai/development/tasks/environment-promotion-pipeline.md +582 -0
  102. package/.sinapse-ai/development/tasks/generate-agent-handoff.md +223 -0
  103. package/.sinapse-ai/development/tasks/infrastructure-assessment.md +432 -0
  104. package/.sinapse-ai/development/tasks/load-testing-setup.md +611 -0
  105. package/.sinapse-ai/development/tasks/observability-blueprint.md +562 -0
  106. package/.sinapse-ai/development/templates/legal/breach-notification-tmpl.md +113 -0
  107. package/.sinapse-ai/development/templates/legal/privacy-policy-tmpl.md +93 -0
  108. package/.sinapse-ai/development/templates/legal/terms-of-service-tmpl.md +85 -0
  109. package/.sinapse-ai/development/templates/service-template/README.md.hbs +159 -159
  110. package/.sinapse-ai/development/templates/service-template/__tests__/index.test.ts.hbs +238 -238
  111. package/.sinapse-ai/development/templates/service-template/client.ts.hbs +404 -404
  112. package/.sinapse-ai/development/templates/service-template/errors.ts.hbs +183 -183
  113. package/.sinapse-ai/development/templates/service-template/index.ts.hbs +121 -121
  114. package/.sinapse-ai/development/templates/service-template/package.json.hbs +88 -88
  115. package/.sinapse-ai/development/templates/service-template/types.ts.hbs +146 -146
  116. package/.sinapse-ai/development/templates/squad/agent-template.md +17 -4
  117. package/.sinapse-ai/development/templates/squad/checklist-template.md +13 -5
  118. package/.sinapse-ai/development/templates/squad/task-template.md +7 -0
  119. package/.sinapse-ai/development/templates/squad/workflow-template.yaml +7 -0
  120. package/.sinapse-ai/development/templates/squad-template/LICENSE +22 -22
  121. package/.sinapse-ai/development/workflows/fast-track.yaml +87 -0
  122. package/.sinapse-ai/development/workflows/story-development-cycle.yaml +40 -1
  123. package/.sinapse-ai/hooks/ids-post-commit.js +22 -0
  124. package/.sinapse-ai/infrastructure/contracts/compatibility/README.md +42 -0
  125. package/.sinapse-ai/infrastructure/contracts/compatibility/sinapse-current.yaml +35 -0
  126. package/.sinapse-ai/infrastructure/scripts/llm-routing/templates/claude-free-tracked.cmd +127 -127
  127. package/.sinapse-ai/infrastructure/scripts/llm-routing/templates/deepseek-proxy.cmd +71 -71
  128. package/.sinapse-ai/infrastructure/scripts/llm-routing/templates/deepseek-usage.cmd +51 -51
  129. package/.sinapse-ai/infrastructure/scripts/pr-review-ai.js +16 -13
  130. package/.sinapse-ai/infrastructure/scripts/setup-project-infra.js +128 -0
  131. package/.sinapse-ai/infrastructure/scripts/test-discovery.js +8 -3
  132. package/.sinapse-ai/infrastructure/scripts/validate-codex-delegation.js +3 -1
  133. package/.sinapse-ai/infrastructure/scripts/validate-manifest-parity.js +380 -0
  134. package/.sinapse-ai/infrastructure/scripts/validate-parity.js +76 -25
  135. package/.sinapse-ai/infrastructure/templates/coderabbit.yaml.template +280 -280
  136. package/.sinapse-ai/infrastructure/templates/config/env.example +16 -0
  137. package/.sinapse-ai/infrastructure/templates/config/gitignore-additions.tmpl +59 -0
  138. package/.sinapse-ai/infrastructure/templates/github/CODEOWNERS.template +12 -0
  139. package/.sinapse-ai/infrastructure/templates/github/PULL_REQUEST_TEMPLATE.md +29 -0
  140. package/.sinapse-ai/infrastructure/templates/github/ci-template.yml +77 -0
  141. package/.sinapse-ai/infrastructure/templates/github/issue-templates/bug_report.md +34 -0
  142. package/.sinapse-ai/infrastructure/templates/github/issue-templates/feature_request.md +19 -0
  143. package/.sinapse-ai/infrastructure/templates/github-workflows/ci.yml.template +170 -170
  144. package/.sinapse-ai/infrastructure/templates/github-workflows/pr-automation.yml.template +331 -331
  145. package/.sinapse-ai/infrastructure/templates/github-workflows/release.yml.template +197 -197
  146. package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-brownfield-merge.tmpl +19 -19
  147. package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-node.tmpl +86 -86
  148. package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-python.tmpl +146 -146
  149. package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-sinapse-base.tmpl +64 -64
  150. package/.sinapse-ai/infrastructure/templates/sinapse-sync.yaml.template +183 -183
  151. package/.sinapse-ai/install-manifest.yaml +333 -162
  152. package/.sinapse-ai/local-config.yaml.template +65 -65
  153. package/.sinapse-ai/monitor/hooks/lib/__init__.py +2 -2
  154. package/.sinapse-ai/monitor/hooks/lib/enrich.py +59 -59
  155. package/.sinapse-ai/monitor/hooks/lib/send_event.py +48 -48
  156. package/.sinapse-ai/monitor/hooks/notification.py +30 -30
  157. package/.sinapse-ai/monitor/hooks/post_tool_use.py +46 -46
  158. package/.sinapse-ai/monitor/hooks/pre_compact.py +30 -30
  159. package/.sinapse-ai/monitor/hooks/pre_tool_use.py +41 -41
  160. package/.sinapse-ai/monitor/hooks/stop.py +30 -30
  161. package/.sinapse-ai/monitor/hooks/subagent_stop.py +30 -30
  162. package/.sinapse-ai/monitor/hooks/user_prompt_submit.py +39 -39
  163. package/.sinapse-ai/product/templates/adr.hbs +126 -126
  164. package/.sinapse-ai/product/templates/dbdr.hbs +242 -242
  165. package/.sinapse-ai/product/templates/epic.hbs +213 -213
  166. package/.sinapse-ai/product/templates/pmdr.hbs +187 -187
  167. package/.sinapse-ai/product/templates/prd-v2.0.hbs +217 -217
  168. package/.sinapse-ai/product/templates/prd.hbs +202 -202
  169. package/.sinapse-ai/product/templates/story-tmpl.yaml +59 -0
  170. package/.sinapse-ai/product/templates/story.hbs +264 -264
  171. package/.sinapse-ai/product/templates/task.hbs +171 -171
  172. package/.sinapse-ai/product/templates/tmpl-comment-on-examples.sql +159 -159
  173. package/.sinapse-ai/product/templates/tmpl-migration-script.sql +92 -92
  174. package/.sinapse-ai/product/templates/tmpl-rls-granular-policies.sql +105 -105
  175. package/.sinapse-ai/product/templates/tmpl-rls-kiss-policy.sql +11 -11
  176. package/.sinapse-ai/product/templates/tmpl-rls-roles.sql +136 -136
  177. package/.sinapse-ai/product/templates/tmpl-rls-simple.sql +78 -78
  178. package/.sinapse-ai/product/templates/tmpl-rls-tenant.sql +153 -153
  179. package/.sinapse-ai/product/templates/tmpl-rollback-script.sql +78 -78
  180. package/.sinapse-ai/product/templates/tmpl-seed-data.sql +141 -141
  181. package/.sinapse-ai/product/templates/tmpl-smoke-test.sql +17 -17
  182. package/.sinapse-ai/product/templates/tmpl-staging-copy-merge.sql +140 -140
  183. package/.sinapse-ai/product/templates/tmpl-stored-proc.sql +141 -141
  184. package/.sinapse-ai/product/templates/tmpl-trigger.sql +153 -153
  185. package/.sinapse-ai/product/templates/tmpl-view-materialized.sql +134 -134
  186. package/.sinapse-ai/product/templates/tmpl-view.sql +178 -178
  187. package/.sinapse-ai/scripts/diagnostics/health-dashboard/package-lock.json +427 -355
  188. package/LICENSE +34 -34
  189. package/README.en.md +167 -20
  190. package/README.md +190 -22
  191. package/bin/cli.js +510 -196
  192. package/bin/postinstall.js +564 -0
  193. package/bin/sinapse-cli +283 -283
  194. package/bin/sinapse-graph.js +9 -0
  195. package/bin/sinapse-init.js +36 -4
  196. package/bin/sinapse-minimal.js +20 -9
  197. package/bin/sinapse.js +202 -122
  198. package/bin/utils/deprecation-warning.js +46 -0
  199. package/bin/utils/pre-push-safety.js +14 -0
  200. package/docs/TELEMETRY.md +131 -0
  201. package/docs/chrome-brain-upgrade-plan.md +624 -0
  202. package/docs/codex-integration-process.md +22 -0
  203. package/docs/codex-parity-program.md +27 -0
  204. package/docs/framework/orqx-plan.md +1 -1
  205. package/docs/ide-integration.md +36 -0
  206. package/docs/installation/chrome-brain.md +17 -7
  207. package/docs/mega-upgrade-orchestration-plan.md +71 -0
  208. package/docs/pt/contributing.md +20 -0
  209. package/docs/research-synthesis-for-upgrade.md +511 -0
  210. package/docs/security-audit-report.md +306 -0
  211. package/package.json +20 -8
  212. package/packages/installer/src/config/configure-environment.js +19 -44
  213. package/packages/installer/src/detection/detect-project-type.js +181 -63
  214. package/packages/installer/src/installer/manifest-signature.js +32 -17
  215. package/packages/installer/src/wizard/i18n.js +12 -0
  216. package/packages/installer/src/wizard/ide-config-generator.js +8 -39
  217. package/packages/installer/src/wizard/index.js +119 -14
  218. package/packages/installer/src/wizard/questions.js +2 -3
  219. package/packages/installer/tests/integration/environment-configuration.test.js +7 -5
  220. package/packages/installer/tests/unit/detection/detect-project-type.test.js +138 -1
  221. package/packages/installer/tests/unit/doctor/doctor-orchestrator.test.js +3 -3
  222. package/packages/sinapse-install/bin/edmcp.js +0 -0
  223. package/packages/sinapse-install/bin/sinapse-install.js +0 -0
  224. package/packages/sinapse-pro-cli/bin/sinapse-pro.js +0 -0
  225. package/scripts/check-markdown-links.py +353 -353
  226. package/scripts/coverage-report-summary.js +169 -0
  227. package/scripts/generate-install-manifest.js +6 -2
  228. package/scripts/release-readiness.js +169 -0
  229. package/scripts/test-install-matrix-local.sh +153 -0
  230. package/scripts/validate-install-docs.js +394 -0
  231. package/scripts/validate-no-external-refs.js +376 -0
  232. package/scripts/validate-squad-orqx.js +302 -0
  233. package/scripts/validate-story-meta.js +263 -0
  234. package/squads/claude-code-mastery/CHANGELOG.md +1 -1
  235. package/squads/claude-code-mastery/README.md +2 -2
  236. package/squads/claude-code-mastery/knowledge-base/claude-code-internals-reference.md +927 -0
  237. package/squads/claude-code-mastery/squad.yaml +1 -1
  238. package/squads/squad-artdir/README.md +90 -0
  239. package/squads/squad-artdir/agents/accessibility-guardian.md +184 -0
  240. package/squads/squad-artdir/agents/artdir-orqx.md +145 -0
  241. package/squads/squad-artdir/agents/color-psychologist.md +166 -0
  242. package/squads/squad-artdir/agents/cro-persuasion.md +161 -0
  243. package/squads/squad-artdir/agents/design-system-architect.md +100 -0
  244. package/squads/squad-artdir/agents/ia-architect.md +169 -0
  245. package/squads/squad-artdir/agents/interaction-designer.md +162 -0
  246. package/squads/squad-artdir/agents/layout-engineer.md +163 -0
  247. package/squads/squad-artdir/agents/motion-architect.md +185 -0
  248. package/squads/squad-artdir/agents/platform-aesthetic-director.md +84 -0
  249. package/squads/squad-artdir/agents/premium-packaging-strategist.md +107 -0
  250. package/squads/squad-artdir/agents/product-surface-director.md +86 -0
  251. package/squads/squad-artdir/agents/type-systemist.md +138 -0
  252. package/squads/squad-artdir/agents/visual-strategist.md +127 -0
  253. package/squads/squad-artdir/checklists/seven-pillars-validation-checklist.md +172 -0
  254. package/squads/squad-artdir/knowledge-base/case-nyo-ia-reference.md +289 -0
  255. package/squads/squad-artdir/knowledge-base/deliverables-templates.md +457 -0
  256. package/squads/squad-artdir/knowledge-base/motion-technique-catalog.md +247 -0
  257. package/squads/squad-artdir/knowledge-base/premium-packaging-principles.md +133 -0
  258. package/squads/squad-artdir/knowledge-base/psychological-toolkit.md +229 -0
  259. package/squads/squad-artdir/knowledge-base/saas-art-direction-canon.md +242 -0
  260. package/squads/squad-artdir/knowledge-base/seven-pillars-framework.md +289 -0
  261. package/squads/squad-artdir/knowledge-base/ten-pillars-framework.md +221 -0
  262. package/squads/squad-artdir/package.json +20 -0
  263. package/squads/squad-artdir/squad.yaml +271 -0
  264. package/squads/squad-artdir/tasks/audit-conversion.md +97 -0
  265. package/squads/squad-artdir/tasks/audit-drift-multi-surface.md +55 -0
  266. package/squads/squad-artdir/tasks/consult-saas-canon.md +54 -0
  267. package/squads/squad-artdir/tasks/create-art-direction-brief.md +110 -0
  268. package/squads/squad-artdir/tasks/create-premium-packaging-brief.md +61 -0
  269. package/squads/squad-artdir/tasks/create-wireflow.md +84 -0
  270. package/squads/squad-artdir/tasks/design-color-system.md +81 -0
  271. package/squads/squad-artdir/tasks/design-product-surface.md +60 -0
  272. package/squads/squad-artdir/tasks/design-token-system.md +58 -0
  273. package/squads/squad-artdir/tasks/diagnose-visual-language.md +92 -0
  274. package/squads/squad-artdir/tasks/first-5-minutes-choreography.md +65 -0
  275. package/squads/squad-artdir/tasks/specify-motion-system.md +84 -0
  276. package/squads/squad-artdir/tasks/validate-against-pillars.md +143 -0
  277. package/squads/squad-artdir/templates/art-direction-brief-template.md +215 -0
  278. package/squads/squad-artdir/workflows/conversion-audit-cycle.yaml +78 -0
  279. package/squads/squad-artdir/workflows/full-art-direction-cycle.yaml +98 -0
  280. package/squads/squad-artdir/workflows/saas-platform-art-direction-cycle.yaml +174 -0
  281. package/squads/squad-brand/knowledge-base/ai-visual-generation-canon.md +234 -0
  282. package/squads/squad-brand/knowledge-base/archetype-brand-mapping.md +12 -1
  283. package/squads/squad-brand/knowledge-base/brand-activism-cultural-branding.md +216 -0
  284. package/squads/squad-brand/knowledge-base/brand-audit-criteria.md +58 -0
  285. package/squads/squad-brand/knowledge-base/brand-digital-strategy.md +188 -0
  286. package/squads/squad-brand/knowledge-base/brand-legal-ip.md +222 -0
  287. package/squads/squad-brand/knowledge-base/brand-naming-framework.md +163 -0
  288. package/squads/squad-brand/knowledge-base/branding-master-reference.md +1001 -0
  289. package/squads/squad-brand/knowledge-base/color-psychology.md +25 -12
  290. package/squads/squad-brand/knowledge-base/employer-personal-branding.md +206 -0
  291. package/squads/squad-brand/knowledge-base/routing-catalog.md +34 -0
  292. package/squads/squad-brand/knowledge-base/sonic-branding-principles.md +6 -1
  293. package/squads/squad-brand/knowledge-base/typography-personality.md +34 -0
  294. package/squads/squad-brand/squad.yaml +20 -6
  295. package/squads/squad-claude/knowledge-base/context-window-optimization.md +334 -0
  296. package/squads/squad-claude/knowledge-base/knowledge-architecture-reference.md +403 -0
  297. package/squads/squad-claude/knowledge-base/memory-systems-reference.md +412 -0
  298. package/squads/squad-claude/knowledge-base/obsidian-claude-integration.md +423 -0
  299. package/squads/squad-claude/knowledge-base/retrieval-augmented-generation.md +320 -0
  300. package/squads/squad-claude/knowledge-base/skill-creation-patterns.md +380 -0
  301. package/squads/squad-claude/knowledge-base/swarm-orchestration-patterns.md +411 -0
  302. package/squads/squad-cloning/knowledge-base/clone-quality-assurance.md +211 -0
  303. package/squads/squad-cloning/knowledge-base/confidence-scoring.md +51 -0
  304. package/squads/squad-cloning/knowledge-base/cross-squad-deployment.md +47 -0
  305. package/squads/squad-cloning/knowledge-base/ethical-guidelines.md +237 -0
  306. package/squads/squad-cloning/knowledge-base/knowledge-graph-for-clones.md +295 -0
  307. package/squads/squad-cloning/knowledge-base/memory-architecture-for-clones.md +229 -0
  308. package/squads/squad-cloning/knowledge-base/multi-agent-deployment-patterns.md +320 -0
  309. package/squads/squad-cloning/knowledge-base/skill-standard-for-clones.md +262 -0
  310. package/squads/squad-cloning/knowledge-base/sop-extraction-guide.md +243 -0
  311. package/squads/squad-commercial/knowledge-base/account-based-selling.md +206 -0
  312. package/squads/squad-commercial/knowledge-base/ai-as-competitive-infrastructure.md +14 -0
  313. package/squads/squad-commercial/knowledge-base/ai-in-sales.md +199 -0
  314. package/squads/squad-commercial/knowledge-base/brazilian-sales-context.md +195 -0
  315. package/squads/squad-commercial/knowledge-base/customer-success-operations.md +83 -2
  316. package/squads/squad-commercial/knowledge-base/prospecting-pipeline-generation.md +69 -0
  317. package/squads/squad-commercial/knowledge-base/sales-enablement-playbook.md +260 -0
  318. package/squads/squad-commercial/knowledge-base/sales-methodology-comparison.md +185 -0
  319. package/squads/squad-commercial/knowledge-base/sales-revenue-master-reference.md +1123 -0
  320. package/squads/squad-content/knowledge-base/ai-native-content-loop.md +220 -0
  321. package/squads/squad-content/knowledge-base/brazilian-content-context.md +176 -0
  322. package/squads/squad-content/knowledge-base/competitor-analysis-methods.md +40 -1
  323. package/squads/squad-content/knowledge-base/content-architecture-taxonomy.md +206 -0
  324. package/squads/squad-content/knowledge-base/content-formats-encyclopedia.md +58 -1
  325. package/squads/squad-content/knowledge-base/content-references-bibliography.md +130 -0
  326. package/squads/squad-content/knowledge-base/content-strategy-master-reference.md +1097 -0
  327. package/squads/squad-content/knowledge-base/content-tech-stack.md +150 -0
  328. package/squads/squad-content/knowledge-base/copywriting-formulas-library.md +188 -0
  329. package/squads/squad-content/knowledge-base/email-newsletter-strategy.md +161 -0
  330. package/squads/squad-content/knowledge-base/platform-algorithm-intelligence.md +86 -1
  331. package/squads/squad-content/knowledge-base/signal-intelligence-v2.md +234 -0
  332. package/squads/squad-content/knowledge-base/social-algorithms-master-reference.md +1007 -0
  333. package/squads/squad-content/knowledge-base/task-ownership-map.md +235 -0
  334. package/squads/squad-content/knowledge-base/video-audio-content-playbook.md +218 -0
  335. package/squads/squad-content/squad.yaml +187 -27
  336. package/squads/squad-copy/knowledge-base/ai-copy-human-loop-canon.md +235 -0
  337. package/squads/squad-copy/knowledge-base/ai-copy-production.md +254 -0
  338. package/squads/squad-copy/knowledge-base/brazilian-copywriting-context.md +242 -0
  339. package/squads/squad-copy/knowledge-base/email-copywriting-system.md +299 -0
  340. package/squads/squad-copy/knowledge-base/landing-page-copy-architecture.md +267 -0
  341. package/squads/squad-copy/knowledge-base/power-words-catalog.md +205 -0
  342. package/squads/squad-copy/knowledge-base/seo-copywriting.md +255 -0
  343. package/squads/squad-copy/knowledge-base/video-script-copywriting.md +239 -0
  344. package/squads/squad-copy/squad.yaml +19 -4
  345. package/squads/squad-council/knowledge-base/brand-strategy-models.md +193 -0
  346. package/squads/squad-council/knowledge-base/growth-strategy-models.md +267 -0
  347. package/squads/squad-council/knowledge-base/innovation-disruption-frameworks.md +193 -0
  348. package/squads/squad-council/knowledge-base/market-analysis-frameworks.md +240 -0
  349. package/squads/squad-council/knowledge-base/organizational-leadership-models.md +212 -0
  350. package/squads/squad-council/knowledge-base/sales-strategy-models.md +215 -0
  351. package/squads/squad-courses/knowledge-base/course-launch-strategy.md +251 -0
  352. package/squads/squad-courses/knowledge-base/domain-advocacia-curriculum.md +385 -0
  353. package/squads/squad-courses/knowledge-base/domain-contabilidade-curriculum.md +266 -0
  354. package/squads/squad-courses/knowledge-base/platform-comparison.md +68 -0
  355. package/squads/squad-courses/knowledge-base/video-production-guide.md +70 -0
  356. package/squads/squad-cybersecurity/knowledge-base/cloud-security-reference.md +363 -0
  357. package/squads/squad-cybersecurity/knowledge-base/compliance-frameworks.md +273 -0
  358. package/squads/squad-cybersecurity/knowledge-base/database-security.md +438 -0
  359. package/squads/squad-cybersecurity/knowledge-base/incident-response-playbook.md +420 -0
  360. package/squads/squad-cybersecurity/knowledge-base/network-security-reference.md +477 -0
  361. package/squads/squad-cybersecurity/knowledge-base/penetration-testing-methodology.md +350 -0
  362. package/squads/squad-cybersecurity/knowledge-base/vulnerability-management.md +349 -0
  363. package/squads/squad-design/knowledge-base/brazilian-design-context.md +223 -0
  364. package/squads/squad-design/knowledge-base/component-api-patterns.md +208 -4
  365. package/squads/squad-design/knowledge-base/cross-surface-token-canon.md +209 -0
  366. package/squads/squad-design/knowledge-base/design-system-master-reference.md +1302 -0
  367. package/squads/squad-design/knowledge-base/design-systems-frameworks.md +91 -1
  368. package/squads/squad-design/knowledge-base/responsive-modern-css.md +96 -4
  369. package/squads/squad-design/knowledge-base/wcag-aria-reference.md +117 -5
  370. package/squads/squad-design/knowledge-base/web-performance-reference.md +127 -4
  371. package/squads/squad-design/squad.yaml +19 -4
  372. package/squads/squad-finance/knowledge-base/brazilian-taxation.md +263 -0
  373. package/squads/squad-finance/knowledge-base/contabilidade-master-reference.md +998 -0
  374. package/squads/squad-finance/knowledge-base/finance-master-reference.md +946 -0
  375. package/squads/squad-finance/knowledge-base/financial-reporting-analysis.md +316 -0
  376. package/squads/squad-finance/knowledge-base/fintech-brazilian-context.md +242 -0
  377. package/squads/squad-finance/knowledge-base/fpa-planning-frameworks.md +286 -0
  378. package/squads/squad-finance/knowledge-base/ma-and-transactions.md +285 -0
  379. package/squads/squad-finance/knowledge-base/risk-management.md +233 -0
  380. package/squads/squad-finance/knowledge-base/startups-venture-capital.md +337 -0
  381. package/squads/squad-growth/knowledge-base/ai-growth-playbook.md +216 -0
  382. package/squads/squad-growth/knowledge-base/attribution-models.md +78 -0
  383. package/squads/squad-growth/knowledge-base/brazilian-growth-context.md +208 -0
  384. package/squads/squad-growth/knowledge-base/community-led-growth.md +175 -0
  385. package/squads/squad-growth/knowledge-base/content-marketing-flywheel.md +190 -0
  386. package/squads/squad-growth/knowledge-base/email-lifecycle-framework.md +192 -0
  387. package/squads/squad-growth/knowledge-base/growth-frameworks-catalog.md +82 -0
  388. package/squads/squad-growth/knowledge-base/growth-master-reference.md +1168 -0
  389. package/squads/squad-growth/knowledge-base/routing-catalog.md +53 -11
  390. package/squads/squad-paidmedia/knowledge-base/audiences-segmentation-deep.md +285 -0
  391. package/squads/squad-paidmedia/knowledge-base/creative-strategy-deep.md +294 -0
  392. package/squads/squad-paidmedia/knowledge-base/google-ads-account-architecture.md +87 -0
  393. package/squads/squad-paidmedia/knowledge-base/meta-ads-campaign-architecture.md +76 -0
  394. package/squads/squad-paidmedia/knowledge-base/paid-media-metrics-reference.md +117 -0
  395. package/squads/squad-paidmedia/knowledge-base/paid-traffic-master-reference.md +1308 -0
  396. package/squads/squad-paidmedia/knowledge-base/routing-catalog.md +95 -18
  397. package/squads/squad-paidmedia/knowledge-base/traffic-masters-frameworks.md +71 -0
  398. package/squads/squad-product/knowledge-base/brazilian-product-context.md +284 -0
  399. package/squads/squad-product/knowledge-base/discovery-methodology-playbook.md +141 -0
  400. package/squads/squad-product/knowledge-base/pm-frameworks-reference.md +125 -9
  401. package/squads/squad-product/knowledge-base/product-analytics-formulas.md +72 -0
  402. package/squads/squad-product/knowledge-base/product-led-growth-reference.md +155 -13
  403. package/squads/squad-product/knowledge-base/product-market-fit-framework.md +222 -0
  404. package/squads/squad-product/knowledge-base/routing-catalog.md +32 -0
  405. package/squads/squad-research/knowledge-base/agentic-second-brain-reference.md +591 -0
  406. package/squads/squad-research/knowledge-base/ai-augmented-research.md +212 -0
  407. package/squads/squad-research/knowledge-base/brazilian-market-research-sources.md +197 -0
  408. package/squads/squad-research/knowledge-base/community-platforms-reference.md +786 -0
  409. package/squads/squad-research/knowledge-base/community-research-methods.md +194 -0
  410. package/squads/squad-research/knowledge-base/mixed-methods-research-design.md +168 -0
  411. package/squads/squad-research/knowledge-base/network-effects-analysis.md +192 -0
  412. package/squads/squad-research/knowledge-base/qualitative-research-deep-methods.md +202 -0
  413. package/squads/squad-research/knowledge-base/quantitative-research-methods.md +208 -0
  414. package/squads/squad-research/knowledge-base/research-frameworks-encyclopedia.md +40 -0
  415. package/squads/squad-research/knowledge-base/research-synthesis-frameworks.md +223 -0
  416. package/squads/squad-storytelling/knowledge-base/brand-mythology-framework.md +236 -0
  417. package/squads/squad-storytelling/knowledge-base/brazilian-storytelling-context.md +237 -0
  418. package/squads/squad-storytelling/knowledge-base/data-storytelling.md +232 -0
  419. package/squads/squad-storytelling/knowledge-base/improv-storytelling.md +226 -0
  420. package/squads/squad-storytelling/knowledge-base/persuasion-narrative-techniques.md +269 -0
  421. package/squads/squad-storytelling/knowledge-base/social-movement-narratives.md +191 -0
  422. package/squads/squad-storytelling/knowledge-base/video-storytelling.md +252 -0
  423. package/.sinapse-ai/core/registry/service-registry.json +0 -6346
  424. package/.sinapse-ai/data/registry-update-log.jsonl +0 -1307
  425. package/.sinapse-ai/manifests/agents.csv +0 -29
  426. package/.sinapse-ai/manifests/tasks.csv +0 -204
  427. package/.sinapse-ai/manifests/workers.csv +0 -196
  428. package/squads/claude-code-mastery/data/swarm-orchestration-patterns.yaml +0 -378
  429. package/squads/squad-animations/knowledge-base/framer-motion-complete-reference.md +0 -710
  430. package/squads/squad-animations/knowledge-base/web-animations-api-view-transitions.md +0 -478
  431. package/squads/squad-growth/tasks/calculate-sample-size.md +0 -121
  432. 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 = execSync(`bash "${scriptPath}" ${args.join(' ')}`, {
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
+ };