sinapse-ai 9.4.0 → 9.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (266) hide show
  1. package/.claude/CLAUDE.md +10 -4
  2. package/.claude/hooks/enforce-architecture-first.py +197 -197
  3. package/.claude/hooks/enforce-git-push-authority.sh +25 -4
  4. package/.claude/hooks/mind-clone-governance.py +193 -193
  5. package/.claude/hooks/read-protection.py +152 -152
  6. package/.claude/hooks/sql-governance.py +183 -183
  7. package/.claude/hooks/verify-packages.cjs +83 -0
  8. package/.claude/hooks/write-path-validation.py +195 -195
  9. package/.claude/rules/hook-governance.md +1 -0
  10. package/.claude/rules/mandatory-delegation.md +24 -0
  11. package/.claude/rules/project-intelligence.md +63 -0
  12. package/.claude/rules/response-format.md +4 -0
  13. package/.claude/rules/safe-collaboration.md +4 -2
  14. package/.claude/rules/security-data-protection.md +18 -0
  15. package/.claude/rules/squad-awareness.md +93 -67
  16. package/.claude/rules/token-economy.md +148 -0
  17. package/.codex/agents/analyst.md +90 -0
  18. package/.codex/agents/architect.md +78 -0
  19. package/.codex/agents/data-engineer.md +38 -0
  20. package/.codex/agents/developer.md +97 -0
  21. package/.codex/agents/devops.md +121 -0
  22. package/.codex/agents/product-lead.md +27 -0
  23. package/.codex/agents/project-lead.md +28 -0
  24. package/.codex/agents/quality-gate.md +89 -0
  25. package/.codex/agents/sprint-lead.md +28 -0
  26. package/.codex/agents/squad-creator.md +58 -0
  27. package/.codex/agents/ux-design-expert.md +28 -0
  28. package/.sinapse-ai/core/code-intel/registry-syncer.js +56 -3
  29. package/.sinapse-ai/core/doctor/checks/agent-memory.js +5 -1
  30. package/.sinapse-ai/core/doctor/checks/claude-md.js +4 -1
  31. package/.sinapse-ai/core/doctor/checks/code-intel.js +5 -1
  32. package/.sinapse-ai/core/doctor/checks/commands-count.js +4 -1
  33. package/.sinapse-ai/core/doctor/checks/constitution-consistency.js +4 -1
  34. package/.sinapse-ai/core/doctor/checks/core-config.js +4 -1
  35. package/.sinapse-ai/core/doctor/checks/entity-registry.js +6 -1
  36. package/.sinapse-ai/core/doctor/checks/git-hooks.js +5 -1
  37. package/.sinapse-ai/core/doctor/checks/graph-dashboard.js +4 -1
  38. package/.sinapse-ai/core/doctor/checks/hooks-claude-count.js +5 -1
  39. package/.sinapse-ai/core/doctor/checks/ide-sync.js +4 -1
  40. package/.sinapse-ai/core/doctor/checks/node-version.js +4 -1
  41. package/.sinapse-ai/core/doctor/checks/npm-packages.js +4 -1
  42. package/.sinapse-ai/core/doctor/checks/rules-files.js +4 -1
  43. package/.sinapse-ai/core/doctor/checks/settings-json.js +4 -1
  44. package/.sinapse-ai/core/doctor/checks/skills-count.js +4 -1
  45. package/.sinapse-ai/core/doctor/index.js +157 -50
  46. package/.sinapse-ai/core/ids/registry-updater.js +6 -1
  47. package/.sinapse-ai/core/logger/index.js +319 -0
  48. package/.sinapse-ai/core/orchestration/terminal-spawner.js +2 -2
  49. package/.sinapse-ai/core/telemetry/index.js +247 -0
  50. package/.sinapse-ai/data/entity-registry.yaml +1384 -944
  51. package/.sinapse-ai/development/agents/architect.md +5 -0
  52. package/.sinapse-ai/development/agents/data-engineer.md +38 -0
  53. package/.sinapse-ai/development/agents/developer.md +28 -0
  54. package/.sinapse-ai/development/agents/devops.md +4 -0
  55. package/.sinapse-ai/development/agents/product-lead.md +27 -0
  56. package/.sinapse-ai/development/agents/project-lead.md +28 -0
  57. package/.sinapse-ai/development/agents/quality-gate.md +4 -0
  58. package/.sinapse-ai/development/agents/sprint-lead/MEMORY.md +8 -0
  59. package/.sinapse-ai/development/agents/sprint-lead.md +28 -0
  60. package/.sinapse-ai/development/agents/squad-creator.md +58 -0
  61. package/.sinapse-ai/development/agents/ux-design-expert.md +28 -0
  62. package/.sinapse-ai/development/knowledge-base/agent-communication-protocol.md +127 -0
  63. package/.sinapse-ai/development/knowledge-base/database-scaling-patterns.md +374 -0
  64. package/.sinapse-ai/development/knowledge-base/environment-deployment-patterns.md +353 -0
  65. package/.sinapse-ai/development/knowledge-base/gotchas-patterns.md +224 -0
  66. package/.sinapse-ai/development/knowledge-base/infrastructure-decision-framework.md +221 -0
  67. package/.sinapse-ai/development/knowledge-base/security-pre-deploy-checklist.md +410 -0
  68. package/.sinapse-ai/development/knowledge-base/software-architecture-patterns.md +299 -0
  69. package/.sinapse-ai/development/knowledge-base/token-economy-guide.md +198 -0
  70. package/.sinapse-ai/development/scripts/populate-entity-registry.js +5 -1
  71. package/.sinapse-ai/development/skills/captcha-handler.md +82 -0
  72. package/.sinapse-ai/development/skills/chrome-brain.md +81 -0
  73. package/.sinapse-ai/development/skills/deploy-readiness.md +93 -0
  74. package/.sinapse-ai/development/skills/model-router.md +92 -0
  75. package/.sinapse-ai/development/skills/sinapse-methodology.md +175 -0
  76. package/.sinapse-ai/development/skills/story-fast-track.md +71 -0
  77. package/.sinapse-ai/development/tasks/dev-develop-story.md +10 -0
  78. package/.sinapse-ai/development/tasks/environment-promotion-pipeline.md +582 -0
  79. package/.sinapse-ai/development/tasks/generate-agent-handoff.md +223 -0
  80. package/.sinapse-ai/development/tasks/infrastructure-assessment.md +432 -0
  81. package/.sinapse-ai/development/tasks/load-testing-setup.md +611 -0
  82. package/.sinapse-ai/development/tasks/observability-blueprint.md +562 -0
  83. package/.sinapse-ai/development/templates/legal/breach-notification-tmpl.md +113 -0
  84. package/.sinapse-ai/development/templates/legal/privacy-policy-tmpl.md +93 -0
  85. package/.sinapse-ai/development/templates/legal/terms-of-service-tmpl.md +85 -0
  86. package/.sinapse-ai/development/templates/service-template/README.md.hbs +159 -159
  87. package/.sinapse-ai/development/templates/service-template/__tests__/index.test.ts.hbs +238 -238
  88. package/.sinapse-ai/development/templates/service-template/client.ts.hbs +404 -404
  89. package/.sinapse-ai/development/templates/service-template/errors.ts.hbs +183 -183
  90. package/.sinapse-ai/development/templates/service-template/index.ts.hbs +121 -121
  91. package/.sinapse-ai/development/templates/service-template/package.json.hbs +88 -88
  92. package/.sinapse-ai/development/templates/service-template/types.ts.hbs +146 -146
  93. package/.sinapse-ai/development/templates/squad-template/LICENSE +22 -22
  94. package/.sinapse-ai/development/workflows/story-development-cycle.yaml +40 -1
  95. package/.sinapse-ai/hooks/ids-post-commit.js +22 -0
  96. package/.sinapse-ai/infrastructure/contracts/compatibility/README.md +42 -0
  97. package/.sinapse-ai/infrastructure/contracts/compatibility/sinapse-current.yaml +35 -0
  98. package/.sinapse-ai/infrastructure/scripts/llm-routing/templates/claude-free-tracked.cmd +127 -127
  99. package/.sinapse-ai/infrastructure/scripts/llm-routing/templates/deepseek-proxy.cmd +71 -71
  100. package/.sinapse-ai/infrastructure/scripts/llm-routing/templates/deepseek-usage.cmd +51 -51
  101. package/.sinapse-ai/infrastructure/scripts/pr-review-ai.js +16 -13
  102. package/.sinapse-ai/infrastructure/scripts/setup-project-infra.js +128 -0
  103. package/.sinapse-ai/infrastructure/scripts/test-discovery.js +8 -3
  104. package/.sinapse-ai/infrastructure/scripts/validate-manifest-parity.js +380 -0
  105. package/.sinapse-ai/infrastructure/scripts/validate-parity.js +76 -25
  106. package/.sinapse-ai/infrastructure/templates/coderabbit.yaml.template +280 -280
  107. package/.sinapse-ai/infrastructure/templates/config/env.example +16 -0
  108. package/.sinapse-ai/infrastructure/templates/config/gitignore-additions.tmpl +59 -0
  109. package/.sinapse-ai/infrastructure/templates/github/CODEOWNERS.template +12 -0
  110. package/.sinapse-ai/infrastructure/templates/github/PULL_REQUEST_TEMPLATE.md +29 -0
  111. package/.sinapse-ai/infrastructure/templates/github/ci-template.yml +77 -0
  112. package/.sinapse-ai/infrastructure/templates/github/issue-templates/bug_report.md +34 -0
  113. package/.sinapse-ai/infrastructure/templates/github/issue-templates/feature_request.md +19 -0
  114. package/.sinapse-ai/infrastructure/templates/github-workflows/ci.yml.template +170 -170
  115. package/.sinapse-ai/infrastructure/templates/github-workflows/pr-automation.yml.template +331 -331
  116. package/.sinapse-ai/infrastructure/templates/github-workflows/release.yml.template +197 -197
  117. package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-brownfield-merge.tmpl +19 -19
  118. package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-node.tmpl +86 -86
  119. package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-python.tmpl +146 -146
  120. package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-sinapse-base.tmpl +64 -64
  121. package/.sinapse-ai/infrastructure/templates/sinapse-sync.yaml.template +183 -183
  122. package/.sinapse-ai/install-manifest.yaml +275 -140
  123. package/.sinapse-ai/local-config.yaml.template +65 -65
  124. package/.sinapse-ai/monitor/hooks/lib/__init__.py +2 -2
  125. package/.sinapse-ai/monitor/hooks/lib/enrich.py +59 -59
  126. package/.sinapse-ai/monitor/hooks/lib/send_event.py +48 -48
  127. package/.sinapse-ai/monitor/hooks/notification.py +30 -30
  128. package/.sinapse-ai/monitor/hooks/post_tool_use.py +46 -46
  129. package/.sinapse-ai/monitor/hooks/pre_compact.py +30 -30
  130. package/.sinapse-ai/monitor/hooks/pre_tool_use.py +41 -41
  131. package/.sinapse-ai/monitor/hooks/stop.py +30 -30
  132. package/.sinapse-ai/monitor/hooks/subagent_stop.py +30 -30
  133. package/.sinapse-ai/monitor/hooks/user_prompt_submit.py +39 -39
  134. package/.sinapse-ai/product/templates/adr.hbs +126 -126
  135. package/.sinapse-ai/product/templates/dbdr.hbs +242 -242
  136. package/.sinapse-ai/product/templates/epic.hbs +213 -213
  137. package/.sinapse-ai/product/templates/pmdr.hbs +187 -187
  138. package/.sinapse-ai/product/templates/prd-v2.0.hbs +217 -217
  139. package/.sinapse-ai/product/templates/prd.hbs +202 -202
  140. package/.sinapse-ai/product/templates/story-tmpl.yaml +59 -0
  141. package/.sinapse-ai/product/templates/story.hbs +264 -264
  142. package/.sinapse-ai/product/templates/task.hbs +171 -171
  143. package/.sinapse-ai/product/templates/tmpl-comment-on-examples.sql +159 -159
  144. package/.sinapse-ai/product/templates/tmpl-migration-script.sql +92 -92
  145. package/.sinapse-ai/product/templates/tmpl-rls-granular-policies.sql +105 -105
  146. package/.sinapse-ai/product/templates/tmpl-rls-kiss-policy.sql +11 -11
  147. package/.sinapse-ai/product/templates/tmpl-rls-roles.sql +136 -136
  148. package/.sinapse-ai/product/templates/tmpl-rls-simple.sql +78 -78
  149. package/.sinapse-ai/product/templates/tmpl-rls-tenant.sql +153 -153
  150. package/.sinapse-ai/product/templates/tmpl-rollback-script.sql +78 -78
  151. package/.sinapse-ai/product/templates/tmpl-seed-data.sql +141 -141
  152. package/.sinapse-ai/product/templates/tmpl-smoke-test.sql +17 -17
  153. package/.sinapse-ai/product/templates/tmpl-staging-copy-merge.sql +140 -140
  154. package/.sinapse-ai/product/templates/tmpl-stored-proc.sql +141 -141
  155. package/.sinapse-ai/product/templates/tmpl-trigger.sql +153 -153
  156. package/.sinapse-ai/product/templates/tmpl-view-materialized.sql +134 -134
  157. package/.sinapse-ai/product/templates/tmpl-view.sql +178 -178
  158. package/.sinapse-ai/scripts/diagnostics/health-dashboard/package-lock.json +427 -355
  159. package/LICENSE +34 -34
  160. package/README.en.md +167 -20
  161. package/README.md +190 -22
  162. package/bin/cli.js +510 -196
  163. package/bin/postinstall.js +564 -0
  164. package/bin/sinapse-cli +283 -283
  165. package/bin/sinapse-graph.js +9 -0
  166. package/bin/sinapse-init.js +36 -4
  167. package/bin/sinapse-minimal.js +20 -9
  168. package/bin/sinapse.js +202 -122
  169. package/bin/utils/deprecation-warning.js +46 -0
  170. package/bin/utils/pre-push-safety.js +14 -0
  171. package/docs/TELEMETRY.md +131 -0
  172. package/docs/chrome-brain-upgrade-plan.md +624 -0
  173. package/docs/framework/orqx-plan.md +1 -1
  174. package/docs/installation/chrome-brain.md +17 -7
  175. package/docs/mega-upgrade-orchestration-plan.md +71 -0
  176. package/docs/pt/contributing.md +20 -0
  177. package/docs/research-synthesis-for-upgrade.md +511 -0
  178. package/docs/security-audit-report.md +306 -0
  179. package/package.json +20 -8
  180. package/packages/installer/src/config/configure-environment.js +19 -44
  181. package/packages/installer/src/detection/detect-project-type.js +181 -63
  182. package/packages/installer/src/installer/manifest-signature.js +32 -17
  183. package/packages/installer/src/wizard/i18n.js +12 -0
  184. package/packages/installer/src/wizard/ide-config-generator.js +8 -39
  185. package/packages/installer/src/wizard/index.js +119 -14
  186. package/packages/installer/src/wizard/questions.js +2 -3
  187. package/packages/installer/tests/integration/environment-configuration.test.js +7 -5
  188. package/packages/installer/tests/unit/detection/detect-project-type.test.js +138 -1
  189. package/packages/installer/tests/unit/doctor/doctor-orchestrator.test.js +3 -3
  190. package/packages/sinapse-install/bin/edmcp.js +0 -0
  191. package/packages/sinapse-install/bin/sinapse-install.js +0 -0
  192. package/packages/sinapse-pro-cli/bin/sinapse-pro.js +0 -0
  193. package/scripts/check-markdown-links.py +353 -353
  194. package/scripts/coverage-report-summary.js +169 -0
  195. package/scripts/generate-install-manifest.js +6 -2
  196. package/scripts/release-readiness.js +169 -0
  197. package/scripts/test-install-matrix-local.sh +153 -0
  198. package/scripts/validate-install-docs.js +394 -0
  199. package/scripts/validate-no-external-refs.js +376 -0
  200. package/scripts/validate-squad-orqx.js +302 -0
  201. package/scripts/validate-story-meta.js +263 -0
  202. package/squads/claude-code-mastery/CHANGELOG.md +1 -1
  203. package/squads/claude-code-mastery/README.md +2 -2
  204. package/squads/claude-code-mastery/squad.yaml +1 -1
  205. package/squads/squad-artdir/README.md +90 -0
  206. package/squads/squad-artdir/agents/accessibility-guardian.md +184 -0
  207. package/squads/squad-artdir/agents/artdir-orqx.md +145 -0
  208. package/squads/squad-artdir/agents/color-psychologist.md +166 -0
  209. package/squads/squad-artdir/agents/cro-persuasion.md +161 -0
  210. package/squads/squad-artdir/agents/design-system-architect.md +100 -0
  211. package/squads/squad-artdir/agents/ia-architect.md +169 -0
  212. package/squads/squad-artdir/agents/interaction-designer.md +162 -0
  213. package/squads/squad-artdir/agents/layout-engineer.md +163 -0
  214. package/squads/squad-artdir/agents/motion-architect.md +185 -0
  215. package/squads/squad-artdir/agents/platform-aesthetic-director.md +84 -0
  216. package/squads/squad-artdir/agents/premium-packaging-strategist.md +107 -0
  217. package/squads/squad-artdir/agents/product-surface-director.md +86 -0
  218. package/squads/squad-artdir/agents/type-systemist.md +138 -0
  219. package/squads/squad-artdir/agents/visual-strategist.md +127 -0
  220. package/squads/squad-artdir/checklists/seven-pillars-validation-checklist.md +172 -0
  221. package/squads/squad-artdir/knowledge-base/case-nyo-ia-reference.md +289 -0
  222. package/squads/squad-artdir/knowledge-base/deliverables-templates.md +457 -0
  223. package/squads/squad-artdir/knowledge-base/motion-technique-catalog.md +247 -0
  224. package/squads/squad-artdir/knowledge-base/premium-packaging-principles.md +133 -0
  225. package/squads/squad-artdir/knowledge-base/psychological-toolkit.md +229 -0
  226. package/squads/squad-artdir/knowledge-base/saas-art-direction-canon.md +242 -0
  227. package/squads/squad-artdir/knowledge-base/seven-pillars-framework.md +289 -0
  228. package/squads/squad-artdir/knowledge-base/ten-pillars-framework.md +221 -0
  229. package/squads/squad-artdir/package.json +20 -0
  230. package/squads/squad-artdir/squad.yaml +271 -0
  231. package/squads/squad-artdir/tasks/audit-conversion.md +97 -0
  232. package/squads/squad-artdir/tasks/audit-drift-multi-surface.md +55 -0
  233. package/squads/squad-artdir/tasks/consult-saas-canon.md +54 -0
  234. package/squads/squad-artdir/tasks/create-art-direction-brief.md +110 -0
  235. package/squads/squad-artdir/tasks/create-premium-packaging-brief.md +61 -0
  236. package/squads/squad-artdir/tasks/create-wireflow.md +84 -0
  237. package/squads/squad-artdir/tasks/design-color-system.md +81 -0
  238. package/squads/squad-artdir/tasks/design-product-surface.md +60 -0
  239. package/squads/squad-artdir/tasks/design-token-system.md +58 -0
  240. package/squads/squad-artdir/tasks/diagnose-visual-language.md +92 -0
  241. package/squads/squad-artdir/tasks/first-5-minutes-choreography.md +65 -0
  242. package/squads/squad-artdir/tasks/specify-motion-system.md +84 -0
  243. package/squads/squad-artdir/tasks/validate-against-pillars.md +143 -0
  244. package/squads/squad-artdir/templates/art-direction-brief-template.md +215 -0
  245. package/squads/squad-artdir/workflows/conversion-audit-cycle.yaml +78 -0
  246. package/squads/squad-artdir/workflows/full-art-direction-cycle.yaml +98 -0
  247. package/squads/squad-artdir/workflows/saas-platform-art-direction-cycle.yaml +174 -0
  248. package/squads/squad-brand/knowledge-base/ai-visual-generation-canon.md +234 -0
  249. package/squads/squad-brand/squad.yaml +20 -6
  250. package/squads/squad-claude/knowledge-base/context-window-optimization.md +1 -1
  251. package/squads/squad-claude/knowledge-base/swarm-orchestration-patterns.md +2 -2
  252. package/squads/squad-content/knowledge-base/ai-native-content-loop.md +220 -0
  253. package/squads/squad-content/knowledge-base/signal-intelligence-v2.md +234 -0
  254. package/squads/squad-content/knowledge-base/task-ownership-map.md +235 -0
  255. package/squads/squad-content/squad.yaml +187 -27
  256. package/squads/squad-copy/knowledge-base/ai-copy-human-loop-canon.md +235 -0
  257. package/squads/squad-copy/squad.yaml +19 -4
  258. package/squads/squad-design/knowledge-base/cross-surface-token-canon.md +209 -0
  259. package/squads/squad-design/squad.yaml +19 -4
  260. package/.sinapse-ai/core/registry/service-registry.json +0 -6346
  261. package/.sinapse-ai/data/registry-update-log.jsonl +0 -1323
  262. package/.sinapse-ai/manifests/agents.csv +0 -29
  263. package/.sinapse-ai/manifests/tasks.csv +0 -204
  264. package/.sinapse-ai/manifests/workers.csv +0 -196
  265. package/squads/squad-growth/tasks/calculate-sample-size.md +0 -121
  266. package/squads/squad-paidmedia/tasks/calculate-sample-size.md +0 -57
package/bin/sinapse-cli CHANGED
@@ -1,283 +1,283 @@
1
- #!/bin/bash
2
- # ══════════════════════════════════════════════════════════════════════════════
3
- # sinapse — CLI unificado do Sinapse
4
- # ══════════════════════════════════════════════════════════════════════════════
5
- #
6
- # Comandos:
7
- # sinapse install Instala squads em um projeto (primeira vez)
8
- # sinapse update Atualiza squads em projeto existente
9
- # sinapse list Lista todas as squads e agentes disponíveis
10
- # sinapse status Mostra status das squads no projeto atual
11
- # sinapse pull Puxa atualizações do repo e atualiza projeto atual
12
- # sinapse help Mostra esta ajuda
13
- #
14
- # Setup (rodar uma vez):
15
- # echo 'export PATH="$HOME/Workspace/caio-imori/sinapse:$PATH"' >> ~/.bashrc
16
- # source ~/.bashrc
17
- #
18
- # ══════════════════════════════════════════════════════════════════════════════
19
-
20
- set -e
21
-
22
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
23
-
24
- # Cores
25
- GREEN='\033[0;32m'
26
- YELLOW='\033[1;33m'
27
- BLUE='\033[0;34m'
28
- RED='\033[0;31m'
29
- CYAN='\033[0;36m'
30
- BOLD='\033[1m'
31
- NC='\033[0m'
32
-
33
- VERSION="1.0.0"
34
-
35
- # ══════════════════════════════════════════════════════════════════════════════
36
- # Helpers
37
- # ══════════════════════════════════════════════════════════════════════════════
38
-
39
- header() {
40
- echo ""
41
- echo -e "${CYAN}${BOLD} ╔═╗╦╔╗╔╔═╗╔═╗╔═╗╔═╗${NC}"
42
- echo -e "${CYAN}${BOLD} ╚═╗║║║║╠═╣╠═╝╚═╗║╣ ${NC}"
43
- echo -e "${CYAN}${BOLD} ╚═╝╩╝╚╝╩ ╩╩ ╚═╝╚═╝${NC}"
44
- echo -e " ${BOLD}v${VERSION}${NC} — 17 squads | 149 agents | 1196 tasks"
45
- echo ""
46
- }
47
-
48
- # ══════════════════════════════════════════════════════════════════════════════
49
- # sinapse install
50
- # ══════════════════════════════════════════════════════════════════════════════
51
-
52
- cmd_install() {
53
- header
54
- echo -e "${BLUE}▸ Instalando squads no projeto...${NC}"
55
- echo ""
56
- bash "$SCRIPT_DIR/../scripts/install-squads.sh"
57
- }
58
-
59
- # ══════════════════════════════════════════════════════════════════════════════
60
- # sinapse update
61
- # ══════════════════════════════════════════════════════════════════════════════
62
-
63
- cmd_update() {
64
- header
65
- echo -e "${BLUE}▸ Atualizando squads no projeto...${NC}"
66
- echo ""
67
- bash "$SCRIPT_DIR/../scripts/update-squads.sh"
68
- }
69
-
70
- # ══════════════════════════════════════════════════════════════════════════════
71
- # sinapse list
72
- # ══════════════════════════════════════════════════════════════════════════════
73
-
74
- cmd_list() {
75
- header
76
- echo -e "${BOLD}Squads disponíveis:${NC}"
77
- echo ""
78
-
79
- total_agents=0
80
- total_tasks=0
81
-
82
- for squad_dir in "$SCRIPT_DIR"/squad-*/; do
83
- [ ! -d "$squad_dir" ] && continue
84
- squad_name=$(basename "$squad_dir")
85
- manifest="$squad_dir/squad.yaml"
86
- [ ! -f "$manifest" ] && continue
87
-
88
- # Skip deprecated
89
- [[ "$squad_name" == *".deprecated"* ]] && continue
90
-
91
- sp=$(grep "^slashPrefix:" "$manifest" | head -1 | sed 's/^slashPrefix: *//' | tr -d '"' | tr -d "'" | tr -d ' ')
92
- [ -z "$sp" ] && sp="--"
93
-
94
- agent_count=$(ls "$squad_dir/agents/"*.md 2>/dev/null | wc -l | tr -d ' ')
95
- task_count=$(ls "$squad_dir/tasks/"*.md 2>/dev/null | wc -l | tr -d ' ')
96
- total_agents=$((total_agents + agent_count))
97
- total_tasks=$((total_tasks + task_count))
98
-
99
- # Short description
100
- desc=$(grep "^description:" "$manifest" | head -1 | sed 's/^description: *//' | tr -d '"' | cut -c1-60)
101
-
102
- printf " ${CYAN}%-12s${NC} ${GREEN}%3s agents${NC} ${YELLOW}%3s tasks${NC} %s\n" "/$sp" "$agent_count" "$task_count" "$desc"
103
- done
104
-
105
- echo ""
106
- echo -e " ${BOLD}Total: ${GREEN}${total_agents} agents${NC} | ${YELLOW}${total_tasks} tasks${NC}"
107
- echo ""
108
- echo -e " ${YELLOW}Uso:${NC} sinapse list agents ${CYAN}<squad>${NC} — ver agentes de uma squad"
109
- echo ""
110
-
111
- # If second arg is "agents" and third is a squad prefix
112
- if [ "$1" = "agents" ] && [ -n "$2" ]; then
113
- cmd_list_agents "$2"
114
- fi
115
- }
116
-
117
- cmd_list_agents() {
118
- local prefix="$1"
119
- echo -e "${BOLD}Agentes da squad /$prefix:${NC}"
120
- echo ""
121
-
122
- for squad_dir in "$SCRIPT_DIR"/squad-*/; do
123
- [ ! -d "$squad_dir" ] && continue
124
- manifest="$squad_dir/squad.yaml"
125
- [ ! -f "$manifest" ] && continue
126
-
127
- sp=$(grep "^slashPrefix:" "$manifest" | head -1 | sed 's/^slashPrefix: *//' | tr -d '"' | tr -d "'" | tr -d ' ')
128
- [ "$sp" != "$prefix" ] && continue
129
-
130
- for agent_file in "$squad_dir/agents/"*.md; do
131
- [ ! -f "$agent_file" ] && continue
132
- agent_id=$(basename "$agent_file" .md)
133
- # Try to get agent title from first # heading
134
- title=$(head -5 "$agent_file" | grep "^# " | head -1 | sed 's/^# //')
135
- printf " ${CYAN}/%s:agents:%-30s${NC} %s\n" "$sp" "$agent_id" "$title"
136
- done
137
- break
138
- done
139
- echo ""
140
- }
141
-
142
- # ══════════════════════════════════════════════════════════════════════════════
143
- # sinapse status
144
- # ══════════════════════════════════════════════════════════════════════════════
145
-
146
- cmd_status() {
147
- header
148
-
149
- if [ ! -d "./squads" ]; then
150
- echo -e " ${RED}✗${NC} Squads não instaladas neste projeto"
151
- echo -e " ${YELLOW}Rode:${NC} sinapse install"
152
- echo ""
153
- return
154
- fi
155
-
156
- echo -e "${BOLD}Status das squads neste projeto:${NC}"
157
- echo ""
158
-
159
- installed=0
160
- missing=0
161
-
162
- for squad_dir in "$SCRIPT_DIR"/squad-*/; do
163
- [ ! -d "$squad_dir" ] && continue
164
- squad_name=$(basename "$squad_dir")
165
- [[ "$squad_name" == *".deprecated"* ]] && continue
166
- manifest="$squad_dir/squad.yaml"
167
- [ ! -f "$manifest" ] && continue
168
-
169
- target="./squads/$squad_name"
170
- if [ -L "$target" ] || [ -d "$target" ]; then
171
- echo -e " ${GREEN}✓${NC} $squad_name"
172
- installed=$((installed + 1))
173
- else
174
- echo -e " ${RED}✗${NC} $squad_name ${YELLOW}(não instalada)${NC}"
175
- missing=$((missing + 1))
176
- fi
177
- done
178
-
179
- echo ""
180
- echo -e " ${GREEN}${installed} instaladas${NC} | ${RED}${missing} faltando${NC}"
181
-
182
- if [ $missing -gt 0 ]; then
183
- echo -e " ${YELLOW}Rode:${NC} sinapse update"
184
- fi
185
-
186
- # Check awareness
187
- if [ -f ".claude/rules/squad-awareness.md" ]; then
188
- echo -e " ${GREEN}✓${NC} squad-awareness.md presente"
189
- else
190
- echo -e " ${RED}✗${NC} squad-awareness.md ausente"
191
- fi
192
-
193
- # Check commands
194
- cmd_count=$(find .claude/commands/ -name "*.md" 2>/dev/null | wc -l | tr -d ' ')
195
- if [ "$cmd_count" -gt 0 ]; then
196
- echo -e " ${GREEN}✓${NC} $cmd_count command files"
197
- else
198
- echo -e " ${RED}✗${NC} Nenhum command file"
199
- fi
200
-
201
- echo ""
202
- }
203
-
204
- # ══════════════════════════════════════════════════════════════════════════════
205
- # sinapse pull
206
- # ══════════════════════════════════════════════════════════════════════════════
207
-
208
- cmd_pull() {
209
- header
210
- echo -e "${BLUE}▸ Puxando atualizações do sinapse...${NC}"
211
- echo ""
212
-
213
- cd "$SCRIPT_DIR"
214
- git pull
215
- echo ""
216
-
217
- # Se estamos num projeto com squads, atualizar
218
- cd - > /dev/null
219
- if [ -d "./squads" ]; then
220
- echo -e "${BLUE}▸ Atualizando projeto atual...${NC}"
221
- echo ""
222
- bash "$SCRIPT_DIR/../scripts/update-squads.sh"
223
- else
224
- echo -e "${YELLOW}Não estamos em um projeto com squads. Só o repo foi atualizado.${NC}"
225
- echo ""
226
- fi
227
- }
228
-
229
- # ══════════════════════════════════════════════════════════════════════════════
230
- # sinapse help
231
- # ══════════════════════════════════════════════════════════════════════════════
232
-
233
- cmd_help() {
234
- header
235
- echo -e "${BOLD}Comandos:${NC}"
236
- echo ""
237
- echo -e " ${CYAN}sinapse install${NC} Instala squads em projeto (primeira vez)"
238
- echo -e " ${CYAN}sinapse update${NC} Atualiza squads (novas squads + awareness + commands)"
239
- echo -e " ${CYAN}sinapse list${NC} Lista todas as squads disponíveis"
240
- echo -e " ${CYAN}sinapse list agents <prefix>${NC} Lista agentes de uma squad (ex: sinapse list agents brand)"
241
- echo -e " ${CYAN}sinapse status${NC} Status das squads no projeto atual"
242
- echo -e " ${CYAN}sinapse pull${NC} Git pull + atualiza projeto atual"
243
- echo -e " ${CYAN}sinapse help${NC} Mostra esta ajuda"
244
- echo ""
245
- echo -e "${BOLD}Setup (rodar uma vez):${NC}"
246
- echo ""
247
- echo -e " ${YELLOW}# Adicionar ao PATH:${NC}"
248
- echo -e " echo 'export PATH=\"\$HOME/Workspace/caio-imori/sinapse:\$PATH\"' >> ~/.bashrc"
249
- echo -e " source ~/.bashrc"
250
- echo ""
251
- echo -e "${BOLD}Uso típico:${NC}"
252
- echo ""
253
- echo -e " ${GREEN}# Projeto novo:${NC}"
254
- echo -e " cd meu-projeto"
255
- echo -e " sinapse install"
256
- echo ""
257
- echo -e " ${GREEN}# Projeto existente (após git pull no sinapse):${NC}"
258
- echo -e " cd meu-projeto"
259
- echo -e " sinapse update"
260
- echo ""
261
- echo -e " ${GREEN}# Tudo de uma vez (pull + update):${NC}"
262
- echo -e " cd meu-projeto"
263
- echo -e " sinapse pull"
264
- echo ""
265
- }
266
-
267
- # ══════════════════════════════════════════════════════════════════════════════
268
- # Router
269
- # ══════════════════════════════════════════════════════════════════════════════
270
-
271
- case "${1:-help}" in
272
- install) cmd_install ;;
273
- update) cmd_update ;;
274
- list) shift; cmd_list "$@" ;;
275
- status) cmd_status ;;
276
- pull) cmd_pull ;;
277
- help|--help|-h) cmd_help ;;
278
- *)
279
- echo -e "${RED}Comando desconhecido:${NC} $1"
280
- echo -e "Rode ${CYAN}sinapse help${NC} para ver comandos disponíveis"
281
- exit 1
282
- ;;
283
- esac
1
+ #!/bin/bash
2
+ # ══════════════════════════════════════════════════════════════════════════════
3
+ # sinapse — CLI unificado do Sinapse
4
+ # ══════════════════════════════════════════════════════════════════════════════
5
+ #
6
+ # Comandos:
7
+ # sinapse install Instala squads em um projeto (primeira vez)
8
+ # sinapse update Atualiza squads em projeto existente
9
+ # sinapse list Lista todas as squads e agentes disponíveis
10
+ # sinapse status Mostra status das squads no projeto atual
11
+ # sinapse pull Puxa atualizações do repo e atualiza projeto atual
12
+ # sinapse help Mostra esta ajuda
13
+ #
14
+ # Setup (rodar uma vez):
15
+ # echo 'export PATH="$HOME/Workspace/caio-imori/sinapse:$PATH"' >> ~/.bashrc
16
+ # source ~/.bashrc
17
+ #
18
+ # ══════════════════════════════════════════════════════════════════════════════
19
+
20
+ set -e
21
+
22
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
23
+
24
+ # Cores
25
+ GREEN='\033[0;32m'
26
+ YELLOW='\033[1;33m'
27
+ BLUE='\033[0;34m'
28
+ RED='\033[0;31m'
29
+ CYAN='\033[0;36m'
30
+ BOLD='\033[1m'
31
+ NC='\033[0m'
32
+
33
+ VERSION="1.0.0"
34
+
35
+ # ══════════════════════════════════════════════════════════════════════════════
36
+ # Helpers
37
+ # ══════════════════════════════════════════════════════════════════════════════
38
+
39
+ header() {
40
+ echo ""
41
+ echo -e "${CYAN}${BOLD} ╔═╗╦╔╗╔╔═╗╔═╗╔═╗╔═╗${NC}"
42
+ echo -e "${CYAN}${BOLD} ╚═╗║║║║╠═╣╠═╝╚═╗║╣ ${NC}"
43
+ echo -e "${CYAN}${BOLD} ╚═╝╩╝╚╝╩ ╩╩ ╚═╝╚═╝${NC}"
44
+ echo -e " ${BOLD}v${VERSION}${NC} — 17 squads | 149 agents | 1196 tasks"
45
+ echo ""
46
+ }
47
+
48
+ # ══════════════════════════════════════════════════════════════════════════════
49
+ # sinapse install
50
+ # ══════════════════════════════════════════════════════════════════════════════
51
+
52
+ cmd_install() {
53
+ header
54
+ echo -e "${BLUE}▸ Instalando squads no projeto...${NC}"
55
+ echo ""
56
+ bash "$SCRIPT_DIR/../scripts/install-squads.sh"
57
+ }
58
+
59
+ # ══════════════════════════════════════════════════════════════════════════════
60
+ # sinapse update
61
+ # ══════════════════════════════════════════════════════════════════════════════
62
+
63
+ cmd_update() {
64
+ header
65
+ echo -e "${BLUE}▸ Atualizando squads no projeto...${NC}"
66
+ echo ""
67
+ bash "$SCRIPT_DIR/../scripts/update-squads.sh"
68
+ }
69
+
70
+ # ══════════════════════════════════════════════════════════════════════════════
71
+ # sinapse list
72
+ # ══════════════════════════════════════════════════════════════════════════════
73
+
74
+ cmd_list() {
75
+ header
76
+ echo -e "${BOLD}Squads disponíveis:${NC}"
77
+ echo ""
78
+
79
+ total_agents=0
80
+ total_tasks=0
81
+
82
+ for squad_dir in "$SCRIPT_DIR"/squad-*/; do
83
+ [ ! -d "$squad_dir" ] && continue
84
+ squad_name=$(basename "$squad_dir")
85
+ manifest="$squad_dir/squad.yaml"
86
+ [ ! -f "$manifest" ] && continue
87
+
88
+ # Skip deprecated
89
+ [[ "$squad_name" == *".deprecated"* ]] && continue
90
+
91
+ sp=$(grep "^slashPrefix:" "$manifest" | head -1 | sed 's/^slashPrefix: *//' | tr -d '"' | tr -d "'" | tr -d ' ')
92
+ [ -z "$sp" ] && sp="--"
93
+
94
+ agent_count=$(ls "$squad_dir/agents/"*.md 2>/dev/null | wc -l | tr -d ' ')
95
+ task_count=$(ls "$squad_dir/tasks/"*.md 2>/dev/null | wc -l | tr -d ' ')
96
+ total_agents=$((total_agents + agent_count))
97
+ total_tasks=$((total_tasks + task_count))
98
+
99
+ # Short description
100
+ desc=$(grep "^description:" "$manifest" | head -1 | sed 's/^description: *//' | tr -d '"' | cut -c1-60)
101
+
102
+ printf " ${CYAN}%-12s${NC} ${GREEN}%3s agents${NC} ${YELLOW}%3s tasks${NC} %s\n" "/$sp" "$agent_count" "$task_count" "$desc"
103
+ done
104
+
105
+ echo ""
106
+ echo -e " ${BOLD}Total: ${GREEN}${total_agents} agents${NC} | ${YELLOW}${total_tasks} tasks${NC}"
107
+ echo ""
108
+ echo -e " ${YELLOW}Uso:${NC} sinapse list agents ${CYAN}<squad>${NC} — ver agentes de uma squad"
109
+ echo ""
110
+
111
+ # If second arg is "agents" and third is a squad prefix
112
+ if [ "$1" = "agents" ] && [ -n "$2" ]; then
113
+ cmd_list_agents "$2"
114
+ fi
115
+ }
116
+
117
+ cmd_list_agents() {
118
+ local prefix="$1"
119
+ echo -e "${BOLD}Agentes da squad /$prefix:${NC}"
120
+ echo ""
121
+
122
+ for squad_dir in "$SCRIPT_DIR"/squad-*/; do
123
+ [ ! -d "$squad_dir" ] && continue
124
+ manifest="$squad_dir/squad.yaml"
125
+ [ ! -f "$manifest" ] && continue
126
+
127
+ sp=$(grep "^slashPrefix:" "$manifest" | head -1 | sed 's/^slashPrefix: *//' | tr -d '"' | tr -d "'" | tr -d ' ')
128
+ [ "$sp" != "$prefix" ] && continue
129
+
130
+ for agent_file in "$squad_dir/agents/"*.md; do
131
+ [ ! -f "$agent_file" ] && continue
132
+ agent_id=$(basename "$agent_file" .md)
133
+ # Try to get agent title from first # heading
134
+ title=$(head -5 "$agent_file" | grep "^# " | head -1 | sed 's/^# //')
135
+ printf " ${CYAN}/%s:agents:%-30s${NC} %s\n" "$sp" "$agent_id" "$title"
136
+ done
137
+ break
138
+ done
139
+ echo ""
140
+ }
141
+
142
+ # ══════════════════════════════════════════════════════════════════════════════
143
+ # sinapse status
144
+ # ══════════════════════════════════════════════════════════════════════════════
145
+
146
+ cmd_status() {
147
+ header
148
+
149
+ if [ ! -d "./squads" ]; then
150
+ echo -e " ${RED}✗${NC} Squads não instaladas neste projeto"
151
+ echo -e " ${YELLOW}Rode:${NC} sinapse install"
152
+ echo ""
153
+ return
154
+ fi
155
+
156
+ echo -e "${BOLD}Status das squads neste projeto:${NC}"
157
+ echo ""
158
+
159
+ installed=0
160
+ missing=0
161
+
162
+ for squad_dir in "$SCRIPT_DIR"/squad-*/; do
163
+ [ ! -d "$squad_dir" ] && continue
164
+ squad_name=$(basename "$squad_dir")
165
+ [[ "$squad_name" == *".deprecated"* ]] && continue
166
+ manifest="$squad_dir/squad.yaml"
167
+ [ ! -f "$manifest" ] && continue
168
+
169
+ target="./squads/$squad_name"
170
+ if [ -L "$target" ] || [ -d "$target" ]; then
171
+ echo -e " ${GREEN}✓${NC} $squad_name"
172
+ installed=$((installed + 1))
173
+ else
174
+ echo -e " ${RED}✗${NC} $squad_name ${YELLOW}(não instalada)${NC}"
175
+ missing=$((missing + 1))
176
+ fi
177
+ done
178
+
179
+ echo ""
180
+ echo -e " ${GREEN}${installed} instaladas${NC} | ${RED}${missing} faltando${NC}"
181
+
182
+ if [ $missing -gt 0 ]; then
183
+ echo -e " ${YELLOW}Rode:${NC} sinapse update"
184
+ fi
185
+
186
+ # Check awareness
187
+ if [ -f ".claude/rules/squad-awareness.md" ]; then
188
+ echo -e " ${GREEN}✓${NC} squad-awareness.md presente"
189
+ else
190
+ echo -e " ${RED}✗${NC} squad-awareness.md ausente"
191
+ fi
192
+
193
+ # Check commands
194
+ cmd_count=$(find .claude/commands/ -name "*.md" 2>/dev/null | wc -l | tr -d ' ')
195
+ if [ "$cmd_count" -gt 0 ]; then
196
+ echo -e " ${GREEN}✓${NC} $cmd_count command files"
197
+ else
198
+ echo -e " ${RED}✗${NC} Nenhum command file"
199
+ fi
200
+
201
+ echo ""
202
+ }
203
+
204
+ # ══════════════════════════════════════════════════════════════════════════════
205
+ # sinapse pull
206
+ # ══════════════════════════════════════════════════════════════════════════════
207
+
208
+ cmd_pull() {
209
+ header
210
+ echo -e "${BLUE}▸ Puxando atualizações do sinapse...${NC}"
211
+ echo ""
212
+
213
+ cd "$SCRIPT_DIR"
214
+ git pull
215
+ echo ""
216
+
217
+ # Se estamos num projeto com squads, atualizar
218
+ cd - > /dev/null
219
+ if [ -d "./squads" ]; then
220
+ echo -e "${BLUE}▸ Atualizando projeto atual...${NC}"
221
+ echo ""
222
+ bash "$SCRIPT_DIR/../scripts/update-squads.sh"
223
+ else
224
+ echo -e "${YELLOW}Não estamos em um projeto com squads. Só o repo foi atualizado.${NC}"
225
+ echo ""
226
+ fi
227
+ }
228
+
229
+ # ══════════════════════════════════════════════════════════════════════════════
230
+ # sinapse help
231
+ # ══════════════════════════════════════════════════════════════════════════════
232
+
233
+ cmd_help() {
234
+ header
235
+ echo -e "${BOLD}Comandos:${NC}"
236
+ echo ""
237
+ echo -e " ${CYAN}sinapse install${NC} Instala squads em projeto (primeira vez)"
238
+ echo -e " ${CYAN}sinapse update${NC} Atualiza squads (novas squads + awareness + commands)"
239
+ echo -e " ${CYAN}sinapse list${NC} Lista todas as squads disponíveis"
240
+ echo -e " ${CYAN}sinapse list agents <prefix>${NC} Lista agentes de uma squad (ex: sinapse list agents brand)"
241
+ echo -e " ${CYAN}sinapse status${NC} Status das squads no projeto atual"
242
+ echo -e " ${CYAN}sinapse pull${NC} Git pull + atualiza projeto atual"
243
+ echo -e " ${CYAN}sinapse help${NC} Mostra esta ajuda"
244
+ echo ""
245
+ echo -e "${BOLD}Setup (rodar uma vez):${NC}"
246
+ echo ""
247
+ echo -e " ${YELLOW}# Adicionar ao PATH:${NC}"
248
+ echo -e " echo 'export PATH=\"\$HOME/Workspace/caio-imori/sinapse:\$PATH\"' >> ~/.bashrc"
249
+ echo -e " source ~/.bashrc"
250
+ echo ""
251
+ echo -e "${BOLD}Uso típico:${NC}"
252
+ echo ""
253
+ echo -e " ${GREEN}# Projeto novo:${NC}"
254
+ echo -e " cd meu-projeto"
255
+ echo -e " sinapse install"
256
+ echo ""
257
+ echo -e " ${GREEN}# Projeto existente (após git pull no sinapse):${NC}"
258
+ echo -e " cd meu-projeto"
259
+ echo -e " sinapse update"
260
+ echo ""
261
+ echo -e " ${GREEN}# Tudo de uma vez (pull + update):${NC}"
262
+ echo -e " cd meu-projeto"
263
+ echo -e " sinapse pull"
264
+ echo ""
265
+ }
266
+
267
+ # ══════════════════════════════════════════════════════════════════════════════
268
+ # Router
269
+ # ══════════════════════════════════════════════════════════════════════════════
270
+
271
+ case "${1:-help}" in
272
+ install) cmd_install ;;
273
+ update) cmd_update ;;
274
+ list) shift; cmd_list "$@" ;;
275
+ status) cmd_status ;;
276
+ pull) cmd_pull ;;
277
+ help|--help|-h) cmd_help ;;
278
+ *)
279
+ echo -e "${RED}Comando desconhecido:${NC} $1"
280
+ echo -e "Rode ${CYAN}sinapse help${NC} para ver comandos disponíveis"
281
+ exit 1
282
+ ;;
283
+ esac
@@ -1,6 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  'use strict';
3
3
 
4
+ // Story 10.13 — sinapse-graph is internal/deprecated for end users.
5
+ // Story 10.30 (Cycle 5) — removed from package.json `bin` for v10.0.0.
6
+ // File kept in the repo for one release cycle as a forwarder, then
7
+ // deleted entirely in v11. The dashboard functionality is preserved
8
+ // for backward compat during the v11 transition window via direct
9
+ // `node bin/sinapse-graph.js` invocation only.
10
+ const { emitDeprecationWarning } = require('./utils/deprecation-warning');
11
+ emitDeprecationWarning('sinapse-graph');
12
+
4
13
  const { run } = require('../.sinapse-ai/core/graph-dashboard/cli');
5
14
 
6
15
  run(process.argv.slice(2)).catch((err) => {
@@ -557,6 +557,14 @@ async function main() {
557
557
  };
558
558
 
559
559
  // Step 1: Copy basic IDE rules files
560
+ // Story 10.38: Merge-only policy. If the target file already exists, we
561
+ // ALWAYS merge via MarkdownMerger — never overwrite — so that user custom
562
+ // rules in CLAUDE.md / instructions.md are preserved across re-installs.
563
+ const { MarkdownMerger } = require(path.join(
564
+ sourceCoreDir, '..', 'packages', 'installer', 'src', 'merger', 'strategies', 'markdown-merger.js'
565
+ ));
566
+ const markdownMerger = new MarkdownMerger();
567
+
560
568
  for (const ide of ides) {
561
569
  if (ide !== 'none' && ideRulesMap[ide]) {
562
570
  const ideConfig = ideRulesMap[ide];
@@ -565,10 +573,34 @@ async function main() {
565
573
 
566
574
  if (fs.existsSync(sourceRules)) {
567
575
  await fse.ensureDir(path.dirname(targetRules));
568
- await fse.copy(sourceRules, targetRules);
569
- console.log(
570
- chalk.green('✓') + ` ${ide.charAt(0).toUpperCase() + ide.slice(1)} base rules installed`
571
- );
576
+
577
+ const targetExists = fs.existsSync(targetRules);
578
+ if (targetExists) {
579
+ try {
580
+ const existing = await fse.readFile(targetRules, 'utf8');
581
+ const incoming = await fse.readFile(sourceRules, 'utf8');
582
+ const mergeResult = await markdownMerger.merge(existing, incoming);
583
+ await fse.writeFile(targetRules, mergeResult.content, 'utf8');
584
+ console.log(
585
+ chalk.green('✓') +
586
+ ` ${ide.charAt(0).toUpperCase() + ide.slice(1)} rules merged (existing content preserved)`
587
+ );
588
+ } catch (mergeErr) {
589
+ // Merge failed: back up existing file before overwriting so nothing is lost.
590
+ const backupPath = `${targetRules}.backup.${Date.now()}`;
591
+ await fse.copy(targetRules, backupPath);
592
+ await fse.copy(sourceRules, targetRules);
593
+ console.log(
594
+ chalk.yellow('⚠') +
595
+ ` ${ide} rules merge failed (${mergeErr.message}); existing file backed up to ${path.basename(backupPath)}`
596
+ );
597
+ }
598
+ } else {
599
+ await fse.copy(sourceRules, targetRules);
600
+ console.log(
601
+ chalk.green('✓') + ` ${ide.charAt(0).toUpperCase() + ide.slice(1)} base rules installed`
602
+ );
603
+ }
572
604
  }
573
605
  }
574
606
  }