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,539 +0,0 @@
1
- const fs = require('fs');
2
- const path = require('path');
3
- const { detectProjectType, detectProjectTypeExtended } = require('../../../src/detection/detect-project-type');
4
-
5
- // Mock fs module
6
- jest.mock('fs');
7
-
8
- describe('detectProjectType', () => {
9
- beforeEach(() => {
10
- // Clear all mocks before each test
11
- jest.clearAllMocks();
12
-
13
- // Reset console.error mock to avoid test pollution
14
- jest.spyOn(console, 'error').mockImplementation(() => {});
15
- });
16
-
17
- afterEach(() => {
18
- // Restore console.error
19
- console.error.mockRestore();
20
- });
21
-
22
- // ============================================================================
23
- // AC #1: Empty Directory → GREENFIELD
24
- // ============================================================================
25
- describe('AC #1: GREENFIELD detection', () => {
26
- test('detects GREENFIELD when directory is empty', () => {
27
- // Setup: Directory exists but has no files
28
- fs.existsSync.mockImplementation((checkPath) => {
29
- // Directory exists, but no markers
30
- if (checkPath === path.resolve('/test/empty')) return true;
31
- return false; // No .sinapse-ai, package.json, or .git
32
- });
33
- fs.readdirSync.mockReturnValue([]); // Empty directory
34
-
35
- const result = detectProjectType('/test/empty');
36
-
37
- expect(result).toBe('GREENFIELD');
38
- expect(fs.existsSync).toHaveBeenCalledWith(expect.stringContaining('.sinapse-ai'));
39
- expect(fs.readdirSync).toHaveBeenCalledTimes(1);
40
- });
41
-
42
- test('uses process.cwd() as default when no targetDir provided', () => {
43
- // Setup
44
- const mockCwd = process.cwd();
45
- fs.existsSync.mockImplementation((checkPath) => {
46
- if (checkPath === path.resolve(mockCwd)) return true;
47
- return false;
48
- });
49
- fs.readdirSync.mockReturnValue([]);
50
-
51
- const result = detectProjectType();
52
-
53
- expect(result).toBe('GREENFIELD');
54
- expect(fs.readdirSync).toHaveBeenCalledWith(path.resolve(mockCwd));
55
- });
56
- });
57
-
58
- // ============================================================================
59
- // AC #2: package.json Exists → BROWNFIELD
60
- // ============================================================================
61
- describe('AC #2: BROWNFIELD detection - package.json', () => {
62
- test('detects BROWNFIELD when package.json exists', () => {
63
- // Setup
64
- fs.existsSync.mockImplementation((checkPath) => {
65
- if (checkPath === path.resolve('/test/brownfield')) return true;
66
- if (checkPath.endsWith('package.json')) return true; // package.json exists
67
- return false; // No .sinapse-ai or .git
68
- });
69
- fs.readdirSync.mockReturnValue(['package.json', 'src', 'README.md']);
70
-
71
- const result = detectProjectType('/test/brownfield');
72
-
73
- expect(result).toBe('BROWNFIELD');
74
- });
75
-
76
- test('detects BROWNFIELD when only package.json exists (no git)', () => {
77
- // Setup: package.json but no .git
78
- fs.existsSync.mockImplementation((checkPath) => {
79
- if (checkPath === path.resolve('/test/node-project')) return true;
80
- if (checkPath.endsWith('package.json')) return true;
81
- if (checkPath.endsWith('.git')) return false;
82
- if (checkPath.endsWith('.sinapse-ai')) return false;
83
- return false;
84
- });
85
- fs.readdirSync.mockReturnValue(['package.json', 'index.js']);
86
-
87
- const result = detectProjectType('/test/node-project');
88
-
89
- expect(result).toBe('BROWNFIELD');
90
- });
91
- });
92
-
93
- // ============================================================================
94
- // AC #3: .git Exists → BROWNFIELD
95
- // ============================================================================
96
- describe('AC #3: BROWNFIELD detection - .git', () => {
97
- test('detects BROWNFIELD when .git exists', () => {
98
- // Setup
99
- fs.existsSync.mockImplementation((checkPath) => {
100
- if (checkPath === path.resolve('/test/brownfield-git')) return true;
101
- if (checkPath.endsWith('.git')) return true; // .git exists
102
- return false; // No .sinapse-ai or package.json
103
- });
104
- fs.readdirSync.mockReturnValue(['.git', 'README.md', 'src']);
105
-
106
- const result = detectProjectType('/test/brownfield-git');
107
-
108
- expect(result).toBe('BROWNFIELD');
109
- });
110
-
111
- test('detects BROWNFIELD when both package.json and .git exist', () => {
112
- // Setup: Both markers present
113
- fs.existsSync.mockImplementation((checkPath) => {
114
- if (checkPath === path.resolve('/test/full-project')) return true;
115
- if (checkPath.endsWith('package.json')) return true;
116
- if (checkPath.endsWith('.git')) return true;
117
- if (checkPath.endsWith('.sinapse-ai')) return false;
118
- return false;
119
- });
120
- fs.readdirSync.mockReturnValue(['.git', 'package.json', 'src', 'README.md']);
121
-
122
- const result = detectProjectType('/test/full-project');
123
-
124
- expect(result).toBe('BROWNFIELD');
125
- });
126
- });
127
-
128
- // ============================================================================
129
- // AC #4: .sinapse-ai Exists → EXISTING_SINAPSE
130
- // ============================================================================
131
- describe('AC #4: EXISTING_SINAPSE detection', () => {
132
- test('detects EXISTING_SINAPSE when .sinapse-ai exists', () => {
133
- // Setup
134
- fs.existsSync.mockImplementation((checkPath) => {
135
- if (checkPath === path.resolve('/test/existing')) return true;
136
- if (checkPath.endsWith('.sinapse-ai')) return true; // .sinapse-ai exists
137
- return true; // Other files may exist too
138
- });
139
- fs.readdirSync.mockReturnValue(['.sinapse-ai', 'package.json', '.git', 'src']);
140
-
141
- const result = detectProjectType('/test/existing');
142
-
143
- expect(result).toBe('EXISTING_SINAPSE');
144
- });
145
-
146
- test('EXISTING_SINAPSE takes priority over BROWNFIELD markers', () => {
147
- // Setup: All markers present, but EXISTING_SINAPSE should win
148
- fs.existsSync.mockImplementation((checkPath) => {
149
- if (checkPath === path.resolve('/test/priority-test')) return true;
150
- // All markers present
151
- if (checkPath.endsWith('.sinapse-ai')) return true;
152
- if (checkPath.endsWith('package.json')) return true;
153
- if (checkPath.endsWith('.git')) return true;
154
- return false;
155
- });
156
- fs.readdirSync.mockReturnValue(['.sinapse-ai', 'package.json', '.git', 'src']);
157
-
158
- const result = detectProjectType('/test/priority-test');
159
-
160
- // EXISTING_SINAPSE has highest priority
161
- expect(result).toBe('EXISTING_SINAPSE');
162
- });
163
- });
164
-
165
- // ============================================================================
166
- // Edge Case: UNKNOWN Type
167
- // ============================================================================
168
- describe('Edge Case: UNKNOWN detection', () => {
169
- test('returns UNKNOWN when directory has files but no recognized markers', () => {
170
- // Setup: Files exist but no package.json, .git, or .sinapse-ai
171
- fs.existsSync.mockImplementation((checkPath) => {
172
- if (checkPath === path.resolve('/test/unknown')) return true;
173
- // No recognized markers
174
- return false;
175
- });
176
- fs.readdirSync.mockReturnValue(['README.md', 'index.html', 'styles.css']);
177
-
178
- const result = detectProjectType('/test/unknown');
179
-
180
- expect(result).toBe('UNKNOWN');
181
- });
182
-
183
- test('returns UNKNOWN for non-empty directory with only hidden files', () => {
184
- // Setup
185
- fs.existsSync.mockImplementation((checkPath) => {
186
- if (checkPath === path.resolve('/test/hidden-only')) return true;
187
- return false; // No recognized markers
188
- });
189
- fs.readdirSync.mockReturnValue(['.DS_Store', '.gitignore']); // Hidden files only
190
-
191
- const result = detectProjectType('/test/hidden-only');
192
-
193
- expect(result).toBe('UNKNOWN');
194
- });
195
- });
196
-
197
- // ============================================================================
198
- // Error Handling Tests
199
- // ============================================================================
200
- describe('Error Handling', () => {
201
- test('throws error when directory does not exist', () => {
202
- // Setup: Directory doesn't exist
203
- fs.existsSync.mockImplementation((checkPath) => {
204
- if (checkPath === path.resolve('/test/nonexistent')) return false;
205
- return false;
206
- });
207
-
208
- expect(() => detectProjectType('/test/nonexistent')).toThrow('Failed to detect project type');
209
- expect(() => detectProjectType('/test/nonexistent')).toThrow('Directory does not exist');
210
- });
211
-
212
- test('throws error when directory cannot be accessed (EACCES)', () => {
213
- // Setup: Permission denied error
214
- const permissionError = new Error('EACCES: permission denied');
215
- permissionError.code = 'EACCES';
216
-
217
- fs.existsSync.mockImplementation((checkPath) => {
218
- if (checkPath === path.resolve('/test/denied')) return true;
219
- if (checkPath.endsWith('.sinapse-ai')) {
220
- throw permissionError;
221
- }
222
- return false;
223
- });
224
-
225
- expect(() => detectProjectType('/test/denied')).toThrow('Failed to detect project type');
226
- expect(console.error).toHaveBeenCalledWith(
227
- expect.stringContaining('[detect-project-type] Error detecting project type'),
228
- );
229
- });
230
-
231
- test('throws error when fs.readdirSync fails', () => {
232
- // Setup: readdirSync throws error
233
- const readError = new Error('EPERM: operation not permitted');
234
- readError.code = 'EPERM';
235
-
236
- fs.existsSync.mockImplementation((checkPath) => {
237
- if (checkPath === path.resolve('/test/read-error')) return true;
238
- return false;
239
- });
240
- fs.readdirSync.mockImplementation(() => {
241
- throw readError;
242
- });
243
-
244
- expect(() => detectProjectType('/test/read-error')).toThrow('Failed to detect project type');
245
- expect(console.error).toHaveBeenCalled();
246
- });
247
-
248
- test('throws error with invalid targetDir parameter (null)', () => {
249
- expect(() => detectProjectType(null)).toThrow('Invalid targetDir parameter');
250
- });
251
-
252
- test('throws error with invalid targetDir parameter (empty string)', () => {
253
- expect(() => detectProjectType('')).toThrow('Invalid targetDir parameter');
254
- });
255
-
256
- test('throws error with invalid targetDir parameter (number)', () => {
257
- expect(() => detectProjectType(123)).toThrow('Invalid targetDir parameter');
258
- });
259
- });
260
-
261
- // ============================================================================
262
- // Priority Order Verification
263
- // ============================================================================
264
- describe('Detection Priority Order', () => {
265
- test('priority: EXISTING_SINAPSE > GREENFIELD', () => {
266
- // Even if directory appears empty, .sinapse-ai presence should win
267
- fs.existsSync.mockImplementation((checkPath) => {
268
- if (checkPath === path.resolve('/test/priority1')) return true;
269
- if (checkPath.endsWith('.sinapse-ai')) return true;
270
- return false;
271
- });
272
- fs.readdirSync.mockReturnValue(['.sinapse-ai']); // Only .sinapse-ai
273
-
274
- const result = detectProjectType('/test/priority1');
275
-
276
- expect(result).toBe('EXISTING_SINAPSE');
277
- });
278
-
279
- test('priority: GREENFIELD > BROWNFIELD when directory is empty', () => {
280
- // This test verifies the order, though practically impossible scenario
281
- fs.existsSync.mockImplementation((checkPath) => {
282
- if (checkPath === path.resolve('/test/priority2')) return true;
283
- return false; // No markers
284
- });
285
- fs.readdirSync.mockReturnValue([]); // Empty
286
-
287
- const result = detectProjectType('/test/priority2');
288
-
289
- expect(result).toBe('GREENFIELD');
290
- });
291
-
292
- test('priority: BROWNFIELD > UNKNOWN', () => {
293
- // Directory has files + package.json
294
- fs.existsSync.mockImplementation((checkPath) => {
295
- if (checkPath === path.resolve('/test/priority3')) return true;
296
- if (checkPath.endsWith('package.json')) return true;
297
- if (checkPath.endsWith('.sinapse-ai')) return false;
298
- if (checkPath.endsWith('.git')) return false;
299
- return false;
300
- });
301
- fs.readdirSync.mockReturnValue(['package.json', 'other-file.txt']);
302
-
303
- const result = detectProjectType('/test/priority3');
304
-
305
- expect(result).toBe('BROWNFIELD');
306
- });
307
- });
308
-
309
- // ============================================================================
310
- // Cross-Platform Path Handling
311
- // ============================================================================
312
- describe('Cross-Platform Compatibility', () => {
313
- test('handles Windows-style paths correctly', () => {
314
- const windowsPath = 'C:\\Users\\Test\\project';
315
-
316
- fs.existsSync.mockImplementation((checkPath) => {
317
- if (checkPath === path.resolve(windowsPath)) return true;
318
- return false;
319
- });
320
- fs.readdirSync.mockReturnValue([]);
321
-
322
- const result = detectProjectType(windowsPath);
323
-
324
- expect(result).toBe('GREENFIELD');
325
- expect(fs.existsSync).toHaveBeenCalledWith(expect.any(String));
326
- });
327
-
328
- test('handles Unix-style paths correctly', () => {
329
- const unixPath = '/home/user/project';
330
-
331
- fs.existsSync.mockImplementation((checkPath) => {
332
- if (checkPath === path.resolve(unixPath)) return true;
333
- return false;
334
- });
335
- fs.readdirSync.mockReturnValue([]);
336
-
337
- const result = detectProjectType(unixPath);
338
-
339
- expect(result).toBe('GREENFIELD');
340
- });
341
-
342
- test('normalizes relative paths correctly', () => {
343
- const relativePath = './test/project';
344
-
345
- fs.existsSync.mockImplementation((checkPath) => {
346
- if (checkPath === path.resolve(relativePath)) return true;
347
- return false;
348
- });
349
- fs.readdirSync.mockReturnValue([]);
350
-
351
- const result = detectProjectType(relativePath);
352
-
353
- expect(result).toBe('GREENFIELD');
354
- });
355
- });
356
-
357
- // ============================================================================
358
- // Security Tests
359
- // ============================================================================
360
- describe('Security - Path Traversal Prevention', () => {
361
- test('uses path.join for all file checks (prevents traversal)', () => {
362
- fs.existsSync.mockImplementation((checkPath) => {
363
- if (checkPath === path.resolve('/test/secure')) return true;
364
- // Verify path.join was used (no string concatenation)
365
- expect(checkPath).toContain(path.sep);
366
- return false;
367
- });
368
- fs.readdirSync.mockReturnValue([]);
369
-
370
- detectProjectType('/test/secure');
371
-
372
- // Verify all existsSync calls use proper path joining
373
- expect(fs.existsSync).toHaveBeenCalledWith(expect.stringContaining(path.sep));
374
- });
375
-
376
- test('normalizes path to prevent directory traversal attacks', () => {
377
- const maliciousPath = '/test/../../etc/passwd';
378
- const resolvedPath = path.resolve(maliciousPath);
379
-
380
- fs.existsSync.mockImplementation((checkPath) => {
381
- // Directory exists
382
- if (checkPath === resolvedPath) return true;
383
- // Verify all paths contain the normalized base path
384
- if (checkPath.includes(resolvedPath)) return false;
385
- return false;
386
- });
387
- fs.readdirSync.mockReturnValue([]);
388
-
389
- const result = detectProjectType(maliciousPath);
390
-
391
- expect(result).toBe('GREENFIELD');
392
- expect(fs.existsSync).toHaveBeenCalled();
393
- // Verify the normalized path was used as base
394
- const calls = fs.existsSync.mock.calls;
395
- calls.forEach(([callPath]) => {
396
- expect(callPath).toContain(path.normalize(resolvedPath).split(path.sep)[0]);
397
- });
398
- });
399
- });
400
- });
401
-
402
- // ============================================================================
403
- // detectProjectTypeExtended
404
- // ============================================================================
405
- describe('detectProjectTypeExtended', () => {
406
- beforeEach(() => {
407
- jest.clearAllMocks();
408
- jest.spyOn(console, 'error').mockImplementation(() => {});
409
- });
410
-
411
- afterEach(() => {
412
- console.error.mockRestore();
413
- });
414
-
415
- test('returns object with type, techStack, maturityScore, recommendations', () => {
416
- fs.existsSync.mockImplementation((checkPath) => {
417
- if (checkPath === path.resolve('/test/ext')) return true;
418
- return false;
419
- });
420
- fs.readdirSync.mockReturnValue([]);
421
-
422
- const result = detectProjectTypeExtended('/test/ext');
423
-
424
- expect(result).toHaveProperty('type', 'GREENFIELD');
425
- expect(result).toHaveProperty('techStack');
426
- expect(result).toHaveProperty('maturityScore', 0);
427
- expect(result).toHaveProperty('recommendations');
428
- expect(Array.isArray(result.recommendations)).toBe(true);
429
- });
430
-
431
- test('GREENFIELD returns empty tech stack and score 0', () => {
432
- fs.existsSync.mockImplementation((checkPath) => {
433
- if (checkPath === path.resolve('/test/green')) return true;
434
- return false;
435
- });
436
- fs.readdirSync.mockReturnValue([]);
437
-
438
- const result = detectProjectTypeExtended('/test/green');
439
-
440
- expect(result.type).toBe('GREENFIELD');
441
- expect(result.techStack.framework).toBeNull();
442
- expect(result.techStack.language).toBeNull();
443
- expect(result.techStack.database).toBeNull();
444
- expect(result.techStack.testing).toBeNull();
445
- expect(result.techStack.ci).toBeNull();
446
- expect(result.maturityScore).toBe(0);
447
- });
448
-
449
- test('detects framework from package.json dependencies', () => {
450
- const dir = path.resolve('/test/next-project');
451
- fs.existsSync.mockImplementation((checkPath) => {
452
- if (checkPath === dir) return true;
453
- if (checkPath === path.join(dir, 'package.json')) return true;
454
- if (checkPath === path.join(dir, 'tsconfig.json')) return true;
455
- return false;
456
- });
457
- fs.readdirSync.mockImplementation((readDir) => {
458
- if (typeof readDir === 'string' && readDir === dir) return ['package.json', 'tsconfig.json', 'src'];
459
- return [];
460
- });
461
- fs.readFileSync.mockReturnValue(JSON.stringify({
462
- dependencies: { next: '14.0.0', react: '18.0.0' },
463
- devDependencies: { jest: '29.0.0' },
464
- }));
465
-
466
- const result = detectProjectTypeExtended('/test/next-project');
467
-
468
- expect(result.type).toBe('BROWNFIELD');
469
- expect(result.techStack.framework).toBe('next');
470
- expect(result.techStack.language).toBe('typescript');
471
- expect(result.techStack.testing).toBe('jest');
472
- });
473
-
474
- test('detects CI from .github/workflows', () => {
475
- const dir = path.resolve('/test/ci-project');
476
- fs.existsSync.mockImplementation((checkPath) => {
477
- if (checkPath === dir) return true;
478
- if (checkPath === path.join(dir, '.git')) return true;
479
- if (checkPath === path.join(dir, '.github', 'workflows')) return true;
480
- return false;
481
- });
482
- fs.readdirSync.mockImplementation((readDir) => {
483
- if (typeof readDir === 'string' && readDir === dir) return ['.git', '.github'];
484
- return [];
485
- });
486
-
487
- const result = detectProjectTypeExtended('/test/ci-project');
488
-
489
- expect(result.techStack.ci).toBe('github-actions');
490
- });
491
-
492
- test('builds recommendations for missing items', () => {
493
- const dir = path.resolve('/test/recs');
494
- fs.existsSync.mockImplementation((checkPath) => {
495
- if (checkPath === dir) return true;
496
- if (checkPath === path.join(dir, 'package.json')) return true;
497
- return false;
498
- });
499
- fs.readdirSync.mockImplementation((readDir) => {
500
- if (typeof readDir === 'string' && readDir === dir) return ['package.json'];
501
- return [];
502
- });
503
- fs.readFileSync.mockReturnValue(JSON.stringify({ dependencies: {} }));
504
-
505
- const result = detectProjectTypeExtended('/test/recs');
506
-
507
- expect(result.recommendations).toEqual(expect.arrayContaining([
508
- expect.stringContaining('testing framework'),
509
- expect.stringContaining('CI/CD'),
510
- expect.stringContaining('.env.example'),
511
- expect.stringContaining('README'),
512
- ]));
513
- });
514
-
515
- test('backward compat: detectProjectType returns same string as extended .type', () => {
516
- fs.existsSync.mockImplementation((checkPath) => {
517
- if (checkPath === path.resolve('/test/compat')) return true;
518
- if (checkPath.endsWith('package.json')) return true;
519
- return false;
520
- });
521
- fs.readdirSync.mockImplementation((readDir) => {
522
- if (typeof readDir === 'string') return ['package.json'];
523
- return [];
524
- });
525
- fs.readFileSync.mockReturnValue(JSON.stringify({ dependencies: {} }));
526
-
527
- const simple = detectProjectType('/test/compat');
528
- const extended = detectProjectTypeExtended('/test/compat');
529
-
530
- expect(simple).toBe(extended.type);
531
- expect(simple).toBe('BROWNFIELD');
532
- });
533
-
534
- test('throws same errors as original for invalid input', () => {
535
- expect(() => detectProjectTypeExtended(null)).toThrow('Invalid targetDir parameter');
536
- expect(() => detectProjectTypeExtended('')).toThrow('Invalid targetDir parameter');
537
- expect(() => detectProjectTypeExtended(123)).toThrow('Invalid targetDir parameter');
538
- });
539
- });