trade-compass-agent 0.2.0__tar.gz

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 (503) hide show
  1. trade_compass_agent-0.2.0/.cursor/rules/skill-design.mdc +72 -0
  2. trade_compass_agent-0.2.0/.env.example +95 -0
  3. trade_compass_agent-0.2.0/.github/CODEOWNERS +8 -0
  4. trade_compass_agent-0.2.0/.github/ISSUE_TEMPLATE/bug.yml +59 -0
  5. trade_compass_agent-0.2.0/.github/ISSUE_TEMPLATE/config.yml +8 -0
  6. trade_compass_agent-0.2.0/.github/ISSUE_TEMPLATE/feature.yml +35 -0
  7. trade_compass_agent-0.2.0/.github/dependabot.yml +38 -0
  8. trade_compass_agent-0.2.0/.github/pull_request_template.md +26 -0
  9. trade_compass_agent-0.2.0/.github/release.yml +23 -0
  10. trade_compass_agent-0.2.0/.github/workflows/ci.yml +107 -0
  11. trade_compass_agent-0.2.0/.github/workflows/release.yml +182 -0
  12. trade_compass_agent-0.2.0/.github/workflows/security.yml +61 -0
  13. trade_compass_agent-0.2.0/.github/workflows/test-publish.yml +107 -0
  14. trade_compass_agent-0.2.0/.gitignore +22 -0
  15. trade_compass_agent-0.2.0/.nvmrc +1 -0
  16. trade_compass_agent-0.2.0/.trade-compass/mcp.json.example +22 -0
  17. trade_compass_agent-0.2.0/.trade-compass/skills/catalyst-calendar-cn/SKILL.md +65 -0
  18. trade_compass_agent-0.2.0/.trade-compass/skills/idea-generation-cn/SKILL.md +78 -0
  19. trade_compass_agent-0.2.0/.trade-compass/skills/intraday-tech/SKILL.md +38 -0
  20. trade_compass_agent-0.2.0/.trade-compass/skills/investment-masters/SKILL.md +150 -0
  21. trade_compass_agent-0.2.0/.trade-compass/skills/investment-masters/references/buffett.md +400 -0
  22. trade_compass_agent-0.2.0/.trade-compass/skills/investment-masters/references/cross-insights.md +141 -0
  23. trade_compass_agent-0.2.0/.trade-compass/skills/investment-masters/references/dalio.md +386 -0
  24. trade_compass_agent-0.2.0/.trade-compass/skills/investment-masters/references/lynch.md +378 -0
  25. trade_compass_agent-0.2.0/.trade-compass/skills/investment-masters/references/marks.md +298 -0
  26. trade_compass_agent-0.2.0/.trade-compass/skills/investment-masters/references/munger.md +444 -0
  27. trade_compass_agent-0.2.0/AGENTS.md +168 -0
  28. trade_compass_agent-0.2.0/CHANGELOG.md +135 -0
  29. trade_compass_agent-0.2.0/CLAUDE.md +16 -0
  30. trade_compass_agent-0.2.0/CODE_OF_CONDUCT.md +44 -0
  31. trade_compass_agent-0.2.0/CONTRIBUTING.md +77 -0
  32. trade_compass_agent-0.2.0/LICENSE +21 -0
  33. trade_compass_agent-0.2.0/PKG-INFO +329 -0
  34. trade_compass_agent-0.2.0/PRIVACY.md +73 -0
  35. trade_compass_agent-0.2.0/README.en.md +256 -0
  36. trade_compass_agent-0.2.0/README.md +251 -0
  37. trade_compass_agent-0.2.0/README.zh-CN.md +5 -0
  38. trade_compass_agent-0.2.0/SECURITY.md +24 -0
  39. trade_compass_agent-0.2.0/SUPPORT.md +19 -0
  40. trade_compass_agent-0.2.0/THIRD_PARTY_NOTICES.md +32 -0
  41. trade_compass_agent-0.2.0/apps/web/.gitignore +6 -0
  42. trade_compass_agent-0.2.0/apps/web/.prettierrc +8 -0
  43. trade_compass_agent-0.2.0/apps/web/README.md +18 -0
  44. trade_compass_agent-0.2.0/apps/web/components.json +21 -0
  45. trade_compass_agent-0.2.0/apps/web/index.html +15 -0
  46. trade_compass_agent-0.2.0/apps/web/package.json +41 -0
  47. trade_compass_agent-0.2.0/apps/web/postcss.config.js +6 -0
  48. trade_compass_agent-0.2.0/apps/web/public/favicon.ico +0 -0
  49. trade_compass_agent-0.2.0/apps/web/public/favicon.svg +43 -0
  50. trade_compass_agent-0.2.0/apps/web/src/components/agent/ActivityTimeline.tsx +100 -0
  51. trade_compass_agent-0.2.0/apps/web/src/components/agent/ChatMessage.tsx +151 -0
  52. trade_compass_agent-0.2.0/apps/web/src/components/agent/SectionCard.tsx +91 -0
  53. trade_compass_agent-0.2.0/apps/web/src/components/agent/SessionSidebar.tsx +340 -0
  54. trade_compass_agent-0.2.0/apps/web/src/components/agent/SkillSlashMenu.tsx +155 -0
  55. trade_compass_agent-0.2.0/apps/web/src/components/agent/ToolTrace.tsx +78 -0
  56. trade_compass_agent-0.2.0/apps/web/src/components/charts/KlineMiniChart.tsx +399 -0
  57. trade_compass_agent-0.2.0/apps/web/src/components/layout/AppLayout.tsx +63 -0
  58. trade_compass_agent-0.2.0/apps/web/src/components/ui/MarkdownRenderer.tsx +6 -0
  59. trade_compass_agent-0.2.0/apps/web/src/components/ui/badge.tsx +34 -0
  60. trade_compass_agent-0.2.0/apps/web/src/components/ui/button.tsx +51 -0
  61. trade_compass_agent-0.2.0/apps/web/src/components/ui/card.tsx +55 -0
  62. trade_compass_agent-0.2.0/apps/web/src/components/ui/input.tsx +22 -0
  63. trade_compass_agent-0.2.0/apps/web/src/components/ui/new-badge.tsx +50 -0
  64. trade_compass_agent-0.2.0/apps/web/src/components/ui/skeleton.tsx +14 -0
  65. trade_compass_agent-0.2.0/apps/web/src/components/ui/table.tsx +67 -0
  66. trade_compass_agent-0.2.0/apps/web/src/components/ui/tabs.tsx +80 -0
  67. trade_compass_agent-0.2.0/apps/web/src/hooks/useAgentSSE.ts +176 -0
  68. trade_compass_agent-0.2.0/apps/web/src/index.css +51 -0
  69. trade_compass_agent-0.2.0/apps/web/src/lib/activity-labels.ts +78 -0
  70. trade_compass_agent-0.2.0/apps/web/src/lib/activity-trace.test.ts +20 -0
  71. trade_compass_agent-0.2.0/apps/web/src/lib/activity-trace.ts +130 -0
  72. trade_compass_agent-0.2.0/apps/web/src/lib/agent-api.ts +198 -0
  73. trade_compass_agent-0.2.0/apps/web/src/lib/agent-session-load.test.ts +55 -0
  74. trade_compass_agent-0.2.0/apps/web/src/lib/agent-session-load.ts +29 -0
  75. trade_compass_agent-0.2.0/apps/web/src/lib/agent-session-storage.test.ts +34 -0
  76. trade_compass_agent-0.2.0/apps/web/src/lib/agent-session-storage.ts +46 -0
  77. trade_compass_agent-0.2.0/apps/web/src/lib/freshness.test.ts +25 -0
  78. trade_compass_agent-0.2.0/apps/web/src/lib/freshness.ts +13 -0
  79. trade_compass_agent-0.2.0/apps/web/src/lib/sections.ts +34 -0
  80. trade_compass_agent-0.2.0/apps/web/src/lib/turn-outcome.ts +100 -0
  81. trade_compass_agent-0.2.0/apps/web/src/lib/types.ts +377 -0
  82. trade_compass_agent-0.2.0/apps/web/src/lib/utils.ts +6 -0
  83. trade_compass_agent-0.2.0/apps/web/src/lib/workbench-api.ts +374 -0
  84. trade_compass_agent-0.2.0/apps/web/src/main.tsx +25 -0
  85. trade_compass_agent-0.2.0/apps/web/src/router.tsx +62 -0
  86. trade_compass_agent-0.2.0/apps/web/src/routes/AgentPage.tsx +1201 -0
  87. trade_compass_agent-0.2.0/apps/web/src/routes/AuditPage.tsx +192 -0
  88. trade_compass_agent-0.2.0/apps/web/src/routes/JobsPage.tsx +987 -0
  89. trade_compass_agent-0.2.0/apps/web/src/routes/MemoryPage.tsx +469 -0
  90. trade_compass_agent-0.2.0/apps/web/src/routes/PortfolioPage.tsx +645 -0
  91. trade_compass_agent-0.2.0/apps/web/src/routes/RulesPage.tsx +211 -0
  92. trade_compass_agent-0.2.0/apps/web/src/routes/SettingsPage.tsx +172 -0
  93. trade_compass_agent-0.2.0/apps/web/src/routes/SkillsPage.tsx +199 -0
  94. trade_compass_agent-0.2.0/apps/web/src/vite-env.d.ts +1 -0
  95. trade_compass_agent-0.2.0/apps/web/tailwind.config.ts +58 -0
  96. trade_compass_agent-0.2.0/apps/web/tsconfig.json +23 -0
  97. trade_compass_agent-0.2.0/apps/web/vite.config.ts +41 -0
  98. trade_compass_agent-0.2.0/config/agent_skills.yaml +13 -0
  99. trade_compass_agent-0.2.0/config/agent_skills.yaml.example +22 -0
  100. trade_compass_agent-0.2.0/config/default.yaml +113 -0
  101. trade_compass_agent-0.2.0/config/packaged.yaml +106 -0
  102. trade_compass_agent-0.2.0/docs/README.md +17 -0
  103. trade_compass_agent-0.2.0/docs/architecture.md +45 -0
  104. trade_compass_agent-0.2.0/docs/assets/trade-compass-workbench.png +0 -0
  105. trade_compass_agent-0.2.0/docs/cli.md +68 -0
  106. trade_compass_agent-0.2.0/docs/configuration.md +124 -0
  107. trade_compass_agent-0.2.0/docs/getting-started.md +93 -0
  108. trade_compass_agent-0.2.0/docs/public-release-checklist.md +58 -0
  109. trade_compass_agent-0.2.0/docs/releasing.md +67 -0
  110. trade_compass_agent-0.2.0/docs/security-exceptions.md +20 -0
  111. trade_compass_agent-0.2.0/docs/skills.md +91 -0
  112. trade_compass_agent-0.2.0/docs/threat-model.md +73 -0
  113. trade_compass_agent-0.2.0/hatch_build.py +56 -0
  114. trade_compass_agent-0.2.0/install.sh +144 -0
  115. trade_compass_agent-0.2.0/package.json +4 -0
  116. trade_compass_agent-0.2.0/pnpm-lock.yaml +3358 -0
  117. trade_compass_agent-0.2.0/pnpm-workspace.yaml +13 -0
  118. trade_compass_agent-0.2.0/pyproject.toml +130 -0
  119. trade_compass_agent-0.2.0/schemas/readers/announcement_events.schema.json +31 -0
  120. trade_compass_agent-0.2.0/schemas/readers/kol_signal_extract.schema.json +17 -0
  121. trade_compass_agent-0.2.0/schemas/readers/news_extract.schema.json +17 -0
  122. trade_compass_agent-0.2.0/schemas/readers/reader_claims.schema.json +70 -0
  123. trade_compass_agent-0.2.0/schemas/readers/research_report_extract.schema.json +17 -0
  124. trade_compass_agent-0.2.0/schemas/readers/source_reference.schema.json +14 -0
  125. trade_compass_agent-0.2.0/schemas/workflows/catalyst_calendar_cn.schema.json +53 -0
  126. trade_compass_agent-0.2.0/schemas/workflows/idea_generation_cn.schema.json +66 -0
  127. trade_compass_agent-0.2.0/schemas/workflows/research_workflow.schema.json +52 -0
  128. trade_compass_agent-0.2.0/scripts/__init__.py +1 -0
  129. trade_compass_agent-0.2.0/scripts/check_assets.py +717 -0
  130. trade_compass_agent-0.2.0/scripts/check_dist.py +213 -0
  131. trade_compass_agent-0.2.0/scripts/ci_check.sh +38 -0
  132. trade_compass_agent-0.2.0/scripts/secret_scan.sh +48 -0
  133. trade_compass_agent-0.2.0/scripts/serve.sh +4 -0
  134. trade_compass_agent-0.2.0/src/trade_compass_agent/__init__.py +10 -0
  135. trade_compass_agent-0.2.0/src/trade_compass_agent/channels/__init__.py +25 -0
  136. trade_compass_agent-0.2.0/src/trade_compass_agent/channels/base.py +156 -0
  137. trade_compass_agent-0.2.0/src/trade_compass_agent/channels/feishu.py +427 -0
  138. trade_compass_agent-0.2.0/src/trade_compass_agent/channels/gateway.py +218 -0
  139. trade_compass_agent-0.2.0/src/trade_compass_agent/channels/inbound.py +133 -0
  140. trade_compass_agent-0.2.0/src/trade_compass_agent/channels/subscriber_store.py +40 -0
  141. trade_compass_agent-0.2.0/src/trade_compass_agent/channels/webhook.py +51 -0
  142. trade_compass_agent-0.2.0/src/trade_compass_agent/channels/wecom.py +294 -0
  143. trade_compass_agent-0.2.0/src/trade_compass_agent/channels/weixin.py +430 -0
  144. trade_compass_agent-0.2.0/src/trade_compass_agent/cli.py +1385 -0
  145. trade_compass_agent-0.2.0/src/trade_compass_agent/command_catalog.py +252 -0
  146. trade_compass_agent-0.2.0/src/trade_compass_agent/concurrency.py +45 -0
  147. trade_compass_agent-0.2.0/src/trade_compass_agent/config.py +567 -0
  148. trade_compass_agent-0.2.0/src/trade_compass_agent/daemon/__init__.py +1 -0
  149. trade_compass_agent-0.2.0/src/trade_compass_agent/daemon/cli.py +73 -0
  150. trade_compass_agent-0.2.0/src/trade_compass_agent/daemon/constants.py +7 -0
  151. trade_compass_agent-0.2.0/src/trade_compass_agent/daemon/launchd.py +233 -0
  152. trade_compass_agent-0.2.0/src/trade_compass_agent/daemon/log_rotation.py +162 -0
  153. trade_compass_agent-0.2.0/src/trade_compass_agent/daemon/program_args.py +73 -0
  154. trade_compass_agent-0.2.0/src/trade_compass_agent/daemon/status.py +271 -0
  155. trade_compass_agent-0.2.0/src/trade_compass_agent/daemon/systemd.py +260 -0
  156. trade_compass_agent-0.2.0/src/trade_compass_agent/data/__init__.py +5 -0
  157. trade_compass_agent-0.2.0/src/trade_compass_agent/data/cninfo.py +185 -0
  158. trade_compass_agent-0.2.0/src/trade_compass_agent/data/fund_flow.py +169 -0
  159. trade_compass_agent-0.2.0/src/trade_compass_agent/data/fundamentals.py +355 -0
  160. trade_compass_agent-0.2.0/src/trade_compass_agent/data/kronos/LICENSE +21 -0
  161. trade_compass_agent-0.2.0/src/trade_compass_agent/data/kronos/__init__.py +17 -0
  162. trade_compass_agent-0.2.0/src/trade_compass_agent/data/kronos/kronos.py +659 -0
  163. trade_compass_agent-0.2.0/src/trade_compass_agent/data/kronos/module.py +570 -0
  164. trade_compass_agent-0.2.0/src/trade_compass_agent/data/kronos_adapter.py +261 -0
  165. trade_compass_agent-0.2.0/src/trade_compass_agent/data/market_pulse.py +214 -0
  166. trade_compass_agent-0.2.0/src/trade_compass_agent/data/network.py +190 -0
  167. trade_compass_agent-0.2.0/src/trade_compass_agent/data/providers.py +841 -0
  168. trade_compass_agent-0.2.0/src/trade_compass_agent/data/quality.py +29 -0
  169. trade_compass_agent-0.2.0/src/trade_compass_agent/data/tushare_provider.py +116 -0
  170. trade_compass_agent-0.2.0/src/trade_compass_agent/diagnostics.py +116 -0
  171. trade_compass_agent-0.2.0/src/trade_compass_agent/domain/__init__.py +1 -0
  172. trade_compass_agent-0.2.0/src/trade_compass_agent/domain/models.py +258 -0
  173. trade_compass_agent-0.2.0/src/trade_compass_agent/domain/signals.py +146 -0
  174. trade_compass_agent-0.2.0/src/trade_compass_agent/evaluation/__init__.py +3 -0
  175. trade_compass_agent-0.2.0/src/trade_compass_agent/evaluation/backtester.py +330 -0
  176. trade_compass_agent-0.2.0/src/trade_compass_agent/evaluation/follow_through.py +140 -0
  177. trade_compass_agent-0.2.0/src/trade_compass_agent/evaluation/metrics.py +56 -0
  178. trade_compass_agent-0.2.0/src/trade_compass_agent/evaluation/rule_performance.py +106 -0
  179. trade_compass_agent-0.2.0/src/trade_compass_agent/evaluation/rule_refinement.py +153 -0
  180. trade_compass_agent-0.2.0/src/trade_compass_agent/evaluation/signal_tracker.py +215 -0
  181. trade_compass_agent-0.2.0/src/trade_compass_agent/evaluation/workflow_artifacts.py +268 -0
  182. trade_compass_agent-0.2.0/src/trade_compass_agent/llm/__init__.py +1 -0
  183. trade_compass_agent-0.2.0/src/trade_compass_agent/llm/providers.py +514 -0
  184. trade_compass_agent-0.2.0/src/trade_compass_agent/logging_config.py +153 -0
  185. trade_compass_agent-0.2.0/src/trade_compass_agent/memory/__init__.py +1 -0
  186. trade_compass_agent-0.2.0/src/trade_compass_agent/memory/capture_hooks.py +120 -0
  187. trade_compass_agent-0.2.0/src/trade_compass_agent/memory/consolidation.py +211 -0
  188. trade_compass_agent-0.2.0/src/trade_compass_agent/memory/contradiction.py +250 -0
  189. trade_compass_agent-0.2.0/src/trade_compass_agent/memory/decision_reconciler.py +240 -0
  190. trade_compass_agent-0.2.0/src/trade_compass_agent/memory/decision_store.py +278 -0
  191. trade_compass_agent-0.2.0/src/trade_compass_agent/memory/dream_diary.py +221 -0
  192. trade_compass_agent-0.2.0/src/trade_compass_agent/memory/enhanced.py +212 -0
  193. trade_compass_agent-0.2.0/src/trade_compass_agent/memory/insights.py +343 -0
  194. trade_compass_agent-0.2.0/src/trade_compass_agent/memory/instrument_store.py +183 -0
  195. trade_compass_agent-0.2.0/src/trade_compass_agent/memory/memory_store.py +881 -0
  196. trade_compass_agent-0.2.0/src/trade_compass_agent/memory/observation_store.py +512 -0
  197. trade_compass_agent-0.2.0/src/trade_compass_agent/memory/patterns.py +359 -0
  198. trade_compass_agent-0.2.0/src/trade_compass_agent/memory/promotion.py +527 -0
  199. trade_compass_agent-0.2.0/src/trade_compass_agent/memory/rules_store.py +283 -0
  200. trade_compass_agent-0.2.0/src/trade_compass_agent/memory/semantic_merge.py +170 -0
  201. trade_compass_agent-0.2.0/src/trade_compass_agent/memory/session_summary_store.py +230 -0
  202. trade_compass_agent-0.2.0/src/trade_compass_agent/memory/skill_quality.py +331 -0
  203. trade_compass_agent-0.2.0/src/trade_compass_agent/memory/skill_store.py +463 -0
  204. trade_compass_agent-0.2.0/src/trade_compass_agent/memory/time_tree.py +380 -0
  205. trade_compass_agent-0.2.0/src/trade_compass_agent/memory/tree/__init__.py +10 -0
  206. trade_compass_agent-0.2.0/src/trade_compass_agent/memory/tree/search.py +186 -0
  207. trade_compass_agent-0.2.0/src/trade_compass_agent/memory/tree/storage.py +79 -0
  208. trade_compass_agent-0.2.0/src/trade_compass_agent/memory/vault.py +21 -0
  209. trade_compass_agent-0.2.0/src/trade_compass_agent/memory/write_gate.py +181 -0
  210. trade_compass_agent-0.2.0/src/trade_compass_agent/ops/__init__.py +181 -0
  211. trade_compass_agent-0.2.0/src/trade_compass_agent/ops/agent_session.py +190 -0
  212. trade_compass_agent-0.2.0/src/trade_compass_agent/ops/audit.py +118 -0
  213. trade_compass_agent-0.2.0/src/trade_compass_agent/ops/builtin_job_delivery.py +62 -0
  214. trade_compass_agent-0.2.0/src/trade_compass_agent/ops/curator.py +106 -0
  215. trade_compass_agent-0.2.0/src/trade_compass_agent/ops/delivery.py +140 -0
  216. trade_compass_agent-0.2.0/src/trade_compass_agent/ops/hooks.py +173 -0
  217. trade_compass_agent-0.2.0/src/trade_compass_agent/ops/job_definition.py +190 -0
  218. trade_compass_agent-0.2.0/src/trade_compass_agent/ops/job_executor.py +213 -0
  219. trade_compass_agent-0.2.0/src/trade_compass_agent/ops/notifications.py +92 -0
  220. trade_compass_agent-0.2.0/src/trade_compass_agent/ops/outcome_feedback.py +623 -0
  221. trade_compass_agent-0.2.0/src/trade_compass_agent/ops/prompt_jobs.py +245 -0
  222. trade_compass_agent-0.2.0/src/trade_compass_agent/ops/reflection.py +239 -0
  223. trade_compass_agent-0.2.0/src/trade_compass_agent/ops/reflection_resolver.py +165 -0
  224. trade_compass_agent-0.2.0/src/trade_compass_agent/ops/run_content.py +119 -0
  225. trade_compass_agent-0.2.0/src/trade_compass_agent/ops/run_store.py +455 -0
  226. trade_compass_agent-0.2.0/src/trade_compass_agent/ops/session_cleanup.py +110 -0
  227. trade_compass_agent-0.2.0/src/trade_compass_agent/ops/tick_scheduler.py +463 -0
  228. trade_compass_agent-0.2.0/src/trade_compass_agent/ops/trading_calendar.py +92 -0
  229. trade_compass_agent-0.2.0/src/trade_compass_agent/ops/watch_plans.py +534 -0
  230. trade_compass_agent-0.2.0/src/trade_compass_agent/portability.py +409 -0
  231. trade_compass_agent-0.2.0/src/trade_compass_agent/portfolio/__init__.py +1 -0
  232. trade_compass_agent-0.2.0/src/trade_compass_agent/portfolio/accounts.py +139 -0
  233. trade_compass_agent-0.2.0/src/trade_compass_agent/portfolio/lot_sizing.py +199 -0
  234. trade_compass_agent-0.2.0/src/trade_compass_agent/portfolio/market_rules.py +64 -0
  235. trade_compass_agent-0.2.0/src/trade_compass_agent/portfolio/simulator.py +576 -0
  236. trade_compass_agent-0.2.0/src/trade_compass_agent/recovery.py +539 -0
  237. trade_compass_agent-0.2.0/src/trade_compass_agent/release_smoke.py +98 -0
  238. trade_compass_agent-0.2.0/src/trade_compass_agent/risk/__init__.py +3 -0
  239. trade_compass_agent-0.2.0/src/trade_compass_agent/risk/cooldown.py +98 -0
  240. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/__init__.py +5 -0
  241. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/activity_events.py +125 -0
  242. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/background_review.py +271 -0
  243. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/bootstrap.py +157 -0
  244. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/compression/__init__.py +43 -0
  245. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/compression/budget.py +220 -0
  246. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/compression/summarizer.py +341 -0
  247. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/compression/trim.py +374 -0
  248. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/context.py +137 -0
  249. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/exceptions.py +29 -0
  250. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/facts.py +84 -0
  251. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/intake.py +283 -0
  252. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/learning.py +93 -0
  253. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/loop.py +941 -0
  254. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/market_stack.py +44 -0
  255. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/mcp/__init__.py +10 -0
  256. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/mcp/client.py +497 -0
  257. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/mcp/loader.py +53 -0
  258. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/readers/__init__.py +21 -0
  259. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/readers/base.py +232 -0
  260. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/run_trace.py +85 -0
  261. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/schema_validator.py +129 -0
  262. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/session.py +501 -0
  263. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/session_title.py +36 -0
  264. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/skills.py +204 -0
  265. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/specialists/__init__.py +3 -0
  266. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/specialists/asset_runner.py +287 -0
  267. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/specialists/assets.py +164 -0
  268. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/specialists/multi_agent/__init__.py +17 -0
  269. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/specialists/multi_agent/assets.py +150 -0
  270. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/specialists/multi_agent/engine.py +68 -0
  271. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/specialists/multi_agent/strategies/__init__.py +1 -0
  272. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/specialists/multi_agent/strategies/debate_team.py +635 -0
  273. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/specialists/multi_agent/types.py +55 -0
  274. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/specialists/nested_loop.py +82 -0
  275. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/specialists/registry.py +11 -0
  276. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/specialists/risk_controls.py +80 -0
  277. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/specialists/run.py +34 -0
  278. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/specialists/signal_parsing.py +173 -0
  279. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/specialists/situation.py +115 -0
  280. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/stream_buffer.py +40 -0
  281. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/tools/__init__.py +3 -0
  282. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/tools/artifact_tracking.py +95 -0
  283. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/tools/batch.py +314 -0
  284. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/tools/builtin_operations.py +1415 -0
  285. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/tools/catalyst_calendar.py +176 -0
  286. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/tools/chart_pattern.py +652 -0
  287. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/tools/dispatch.py +202 -0
  288. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/tools/fetch_url.py +324 -0
  289. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/tools/idea_generation.py +133 -0
  290. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/tools/image_tools.py +227 -0
  291. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/tools/kline_forecast.py +111 -0
  292. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/tools/market.py +140 -0
  293. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/tools/memory.py +45 -0
  294. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/tools/operations.py +138 -0
  295. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/tools/policy.py +71 -0
  296. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/tools/portfolio.py +522 -0
  297. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/tools/readers.py +143 -0
  298. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/tools/registry.py +1593 -0
  299. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/tools/scheduler_tool.py +128 -0
  300. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/tools/search.py +1125 -0
  301. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/tools/self_improve.py +272 -0
  302. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/tools/signals.py +125 -0
  303. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/tools/skills.py +20 -0
  304. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/tools/stock_structure.py +592 -0
  305. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/tools/ta.py +233 -0
  306. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/turn_control.py +70 -0
  307. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/types.py +29 -0
  308. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/verifier.py +229 -0
  309. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/workflows/__init__.py +55 -0
  310. trade_compass_agent-0.2.0/src/trade_compass_agent/runtime/workflows/engine.py +976 -0
  311. trade_compass_agent-0.2.0/src/trade_compass_agent/screening/__init__.py +6 -0
  312. trade_compass_agent-0.2.0/src/trade_compass_agent/screening/config.py +71 -0
  313. trade_compass_agent-0.2.0/src/trade_compass_agent/screening/engine.py +112 -0
  314. trade_compass_agent-0.2.0/src/trade_compass_agent/screening/factors.py +159 -0
  315. trade_compass_agent-0.2.0/src/trade_compass_agent/screening/filters.py +77 -0
  316. trade_compass_agent-0.2.0/src/trade_compass_agent/screening/resonance.py +68 -0
  317. trade_compass_agent-0.2.0/src/trade_compass_agent/screening/triggers.py +149 -0
  318. trade_compass_agent-0.2.0/src/trade_compass_agent/screening/universe.py +154 -0
  319. trade_compass_agent-0.2.0/src/trade_compass_agent/setup_wizard.py +555 -0
  320. trade_compass_agent-0.2.0/src/trade_compass_agent/specialists/chokepoint_analyst/prompts/system.md +132 -0
  321. trade_compass_agent-0.2.0/src/trade_compass_agent/specialists/chokepoint_analyst/schemas/report.schema.json +46 -0
  322. trade_compass_agent-0.2.0/src/trade_compass_agent/specialists/chokepoint_analyst/specialist.yaml +36 -0
  323. trade_compass_agent-0.2.0/src/trade_compass_agent/specialists/debate/plans/debate_v2/prompts/bear_debater.md +17 -0
  324. trade_compass_agent-0.2.0/src/trade_compass_agent/specialists/debate/plans/debate_v2/prompts/bull_debater.md +17 -0
  325. trade_compass_agent-0.2.0/src/trade_compass_agent/specialists/debate/plans/debate_v2/prompts/fundamental_analyst.md +16 -0
  326. trade_compass_agent-0.2.0/src/trade_compass_agent/specialists/debate/plans/debate_v2/prompts/pm_defense.md +17 -0
  327. trade_compass_agent-0.2.0/src/trade_compass_agent/specialists/debate/plans/debate_v2/prompts/pm_judge.md +23 -0
  328. trade_compass_agent-0.2.0/src/trade_compass_agent/specialists/debate/plans/debate_v2/prompts/risk_challenger.md +19 -0
  329. trade_compass_agent-0.2.0/src/trade_compass_agent/specialists/debate/plans/debate_v2/prompts/sentiment_analyst.md +16 -0
  330. trade_compass_agent-0.2.0/src/trade_compass_agent/specialists/debate/plans/debate_v2/prompts/supply_chain_analyst.md +19 -0
  331. trade_compass_agent-0.2.0/src/trade_compass_agent/specialists/debate/plans/debate_v2/prompts/technical_analyst.md +16 -0
  332. trade_compass_agent-0.2.0/src/trade_compass_agent/specialists/debate/plans/debate_v2.yaml +110 -0
  333. trade_compass_agent-0.2.0/src/trade_compass_agent/specialists/debate/prompts/system.md +5 -0
  334. trade_compass_agent-0.2.0/src/trade_compass_agent/specialists/debate/schemas/report.schema.json +41 -0
  335. trade_compass_agent-0.2.0/src/trade_compass_agent/specialists/debate/specialist.yaml +47 -0
  336. trade_compass_agent-0.2.0/src/trade_compass_agent/specialists/equity_research/plans/debate_v2/prompts/bear_debater.md +17 -0
  337. trade_compass_agent-0.2.0/src/trade_compass_agent/specialists/equity_research/plans/debate_v2/prompts/bull_debater.md +17 -0
  338. trade_compass_agent-0.2.0/src/trade_compass_agent/specialists/equity_research/plans/debate_v2/prompts/fundamental_analyst.md +16 -0
  339. trade_compass_agent-0.2.0/src/trade_compass_agent/specialists/equity_research/plans/debate_v2/prompts/pm_defense.md +17 -0
  340. trade_compass_agent-0.2.0/src/trade_compass_agent/specialists/equity_research/plans/debate_v2/prompts/pm_judge.md +23 -0
  341. trade_compass_agent-0.2.0/src/trade_compass_agent/specialists/equity_research/plans/debate_v2/prompts/risk_challenger.md +19 -0
  342. trade_compass_agent-0.2.0/src/trade_compass_agent/specialists/equity_research/plans/debate_v2/prompts/sentiment_analyst.md +16 -0
  343. trade_compass_agent-0.2.0/src/trade_compass_agent/specialists/equity_research/plans/debate_v2/prompts/supply_chain_analyst.md +19 -0
  344. trade_compass_agent-0.2.0/src/trade_compass_agent/specialists/equity_research/plans/debate_v2/prompts/technical_analyst.md +16 -0
  345. trade_compass_agent-0.2.0/src/trade_compass_agent/specialists/equity_research/plans/debate_v2.yaml +110 -0
  346. trade_compass_agent-0.2.0/src/trade_compass_agent/specialists/equity_research/prompts/system.md +13 -0
  347. trade_compass_agent-0.2.0/src/trade_compass_agent/specialists/equity_research/schemas/report.schema.json +49 -0
  348. trade_compass_agent-0.2.0/src/trade_compass_agent/specialists/equity_research/specialist.yaml +44 -0
  349. trade_compass_agent-0.2.0/src/trade_compass_agent/specialists/intraday_tech/prompts/system.md +57 -0
  350. trade_compass_agent-0.2.0/src/trade_compass_agent/specialists/intraday_tech/schemas/report.schema.json +46 -0
  351. trade_compass_agent-0.2.0/src/trade_compass_agent/specialists/intraday_tech/specialist.yaml +38 -0
  352. trade_compass_agent-0.2.0/src/trade_compass_agent/specialists/macro_sentiment/prompts/system.md +52 -0
  353. trade_compass_agent-0.2.0/src/trade_compass_agent/specialists/macro_sentiment/schemas/report.schema.json +46 -0
  354. trade_compass_agent-0.2.0/src/trade_compass_agent/specialists/macro_sentiment/specialist.yaml +30 -0
  355. trade_compass_agent-0.2.0/src/trade_compass_agent/specialists/risk_advisor/prompts/system.md +68 -0
  356. trade_compass_agent-0.2.0/src/trade_compass_agent/specialists/risk_advisor/schemas/report.schema.json +46 -0
  357. trade_compass_agent-0.2.0/src/trade_compass_agent/specialists/risk_advisor/specialist.yaml +34 -0
  358. trade_compass_agent-0.2.0/src/trade_compass_agent/specialists/screener/prompts/system.md +64 -0
  359. trade_compass_agent-0.2.0/src/trade_compass_agent/specialists/screener/schemas/report.schema.json +41 -0
  360. trade_compass_agent-0.2.0/src/trade_compass_agent/specialists/screener/specialist.yaml +35 -0
  361. trade_compass_agent-0.2.0/src/trade_compass_agent/web/__init__.py +1 -0
  362. trade_compass_agent-0.2.0/src/trade_compass_agent/web/agent_api.py +661 -0
  363. trade_compass_agent-0.2.0/src/trade_compass_agent/web/api.py +1543 -0
  364. trade_compass_agent-0.2.0/src/trade_compass_agent/web/app.py +209 -0
  365. trade_compass_agent-0.2.0/src/trade_compass_agent/web/dist.py +31 -0
  366. trade_compass_agent-0.2.0/src/trade_compass_agent/web/monitoring.py +156 -0
  367. trade_compass_agent-0.2.0/src/trade_compass_agent/web/schemas.py +389 -0
  368. trade_compass_agent-0.2.0/src/trade_compass_agent/web/security.py +148 -0
  369. trade_compass_agent-0.2.0/src/trade_compass_agent/web/serializers.py +210 -0
  370. trade_compass_agent-0.2.0/src/trade_compass_agent/web_dist/assets/AuditPage-DQO9AWtH.js +1 -0
  371. trade_compass_agent-0.2.0/src/trade_compass_agent/web_dist/assets/JobsPage-D-MC3R_1.js +21 -0
  372. trade_compass_agent-0.2.0/src/trade_compass_agent/web_dist/assets/KlineMiniChart-CqsU2cXE.js +1 -0
  373. trade_compass_agent-0.2.0/src/trade_compass_agent/web_dist/assets/MarkdownRenderer-BDox8QS1.js +1 -0
  374. trade_compass_agent-0.2.0/src/trade_compass_agent/web_dist/assets/MemoryPage-Cq1W08vX.js +26 -0
  375. trade_compass_agent-0.2.0/src/trade_compass_agent/web_dist/assets/PortfolioPage-BDbocnHb.js +6 -0
  376. trade_compass_agent-0.2.0/src/trade_compass_agent/web_dist/assets/RulesPage-CjjeX6WS.js +2 -0
  377. trade_compass_agent-0.2.0/src/trade_compass_agent/web_dist/assets/SettingsPage-Cuseplh6.js +6 -0
  378. trade_compass_agent-0.2.0/src/trade_compass_agent/web_dist/assets/SkillsPage-C8gvPMZ4.js +11 -0
  379. trade_compass_agent-0.2.0/src/trade_compass_agent/web_dist/assets/index--tyoBXdo.js +174 -0
  380. trade_compass_agent-0.2.0/src/trade_compass_agent/web_dist/assets/index-QIGoAJhP.css +1 -0
  381. trade_compass_agent-0.2.0/src/trade_compass_agent/web_dist/assets/save-B8xtQCmk.js +11 -0
  382. trade_compass_agent-0.2.0/src/trade_compass_agent/web_dist/assets/skeleton-CYmxv80M.js +1 -0
  383. trade_compass_agent-0.2.0/src/trade_compass_agent/web_dist/assets/table-CnZ40eAF.js +1 -0
  384. trade_compass_agent-0.2.0/src/trade_compass_agent/web_dist/assets/vendor-charts-BHQhtJLd.js +37 -0
  385. trade_compass_agent-0.2.0/src/trade_compass_agent/web_dist/assets/vendor-markdown-BofWF16D.js +29 -0
  386. trade_compass_agent-0.2.0/src/trade_compass_agent/web_dist/assets/vendor-query-DoC2nhOp.js +17 -0
  387. trade_compass_agent-0.2.0/src/trade_compass_agent/web_dist/assets/vendor-react-Dwu0DWuy.js +21 -0
  388. trade_compass_agent-0.2.0/src/trade_compass_agent/web_dist/favicon.ico +0 -0
  389. trade_compass_agent-0.2.0/src/trade_compass_agent/web_dist/favicon.svg +43 -0
  390. trade_compass_agent-0.2.0/src/trade_compass_agent/web_dist/index.html +18 -0
  391. trade_compass_agent-0.2.0/src/trade_compass_agent/workflows/catalyst_calendar_cn/workflow.yaml +64 -0
  392. trade_compass_agent-0.2.0/src/trade_compass_agent/workflows/close_check/workflow.yaml +62 -0
  393. trade_compass_agent-0.2.0/src/trade_compass_agent/workflows/eod_review/workflow.yaml +98 -0
  394. trade_compass_agent-0.2.0/src/trade_compass_agent/workflows/equity_research/schemas/output.schema.json +68 -0
  395. trade_compass_agent-0.2.0/src/trade_compass_agent/workflows/equity_research/workflow.yaml +36 -0
  396. trade_compass_agent-0.2.0/src/trade_compass_agent/workflows/idea_generation_cn/workflow.yaml +47 -0
  397. trade_compass_agent-0.2.0/src/trade_compass_agent/workflows/intraday_tech/schemas/output.schema.json +68 -0
  398. trade_compass_agent-0.2.0/src/trade_compass_agent/workflows/intraday_tech/workflow.yaml +36 -0
  399. trade_compass_agent-0.2.0/src/trade_compass_agent/workflows/morning_plan/workflow.yaml +108 -0
  400. trade_compass_agent-0.2.0/src/trade_compass_agent/workflows/postmarket_archive/workflow.yaml +105 -0
  401. trade_compass_agent-0.2.0/src/trade_compass_agent/workflows/premarket_briefing/workflow.yaml +96 -0
  402. trade_compass_agent-0.2.0/src/trade_compass_agent/workflows/risk_advisor/schemas/output.schema.json +68 -0
  403. trade_compass_agent-0.2.0/src/trade_compass_agent/workflows/risk_advisor/workflow.yaml +37 -0
  404. trade_compass_agent-0.2.0/src/trade_compass_agent/workflows/schemas/workflow_output.schema.json +69 -0
  405. trade_compass_agent-0.2.0/src/trade_compass_agent/workflows/weekend_review/workflow.yaml +108 -0
  406. trade_compass_agent-0.2.0/tests/conftest.py +43 -0
  407. trade_compass_agent-0.2.0/tests/runtime/compression/test_budget.py +180 -0
  408. trade_compass_agent-0.2.0/tests/runtime/compression/test_e2e.py +386 -0
  409. trade_compass_agent-0.2.0/tests/runtime/compression/test_summarizer.py +273 -0
  410. trade_compass_agent-0.2.0/tests/runtime/compression/test_trim.py +193 -0
  411. trade_compass_agent-0.2.0/tests/test_account_store.py +76 -0
  412. trade_compass_agent-0.2.0/tests/test_activity_events.py +35 -0
  413. trade_compass_agent-0.2.0/tests/test_agent_api.py +143 -0
  414. trade_compass_agent-0.2.0/tests/test_agent_control.py +92 -0
  415. trade_compass_agent-0.2.0/tests/test_agent_session.py +695 -0
  416. trade_compass_agent-0.2.0/tests/test_agent_stream_replay.py +77 -0
  417. trade_compass_agent-0.2.0/tests/test_agent_tool_timeout.py +28 -0
  418. trade_compass_agent-0.2.0/tests/test_agent_turn_outcome.py +187 -0
  419. trade_compass_agent-0.2.0/tests/test_anti_hallucination.py +185 -0
  420. trade_compass_agent-0.2.0/tests/test_api.py +299 -0
  421. trade_compass_agent-0.2.0/tests/test_audit.py +15 -0
  422. trade_compass_agent-0.2.0/tests/test_channel_subscribers.py +21 -0
  423. trade_compass_agent-0.2.0/tests/test_channels.py +108 -0
  424. trade_compass_agent-0.2.0/tests/test_chokepoint_analyst.py +314 -0
  425. trade_compass_agent-0.2.0/tests/test_cli_serve.py +110 -0
  426. trade_compass_agent-0.2.0/tests/test_cninfo.py +70 -0
  427. trade_compass_agent-0.2.0/tests/test_command_catalog.py +53 -0
  428. trade_compass_agent-0.2.0/tests/test_consolidation_singleton.py +20 -0
  429. trade_compass_agent-0.2.0/tests/test_contradiction.py +124 -0
  430. trade_compass_agent-0.2.0/tests/test_daemon_launchd.py +83 -0
  431. trade_compass_agent-0.2.0/tests/test_daemon_log_rotation.py +125 -0
  432. trade_compass_agent-0.2.0/tests/test_daemon_systemd.py +267 -0
  433. trade_compass_agent-0.2.0/tests/test_daemon_verify.py +130 -0
  434. trade_compass_agent-0.2.0/tests/test_decision_reconciliation.py +371 -0
  435. trade_compass_agent-0.2.0/tests/test_decision_reflection.py +60 -0
  436. trade_compass_agent-0.2.0/tests/test_decision_store.py +117 -0
  437. trade_compass_agent-0.2.0/tests/test_dotenv.py +57 -0
  438. trade_compass_agent-0.2.0/tests/test_dreaming.py +360 -0
  439. trade_compass_agent-0.2.0/tests/test_e2e_memory_system.py +333 -0
  440. trade_compass_agent-0.2.0/tests/test_e2e_trading_day.py +223 -0
  441. trade_compass_agent-0.2.0/tests/test_fetch_url_tool.py +184 -0
  442. trade_compass_agent-0.2.0/tests/test_follow_through.py +20 -0
  443. trade_compass_agent-0.2.0/tests/test_fts5_sanitizer.py +65 -0
  444. trade_compass_agent-0.2.0/tests/test_fundamentals.py +48 -0
  445. trade_compass_agent-0.2.0/tests/test_gateway_handler.py +40 -0
  446. trade_compass_agent-0.2.0/tests/test_hatch_build.py +85 -0
  447. trade_compass_agent-0.2.0/tests/test_install_script.py +256 -0
  448. trade_compass_agent-0.2.0/tests/test_installed_config.py +117 -0
  449. trade_compass_agent-0.2.0/tests/test_instrument_store.py +108 -0
  450. trade_compass_agent-0.2.0/tests/test_intake.py +74 -0
  451. trade_compass_agent-0.2.0/tests/test_job_executor.py +209 -0
  452. trade_compass_agent-0.2.0/tests/test_kronos_adapter.py +296 -0
  453. trade_compass_agent-0.2.0/tests/test_llm_deepseek.py +151 -0
  454. trade_compass_agent-0.2.0/tests/test_logging_config.py +79 -0
  455. trade_compass_agent-0.2.0/tests/test_lot_sizing.py +71 -0
  456. trade_compass_agent-0.2.0/tests/test_market_pulse.py +19 -0
  457. trade_compass_agent-0.2.0/tests/test_mcp.py +241 -0
  458. trade_compass_agent-0.2.0/tests/test_memory_governance.py +334 -0
  459. trade_compass_agent-0.2.0/tests/test_memory_recall.py +55 -0
  460. trade_compass_agent-0.2.0/tests/test_memory_tree.py +69 -0
  461. trade_compass_agent-0.2.0/tests/test_multimodal_api.py +36 -0
  462. trade_compass_agent-0.2.0/tests/test_new_content_metadata.py +77 -0
  463. trade_compass_agent-0.2.0/tests/test_notifications.py +21 -0
  464. trade_compass_agent-0.2.0/tests/test_oms_and_integrations.py +323 -0
  465. trade_compass_agent-0.2.0/tests/test_oms_guardrails.py +222 -0
  466. trade_compass_agent-0.2.0/tests/test_outcome_feedback.py +518 -0
  467. trade_compass_agent-0.2.0/tests/test_p0_p1_p2_fixes.py +268 -0
  468. trade_compass_agent-0.2.0/tests/test_phase2.py +207 -0
  469. trade_compass_agent-0.2.0/tests/test_phase5.py +444 -0
  470. trade_compass_agent-0.2.0/tests/test_portability.py +174 -0
  471. trade_compass_agent-0.2.0/tests/test_portfolio.py +179 -0
  472. trade_compass_agent-0.2.0/tests/test_portfolio_tools.py +269 -0
  473. trade_compass_agent-0.2.0/tests/test_providers.py +150 -0
  474. trade_compass_agent-0.2.0/tests/test_recovery.py +179 -0
  475. trade_compass_agent-0.2.0/tests/test_reflection_resolver.py +148 -0
  476. trade_compass_agent-0.2.0/tests/test_release_cli.py +164 -0
  477. trade_compass_agent-0.2.0/tests/test_rule_performance.py +46 -0
  478. trade_compass_agent-0.2.0/tests/test_rules_store.py +54 -0
  479. trade_compass_agent-0.2.0/tests/test_run_content.py +65 -0
  480. trade_compass_agent-0.2.0/tests/test_run_trace.py +74 -0
  481. trade_compass_agent-0.2.0/tests/test_runtime_skills.py +101 -0
  482. trade_compass_agent-0.2.0/tests/test_scheduler.py +443 -0
  483. trade_compass_agent-0.2.0/tests/test_scheduler_session_isolation.py +71 -0
  484. trade_compass_agent-0.2.0/tests/test_screening.py +182 -0
  485. trade_compass_agent-0.2.0/tests/test_search_tools.py +575 -0
  486. trade_compass_agent-0.2.0/tests/test_semantic_merge.py +105 -0
  487. trade_compass_agent-0.2.0/tests/test_session_cleanup.py +72 -0
  488. trade_compass_agent-0.2.0/tests/test_session_title.py +38 -0
  489. trade_compass_agent-0.2.0/tests/test_setup_wizard.py +261 -0
  490. trade_compass_agent-0.2.0/tests/test_signal_tracking.py +99 -0
  491. trade_compass_agent-0.2.0/tests/test_skill_curator.py +83 -0
  492. trade_compass_agent-0.2.0/tests/test_skill_quality.py +197 -0
  493. trade_compass_agent-0.2.0/tests/test_specialists.py +596 -0
  494. trade_compass_agent-0.2.0/tests/test_static_mount.py +125 -0
  495. trade_compass_agent-0.2.0/tests/test_stream_buffer.py +24 -0
  496. trade_compass_agent-0.2.0/tests/test_ta_tools.py +92 -0
  497. trade_compass_agent-0.2.0/tests/test_trading_signals.py +239 -0
  498. trade_compass_agent-0.2.0/tests/test_turn_outcome_state.py +74 -0
  499. trade_compass_agent-0.2.0/tests/test_tushare_provider.py +109 -0
  500. trade_compass_agent-0.2.0/tests/test_web_security.py +143 -0
  501. trade_compass_agent-0.2.0/tests/test_workflow_governance.py +1308 -0
  502. trade_compass_agent-0.2.0/tests/test_write_gate.py +205 -0
  503. trade_compass_agent-0.2.0/uv.lock +4426 -0
@@ -0,0 +1,72 @@
1
+ ---
2
+ description: Skill 设计规范 — 编写/修改 memory_vault/skills/ 下的 SKILL.md 时遵循此格式
3
+ globs:
4
+ - memory_vault/skills/**/SKILL.md
5
+ ---
6
+
7
+ # Skill 文件规范
8
+
9
+ ## 文件位置
10
+ `memory_vault/skills/<skill-name>/SKILL.md`
11
+
12
+ ## Frontmatter(必填)
13
+
14
+ ```yaml
15
+ ---
16
+ name: <skill-name> # 与目录名一致,kebab-case
17
+ description: <一句话描述> # 中文,20字以内核心功能 + 关键词
18
+ category: <分类> # 见下方分类列表
19
+ ---
20
+ ```
21
+
22
+ ### 分类(category)
23
+
24
+ | 值 | 含义 |
25
+ |---|---|
26
+ | `screening` | 选股/扫描类 |
27
+ | `execution` | 交易执行/事件驱动 |
28
+ | `analysis` | 分析/研判类 |
29
+ | `risk` | 风控/合规类 |
30
+ | `compliance` | 市场规则/合规约束 |
31
+
32
+ ## 正文结构(按顺序)
33
+
34
+ ### 1. `## 适用场景`
35
+ 一段话描述何时应加载/使用此 Skill。
36
+
37
+ ### 2. `## 触发条件` 或 `## 规则`(按需)
38
+ 列出使用此 Skill 的前置条件或核心知识点。
39
+
40
+ ### 3. `## 执行流程`
41
+ 有序步骤,每步标注要调用的工具名(反引号),如:
42
+ ```
43
+ 1. `get_bars(symbol, timeframe="1d", limit=60)` → 获取K线
44
+ 2. `get_market_pulse` → 确认大盘环境
45
+ 3. 满足全部条件 → `emit_signal(rating="buy")`
46
+ ```
47
+
48
+ ### 4. `## 参数`(可选)
49
+ 关键阈值/配置参数,便于后续调优。
50
+
51
+ ### 5. `## 排除条件`(可选)
52
+ 不适用的场景或应跳过的标的。
53
+
54
+ ## 编写原则
55
+
56
+ 1. **中文优先**:描述和规则用中文,工具名/代码保持英文
57
+ 2. **可执行**:每个 Skill 应能直接指导 Agent 行动,不是泛泛而谈
58
+ 3. **无重复**:新建 Skill 前检查是否已有覆盖相同领域的 Skill
59
+ 4. **短小精悍**:控制在 50 行以内;超出则考虑拆分
60
+ 5. **注册**:新 Skill 需在 `config/agent_skills.yaml` 中添加描述
61
+
62
+ ## 现有 Skills 列表
63
+
64
+ | 目录名 | category | 核心职责 |
65
+ |--------|----------|---------|
66
+ | compliance | compliance | A股结构性规则(T+1/涨跌幅/手数/停牌/费用) |
67
+ | risk-veto | risk | 信号否决 + 用户对话风控建议 |
68
+ | momentum-scan | screening | 量价共振筛选 |
69
+ | fund-flow-analysis | analysis | 资金流向分析 |
70
+ | earnings-play | execution | 财报事件驱动 |
71
+ | equity-research | analysis | 个股深度研究 |
72
+ | intraday-tech | analysis | 日内技术分析 |
@@ -0,0 +1,95 @@
1
+ # Trade Compass Agent — local settings template
2
+ # 本地配置模板:复制为 .env 后填入密钥(Copy to .env and fill in secrets)
3
+ #
4
+ # cp .env.example .env
5
+
6
+ # ── Paths / profile ──────────────────────────────────────────────────────────
7
+ # 数据目录 | Local data cache (bars, portfolio, audit)
8
+ TRADE_COMPASS_DATA_DIR=./data
9
+ # 记忆库目录 | Markdown memory vault (rulebooks, reviews, tree/)
10
+ TRADE_COMPASS_MEMORY_DIR=./memory_vault
11
+ # 配置 profile | Matches config/default.yaml profile key
12
+ TRADE_COMPASS_PROFILE=local
13
+
14
+ # ── Server (optional) ────────────────────────────────────────────────────────
15
+ # API 端口 | Default 19704; override --port or this env
16
+ # TRADE_COMPASS_PORT=19704
17
+ # 最大 HTTP 请求体(字节)| Default 10 MiB
18
+ # TRADE_COMPASS_MAX_REQUEST_BYTES=10485760
19
+ # 开发 CORS | Set 1 when Vite dev (:3000) talks to API (:19704)
20
+ # Also set automatically by `trade-compass serve --dev`
21
+ TRADE_COMPASS_DEV_CORS=
22
+
23
+ # ── Data providers (optional) ────────────────────────────────────────────────
24
+ # Tushare token — requires pip install -e ".[tushare]" and data.tushare_enabled: true
25
+ TUSHARE_TOKEN=
26
+
27
+ # 网络代理 | Network proxy — domestic finance APIs (eastmoney/sina) often fail through proxy
28
+ # 建议关闭系统代理,或设置 NO_PROXY 绕过:
29
+ # NO_PROXY=localhost,127.0.0.1,eastmoney.com,.eastmoney.com,push2.eastmoney.com,datacenter-web.eastmoney.com,sina.com.cn,.sina.com.cn
30
+
31
+ # ── LLM providers (optional) ─────────────────────────────────────────────────
32
+ # Default in config/default.yaml: provider deepseek, model deepseek-chat
33
+ OPENAI_API_KEY=
34
+ ANTHROPIC_API_KEY=
35
+ DEEPSEEK_API_KEY=
36
+ OPENROUTER_API_KEY=
37
+
38
+ # ── Vision (image attachment support) ────────────────────────────────────────
39
+ # DeepSeek is text-only; to enable image understanding, configure a vision model.
40
+ # Option A: Use OpenAI (requires OPENAI_API_KEY above)
41
+ # In config/default.yaml set: vision_model: gpt-4o-mini
42
+ # vision_provider: openai
43
+ # vision_api_key_env: OPENAI_API_KEY
44
+ # Option B: Use DashScope (Qwen-VL)
45
+ # DASHSCOPE_API_KEY=
46
+ # In config/default.yaml set: vision_model: qwen-vl-max
47
+ # vision_provider: dashscope
48
+ # vision_api_key_env: DASHSCOPE_API_KEY
49
+
50
+ # ── MCP (optional) ───────────────────────────────────────────────────────────
51
+ # MCP server tokens — keep secrets in gitignored .trade-compass/mcp.json (not in repo).
52
+ # Use ${VAR_NAME} in mcp.json url/headers to reference env vars defined here.
53
+ # EXAMPLE_API_TOKEN=
54
+
55
+ # ── Kronos K-line Forecast (optional) ────────────────────────────────────────
56
+ # Path to cloned Kronos repo — required for kline_forecast tool
57
+ # Install: pip install -e ".[forecast]" && git clone https://github.com/NeoQuasar/Kronos.git
58
+ KRONOS_PATH=
59
+
60
+ # ── Search (optional) ────────────────────────────────────────────────────────
61
+ # Tavily API key for enhanced web search — get one at https://tavily.com
62
+ TAVILY_API_KEY=
63
+ # xAI API key for X (Twitter) search via Grok — get one at https://console.x.ai
64
+ XAI_API_KEY=
65
+
66
+ # ── Notification channels (optional) ────────────────────────────────────────
67
+ # 飞书群 Webhook 推送 | Feishu group bot webhook (push-only)
68
+ FEISHU_WEBHOOK_URL=
69
+ FEISHU_WEBHOOK_SECRET=
70
+ # 飞书应用 Bot 双向 | Feishu app bot (bidirectional, requires lark_oapi)
71
+ FEISHU_APP_ID=
72
+ FEISHU_APP_SECRET=
73
+ # 主动推送目标会话(可选,oc_ 开头的 chat_id;不设则需先给 Bot 发一条消息)
74
+ FEISHU_PUSH_CHAT_ID=
75
+ # 企微群 Webhook 推送 | WeCom group robot webhook (push-only)
76
+ WECOM_WEBHOOK_URL=
77
+ # 企微应用 Bot 双向 | WeCom app bot (bidirectional)
78
+ WECOM_CORP_ID=
79
+ WECOM_AGENT_SECRET=
80
+ WECOM_AGENT_ID=
81
+ # 通用 Webhook | Generic webhook (any URL that accepts POST JSON)
82
+ WEBHOOK_NOTIFICATION_URL=
83
+
84
+ # ── Logging ───────────────────────────────────────────────────────────────────
85
+ # 日志级别 | DEBUG, INFO (default), WARNING, ERROR
86
+ LOG_LEVEL=INFO
87
+ # 日志格式 | "json" for structured JSON lines, empty for colored console
88
+ LOG_FORMAT=
89
+ # 模块级别覆盖 | Per-module override (e.g. LOG_LEVEL_SCREENING=DEBUG)
90
+ # LOG_LEVEL_OPS=DEBUG
91
+ # LOG_LEVEL_RUNTIME=DEBUG
92
+
93
+ # ── Privacy ──────────────────────────────────────────────────────────────────
94
+ # 隐私门控 | Allow memory/review snippets in external LLM calls (learning curator)
95
+ ALLOW_EXTERNAL_LLM_MEMORY=false
@@ -0,0 +1,8 @@
1
+ # Default ownership
2
+ * @AdenChenCoder
3
+
4
+ # Release and security-sensitive surfaces
5
+ /.github/workflows/ @AdenChenCoder
6
+ /pyproject.toml @AdenChenCoder
7
+ /scripts/check_dist.py @AdenChenCoder
8
+ /SECURITY.md @AdenChenCoder
@@ -0,0 +1,59 @@
1
+ name: Bug report
2
+ description: Report a reproducible problem in Trade Compass Agent.
3
+ title: "[Bug]: "
4
+ labels:
5
+ - bug
6
+ body:
7
+ - type: markdown
8
+ attributes:
9
+ value: Do not include API keys, webhook secrets, portfolio exports, or other private trading data.
10
+ - type: input
11
+ id: version
12
+ attributes:
13
+ label: Version
14
+ description: Output from `trade-compass --version`.
15
+ validations:
16
+ required: true
17
+ - type: dropdown
18
+ id: install
19
+ attributes:
20
+ label: Installation method
21
+ options:
22
+ - PyPI / uv tool
23
+ - Editable source checkout
24
+ - Other
25
+ validations:
26
+ required: true
27
+ - type: textarea
28
+ id: expected
29
+ attributes:
30
+ label: Expected behavior
31
+ validations:
32
+ required: true
33
+ - type: textarea
34
+ id: actual
35
+ attributes:
36
+ label: Actual behavior
37
+ validations:
38
+ required: true
39
+ - type: textarea
40
+ id: reproduce
41
+ attributes:
42
+ label: Reproduction steps
43
+ description: Include the smallest safe example and relevant `trade-compass doctor` output.
44
+ validations:
45
+ required: true
46
+ - type: textarea
47
+ id: environment
48
+ attributes:
49
+ label: Environment
50
+ description: OS, Python version, browser, and enabled optional extras. Redact secrets.
51
+ validations:
52
+ required: true
53
+ - type: checkboxes
54
+ id: safety
55
+ attributes:
56
+ label: Safety check
57
+ options:
58
+ - label: I removed credentials and private financial data from this report.
59
+ required: true
@@ -0,0 +1,8 @@
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: Security report
4
+ url: https://github.com/AdenChenCoder/trade-compass-agent/security/advisories/new
5
+ about: Report vulnerabilities privately. Do not disclose them in a public issue.
6
+ - name: Documentation
7
+ url: https://github.com/AdenChenCoder/trade-compass-agent/tree/main/docs
8
+ about: Read installation, configuration, CLI, Skill, architecture, and release guides.
@@ -0,0 +1,35 @@
1
+ name: Feature request
2
+ description: Propose a user-visible improvement.
3
+ title: "[Feature]: "
4
+ labels:
5
+ - enhancement
6
+ body:
7
+ - type: textarea
8
+ id: outcome
9
+ attributes:
10
+ label: Desired user outcome
11
+ description: What should a user be able to observe or accomplish?
12
+ validations:
13
+ required: true
14
+ - type: textarea
15
+ id: current
16
+ attributes:
17
+ label: Current limitation
18
+ validations:
19
+ required: true
20
+ - type: textarea
21
+ id: proposal
22
+ attributes:
23
+ label: Proposed behavior
24
+ description: Describe behavior and compatibility expectations, not only implementation details.
25
+ validations:
26
+ required: true
27
+ - type: textarea
28
+ id: alternatives
29
+ attributes:
30
+ label: Alternatives considered
31
+ - type: textarea
32
+ id: contracts
33
+ attributes:
34
+ label: Compatibility and product contracts
35
+ description: Note any data, workflow, permission, or automation behavior that must remain unchanged.
@@ -0,0 +1,38 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: pip
4
+ directory: "/"
5
+ schedule:
6
+ interval: weekly
7
+ day: monday
8
+ time: "09:00"
9
+ timezone: Asia/Shanghai
10
+ open-pull-requests-limit: 5
11
+ groups:
12
+ python-minor-patch:
13
+ update-types:
14
+ - minor
15
+ - patch
16
+
17
+ - package-ecosystem: npm
18
+ directory: "/"
19
+ schedule:
20
+ interval: weekly
21
+ day: monday
22
+ time: "09:15"
23
+ timezone: Asia/Shanghai
24
+ open-pull-requests-limit: 5
25
+ groups:
26
+ web-minor-patch:
27
+ update-types:
28
+ - minor
29
+ - patch
30
+
31
+ - package-ecosystem: github-actions
32
+ directory: "/"
33
+ schedule:
34
+ interval: weekly
35
+ day: monday
36
+ time: "09:30"
37
+ timezone: Asia/Shanghai
38
+ open-pull-requests-limit: 5
@@ -0,0 +1,26 @@
1
+ ## User outcome
2
+
3
+ Describe the observable problem solved and who benefits.
4
+
5
+ ## Changes
6
+
7
+ Summarize the smallest relevant implementation changes.
8
+
9
+ ## Contracts and risk
10
+
11
+ - Existing behavior or data semantics preserved:
12
+ - Security, privacy, compatibility, or migration impact:
13
+ - Rollback or recovery path:
14
+
15
+ ## Verification
16
+
17
+ - [ ] Python tests and governance checks pass (`scripts/ci_check.sh`).
18
+ - [ ] Web tests and typecheck pass when applicable.
19
+ - [ ] Consumer-facing behavior was exercised.
20
+ - [ ] Built wheel behavior was exercised when package assets or entry points changed.
21
+ - [ ] No secrets, generated runtime data, or private financial data were added.
22
+ - [ ] Documentation and changelog were updated when user-visible behavior changed.
23
+
24
+ ## Release note
25
+
26
+ State the changelog entry, or explain why this change is not user-visible.
@@ -0,0 +1,23 @@
1
+ changelog:
2
+ exclude:
3
+ labels:
4
+ - skip-changelog
5
+ authors:
6
+ - dependabot
7
+ categories:
8
+ - title: Breaking changes
9
+ labels:
10
+ - breaking-change
11
+ - title: Features
12
+ labels:
13
+ - enhancement
14
+ - title: Fixes
15
+ labels:
16
+ - bug
17
+ - bugfix
18
+ - title: Documentation
19
+ labels:
20
+ - documentation
21
+ - title: Other changes
22
+ labels:
23
+ - "*"
@@ -0,0 +1,107 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches-ignore:
6
+ - "dependabot/**"
7
+ pull_request:
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ jobs:
13
+ python-test:
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
17
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
18
+ with:
19
+ python-version: "3.12"
20
+ - name: Install uv
21
+ run: python -m pip install "uv==0.11.32"
22
+ - name: Install locked project dependencies
23
+ run: uv sync --locked --extra dev
24
+ - name: Run Python governance checks
25
+ run: scripts/ci_check.sh
26
+ env:
27
+ PYTHONPATH: src
28
+
29
+ web-build:
30
+ runs-on: ubuntu-latest
31
+ steps:
32
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
33
+ - uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 # v6
34
+ with:
35
+ version: 11.1.3
36
+ - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7
37
+ with:
38
+ node-version: "22"
39
+ cache: pnpm
40
+ - name: Install workspace dependencies
41
+ run: pnpm install --frozen-lockfile
42
+ - name: Build Vite web app
43
+ run: pnpm --dir apps/web build
44
+ - name: Typecheck web app
45
+ run: pnpm --dir apps/web typecheck
46
+ - name: Test web app
47
+ run: pnpm --dir apps/web test
48
+
49
+ wheel-smoke:
50
+ runs-on: ubuntu-latest
51
+ needs: [web-build]
52
+ steps:
53
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
54
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
55
+ with:
56
+ python-version: "3.12"
57
+ - uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 # v6
58
+ with:
59
+ version: 11.1.3
60
+ - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7
61
+ with:
62
+ node-version: "22"
63
+ cache: pnpm
64
+ - name: Install workspace dependencies
65
+ run: pnpm install --frozen-lockfile
66
+ - name: Build distributions and verify installed quickstart
67
+ run: |
68
+ python -m pip install "uv==0.11.32"
69
+ uv build --no-sources
70
+ python scripts/check_dist.py
71
+ python -m pip install dist/*.whl
72
+ export TRADE_COMPASS_HOME="$RUNNER_TEMP/trade-compass-home"
73
+ export DEEPSEEK_API_KEY="ci-placeholder"
74
+ cd "$RUNNER_TEMP"
75
+ trade-compass --version
76
+ trade-compass commands --json
77
+ trade-compass setup
78
+ trade-compass doctor
79
+ python -m trade_compass_agent.release_smoke
80
+ python - <<'PY'
81
+ import os
82
+ from pathlib import Path
83
+
84
+ import trade_compass_agent.web.dist as dist
85
+ from trade_compass_agent.config import (
86
+ PACKAGE_ROOT,
87
+ load_app_config,
88
+ resolve_config_path,
89
+ resolve_schema_path,
90
+ )
91
+
92
+ path = dist.resolve_web_dist()
93
+ assert path is not None, "web_dist missing from installed wheel"
94
+ assert (path / "index.html").is_file()
95
+ print(f"web_dist ok: {path}")
96
+ assert (PACKAGE_ROOT / "workflows" / "catalyst_calendar_cn" / "workflow.yaml").is_file()
97
+ assert (PACKAGE_ROOT / "specialists" / "equity_research" / "specialist.yaml").is_file()
98
+ assert resolve_schema_path("readers/reader_claims.schema.json").is_file()
99
+ config = load_app_config()
100
+ home = Path(os.environ["TRADE_COMPASS_HOME"])
101
+ assert resolve_config_path().resolve() == (home / "config.yaml").resolve()
102
+ assert config.data_dir.resolve() == (home / "data").resolve()
103
+ assert config.memory_dir.resolve() == (home / "memory_vault").resolve()
104
+ assert config.llm.provider == "deepseek"
105
+ assert not str(config.data_dir).startswith(str(PACKAGE_ROOT))
106
+ print("installed config, runtime paths, and package assets ok")
107
+ PY
@@ -0,0 +1,182 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ jobs:
12
+ verify:
13
+ runs-on: ubuntu-latest
14
+ steps:
15
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
16
+ with:
17
+ fetch-depth: 0
18
+ - name: Scan complete Git history
19
+ run: scripts/secret_scan.sh
20
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
21
+ with:
22
+ python-version: "3.12"
23
+ - uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 # v6
24
+ with:
25
+ version: 11.1.3
26
+ - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7
27
+ with:
28
+ node-version: "22"
29
+ cache: pnpm
30
+ - name: Install workspace and project dependencies
31
+ run: |
32
+ pnpm install --frozen-lockfile
33
+ python -m pip install "uv==0.11.32"
34
+ uv sync --locked --extra dev
35
+ - name: Verify Python project
36
+ run: scripts/ci_check.sh
37
+ env:
38
+ PYTHONPATH: src
39
+ - name: Verify web app
40
+ run: |
41
+ pnpm --dir apps/web test
42
+ pnpm --dir apps/web typecheck
43
+ pnpm --dir apps/web build
44
+
45
+ build:
46
+ needs: verify
47
+ runs-on: ubuntu-latest
48
+ steps:
49
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
50
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
51
+ with:
52
+ python-version: "3.12"
53
+ - uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 # v6
54
+ with:
55
+ version: 11.1.3
56
+ - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7
57
+ with:
58
+ node-version: "22"
59
+ cache: pnpm
60
+ - name: Install workspace dependencies
61
+ run: pnpm install --frozen-lockfile
62
+ - name: Build distributions
63
+ run: |
64
+ python -m pip install "uv==0.11.32"
65
+ uv build --no-sources
66
+ python scripts/check_dist.py
67
+ - name: Verify tag matches package version
68
+ run: |
69
+ python - <<'PY'
70
+ import os
71
+ import tomllib
72
+
73
+ with open("pyproject.toml", "rb") as handle:
74
+ version = tomllib.load(handle)["project"]["version"]
75
+ tag = os.environ["GITHUB_REF_NAME"]
76
+ if tag != f"v{version}":
77
+ raise SystemExit(f"tag {tag!r} does not match package version {version!r}")
78
+ PY
79
+ - name: Verify the exact wheel as an installed consumer
80
+ run: |
81
+ python -m venv "$RUNNER_TEMP/release-smoke"
82
+ "$RUNNER_TEMP/release-smoke/bin/python" -m pip install dist/*.whl
83
+ cd "$RUNNER_TEMP"
84
+ export TRADE_COMPASS_HOME="$RUNNER_TEMP/trade-compass-home"
85
+ "$RUNNER_TEMP/release-smoke/bin/trade-compass" --version
86
+ "$RUNNER_TEMP/release-smoke/bin/trade-compass" commands --json
87
+ "$RUNNER_TEMP/release-smoke/bin/python" -m trade_compass_agent.release_smoke
88
+ - name: Build release SBOM and checksums
89
+ run: |
90
+ mkdir -p release-assets
91
+ cp dist/* release-assets/
92
+ cp install.sh release-assets/
93
+ uv export --quiet \
94
+ --locked \
95
+ --format cyclonedx1.5 \
96
+ --all-extras \
97
+ --all-groups \
98
+ --no-emit-project \
99
+ --output-file release-assets/sbom.cdx.json
100
+ cd release-assets
101
+ sha256sum * > SHA256SUMS
102
+ - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
103
+ with:
104
+ name: python-distributions
105
+ path: dist/
106
+ if-no-files-found: error
107
+ - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
108
+ with:
109
+ name: release-assets
110
+ path: release-assets/
111
+ if-no-files-found: error
112
+
113
+ publish:
114
+ needs: build
115
+ runs-on: ubuntu-latest
116
+ environment:
117
+ name: pypi
118
+ url: https://pypi.org/project/trade-compass-agent/
119
+ permissions:
120
+ id-token: write
121
+ steps:
122
+ - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8
123
+ with:
124
+ name: python-distributions
125
+ path: dist
126
+ - uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # release/v1
127
+
128
+ postpublish:
129
+ needs: publish
130
+ runs-on: ubuntu-latest
131
+ steps:
132
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
133
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
134
+ with:
135
+ python-version: "3.12"
136
+ - name: Install and accept the published package
137
+ run: |
138
+ VERSION="${GITHUB_REF_NAME#v}"
139
+ python -m venv "$RUNNER_TEMP/postpublish"
140
+ for attempt in 1 2 3 4 5; do
141
+ if "$RUNNER_TEMP/postpublish/bin/python" -m pip install \
142
+ "trade-compass-agent==$VERSION"; then
143
+ break
144
+ fi
145
+ if [ "$attempt" = 5 ]; then
146
+ exit 1
147
+ fi
148
+ sleep 15
149
+ done
150
+ cd "$RUNNER_TEMP"
151
+ export TRADE_COMPASS_HOME="$RUNNER_TEMP/trade-compass-home"
152
+ "$RUNNER_TEMP/postpublish/bin/trade-compass" --version
153
+ "$RUNNER_TEMP/postpublish/bin/trade-compass" commands --json
154
+ "$RUNNER_TEMP/postpublish/bin/python" -m trade_compass_agent.release_smoke
155
+ - name: Accept the published one-command installer
156
+ run: |
157
+ export HOME="$RUNNER_TEMP/installer-home"
158
+ export TRADE_COMPASS_PACKAGE="trade-compass-agent==${GITHUB_REF_NAME#v}"
159
+ sh install.sh
160
+ test ! -e "$HOME/.trade-compass/config.yaml"
161
+ if command -v uv >/dev/null 2>&1; then
162
+ uv_bin="$(command -v uv)"
163
+ else
164
+ uv_bin="$HOME/.local/bin/uv"
165
+ fi
166
+ tool_bin="$("$uv_bin" tool dir --bin)"
167
+ "$tool_bin/trade-compass" --version
168
+
169
+ github-release:
170
+ needs: postpublish
171
+ runs-on: ubuntu-latest
172
+ permissions:
173
+ contents: write
174
+ steps:
175
+ - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8
176
+ with:
177
+ name: release-assets
178
+ path: release-assets
179
+ - uses: softprops/action-gh-release@3bb12739c298aeb8a4eeaf626c5b8d85266b0e65 # v2
180
+ with:
181
+ files: release-assets/*
182
+ generate_release_notes: true