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
- -- Stored Procedure Template
2
- -- Function: :function_name
3
- -- Created: :created_date
4
- -- Author: :author
5
- -- Description: :description
6
- --
7
- -- IMPORTANT: Consider security implications of SECURITY DEFINER vs SECURITY INVOKER
8
-
9
- -- =============================================================================
10
- -- BASIC FUNCTION TEMPLATE
11
- -- =============================================================================
12
-
13
- CREATE OR REPLACE FUNCTION :function_name(
14
- -- Input parameters
15
- p_param1 :param1_type,
16
- p_param2 :param2_type DEFAULT NULL
17
- )
18
- RETURNS :return_type
19
- LANGUAGE plpgsql
20
- -- SECURITY DEFINER: Runs with function owner's privileges (use carefully)
21
- -- SECURITY INVOKER: Runs with caller's privileges (default, safer)
22
- SECURITY INVOKER
23
- -- STABLE: Doesn't modify database, same result for same inputs within transaction
24
- -- VOLATILE: May modify database or return different results (default)
25
- -- IMMUTABLE: Always returns same result for same inputs (for indexing)
26
- STABLE
27
- AS $$
28
- DECLARE
29
- v_result :return_type;
30
- v_variable :variable_type;
31
- BEGIN
32
- -- Input validation
33
- IF p_param1 IS NULL THEN
34
- RAISE EXCEPTION 'p_param1 cannot be null';
35
- END IF;
36
-
37
- -- Main logic
38
- SELECT column_name
39
- INTO v_result
40
- FROM :table_name
41
- WHERE id = p_param1;
42
-
43
- -- Return result
44
- RETURN v_result;
45
-
46
- EXCEPTION
47
- WHEN no_data_found THEN
48
- RAISE EXCEPTION 'No data found for id: %', p_param1;
49
- WHEN OTHERS THEN
50
- RAISE EXCEPTION 'Error in :function_name: %', SQLERRM;
51
- END;
52
- $$;
53
-
54
- -- Grant execute permission
55
- GRANT EXECUTE ON FUNCTION :function_name(:param1_type, :param2_type) TO authenticated;
56
-
57
- -- Add function comment
58
- COMMENT ON FUNCTION :function_name IS ':description';
59
-
60
- -- =============================================================================
61
- -- FUNCTION RETURNING TABLE (for complex queries)
62
- -- =============================================================================
63
-
64
- CREATE OR REPLACE FUNCTION :function_name_table(
65
- p_filter_param :filter_type DEFAULT NULL
66
- )
67
- RETURNS TABLE (
68
- id UUID,
69
- name TEXT,
70
- created_at TIMESTAMPTZ
71
- )
72
- LANGUAGE plpgsql
73
- SECURITY INVOKER
74
- STABLE
75
- AS $$
76
- BEGIN
77
- RETURN QUERY
78
- SELECT
79
- t.id,
80
- t.name,
81
- t.created_at
82
- FROM :table_name t
83
- WHERE
84
- (p_filter_param IS NULL OR t.filter_column = p_filter_param)
85
- AND t.user_id = auth.uid() -- RLS-aware
86
- ORDER BY t.created_at DESC;
87
- END;
88
- $$;
89
-
90
- -- =============================================================================
91
- -- FUNCTION WITH TRANSACTION (for mutations)
92
- -- =============================================================================
93
-
94
- CREATE OR REPLACE FUNCTION :function_name_mutation(
95
- p_input_data JSONB
96
- )
97
- RETURNS UUID
98
- LANGUAGE plpgsql
99
- SECURITY INVOKER
100
- VOLATILE
101
- AS $$
102
- DECLARE
103
- v_new_id UUID;
104
- BEGIN
105
- -- Validate input
106
- IF NOT (p_input_data ? 'required_field') THEN
107
- RAISE EXCEPTION 'required_field is missing from input';
108
- END IF;
109
-
110
- -- Insert new record
111
- INSERT INTO :table_name (
112
- name,
113
- data,
114
- user_id,
115
- created_at
116
- ) VALUES (
117
- p_input_data->>'name',
118
- p_input_data->'data',
119
- auth.uid(),
120
- NOW()
121
- )
122
- RETURNING id INTO v_new_id;
123
-
124
- -- Audit log (optional)
125
- INSERT INTO audit_log (action, table_name, record_id, user_id)
126
- VALUES ('INSERT', ':table_name', v_new_id, auth.uid());
127
-
128
- RETURN v_new_id;
129
- END;
130
- $$;
131
-
132
- -- =============================================================================
133
- -- RPC ENDPOINT (Supabase-style)
134
- -- =============================================================================
135
- -- Call from client: supabase.rpc(':function_name', { p_param1: value })
136
- --
137
- -- For Supabase, ensure:
138
- -- 1. Function is in public schema
139
- -- 2. GRANT EXECUTE to appropriate roles
140
- -- 3. Consider using SECURITY DEFINER for bypassing RLS when needed
141
-
1
+ -- Stored Procedure Template
2
+ -- Function: :function_name
3
+ -- Created: :created_date
4
+ -- Author: :author
5
+ -- Description: :description
6
+ --
7
+ -- IMPORTANT: Consider security implications of SECURITY DEFINER vs SECURITY INVOKER
8
+
9
+ -- =============================================================================
10
+ -- BASIC FUNCTION TEMPLATE
11
+ -- =============================================================================
12
+
13
+ CREATE OR REPLACE FUNCTION :function_name(
14
+ -- Input parameters
15
+ p_param1 :param1_type,
16
+ p_param2 :param2_type DEFAULT NULL
17
+ )
18
+ RETURNS :return_type
19
+ LANGUAGE plpgsql
20
+ -- SECURITY DEFINER: Runs with function owner's privileges (use carefully)
21
+ -- SECURITY INVOKER: Runs with caller's privileges (default, safer)
22
+ SECURITY INVOKER
23
+ -- STABLE: Doesn't modify database, same result for same inputs within transaction
24
+ -- VOLATILE: May modify database or return different results (default)
25
+ -- IMMUTABLE: Always returns same result for same inputs (for indexing)
26
+ STABLE
27
+ AS $$
28
+ DECLARE
29
+ v_result :return_type;
30
+ v_variable :variable_type;
31
+ BEGIN
32
+ -- Input validation
33
+ IF p_param1 IS NULL THEN
34
+ RAISE EXCEPTION 'p_param1 cannot be null';
35
+ END IF;
36
+
37
+ -- Main logic
38
+ SELECT column_name
39
+ INTO v_result
40
+ FROM :table_name
41
+ WHERE id = p_param1;
42
+
43
+ -- Return result
44
+ RETURN v_result;
45
+
46
+ EXCEPTION
47
+ WHEN no_data_found THEN
48
+ RAISE EXCEPTION 'No data found for id: %', p_param1;
49
+ WHEN OTHERS THEN
50
+ RAISE EXCEPTION 'Error in :function_name: %', SQLERRM;
51
+ END;
52
+ $$;
53
+
54
+ -- Grant execute permission
55
+ GRANT EXECUTE ON FUNCTION :function_name(:param1_type, :param2_type) TO authenticated;
56
+
57
+ -- Add function comment
58
+ COMMENT ON FUNCTION :function_name IS ':description';
59
+
60
+ -- =============================================================================
61
+ -- FUNCTION RETURNING TABLE (for complex queries)
62
+ -- =============================================================================
63
+
64
+ CREATE OR REPLACE FUNCTION :function_name_table(
65
+ p_filter_param :filter_type DEFAULT NULL
66
+ )
67
+ RETURNS TABLE (
68
+ id UUID,
69
+ name TEXT,
70
+ created_at TIMESTAMPTZ
71
+ )
72
+ LANGUAGE plpgsql
73
+ SECURITY INVOKER
74
+ STABLE
75
+ AS $$
76
+ BEGIN
77
+ RETURN QUERY
78
+ SELECT
79
+ t.id,
80
+ t.name,
81
+ t.created_at
82
+ FROM :table_name t
83
+ WHERE
84
+ (p_filter_param IS NULL OR t.filter_column = p_filter_param)
85
+ AND t.user_id = auth.uid() -- RLS-aware
86
+ ORDER BY t.created_at DESC;
87
+ END;
88
+ $$;
89
+
90
+ -- =============================================================================
91
+ -- FUNCTION WITH TRANSACTION (for mutations)
92
+ -- =============================================================================
93
+
94
+ CREATE OR REPLACE FUNCTION :function_name_mutation(
95
+ p_input_data JSONB
96
+ )
97
+ RETURNS UUID
98
+ LANGUAGE plpgsql
99
+ SECURITY INVOKER
100
+ VOLATILE
101
+ AS $$
102
+ DECLARE
103
+ v_new_id UUID;
104
+ BEGIN
105
+ -- Validate input
106
+ IF NOT (p_input_data ? 'required_field') THEN
107
+ RAISE EXCEPTION 'required_field is missing from input';
108
+ END IF;
109
+
110
+ -- Insert new record
111
+ INSERT INTO :table_name (
112
+ name,
113
+ data,
114
+ user_id,
115
+ created_at
116
+ ) VALUES (
117
+ p_input_data->>'name',
118
+ p_input_data->'data',
119
+ auth.uid(),
120
+ NOW()
121
+ )
122
+ RETURNING id INTO v_new_id;
123
+
124
+ -- Audit log (optional)
125
+ INSERT INTO audit_log (action, table_name, record_id, user_id)
126
+ VALUES ('INSERT', ':table_name', v_new_id, auth.uid());
127
+
128
+ RETURN v_new_id;
129
+ END;
130
+ $$;
131
+
132
+ -- =============================================================================
133
+ -- RPC ENDPOINT (Supabase-style)
134
+ -- =============================================================================
135
+ -- Call from client: supabase.rpc(':function_name', { p_param1: value })
136
+ --
137
+ -- For Supabase, ensure:
138
+ -- 1. Function is in public schema
139
+ -- 2. GRANT EXECUTE to appropriate roles
140
+ -- 3. Consider using SECURITY DEFINER for bypassing RLS when needed
141
+
@@ -1,153 +1,153 @@
1
- -- Trigger Template
2
- -- Table: :table_name
3
- -- Created: :created_date
4
- -- Author: :author
5
- -- Description: :description
6
- --
7
- -- IMPORTANT: Triggers run automatically - test thoroughly before deployment
8
-
9
- -- =============================================================================
10
- -- UPDATED_AT TRIGGER (Most Common)
11
- -- =============================================================================
12
-
13
- -- Trigger function: Updates updated_at column on row modification
14
- CREATE OR REPLACE FUNCTION update_updated_at_column()
15
- RETURNS TRIGGER AS $$
16
- BEGIN
17
- NEW.updated_at = NOW();
18
- RETURN NEW;
19
- END;
20
- $$ LANGUAGE plpgsql;
21
-
22
- -- Apply to table
23
- DROP TRIGGER IF EXISTS trigger_:table_name_updated_at ON :table_name;
24
- CREATE TRIGGER trigger_:table_name_updated_at
25
- BEFORE UPDATE ON :table_name
26
- FOR EACH ROW
27
- EXECUTE FUNCTION update_updated_at_column();
28
-
29
- -- =============================================================================
30
- -- AUDIT LOG TRIGGER
31
- -- =============================================================================
32
-
33
- -- Audit log table (if not exists)
34
- CREATE TABLE IF NOT EXISTS audit_log (
35
- id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
36
- table_name TEXT NOT NULL,
37
- record_id UUID NOT NULL,
38
- action TEXT NOT NULL CHECK (action IN ('INSERT', 'UPDATE', 'DELETE')),
39
- old_data JSONB,
40
- new_data JSONB,
41
- changed_by UUID REFERENCES auth.users(id),
42
- changed_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
43
- );
44
-
45
- CREATE INDEX IF NOT EXISTS idx_audit_log_table_record ON audit_log(table_name, record_id);
46
- CREATE INDEX IF NOT EXISTS idx_audit_log_changed_at ON audit_log(changed_at);
47
-
48
- -- Audit trigger function
49
- CREATE OR REPLACE FUNCTION audit_trigger_function()
50
- RETURNS TRIGGER AS $$
51
- BEGIN
52
- IF TG_OP = 'INSERT' THEN
53
- INSERT INTO audit_log (table_name, record_id, action, new_data, changed_by)
54
- VALUES (TG_TABLE_NAME, NEW.id, 'INSERT', to_jsonb(NEW), auth.uid());
55
- RETURN NEW;
56
- ELSIF TG_OP = 'UPDATE' THEN
57
- INSERT INTO audit_log (table_name, record_id, action, old_data, new_data, changed_by)
58
- VALUES (TG_TABLE_NAME, NEW.id, 'UPDATE', to_jsonb(OLD), to_jsonb(NEW), auth.uid());
59
- RETURN NEW;
60
- ELSIF TG_OP = 'DELETE' THEN
61
- INSERT INTO audit_log (table_name, record_id, action, old_data, changed_by)
62
- VALUES (TG_TABLE_NAME, OLD.id, 'DELETE', to_jsonb(OLD), auth.uid());
63
- RETURN OLD;
64
- END IF;
65
- RETURN NULL;
66
- END;
67
- $$ LANGUAGE plpgsql SECURITY DEFINER;
68
-
69
- -- Apply audit trigger to table
70
- DROP TRIGGER IF EXISTS trigger_:table_name_audit ON :table_name;
71
- CREATE TRIGGER trigger_:table_name_audit
72
- AFTER INSERT OR UPDATE OR DELETE ON :table_name
73
- FOR EACH ROW
74
- EXECUTE FUNCTION audit_trigger_function();
75
-
76
- -- =============================================================================
77
- -- VALIDATION TRIGGER
78
- -- =============================================================================
79
-
80
- -- Custom validation trigger function
81
- CREATE OR REPLACE FUNCTION :table_name_validation_trigger()
82
- RETURNS TRIGGER AS $$
83
- BEGIN
84
- -- Example: Validate email format
85
- IF NEW.email IS NOT NULL AND NEW.email !~ '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$' THEN
86
- RAISE EXCEPTION 'Invalid email format: %', NEW.email;
87
- END IF;
88
-
89
- -- Example: Validate status transitions
90
- IF TG_OP = 'UPDATE' AND OLD.status = 'completed' AND NEW.status != 'completed' THEN
91
- RAISE EXCEPTION 'Cannot change status from completed';
92
- END IF;
93
-
94
- -- Example: Auto-set values
95
- IF TG_OP = 'INSERT' THEN
96
- NEW.created_by = COALESCE(NEW.created_by, auth.uid());
97
- END IF;
98
-
99
- RETURN NEW;
100
- END;
101
- $$ LANGUAGE plpgsql;
102
-
103
- DROP TRIGGER IF EXISTS trigger_:table_name_validation ON :table_name;
104
- CREATE TRIGGER trigger_:table_name_validation
105
- BEFORE INSERT OR UPDATE ON :table_name
106
- FOR EACH ROW
107
- EXECUTE FUNCTION :table_name_validation_trigger();
108
-
109
- -- =============================================================================
110
- -- SOFT DELETE TRIGGER
111
- -- =============================================================================
112
-
113
- -- Instead of deleting, set deleted_at timestamp
114
- CREATE OR REPLACE FUNCTION soft_delete_trigger()
115
- RETURNS TRIGGER AS $$
116
- BEGIN
117
- -- Instead of DELETE, UPDATE with deleted_at
118
- UPDATE :table_name
119
- SET deleted_at = NOW()
120
- WHERE id = OLD.id;
121
-
122
- -- Return NULL to cancel the actual DELETE
123
- RETURN NULL;
124
- END;
125
- $$ LANGUAGE plpgsql;
126
-
127
- DROP TRIGGER IF EXISTS trigger_:table_name_soft_delete ON :table_name;
128
- CREATE TRIGGER trigger_:table_name_soft_delete
129
- BEFORE DELETE ON :table_name
130
- FOR EACH ROW
131
- EXECUTE FUNCTION soft_delete_trigger();
132
-
133
- -- =============================================================================
134
- -- NOTIFICATION TRIGGER (for Supabase Realtime)
135
- -- =============================================================================
136
-
137
- -- Notify on changes (Supabase handles this automatically for enabled tables)
138
- -- Manual implementation if needed:
139
-
140
- CREATE OR REPLACE FUNCTION notify_changes()
141
- RETURNS TRIGGER AS $$
142
- BEGIN
143
- PERFORM pg_notify(
144
- TG_TABLE_NAME || '_changes',
145
- json_build_object(
146
- 'operation', TG_OP,
147
- 'record', CASE WHEN TG_OP = 'DELETE' THEN to_jsonb(OLD) ELSE to_jsonb(NEW) END
148
- )::TEXT
149
- );
150
- RETURN COALESCE(NEW, OLD);
151
- END;
152
- $$ LANGUAGE plpgsql;
153
-
1
+ -- Trigger Template
2
+ -- Table: :table_name
3
+ -- Created: :created_date
4
+ -- Author: :author
5
+ -- Description: :description
6
+ --
7
+ -- IMPORTANT: Triggers run automatically - test thoroughly before deployment
8
+
9
+ -- =============================================================================
10
+ -- UPDATED_AT TRIGGER (Most Common)
11
+ -- =============================================================================
12
+
13
+ -- Trigger function: Updates updated_at column on row modification
14
+ CREATE OR REPLACE FUNCTION update_updated_at_column()
15
+ RETURNS TRIGGER AS $$
16
+ BEGIN
17
+ NEW.updated_at = NOW();
18
+ RETURN NEW;
19
+ END;
20
+ $$ LANGUAGE plpgsql;
21
+
22
+ -- Apply to table
23
+ DROP TRIGGER IF EXISTS trigger_:table_name_updated_at ON :table_name;
24
+ CREATE TRIGGER trigger_:table_name_updated_at
25
+ BEFORE UPDATE ON :table_name
26
+ FOR EACH ROW
27
+ EXECUTE FUNCTION update_updated_at_column();
28
+
29
+ -- =============================================================================
30
+ -- AUDIT LOG TRIGGER
31
+ -- =============================================================================
32
+
33
+ -- Audit log table (if not exists)
34
+ CREATE TABLE IF NOT EXISTS audit_log (
35
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
36
+ table_name TEXT NOT NULL,
37
+ record_id UUID NOT NULL,
38
+ action TEXT NOT NULL CHECK (action IN ('INSERT', 'UPDATE', 'DELETE')),
39
+ old_data JSONB,
40
+ new_data JSONB,
41
+ changed_by UUID REFERENCES auth.users(id),
42
+ changed_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
43
+ );
44
+
45
+ CREATE INDEX IF NOT EXISTS idx_audit_log_table_record ON audit_log(table_name, record_id);
46
+ CREATE INDEX IF NOT EXISTS idx_audit_log_changed_at ON audit_log(changed_at);
47
+
48
+ -- Audit trigger function
49
+ CREATE OR REPLACE FUNCTION audit_trigger_function()
50
+ RETURNS TRIGGER AS $$
51
+ BEGIN
52
+ IF TG_OP = 'INSERT' THEN
53
+ INSERT INTO audit_log (table_name, record_id, action, new_data, changed_by)
54
+ VALUES (TG_TABLE_NAME, NEW.id, 'INSERT', to_jsonb(NEW), auth.uid());
55
+ RETURN NEW;
56
+ ELSIF TG_OP = 'UPDATE' THEN
57
+ INSERT INTO audit_log (table_name, record_id, action, old_data, new_data, changed_by)
58
+ VALUES (TG_TABLE_NAME, NEW.id, 'UPDATE', to_jsonb(OLD), to_jsonb(NEW), auth.uid());
59
+ RETURN NEW;
60
+ ELSIF TG_OP = 'DELETE' THEN
61
+ INSERT INTO audit_log (table_name, record_id, action, old_data, changed_by)
62
+ VALUES (TG_TABLE_NAME, OLD.id, 'DELETE', to_jsonb(OLD), auth.uid());
63
+ RETURN OLD;
64
+ END IF;
65
+ RETURN NULL;
66
+ END;
67
+ $$ LANGUAGE plpgsql SECURITY DEFINER;
68
+
69
+ -- Apply audit trigger to table
70
+ DROP TRIGGER IF EXISTS trigger_:table_name_audit ON :table_name;
71
+ CREATE TRIGGER trigger_:table_name_audit
72
+ AFTER INSERT OR UPDATE OR DELETE ON :table_name
73
+ FOR EACH ROW
74
+ EXECUTE FUNCTION audit_trigger_function();
75
+
76
+ -- =============================================================================
77
+ -- VALIDATION TRIGGER
78
+ -- =============================================================================
79
+
80
+ -- Custom validation trigger function
81
+ CREATE OR REPLACE FUNCTION :table_name_validation_trigger()
82
+ RETURNS TRIGGER AS $$
83
+ BEGIN
84
+ -- Example: Validate email format
85
+ IF NEW.email IS NOT NULL AND NEW.email !~ '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$' THEN
86
+ RAISE EXCEPTION 'Invalid email format: %', NEW.email;
87
+ END IF;
88
+
89
+ -- Example: Validate status transitions
90
+ IF TG_OP = 'UPDATE' AND OLD.status = 'completed' AND NEW.status != 'completed' THEN
91
+ RAISE EXCEPTION 'Cannot change status from completed';
92
+ END IF;
93
+
94
+ -- Example: Auto-set values
95
+ IF TG_OP = 'INSERT' THEN
96
+ NEW.created_by = COALESCE(NEW.created_by, auth.uid());
97
+ END IF;
98
+
99
+ RETURN NEW;
100
+ END;
101
+ $$ LANGUAGE plpgsql;
102
+
103
+ DROP TRIGGER IF EXISTS trigger_:table_name_validation ON :table_name;
104
+ CREATE TRIGGER trigger_:table_name_validation
105
+ BEFORE INSERT OR UPDATE ON :table_name
106
+ FOR EACH ROW
107
+ EXECUTE FUNCTION :table_name_validation_trigger();
108
+
109
+ -- =============================================================================
110
+ -- SOFT DELETE TRIGGER
111
+ -- =============================================================================
112
+
113
+ -- Instead of deleting, set deleted_at timestamp
114
+ CREATE OR REPLACE FUNCTION soft_delete_trigger()
115
+ RETURNS TRIGGER AS $$
116
+ BEGIN
117
+ -- Instead of DELETE, UPDATE with deleted_at
118
+ UPDATE :table_name
119
+ SET deleted_at = NOW()
120
+ WHERE id = OLD.id;
121
+
122
+ -- Return NULL to cancel the actual DELETE
123
+ RETURN NULL;
124
+ END;
125
+ $$ LANGUAGE plpgsql;
126
+
127
+ DROP TRIGGER IF EXISTS trigger_:table_name_soft_delete ON :table_name;
128
+ CREATE TRIGGER trigger_:table_name_soft_delete
129
+ BEFORE DELETE ON :table_name
130
+ FOR EACH ROW
131
+ EXECUTE FUNCTION soft_delete_trigger();
132
+
133
+ -- =============================================================================
134
+ -- NOTIFICATION TRIGGER (for Supabase Realtime)
135
+ -- =============================================================================
136
+
137
+ -- Notify on changes (Supabase handles this automatically for enabled tables)
138
+ -- Manual implementation if needed:
139
+
140
+ CREATE OR REPLACE FUNCTION notify_changes()
141
+ RETURNS TRIGGER AS $$
142
+ BEGIN
143
+ PERFORM pg_notify(
144
+ TG_TABLE_NAME || '_changes',
145
+ json_build_object(
146
+ 'operation', TG_OP,
147
+ 'record', CASE WHEN TG_OP = 'DELETE' THEN to_jsonb(OLD) ELSE to_jsonb(NEW) END
148
+ )::TEXT
149
+ );
150
+ RETURN COALESCE(NEW, OLD);
151
+ END;
152
+ $$ LANGUAGE plpgsql;
153
+