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
@@ -1,127 +1,127 @@
1
- @echo off
2
- :: Claude Code - DeepSeek Native Mode with Usage Tracking
3
- :: Routes through local proxy to track per-alias usage
4
- :: Cost: ~$0.14/M tokens with tool calling support
5
-
6
- setlocal enabledelayedexpansion
7
-
8
- :: Configuration
9
- set "PROXY_PORT=8787"
10
- set "ALIAS=claude-free"
11
-
12
- :: Find tracker script
13
- if defined SINAPSE_HOME (
14
- set "TRACKER_SCRIPT=%SINAPSE_HOME%\.sinapse-ai\infrastructure\scripts\llm-routing\usage-tracker\index.js"
15
- if exist "!TRACKER_SCRIPT!" goto :tracker_found
16
- )
17
- set "TRACKER_SCRIPT=%USERPROFILE%\sinapse-ai\.sinapse-ai\infrastructure\scripts\llm-routing\usage-tracker\index.js"
18
- if exist "%TRACKER_SCRIPT%" goto :tracker_found
19
- set "TRACKER_SCRIPT=%USERPROFILE%\Workspaces\SINAPSE\SinapseAI\sinapse-ai\.sinapse-ai\infrastructure\scripts\llm-routing\usage-tracker\index.js"
20
- if exist "%TRACKER_SCRIPT%" goto :tracker_found
21
- set "TRACKER_SCRIPT=%~dp0..\usage-tracker\index.js"
22
- :tracker_found
23
-
24
- :: Find project root (look for .env file)
25
- set "PROJECT_ROOT=%CD%"
26
- set /a "LOOP_COUNT=0"
27
- :find_env
28
- set /a "LOOP_COUNT+=1"
29
- if %LOOP_COUNT% gtr 50 goto :no_env
30
- if exist "%PROJECT_ROOT%\.env" goto :found_env
31
- if "%PROJECT_ROOT%"=="%PROJECT_ROOT:~0,3%" goto :no_env
32
- for %%i in ("%PROJECT_ROOT%\..") do set "PROJECT_ROOT=%%~fi"
33
- goto :find_env
34
-
35
- :no_env
36
- if not "%DEEPSEEK_API_KEY%"=="" goto :use_env_key
37
-
38
- echo.
39
- echo [91mERROR: No .env file found and DEEPSEEK_API_KEY not set![0m
40
- echo.
41
- echo Options:
42
- echo 1. Create .env in your project: cp .env.example .env
43
- echo 2. Set DEEPSEEK_API_KEY in the .env file
44
- echo 3. Or set it globally: setx DEEPSEEK_API_KEY "sk-your-key"
45
- echo.
46
- echo Get your API key at: https://platform.deepseek.com/api_keys
47
- echo.
48
- pause
49
- exit /b 1
50
-
51
- :found_env
52
- :: Load DEEPSEEK_API_KEY from .env
53
- for /f "usebackq eol=# tokens=1,* delims==" %%a in ("%PROJECT_ROOT%\.env") do (
54
- if "%%a"=="DEEPSEEK_API_KEY" set "DEEPSEEK_API_KEY=%%b"
55
- )
56
- set "DEEPSEEK_API_KEY=!DEEPSEEK_API_KEY:"=!"
57
-
58
- if "!DEEPSEEK_API_KEY!"=="" (
59
- echo.
60
- echo [91mERROR: DEEPSEEK_API_KEY not found in .env![0m
61
- echo.
62
- pause
63
- exit /b 1
64
- )
65
-
66
- :use_env_key
67
- :: Check if proxy is running
68
- curl -s http://127.0.0.1:%PROXY_PORT%/health >nul 2>&1
69
- if %errorlevel% neq 0 (
70
- echo.
71
- echo [93mUsage Tracker proxy not running. Starting in background...[0m
72
-
73
- :: Start proxy in background
74
- start /b "" node "%TRACKER_SCRIPT%" start --port=%PROXY_PORT% --alias=%ALIAS% >nul 2>&1
75
-
76
- :: Wait for proxy to start
77
- timeout /t 2 /nobreak >nul
78
-
79
- :: Verify it started
80
- curl -s http://127.0.0.1:%PROXY_PORT%/health >nul 2>&1
81
- if %errorlevel% neq 0 (
82
- echo [91mFailed to start proxy. Falling back to direct connection.[0m
83
- goto :direct_connection
84
- )
85
- echo [92mProxy started successfully![0m
86
- )
87
-
88
- :: Use local proxy (proxy will forward to DeepSeek with original API key)
89
- set ANTHROPIC_BASE_URL=http://127.0.0.1:%PROXY_PORT%/anthropic
90
- set ANTHROPIC_API_KEY=%DEEPSEEK_API_KEY%
91
- set ANTHROPIC_MODEL=deepseek-chat
92
- set API_TIMEOUT_MS=600000
93
-
94
- echo.
95
- echo [92mClaude Code - DeepSeek Native Mode (TRACKED)[0m
96
- echo Proxy: 127.0.0.1:%PROXY_PORT%
97
- echo Alias: %ALIAS%
98
- echo [92mTool Calling: SUPPORTED[0m
99
- echo Cost: ~$0.14/M tokens
100
- echo.
101
- echo [96mUsage tracking enabled. Run 'deepseek-usage' to view stats.[0m
102
- echo.
103
-
104
- goto :run_claude
105
-
106
- :direct_connection
107
- :: Direct connection without tracking
108
- set ANTHROPIC_BASE_URL=https://api.deepseek.com/anthropic
109
- set ANTHROPIC_API_KEY=%DEEPSEEK_API_KEY%
110
- set ANTHROPIC_MODEL=deepseek-chat
111
- set API_TIMEOUT_MS=600000
112
-
113
- echo.
114
- echo [92mClaude Code - DeepSeek Native Mode (DIRECT)[0m
115
- echo Endpoint: api.deepseek.com/anthropic
116
- echo [93mUsage tracking: DISABLED (proxy not running)[0m
117
- echo.
118
-
119
- :run_claude
120
- endlocal & set "ANTHROPIC_BASE_URL=%ANTHROPIC_BASE_URL%" & set "ANTHROPIC_API_KEY=%DEEPSEEK_API_KEY%" & set "ANTHROPIC_MODEL=deepseek-chat" & set "API_TIMEOUT_MS=600000"
121
-
122
- >&2 echo.
123
- >&2 echo [93mWARNING: Running with --dangerously-skip-permissions (no confirmation prompts)[0m
124
- >&2 echo [93mOnly use in trusted repositories/environments.[0m
125
- >&2 echo.
126
-
127
- claude --dangerously-skip-permissions %*
1
+ @echo off
2
+ :: Claude Code - DeepSeek Native Mode with Usage Tracking
3
+ :: Routes through local proxy to track per-alias usage
4
+ :: Cost: ~$0.14/M tokens with tool calling support
5
+
6
+ setlocal enabledelayedexpansion
7
+
8
+ :: Configuration
9
+ set "PROXY_PORT=8787"
10
+ set "ALIAS=claude-free"
11
+
12
+ :: Find tracker script
13
+ if defined SINAPSE_HOME (
14
+ set "TRACKER_SCRIPT=%SINAPSE_HOME%\.sinapse-ai\infrastructure\scripts\llm-routing\usage-tracker\index.js"
15
+ if exist "!TRACKER_SCRIPT!" goto :tracker_found
16
+ )
17
+ set "TRACKER_SCRIPT=%USERPROFILE%\sinapse-ai\.sinapse-ai\infrastructure\scripts\llm-routing\usage-tracker\index.js"
18
+ if exist "%TRACKER_SCRIPT%" goto :tracker_found
19
+ set "TRACKER_SCRIPT=%USERPROFILE%\Workspaces\SINAPSE\SinapseAI\sinapse-ai\.sinapse-ai\infrastructure\scripts\llm-routing\usage-tracker\index.js"
20
+ if exist "%TRACKER_SCRIPT%" goto :tracker_found
21
+ set "TRACKER_SCRIPT=%~dp0..\usage-tracker\index.js"
22
+ :tracker_found
23
+
24
+ :: Find project root (look for .env file)
25
+ set "PROJECT_ROOT=%CD%"
26
+ set /a "LOOP_COUNT=0"
27
+ :find_env
28
+ set /a "LOOP_COUNT+=1"
29
+ if %LOOP_COUNT% gtr 50 goto :no_env
30
+ if exist "%PROJECT_ROOT%\.env" goto :found_env
31
+ if "%PROJECT_ROOT%"=="%PROJECT_ROOT:~0,3%" goto :no_env
32
+ for %%i in ("%PROJECT_ROOT%\..") do set "PROJECT_ROOT=%%~fi"
33
+ goto :find_env
34
+
35
+ :no_env
36
+ if not "%DEEPSEEK_API_KEY%"=="" goto :use_env_key
37
+
38
+ echo.
39
+ echo [91mERROR: No .env file found and DEEPSEEK_API_KEY not set![0m
40
+ echo.
41
+ echo Options:
42
+ echo 1. Create .env in your project: cp .env.example .env
43
+ echo 2. Set DEEPSEEK_API_KEY in the .env file
44
+ echo 3. Or set it globally: setx DEEPSEEK_API_KEY "sk-your-key"
45
+ echo.
46
+ echo Get your API key at: https://platform.deepseek.com/api_keys
47
+ echo.
48
+ pause
49
+ exit /b 1
50
+
51
+ :found_env
52
+ :: Load DEEPSEEK_API_KEY from .env
53
+ for /f "usebackq eol=# tokens=1,* delims==" %%a in ("%PROJECT_ROOT%\.env") do (
54
+ if "%%a"=="DEEPSEEK_API_KEY" set "DEEPSEEK_API_KEY=%%b"
55
+ )
56
+ set "DEEPSEEK_API_KEY=!DEEPSEEK_API_KEY:"=!"
57
+
58
+ if "!DEEPSEEK_API_KEY!"=="" (
59
+ echo.
60
+ echo [91mERROR: DEEPSEEK_API_KEY not found in .env![0m
61
+ echo.
62
+ pause
63
+ exit /b 1
64
+ )
65
+
66
+ :use_env_key
67
+ :: Check if proxy is running
68
+ curl -s http://127.0.0.1:%PROXY_PORT%/health >nul 2>&1
69
+ if %errorlevel% neq 0 (
70
+ echo.
71
+ echo [93mUsage Tracker proxy not running. Starting in background...[0m
72
+
73
+ :: Start proxy in background
74
+ start /b "" node "%TRACKER_SCRIPT%" start --port=%PROXY_PORT% --alias=%ALIAS% >nul 2>&1
75
+
76
+ :: Wait for proxy to start
77
+ timeout /t 2 /nobreak >nul
78
+
79
+ :: Verify it started
80
+ curl -s http://127.0.0.1:%PROXY_PORT%/health >nul 2>&1
81
+ if %errorlevel% neq 0 (
82
+ echo [91mFailed to start proxy. Falling back to direct connection.[0m
83
+ goto :direct_connection
84
+ )
85
+ echo [92mProxy started successfully![0m
86
+ )
87
+
88
+ :: Use local proxy (proxy will forward to DeepSeek with original API key)
89
+ set ANTHROPIC_BASE_URL=http://127.0.0.1:%PROXY_PORT%/anthropic
90
+ set ANTHROPIC_API_KEY=%DEEPSEEK_API_KEY%
91
+ set ANTHROPIC_MODEL=deepseek-chat
92
+ set API_TIMEOUT_MS=600000
93
+
94
+ echo.
95
+ echo [92mClaude Code - DeepSeek Native Mode (TRACKED)[0m
96
+ echo Proxy: 127.0.0.1:%PROXY_PORT%
97
+ echo Alias: %ALIAS%
98
+ echo [92mTool Calling: SUPPORTED[0m
99
+ echo Cost: ~$0.14/M tokens
100
+ echo.
101
+ echo [96mUsage tracking enabled. Run 'deepseek-usage' to view stats.[0m
102
+ echo.
103
+
104
+ goto :run_claude
105
+
106
+ :direct_connection
107
+ :: Direct connection without tracking
108
+ set ANTHROPIC_BASE_URL=https://api.deepseek.com/anthropic
109
+ set ANTHROPIC_API_KEY=%DEEPSEEK_API_KEY%
110
+ set ANTHROPIC_MODEL=deepseek-chat
111
+ set API_TIMEOUT_MS=600000
112
+
113
+ echo.
114
+ echo [92mClaude Code - DeepSeek Native Mode (DIRECT)[0m
115
+ echo Endpoint: api.deepseek.com/anthropic
116
+ echo [93mUsage tracking: DISABLED (proxy not running)[0m
117
+ echo.
118
+
119
+ :run_claude
120
+ endlocal & set "ANTHROPIC_BASE_URL=%ANTHROPIC_BASE_URL%" & set "ANTHROPIC_API_KEY=%DEEPSEEK_API_KEY%" & set "ANTHROPIC_MODEL=deepseek-chat" & set "API_TIMEOUT_MS=600000"
121
+
122
+ >&2 echo.
123
+ >&2 echo [93mWARNING: Running with --dangerously-skip-permissions (no confirmation prompts)[0m
124
+ >&2 echo [93mOnly use in trusted repositories/environments.[0m
125
+ >&2 echo.
126
+
127
+ claude --dangerously-skip-permissions %*
@@ -1,71 +1,71 @@
1
- @echo off
2
- :: DeepSeek Usage Tracker Proxy Manager
3
- :: Start/stop the tracking proxy server
4
-
5
- setlocal enabledelayedexpansion
6
-
7
- set "PROXY_PORT=8787"
8
-
9
- :: Try multiple locations for the tracker script
10
- if defined SINAPSE_HOME (
11
- set "TRACKER_SCRIPT=%SINAPSE_HOME%\.sinapse-ai\infrastructure\scripts\llm-routing\usage-tracker\index.js"
12
- if exist "!TRACKER_SCRIPT!" goto :found
13
- )
14
-
15
- set "TRACKER_SCRIPT=%USERPROFILE%\sinapse-ai\.sinapse-ai\infrastructure\scripts\llm-routing\usage-tracker\index.js"
16
- if exist "%TRACKER_SCRIPT%" goto :found
17
-
18
- set "TRACKER_SCRIPT=%USERPROFILE%\Workspaces\SINAPSE\SinapseAI\sinapse-ai\.sinapse-ai\infrastructure\scripts\llm-routing\usage-tracker\index.js"
19
- if exist "%TRACKER_SCRIPT%" goto :found
20
-
21
- set "TRACKER_SCRIPT=%~dp0..\usage-tracker\index.js"
22
- if exist "%TRACKER_SCRIPT%" goto :found
23
-
24
- echo [91mERROR: Usage tracker not found![0m
25
- exit /b 1
26
-
27
- :found
28
- :: Check if Node.js is available
29
- where node >nul 2>&1
30
- if %errorlevel% neq 0 (
31
- echo [91mERROR: Node.js not found in PATH[0m
32
- exit /b 1
33
- )
34
-
35
- if "%1"=="start" (
36
- echo Starting DeepSeek Usage Tracker Proxy...
37
- node "%TRACKER_SCRIPT%" start --port=%PROXY_PORT% --alias=claude-free
38
- goto :eof
39
- )
40
-
41
- if "%1"=="stop" (
42
- echo Stopping proxy on port %PROXY_PORT%...
43
- for /f "tokens=5" %%a in ('netstat -ano ^| findstr ":%PROXY_PORT%.*LISTENING"') do (
44
- taskkill /PID %%a /F >nul 2>&1
45
- )
46
- echo Proxy stopped.
47
- goto :eof
48
- )
49
-
50
- if "%1"=="status" (
51
- curl -s http://127.0.0.1:%PROXY_PORT%/health >nul 2>&1
52
- if %errorlevel% equ 0 (
53
- echo [92mProxy is running on port %PROXY_PORT%[0m
54
- curl -s http://127.0.0.1:%PROXY_PORT%/health
55
- ) else (
56
- echo [93mProxy is not running[0m
57
- )
58
- goto :eof
59
- )
60
-
61
- echo DeepSeek Usage Tracker Proxy
62
- echo.
63
- echo Usage:
64
- echo deepseek-proxy start Start the proxy server
65
- echo deepseek-proxy stop Stop the proxy server
66
- echo deepseek-proxy status Check if proxy is running
67
- echo.
68
- echo The proxy runs on port %PROXY_PORT% by default.
69
- echo.
70
-
71
- endlocal
1
+ @echo off
2
+ :: DeepSeek Usage Tracker Proxy Manager
3
+ :: Start/stop the tracking proxy server
4
+
5
+ setlocal enabledelayedexpansion
6
+
7
+ set "PROXY_PORT=8787"
8
+
9
+ :: Try multiple locations for the tracker script
10
+ if defined SINAPSE_HOME (
11
+ set "TRACKER_SCRIPT=%SINAPSE_HOME%\.sinapse-ai\infrastructure\scripts\llm-routing\usage-tracker\index.js"
12
+ if exist "!TRACKER_SCRIPT!" goto :found
13
+ )
14
+
15
+ set "TRACKER_SCRIPT=%USERPROFILE%\sinapse-ai\.sinapse-ai\infrastructure\scripts\llm-routing\usage-tracker\index.js"
16
+ if exist "%TRACKER_SCRIPT%" goto :found
17
+
18
+ set "TRACKER_SCRIPT=%USERPROFILE%\Workspaces\SINAPSE\SinapseAI\sinapse-ai\.sinapse-ai\infrastructure\scripts\llm-routing\usage-tracker\index.js"
19
+ if exist "%TRACKER_SCRIPT%" goto :found
20
+
21
+ set "TRACKER_SCRIPT=%~dp0..\usage-tracker\index.js"
22
+ if exist "%TRACKER_SCRIPT%" goto :found
23
+
24
+ echo [91mERROR: Usage tracker not found![0m
25
+ exit /b 1
26
+
27
+ :found
28
+ :: Check if Node.js is available
29
+ where node >nul 2>&1
30
+ if %errorlevel% neq 0 (
31
+ echo [91mERROR: Node.js not found in PATH[0m
32
+ exit /b 1
33
+ )
34
+
35
+ if "%1"=="start" (
36
+ echo Starting DeepSeek Usage Tracker Proxy...
37
+ node "%TRACKER_SCRIPT%" start --port=%PROXY_PORT% --alias=claude-free
38
+ goto :eof
39
+ )
40
+
41
+ if "%1"=="stop" (
42
+ echo Stopping proxy on port %PROXY_PORT%...
43
+ for /f "tokens=5" %%a in ('netstat -ano ^| findstr ":%PROXY_PORT%.*LISTENING"') do (
44
+ taskkill /PID %%a /F >nul 2>&1
45
+ )
46
+ echo Proxy stopped.
47
+ goto :eof
48
+ )
49
+
50
+ if "%1"=="status" (
51
+ curl -s http://127.0.0.1:%PROXY_PORT%/health >nul 2>&1
52
+ if %errorlevel% equ 0 (
53
+ echo [92mProxy is running on port %PROXY_PORT%[0m
54
+ curl -s http://127.0.0.1:%PROXY_PORT%/health
55
+ ) else (
56
+ echo [93mProxy is not running[0m
57
+ )
58
+ goto :eof
59
+ )
60
+
61
+ echo DeepSeek Usage Tracker Proxy
62
+ echo.
63
+ echo Usage:
64
+ echo deepseek-proxy start Start the proxy server
65
+ echo deepseek-proxy stop Stop the proxy server
66
+ echo deepseek-proxy status Check if proxy is running
67
+ echo.
68
+ echo The proxy runs on port %PROXY_PORT% by default.
69
+ echo.
70
+
71
+ endlocal
@@ -1,51 +1,51 @@
1
- @echo off
2
- :: DeepSeek Usage Statistics CLI
3
- :: View usage tracking data per alias
4
-
5
- setlocal
6
-
7
- :: Try multiple locations for the tracker script
8
- :: 1. Environment variable (if set during installation)
9
- if defined SINAPSE_HOME (
10
- set "TRACKER_SCRIPT=%SINAPSE_HOME%\.sinapse-ai\infrastructure\scripts\llm-routing\usage-tracker\index.js"
11
- if exist "%TRACKER_SCRIPT%" goto :found
12
- )
13
-
14
- :: 2. Common installation locations
15
- set "TRACKER_SCRIPT=%USERPROFILE%\sinapse-ai\.sinapse-ai\infrastructure\scripts\llm-routing\usage-tracker\index.js"
16
- if exist "%TRACKER_SCRIPT%" goto :found
17
-
18
- set "TRACKER_SCRIPT=%USERPROFILE%\Workspaces\SINAPSE\SinapseAI\sinapse-ai\.sinapse-ai\infrastructure\scripts\llm-routing\usage-tracker\index.js"
19
- if exist "%TRACKER_SCRIPT%" goto :found
20
-
21
- :: 3. Relative to this script (for development)
22
- set "TRACKER_SCRIPT=%~dp0..\usage-tracker\index.js"
23
- if exist "%TRACKER_SCRIPT%" goto :found
24
-
25
- :: 4. Global npm package location
26
- set "TRACKER_SCRIPT=%APPDATA%\npm\node_modules\@sinapse-fullstack\core\.sinapse-ai\infrastructure\scripts\llm-routing\usage-tracker\index.js"
27
- if exist "%TRACKER_SCRIPT%" goto :found
28
-
29
- echo [91mERROR: Usage tracker not found![0m
30
- echo.
31
- echo Please ensure SINAPSE is installed correctly.
32
- echo Expected locations:
33
- echo - %%SINAPSE_HOME%%\.sinapse-ai\infrastructure\scripts\llm-routing\usage-tracker\
34
- echo - %%USERPROFILE%%\sinapse-ai\.sinapse-ai\infrastructure\scripts\llm-routing\usage-tracker\
35
- echo.
36
- echo Set SINAPSE_HOME environment variable: setx SINAPSE_HOME "C:\path\to\sinapse-ai"
37
- exit /b 1
38
-
39
- :found
40
- :: Check if Node.js is available
41
- where node >nul 2>&1
42
- if %errorlevel% neq 0 (
43
- echo [91mERROR: Node.js not found in PATH[0m
44
- echo Please install Node.js from https://nodejs.org/
45
- exit /b 1
46
- )
47
-
48
- :: Pass arguments to tracker
49
- node "%TRACKER_SCRIPT%" usage %*
50
-
51
- endlocal
1
+ @echo off
2
+ :: DeepSeek Usage Statistics CLI
3
+ :: View usage tracking data per alias
4
+
5
+ setlocal
6
+
7
+ :: Try multiple locations for the tracker script
8
+ :: 1. Environment variable (if set during installation)
9
+ if defined SINAPSE_HOME (
10
+ set "TRACKER_SCRIPT=%SINAPSE_HOME%\.sinapse-ai\infrastructure\scripts\llm-routing\usage-tracker\index.js"
11
+ if exist "%TRACKER_SCRIPT%" goto :found
12
+ )
13
+
14
+ :: 2. Common installation locations
15
+ set "TRACKER_SCRIPT=%USERPROFILE%\sinapse-ai\.sinapse-ai\infrastructure\scripts\llm-routing\usage-tracker\index.js"
16
+ if exist "%TRACKER_SCRIPT%" goto :found
17
+
18
+ set "TRACKER_SCRIPT=%USERPROFILE%\Workspaces\SINAPSE\SinapseAI\sinapse-ai\.sinapse-ai\infrastructure\scripts\llm-routing\usage-tracker\index.js"
19
+ if exist "%TRACKER_SCRIPT%" goto :found
20
+
21
+ :: 3. Relative to this script (for development)
22
+ set "TRACKER_SCRIPT=%~dp0..\usage-tracker\index.js"
23
+ if exist "%TRACKER_SCRIPT%" goto :found
24
+
25
+ :: 4. Global npm package location
26
+ set "TRACKER_SCRIPT=%APPDATA%\npm\node_modules\@sinapse-fullstack\core\.sinapse-ai\infrastructure\scripts\llm-routing\usage-tracker\index.js"
27
+ if exist "%TRACKER_SCRIPT%" goto :found
28
+
29
+ echo [91mERROR: Usage tracker not found![0m
30
+ echo.
31
+ echo Please ensure SINAPSE is installed correctly.
32
+ echo Expected locations:
33
+ echo - %%SINAPSE_HOME%%\.sinapse-ai\infrastructure\scripts\llm-routing\usage-tracker\
34
+ echo - %%USERPROFILE%%\sinapse-ai\.sinapse-ai\infrastructure\scripts\llm-routing\usage-tracker\
35
+ echo.
36
+ echo Set SINAPSE_HOME environment variable: setx SINAPSE_HOME "C:\path\to\sinapse-ai"
37
+ exit /b 1
38
+
39
+ :found
40
+ :: Check if Node.js is available
41
+ where node >nul 2>&1
42
+ if %errorlevel% neq 0 (
43
+ echo [91mERROR: Node.js not found in PATH[0m
44
+ echo Please install Node.js from https://nodejs.org/
45
+ exit /b 1
46
+ )
47
+
48
+ :: Pass arguments to tracker
49
+ node "%TRACKER_SCRIPT%" usage %*
50
+
51
+ endlocal
@@ -13,7 +13,7 @@
13
13
  * Based on Auto-Claude's AI PR Reviewer architecture.
14
14
  */
15
15
 
16
- const { execSync } = require('child_process');
16
+ const { execSync, execFileSync } = require('child_process');
17
17
  const fs = require('fs');
18
18
  const path = require('path');
19
19
  const EventEmitter = require('events');
@@ -577,8 +577,9 @@ Respond with a JSON object:
577
577
  async callClaude(prompt) {
578
578
  return new Promise((resolve, reject) => {
579
579
  try {
580
- const result = execSync(
581
- `claude --print --dangerously-skip-permissions -p "${prompt.replace(/"/g, '\\"').replace(/\n/g, '\\n').replace(/`/g, '\\`')}"`,
580
+ const result = execFileSync(
581
+ 'claude',
582
+ ['--print', '--dangerously-skip-permissions', '-p', prompt],
582
583
  {
583
584
  encoding: 'utf8',
584
585
  maxBuffer: 10 * 1024 * 1024,
@@ -705,9 +706,10 @@ class PRReviewAI extends EventEmitter {
705
706
  */
706
707
  async fetchPRData(prNumber) {
707
708
  try {
708
- // Get PR info
709
- const prJson = execSync(
710
- `gh pr view ${prNumber} --json title,body,author,baseRefName,headRefName,files,additions,deletions`,
709
+ // Get PR info (use execFileSync array form to prevent shell injection)
710
+ const prJson = execFileSync(
711
+ 'gh',
712
+ ['pr', 'view', String(prNumber), '--json', 'title,body,author,baseRefName,headRefName,files,additions,deletions'],
711
713
  {
712
714
  cwd: this.rootPath,
713
715
  encoding: 'utf8',
@@ -716,7 +718,7 @@ class PRReviewAI extends EventEmitter {
716
718
  const pr = JSON.parse(prJson);
717
719
 
718
720
  // Get diff
719
- const diff = execSync(`gh pr diff ${prNumber}`, {
721
+ const diff = execFileSync('gh', ['pr', 'diff', String(prNumber)], {
720
722
  cwd: this.rootPath,
721
723
  encoding: 'utf8',
722
724
  maxBuffer: 50 * 1024 * 1024,
@@ -842,16 +844,17 @@ class PRReviewAI extends EventEmitter {
842
844
  const body = this.formatReviewBody(review);
843
845
 
844
846
  try {
845
- // Post as PR comment
846
- execSync(`gh pr comment ${prNumber} --body "${body.replace(/"/g, '\\"')}"`, {
847
+ // Post as PR comment (use execFileSync array form to prevent shell injection)
848
+ execFileSync('gh', ['pr', 'comment', String(prNumber), '--body', body], {
847
849
  cwd: this.rootPath,
848
850
  encoding: 'utf8',
849
851
  });
850
852
 
851
853
  // If requesting changes, also submit a review
852
854
  if (review.verdict === Verdict.REQUEST_CHANGES) {
853
- execSync(
854
- `gh pr review ${prNumber} --request-changes --body "Please address the issues found by the automated review."`,
855
+ execFileSync(
856
+ 'gh',
857
+ ['pr', 'review', String(prNumber), '--request-changes', '--body', 'Please address the issues found by the automated review.'],
855
858
  {
856
859
  cwd: this.rootPath,
857
860
  encoding: 'utf8',
@@ -861,7 +864,7 @@ class PRReviewAI extends EventEmitter {
861
864
  review.verdict === Verdict.APPROVE &&
862
865
  review.findings.filter((f) => f.severity === Severity.CRITICAL).length === 0
863
866
  ) {
864
- execSync(`gh pr review ${prNumber} --approve --body "LGTM! Automated review passed."`, {
867
+ execFileSync('gh', ['pr', 'review', String(prNumber), '--approve', '--body', 'LGTM! Automated review passed.'], {
865
868
  cwd: this.rootPath,
866
869
  encoding: 'utf8',
867
870
  });
@@ -931,7 +934,7 @@ class PRReviewAI extends EventEmitter {
931
934
  * Review local changes (not yet in PR)
932
935
  */
933
936
  async reviewLocal(baseBranch = 'main') {
934
- const diff = execSync(`git diff ${baseBranch}...HEAD`, {
937
+ const diff = execFileSync('git', ['diff', `${baseBranch}...HEAD`], {
935
938
  cwd: this.rootPath,
936
939
  encoding: 'utf8',
937
940
  });