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,134 +1,134 @@
1
- -- Materialized View Template
2
- -- View: :view_name
3
- -- Created: :created_date
4
- -- Author: :author
5
- -- Description: :description
6
- --
7
- -- Materialized views cache query results for performance
8
- -- IMPORTANT: Data is not live - must be refreshed periodically
9
-
10
- -- =============================================================================
11
- -- BASIC MATERIALIZED VIEW
12
- -- =============================================================================
13
-
14
- -- Drop existing view if exists
15
- DROP MATERIALIZED VIEW IF EXISTS :view_name CASCADE;
16
-
17
- -- Create materialized view
18
- CREATE MATERIALIZED VIEW :view_name AS
19
- SELECT
20
- t.id,
21
- t.name,
22
- t.category,
23
- t.created_at,
24
- -- Aggregations
25
- COUNT(r.id) AS related_count,
26
- SUM(r.amount) AS total_amount,
27
- AVG(r.rating) AS avg_rating,
28
- -- Computed columns
29
- CASE
30
- WHEN t.status = 'active' THEN true
31
- ELSE false
32
- END AS is_active
33
- FROM :base_table t
34
- LEFT JOIN :related_table r ON r.parent_id = t.id
35
- WHERE t.deleted_at IS NULL
36
- GROUP BY t.id, t.name, t.category, t.created_at, t.status
37
- -- Store data sorted for efficient access
38
- WITH DATA;
39
-
40
- -- =============================================================================
41
- -- INDEXES ON MATERIALIZED VIEW
42
- -- =============================================================================
43
-
44
- -- Unique index (required for CONCURRENT refresh)
45
- CREATE UNIQUE INDEX IF NOT EXISTS idx_:view_name_id
46
- ON :view_name (id);
47
-
48
- -- Additional indexes for common queries
49
- CREATE INDEX IF NOT EXISTS idx_:view_name_category
50
- ON :view_name (category);
51
-
52
- CREATE INDEX IF NOT EXISTS idx_:view_name_created_at
53
- ON :view_name (created_at DESC);
54
-
55
- -- =============================================================================
56
- -- REFRESH FUNCTION
57
- -- =============================================================================
58
-
59
- -- Function to refresh the materialized view
60
- CREATE OR REPLACE FUNCTION refresh_:view_name()
61
- RETURNS void
62
- LANGUAGE plpgsql
63
- SECURITY DEFINER
64
- AS $$
65
- BEGIN
66
- -- CONCURRENTLY allows queries during refresh (requires unique index)
67
- REFRESH MATERIALIZED VIEW CONCURRENTLY :view_name;
68
-
69
- -- Log refresh
70
- RAISE NOTICE 'Materialized view :view_name refreshed at %', NOW();
71
- END;
72
- $$;
73
-
74
- -- Grant execute to service role (for scheduled refresh)
75
- GRANT EXECUTE ON FUNCTION refresh_:view_name() TO service_role;
76
-
77
- -- =============================================================================
78
- -- SCHEDULED REFRESH (pg_cron)
79
- -- =============================================================================
80
- --
81
- -- If using pg_cron extension (available in Supabase):
82
- --
83
- -- Enable extension (one-time, requires superuser)
84
- -- CREATE EXTENSION IF NOT EXISTS pg_cron;
85
- --
86
- -- Schedule refresh every hour
87
- -- SELECT cron.schedule(
88
- -- 'refresh-:view_name',
89
- -- '0 * * * *', -- Every hour at minute 0
90
- -- $$SELECT refresh_:view_name()$$
91
- -- );
92
- --
93
- -- To remove schedule:
94
- -- SELECT cron.unschedule('refresh-:view_name');
95
-
96
- -- =============================================================================
97
- -- TRIGGER-BASED REFRESH (Alternative)
98
- -- =============================================================================
99
-
100
- -- Refresh when base table changes (use with caution - can be slow)
101
- -- CREATE OR REPLACE FUNCTION refresh_:view_name_trigger()
102
- -- RETURNS TRIGGER AS $$
103
- -- BEGIN
104
- -- REFRESH MATERIALIZED VIEW CONCURRENTLY :view_name;
105
- -- RETURN NULL;
106
- -- END;
107
- -- $$ LANGUAGE plpgsql;
108
- --
109
- -- CREATE TRIGGER trigger_refresh_:view_name
110
- -- AFTER INSERT OR UPDATE OR DELETE ON :base_table
111
- -- FOR EACH STATEMENT
112
- -- EXECUTE FUNCTION refresh_:view_name_trigger();
113
-
114
- -- =============================================================================
115
- -- VIEW METADATA
116
- -- =============================================================================
117
-
118
- COMMENT ON MATERIALIZED VIEW :view_name IS ':description. Refresh: hourly or on-demand.';
119
-
120
- -- =============================================================================
121
- -- USAGE
122
- -- =============================================================================
123
- --
124
- -- Query the view (cached data, very fast):
125
- -- SELECT * FROM :view_name WHERE category = 'example';
126
- --
127
- -- Manual refresh (use during low-traffic periods):
128
- -- REFRESH MATERIALIZED VIEW CONCURRENTLY :view_name;
129
- -- OR
130
- -- SELECT refresh_:view_name();
131
- --
132
- -- Check last refresh time (approximate):
133
- -- SELECT pg_stat_get_last_analyze_time(':view_name'::regclass);
134
-
1
+ -- Materialized View Template
2
+ -- View: :view_name
3
+ -- Created: :created_date
4
+ -- Author: :author
5
+ -- Description: :description
6
+ --
7
+ -- Materialized views cache query results for performance
8
+ -- IMPORTANT: Data is not live - must be refreshed periodically
9
+
10
+ -- =============================================================================
11
+ -- BASIC MATERIALIZED VIEW
12
+ -- =============================================================================
13
+
14
+ -- Drop existing view if exists
15
+ DROP MATERIALIZED VIEW IF EXISTS :view_name CASCADE;
16
+
17
+ -- Create materialized view
18
+ CREATE MATERIALIZED VIEW :view_name AS
19
+ SELECT
20
+ t.id,
21
+ t.name,
22
+ t.category,
23
+ t.created_at,
24
+ -- Aggregations
25
+ COUNT(r.id) AS related_count,
26
+ SUM(r.amount) AS total_amount,
27
+ AVG(r.rating) AS avg_rating,
28
+ -- Computed columns
29
+ CASE
30
+ WHEN t.status = 'active' THEN true
31
+ ELSE false
32
+ END AS is_active
33
+ FROM :base_table t
34
+ LEFT JOIN :related_table r ON r.parent_id = t.id
35
+ WHERE t.deleted_at IS NULL
36
+ GROUP BY t.id, t.name, t.category, t.created_at, t.status
37
+ -- Store data sorted for efficient access
38
+ WITH DATA;
39
+
40
+ -- =============================================================================
41
+ -- INDEXES ON MATERIALIZED VIEW
42
+ -- =============================================================================
43
+
44
+ -- Unique index (required for CONCURRENT refresh)
45
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_:view_name_id
46
+ ON :view_name (id);
47
+
48
+ -- Additional indexes for common queries
49
+ CREATE INDEX IF NOT EXISTS idx_:view_name_category
50
+ ON :view_name (category);
51
+
52
+ CREATE INDEX IF NOT EXISTS idx_:view_name_created_at
53
+ ON :view_name (created_at DESC);
54
+
55
+ -- =============================================================================
56
+ -- REFRESH FUNCTION
57
+ -- =============================================================================
58
+
59
+ -- Function to refresh the materialized view
60
+ CREATE OR REPLACE FUNCTION refresh_:view_name()
61
+ RETURNS void
62
+ LANGUAGE plpgsql
63
+ SECURITY DEFINER
64
+ AS $$
65
+ BEGIN
66
+ -- CONCURRENTLY allows queries during refresh (requires unique index)
67
+ REFRESH MATERIALIZED VIEW CONCURRENTLY :view_name;
68
+
69
+ -- Log refresh
70
+ RAISE NOTICE 'Materialized view :view_name refreshed at %', NOW();
71
+ END;
72
+ $$;
73
+
74
+ -- Grant execute to service role (for scheduled refresh)
75
+ GRANT EXECUTE ON FUNCTION refresh_:view_name() TO service_role;
76
+
77
+ -- =============================================================================
78
+ -- SCHEDULED REFRESH (pg_cron)
79
+ -- =============================================================================
80
+ --
81
+ -- If using pg_cron extension (available in Supabase):
82
+ --
83
+ -- Enable extension (one-time, requires superuser)
84
+ -- CREATE EXTENSION IF NOT EXISTS pg_cron;
85
+ --
86
+ -- Schedule refresh every hour
87
+ -- SELECT cron.schedule(
88
+ -- 'refresh-:view_name',
89
+ -- '0 * * * *', -- Every hour at minute 0
90
+ -- $$SELECT refresh_:view_name()$$
91
+ -- );
92
+ --
93
+ -- To remove schedule:
94
+ -- SELECT cron.unschedule('refresh-:view_name');
95
+
96
+ -- =============================================================================
97
+ -- TRIGGER-BASED REFRESH (Alternative)
98
+ -- =============================================================================
99
+
100
+ -- Refresh when base table changes (use with caution - can be slow)
101
+ -- CREATE OR REPLACE FUNCTION refresh_:view_name_trigger()
102
+ -- RETURNS TRIGGER AS $$
103
+ -- BEGIN
104
+ -- REFRESH MATERIALIZED VIEW CONCURRENTLY :view_name;
105
+ -- RETURN NULL;
106
+ -- END;
107
+ -- $$ LANGUAGE plpgsql;
108
+ --
109
+ -- CREATE TRIGGER trigger_refresh_:view_name
110
+ -- AFTER INSERT OR UPDATE OR DELETE ON :base_table
111
+ -- FOR EACH STATEMENT
112
+ -- EXECUTE FUNCTION refresh_:view_name_trigger();
113
+
114
+ -- =============================================================================
115
+ -- VIEW METADATA
116
+ -- =============================================================================
117
+
118
+ COMMENT ON MATERIALIZED VIEW :view_name IS ':description. Refresh: hourly or on-demand.';
119
+
120
+ -- =============================================================================
121
+ -- USAGE
122
+ -- =============================================================================
123
+ --
124
+ -- Query the view (cached data, very fast):
125
+ -- SELECT * FROM :view_name WHERE category = 'example';
126
+ --
127
+ -- Manual refresh (use during low-traffic periods):
128
+ -- REFRESH MATERIALIZED VIEW CONCURRENTLY :view_name;
129
+ -- OR
130
+ -- SELECT refresh_:view_name();
131
+ --
132
+ -- Check last refresh time (approximate):
133
+ -- SELECT pg_stat_get_last_analyze_time(':view_name'::regclass);
134
+
@@ -1,178 +1,178 @@
1
- -- View Template
2
- -- View: :view_name
3
- -- Created: :created_date
4
- -- Author: :author
5
- -- Description: :description
6
- --
7
- -- Views are virtual tables that provide a simplified interface
8
- -- Data is always live (not cached like materialized views)
9
-
10
- -- =============================================================================
11
- -- BASIC VIEW
12
- -- =============================================================================
13
-
14
- -- Drop existing view if exists
15
- DROP VIEW IF EXISTS :view_name CASCADE;
16
-
17
- -- Create view
18
- CREATE OR REPLACE VIEW :view_name AS
19
- SELECT
20
- t.id,
21
- t.name,
22
- t.description,
23
- t.status,
24
- t.created_at,
25
- t.updated_at,
26
- -- Related data
27
- u.email AS owner_email,
28
- u.raw_user_meta_data->>'full_name' AS owner_name,
29
- -- Computed columns
30
- CASE
31
- WHEN t.status = 'active' THEN 'Active'
32
- WHEN t.status = 'pending' THEN 'Pending'
33
- WHEN t.status = 'archived' THEN 'Archived'
34
- ELSE 'Unknown'
35
- END AS status_label,
36
- -- Age calculation
37
- EXTRACT(DAY FROM NOW() - t.created_at) AS days_old
38
- FROM :base_table t
39
- LEFT JOIN auth.users u ON u.id = t.user_id
40
- WHERE t.deleted_at IS NULL;
41
-
42
- -- =============================================================================
43
- -- VIEW WITH AGGREGATIONS
44
- -- =============================================================================
45
-
46
- CREATE OR REPLACE VIEW :view_name_summary AS
47
- SELECT
48
- t.category,
49
- COUNT(*) AS total_count,
50
- COUNT(*) FILTER (WHERE t.status = 'active') AS active_count,
51
- COUNT(*) FILTER (WHERE t.status = 'pending') AS pending_count,
52
- MIN(t.created_at) AS earliest,
53
- MAX(t.created_at) AS latest,
54
- AVG(t.value)::NUMERIC(10,2) AS avg_value
55
- FROM :base_table t
56
- WHERE t.deleted_at IS NULL
57
- GROUP BY t.category;
58
-
59
- -- =============================================================================
60
- -- VIEW WITH RLS CONSIDERATION
61
- -- =============================================================================
62
-
63
- -- Views inherit RLS from underlying tables
64
- -- If base table has RLS, view will respect it
65
- --
66
- -- For views that need custom RLS-like behavior,
67
- -- wrap in a SECURITY DEFINER function:
68
-
69
- CREATE OR REPLACE FUNCTION get_:view_name_for_user()
70
- RETURNS TABLE (
71
- id UUID,
72
- name TEXT,
73
- status TEXT,
74
- created_at TIMESTAMPTZ
75
- )
76
- LANGUAGE plpgsql
77
- SECURITY INVOKER
78
- STABLE
79
- AS $$
80
- BEGIN
81
- RETURN QUERY
82
- SELECT
83
- v.id,
84
- v.name,
85
- v.status,
86
- v.created_at
87
- FROM :view_name v
88
- WHERE v.user_id = auth.uid()
89
- ORDER BY v.created_at DESC;
90
- END;
91
- $$;
92
-
93
- -- =============================================================================
94
- -- VIEW WITH JOINED DATA
95
- -- =============================================================================
96
-
97
- CREATE OR REPLACE VIEW :view_name_detailed AS
98
- SELECT
99
- t.id,
100
- t.name,
101
- t.status,
102
- -- One-to-one relationship
103
- d.detail_field,
104
- -- One-to-many aggregation
105
- (
106
- SELECT json_agg(json_build_object(
107
- 'id', c.id,
108
- 'name', c.name,
109
- 'created_at', c.created_at
110
- ))
111
- FROM :child_table c
112
- WHERE c.parent_id = t.id
113
- ) AS children,
114
- -- Count
115
- (
116
- SELECT COUNT(*)
117
- FROM :child_table c
118
- WHERE c.parent_id = t.id
119
- ) AS children_count,
120
- t.created_at,
121
- t.updated_at
122
- FROM :base_table t
123
- LEFT JOIN :detail_table d ON d.id = t.detail_id
124
- WHERE t.deleted_at IS NULL;
125
-
126
- -- =============================================================================
127
- -- UPDATEABLE VIEW (with INSTEAD OF triggers)
128
- -- =============================================================================
129
-
130
- -- Simple updateable view (for basic cases)
131
- CREATE OR REPLACE VIEW :view_name_editable AS
132
- SELECT
133
- id,
134
- name,
135
- description,
136
- status,
137
- updated_at
138
- FROM :base_table
139
- WHERE deleted_at IS NULL;
140
-
141
- -- Make it updateable via trigger
142
- CREATE OR REPLACE FUNCTION :view_name_editable_update()
143
- RETURNS TRIGGER AS $$
144
- BEGIN
145
- UPDATE :base_table
146
- SET
147
- name = NEW.name,
148
- description = NEW.description,
149
- status = NEW.status,
150
- updated_at = NOW()
151
- WHERE id = NEW.id
152
- AND user_id = auth.uid(); -- RLS check
153
-
154
- RETURN NEW;
155
- END;
156
- $$ LANGUAGE plpgsql SECURITY DEFINER;
157
-
158
- CREATE TRIGGER trigger_:view_name_editable_update
159
- INSTEAD OF UPDATE ON :view_name_editable
160
- FOR EACH ROW
161
- EXECUTE FUNCTION :view_name_editable_update();
162
-
163
- -- =============================================================================
164
- -- VIEW METADATA
165
- -- =============================================================================
166
-
167
- COMMENT ON VIEW :view_name IS ':description';
168
-
169
- -- =============================================================================
170
- -- PERMISSIONS
171
- -- =============================================================================
172
-
173
- -- Grant SELECT on view (inherits base table RLS)
174
- GRANT SELECT ON :view_name TO authenticated;
175
-
176
- -- For updateable views, also grant UPDATE
177
- -- GRANT UPDATE ON :view_name_editable TO authenticated;
178
-
1
+ -- View Template
2
+ -- View: :view_name
3
+ -- Created: :created_date
4
+ -- Author: :author
5
+ -- Description: :description
6
+ --
7
+ -- Views are virtual tables that provide a simplified interface
8
+ -- Data is always live (not cached like materialized views)
9
+
10
+ -- =============================================================================
11
+ -- BASIC VIEW
12
+ -- =============================================================================
13
+
14
+ -- Drop existing view if exists
15
+ DROP VIEW IF EXISTS :view_name CASCADE;
16
+
17
+ -- Create view
18
+ CREATE OR REPLACE VIEW :view_name AS
19
+ SELECT
20
+ t.id,
21
+ t.name,
22
+ t.description,
23
+ t.status,
24
+ t.created_at,
25
+ t.updated_at,
26
+ -- Related data
27
+ u.email AS owner_email,
28
+ u.raw_user_meta_data->>'full_name' AS owner_name,
29
+ -- Computed columns
30
+ CASE
31
+ WHEN t.status = 'active' THEN 'Active'
32
+ WHEN t.status = 'pending' THEN 'Pending'
33
+ WHEN t.status = 'archived' THEN 'Archived'
34
+ ELSE 'Unknown'
35
+ END AS status_label,
36
+ -- Age calculation
37
+ EXTRACT(DAY FROM NOW() - t.created_at) AS days_old
38
+ FROM :base_table t
39
+ LEFT JOIN auth.users u ON u.id = t.user_id
40
+ WHERE t.deleted_at IS NULL;
41
+
42
+ -- =============================================================================
43
+ -- VIEW WITH AGGREGATIONS
44
+ -- =============================================================================
45
+
46
+ CREATE OR REPLACE VIEW :view_name_summary AS
47
+ SELECT
48
+ t.category,
49
+ COUNT(*) AS total_count,
50
+ COUNT(*) FILTER (WHERE t.status = 'active') AS active_count,
51
+ COUNT(*) FILTER (WHERE t.status = 'pending') AS pending_count,
52
+ MIN(t.created_at) AS earliest,
53
+ MAX(t.created_at) AS latest,
54
+ AVG(t.value)::NUMERIC(10,2) AS avg_value
55
+ FROM :base_table t
56
+ WHERE t.deleted_at IS NULL
57
+ GROUP BY t.category;
58
+
59
+ -- =============================================================================
60
+ -- VIEW WITH RLS CONSIDERATION
61
+ -- =============================================================================
62
+
63
+ -- Views inherit RLS from underlying tables
64
+ -- If base table has RLS, view will respect it
65
+ --
66
+ -- For views that need custom RLS-like behavior,
67
+ -- wrap in a SECURITY DEFINER function:
68
+
69
+ CREATE OR REPLACE FUNCTION get_:view_name_for_user()
70
+ RETURNS TABLE (
71
+ id UUID,
72
+ name TEXT,
73
+ status TEXT,
74
+ created_at TIMESTAMPTZ
75
+ )
76
+ LANGUAGE plpgsql
77
+ SECURITY INVOKER
78
+ STABLE
79
+ AS $$
80
+ BEGIN
81
+ RETURN QUERY
82
+ SELECT
83
+ v.id,
84
+ v.name,
85
+ v.status,
86
+ v.created_at
87
+ FROM :view_name v
88
+ WHERE v.user_id = auth.uid()
89
+ ORDER BY v.created_at DESC;
90
+ END;
91
+ $$;
92
+
93
+ -- =============================================================================
94
+ -- VIEW WITH JOINED DATA
95
+ -- =============================================================================
96
+
97
+ CREATE OR REPLACE VIEW :view_name_detailed AS
98
+ SELECT
99
+ t.id,
100
+ t.name,
101
+ t.status,
102
+ -- One-to-one relationship
103
+ d.detail_field,
104
+ -- One-to-many aggregation
105
+ (
106
+ SELECT json_agg(json_build_object(
107
+ 'id', c.id,
108
+ 'name', c.name,
109
+ 'created_at', c.created_at
110
+ ))
111
+ FROM :child_table c
112
+ WHERE c.parent_id = t.id
113
+ ) AS children,
114
+ -- Count
115
+ (
116
+ SELECT COUNT(*)
117
+ FROM :child_table c
118
+ WHERE c.parent_id = t.id
119
+ ) AS children_count,
120
+ t.created_at,
121
+ t.updated_at
122
+ FROM :base_table t
123
+ LEFT JOIN :detail_table d ON d.id = t.detail_id
124
+ WHERE t.deleted_at IS NULL;
125
+
126
+ -- =============================================================================
127
+ -- UPDATEABLE VIEW (with INSTEAD OF triggers)
128
+ -- =============================================================================
129
+
130
+ -- Simple updateable view (for basic cases)
131
+ CREATE OR REPLACE VIEW :view_name_editable AS
132
+ SELECT
133
+ id,
134
+ name,
135
+ description,
136
+ status,
137
+ updated_at
138
+ FROM :base_table
139
+ WHERE deleted_at IS NULL;
140
+
141
+ -- Make it updateable via trigger
142
+ CREATE OR REPLACE FUNCTION :view_name_editable_update()
143
+ RETURNS TRIGGER AS $$
144
+ BEGIN
145
+ UPDATE :base_table
146
+ SET
147
+ name = NEW.name,
148
+ description = NEW.description,
149
+ status = NEW.status,
150
+ updated_at = NOW()
151
+ WHERE id = NEW.id
152
+ AND user_id = auth.uid(); -- RLS check
153
+
154
+ RETURN NEW;
155
+ END;
156
+ $$ LANGUAGE plpgsql SECURITY DEFINER;
157
+
158
+ CREATE TRIGGER trigger_:view_name_editable_update
159
+ INSTEAD OF UPDATE ON :view_name_editable
160
+ FOR EACH ROW
161
+ EXECUTE FUNCTION :view_name_editable_update();
162
+
163
+ -- =============================================================================
164
+ -- VIEW METADATA
165
+ -- =============================================================================
166
+
167
+ COMMENT ON VIEW :view_name IS ':description';
168
+
169
+ -- =============================================================================
170
+ -- PERMISSIONS
171
+ -- =============================================================================
172
+
173
+ -- Grant SELECT on view (inherits base table RLS)
174
+ GRANT SELECT ON :view_name TO authenticated;
175
+
176
+ -- For updateable views, also grant UPDATE
177
+ -- GRANT UPDATE ON :view_name_editable TO authenticated;
178
+