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
@@ -2,18 +2,19 @@
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
3
  "title": "Codex Handoff Packet",
4
4
  "type": "object",
5
- "additionalProperties": false,
5
+ "additionalProperties": true,
6
6
  "required": [
7
7
  "mission",
8
- "phase",
9
8
  "owner",
10
9
  "inputs",
11
10
  "outputs",
12
- "validators",
13
- "shared-surface-risk",
14
- "next-handoff"
11
+ "validators"
15
12
  ],
16
13
  "properties": {
14
+ "routeId": {
15
+ "type": "string",
16
+ "minLength": 1
17
+ },
17
18
  "mission": {
18
19
  "type": "string",
19
20
  "minLength": 1
@@ -26,6 +27,12 @@
26
27
  "type": "string",
27
28
  "minLength": 1
28
29
  },
30
+ "classification": {
31
+ "type": "string"
32
+ },
33
+ "summary": {
34
+ "type": "string"
35
+ },
29
36
  "inputs": {
30
37
  "type": "array",
31
38
  "minItems": 1,
@@ -50,14 +57,31 @@
50
57
  "minLength": 1
51
58
  }
52
59
  },
60
+ "sharedSurfaceRisk": {
61
+ "type": "string"
62
+ },
53
63
  "shared-surface-risk": {
54
64
  "type": "string",
55
- "enum": ["none", "codex-only", "shared-review-required"]
65
+ "enum": ["none", "codex-only", "shared-review-required", "low"]
66
+ },
67
+ "nextHandoff": {
68
+ "type": "object",
69
+ "properties": {
70
+ "to": { "type": "string" },
71
+ "artifact": { "type": "string" }
72
+ }
56
73
  },
57
74
  "next-handoff": {
58
75
  "type": "string",
59
76
  "minLength": 1
60
77
  },
78
+ "delegationChain": {
79
+ "type": "array"
80
+ },
81
+ "resources": {
82
+ "type": "array",
83
+ "items": { "type": "string" }
84
+ },
61
85
  "notes": {
62
86
  "type": "array",
63
87
  "items": {
@@ -2,6 +2,7 @@
2
2
 
3
3
  const fs = require('fs');
4
4
  const path = require('path');
5
+ const crypto = require('crypto');
5
6
  const yaml = require('js-yaml');
6
7
  const { getClient, isCodeIntelAvailable } = require('../code-intel');
7
8
  const { RegistryLoader, DEFAULT_REGISTRY_PATH } = require('../ids/registry-loader');
@@ -112,16 +113,68 @@ class RegistrySyncer {
112
113
  }
113
114
  }
114
115
 
115
- // Update metadata
116
+ // Update metadata (entityCount is structural; lastUpdated is deferred to after hash check)
116
117
  registry.metadata = registry.metadata || {};
117
- registry.metadata.lastUpdated = new Date().toISOString();
118
118
  registry.metadata.entityCount = allEntities.length;
119
119
 
120
+ // Idempotency: compute content hash excluding metadata.lastUpdated.
121
+ // If the on-disk registry produces the same hash, skip the write entirely
122
+ // so timestamp-only reruns do not churn the working tree.
123
+ const newHash = this._computeContentHash(registry);
124
+ const oldHash = this._readDiskContentHash(this._registryPath);
125
+
126
+ if (oldHash !== null && oldHash === newHash) {
127
+ this._logger(`[registry-syncer] Sync complete: ${this._stats.processed} processed, ${this._stats.skipped} skipped, ${this._stats.errors} errors (no content change — write skipped)`);
128
+ return { ...this._stats, writeSkipped: true };
129
+ }
130
+
131
+ // Stamp fresh timestamp only when we know we are going to write.
132
+ registry.metadata.lastUpdated = new Date().toISOString();
133
+
120
134
  // Atomic write
121
135
  this._atomicWrite(this._registryPath, registry);
122
136
 
123
137
  this._logger(`[registry-syncer] Sync complete: ${this._stats.processed} processed, ${this._stats.skipped} skipped, ${this._stats.errors} errors`);
124
- return { ...this._stats };
138
+ return { ...this._stats, writeSkipped: false };
139
+ }
140
+
141
+ /**
142
+ * Compute a stable content hash of the registry, deliberately excluding
143
+ * `metadata.lastUpdated` so that timestamp-only reruns produce the same hash.
144
+ * @param {Object} registry - Registry object
145
+ * @returns {string} SHA-256 hex digest
146
+ * @private
147
+ */
148
+ _computeContentHash(registry) {
149
+ // Shallow clone + strip lastUpdated from the metadata copy only.
150
+ const clone = {
151
+ ...registry,
152
+ metadata: { ...(registry.metadata || {}) },
153
+ };
154
+ delete clone.metadata.lastUpdated;
155
+ // yaml.dump with stable key ordering produces a deterministic serialization.
156
+ const serialized = yaml.dump(clone, { lineWidth: 120, noRefs: true, sortKeys: true });
157
+ return crypto.createHash('sha256').update(serialized).digest('hex');
158
+ }
159
+
160
+ /**
161
+ * Read the existing on-disk registry and compute its content hash
162
+ * (excluding metadata.lastUpdated). Returns null if the file does not
163
+ * exist or cannot be parsed — callers should treat null as "write needed".
164
+ * @param {string} registryPath - Path to on-disk registry
165
+ * @returns {string|null} SHA-256 hex digest or null
166
+ * @private
167
+ */
168
+ _readDiskContentHash(registryPath) {
169
+ try {
170
+ if (!fs.existsSync(registryPath)) return null;
171
+ const raw = fs.readFileSync(registryPath, 'utf8');
172
+ const parsed = yaml.load(raw);
173
+ if (!parsed || typeof parsed !== 'object') return null;
174
+ return this._computeContentHash(parsed);
175
+ } catch (_error) {
176
+ return null;
177
+ }
125
178
  }
126
179
 
127
180
  /**
@@ -60,5 +60,9 @@ async function run(context) {
60
60
  };
61
61
  }
62
62
 
63
- module.exports = { name, run, EXPECTED_AGENTS };
63
+ // Story A.3: agent memory directories may not exist yet on a fresh install.
64
+ // Treat runtime exceptions as WARN so fresh installs exit cleanly.
65
+ const onError = 'warn';
66
+
67
+ module.exports = { name, run, EXPECTED_AGENTS, onError };
64
68
 
@@ -53,5 +53,8 @@ async function run(context) {
53
53
  };
54
54
  }
55
55
 
56
- module.exports = { name, run };
56
+ // Story A.3: CLAUDE.md ships with the framework; exceptions indicate corruption.
57
+ const onError = 'fail';
58
+
59
+ module.exports = { name, run, onError };
57
60
 
@@ -128,5 +128,9 @@ async function run(context) {
128
128
  }
129
129
  }
130
130
 
131
- module.exports = { name, run };
131
+ // Story A.3: code-intel is optional infrastructure; runtime exceptions are not
132
+ // blocking and the check itself already handles missing providers gracefully.
133
+ const onError = 'warn';
134
+
135
+ module.exports = { name, run, onError };
132
136
 
@@ -78,5 +78,8 @@ async function run(context) {
78
78
  };
79
79
  }
80
80
 
81
- module.exports = { name, run };
81
+ // Story A.3: commands dir ships with the framework.
82
+ const onError = 'fail';
83
+
84
+ module.exports = { name, run, onError };
82
85
 
@@ -115,4 +115,7 @@ async function run(context) {
115
115
  };
116
116
  }
117
117
 
118
- module.exports = { name, run };
118
+ // Story A.3: deep check; exceptions are real and should FAIL.
119
+ const onError = 'fail';
120
+
121
+ module.exports = { name, run, onError };
@@ -50,5 +50,8 @@ async function run(context) {
50
50
  };
51
51
  }
52
52
 
53
- module.exports = { name, run };
53
+ // Story A.3: core-config.yaml is a hard requirement for framework operation.
54
+ const onError = 'fail';
55
+
56
+ module.exports = { name, run, onError };
54
57
 
@@ -50,5 +50,10 @@ async function run(context) {
50
50
  };
51
51
  }
52
52
 
53
- module.exports = { name, run };
53
+ // Story A.3: entity-registry may be absent or unreadable on a fresh install
54
+ // (before `sinapse install` populates it). Treat runtime exceptions as WARN
55
+ // so that fresh installs do not produce false FAILs.
56
+ const onError = 'warn';
57
+
58
+ module.exports = { name, run, onError };
54
59
 
@@ -47,5 +47,9 @@ async function run(context) {
47
47
  };
48
48
  }
49
49
 
50
- module.exports = { name, run };
50
+ // Story A.3: git hooks rely on a git repo + husky install. Neither is
51
+ // guaranteed on a fresh global install, so exceptions are treated as WARN.
52
+ const onError = 'warn';
53
+
54
+ module.exports = { name, run, onError };
51
55
 
@@ -45,5 +45,8 @@ async function run(context) {
45
45
  };
46
46
  }
47
47
 
48
- module.exports = { name, run };
48
+ // Story A.3: graph-dashboard ships with the framework.
49
+ const onError = 'fail';
50
+
51
+ module.exports = { name, run, onError };
49
52
 
@@ -115,5 +115,9 @@ async function run(context) {
115
115
  };
116
116
  }
117
117
 
118
- module.exports = { name, run };
118
+ // Story A.3: Claude Code hooks live in .claude/, which may not be fully
119
+ // populated on a fresh install. Degrade to WARN rather than FAIL.
120
+ const onError = 'warn';
121
+
122
+ module.exports = { name, run, onError };
119
123
 
@@ -82,5 +82,8 @@ async function run(context) {
82
82
  };
83
83
  }
84
84
 
85
- module.exports = { name, run };
85
+ // Story A.3: IDE sync mirrors agents; exceptions indicate broken install state.
86
+ const onError = 'fail';
87
+
88
+ module.exports = { name, run, onError };
86
89
 
@@ -30,5 +30,8 @@ async function run() {
30
30
  };
31
31
  }
32
32
 
33
- module.exports = { name, run };
33
+ // Story A.3: Node.js version is a hard prerequisite. Exceptions are FAIL.
34
+ const onError = 'fail';
35
+
36
+ module.exports = { name, run, onError };
34
37
 
@@ -75,5 +75,8 @@ async function run(context) {
75
75
  };
76
76
  }
77
77
 
78
- module.exports = { name, run };
78
+ // Story A.3: missing npm packages are always blocking. Exceptions are FAIL.
79
+ const onError = 'fail';
80
+
81
+ module.exports = { name, run, onError };
79
82
 
@@ -58,5 +58,8 @@ async function run(context) {
58
58
  };
59
59
  }
60
60
 
61
- module.exports = { name, run, EXPECTED_RULES };
61
+ // Story A.3: rules files ship with the framework; exceptions indicate real damage.
62
+ const onError = 'fail';
63
+
64
+ module.exports = { name, run, EXPECTED_RULES, onError };
62
65
 
@@ -118,5 +118,8 @@ async function run(context) {
118
118
  };
119
119
  }
120
120
 
121
- module.exports = { name, run };
121
+ // Story A.3: .claude/settings.json is a hard requirement. Exceptions are FAIL.
122
+ const onError = 'fail';
123
+
124
+ module.exports = { name, run, onError };
122
125
 
@@ -69,5 +69,8 @@ async function run(context) {
69
69
  };
70
70
  }
71
71
 
72
- module.exports = { name, run };
72
+ // Story A.3: skills dir ships with the framework.
73
+ const onError = 'fail';
74
+
75
+ module.exports = { name, run, onError };
73
76
 
@@ -1,12 +1,23 @@
1
1
  /**
2
2
  * SINAPSE Doctor — Environment Health Check Orchestrator
3
3
  *
4
- * Runs 12 modular checks against the SINAPSE environment and returns
4
+ * Runs modular checks against the SINAPSE environment and returns
5
5
  * structured results with optional --fix, --json, and --dry-run support.
6
6
  *
7
+ * Exception Classification (Story A.3):
8
+ * Each check module may export an `onError` field with one of:
9
+ * - 'fail' (default) — thrown exceptions map to a FAIL verdict
10
+ * - 'warn' — thrown exceptions map to a WARN verdict
11
+ * - 'skip' — thrown exceptions cause the check to be excluded
12
+ * from results entirely
13
+ *
14
+ * This replaces the previous behavior where the generic catch block
15
+ * marked every exception as FAIL, producing false alarms on fresh
16
+ * installs (no git repo, empty registry, missing agent memory dirs).
17
+ *
7
18
  * @module sinapse-ai/doctor
8
- * @version 2.0.0
9
- * @story INS-4.1
19
+ * @version 2.1.0
20
+ * @story INS-4.1, A.3
10
21
  */
11
22
 
12
23
  const path = require('path');
@@ -15,7 +26,46 @@ const { formatText } = require('./formatters/text');
15
26
  const { formatJson } = require('./formatters/json');
16
27
  const { applyFixes } = require('./fix-handler');
17
28
 
18
- const DOCTOR_VERSION = '2.0.0';
29
+ const DOCTOR_VERSION = '2.1.0';
30
+
31
+ const VALID_ON_ERROR = new Set(['fail', 'warn', 'skip']);
32
+
33
+ /**
34
+ * Map a check module's `onError` field to the verdict produced when
35
+ * the check itself throws. Falls back to 'fail' for safety.
36
+ *
37
+ * @param {Object} checkModule
38
+ * @returns {'fail' | 'warn' | 'skip'}
39
+ */
40
+ function resolveOnError(checkModule) {
41
+ const declared = checkModule && checkModule.onError;
42
+ if (declared && VALID_ON_ERROR.has(declared)) {
43
+ return declared;
44
+ }
45
+ return 'fail';
46
+ }
47
+
48
+ /**
49
+ * Build a structured result entry for a thrown exception, based on
50
+ * the check's declared error policy. Returns null if the policy is
51
+ * 'skip' (excluded from results).
52
+ *
53
+ * @param {Object} checkModule
54
+ * @param {Error} error
55
+ * @returns {Object|null}
56
+ */
57
+ function buildErrorResult(checkModule, error) {
58
+ const policy = resolveOnError(checkModule);
59
+ if (policy === 'skip') {
60
+ return null;
61
+ }
62
+ return {
63
+ check: checkModule.name || 'unknown',
64
+ status: policy === 'warn' ? 'WARN' : 'FAIL',
65
+ message: `Check threw error: ${error.message}`,
66
+ fixCommand: null,
67
+ };
68
+ }
19
69
 
20
70
  /**
21
71
  * Run all doctor checks
@@ -26,7 +76,7 @@ const DOCTOR_VERSION = '2.0.0';
26
76
  * @param {boolean} [options.dryRun=false] - Show what --fix would do
27
77
  * @param {boolean} [options.quiet=false] - Minimal output
28
78
  * @param {string} [options.projectRoot] - Project root (defaults to cwd)
29
- * @returns {Promise<Object>} Doctor results
79
+ * @returns {Promise<Object>} Doctor results (includes `internalError` when the runner itself crashes)
30
80
  */
31
81
  async function runDoctorChecks(options = {}) {
32
82
  const {
@@ -38,58 +88,115 @@ async function runDoctorChecks(options = {}) {
38
88
  projectRoot = process.cwd(),
39
89
  } = options;
40
90
 
41
- const context = {
42
- projectRoot,
43
- frameworkRoot: path.resolve(__dirname, '..', '..', '..'),
44
- options: { fix, json, dryRun, quiet, deep },
45
- };
91
+ try {
92
+ const context = {
93
+ projectRoot,
94
+ frameworkRoot: path.resolve(__dirname, '..', '..', '..'),
95
+ options: { fix, json, dryRun, quiet, deep },
96
+ };
97
+
98
+ // Load and run all checks (deep checks only with --deep flag)
99
+ const checks = loadChecks({ deep });
100
+ const results = [];
46
101
 
47
- // Load and run all checks (deep checks only with --deep flag)
48
- const checks = loadChecks({ deep });
49
- const results = [];
50
-
51
- for (const checkModule of checks) {
52
- try {
53
- const result = await checkModule.run(context);
54
- results.push(result);
55
- } catch (error) {
56
- results.push({
57
- check: checkModule.name || 'unknown',
58
- status: 'FAIL',
59
- message: `Check threw error: ${error.message}`,
60
- fixCommand: null,
61
- });
102
+ for (const checkModule of checks) {
103
+ try {
104
+ const result = await checkModule.run(context);
105
+ results.push(result);
106
+ } catch (error) {
107
+ const errorResult = buildErrorResult(checkModule, error);
108
+ if (errorResult !== null) {
109
+ results.push(errorResult);
110
+ }
111
+ // policy === 'skip' → silently exclude
112
+ }
62
113
  }
63
- }
64
114
 
65
- // Apply fixes if requested
66
- let fixResults = null;
67
- if (fix || dryRun) {
68
- fixResults = await applyFixes(results, context);
69
- }
115
+ // Apply fixes if requested
116
+ let fixResults = null;
117
+ if (fix || dryRun) {
118
+ fixResults = await applyFixes(results, context);
119
+ }
70
120
 
71
- // Build summary
72
- const summary = {
73
- pass: results.filter((r) => r.status === 'PASS').length,
74
- warn: results.filter((r) => r.status === 'WARN').length,
75
- fail: results.filter((r) => r.status === 'FAIL').length,
76
- info: results.filter((r) => r.status === 'INFO').length,
77
- };
121
+ // Build summary
122
+ const summary = {
123
+ pass: results.filter((r) => r.status === 'PASS').length,
124
+ warn: results.filter((r) => r.status === 'WARN').length,
125
+ fail: results.filter((r) => r.status === 'FAIL').length,
126
+ info: results.filter((r) => r.status === 'INFO').length,
127
+ };
78
128
 
79
- const output = {
80
- version: DOCTOR_VERSION,
81
- timestamp: new Date().toISOString(),
82
- summary,
83
- checks: results,
84
- fixResults,
85
- };
129
+ const output = {
130
+ version: DOCTOR_VERSION,
131
+ timestamp: new Date().toISOString(),
132
+ summary,
133
+ checks: results,
134
+ fixResults,
135
+ internalError: null,
136
+ };
137
+
138
+ // Format output
139
+ if (json) {
140
+ return { formatted: formatJson(output), data: output };
141
+ }
142
+
143
+ return { formatted: formatText(output, { quiet }), data: output };
144
+ } catch (runnerError) {
145
+ // Runner itself crashed (not a check throwing). Surface as exit code 3.
146
+ const summary = { pass: 0, warn: 0, fail: 0, info: 0 };
147
+ const errorPayload = {
148
+ message: runnerError.message,
149
+ stack: runnerError.stack,
150
+ };
151
+ const output = {
152
+ version: DOCTOR_VERSION,
153
+ timestamp: new Date().toISOString(),
154
+ summary,
155
+ checks: [],
156
+ fixResults: null,
157
+ internalError: errorPayload,
158
+ };
159
+
160
+ const formatted = json
161
+ ? formatJson(output)
162
+ : `SINAPSE Doctor v${DOCTOR_VERSION} — internal error: ${runnerError.message}`;
86
163
 
87
- // Format output
88
- if (json) {
89
- return { formatted: formatJson(output), data: output };
164
+ return { formatted, data: output };
90
165
  }
166
+ }
91
167
 
92
- return { formatted: formatText(output, { quiet }), data: output };
168
+ /**
169
+ * Resolve a doctor result object into a canonical exit code.
170
+ *
171
+ * Story A.3 exit code mapping:
172
+ * 0 — PASS (no FAILs, no WARNs)
173
+ * 1 — WARN only (no FAILs)
174
+ * 2 — at least one FAIL
175
+ * 3 — internal runner error (runDoctorChecks itself crashed)
176
+ *
177
+ * @param {Object} result - Return value from runDoctorChecks()
178
+ * @returns {0 | 1 | 2 | 3}
179
+ */
180
+ function resolveExitCode(result) {
181
+ if (!result || !result.data) {
182
+ return 3;
183
+ }
184
+ if (result.data.internalError) {
185
+ return 3;
186
+ }
187
+ const summary = result.data.summary || {};
188
+ if ((summary.fail || 0) > 0) {
189
+ return 2;
190
+ }
191
+ if ((summary.warn || 0) > 0) {
192
+ return 1;
193
+ }
194
+ return 0;
93
195
  }
94
196
 
95
- module.exports = { runDoctorChecks, DOCTOR_VERSION };
197
+ module.exports = {
198
+ runDoctorChecks,
199
+ resolveExitCode,
200
+ resolveOnError,
201
+ DOCTOR_VERSION,
202
+ };
@@ -483,10 +483,15 @@ class RegistryUpdater {
483
483
  }
484
484
 
485
485
  _writeRegistry(registryData) {
486
+ // Story 10.24 — sortKeys: true makes the YAML output deterministic.
487
+ // Without it, key order follows JS object insertion order, which means
488
+ // semantically-identical writes can produce textually-different files
489
+ // and cause endless `M entity-registry.yaml` churn in `git status`.
490
+ // The registry is machine-managed so alphabetical key order is fine.
486
491
  const yamlStr = yaml.dump(registryData, {
487
492
  lineWidth: 120,
488
493
  noRefs: true,
489
- sortKeys: false,
494
+ sortKeys: true,
490
495
  });
491
496
 
492
497
  const dir = path.dirname(this._registryPath);