tradingcodex 0.2.8__tar.gz → 0.2.9__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.
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/PKG-INFO +1 -1
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/docs/deployment.md +5 -3
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/docs/generated-workspaces.md +3 -1
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/docs/interfaces-and-surfaces.md +1 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/pyproject.toml +1 -1
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tests/test_python_migration.py +41 -1
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex.egg-info/PKG-INFO +1 -1
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/__main__.py +1 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/commands/bootstrap.py +8 -1
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/service_autostart.py +62 -7
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/api.py +1 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/static/tradingcodex_web/app.css +1 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/static/tradingcodex_web/app.js +5 -1
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/templates/web/base.html +2 -2
- tradingcodex-0.2.9/tradingcodex_service/version.py +1 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-server/SKILL.md +1 -1
- tradingcodex-0.2.8/tradingcodex_service/version.py +0 -1
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/CONTRIBUTING.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/LICENSE +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/MANIFEST.in +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/NOTICE +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/README.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/TRADEMARKS.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/__init__.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/audit/__init__.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/audit/admin.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/audit/apps.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/audit/migrations/0001_initial.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/audit/migrations/__init__.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/audit/models.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/harness/__init__.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/harness/admin.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/harness/apps.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/harness/migrations/0001_initial.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/harness/migrations/__init__.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/harness/models.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/harness/templatetags/__init__.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/integrations/__init__.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/integrations/admin.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/integrations/apps.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/integrations/migrations/0001_initial.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/integrations/migrations/0002_brokerconnection_brokeraccount_instrumentmap.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/integrations/migrations/__init__.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/integrations/models.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/mcp/__init__.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/mcp/admin.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/mcp/apps.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/mcp/migrations/0001_initial.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/mcp/migrations/__init__.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/mcp/models.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/mcp/services.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/orders/__init__.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/orders/admin.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/orders/apps.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/orders/migrations/0001_initial.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/orders/migrations/0002_approvalreceipt_approved_order_type_and_more.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/orders/migrations/0003_migrate_orderintent_to_orderticket.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/orders/migrations/0004_remove_order_intent_compat_fields.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/orders/migrations/__init__.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/orders/models.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/orders/services.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/policy/__init__.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/policy/admin.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/policy/apps.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/policy/migrations/0001_initial.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/policy/migrations/__init__.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/policy/models.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/policy/services.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/portfolio/__init__.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/portfolio/admin.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/portfolio/apps.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/portfolio/migrations/0001_initial.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/portfolio/migrations/0002_brokersyncrun_portfolioledgerevent_reconciliationrun.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/portfolio/migrations/__init__.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/portfolio/models.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/workflows/__init__.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/workflows/admin.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/workflows/apps.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/workflows/migrations/0001_initial.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/workflows/migrations/__init__.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/apps/workflows/models.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/assets/tradingcodex-banner.svg +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/docs/README.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/docs/artifact-supervisor-loop-prd.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/docs/components.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/docs/core-concepts-and-rules.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/docs/financial-workflow-references.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/docs/guardrails.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/docs/harness.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/docs/improvement-loop.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/docs/licensing-and-commercialization.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/docs/product-direction.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/docs/research-memory-and-artifacts.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/docs/roles-skills-and-workflows.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/docs/safety-policy-and-execution.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/docs/system-architecture.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/docs/validation-and-test-plan.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/install.sh +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/installation.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/setup.cfg +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tests/test_broker_center_prd.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tests/test_e2e_user_scenarios.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex.egg-info/SOURCES.txt +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex.egg-info/dependency_links.txt +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex.egg-info/entry_points.txt +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex.egg-info/requires.txt +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex.egg-info/top_level.txt +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/__init__.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/commands/__init__.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/commands/connectors.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/commands/db.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/commands/decision.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/commands/doctor.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/commands/mcp.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/commands/mode.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/commands/orders.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/commands/policy.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/commands/profile.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/commands/research.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/commands/skills.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/commands/strategies.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/commands/subagents.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/commands/utils.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/commands/workflow.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/commands/workspaces.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/generator.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/mcp_stdio.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_cli/startup_status.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/__init__.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/admin.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/application/__init__.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/application/agents.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/application/artifact_quality.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/application/audit.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/application/brokers.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/application/common.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/application/components.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/application/context_budget.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/application/decision_packages.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/application/harness.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/application/markdown_preview.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/application/orders.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/application/policy.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/application/portfolio.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/application/research.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/application/runtime.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/application/runtime_mode.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/asgi.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/mcp_runtime.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/settings.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/static/tradingcodex_admin/favicon.svg +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/static/vendor/htmx/htmx.min.js +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/templates/web/activity.html +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/templates/web/agent_skills.html +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/templates/web/agents.html +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/templates/web/brokers.html +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/templates/web/dashboard.html +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/templates/web/decisions.html +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/templates/web/fragments/role_inspector.html +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/templates/web/fragments/starter_prompt.html +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/templates/web/fragments/topology_canvas.html +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/templates/web/fragments/workspace_card.html +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/templates/web/harness.html +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/templates/web/mcp_router.html +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/templates/web/orders.html +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/templates/web/policy.html +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/templates/web/portfolio.html +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/templates/web/research.html +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/templates/web/starter_prompt.html +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/templates/web/strategies.html +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/urls.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/web.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/wsgi.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/__init__.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/audit/files/.tradingcodex/audit/README.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/audit/files/trading/audit/.gitkeep +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/audit/module.json +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/codex-base/files/.codex/config.toml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/codex-base/files/.codex/hooks/tradingcodex_hook.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/codex-base/files/.codex/hooks.json +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/codex-base/files/.codex/prompts/base_instructions/head-manager.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/codex-base/files/.codex/rules/tradingcodex.rules +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/codex-base/files/.tradingcodex/capabilities.yaml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/codex-base/files/.tradingcodex/cli.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/codex-base/files/.tradingcodex/config.yaml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/codex-base/files/.tradingcodex/policies/policy-bindings.yaml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/codex-base/files/.tradingcodex/policies/principals.yaml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/codex-base/files/.tradingcodex/policies/roles.yaml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/codex-base/files/AGENTS.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/codex-base/files/pyproject.toml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/codex-base/files/tcx +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/codex-base/module.json +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/policies/access-policies.yaml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/policies/restricted-list.yaml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/approval_receipt.schema.json +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/audit_event.schema.json +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/evidence_pack.schema.json +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/execution_result.schema.json +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/fundamental_report.schema.json +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/news_report.schema.json +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/order_ticket.schema.json +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/portfolio_review.schema.json +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/postmortem_report.schema.json +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/research_artifact.schema.json +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/risk_report.schema.json +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/technical_report.schema.json +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/thesis.schema.json +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/valuation.schema.json +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/enforcement-guardrails/module.json +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/fixed-subagents/files/.codex/agents/execution-operator.toml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/fixed-subagents/files/.codex/agents/fundamental-analyst.toml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/fixed-subagents/files/.codex/agents/instrument-analyst.toml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/fixed-subagents/files/.codex/agents/macro-analyst.toml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/fixed-subagents/files/.codex/agents/news-analyst.toml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/fixed-subagents/files/.codex/agents/portfolio-manager.toml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/fixed-subagents/files/.codex/agents/risk-manager.toml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/fixed-subagents/files/.codex/agents/technical-analyst.toml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/fixed-subagents/files/.codex/agents/valuation-analyst.toml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/fixed-subagents/files/.tradingcodex/mainagent/head-manager.yaml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/fixed-subagents/files/.tradingcodex/mainagent/skill-change-proposals/.gitkeep +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/fixed-subagents/files/.tradingcodex/mainagent/subagent-registry.yaml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/fixed-subagents/module.json +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/guidance-guardrails/files/.tradingcodex/guidance/guardrails.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/guidance-guardrails/files/.tradingcodex/guidance/task-quality-checklist.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/guidance-guardrails/module.json +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/files/.tradingcodex/policies/information-barriers.yaml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/files/.tradingcodex/secrets.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/files/trading/approvals/.gitkeep +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/files/trading/forecasts/.gitkeep +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/files/trading/market-data/.gitkeep +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/files/trading/orders/approved/.gitkeep +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/files/trading/orders/draft/.gitkeep +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/files/trading/orders/executed/.gitkeep +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/files/trading/orders/rejected/.gitkeep +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/files/trading/portfolio/.gitkeep +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/files/trading/reports/fundamental/.gitkeep +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/files/trading/reports/instrument/.gitkeep +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/files/trading/reports/macro/.gitkeep +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/files/trading/reports/news/.gitkeep +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/files/trading/reports/policy/.gitkeep +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/files/trading/reports/portfolio/.gitkeep +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/files/trading/reports/postmortem/.gitkeep +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/files/trading/reports/risk/.gitkeep +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/files/trading/reports/technical/.gitkeep +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/files/trading/reports/valuation/.gitkeep +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/files/trading/research/.gitkeep +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/information-barriers/module.json +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/paper-trading/module.json +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/postmortem/files/.tradingcodex/workflows/postmortem.yaml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/postmortem/module.json +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.agents/skills/postmortem/SKILL.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.agents/skills/postmortem/agents/openai.yaml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.agents/skills/strategy-creator/SKILL.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.agents/skills/strategy-creator/agents/openai.yaml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-build/SKILL.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-build/agents/openai.yaml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-server/agents/openai.yaml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-workflow/SKILL.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-workflow/agents/openai.yaml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-workflow/references/decision-quality-spine.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/execution-operator/execute-paper-order/SKILL.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/execution-operator/execute-paper-order/agents/openai.yaml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/fundamental-analyst/fundamental-analysis/SKILL.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/fundamental-analyst/fundamental-analysis/agents/openai.yaml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/instrument-analyst/instrument-analysis/SKILL.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/instrument-analyst/instrument-analysis/agents/openai.yaml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/macro-analyst/macro-analysis/SKILL.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/macro-analyst/macro-analysis/agents/openai.yaml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/news-analyst/news-analysis/SKILL.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/news-analyst/news-analysis/agents/openai.yaml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/portfolio-manager/create-order-ticket/SKILL.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/portfolio-manager/create-order-ticket/agents/openai.yaml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/portfolio-manager/portfolio-review/SKILL.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/portfolio-manager/portfolio-review/agents/openai.yaml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/approve-order/SKILL.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/approve-order/agents/openai.yaml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/policy-review/SKILL.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/policy-review/agents/openai.yaml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/review-risk/SKILL.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/review-risk/agents/openai.yaml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/anti-overfit-validation/SKILL.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/anti-overfit-validation/agents/openai.yaml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/collect-evidence/SKILL.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/collect-evidence/agents/openai.yaml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/external-data-source-gate/SKILL.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/external-data-source-gate/agents/openai.yaml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/forecasting-discipline/SKILL.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/forecasting-discipline/agents/openai.yaml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/numeric-data-qc/SKILL.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/numeric-data-qc/agents/openai.yaml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/thesis-scenario-tree/SKILL.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/thesis-scenario-tree/agents/openai.yaml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/technical-analyst/technical-analysis/SKILL.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/technical-analyst/technical-analysis/agents/openai.yaml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/valuation-analyst/valuation-review/SKILL.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/valuation-analyst/valuation-review/agents/openai.yaml +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/repo-skills/module.json +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/stub-execution/module.json +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/tradingcodex-mcp/files/.tradingcodex/mcp/enforcer/README.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/tradingcodex-mcp/files/.tradingcodex/mcp/gateway/README.md +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/tradingcodex-mcp/files/.tradingcodex/mcp/server.py +0 -0
- {tradingcodex-0.2.8 → tradingcodex-0.2.9}/workspace_templates/modules/tradingcodex-mcp/module.json +0 -0
|
@@ -141,7 +141,7 @@ python3.11 -m venv /tmp/tcx-testpypi
|
|
|
141
141
|
/tmp/tcx-testpypi/bin/pip install \
|
|
142
142
|
--index-url https://test.pypi.org/simple/ \
|
|
143
143
|
--extra-index-url https://pypi.org/simple/ \
|
|
144
|
-
tradingcodex==0.2.
|
|
144
|
+
tradingcodex==0.2.9
|
|
145
145
|
rm -rf /tmp/tcx-testpypi-smoke
|
|
146
146
|
mkdir -p /tmp/tcx-testpypi-smoke
|
|
147
147
|
cd /tmp/tcx-testpypi-smoke
|
|
@@ -170,7 +170,7 @@ After the PyPI workflow completes:
|
|
|
170
170
|
|
|
171
171
|
```bash
|
|
172
172
|
python3.11 -m venv /tmp/tcx-pypi
|
|
173
|
-
/tmp/tcx-pypi/bin/pip install tradingcodex==0.2.
|
|
173
|
+
/tmp/tcx-pypi/bin/pip install tradingcodex==0.2.9
|
|
174
174
|
rm -rf /tmp/tcx-pypi-smoke
|
|
175
175
|
mkdir -p /tmp/tcx-pypi-smoke
|
|
176
176
|
cd /tmp/tcx-pypi-smoke
|
|
@@ -261,7 +261,9 @@ Use PEP 440 versions:
|
|
|
261
261
|
spine improvements after `0.2.6`
|
|
262
262
|
- `0.2.8` for artifact-supervisor loop concurrency and run-specific workflow
|
|
263
263
|
loop state after `0.2.7`
|
|
264
|
-
-
|
|
264
|
+
- `0.2.9` for stale service replacement and web scroll-state fixes after
|
|
265
|
+
`0.2.8`
|
|
266
|
+
- later patch releases for compatible fixes after `0.2.9`
|
|
265
267
|
- pre-releases such as `0.3.0a1`, `0.3.0b1`, or `0.3.0rc1` when preparing
|
|
266
268
|
the next minor contract
|
|
267
269
|
|
|
@@ -305,6 +305,8 @@ service at `127.0.0.1:48267` while keeping MCP stdio stdout clean.
|
|
|
305
305
|
If the port is already open, MCP startup verifies that the existing process is
|
|
306
306
|
a TradingCodex service with the same package version and central DB path before
|
|
307
307
|
using it.
|
|
308
|
+
When the existing process is an older TradingCodex service backed by the same
|
|
309
|
+
central DB, MCP autostart may stop it and launch the current package instead.
|
|
308
310
|
|
|
309
311
|
The autostart path must be:
|
|
310
312
|
|
|
@@ -322,7 +324,7 @@ or performs package refresh on its own. The emitted context uses marker
|
|
|
322
324
|
`allowed_next_actions`, and `routing_status`.
|
|
323
325
|
|
|
324
326
|
`head-manager` uses `$tcx-server` for service/MCP doctor checks,
|
|
325
|
-
`./tcx service status`, and `./tcx service ensure`. It tells the user that the
|
|
327
|
+
`./tcx service status`, `./tcx service stop`, and `./tcx service ensure`. It tells the user that the
|
|
326
328
|
local dashboard is available at `http://127.0.0.1:48267/` and opens it only
|
|
327
329
|
when explicitly asked. If project MCP config was created or changed, the user
|
|
328
330
|
must fully quit and restart Codex and start a new thread because Codex may not
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "tradingcodex"
|
|
7
|
-
version = "0.2.
|
|
7
|
+
version = "0.2.9"
|
|
8
8
|
description = "Codex-native trading harness with a Django service plane and approved action boundary."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11,<3.15"
|
|
@@ -137,7 +137,7 @@ def test_service_autostart_rejects_version_and_db_mismatch(monkeypatch) -> None:
|
|
|
137
137
|
)
|
|
138
138
|
with pytest.raises(RuntimeError, match="version mismatch") as version_mismatch:
|
|
139
139
|
service_autostart._assert_compatible_service("127.0.0.1", 48267)
|
|
140
|
-
assert "
|
|
140
|
+
assert "tcx service stop 127.0.0.1:48267" in str(version_mismatch.value)
|
|
141
141
|
|
|
142
142
|
monkeypatch.setattr(service_autostart, "tradingcodex_db_path", lambda: Path("/tmp/current.sqlite3"))
|
|
143
143
|
monkeypatch.setattr(
|
|
@@ -150,6 +150,38 @@ def test_service_autostart_rejects_version_and_db_mismatch(monkeypatch) -> None:
|
|
|
150
150
|
assert "same central DB" in str(db_mismatch.value)
|
|
151
151
|
|
|
152
152
|
|
|
153
|
+
def test_service_autostart_replaces_stale_same_db_service(monkeypatch, tmp_path: Path) -> None:
|
|
154
|
+
from tradingcodex_cli import service_autostart
|
|
155
|
+
|
|
156
|
+
current_db = tmp_path / "current.sqlite3"
|
|
157
|
+
state = {"open": True, "version": "0.0.1", "stopped": False, "started": False}
|
|
158
|
+
|
|
159
|
+
monkeypatch.setattr(service_autostart, "tradingcodex_db_path", lambda: current_db)
|
|
160
|
+
monkeypatch.setattr(service_autostart, "_tcp_open", lambda host, port: state["open"])
|
|
161
|
+
monkeypatch.setattr(
|
|
162
|
+
service_autostart,
|
|
163
|
+
"_service_health",
|
|
164
|
+
lambda host, port: {"service": "tradingcodex", "version": state["version"], "db_path": str(current_db)},
|
|
165
|
+
)
|
|
166
|
+
|
|
167
|
+
def stop(addr: str, timeout: float = 5.0) -> bool:
|
|
168
|
+
state["stopped"] = True
|
|
169
|
+
state["open"] = False
|
|
170
|
+
return True
|
|
171
|
+
|
|
172
|
+
def start(*args) -> None:
|
|
173
|
+
state["started"] = True
|
|
174
|
+
state["open"] = True
|
|
175
|
+
state["version"] = TRADINGCODEX_VERSION
|
|
176
|
+
|
|
177
|
+
monkeypatch.setattr(service_autostart, "stop_service", stop)
|
|
178
|
+
monkeypatch.setattr(service_autostart, "_start_service", start)
|
|
179
|
+
|
|
180
|
+
assert service_autostart.ensure_service_up(tmp_path, timeout=0.05) is True
|
|
181
|
+
assert state["stopped"] is True
|
|
182
|
+
assert state["started"] is True
|
|
183
|
+
|
|
184
|
+
|
|
153
185
|
def test_service_status_reports_actionable_state(monkeypatch) -> None:
|
|
154
186
|
from tradingcodex_cli import service_autostart
|
|
155
187
|
|
|
@@ -171,6 +203,7 @@ def test_service_status_reports_actionable_state(monkeypatch) -> None:
|
|
|
171
203
|
assert mismatch["compatible"] is False
|
|
172
204
|
assert mismatch["issue"] == "version_mismatch"
|
|
173
205
|
assert mismatch["package_version"] == TRADINGCODEX_VERSION
|
|
206
|
+
assert "tcx service stop 127.0.0.1:48267" in mismatch["next_action"]
|
|
174
207
|
|
|
175
208
|
monkeypatch.setattr(service_autostart, "tradingcodex_db_path", lambda: Path("/tmp/current.sqlite3"))
|
|
176
209
|
monkeypatch.setattr(
|
|
@@ -213,9 +246,11 @@ def test_service_ensure_uses_autostart_helper(monkeypatch, tmp_path: Path, capsy
|
|
|
213
246
|
from tradingcodex_cli import service_autostart
|
|
214
247
|
|
|
215
248
|
calls: list[tuple[Path, str]] = []
|
|
249
|
+
stopped: list[str] = []
|
|
216
250
|
monkeypatch.chdir(tmp_path)
|
|
217
251
|
monkeypatch.delenv("TRADINGCODEX_WORKSPACE_ROOT", raising=False)
|
|
218
252
|
monkeypatch.setattr(service_autostart, "ensure_service_up", lambda root, addr: calls.append((root, addr)) or True)
|
|
253
|
+
monkeypatch.setattr(service_autostart, "stop_service", lambda addr: stopped.append(addr) or True)
|
|
219
254
|
|
|
220
255
|
cli_main.service(["ensure"])
|
|
221
256
|
|
|
@@ -224,6 +259,11 @@ def test_service_ensure_uses_autostart_helper(monkeypatch, tmp_path: Path, capsy
|
|
|
224
259
|
assert "TradingCodex service started at http://127.0.0.1:48267/" in output
|
|
225
260
|
assert "Health: http://127.0.0.1:48267/api/health" in output
|
|
226
261
|
|
|
262
|
+
cli_main.service(["stop"])
|
|
263
|
+
|
|
264
|
+
assert stopped == ["127.0.0.1:48267"]
|
|
265
|
+
assert "TradingCodex service stopped at http://127.0.0.1:48267/" in capsys.readouterr().out
|
|
266
|
+
|
|
227
267
|
|
|
228
268
|
def test_service_status_cli_supports_plain_and_json(monkeypatch, tmp_path: Path, capsys) -> None:
|
|
229
269
|
from tradingcodex_cli import __main__ as cli_main
|
|
@@ -166,8 +166,15 @@ def service(argv: list[str]) -> None:
|
|
|
166
166
|
print(f"TradingCodex service {'started' if started else 'ready'} at {dashboard_url}")
|
|
167
167
|
print(f"Health: {dashboard_url.rstrip('/')}/api/health")
|
|
168
168
|
return
|
|
169
|
+
if sub == "stop":
|
|
170
|
+
from tradingcodex_cli.service_autostart import service_http_url, stop_service
|
|
171
|
+
|
|
172
|
+
addr = argv[1] if len(argv) > 1 else DEFAULT_SERVICE_ADDR
|
|
173
|
+
stopped = stop_service(addr)
|
|
174
|
+
print(f"TradingCodex service {'stopped' if stopped else 'not running'} at {service_http_url(addr)}")
|
|
175
|
+
return
|
|
169
176
|
if sub != "runserver":
|
|
170
|
-
raise ValueError(f"Usage: {PROGRAM_NAME} service runserver [addrport] [django runserver args]\n {PROGRAM_NAME} service ensure [addrport]\n {PROGRAM_NAME} service status [addrport] [--json]")
|
|
177
|
+
raise ValueError(f"Usage: {PROGRAM_NAME} service runserver [addrport] [django runserver args]\n {PROGRAM_NAME} service ensure [addrport]\n {PROGRAM_NAME} service stop [addrport]\n {PROGRAM_NAME} service status [addrport] [--json]")
|
|
171
178
|
from django.core.management import execute_from_command_line
|
|
172
179
|
from tradingcodex_cli.service_autostart import compatible_service_running, service_http_url
|
|
173
180
|
|
|
@@ -2,6 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import os
|
|
4
4
|
import json
|
|
5
|
+
import signal
|
|
5
6
|
import socket
|
|
6
7
|
import subprocess
|
|
7
8
|
import sys
|
|
@@ -28,13 +29,13 @@ def maybe_autostart_service(workspace_root: Path, source_root: Path | None = Non
|
|
|
28
29
|
|
|
29
30
|
def ensure_service_up(workspace_root: Path, addr: str = DEFAULT_SERVICE_ADDR, source_root: Path | None = None, timeout: float = 8.0) -> bool:
|
|
30
31
|
host, port = _parse_addr(addr)
|
|
31
|
-
if _tcp_open(host, port):
|
|
32
|
-
_assert_compatible_service(host, port)
|
|
32
|
+
if _tcp_open(host, port) and _compatible_service(host, port):
|
|
33
33
|
return False
|
|
34
34
|
with tradingcodex_file_lock(f"service-{host}-{port}"):
|
|
35
|
-
if _tcp_open(host, port):
|
|
36
|
-
_assert_compatible_service(host, port)
|
|
35
|
+
if _tcp_open(host, port) and _compatible_service(host, port):
|
|
37
36
|
return False
|
|
37
|
+
if _tcp_open(host, port):
|
|
38
|
+
_replace_stale_tradingcodex_service_or_raise(host, port, timeout=timeout)
|
|
38
39
|
_start_service(workspace_root, addr, source_root)
|
|
39
40
|
deadline = time.monotonic() + timeout
|
|
40
41
|
while time.monotonic() < deadline:
|
|
@@ -53,6 +54,30 @@ def compatible_service_running(addr: str = DEFAULT_SERVICE_ADDR) -> bool:
|
|
|
53
54
|
return True
|
|
54
55
|
|
|
55
56
|
|
|
57
|
+
def stop_service(addr: str = DEFAULT_SERVICE_ADDR, timeout: float = 5.0) -> bool:
|
|
58
|
+
host, port = _parse_addr(addr)
|
|
59
|
+
normalized_addr = f"{host}:{port}"
|
|
60
|
+
if not _tcp_open(host, port):
|
|
61
|
+
return False
|
|
62
|
+
health = _service_health(host, port)
|
|
63
|
+
if not health or health.get("service") != "tradingcodex":
|
|
64
|
+
raise RuntimeError(f"{normalized_addr} is not a TradingCodex service; stop it outside tcx or choose a free service address.")
|
|
65
|
+
pids = _service_pids(host, port, health)
|
|
66
|
+
if not pids:
|
|
67
|
+
raise RuntimeError(f"Could not find the TradingCodex service process on {normalized_addr}; stop the process using port {port} and retry.")
|
|
68
|
+
for pid in pids:
|
|
69
|
+
try:
|
|
70
|
+
os.kill(pid, signal.SIGTERM)
|
|
71
|
+
except ProcessLookupError:
|
|
72
|
+
pass
|
|
73
|
+
deadline = time.monotonic() + timeout
|
|
74
|
+
while time.monotonic() < deadline:
|
|
75
|
+
if not _tcp_open(host, port):
|
|
76
|
+
return True
|
|
77
|
+
time.sleep(0.2)
|
|
78
|
+
raise RuntimeError(f"Timed out stopping TradingCodex service on {normalized_addr}.")
|
|
79
|
+
|
|
80
|
+
|
|
56
81
|
def service_status(addr: str = DEFAULT_SERVICE_ADDR) -> dict:
|
|
57
82
|
host, port = _parse_addr(addr)
|
|
58
83
|
normalized_addr = f"{host}:{port}"
|
|
@@ -86,7 +111,7 @@ def service_status(addr: str = DEFAULT_SERVICE_ADDR) -> dict:
|
|
|
86
111
|
})
|
|
87
112
|
if status["version"] != TRADINGCODEX_VERSION:
|
|
88
113
|
status["issue"] = "version_mismatch"
|
|
89
|
-
status["next_action"] = "
|
|
114
|
+
status["next_action"] = f"Run `tcx service stop {normalized_addr}` and then restart Codex if MCP uses the default address."
|
|
90
115
|
return status
|
|
91
116
|
if status["db_path"] and status["db_path"] != current_db:
|
|
92
117
|
status["issue"] = "db_mismatch"
|
|
@@ -149,6 +174,19 @@ def _compatible_service(host: str, port: int) -> bool:
|
|
|
149
174
|
return False
|
|
150
175
|
|
|
151
176
|
|
|
177
|
+
def _replace_stale_tradingcodex_service_or_raise(host: str, port: int, *, timeout: float) -> None:
|
|
178
|
+
health = _service_health(host, port)
|
|
179
|
+
service_db = str(health.get("db_path") or "")
|
|
180
|
+
if (
|
|
181
|
+
health.get("service") == "tradingcodex"
|
|
182
|
+
and health.get("version") != TRADINGCODEX_VERSION
|
|
183
|
+
and (not service_db or service_db == str(tradingcodex_db_path()))
|
|
184
|
+
):
|
|
185
|
+
stop_service(f"{host}:{port}", timeout=max(1.0, min(timeout, 5.0)))
|
|
186
|
+
return
|
|
187
|
+
_assert_compatible_service(host, port)
|
|
188
|
+
|
|
189
|
+
|
|
152
190
|
def _assert_compatible_service(host: str, port: int) -> None:
|
|
153
191
|
health = _service_health(host, port)
|
|
154
192
|
addr = f"{host}:{port}"
|
|
@@ -160,8 +198,8 @@ def _assert_compatible_service(host: str, port: int) -> None:
|
|
|
160
198
|
if health.get("version") != TRADINGCODEX_VERSION:
|
|
161
199
|
raise RuntimeError(
|
|
162
200
|
f"TradingCodex service version mismatch: service={health.get('version')} package={TRADINGCODEX_VERSION}. "
|
|
163
|
-
f"
|
|
164
|
-
"
|
|
201
|
+
f"Run `tcx service stop {addr}` or choose a free service address, "
|
|
202
|
+
"then fully restart Codex if project MCP uses the default address."
|
|
165
203
|
)
|
|
166
204
|
service_db = str(health.get("db_path") or "")
|
|
167
205
|
current_db = str(tradingcodex_db_path())
|
|
@@ -182,3 +220,20 @@ def _service_health(host: str, port: int) -> dict:
|
|
|
182
220
|
return data if isinstance(data, dict) else {}
|
|
183
221
|
except Exception:
|
|
184
222
|
return {}
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def _service_pids(host: str, port: int, health: dict) -> list[int]:
|
|
226
|
+
pid = health.get("pid")
|
|
227
|
+
pids = {int(pid)} if isinstance(pid, int) and pid > 0 else set()
|
|
228
|
+
try:
|
|
229
|
+
result = subprocess.run(
|
|
230
|
+
["lsof", f"-tiTCP:{port}", "-sTCP:LISTEN"],
|
|
231
|
+
text=True,
|
|
232
|
+
capture_output=True,
|
|
233
|
+
timeout=1,
|
|
234
|
+
check=False,
|
|
235
|
+
)
|
|
236
|
+
pids.update(int(line) for line in result.stdout.splitlines() if line.strip().isdigit())
|
|
237
|
+
except Exception:
|
|
238
|
+
pass
|
|
239
|
+
return sorted(pids)
|
|
@@ -265,6 +265,7 @@ def health(request):
|
|
|
265
265
|
"service": "tradingcodex",
|
|
266
266
|
"version": __version__,
|
|
267
267
|
"db_path": str(tradingcodex_db_path()),
|
|
268
|
+
"pid": os.getpid(),
|
|
268
269
|
"central_local_service": True,
|
|
269
270
|
"process_scope": os.environ.get("TRADINGCODEX_MCP_SCOPE", "local-service"),
|
|
270
271
|
}
|
{tradingcodex-0.2.8 → tradingcodex-0.2.9}/tradingcodex_service/static/tradingcodex_web/app.js
RENAMED
|
@@ -179,8 +179,12 @@
|
|
|
179
179
|
});
|
|
180
180
|
window.addEventListener("pagehide", saveScroll);
|
|
181
181
|
window.addEventListener("beforeunload", saveScroll);
|
|
182
|
+
document.addEventListener("htmx:beforeRequest", saveScroll);
|
|
183
|
+
document.addEventListener("htmx:afterSettle", () => {
|
|
184
|
+
if (!window.location.hash) restoreScroll();
|
|
185
|
+
});
|
|
182
186
|
document.addEventListener("click", (event) => {
|
|
183
|
-
const link = event.target.closest(statefulLinks);
|
|
187
|
+
const link = event.target instanceof Element ? event.target.closest(statefulLinks) : null;
|
|
184
188
|
if (link) saveScroll();
|
|
185
189
|
});
|
|
186
190
|
})();
|
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
7
7
|
<title>{% block title %}tcx{% endblock %}</title>
|
|
8
8
|
<link rel="icon" type="image/svg+xml" href="{% static 'tradingcodex_admin/favicon.svg' %}">
|
|
9
|
-
<link rel="stylesheet" href="{% static 'tradingcodex_web/app.css' %}?v=tcx-base-
|
|
9
|
+
<link rel="stylesheet" href="{% static 'tradingcodex_web/app.css' %}?v=tcx-base-10">
|
|
10
10
|
<script src="{% static 'vendor/htmx/htmx.min.js' %}" defer></script>
|
|
11
|
-
<script src="{% static 'tradingcodex_web/app.js' %}?v=tcx-web-
|
|
11
|
+
<script src="{% static 'tradingcodex_web/app.js' %}?v=tcx-web-4" defer></script>
|
|
12
12
|
</head>
|
|
13
13
|
<body class="tc-web-body">
|
|
14
14
|
<a class="tc-skip-link" href="#main-content">Skip to content</a>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
TRADINGCODEX_VERSION = "0.2.9"
|
|
@@ -14,7 +14,7 @@ Use this skill for operate-plane TradingCodex status checks, service recovery, d
|
|
|
14
14
|
3. Use `./tcx mode status` and `./tcx update status --json` for mode/update posture.
|
|
15
15
|
4. Use read-only connector commands and MCP tools for broker profile, capability, instrument constraints, sync state, and order status.
|
|
16
16
|
5. If update or build work is requested but build is not enabled, explain that Codex full access plus `tcx mode set build --reason <reason>` is required, or give the terminal command.
|
|
17
|
-
6. If startup context reports `service_issue=version_mismatch`, `db_mismatch`, or `port_occupied`, report the issue with service/package versions or DB paths when present, and give the recorded next action before opening or recommending the dashboard.
|
|
17
|
+
6. If startup context reports `service_issue=version_mismatch`, `db_mismatch`, or `port_occupied`, report the issue with service/package versions or DB paths when present, and give the recorded next action before opening or recommending the dashboard. For a stale same-DB TradingCodex service, prefer `./tcx service stop` and Codex restart so MCP autostart can launch the current package.
|
|
18
18
|
|
|
19
19
|
## Hard Stops
|
|
20
20
|
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
TRADINGCODEX_VERSION = "0.2.8"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|