sinapse-ai 1.8.0 → 1.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (361) hide show
  1. package/.claude/hooks/mind-clone-governance.py +212 -212
  2. package/.claude/hooks/read-protection.py +152 -152
  3. package/.claude/hooks/slug-validation.py +175 -175
  4. package/.claude/hooks/sql-governance.py +183 -183
  5. package/.claude/rules/documentation-first.md +1 -1
  6. package/.claude/rules/hook-governance.md +1 -1
  7. package/.claude/rules/mandatory-delegation.md +1 -1
  8. package/.claude/rules/project-intelligence.md +1 -1
  9. package/.codex/agents/analyst.md +4 -371
  10. package/.codex/agents/animations-orqx.md +4 -57
  11. package/.codex/agents/architect.md +4 -560
  12. package/.codex/agents/brand-orqx.md +4 -95
  13. package/.codex/agents/claude-mastery-chief.md +4 -0
  14. package/.codex/agents/cloning-orqx.md +4 -70
  15. package/.codex/agents/commercial-orqx.md +4 -67
  16. package/.codex/agents/config-engineer.md +2 -2
  17. package/.codex/agents/content-orqx.md +4 -77
  18. package/.codex/agents/copy-orqx.md +4 -65
  19. package/.codex/agents/cost-optimizer.md +4 -0
  20. package/.codex/agents/council-orqx.md +4 -68
  21. package/.codex/agents/courses-orqx.md +4 -64
  22. package/.codex/agents/cro-persuasion.md +4 -0
  23. package/.codex/agents/cyber-orqx.md +4 -67
  24. package/.codex/agents/data-engineer.md +4 -542
  25. package/.codex/agents/design-orqx.md +4 -65
  26. package/.codex/agents/design-system.md +4 -210
  27. package/.codex/agents/developer.md +4 -666
  28. package/.codex/agents/devops.md +4 -668
  29. package/.codex/agents/finance-orqx.md +4 -57
  30. package/.codex/agents/fiscal-compliance-br.md +4 -0
  31. package/.codex/agents/forecast-strategist.md +4 -0
  32. package/.codex/agents/growth-orqx.md +4 -75
  33. package/.codex/agents/hooks-architect.md +2 -2
  34. package/.codex/agents/mcp-integrator.md +2 -2
  35. package/.codex/agents/paidmedia-orqx.md +4 -67
  36. package/.codex/agents/platform-aesthetic-director.md +4 -0
  37. package/.codex/agents/premium-packaging-strategist.md +4 -0
  38. package/.codex/agents/product-lead.md +4 -371
  39. package/.codex/agents/product-orqx.md +4 -57
  40. package/.codex/agents/product-surface-director.md +4 -0
  41. package/.codex/agents/project-integrator.md +2 -2
  42. package/.codex/agents/project-lead.md +4 -414
  43. package/.codex/agents/quality-gate.md +4 -547
  44. package/.codex/agents/research-orqx.md +4 -67
  45. package/.codex/agents/roadmap-sentinel.md +2 -2
  46. package/.codex/agents/skill-craftsman.md +2 -2
  47. package/.codex/agents/snps-orqx.md +4 -684
  48. package/.codex/agents/sop-extractor.md +4 -61
  49. package/.codex/agents/sprint-lead.md +4 -324
  50. package/.codex/agents/squad-creator.md +4 -402
  51. package/.codex/agents/storytelling-orqx.md +4 -65
  52. package/.codex/agents/swarm-orqx.md +4 -64
  53. package/.codex/agents/ux-design-expert.md +4 -532
  54. package/.codex/agents/ux-designer.md +4 -124
  55. package/.codex/command-registry.json +9 -9
  56. package/.codex/delegation-matrix.json +375 -839
  57. package/.codex/delegation-parity.json +658 -0
  58. package/.codex/handoff-packet.parity.schema.json +148 -0
  59. package/.codex/handoff-packet.template.json +26 -0
  60. package/.codex/instructions.md +8 -8
  61. package/.codex/scripts/resolve-codex-agent.js +482 -0
  62. package/.codex/scripts/resolve-codex-command.js +75 -12
  63. package/.codex/scripts/resolve-codex-delegation.js +131 -92
  64. package/.codex/skills/sinapse-claude/SKILL.md +3 -3
  65. package/.codex/skills/sinapse-po/SKILL.md +1 -1
  66. package/.codex/tasks/resolve-sinapse-conflict.md +1 -1
  67. package/.sinapse-ai/constitution.md +5 -5
  68. package/.sinapse-ai/core/doctor/checks/git-hooks.js +163 -19
  69. package/.sinapse-ai/core/events/dashboard-emitter.js +30 -9
  70. package/.sinapse-ai/core/execution/subagent-dispatcher.js +1 -1
  71. package/.sinapse-ai/core/synapse/engine.js +15 -0
  72. package/.sinapse-ai/core/ui/observability-panel.js +240 -0
  73. package/.sinapse-ai/core-config.yaml +0 -20
  74. package/.sinapse-ai/data/entity-registry.yaml +185 -236
  75. package/.sinapse-ai/development/agents/snps-orqx.md +16 -26
  76. package/.sinapse-ai/development/tasks/build-autonomous.md +11 -1
  77. package/.sinapse-ai/development/tasks/build-resume.md +8 -0
  78. package/.sinapse-ai/development/tasks/build-status.md +8 -0
  79. package/.sinapse-ai/development/tasks/build.md +8 -0
  80. package/.sinapse-ai/development/tasks/cleanup-worktrees.md +8 -1
  81. package/.sinapse-ai/development/tasks/gotcha.md +8 -0
  82. package/.sinapse-ai/development/tasks/gotchas.md +8 -0
  83. package/.sinapse-ai/development/tasks/ids-health.md +14 -6
  84. package/.sinapse-ai/development/tasks/list-mcps.md +15 -0
  85. package/.sinapse-ai/development/tasks/merge-worktree.md +8 -1
  86. package/.sinapse-ai/development/tasks/qa-review-build.md +18 -0
  87. package/.sinapse-ai/development/tasks/remove-mcp.md +8 -1
  88. package/.sinapse-ai/development/tasks/validate-agents.md +26 -14
  89. package/.sinapse-ai/development/templates/service-template/README.md.hbs +159 -159
  90. package/.sinapse-ai/development/templates/service-template/__tests__/index.test.ts.hbs +238 -238
  91. package/.sinapse-ai/development/templates/service-template/client.ts.hbs +404 -404
  92. package/.sinapse-ai/development/templates/service-template/errors.ts.hbs +183 -183
  93. package/.sinapse-ai/development/templates/service-template/index.ts.hbs +121 -121
  94. package/.sinapse-ai/development/templates/service-template/package.json.hbs +88 -88
  95. package/.sinapse-ai/development/templates/service-template/types.ts.hbs +146 -146
  96. package/.sinapse-ai/development/templates/squad-template/LICENSE +22 -22
  97. package/.sinapse-ai/git-hooks/lib/framework-guard.js +258 -0
  98. package/.sinapse-ai/git-hooks/lib/secret-scanner-core.js +355 -0
  99. package/.sinapse-ai/git-hooks/lib/staged-secret-scan.js +179 -0
  100. package/.sinapse-ai/git-hooks/lib/staged-sql-guard.js +204 -0
  101. package/.sinapse-ai/git-hooks/post-commit +28 -0
  102. package/.sinapse-ai/git-hooks/pre-commit +81 -0
  103. package/.sinapse-ai/git-hooks/pre-push +83 -0
  104. package/.sinapse-ai/hooks/ids-post-commit.js +13 -11
  105. package/.sinapse-ai/hooks/ids-pre-push.js +9 -7
  106. package/.sinapse-ai/infrastructure/scripts/codex-parity/resolve.js +161 -0
  107. package/.sinapse-ai/infrastructure/scripts/dashboard-status-writer.js +6 -2
  108. package/.sinapse-ai/infrastructure/scripts/ide-sync/index.js +65 -68
  109. package/.sinapse-ai/infrastructure/scripts/sync-codex-local-first.js +156 -1
  110. package/.sinapse-ai/infrastructure/scripts/validate-codex-delegation.js +1 -4
  111. package/.sinapse-ai/infrastructure/scripts/validate-codex-integration.js +41 -5
  112. package/.sinapse-ai/infrastructure/templates/coderabbit.yaml.template +280 -280
  113. package/.sinapse-ai/infrastructure/templates/config/env.example +16 -16
  114. package/.sinapse-ai/infrastructure/templates/config/gitignore-additions.tmpl +59 -59
  115. package/.sinapse-ai/infrastructure/templates/github/CODEOWNERS.template +12 -12
  116. package/.sinapse-ai/infrastructure/templates/github-workflows/ci.yml.template +170 -170
  117. package/.sinapse-ai/infrastructure/templates/github-workflows/pr-automation.yml.template +331 -331
  118. package/.sinapse-ai/infrastructure/templates/github-workflows/release.yml.template +197 -197
  119. package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-brownfield-merge.tmpl +19 -19
  120. package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-node.tmpl +86 -86
  121. package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-python.tmpl +146 -146
  122. package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-sinapse-base.tmpl +64 -64
  123. package/.sinapse-ai/infrastructure/templates/safe-collab/CODEOWNERS.template +16 -16
  124. package/.sinapse-ai/infrastructure/templates/sinapse-sync.yaml.template +183 -183
  125. package/.sinapse-ai/install-manifest.yaml +112 -164
  126. package/.sinapse-ai/local-config.yaml.template +65 -65
  127. package/.sinapse-ai/product/templates/adr.hbs +126 -126
  128. package/.sinapse-ai/product/templates/dbdr.hbs +242 -242
  129. package/.sinapse-ai/product/templates/epic.hbs +213 -213
  130. package/.sinapse-ai/product/templates/ide-rules/codex-rules.md +30 -0
  131. package/.sinapse-ai/product/templates/pmdr.hbs +187 -187
  132. package/.sinapse-ai/product/templates/prd-v2.0.hbs +217 -217
  133. package/.sinapse-ai/product/templates/prd.hbs +202 -202
  134. package/.sinapse-ai/product/templates/statusline/statusline-script.js +31 -8
  135. package/.sinapse-ai/product/templates/statusline/track-agent-clear.cjs +79 -0
  136. package/.sinapse-ai/product/templates/statusline/track-agent.cjs +218 -0
  137. package/.sinapse-ai/product/templates/story.hbs +264 -264
  138. package/.sinapse-ai/product/templates/task.hbs +171 -171
  139. package/.sinapse-ai/product/templates/tmpl-comment-on-examples.sql +159 -159
  140. package/.sinapse-ai/product/templates/tmpl-migration-script.sql +92 -92
  141. package/.sinapse-ai/product/templates/tmpl-rls-granular-policies.sql +105 -105
  142. package/.sinapse-ai/product/templates/tmpl-rls-kiss-policy.sql +11 -11
  143. package/.sinapse-ai/product/templates/tmpl-rls-roles.sql +136 -136
  144. package/.sinapse-ai/product/templates/tmpl-rls-simple.sql +78 -78
  145. package/.sinapse-ai/product/templates/tmpl-rls-tenant.sql +153 -153
  146. package/.sinapse-ai/product/templates/tmpl-rollback-script.sql +78 -78
  147. package/.sinapse-ai/product/templates/tmpl-seed-data.sql +141 -141
  148. package/.sinapse-ai/product/templates/tmpl-smoke-test.sql +17 -17
  149. package/.sinapse-ai/product/templates/tmpl-staging-copy-merge.sql +140 -140
  150. package/.sinapse-ai/product/templates/tmpl-stored-proc.sql +141 -141
  151. package/.sinapse-ai/product/templates/tmpl-trigger.sql +153 -153
  152. package/.sinapse-ai/product/templates/tmpl-view-materialized.sql +134 -134
  153. package/.sinapse-ai/product/templates/tmpl-view.sql +178 -178
  154. package/AGENTS.md +193 -0
  155. package/CHANGELOG.md +1247 -0
  156. package/LICENSE +63 -63
  157. package/README.en.md +17 -18
  158. package/README.md +18 -19
  159. package/bin/cli.js +1 -1
  160. package/bin/commands/install.js +194 -22
  161. package/bin/commands/status.js +14 -1
  162. package/bin/commands/uninstall.js +2 -2
  163. package/bin/commands/update.js +52 -0
  164. package/bin/lib/setup-statusline.js +191 -0
  165. package/bin/sinapse-init.js +11 -83
  166. package/bin/utils/framework-guard.js +17 -4
  167. package/bin/utils/secret-scanner-core.js +109 -7
  168. package/bin/utils/staged-sql-guard.js +204 -0
  169. package/bin/utils/validate-publish.js +63 -0
  170. package/docs/agent-reference-guide.md +5 -7
  171. package/docs/framework/agent-prefix-convention.md +58 -0
  172. package/docs/framework/architecture-overview.md +4 -4
  173. package/docs/framework/collaboration-activation.md +45 -0
  174. package/docs/framework/guiding-principles.md +9 -9
  175. package/docs/getting-started.md +1 -1
  176. package/docs/guides/agent-reference.md +1 -1
  177. package/docs/guides/codex-config.md +4 -5
  178. package/docs/pt/architecture/sub-orqx-pattern.md +20 -18
  179. package/docs/security/overview.md +1 -1
  180. package/package.json +16 -12
  181. package/packages/installer/src/index.js +26 -0
  182. package/packages/installer/src/installer/git-hooks-installer.js +211 -47
  183. package/packages/installer/src/installer/sinapse-ai-installer.js +71 -0
  184. package/packages/installer/src/wizard/feedback.js +1 -1
  185. package/packages/installer/src/wizard/ide-config-generator.js +26 -26
  186. package/packages/installer/src/wizard/index.js +53 -4
  187. package/packages/sinapse-install/bin/edmcp.js +0 -0
  188. package/packages/sinapse-install/bin/sinapse-install.js +0 -0
  189. package/scripts/audit-tasks.cjs +112 -91
  190. package/scripts/check-markdown-links.py +352 -352
  191. package/scripts/prepare-hooks.js +58 -0
  192. package/scripts/regenerate-orqx-stubs.ps1 +2 -3
  193. package/scripts/sync-counts.js +10 -2
  194. package/scripts/sync-squad-yaml-components.js +108 -6
  195. package/scripts/validate-agents-md.js +128 -0
  196. package/scripts/validate-all.js +1 -0
  197. package/scripts/validate-squad-orqx.js +19 -9
  198. package/sinapse/agents/sinapse-orqx.md +16 -26
  199. package/sinapse/agents/snps-orqx.md +15 -25
  200. package/sinapse/knowledge-base/routing-catalog.md +1 -1
  201. package/sinapse/tasks/diagnose-and-route.md +1 -1
  202. package/sinapse/tasks/squad-status-report.md +1 -1
  203. package/squads/claude-code-mastery/agents/claude-mastery-chief.md +1 -1
  204. package/squads/claude-code-mastery/agents/hooks-architect.md +60 -68
  205. package/squads/claude-code-mastery/knowledge-base/swarm-orchestration-patterns.md +1 -1
  206. package/squads/claude-code-mastery/squad.yaml +8 -0
  207. package/squads/claude-code-mastery/tasks/audit-setup.md +1 -1
  208. package/squads/claude-code-mastery/workflows/optimization-cycle.yaml +4 -4
  209. package/squads/claude-code-mastery/workflows/project-setup-cycle.yaml +4 -4
  210. package/squads/squad-animations/README.md +1 -1
  211. package/squads/squad-animations/squad.yaml +1 -1
  212. package/squads/squad-brand/squad.yaml +1 -1
  213. package/squads/squad-cloning/README.md +1 -1
  214. package/squads/squad-cloning/squad.yaml +1 -1
  215. package/squads/squad-commercial/README.md +1 -1
  216. package/squads/squad-commercial/squad.yaml +2 -3
  217. package/squads/squad-content/README.md +1 -1
  218. package/squads/squad-content/squad.yaml +1 -1
  219. package/squads/squad-copy/README.md +1 -1
  220. package/squads/squad-copy/squad.yaml +2 -3
  221. package/squads/squad-council/README.md +1 -1
  222. package/squads/squad-courses/README.md +1 -1
  223. package/squads/squad-courses/squad.yaml +1 -1
  224. package/squads/squad-cybersecurity/README.md +1 -1
  225. package/squads/squad-cybersecurity/squad.yaml +2 -3
  226. package/squads/squad-design/README.md +1 -1
  227. package/squads/{squad-artdir → squad-design}/agents/cro-persuasion.md +1 -1
  228. package/squads/{squad-artdir → squad-design}/agents/platform-aesthetic-director.md +2 -2
  229. package/squads/{squad-artdir → squad-design}/agents/premium-packaging-strategist.md +2 -2
  230. package/squads/{squad-artdir → squad-design}/agents/product-surface-director.md +3 -3
  231. package/squads/squad-design/squad.yaml +6 -3
  232. package/squads/squad-finance/README.md +1 -1
  233. package/squads/squad-finance/squad.yaml +7 -1
  234. package/squads/squad-growth/README.md +1 -1
  235. package/squads/squad-growth/squad.yaml +1 -1
  236. package/squads/squad-paidmedia/README.md +1 -1
  237. package/squads/squad-paidmedia/squad.yaml +2 -3
  238. package/squads/squad-product/README.md +1 -1
  239. package/squads/squad-product/squad.yaml +1 -1
  240. package/squads/squad-research/README.md +1 -1
  241. package/squads/squad-research/squad.yaml +2 -3
  242. package/squads/squad-storytelling/README.md +1 -1
  243. package/squads/squad-storytelling/squad.yaml +2 -3
  244. package/.codex/agents/brad-frost.md +0 -46
  245. package/.codex/agents/claude-orqx.md +0 -72
  246. package/.codex/agents/copy-chief.md +0 -162
  247. package/.codex/agents/cyber-chief.md +0 -169
  248. package/.codex/agents/dan-mall.md +0 -43
  249. package/.codex/agents/data-chief.md +0 -198
  250. package/.codex/agents/dave-malouf.md +0 -43
  251. package/.codex/agents/db-sage.md +0 -152
  252. package/.codex/agents/design-chief.md +0 -226
  253. package/.codex/agents/dev.md +0 -102
  254. package/.codex/agents/legal-chief.md +0 -199
  255. package/.codex/agents/nano-banana-generator.md +0 -42
  256. package/.codex/agents/pm.md +0 -81
  257. package/.codex/agents/po.md +0 -85
  258. package/.codex/agents/qa.md +0 -98
  259. package/.codex/agents/sm.md +0 -77
  260. package/.codex/agents/squad-chief.md +0 -1553
  261. package/.codex/agents/squad.md +0 -66
  262. package/.codex/agents/story-chief.md +0 -180
  263. package/.codex/agents/tools-orqx.md +0 -219
  264. package/.codex/agents/traffic-masters-chief.md +0 -211
  265. package/.sinapse-ai/core/memory/__tests__/active-modules.verify.js +0 -265
  266. package/.sinapse-ai/core/permissions/__tests__/permission-mode.test.js +0 -293
  267. package/.sinapse-ai/data/registry-update-log.jsonl +0 -158
  268. package/.sinapse-ai/infrastructure/scripts/ide-sync/gemini-commands.js +0 -298
  269. package/.sinapse-ai/infrastructure/scripts/ide-sync/transformers/antigravity.js +0 -121
  270. package/.sinapse-ai/infrastructure/scripts/ide-sync/transformers/cursor.js +0 -119
  271. package/.sinapse-ai/infrastructure/scripts/ide-sync/transformers/github-copilot.js +0 -191
  272. package/.sinapse-ai/infrastructure/scripts/ide-sync/transformers/kimi.js +0 -448
  273. package/.sinapse-ai/infrastructure/tests/project-status-loader.test.js +0 -569
  274. package/.sinapse-ai/infrastructure/tests/regression-suite-v2.md +0 -622
  275. package/.sinapse-ai/infrastructure/tests/validate-module.js +0 -98
  276. package/.sinapse-ai/infrastructure/tests/worktree-manager.test.js +0 -620
  277. package/.sinapse-ai/monitor/hooks/lib/__init__.py +0 -2
  278. package/.sinapse-ai/monitor/hooks/lib/enrich.py +0 -59
  279. package/.sinapse-ai/monitor/hooks/lib/send_event.py +0 -48
  280. package/.sinapse-ai/monitor/hooks/notification.py +0 -30
  281. package/.sinapse-ai/monitor/hooks/post_tool_use.py +0 -46
  282. package/.sinapse-ai/monitor/hooks/pre_compact.py +0 -30
  283. package/.sinapse-ai/monitor/hooks/pre_tool_use.py +0 -41
  284. package/.sinapse-ai/monitor/hooks/stop.py +0 -30
  285. package/.sinapse-ai/monitor/hooks/subagent_stop.py +0 -30
  286. package/.sinapse-ai/monitor/hooks/user_prompt_submit.py +0 -39
  287. package/.sinapse-ai/product/templates/statusline/track-agent.sh +0 -69
  288. package/.sinapse-ai/workflow-intelligence/__tests__/confidence-scorer.test.js +0 -335
  289. package/.sinapse-ai/workflow-intelligence/__tests__/integration.test.js +0 -340
  290. package/.sinapse-ai/workflow-intelligence/__tests__/suggestion-engine.test.js +0 -438
  291. package/.sinapse-ai/workflow-intelligence/__tests__/wave-analyzer.test.js +0 -448
  292. package/.sinapse-ai/workflow-intelligence/__tests__/workflow-registry.test.js +0 -303
  293. package/bin/sinapse-graph.js +0 -19
  294. package/docs/codex-integration-process.md +0 -22
  295. package/docs/codex-parity-program.md +0 -27
  296. package/packages/installer/src/__tests__/performance-benchmark.js +0 -383
  297. package/packages/installer/tests/integration/environment-configuration.test.js +0 -332
  298. package/packages/installer/tests/integration/wizard-detection.test.js +0 -352
  299. package/packages/installer/tests/unit/artifact-copy-pipeline/artifact-copy-pipeline.test.js +0 -383
  300. package/packages/installer/tests/unit/claude-md-template-v5/claude-md-template-v5.test.js +0 -193
  301. package/packages/installer/tests/unit/config-validator.test.js +0 -315
  302. package/packages/installer/tests/unit/detection/detect-project-type.test.js +0 -539
  303. package/packages/installer/tests/unit/doctor/doctor-checks.test.js +0 -636
  304. package/packages/installer/tests/unit/doctor/doctor-orchestrator.test.js +0 -192
  305. package/packages/installer/tests/unit/entity-registry-bootstrap.test.js +0 -186
  306. package/packages/installer/tests/unit/env-template.test.js +0 -187
  307. package/packages/installer/tests/unit/generate-settings-json/generate-settings-json.test.js +0 -310
  308. package/packages/installer/tests/unit/git-hooks-installer.test.js +0 -262
  309. package/packages/installer/tests/unit/ide-sync-integration/ide-sync-integration.test.js +0 -231
  310. package/packages/installer/tests/unit/merger/env-merger.test.js +0 -191
  311. package/packages/installer/tests/unit/merger/markdown-merger.test.js +0 -262
  312. package/packages/installer/tests/unit/merger/strategies.test.js +0 -154
  313. package/packages/installer/tests/unit/merger/yaml-merger.test.js +0 -328
  314. package/packages/sinapse-install/tests/unit/chrome-brain.smoke.test.js +0 -66
  315. package/scripts/install-monitor-hooks.sh +0 -82
  316. package/squads/squad-artdir/README.md +0 -90
  317. package/squads/squad-artdir/agents/accessibility-guardian.md +0 -184
  318. package/squads/squad-artdir/agents/artdir-orqx.md +0 -222
  319. package/squads/squad-artdir/agents/color-psychologist.md +0 -166
  320. package/squads/squad-artdir/agents/design-system-architect.md +0 -100
  321. package/squads/squad-artdir/agents/ia-architect.md +0 -169
  322. package/squads/squad-artdir/agents/interaction-designer.md +0 -162
  323. package/squads/squad-artdir/agents/layout-engineer.md +0 -163
  324. package/squads/squad-artdir/agents/motion-architect.md +0 -185
  325. package/squads/squad-artdir/agents/type-systemist.md +0 -138
  326. package/squads/squad-artdir/agents/visual-strategist.md +0 -127
  327. package/squads/squad-artdir/checklists/seven-pillars-validation-checklist.md +0 -172
  328. package/squads/squad-artdir/knowledge-base/case-nyo-ia-reference.md +0 -289
  329. package/squads/squad-artdir/knowledge-base/deliverables-templates.md +0 -457
  330. package/squads/squad-artdir/knowledge-base/motion-technique-catalog.md +0 -247
  331. package/squads/squad-artdir/knowledge-base/premium-packaging-principles.md +0 -133
  332. package/squads/squad-artdir/knowledge-base/psychological-toolkit.md +0 -229
  333. package/squads/squad-artdir/knowledge-base/saas-art-direction-canon.md +0 -242
  334. package/squads/squad-artdir/knowledge-base/seven-pillars-framework.md +0 -289
  335. package/squads/squad-artdir/knowledge-base/ten-pillars-framework.md +0 -221
  336. package/squads/squad-artdir/package.json +0 -20
  337. package/squads/squad-artdir/squad.yaml +0 -299
  338. package/squads/squad-artdir/tasks/audit-conversion.md +0 -97
  339. package/squads/squad-artdir/tasks/audit-drift-multi-surface.md +0 -55
  340. package/squads/squad-artdir/tasks/consult-saas-canon.md +0 -54
  341. package/squads/squad-artdir/tasks/create-art-direction-brief.md +0 -110
  342. package/squads/squad-artdir/tasks/create-premium-packaging-brief.md +0 -61
  343. package/squads/squad-artdir/tasks/create-wireflow.md +0 -84
  344. package/squads/squad-artdir/tasks/design-color-system.md +0 -81
  345. package/squads/squad-artdir/tasks/design-product-surface.md +0 -60
  346. package/squads/squad-artdir/tasks/design-token-system.md +0 -58
  347. package/squads/squad-artdir/tasks/diagnose-visual-language.md +0 -92
  348. package/squads/squad-artdir/tasks/first-5-minutes-choreography.md +0 -65
  349. package/squads/squad-artdir/tasks/specify-motion-system.md +0 -84
  350. package/squads/squad-artdir/tasks/validate-against-pillars.md +0 -143
  351. package/squads/squad-artdir/templates/art-direction-brief-template.md +0 -215
  352. package/squads/squad-artdir/workflows/conversion-audit-cycle.yaml +0 -142
  353. package/squads/squad-artdir/workflows/full-art-direction-cycle.yaml +0 -179
  354. package/squads/squad-artdir/workflows/saas-platform-art-direction-cycle.yaml +0 -338
  355. package/squads/squad-commercial/agents/legal-chief.md +0 -199
  356. package/squads/squad-copy/agents/copy-chief.md +0 -162
  357. package/squads/squad-cybersecurity/agents/cyber-chief.md +0 -169
  358. package/squads/squad-design/agents/design-chief.md +0 -226
  359. package/squads/squad-paidmedia/agents/traffic-masters-chief.md +0 -211
  360. package/squads/squad-research/agents/data-chief.md +0 -198
  361. package/squads/squad-storytelling/agents/story-chief.md +0 -180
@@ -1,141 +1,141 @@
1
- -- Seed Data Template
2
- -- Purpose: Idempotent seed data for development and testing
3
- -- Created: :created_date
4
- -- Author: :author
5
- --
6
- -- IMPORTANT: All seed operations should be idempotent (safe to run multiple times)
7
-
8
- -- =============================================================================
9
- -- SEED CONFIGURATION
10
- -- =============================================================================
11
-
12
- -- Disable triggers during seeding (optional, speeds up bulk insert)
13
- -- SET session_replication_role = replica;
14
-
15
- BEGIN;
16
-
17
- -- =============================================================================
18
- -- SEED: REFERENCE DATA (Lookup tables, static data)
19
- -- =============================================================================
20
-
21
- -- Example: Status types
22
- INSERT INTO status_types (id, name, description, sort_order)
23
- VALUES
24
- ('11111111-1111-1111-1111-111111111001', 'draft', 'Initial draft state', 1),
25
- ('11111111-1111-1111-1111-111111111002', 'pending', 'Awaiting action', 2),
26
- ('11111111-1111-1111-1111-111111111003', 'active', 'Currently active', 3),
27
- ('11111111-1111-1111-1111-111111111004', 'completed', 'Work completed', 4),
28
- ('11111111-1111-1111-1111-111111111005', 'archived', 'No longer active', 5)
29
- ON CONFLICT (id) DO UPDATE SET
30
- name = EXCLUDED.name,
31
- description = EXCLUDED.description,
32
- sort_order = EXCLUDED.sort_order;
33
-
34
- -- Example: Categories
35
- INSERT INTO categories (id, name, slug, parent_id)
36
- VALUES
37
- ('22222222-2222-2222-2222-222222222001', 'General', 'general', NULL),
38
- ('22222222-2222-2222-2222-222222222002', 'Development', 'development', NULL),
39
- ('22222222-2222-2222-2222-222222222003', 'Frontend', 'frontend', '22222222-2222-2222-2222-222222222002'),
40
- ('22222222-2222-2222-2222-222222222004', 'Backend', 'backend', '22222222-2222-2222-2222-222222222002')
41
- ON CONFLICT (id) DO UPDATE SET
42
- name = EXCLUDED.name,
43
- slug = EXCLUDED.slug,
44
- parent_id = EXCLUDED.parent_id;
45
-
46
- -- =============================================================================
47
- -- SEED: ROLES AND PERMISSIONS
48
- -- =============================================================================
49
-
50
- INSERT INTO roles (id, name, description, permissions)
51
- VALUES
52
- ('33333333-3333-3333-3333-333333333001', 'admin', 'Full system access', '["*"]'::JSONB),
53
- ('33333333-3333-3333-3333-333333333002', 'editor', 'Can edit content', '["read", "write", "update"]'::JSONB),
54
- ('33333333-3333-3333-3333-333333333003', 'viewer', 'Read-only access', '["read"]'::JSONB)
55
- ON CONFLICT (id) DO UPDATE SET
56
- description = EXCLUDED.description,
57
- permissions = EXCLUDED.permissions;
58
-
59
- -- =============================================================================
60
- -- SEED: TEST USERS (Development only!)
61
- -- =============================================================================
62
-
63
- -- NOTE: Only run in development environment
64
- -- These are fake users for testing - DO NOT use in production
65
-
66
- -- Check environment before inserting test data
67
- DO $$
68
- BEGIN
69
- -- Only seed test users if this appears to be a dev environment
70
- IF current_database() LIKE '%dev%' OR current_database() LIKE '%test%' THEN
71
- -- Test Admin User
72
- INSERT INTO auth.users (
73
- id,
74
- email,
75
- encrypted_password,
76
- email_confirmed_at,
77
- raw_user_meta_data
78
- ) VALUES (
79
- '00000000-0000-0000-0000-000000000001',
80
- 'admin@test.local',
81
- crypt('testpassword123', gen_salt('bf')),
82
- NOW(),
83
- '{"full_name": "Test Admin"}'::JSONB
84
- ) ON CONFLICT (id) DO NOTHING;
85
-
86
- -- Test Regular User
87
- INSERT INTO auth.users (
88
- id,
89
- email,
90
- encrypted_password,
91
- email_confirmed_at,
92
- raw_user_meta_data
93
- ) VALUES (
94
- '00000000-0000-0000-0000-000000000002',
95
- 'user@test.local',
96
- crypt('testpassword123', gen_salt('bf')),
97
- NOW(),
98
- '{"full_name": "Test User"}'::JSONB
99
- ) ON CONFLICT (id) DO NOTHING;
100
-
101
- RAISE NOTICE 'Test users seeded successfully';
102
- ELSE
103
- RAISE NOTICE 'Skipping test user seeding - not a dev/test environment';
104
- END IF;
105
- END $$;
106
-
107
- -- =============================================================================
108
- -- SEED: SAMPLE DATA (Development only!)
109
- -- =============================================================================
110
-
111
- -- Example: Sample projects for testing
112
- INSERT INTO :table_name (id, name, description, user_id, status, created_at)
113
- VALUES
114
- ('44444444-4444-4444-4444-444444444001', 'Sample Project 1', 'First sample project for testing', '00000000-0000-0000-0000-000000000001', 'active', NOW()),
115
- ('44444444-4444-4444-4444-444444444002', 'Sample Project 2', 'Second sample project for testing', '00000000-0000-0000-0000-000000000002', 'draft', NOW())
116
- ON CONFLICT (id) DO UPDATE SET
117
- name = EXCLUDED.name,
118
- description = EXCLUDED.description,
119
- updated_at = NOW();
120
-
121
- COMMIT;
122
-
123
- -- =============================================================================
124
- -- RE-ENABLE TRIGGERS
125
- -- =============================================================================
126
-
127
- -- SET session_replication_role = DEFAULT;
128
-
129
- -- =============================================================================
130
- -- VERIFICATION
131
- -- =============================================================================
132
-
133
- SELECT
134
- 'status_types' as table_name,
135
- COUNT(*) as row_count
136
- FROM status_types
137
- UNION ALL
138
- SELECT 'categories', COUNT(*) FROM categories
139
- UNION ALL
140
- SELECT 'roles', COUNT(*) FROM roles;
141
-
1
+ -- Seed Data Template
2
+ -- Purpose: Idempotent seed data for development and testing
3
+ -- Created: :created_date
4
+ -- Author: :author
5
+ --
6
+ -- IMPORTANT: All seed operations should be idempotent (safe to run multiple times)
7
+
8
+ -- =============================================================================
9
+ -- SEED CONFIGURATION
10
+ -- =============================================================================
11
+
12
+ -- Disable triggers during seeding (optional, speeds up bulk insert)
13
+ -- SET session_replication_role = replica;
14
+
15
+ BEGIN;
16
+
17
+ -- =============================================================================
18
+ -- SEED: REFERENCE DATA (Lookup tables, static data)
19
+ -- =============================================================================
20
+
21
+ -- Example: Status types
22
+ INSERT INTO status_types (id, name, description, sort_order)
23
+ VALUES
24
+ ('11111111-1111-1111-1111-111111111001', 'draft', 'Initial draft state', 1),
25
+ ('11111111-1111-1111-1111-111111111002', 'pending', 'Awaiting action', 2),
26
+ ('11111111-1111-1111-1111-111111111003', 'active', 'Currently active', 3),
27
+ ('11111111-1111-1111-1111-111111111004', 'completed', 'Work completed', 4),
28
+ ('11111111-1111-1111-1111-111111111005', 'archived', 'No longer active', 5)
29
+ ON CONFLICT (id) DO UPDATE SET
30
+ name = EXCLUDED.name,
31
+ description = EXCLUDED.description,
32
+ sort_order = EXCLUDED.sort_order;
33
+
34
+ -- Example: Categories
35
+ INSERT INTO categories (id, name, slug, parent_id)
36
+ VALUES
37
+ ('22222222-2222-2222-2222-222222222001', 'General', 'general', NULL),
38
+ ('22222222-2222-2222-2222-222222222002', 'Development', 'development', NULL),
39
+ ('22222222-2222-2222-2222-222222222003', 'Frontend', 'frontend', '22222222-2222-2222-2222-222222222002'),
40
+ ('22222222-2222-2222-2222-222222222004', 'Backend', 'backend', '22222222-2222-2222-2222-222222222002')
41
+ ON CONFLICT (id) DO UPDATE SET
42
+ name = EXCLUDED.name,
43
+ slug = EXCLUDED.slug,
44
+ parent_id = EXCLUDED.parent_id;
45
+
46
+ -- =============================================================================
47
+ -- SEED: ROLES AND PERMISSIONS
48
+ -- =============================================================================
49
+
50
+ INSERT INTO roles (id, name, description, permissions)
51
+ VALUES
52
+ ('33333333-3333-3333-3333-333333333001', 'admin', 'Full system access', '["*"]'::JSONB),
53
+ ('33333333-3333-3333-3333-333333333002', 'editor', 'Can edit content', '["read", "write", "update"]'::JSONB),
54
+ ('33333333-3333-3333-3333-333333333003', 'viewer', 'Read-only access', '["read"]'::JSONB)
55
+ ON CONFLICT (id) DO UPDATE SET
56
+ description = EXCLUDED.description,
57
+ permissions = EXCLUDED.permissions;
58
+
59
+ -- =============================================================================
60
+ -- SEED: TEST USERS (Development only!)
61
+ -- =============================================================================
62
+
63
+ -- NOTE: Only run in development environment
64
+ -- These are fake users for testing - DO NOT use in production
65
+
66
+ -- Check environment before inserting test data
67
+ DO $$
68
+ BEGIN
69
+ -- Only seed test users if this appears to be a dev environment
70
+ IF current_database() LIKE '%dev%' OR current_database() LIKE '%test%' THEN
71
+ -- Test Admin User
72
+ INSERT INTO auth.users (
73
+ id,
74
+ email,
75
+ encrypted_password,
76
+ email_confirmed_at,
77
+ raw_user_meta_data
78
+ ) VALUES (
79
+ '00000000-0000-0000-0000-000000000001',
80
+ 'admin@test.local',
81
+ crypt('testpassword123', gen_salt('bf')),
82
+ NOW(),
83
+ '{"full_name": "Test Admin"}'::JSONB
84
+ ) ON CONFLICT (id) DO NOTHING;
85
+
86
+ -- Test Regular User
87
+ INSERT INTO auth.users (
88
+ id,
89
+ email,
90
+ encrypted_password,
91
+ email_confirmed_at,
92
+ raw_user_meta_data
93
+ ) VALUES (
94
+ '00000000-0000-0000-0000-000000000002',
95
+ 'user@test.local',
96
+ crypt('testpassword123', gen_salt('bf')),
97
+ NOW(),
98
+ '{"full_name": "Test User"}'::JSONB
99
+ ) ON CONFLICT (id) DO NOTHING;
100
+
101
+ RAISE NOTICE 'Test users seeded successfully';
102
+ ELSE
103
+ RAISE NOTICE 'Skipping test user seeding - not a dev/test environment';
104
+ END IF;
105
+ END $$;
106
+
107
+ -- =============================================================================
108
+ -- SEED: SAMPLE DATA (Development only!)
109
+ -- =============================================================================
110
+
111
+ -- Example: Sample projects for testing
112
+ INSERT INTO :table_name (id, name, description, user_id, status, created_at)
113
+ VALUES
114
+ ('44444444-4444-4444-4444-444444444001', 'Sample Project 1', 'First sample project for testing', '00000000-0000-0000-0000-000000000001', 'active', NOW()),
115
+ ('44444444-4444-4444-4444-444444444002', 'Sample Project 2', 'Second sample project for testing', '00000000-0000-0000-0000-000000000002', 'draft', NOW())
116
+ ON CONFLICT (id) DO UPDATE SET
117
+ name = EXCLUDED.name,
118
+ description = EXCLUDED.description,
119
+ updated_at = NOW();
120
+
121
+ COMMIT;
122
+
123
+ -- =============================================================================
124
+ -- RE-ENABLE TRIGGERS
125
+ -- =============================================================================
126
+
127
+ -- SET session_replication_role = DEFAULT;
128
+
129
+ -- =============================================================================
130
+ -- VERIFICATION
131
+ -- =============================================================================
132
+
133
+ SELECT
134
+ 'status_types' as table_name,
135
+ COUNT(*) as row_count
136
+ FROM status_types
137
+ UNION ALL
138
+ SELECT 'categories', COUNT(*) FROM categories
139
+ UNION ALL
140
+ SELECT 'roles', COUNT(*) FROM roles;
141
+
@@ -1,17 +1,17 @@
1
- -- Basic post-migration checks (fill placeholders)
2
- SET client_min_messages = warning;
3
-
4
- -- Count tables/policies/functions expected
5
- SELECT COUNT(*) AS tables FROM information_schema.tables WHERE table_schema='public';
6
- SELECT COUNT(*) AS policies FROM pg_policies WHERE schemaname='public';
7
- SELECT proname FROM pg_proc WHERE pronamespace = 'public'::regnamespace
8
- AND proname IN ('current_mind_id','provision_user_profile','set_fragment_mind_id');
9
-
10
- -- Sanity queries (examples)
11
- -- SELECT * FROM categories LIMIT 5;
12
- -- SELECT * FROM minds LIMIT 5;
13
-
14
- -- RLS sanity (should not error even if it returns 0)
15
- -- SET LOCAL request.jwt.claims = '{"sub":"<user-uuid>","role":"authenticated"}';
16
- -- SELECT 1 FROM fragments WHERE false;
17
-
1
+ -- Basic post-migration checks (fill placeholders)
2
+ SET client_min_messages = warning;
3
+
4
+ -- Count tables/policies/functions expected
5
+ SELECT COUNT(*) AS tables FROM information_schema.tables WHERE table_schema='public';
6
+ SELECT COUNT(*) AS policies FROM pg_policies WHERE schemaname='public';
7
+ SELECT proname FROM pg_proc WHERE pronamespace = 'public'::regnamespace
8
+ AND proname IN ('current_mind_id','provision_user_profile','set_fragment_mind_id');
9
+
10
+ -- Sanity queries (examples)
11
+ -- SELECT * FROM categories LIMIT 5;
12
+ -- SELECT * FROM minds LIMIT 5;
13
+
14
+ -- RLS sanity (should not error even if it returns 0)
15
+ -- SET LOCAL request.jwt.claims = '{"sub":"<user-uuid>","role":"authenticated"}';
16
+ -- SELECT 1 FROM fragments WHERE false;
17
+
@@ -1,140 +1,140 @@
1
- -- Staging Copy Merge Template
2
- -- Purpose: Safely load external data through staging table and merge to target
3
- -- Created: :created_date
4
- -- Author: :author
5
- --
6
- -- This pattern prevents data corruption by validating in staging before merge
7
-
8
- -- =============================================================================
9
- -- STEP 1: CREATE STAGING TABLE (temporary)
10
- -- =============================================================================
11
-
12
- -- Create staging table mirroring target structure
13
- CREATE TEMP TABLE IF NOT EXISTS :staging_table (
14
- -- Match target table columns
15
- id UUID,
16
- :column1 :type1,
17
- :column2 :type2,
18
- -- Metadata for import tracking
19
- _row_number INTEGER,
20
- _import_status TEXT DEFAULT 'pending',
21
- _import_error TEXT
22
- );
23
-
24
- -- =============================================================================
25
- -- STEP 2: COPY DATA TO STAGING
26
- -- =============================================================================
27
-
28
- -- Option A: From CSV file
29
- -- COPY :staging_table (id, :column1, :column2)
30
- -- FROM '/path/to/file.csv'
31
- -- WITH (FORMAT csv, HEADER true);
32
-
33
- -- Option B: From STDIN (programmatic)
34
- -- COPY :staging_table (id, :column1, :column2) FROM STDIN;
35
-
36
- -- Option C: Insert from another query
37
- -- INSERT INTO :staging_table (id, :column1, :column2)
38
- -- SELECT id, col1, col2 FROM external_source;
39
-
40
- -- =============================================================================
41
- -- STEP 3: VALIDATE STAGING DATA
42
- -- =============================================================================
43
-
44
- -- Mark rows with validation errors
45
- UPDATE :staging_table
46
- SET
47
- _import_status = 'error',
48
- _import_error = 'Missing required field'
49
- WHERE :column1 IS NULL;
50
-
51
- -- Check for duplicates
52
- UPDATE :staging_table s
53
- SET
54
- _import_status = 'duplicate',
55
- _import_error = 'Duplicate ID found'
56
- WHERE EXISTS (
57
- SELECT 1 FROM :staging_table s2
58
- WHERE s2.id = s.id
59
- AND s2._row_number < s._row_number
60
- );
61
-
62
- -- Check for existing records (will update instead of insert)
63
- UPDATE :staging_table s
64
- SET _import_status = 'update'
65
- WHERE EXISTS (
66
- SELECT 1 FROM :target_table t
67
- WHERE t.id = s.id
68
- )
69
- AND s._import_status = 'pending';
70
-
71
- -- Mark remaining as new inserts
72
- UPDATE :staging_table
73
- SET _import_status = 'insert'
74
- WHERE _import_status = 'pending';
75
-
76
- -- =============================================================================
77
- -- STEP 4: REPORT VALIDATION RESULTS
78
- -- =============================================================================
79
-
80
- -- Get summary of staging data
81
- SELECT
82
- _import_status,
83
- COUNT(*) as count,
84
- STRING_AGG(DISTINCT _import_error, ', ') as errors
85
- FROM :staging_table
86
- GROUP BY _import_status
87
- ORDER BY _import_status;
88
-
89
- -- =============================================================================
90
- -- STEP 5: MERGE TO TARGET (UPSERT)
91
- -- =============================================================================
92
-
93
- BEGIN;
94
-
95
- -- Insert new records
96
- INSERT INTO :target_table (id, :column1, :column2, created_at)
97
- SELECT id, :column1, :column2, NOW()
98
- FROM :staging_table
99
- WHERE _import_status = 'insert';
100
-
101
- -- Update existing records
102
- UPDATE :target_table t
103
- SET
104
- :column1 = s.:column1,
105
- :column2 = s.:column2,
106
- updated_at = NOW()
107
- FROM :staging_table s
108
- WHERE t.id = s.id
109
- AND s._import_status = 'update';
110
-
111
- COMMIT;
112
-
113
- -- =============================================================================
114
- -- STEP 6: VERIFY AND CLEANUP
115
- -- =============================================================================
116
-
117
- -- Verify merge results
118
- SELECT
119
- 'inserted' as operation,
120
- COUNT(*) as count
121
- FROM :staging_table WHERE _import_status = 'insert'
122
- UNION ALL
123
- SELECT
124
- 'updated' as operation,
125
- COUNT(*) as count
126
- FROM :staging_table WHERE _import_status = 'update'
127
- UNION ALL
128
- SELECT
129
- 'errors' as operation,
130
- COUNT(*) as count
131
- FROM :staging_table WHERE _import_status = 'error';
132
-
133
- -- Get error details for review
134
- SELECT id, :column1, _import_error
135
- FROM :staging_table
136
- WHERE _import_status = 'error';
137
-
138
- -- Drop staging table (automatic for TEMP, but explicit is clearer)
139
- DROP TABLE IF EXISTS :staging_table;
140
-
1
+ -- Staging Copy Merge Template
2
+ -- Purpose: Safely load external data through staging table and merge to target
3
+ -- Created: :created_date
4
+ -- Author: :author
5
+ --
6
+ -- This pattern prevents data corruption by validating in staging before merge
7
+
8
+ -- =============================================================================
9
+ -- STEP 1: CREATE STAGING TABLE (temporary)
10
+ -- =============================================================================
11
+
12
+ -- Create staging table mirroring target structure
13
+ CREATE TEMP TABLE IF NOT EXISTS :staging_table (
14
+ -- Match target table columns
15
+ id UUID,
16
+ :column1 :type1,
17
+ :column2 :type2,
18
+ -- Metadata for import tracking
19
+ _row_number INTEGER,
20
+ _import_status TEXT DEFAULT 'pending',
21
+ _import_error TEXT
22
+ );
23
+
24
+ -- =============================================================================
25
+ -- STEP 2: COPY DATA TO STAGING
26
+ -- =============================================================================
27
+
28
+ -- Option A: From CSV file
29
+ -- COPY :staging_table (id, :column1, :column2)
30
+ -- FROM '/path/to/file.csv'
31
+ -- WITH (FORMAT csv, HEADER true);
32
+
33
+ -- Option B: From STDIN (programmatic)
34
+ -- COPY :staging_table (id, :column1, :column2) FROM STDIN;
35
+
36
+ -- Option C: Insert from another query
37
+ -- INSERT INTO :staging_table (id, :column1, :column2)
38
+ -- SELECT id, col1, col2 FROM external_source;
39
+
40
+ -- =============================================================================
41
+ -- STEP 3: VALIDATE STAGING DATA
42
+ -- =============================================================================
43
+
44
+ -- Mark rows with validation errors
45
+ UPDATE :staging_table
46
+ SET
47
+ _import_status = 'error',
48
+ _import_error = 'Missing required field'
49
+ WHERE :column1 IS NULL;
50
+
51
+ -- Check for duplicates
52
+ UPDATE :staging_table s
53
+ SET
54
+ _import_status = 'duplicate',
55
+ _import_error = 'Duplicate ID found'
56
+ WHERE EXISTS (
57
+ SELECT 1 FROM :staging_table s2
58
+ WHERE s2.id = s.id
59
+ AND s2._row_number < s._row_number
60
+ );
61
+
62
+ -- Check for existing records (will update instead of insert)
63
+ UPDATE :staging_table s
64
+ SET _import_status = 'update'
65
+ WHERE EXISTS (
66
+ SELECT 1 FROM :target_table t
67
+ WHERE t.id = s.id
68
+ )
69
+ AND s._import_status = 'pending';
70
+
71
+ -- Mark remaining as new inserts
72
+ UPDATE :staging_table
73
+ SET _import_status = 'insert'
74
+ WHERE _import_status = 'pending';
75
+
76
+ -- =============================================================================
77
+ -- STEP 4: REPORT VALIDATION RESULTS
78
+ -- =============================================================================
79
+
80
+ -- Get summary of staging data
81
+ SELECT
82
+ _import_status,
83
+ COUNT(*) as count,
84
+ STRING_AGG(DISTINCT _import_error, ', ') as errors
85
+ FROM :staging_table
86
+ GROUP BY _import_status
87
+ ORDER BY _import_status;
88
+
89
+ -- =============================================================================
90
+ -- STEP 5: MERGE TO TARGET (UPSERT)
91
+ -- =============================================================================
92
+
93
+ BEGIN;
94
+
95
+ -- Insert new records
96
+ INSERT INTO :target_table (id, :column1, :column2, created_at)
97
+ SELECT id, :column1, :column2, NOW()
98
+ FROM :staging_table
99
+ WHERE _import_status = 'insert';
100
+
101
+ -- Update existing records
102
+ UPDATE :target_table t
103
+ SET
104
+ :column1 = s.:column1,
105
+ :column2 = s.:column2,
106
+ updated_at = NOW()
107
+ FROM :staging_table s
108
+ WHERE t.id = s.id
109
+ AND s._import_status = 'update';
110
+
111
+ COMMIT;
112
+
113
+ -- =============================================================================
114
+ -- STEP 6: VERIFY AND CLEANUP
115
+ -- =============================================================================
116
+
117
+ -- Verify merge results
118
+ SELECT
119
+ 'inserted' as operation,
120
+ COUNT(*) as count
121
+ FROM :staging_table WHERE _import_status = 'insert'
122
+ UNION ALL
123
+ SELECT
124
+ 'updated' as operation,
125
+ COUNT(*) as count
126
+ FROM :staging_table WHERE _import_status = 'update'
127
+ UNION ALL
128
+ SELECT
129
+ 'errors' as operation,
130
+ COUNT(*) as count
131
+ FROM :staging_table WHERE _import_status = 'error';
132
+
133
+ -- Get error details for review
134
+ SELECT id, :column1, _import_error
135
+ FROM :staging_table
136
+ WHERE _import_status = 'error';
137
+
138
+ -- Drop staging table (automatic for TEMP, but explicit is clearer)
139
+ DROP TABLE IF EXISTS :staging_table;
140
+