@peakinfer/cli 1.0.133

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 (367) hide show
  1. package/.claude/settings.local.json +8 -0
  2. package/.env.example +6 -0
  3. package/.github/workflows/peakinfer.yml +64 -0
  4. package/CHANGELOG.md +31 -0
  5. package/LICENSE +190 -0
  6. package/README.md +335 -0
  7. package/data/inferencemax.json +274 -0
  8. package/dist/agent-analyzer.d.ts +45 -0
  9. package/dist/agent-analyzer.d.ts.map +1 -0
  10. package/dist/agent-analyzer.js +374 -0
  11. package/dist/agent-analyzer.js.map +1 -0
  12. package/dist/agent.d.ts +76 -0
  13. package/dist/agent.d.ts.map +1 -0
  14. package/dist/agent.js +965 -0
  15. package/dist/agent.js.map +1 -0
  16. package/dist/agents/correlation-analyzer.d.ts +34 -0
  17. package/dist/agents/correlation-analyzer.d.ts.map +1 -0
  18. package/dist/agents/correlation-analyzer.js +261 -0
  19. package/dist/agents/correlation-analyzer.js.map +1 -0
  20. package/dist/agents/index.d.ts +91 -0
  21. package/dist/agents/index.d.ts.map +1 -0
  22. package/dist/agents/index.js +111 -0
  23. package/dist/agents/index.js.map +1 -0
  24. package/dist/agents/runtime-analyzer.d.ts +38 -0
  25. package/dist/agents/runtime-analyzer.d.ts.map +1 -0
  26. package/dist/agents/runtime-analyzer.js +244 -0
  27. package/dist/agents/runtime-analyzer.js.map +1 -0
  28. package/dist/analysis-types.d.ts +500 -0
  29. package/dist/analysis-types.d.ts.map +1 -0
  30. package/dist/analysis-types.js +11 -0
  31. package/dist/analysis-types.js.map +1 -0
  32. package/dist/analytics.d.ts +25 -0
  33. package/dist/analytics.d.ts.map +1 -0
  34. package/dist/analytics.js +94 -0
  35. package/dist/analytics.js.map +1 -0
  36. package/dist/analyzer.d.ts +48 -0
  37. package/dist/analyzer.d.ts.map +1 -0
  38. package/dist/analyzer.js +547 -0
  39. package/dist/analyzer.js.map +1 -0
  40. package/dist/artifacts.d.ts +44 -0
  41. package/dist/artifacts.d.ts.map +1 -0
  42. package/dist/artifacts.js +165 -0
  43. package/dist/artifacts.js.map +1 -0
  44. package/dist/benchmarks/index.d.ts +88 -0
  45. package/dist/benchmarks/index.d.ts.map +1 -0
  46. package/dist/benchmarks/index.js +205 -0
  47. package/dist/benchmarks/index.js.map +1 -0
  48. package/dist/cli.d.ts +3 -0
  49. package/dist/cli.d.ts.map +1 -0
  50. package/dist/cli.js +427 -0
  51. package/dist/cli.js.map +1 -0
  52. package/dist/commands/ci.d.ts +19 -0
  53. package/dist/commands/ci.d.ts.map +1 -0
  54. package/dist/commands/ci.js +253 -0
  55. package/dist/commands/ci.js.map +1 -0
  56. package/dist/commands/config.d.ts +16 -0
  57. package/dist/commands/config.d.ts.map +1 -0
  58. package/dist/commands/config.js +249 -0
  59. package/dist/commands/config.js.map +1 -0
  60. package/dist/commands/demo.d.ts +15 -0
  61. package/dist/commands/demo.d.ts.map +1 -0
  62. package/dist/commands/demo.js +106 -0
  63. package/dist/commands/demo.js.map +1 -0
  64. package/dist/commands/export.d.ts +14 -0
  65. package/dist/commands/export.d.ts.map +1 -0
  66. package/dist/commands/export.js +209 -0
  67. package/dist/commands/export.js.map +1 -0
  68. package/dist/commands/history.d.ts +15 -0
  69. package/dist/commands/history.d.ts.map +1 -0
  70. package/dist/commands/history.js +389 -0
  71. package/dist/commands/history.js.map +1 -0
  72. package/dist/commands/template.d.ts +14 -0
  73. package/dist/commands/template.d.ts.map +1 -0
  74. package/dist/commands/template.js +341 -0
  75. package/dist/commands/template.js.map +1 -0
  76. package/dist/commands/validate-map.d.ts +12 -0
  77. package/dist/commands/validate-map.d.ts.map +1 -0
  78. package/dist/commands/validate-map.js +274 -0
  79. package/dist/commands/validate-map.js.map +1 -0
  80. package/dist/commands/whatif.d.ts +17 -0
  81. package/dist/commands/whatif.d.ts.map +1 -0
  82. package/dist/commands/whatif.js +206 -0
  83. package/dist/commands/whatif.js.map +1 -0
  84. package/dist/comparison.d.ts +38 -0
  85. package/dist/comparison.d.ts.map +1 -0
  86. package/dist/comparison.js +223 -0
  87. package/dist/comparison.js.map +1 -0
  88. package/dist/config.d.ts +42 -0
  89. package/dist/config.d.ts.map +1 -0
  90. package/dist/config.js +158 -0
  91. package/dist/config.js.map +1 -0
  92. package/dist/connectors/helicone.d.ts +9 -0
  93. package/dist/connectors/helicone.d.ts.map +1 -0
  94. package/dist/connectors/helicone.js +106 -0
  95. package/dist/connectors/helicone.js.map +1 -0
  96. package/dist/connectors/index.d.ts +37 -0
  97. package/dist/connectors/index.d.ts.map +1 -0
  98. package/dist/connectors/index.js +65 -0
  99. package/dist/connectors/index.js.map +1 -0
  100. package/dist/connectors/langsmith.d.ts +9 -0
  101. package/dist/connectors/langsmith.d.ts.map +1 -0
  102. package/dist/connectors/langsmith.js +122 -0
  103. package/dist/connectors/langsmith.js.map +1 -0
  104. package/dist/connectors/types.d.ts +83 -0
  105. package/dist/connectors/types.d.ts.map +1 -0
  106. package/dist/connectors/types.js +98 -0
  107. package/dist/connectors/types.js.map +1 -0
  108. package/dist/cost-estimator.d.ts +46 -0
  109. package/dist/cost-estimator.d.ts.map +1 -0
  110. package/dist/cost-estimator.js +104 -0
  111. package/dist/cost-estimator.js.map +1 -0
  112. package/dist/costs.d.ts +57 -0
  113. package/dist/costs.d.ts.map +1 -0
  114. package/dist/costs.js +251 -0
  115. package/dist/costs.js.map +1 -0
  116. package/dist/counterfactuals.d.ts +29 -0
  117. package/dist/counterfactuals.d.ts.map +1 -0
  118. package/dist/counterfactuals.js +448 -0
  119. package/dist/counterfactuals.js.map +1 -0
  120. package/dist/enhancement-prompts.d.ts +41 -0
  121. package/dist/enhancement-prompts.d.ts.map +1 -0
  122. package/dist/enhancement-prompts.js +88 -0
  123. package/dist/enhancement-prompts.js.map +1 -0
  124. package/dist/envelopes.d.ts +20 -0
  125. package/dist/envelopes.d.ts.map +1 -0
  126. package/dist/envelopes.js +790 -0
  127. package/dist/envelopes.js.map +1 -0
  128. package/dist/format-normalizer.d.ts +71 -0
  129. package/dist/format-normalizer.d.ts.map +1 -0
  130. package/dist/format-normalizer.js +1331 -0
  131. package/dist/format-normalizer.js.map +1 -0
  132. package/dist/history.d.ts +79 -0
  133. package/dist/history.d.ts.map +1 -0
  134. package/dist/history.js +313 -0
  135. package/dist/history.js.map +1 -0
  136. package/dist/html.d.ts +11 -0
  137. package/dist/html.d.ts.map +1 -0
  138. package/dist/html.js +463 -0
  139. package/dist/html.js.map +1 -0
  140. package/dist/impact.d.ts +42 -0
  141. package/dist/impact.d.ts.map +1 -0
  142. package/dist/impact.js +443 -0
  143. package/dist/impact.js.map +1 -0
  144. package/dist/index.d.ts +26 -0
  145. package/dist/index.d.ts.map +1 -0
  146. package/dist/index.js +34 -0
  147. package/dist/index.js.map +1 -0
  148. package/dist/insights.d.ts +5 -0
  149. package/dist/insights.d.ts.map +1 -0
  150. package/dist/insights.js +271 -0
  151. package/dist/insights.js.map +1 -0
  152. package/dist/joiner.d.ts +9 -0
  153. package/dist/joiner.d.ts.map +1 -0
  154. package/dist/joiner.js +247 -0
  155. package/dist/joiner.js.map +1 -0
  156. package/dist/orchestrator.d.ts +34 -0
  157. package/dist/orchestrator.d.ts.map +1 -0
  158. package/dist/orchestrator.js +827 -0
  159. package/dist/orchestrator.js.map +1 -0
  160. package/dist/pdf.d.ts +26 -0
  161. package/dist/pdf.d.ts.map +1 -0
  162. package/dist/pdf.js +84 -0
  163. package/dist/pdf.js.map +1 -0
  164. package/dist/prediction.d.ts +33 -0
  165. package/dist/prediction.d.ts.map +1 -0
  166. package/dist/prediction.js +316 -0
  167. package/dist/prediction.js.map +1 -0
  168. package/dist/prompts/loader.d.ts +38 -0
  169. package/dist/prompts/loader.d.ts.map +1 -0
  170. package/dist/prompts/loader.js +60 -0
  171. package/dist/prompts/loader.js.map +1 -0
  172. package/dist/renderer.d.ts +64 -0
  173. package/dist/renderer.d.ts.map +1 -0
  174. package/dist/renderer.js +923 -0
  175. package/dist/renderer.js.map +1 -0
  176. package/dist/runid.d.ts +57 -0
  177. package/dist/runid.d.ts.map +1 -0
  178. package/dist/runid.js +199 -0
  179. package/dist/runid.js.map +1 -0
  180. package/dist/runtime.d.ts +29 -0
  181. package/dist/runtime.d.ts.map +1 -0
  182. package/dist/runtime.js +366 -0
  183. package/dist/runtime.js.map +1 -0
  184. package/dist/scanner.d.ts +11 -0
  185. package/dist/scanner.d.ts.map +1 -0
  186. package/dist/scanner.js +426 -0
  187. package/dist/scanner.js.map +1 -0
  188. package/dist/templates.d.ts +120 -0
  189. package/dist/templates.d.ts.map +1 -0
  190. package/dist/templates.js +429 -0
  191. package/dist/templates.js.map +1 -0
  192. package/dist/tools/index.d.ts +153 -0
  193. package/dist/tools/index.d.ts.map +1 -0
  194. package/dist/tools/index.js +177 -0
  195. package/dist/tools/index.js.map +1 -0
  196. package/dist/types.d.ts +3647 -0
  197. package/dist/types.d.ts.map +1 -0
  198. package/dist/types.js +703 -0
  199. package/dist/types.js.map +1 -0
  200. package/dist/version.d.ts +7 -0
  201. package/dist/version.d.ts.map +1 -0
  202. package/dist/version.js +23 -0
  203. package/dist/version.js.map +1 -0
  204. package/docs/demo-guide.md +423 -0
  205. package/docs/events-format.md +295 -0
  206. package/docs/inferencemap-spec.md +344 -0
  207. package/docs/migration-v2.md +293 -0
  208. package/fixtures/demo/precomputed.json +142 -0
  209. package/fixtures/demo-project/README.md +52 -0
  210. package/fixtures/demo-project/ai-service.ts +65 -0
  211. package/fixtures/demo-project/sample-events.jsonl +15 -0
  212. package/fixtures/demo-project/src/ai-service.ts +128 -0
  213. package/fixtures/demo-project/src/llm-client.ts +155 -0
  214. package/package.json +65 -0
  215. package/prompts/agent-analyzer.yaml +47 -0
  216. package/prompts/ci-gate.yaml +98 -0
  217. package/prompts/correlation-analyzer.yaml +178 -0
  218. package/prompts/format-normalizer.yaml +46 -0
  219. package/prompts/peak-performance.yaml +180 -0
  220. package/prompts/pr-comment.yaml +111 -0
  221. package/prompts/runtime-analyzer.yaml +189 -0
  222. package/prompts/unified-analyzer.yaml +241 -0
  223. package/schemas/inference-map.v0.1.json +215 -0
  224. package/scripts/benchmark.ts +394 -0
  225. package/scripts/demo-v1.5.sh +158 -0
  226. package/scripts/sync-from-site.sh +197 -0
  227. package/scripts/validate-sync.sh +178 -0
  228. package/src/agent-analyzer.ts +481 -0
  229. package/src/agent.ts +1232 -0
  230. package/src/agents/correlation-analyzer.ts +353 -0
  231. package/src/agents/index.ts +235 -0
  232. package/src/agents/runtime-analyzer.ts +343 -0
  233. package/src/analysis-types.ts +558 -0
  234. package/src/analytics.ts +100 -0
  235. package/src/analyzer.ts +692 -0
  236. package/src/artifacts.ts +218 -0
  237. package/src/benchmarks/index.ts +309 -0
  238. package/src/cli.ts +503 -0
  239. package/src/commands/ci.ts +336 -0
  240. package/src/commands/config.ts +288 -0
  241. package/src/commands/demo.ts +175 -0
  242. package/src/commands/export.ts +297 -0
  243. package/src/commands/history.ts +425 -0
  244. package/src/commands/template.ts +385 -0
  245. package/src/commands/validate-map.ts +324 -0
  246. package/src/commands/whatif.ts +272 -0
  247. package/src/comparison.ts +283 -0
  248. package/src/config.ts +188 -0
  249. package/src/connectors/helicone.ts +164 -0
  250. package/src/connectors/index.ts +93 -0
  251. package/src/connectors/langsmith.ts +179 -0
  252. package/src/connectors/types.ts +180 -0
  253. package/src/cost-estimator.ts +146 -0
  254. package/src/costs.ts +347 -0
  255. package/src/counterfactuals.ts +516 -0
  256. package/src/enhancement-prompts.ts +118 -0
  257. package/src/envelopes.ts +814 -0
  258. package/src/format-normalizer.ts +1486 -0
  259. package/src/history.ts +400 -0
  260. package/src/html.ts +512 -0
  261. package/src/impact.ts +522 -0
  262. package/src/index.ts +83 -0
  263. package/src/insights.ts +341 -0
  264. package/src/joiner.ts +289 -0
  265. package/src/orchestrator.ts +1015 -0
  266. package/src/pdf.ts +110 -0
  267. package/src/prediction.ts +392 -0
  268. package/src/prompts/loader.ts +88 -0
  269. package/src/renderer.ts +1045 -0
  270. package/src/runid.ts +261 -0
  271. package/src/runtime.ts +450 -0
  272. package/src/scanner.ts +508 -0
  273. package/src/templates.ts +561 -0
  274. package/src/tools/index.ts +214 -0
  275. package/src/types.ts +873 -0
  276. package/src/version.ts +24 -0
  277. package/templates/context-accumulation.yaml +23 -0
  278. package/templates/cost-concentration.yaml +20 -0
  279. package/templates/dead-code.yaml +20 -0
  280. package/templates/latency-explainer.yaml +23 -0
  281. package/templates/optimizations/ab-testing-framework.yaml +74 -0
  282. package/templates/optimizations/api-gateway-optimization.yaml +81 -0
  283. package/templates/optimizations/api-model-routing-strategy.yaml +126 -0
  284. package/templates/optimizations/auto-scaling-optimization.yaml +85 -0
  285. package/templates/optimizations/batch-utilization-diagnostic.yaml +142 -0
  286. package/templates/optimizations/comprehensive-apm.yaml +76 -0
  287. package/templates/optimizations/context-window-optimization.yaml +91 -0
  288. package/templates/optimizations/cost-sensitive-batch-processing.yaml +77 -0
  289. package/templates/optimizations/distributed-training-optimization.yaml +77 -0
  290. package/templates/optimizations/document-analysis-edge.yaml +77 -0
  291. package/templates/optimizations/document-pipeline-optimization.yaml +78 -0
  292. package/templates/optimizations/domain-specific-distillation.yaml +78 -0
  293. package/templates/optimizations/error-handling-optimization.yaml +76 -0
  294. package/templates/optimizations/gptq-4bit-quantization.yaml +96 -0
  295. package/templates/optimizations/long-context-memory-management.yaml +78 -0
  296. package/templates/optimizations/max-tokens-optimization.yaml +76 -0
  297. package/templates/optimizations/memory-bandwidth-optimization.yaml +73 -0
  298. package/templates/optimizations/multi-framework-resilience.yaml +75 -0
  299. package/templates/optimizations/multi-tenant-optimization.yaml +75 -0
  300. package/templates/optimizations/prompt-caching-optimization.yaml +143 -0
  301. package/templates/optimizations/pytorch-to-onnx-migration.yaml +109 -0
  302. package/templates/optimizations/quality-monitoring.yaml +74 -0
  303. package/templates/optimizations/realtime-budget-controls.yaml +74 -0
  304. package/templates/optimizations/realtime-latency-optimization.yaml +74 -0
  305. package/templates/optimizations/sglang-concurrency-optimization.yaml +78 -0
  306. package/templates/optimizations/smart-model-routing.yaml +96 -0
  307. package/templates/optimizations/streaming-batch-selection.yaml +167 -0
  308. package/templates/optimizations/system-prompt-optimization.yaml +75 -0
  309. package/templates/optimizations/tensorrt-llm-performance.yaml +77 -0
  310. package/templates/optimizations/vllm-high-throughput-optimization.yaml +93 -0
  311. package/templates/optimizations/vllm-migration-memory-bound.yaml +78 -0
  312. package/templates/overpowered-extraction.yaml +32 -0
  313. package/templates/overpowered-model.yaml +31 -0
  314. package/templates/prompt-bloat.yaml +24 -0
  315. package/templates/retry-explosion.yaml +28 -0
  316. package/templates/schema/insight.schema.json +113 -0
  317. package/templates/schema/optimization.schema.json +180 -0
  318. package/templates/streaming-drift.yaml +30 -0
  319. package/templates/throughput-gap.yaml +21 -0
  320. package/templates/token-underutilization.yaml +28 -0
  321. package/templates/untested-fallback.yaml +21 -0
  322. package/tests/accuracy/drift-detection.test.ts +184 -0
  323. package/tests/accuracy/false-positives.test.ts +166 -0
  324. package/tests/accuracy/templates.test.ts +205 -0
  325. package/tests/action/commands.test.ts +125 -0
  326. package/tests/action/comments.test.ts +347 -0
  327. package/tests/cli.test.ts +203 -0
  328. package/tests/comparison.test.ts +309 -0
  329. package/tests/correlation-analyzer.test.ts +534 -0
  330. package/tests/counterfactuals.test.ts +347 -0
  331. package/tests/fixtures/events/missing-id.jsonl +1 -0
  332. package/tests/fixtures/events/missing-input.jsonl +1 -0
  333. package/tests/fixtures/events/missing-latency.jsonl +1 -0
  334. package/tests/fixtures/events/missing-model.jsonl +1 -0
  335. package/tests/fixtures/events/missing-output.jsonl +1 -0
  336. package/tests/fixtures/events/missing-provider.jsonl +1 -0
  337. package/tests/fixtures/events/missing-ts.jsonl +1 -0
  338. package/tests/fixtures/events/valid.csv +3 -0
  339. package/tests/fixtures/events/valid.json +1 -0
  340. package/tests/fixtures/events/valid.jsonl +2 -0
  341. package/tests/fixtures/events/with-callsite.jsonl +1 -0
  342. package/tests/fixtures/events/with-intent.jsonl +1 -0
  343. package/tests/fixtures/events/wrong-type.jsonl +1 -0
  344. package/tests/fixtures/repos/empty/.gitkeep +0 -0
  345. package/tests/fixtures/repos/hybrid-router/router.py +35 -0
  346. package/tests/fixtures/repos/saas-anthropic/agent.ts +27 -0
  347. package/tests/fixtures/repos/saas-openai/assistant.js +33 -0
  348. package/tests/fixtures/repos/saas-openai/client.py +26 -0
  349. package/tests/fixtures/repos/self-hosted-vllm/inference.py +22 -0
  350. package/tests/github-action.test.ts +292 -0
  351. package/tests/insights.test.ts +878 -0
  352. package/tests/joiner.test.ts +168 -0
  353. package/tests/performance/action-latency.test.ts +132 -0
  354. package/tests/performance/benchmark.test.ts +189 -0
  355. package/tests/performance/cli-latency.test.ts +102 -0
  356. package/tests/pr-comment.test.ts +313 -0
  357. package/tests/prediction.test.ts +296 -0
  358. package/tests/runtime-analyzer.test.ts +375 -0
  359. package/tests/runtime.test.ts +205 -0
  360. package/tests/scanner.test.ts +122 -0
  361. package/tests/template-conformance.test.ts +526 -0
  362. package/tests/unit/cost-calculator.test.ts +303 -0
  363. package/tests/unit/credits.test.ts +180 -0
  364. package/tests/unit/inference-map.test.ts +276 -0
  365. package/tests/unit/schema.test.ts +300 -0
  366. package/tsconfig.json +20 -0
  367. package/vitest.config.ts +14 -0
@@ -0,0 +1,197 @@
1
+ #!/bin/bash
2
+ # =============================================================================
3
+ # PeakInfer Sync Script
4
+ # =============================================================================
5
+ # Development convenience script to sync source-of-truth files from peakinfer-site.
6
+ #
7
+ # IMPORTANT: This script is for DEVELOPMENT ONLY.
8
+ # The peakinfer CLI is fully self-contained and does NOT depend on peakinfer-site
9
+ # at runtime. All synced files are committed to this repo for enterprise auditability.
10
+ #
11
+ # Usage:
12
+ # ./scripts/sync-from-site.sh [--dry-run] [--check]
13
+ #
14
+ # Options:
15
+ # --dry-run Show what would be synced without making changes
16
+ # --check Exit with error if files are out of sync (for CI)
17
+ # =============================================================================
18
+
19
+ set -e
20
+
21
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
22
+ CLI_ROOT="$(dirname "$SCRIPT_DIR")"
23
+ SITE_ROOT="$(dirname "$CLI_ROOT")/peakinfer-site"
24
+
25
+ # Colors for output
26
+ RED='\033[0;31m'
27
+ GREEN='\033[0;32m'
28
+ YELLOW='\033[1;33m'
29
+ NC='\033[0m' # No Color
30
+
31
+ # Sync mappings: CLI_PATH <- SITE_PATH
32
+ declare -A SYNC_FILES=(
33
+ ["src/orchestrator.ts"]="lib/agents/static-orchestrator.ts"
34
+ ["src/analysis-types.ts"]="lib/agents/types.ts"
35
+ ["src/prompts/loader.ts"]="lib/prompts/loader.ts"
36
+ ["prompts/unified-analyzer.yaml"]="prompts/unified-analyzer.yaml"
37
+ )
38
+
39
+ # Parse arguments
40
+ DRY_RUN=false
41
+ CHECK_MODE=false
42
+
43
+ while [[ $# -gt 0 ]]; do
44
+ case $1 in
45
+ --dry-run)
46
+ DRY_RUN=true
47
+ shift
48
+ ;;
49
+ --check)
50
+ CHECK_MODE=true
51
+ shift
52
+ ;;
53
+ *)
54
+ echo -e "${RED}Unknown option: $1${NC}"
55
+ exit 1
56
+ ;;
57
+ esac
58
+ done
59
+
60
+ # Check if peakinfer-site exists
61
+ if [ ! -d "$SITE_ROOT" ]; then
62
+ echo -e "${YELLOW}Warning: peakinfer-site not found at $SITE_ROOT${NC}"
63
+ echo "This is expected in production/CI environments."
64
+ echo "The CLI is fully self-contained and doesn't require peakinfer-site."
65
+ exit 0
66
+ fi
67
+
68
+ echo "=== PeakInfer Sync ==="
69
+ echo "Source: $SITE_ROOT"
70
+ echo "Target: $CLI_ROOT"
71
+ echo ""
72
+
73
+ SYNC_HEADER="/**
74
+ * SYNC NOTE: This file is synced from peakinfer-site (source of truth).
75
+ * DO NOT modify directly in the CLI repo.
76
+ *
77
+ * Source: peakinfer-site/%SOURCE_PATH%
78
+ * Last synced: %DATE%
79
+ *
80
+ * To modify: Edit in peakinfer-site, then run: ./scripts/sync-from-site.sh
81
+ */
82
+
83
+ "
84
+
85
+ YAML_SYNC_HEADER="# =============================================================================
86
+ # SYNC NOTE: This file is synced from peakinfer-site (source of truth).
87
+ # DO NOT modify directly in the CLI repo.
88
+ #
89
+ # Source: peakinfer-site/%SOURCE_PATH%
90
+ # Last synced: %DATE%
91
+ #
92
+ # To modify: Edit in peakinfer-site, then run: ./scripts/sync-from-site.sh
93
+ # =============================================================================
94
+
95
+ "
96
+
97
+ OUT_OF_SYNC=0
98
+ SYNCED=0
99
+
100
+ for CLI_PATH in "${!SYNC_FILES[@]}"; do
101
+ SITE_PATH="${SYNC_FILES[$CLI_PATH]}"
102
+ CLI_FILE="$CLI_ROOT/$CLI_PATH"
103
+ SITE_FILE="$SITE_ROOT/$SITE_PATH"
104
+
105
+ if [ ! -f "$SITE_FILE" ]; then
106
+ echo -e "${YELLOW}[SKIP] $SITE_PATH not found in peakinfer-site${NC}"
107
+ continue
108
+ fi
109
+
110
+ # Read source file
111
+ SOURCE_CONTENT=$(cat "$SITE_FILE")
112
+
113
+ # Prepare sync header
114
+ DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
115
+
116
+ if [[ "$CLI_PATH" == *.yaml ]]; then
117
+ HEADER="${YAML_SYNC_HEADER//%SOURCE_PATH%/$SITE_PATH}"
118
+ HEADER="${HEADER//%DATE%/$DATE}"
119
+ else
120
+ HEADER="${SYNC_HEADER//%SOURCE_PATH%/$SITE_PATH}"
121
+ HEADER="${HEADER//%DATE%/$DATE}"
122
+ fi
123
+
124
+ # Transform imports for CLI context
125
+ if [[ "$CLI_PATH" == *.ts ]]; then
126
+ # Replace @/lib/ imports with relative imports
127
+ SOURCE_CONTENT=$(echo "$SOURCE_CONTENT" | sed "s|from '@/lib/|from './|g")
128
+ SOURCE_CONTENT=$(echo "$SOURCE_CONTENT" | sed "s|import '@/lib/|import './|g")
129
+ fi
130
+
131
+ NEW_CONTENT="${HEADER}${SOURCE_CONTENT}"
132
+
133
+ # Check if file exists and compare
134
+ if [ -f "$CLI_FILE" ]; then
135
+ # Strip sync header from existing file for comparison (compare actual content)
136
+ EXISTING_CONTENT=$(cat "$CLI_FILE")
137
+
138
+ # Simple content comparison (ignoring header)
139
+ # Extract content after sync header
140
+ if [[ "$CLI_PATH" == *.yaml ]]; then
141
+ EXISTING_BODY=$(echo "$EXISTING_CONTENT" | sed -n '/^# ====/,/^# ====/!p' | tail -n +2)
142
+ NEW_BODY=$(echo "$SOURCE_CONTENT")
143
+ else
144
+ EXISTING_BODY=$(echo "$EXISTING_CONTENT" | sed -n '/^\*\//,$p' | tail -n +2)
145
+ NEW_BODY=$(echo "$SOURCE_CONTENT")
146
+ fi
147
+
148
+ if [ "$EXISTING_BODY" = "$NEW_BODY" ]; then
149
+ echo -e "${GREEN}[OK] $CLI_PATH is in sync${NC}"
150
+ continue
151
+ fi
152
+ fi
153
+
154
+ # Files differ
155
+ OUT_OF_SYNC=$((OUT_OF_SYNC + 1))
156
+
157
+ if [ "$CHECK_MODE" = true ]; then
158
+ echo -e "${RED}[OUT OF SYNC] $CLI_PATH <- $SITE_PATH${NC}"
159
+ continue
160
+ fi
161
+
162
+ if [ "$DRY_RUN" = true ]; then
163
+ echo -e "${YELLOW}[DRY RUN] Would sync: $CLI_PATH <- $SITE_PATH${NC}"
164
+ else
165
+ # Create directory if needed
166
+ mkdir -p "$(dirname "$CLI_FILE")"
167
+
168
+ # Write synced file
169
+ echo "$NEW_CONTENT" > "$CLI_FILE"
170
+ echo -e "${GREEN}[SYNCED] $CLI_PATH <- $SITE_PATH${NC}"
171
+ SYNCED=$((SYNCED + 1))
172
+ fi
173
+ done
174
+
175
+ echo ""
176
+ echo "=== Summary ==="
177
+
178
+ if [ "$CHECK_MODE" = true ]; then
179
+ if [ $OUT_OF_SYNC -gt 0 ]; then
180
+ echo -e "${RED}$OUT_OF_SYNC file(s) out of sync${NC}"
181
+ echo "Run './scripts/sync-from-site.sh' to sync"
182
+ exit 1
183
+ else
184
+ echo -e "${GREEN}All files in sync${NC}"
185
+ exit 0
186
+ fi
187
+ fi
188
+
189
+ if [ "$DRY_RUN" = true ]; then
190
+ echo "$OUT_OF_SYNC file(s) would be synced"
191
+ else
192
+ echo "$SYNCED file(s) synced"
193
+ fi
194
+
195
+ echo ""
196
+ echo "Remember: peakinfer CLI is fully self-contained."
197
+ echo "Synced files are committed to git for enterprise auditability."
@@ -0,0 +1,178 @@
1
+ #!/bin/bash
2
+ # =============================================================================
3
+ # SYNC VALIDATION SCRIPT
4
+ # Validates that synced files between peakinfer-site and peakinfer CLI are identical
5
+ # (modulo expected differences like import paths)
6
+ #
7
+ # Usage: ./scripts/validate-sync.sh [--strict]
8
+ # --strict: Fail on ANY difference (no import path tolerance)
9
+ #
10
+ # Exit codes:
11
+ # 0: All files in sync (or only expected differences)
12
+ # 1: Files out of sync (unexpected differences)
13
+ # 2: Missing files or configuration error
14
+ # =============================================================================
15
+
16
+ set -e
17
+
18
+ # Colors for output
19
+ RED='\033[0;31m'
20
+ GREEN='\033[0;32m'
21
+ YELLOW='\033[1;33m'
22
+ NC='\033[0m' # No Color
23
+
24
+ # Configuration
25
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
26
+ CLI_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
27
+ SITE_ROOT="$(cd "$CLI_ROOT/../peakinfer-site" 2>/dev/null && pwd)" || SITE_ROOT=""
28
+
29
+ # Synced file pairs: CLI path -> Site path
30
+ declare -A SYNC_PAIRS=(
31
+ ["src/orchestrator.ts"]="lib/agents/static-orchestrator.ts"
32
+ ["src/analysis-types.ts"]="lib/agents/types.ts"
33
+ ["src/prompts/loader.ts"]="lib/prompts/loader.ts"
34
+ ["prompts/unified-analyzer.yaml"]="prompts/unified-analyzer.yaml"
35
+ )
36
+
37
+ # Known import path differences to ignore (regex patterns)
38
+ IMPORT_DIFFS=(
39
+ "import.*from '@/lib/" # Site uses @/lib/, CLI uses ./
40
+ "from '\.\./" # Relative path differences
41
+ )
42
+
43
+ # Parse arguments
44
+ STRICT_MODE=false
45
+ if [[ "$1" == "--strict" ]]; then
46
+ STRICT_MODE=true
47
+ fi
48
+
49
+ # Functions
50
+ print_header() {
51
+ echo ""
52
+ echo "======================================================================"
53
+ echo " PeakInfer Sync Validation"
54
+ echo "======================================================================"
55
+ echo ""
56
+ }
57
+
58
+ print_status() {
59
+ local status=$1
60
+ local message=$2
61
+
62
+ if [[ "$status" == "OK" ]]; then
63
+ echo -e "${GREEN}[OK]${NC} $message"
64
+ elif [[ "$status" == "WARN" ]]; then
65
+ echo -e "${YELLOW}[WARN]${NC} $message"
66
+ elif [[ "$status" == "FAIL" ]]; then
67
+ echo -e "${RED}[FAIL]${NC} $message"
68
+ else
69
+ echo "[$status] $message"
70
+ fi
71
+ }
72
+
73
+ check_site_exists() {
74
+ if [[ -z "$SITE_ROOT" || ! -d "$SITE_ROOT" ]]; then
75
+ print_status "WARN" "peakinfer-site not found at ../peakinfer-site"
76
+ echo " This is expected in CI or when only CLI repo is cloned."
77
+ echo " Skipping sync validation."
78
+ exit 0
79
+ fi
80
+ }
81
+
82
+ normalize_file() {
83
+ local file=$1
84
+
85
+ # Read file, normalize line endings, and remove SYNC NOTE headers
86
+ cat "$file" 2>/dev/null | \
87
+ tr -d '\r' | \
88
+ sed '/^\/\*\*/,/^\*\//d' | \
89
+ sed '/SYNC NOTE/d'
90
+ }
91
+
92
+ compare_files() {
93
+ local cli_file=$1
94
+ local site_file=$2
95
+ local cli_path="$CLI_ROOT/$cli_file"
96
+ local site_path="$SITE_ROOT/$site_file"
97
+
98
+ # Check files exist
99
+ if [[ ! -f "$cli_path" ]]; then
100
+ print_status "FAIL" "$cli_file: CLI file missing"
101
+ return 1
102
+ fi
103
+
104
+ if [[ ! -f "$site_path" ]]; then
105
+ print_status "FAIL" "$site_file: Site file missing"
106
+ return 1
107
+ fi
108
+
109
+ # Create temp files for comparison
110
+ local tmp_cli=$(mktemp)
111
+ local tmp_site=$(mktemp)
112
+
113
+ normalize_file "$cli_path" > "$tmp_cli"
114
+ normalize_file "$site_path" > "$tmp_site"
115
+
116
+ # In non-strict mode, also normalize import paths
117
+ if [[ "$STRICT_MODE" == "false" ]]; then
118
+ # Normalize @/lib/ imports to relative
119
+ sed -i.bak "s|from '@/lib/|from './|g" "$tmp_site" 2>/dev/null || \
120
+ sed "s|from '@/lib/|from './|g" "$tmp_site" > "$tmp_site.new" && mv "$tmp_site.new" "$tmp_site"
121
+ fi
122
+
123
+ # Compare
124
+ if diff -q "$tmp_cli" "$tmp_site" > /dev/null 2>&1; then
125
+ print_status "OK" "$cli_file <-> $site_file"
126
+ rm -f "$tmp_cli" "$tmp_site" "$tmp_cli.bak" "$tmp_site.bak"
127
+ return 0
128
+ else
129
+ print_status "FAIL" "$cli_file <-> $site_file (DIFFERS)"
130
+
131
+ # Show diff preview (first 10 lines)
132
+ echo " Diff preview:"
133
+ diff "$tmp_cli" "$tmp_site" | head -20 | sed 's/^/ /'
134
+ echo " ..."
135
+
136
+ rm -f "$tmp_cli" "$tmp_site" "$tmp_cli.bak" "$tmp_site.bak"
137
+ return 1
138
+ fi
139
+ }
140
+
141
+ # Main
142
+ print_header
143
+
144
+ echo "CLI Root: $CLI_ROOT"
145
+ echo "Site Root: ${SITE_ROOT:-'(not found)'}"
146
+ echo ""
147
+
148
+ # Check if site exists
149
+ check_site_exists
150
+
151
+ echo "Mode: ${STRICT_MODE:+STRICT}${STRICT_MODE:-TOLERANT} (import path differences ${STRICT_MODE:+NOT }ignored)"
152
+ echo ""
153
+
154
+ # Run comparisons
155
+ failures=0
156
+ for cli_file in "${!SYNC_PAIRS[@]}"; do
157
+ site_file="${SYNC_PAIRS[$cli_file]}"
158
+ if ! compare_files "$cli_file" "$site_file"; then
159
+ ((failures++))
160
+ fi
161
+ done
162
+
163
+ echo ""
164
+ echo "======================================================================"
165
+
166
+ if [[ $failures -eq 0 ]]; then
167
+ print_status "OK" "All ${#SYNC_PAIRS[@]} synced files are in sync"
168
+ exit 0
169
+ else
170
+ print_status "FAIL" "$failures of ${#SYNC_PAIRS[@]} files are OUT OF SYNC"
171
+ echo ""
172
+ echo "To fix:"
173
+ echo " 1. Make changes in peakinfer-site first (source of truth)"
174
+ echo " 2. Copy updated files to peakinfer CLI"
175
+ echo " 3. Adapt imports (@/lib/ -> ./)"
176
+ echo " 4. Run this script again to verify"
177
+ exit 1
178
+ fi