tradingcodex 0.3.2__tar.gz → 0.3.3__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.3.2 → tradingcodex-0.3.3}/PKG-INFO +2 -2
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/README.md +1 -1
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/docs/README.md +1 -1
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/docs/deployment.md +13 -45
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/docs/generated-workspaces.md +7 -3
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/pyproject.toml +1 -1
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tests/test_python_migration.py +184 -3
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex.egg-info/PKG-INFO +2 -2
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/commands/bootstrap.py +1 -1
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/service_autostart.py +28 -4
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/startup_status.py +39 -7
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/mcp_runtime.py +1 -1
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/static/tradingcodex_web/app.css +2 -2
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/agents.html +15 -12
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/fragments/starter_prompt.html +53 -59
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/research.html +15 -12
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/strategies.html +15 -12
- tradingcodex-0.3.3/tradingcodex_service/version.py +1 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/files/tcx +0 -3
- tradingcodex-0.3.2/tradingcodex_service/version.py +0 -1
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/CONTRIBUTING.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/LICENSE +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/MANIFEST.in +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/NOTICE +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/TRADEMARKS.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/__init__.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/audit/__init__.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/audit/admin.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/audit/apps.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/audit/migrations/0001_initial.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/audit/migrations/__init__.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/audit/models.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/harness/__init__.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/harness/admin.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/harness/apps.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/harness/migrations/0001_initial.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/harness/migrations/__init__.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/harness/models.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/harness/templatetags/__init__.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/integrations/__init__.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/integrations/admin.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/integrations/apps.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/integrations/migrations/0001_initial.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/integrations/migrations/0002_brokerconnection_brokeraccount_instrumentmap.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/integrations/migrations/__init__.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/integrations/models.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/mcp/__init__.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/mcp/admin.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/mcp/apps.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/mcp/migrations/0001_initial.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/mcp/migrations/__init__.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/mcp/models.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/mcp/services.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/orders/__init__.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/orders/admin.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/orders/apps.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/orders/migrations/0001_initial.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/orders/migrations/0002_approvalreceipt_approved_order_type_and_more.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/orders/migrations/0003_migrate_orderintent_to_orderticket.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/orders/migrations/0004_remove_order_intent_compat_fields.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/orders/migrations/__init__.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/orders/models.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/orders/services.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/policy/__init__.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/policy/admin.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/policy/apps.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/policy/migrations/0001_initial.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/policy/migrations/__init__.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/policy/models.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/policy/services.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/portfolio/__init__.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/portfolio/admin.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/portfolio/apps.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/portfolio/migrations/0001_initial.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/portfolio/migrations/0002_brokersyncrun_portfolioledgerevent_reconciliationrun.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/portfolio/migrations/__init__.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/portfolio/models.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/workflows/__init__.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/workflows/admin.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/workflows/apps.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/workflows/migrations/0001_initial.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/workflows/migrations/__init__.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/apps/workflows/models.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/assets/tradingcodex-banner.svg +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/docs/artifact-supervisor-loop-prd.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/docs/components.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/docs/core-concepts-and-rules.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/docs/financial-workflow-references.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/docs/guardrails.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/docs/harness.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/docs/improvement-loop.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/docs/interfaces-and-surfaces.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/docs/licensing-and-commercialization.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/docs/product-direction.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/docs/research-memory-and-artifacts.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/docs/roles-skills-and-workflows.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/docs/safety-policy-and-execution.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/docs/system-architecture.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/docs/user-facing-skills.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/docs/validation-and-test-plan.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/install.sh +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/installation.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/setup.cfg +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tests/test_broker_center_prd.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tests/test_e2e_user_scenarios.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex.egg-info/SOURCES.txt +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex.egg-info/dependency_links.txt +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex.egg-info/entry_points.txt +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex.egg-info/requires.txt +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex.egg-info/top_level.txt +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/__init__.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/__main__.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/commands/__init__.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/commands/connectors.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/commands/db.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/commands/decision.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/commands/doctor.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/commands/mcp.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/commands/mode.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/commands/orders.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/commands/policy.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/commands/profile.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/commands/research.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/commands/skills.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/commands/strategies.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/commands/subagents.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/commands/utils.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/commands/workflow.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/commands/workspaces.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/generator.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_cli/mcp_stdio.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/__init__.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/admin.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/api.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/application/__init__.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/application/agents.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/application/artifact_quality.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/application/audit.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/application/brokers.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/application/common.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/application/components.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/application/context_budget.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/application/decision_packages.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/application/harness.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/application/markdown_preview.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/application/orders.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/application/policy.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/application/portfolio.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/application/research.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/application/runtime.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/application/runtime_mode.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/application/workflow_planner.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/application/workflow_routing.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/asgi.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/settings.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/static/tradingcodex_admin/favicon.svg +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/static/tradingcodex_web/app.js +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/static/vendor/htmx/htmx.min.js +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/activity.html +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/agent_skills.html +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/base.html +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/brokers.html +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/dashboard.html +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/decisions.html +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/fragments/role_inspector.html +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/fragments/topology_canvas.html +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/fragments/workspace_card.html +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/harness.html +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/mcp_router.html +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/orders.html +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/policy.html +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/portfolio.html +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/templates/web/starter_prompt.html +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/urls.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/web.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/tradingcodex_service/wsgi.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/__init__.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/audit/files/.tradingcodex/audit/README.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/audit/files/trading/audit/.gitkeep +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/audit/module.json +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/files/.codex/config.toml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/files/.codex/hooks/tradingcodex_hook.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/files/.codex/hooks.json +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/files/.codex/prompts/base_instructions/head-manager.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/files/.codex/rules/tradingcodex.rules +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/files/.tradingcodex/capabilities.yaml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/files/.tradingcodex/cli.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/files/.tradingcodex/config.yaml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/files/.tradingcodex/policies/policy-bindings.yaml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/files/.tradingcodex/policies/principals.yaml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/files/.tradingcodex/policies/roles.yaml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/files/AGENTS.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/files/pyproject.toml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/codex-base/module.json +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/policies/access-policies.yaml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/policies/restricted-list.yaml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/approval_receipt.schema.json +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/audit_event.schema.json +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/evidence_pack.schema.json +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/execution_result.schema.json +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/fundamental_report.schema.json +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/news_report.schema.json +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/order_ticket.schema.json +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/portfolio_review.schema.json +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/postmortem_report.schema.json +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/research_artifact.schema.json +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/risk_report.schema.json +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/technical_report.schema.json +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/thesis.schema.json +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/valuation.schema.json +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/enforcement-guardrails/module.json +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/fixed-subagents/files/.codex/agents/execution-operator.toml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/fixed-subagents/files/.codex/agents/fundamental-analyst.toml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/fixed-subagents/files/.codex/agents/instrument-analyst.toml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/fixed-subagents/files/.codex/agents/judgment-reviewer.toml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/fixed-subagents/files/.codex/agents/macro-analyst.toml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/fixed-subagents/files/.codex/agents/news-analyst.toml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/fixed-subagents/files/.codex/agents/portfolio-manager.toml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/fixed-subagents/files/.codex/agents/risk-manager.toml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/fixed-subagents/files/.codex/agents/technical-analyst.toml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/fixed-subagents/files/.codex/agents/valuation-analyst.toml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/fixed-subagents/files/.tradingcodex/mainagent/skill-change-proposals/.gitkeep +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/fixed-subagents/module.json +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/guidance-guardrails/files/.tradingcodex/guidance/guardrails.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/guidance-guardrails/files/.tradingcodex/guidance/task-quality-checklist.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/guidance-guardrails/module.json +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/.tradingcodex/policies/information-barriers.yaml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/.tradingcodex/secrets.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/approvals/.gitkeep +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/forecasts/.gitkeep +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/market-data/.gitkeep +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/orders/approved/.gitkeep +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/orders/draft/.gitkeep +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/orders/executed/.gitkeep +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/orders/rejected/.gitkeep +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/portfolio/.gitkeep +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/reports/fundamental/.gitkeep +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/reports/instrument/.gitkeep +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/reports/macro/.gitkeep +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/reports/news/.gitkeep +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/reports/policy/.gitkeep +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/reports/portfolio/.gitkeep +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/reports/postmortem/.gitkeep +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/reports/risk/.gitkeep +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/reports/technical/.gitkeep +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/reports/valuation/.gitkeep +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/files/trading/research/.gitkeep +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/information-barriers/module.json +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/paper-trading/module.json +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/postmortem/files/.tradingcodex/workflows/postmortem.yaml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/postmortem/module.json +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/automate-workflow/SKILL.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/automate-workflow/agents/openai.yaml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/plan-workflow/SKILL.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/plan-workflow/agents/openai.yaml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/postmortem/SKILL.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/postmortem/agents/openai.yaml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/strategy-creator/SKILL.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/strategy-creator/agents/openai.yaml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-build/SKILL.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-build/agents/openai.yaml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-server/SKILL.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-server/agents/openai.yaml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-workflow/SKILL.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-workflow/agents/openai.yaml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.agents/skills/tcx-workflow/references/decision-quality-spine.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/execution-operator/execute-paper-order/SKILL.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/execution-operator/execute-paper-order/agents/openai.yaml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/fundamental-analyst/fundamental-analysis/SKILL.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/fundamental-analyst/fundamental-analysis/agents/openai.yaml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/instrument-analyst/instrument-analysis/SKILL.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/instrument-analyst/instrument-analysis/agents/openai.yaml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/judgment-reviewer/agent-judgment-review/SKILL.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/judgment-reviewer/agent-judgment-review/agents/openai.yaml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/macro-analyst/macro-analysis/SKILL.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/macro-analyst/macro-analysis/agents/openai.yaml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/news-analyst/news-analysis/SKILL.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/news-analyst/news-analysis/agents/openai.yaml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/portfolio-manager/create-order-ticket/SKILL.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/portfolio-manager/create-order-ticket/agents/openai.yaml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/portfolio-manager/portfolio-review/SKILL.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/portfolio-manager/portfolio-review/agents/openai.yaml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/approve-order/SKILL.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/approve-order/agents/openai.yaml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/policy-review/SKILL.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/policy-review/agents/openai.yaml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/review-risk/SKILL.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/review-risk/agents/openai.yaml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/anti-overfit-validation/SKILL.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/anti-overfit-validation/agents/openai.yaml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/collect-evidence/SKILL.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/collect-evidence/agents/openai.yaml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/external-data-source-gate/SKILL.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/external-data-source-gate/agents/openai.yaml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/forecasting-discipline/SKILL.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/forecasting-discipline/agents/openai.yaml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/numeric-data-qc/SKILL.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/numeric-data-qc/agents/openai.yaml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/thesis-scenario-tree/SKILL.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/thesis-scenario-tree/agents/openai.yaml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/technical-analyst/technical-analysis/SKILL.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/technical-analyst/technical-analysis/agents/openai.yaml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/valuation-analyst/valuation-review/SKILL.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/valuation-analyst/valuation-review/agents/openai.yaml +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/repo-skills/module.json +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/stub-execution/module.json +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/tradingcodex-mcp/files/.tradingcodex/mcp/enforcer/README.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/tradingcodex-mcp/files/.tradingcodex/mcp/gateway/README.md +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/tradingcodex-mcp/files/.tradingcodex/mcp/server.py +0 -0
- {tradingcodex-0.3.2 → tradingcodex-0.3.3}/workspace_templates/modules/tradingcodex-mcp/module.json +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tradingcodex
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.3
|
|
4
4
|
Summary: Agentic investment workflow harness for Codex-native research and service-gated execution checks.
|
|
5
5
|
Author: TradingCodex Authors
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -229,7 +229,7 @@ provide investment recommendations or guarantee returns.
|
|
|
229
229
|
| Status | Milestone |
|
|
230
230
|
| --- | --- |
|
|
231
231
|
| Shipped | Generated Codex workspace, fixed role roster, project MCP config, Django service plane, local web dashboard, Admin, Ninja API, file-native research memory, component registry, policy/audit primitives. |
|
|
232
|
-
| Current `0.3.
|
|
232
|
+
| Current `0.3.3` | Flexible package/workspace update status, skipped-version Django migration smoke coverage, brief research chat replies with saved head-manager synthesis reports, Codex-native Decision Packages, independent judgment-review gate, staged workflow planning, artifact-supervisor loop closure state, Evidence Run/Validation Cards, provider capability profiles, and Python `>=3.11,<3.15` support. |
|
|
233
233
|
| Next | Deeper validation scenarios, richer provider capability profiles, stronger generated-workspace smoke coverage, and improved artifact quality tooling. |
|
|
234
234
|
| Future | Separately governed verified adapters, hosted/managed services, enterprise policy/compliance packs, and broker-specific live providers only after explicit product, policy, adapter, and validation work. |
|
|
235
235
|
|
|
@@ -198,7 +198,7 @@ provide investment recommendations or guarantee returns.
|
|
|
198
198
|
| Status | Milestone |
|
|
199
199
|
| --- | --- |
|
|
200
200
|
| Shipped | Generated Codex workspace, fixed role roster, project MCP config, Django service plane, local web dashboard, Admin, Ninja API, file-native research memory, component registry, policy/audit primitives. |
|
|
201
|
-
| Current `0.3.
|
|
201
|
+
| Current `0.3.3` | Flexible package/workspace update status, skipped-version Django migration smoke coverage, brief research chat replies with saved head-manager synthesis reports, Codex-native Decision Packages, independent judgment-review gate, staged workflow planning, artifact-supervisor loop closure state, Evidence Run/Validation Cards, provider capability profiles, and Python `>=3.11,<3.15` support. |
|
|
202
202
|
| Next | Deeper validation scenarios, richer provider capability profiles, stronger generated-workspace smoke coverage, and improved artifact quality tooling. |
|
|
203
203
|
| Future | Separately governed verified adapters, hosted/managed services, enterprise policy/compliance packs, and broker-specific live providers only after explicit product, policy, adapter, and validation work. |
|
|
204
204
|
|
|
@@ -64,7 +64,7 @@ If these layers disagree, treat `docs/` as the durable product intent and fix th
|
|
|
64
64
|
| [interfaces-and-surfaces.md](./interfaces-and-surfaces.md) | Product web, Django Admin, Django Ninja API, MCP boundary, CLI, generated wrapper behavior, and external MCP surface. |
|
|
65
65
|
| [generated-workspaces.md](./generated-workspaces.md) | `tcx attach`, `tcx init`, `tcx update`, generated files, project-scoped MCP config, hooks, workspace provenance, profile scope, and template rules. |
|
|
66
66
|
| [validation-and-test-plan.md](./validation-and-test-plan.md) | Required validation commands, unit/API/generator/smoke coverage, MCP smokes, broker provider smokes, routing scenarios, and release-sensitive checks. |
|
|
67
|
-
| [deployment.md](./deployment.md) | PyPI
|
|
67
|
+
| [deployment.md](./deployment.md) | PyPI release process, CI/CD, Trusted Publishing, installer/update policy, versioning, and what is not deployed. |
|
|
68
68
|
| [licensing-and-commercialization.md](./licensing-and-commercialization.md) | Apache-2.0 open-core boundary, generated workspace ownership, contributions, trademark posture, and legal review needs. |
|
|
69
69
|
|
|
70
70
|
## Change-To-Docs Map
|
|
@@ -34,9 +34,6 @@ Use Python 3.11 for release build verification and keep CI green across the
|
|
|
34
34
|
supported range. The package metadata requires `>=3.11,<3.15`, and CI runs on
|
|
35
35
|
Python 3.11, 3.12, 3.13, and 3.14.
|
|
36
36
|
|
|
37
|
-
Create separate PyPI and TestPyPI accounts. TestPyPI is a separate service and
|
|
38
|
-
does not share login state with PyPI.
|
|
39
|
-
|
|
40
37
|
Configure Trusted Publishing before the first upload. Do not store long-lived
|
|
41
38
|
PyPI API tokens in GitHub repository secrets unless Trusted Publishing is not
|
|
42
39
|
available.
|
|
@@ -46,12 +43,9 @@ Trusted Publisher settings:
|
|
|
46
43
|
| Index | Project | Owner | Repository | Workflow | Environment |
|
|
47
44
|
| --- | --- | --- | --- | --- | --- |
|
|
48
45
|
| PyPI | `tradingcodex` | repository owner/org | repository name | `release.yml` | `pypi` |
|
|
49
|
-
| TestPyPI | `tradingcodex` | repository owner/org | repository name | `release.yml` | `testpypi` |
|
|
50
|
-
|
|
51
|
-
On GitHub, create both environments:
|
|
52
46
|
|
|
53
|
-
|
|
54
|
-
|
|
47
|
+
On GitHub, create the `pypi` environment and require manual approval before
|
|
48
|
+
deployment.
|
|
55
49
|
|
|
56
50
|
## Local Build Verification
|
|
57
51
|
|
|
@@ -101,27 +95,25 @@ It runs on pull requests and pushes to `main` or `develop`:
|
|
|
101
95
|
- builds the package for validation only
|
|
102
96
|
- validates distribution metadata with `twine check`
|
|
103
97
|
|
|
104
|
-
The CI workflow never uploads to
|
|
105
|
-
|
|
98
|
+
The CI workflow never uploads to PyPI. Pushes to `main` or `develop` run tests
|
|
99
|
+
and packaging checks only.
|
|
106
100
|
|
|
107
101
|
Release automation is defined in `.github/workflows/release.yml` and appears as
|
|
108
102
|
`Manual Release` in GitHub Actions.
|
|
109
103
|
|
|
110
104
|
The release workflow is manual-only. Branch pushes and tag pushes must not
|
|
111
|
-
publish package artifacts to
|
|
105
|
+
publish package artifacts to PyPI.
|
|
112
106
|
|
|
113
107
|
The release workflow has additional guardrails:
|
|
114
108
|
|
|
115
109
|
- publication requires `workflow_dispatch`
|
|
116
110
|
- PyPI publication is allowed only from the `main` branch
|
|
117
|
-
- TestPyPI and PyPI publication must be run as separate manual workflow runs
|
|
118
111
|
- concurrent release runs on the same ref are serialized instead of cancelled
|
|
119
112
|
|
|
120
|
-
Manual `workflow_dispatch` can publish to
|
|
121
|
-
`publish_testpypi=true`, and to PyPI when `publish_pypi=true`.
|
|
113
|
+
Manual `workflow_dispatch` can publish to PyPI when `publish_pypi=true`.
|
|
122
114
|
|
|
123
|
-
Keep
|
|
124
|
-
|
|
115
|
+
Keep `publish_pypi=false` when the run should only build and verify
|
|
116
|
+
distributions.
|
|
125
117
|
|
|
126
118
|
The workflow uses PyPI Trusted Publishing. The publish jobs request only an
|
|
127
119
|
OIDC token through `id-token: write`; they do not require API-token secrets.
|
|
@@ -134,32 +126,6 @@ and download do not depend on the deprecated Node.js 20 action runtime.
|
|
|
134
126
|
`tcx update` applies central DB migrations before the updated workspace is used.
|
|
135
127
|
Product flows create, check, approve, and submit `OrderTicket` records directly.
|
|
136
128
|
|
|
137
|
-
## TestPyPI Release
|
|
138
|
-
|
|
139
|
-
Use TestPyPI before the first public PyPI release and after packaging changes.
|
|
140
|
-
|
|
141
|
-
1. Confirm the local build verification steps pass.
|
|
142
|
-
2. Run the `Manual Release` workflow manually with `publish_testpypi=true`.
|
|
143
|
-
3. Install from TestPyPI in a clean environment.
|
|
144
|
-
|
|
145
|
-
Example:
|
|
146
|
-
|
|
147
|
-
```bash
|
|
148
|
-
python3.11 -m venv /tmp/tcx-testpypi
|
|
149
|
-
/tmp/tcx-testpypi/bin/pip install \
|
|
150
|
-
--index-url https://test.pypi.org/simple/ \
|
|
151
|
-
--extra-index-url https://pypi.org/simple/ \
|
|
152
|
-
tradingcodex==0.3.2
|
|
153
|
-
rm -rf /tmp/tcx-testpypi-smoke
|
|
154
|
-
mkdir -p /tmp/tcx-testpypi-smoke
|
|
155
|
-
cd /tmp/tcx-testpypi-smoke
|
|
156
|
-
/tmp/tcx-testpypi/bin/tcx attach .
|
|
157
|
-
./tcx doctor
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
`--extra-index-url` is used because dependencies such as Django may not be
|
|
161
|
-
available on TestPyPI.
|
|
162
|
-
|
|
163
129
|
## PyPI Release
|
|
164
130
|
|
|
165
131
|
Before pushing the release tag:
|
|
@@ -168,7 +134,6 @@ Before pushing the release tag:
|
|
|
168
134
|
- verify `README.md` describes execution as service-gated
|
|
169
135
|
- verify docs mention that live broker execution requires installed providers and explicit gates
|
|
170
136
|
- run local build verification
|
|
171
|
-
- run a TestPyPI release when packaging changed
|
|
172
137
|
|
|
173
138
|
Then create or update the GitHub release/tag as needed, and run the
|
|
174
139
|
`Manual Release` workflow manually with `publish_pypi=true`. Do not rely on tag push for
|
|
@@ -178,7 +143,7 @@ After the PyPI workflow completes:
|
|
|
178
143
|
|
|
179
144
|
```bash
|
|
180
145
|
python3.11 -m venv /tmp/tcx-pypi
|
|
181
|
-
/tmp/tcx-pypi/bin/pip install tradingcodex==0.3.
|
|
146
|
+
/tmp/tcx-pypi/bin/pip install tradingcodex==0.3.3
|
|
182
147
|
rm -rf /tmp/tcx-pypi-smoke
|
|
183
148
|
mkdir -p /tmp/tcx-pypi-smoke
|
|
184
149
|
cd /tmp/tcx-pypi-smoke
|
|
@@ -279,7 +244,10 @@ Use PEP 440 versions:
|
|
|
279
244
|
state fixes after `0.3.0`
|
|
280
245
|
- `0.3.2` for brief research chat replies with saved head-manager synthesis
|
|
281
246
|
reports after `0.3.1`
|
|
282
|
-
-
|
|
247
|
+
- `0.3.3` for flexible update status across package/workspace drift,
|
|
248
|
+
skipped-version Django migration smoke coverage, and PyPI-only release flow
|
|
249
|
+
after `0.3.2`
|
|
250
|
+
- later patch releases for compatible fixes after `0.3.3`
|
|
283
251
|
- pre-releases such as `0.4.0a1`, `0.4.0b1`, or `0.4.0rc1` when preparing
|
|
284
252
|
the next minor contract
|
|
285
253
|
|
|
@@ -250,8 +250,9 @@ user-terminal workspace-only path:
|
|
|
250
250
|
step. If startup health reports `update_status.workspace_update_allowed=true`,
|
|
251
251
|
`head-manager` should tell the user to run
|
|
252
252
|
`update_status.workspace_update_command` from their terminal. If startup health
|
|
253
|
-
reports `update_status.package_update_required_first=true`,
|
|
254
|
-
|
|
253
|
+
reports `update_status.package_update_required_first=true`, including when the
|
|
254
|
+
generated workspace and installed wrapper both match an older release, package
|
|
255
|
+
refresh is also a user-terminal action, normally:
|
|
255
256
|
|
|
256
257
|
```bash
|
|
257
258
|
uvx --refresh --from tradingcodex tcx update .
|
|
@@ -366,7 +367,10 @@ must explain the two supported paths: switch Codex to full access and enable
|
|
|
366
367
|
TradingCodex build mode, or run the recommended `update_status.command` from a
|
|
367
368
|
terminal. Self-update is allowed only when Codex full access and explicit
|
|
368
369
|
workspace build mode are both active and the user asks for the update. After
|
|
369
|
-
self-update, `head-manager` stops and tells the user to restart Codex.
|
|
370
|
+
self-update, `head-manager` stops and tells the user to restart Codex. If a
|
|
371
|
+
same-DB service is already running with a newer TradingCodex version than the
|
|
372
|
+
current wrapper, startup health treats that service version as an update hint
|
|
373
|
+
and should recommend package/workspace refresh before service stop.
|
|
370
374
|
|
|
371
375
|
Build mode is per workspace and explicit:
|
|
372
376
|
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "tradingcodex"
|
|
7
|
-
version = "0.3.
|
|
7
|
+
version = "0.3.3"
|
|
8
8
|
description = "Agentic investment workflow harness for Codex-native research and service-gated execution checks."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11,<3.15"
|
|
@@ -150,7 +150,7 @@ def test_service_autostart_rejects_version_and_db_mismatch(monkeypatch) -> None:
|
|
|
150
150
|
)
|
|
151
151
|
with pytest.raises(RuntimeError, match="version mismatch") as version_mismatch:
|
|
152
152
|
service_autostart._assert_compatible_service("127.0.0.1", 48267)
|
|
153
|
-
assert "tcx
|
|
153
|
+
assert "uvx --refresh --from tradingcodex tcx update ." in str(version_mismatch.value)
|
|
154
154
|
|
|
155
155
|
monkeypatch.setattr(service_autostart, "tradingcodex_db_path", lambda: Path("/tmp/current.sqlite3"))
|
|
156
156
|
monkeypatch.setattr(
|
|
@@ -195,6 +195,24 @@ def test_service_autostart_replaces_stale_same_db_service(monkeypatch, tmp_path:
|
|
|
195
195
|
assert state["started"] is True
|
|
196
196
|
|
|
197
197
|
|
|
198
|
+
def test_service_autostart_does_not_replace_newer_same_db_service(monkeypatch, tmp_path: Path) -> None:
|
|
199
|
+
from tradingcodex_cli import service_autostart
|
|
200
|
+
|
|
201
|
+
current_db = tmp_path / "current.sqlite3"
|
|
202
|
+
monkeypatch.setattr(service_autostart, "tradingcodex_db_path", lambda: current_db)
|
|
203
|
+
monkeypatch.setattr(service_autostart, "_tcp_open", lambda host, port: True)
|
|
204
|
+
monkeypatch.setattr(
|
|
205
|
+
service_autostart,
|
|
206
|
+
"_service_health",
|
|
207
|
+
lambda host, port: {"service": "tradingcodex", "version": "999.0.0", "db_path": str(current_db)},
|
|
208
|
+
)
|
|
209
|
+
monkeypatch.setattr(service_autostart, "stop_service", lambda *args, **kwargs: (_ for _ in ()).throw(AssertionError("stopped newer service")))
|
|
210
|
+
monkeypatch.setattr(service_autostart, "_start_service", lambda *args: (_ for _ in ()).throw(AssertionError("started over newer service")))
|
|
211
|
+
|
|
212
|
+
with pytest.raises(RuntimeError, match="uvx --refresh --from tradingcodex tcx update"):
|
|
213
|
+
service_autostart.ensure_service_up(tmp_path, timeout=0.01)
|
|
214
|
+
|
|
215
|
+
|
|
198
216
|
def test_service_status_reports_actionable_state(monkeypatch) -> None:
|
|
199
217
|
from tradingcodex_cli import service_autostart
|
|
200
218
|
|
|
@@ -218,6 +236,15 @@ def test_service_status_reports_actionable_state(monkeypatch) -> None:
|
|
|
218
236
|
assert mismatch["package_version"] == TRADINGCODEX_VERSION
|
|
219
237
|
assert "tcx service stop 127.0.0.1:48267" in mismatch["next_action"]
|
|
220
238
|
|
|
239
|
+
monkeypatch.setattr(
|
|
240
|
+
service_autostart,
|
|
241
|
+
"_service_health",
|
|
242
|
+
lambda host, port: {"service": "tradingcodex", "version": "999.0.0", "db_path": str(Path("/tmp/current.sqlite3"))},
|
|
243
|
+
)
|
|
244
|
+
newer_service = service_autostart.service_status("127.0.0.1:48267")
|
|
245
|
+
assert newer_service["issue"] == "version_mismatch"
|
|
246
|
+
assert "uvx --refresh --from tradingcodex tcx update ." in newer_service["next_action"]
|
|
247
|
+
|
|
221
248
|
monkeypatch.setattr(service_autostart, "tradingcodex_db_path", lambda: Path("/tmp/current.sqlite3"))
|
|
222
249
|
monkeypatch.setattr(
|
|
223
250
|
service_autostart,
|
|
@@ -230,6 +257,67 @@ def test_service_status_reports_actionable_state(monkeypatch) -> None:
|
|
|
230
257
|
assert compatible["next_action"] == "No action needed."
|
|
231
258
|
|
|
232
259
|
|
|
260
|
+
def test_db_migrate_applies_skipped_django_migrations_and_legacy_order_data(tmp_path: Path) -> None:
|
|
261
|
+
workspace = tmp_path / "skip-migration-workspace"
|
|
262
|
+
workspace.mkdir()
|
|
263
|
+
home = tmp_path / "tc-home-skip-migration"
|
|
264
|
+
env_extra = {"TRADINGCODEX_HOME": str(home), "TRADINGCODEX_DB_NAME": None}
|
|
265
|
+
|
|
266
|
+
run([sys.executable, "manage.py", "migrate", "orders", "0001", "--noinput"], ROOT, env_extra=env_extra)
|
|
267
|
+
db_path = home / "state" / "tradingcodex.sqlite3"
|
|
268
|
+
with sqlite3.connect(db_path) as connection:
|
|
269
|
+
connection.execute(
|
|
270
|
+
"""
|
|
271
|
+
INSERT INTO orders_orderintent (
|
|
272
|
+
intent_id, symbol, side, quantity, limit_price, currency, broker,
|
|
273
|
+
estimated_notional_krw, created_by, created_at, portfolio_id,
|
|
274
|
+
account_id, strategy_id, workspace_context, payload
|
|
275
|
+
)
|
|
276
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
277
|
+
""",
|
|
278
|
+
(
|
|
279
|
+
"legacy-intent-1",
|
|
280
|
+
"NVDA",
|
|
281
|
+
"buy",
|
|
282
|
+
"1",
|
|
283
|
+
"100",
|
|
284
|
+
"USD",
|
|
285
|
+
"paper",
|
|
286
|
+
"100",
|
|
287
|
+
"portfolio-manager",
|
|
288
|
+
"2026-01-01 00:00:00",
|
|
289
|
+
"default-paper",
|
|
290
|
+
"local-paper",
|
|
291
|
+
"default-strategy",
|
|
292
|
+
"{}",
|
|
293
|
+
json.dumps({"order_intent": {"order_ticket_id": "legacy-ticket-1", "symbol": "NVDA", "side": "buy", "quantity": "1"}}),
|
|
294
|
+
),
|
|
295
|
+
)
|
|
296
|
+
|
|
297
|
+
migrated = json.loads(run([sys.executable, "-m", "tradingcodex_cli", "db", "migrate"], workspace, env_extra=env_extra).stdout)
|
|
298
|
+
assert migrated["status"] == "migrated"
|
|
299
|
+
with sqlite3.connect(db_path) as connection:
|
|
300
|
+
applied = {
|
|
301
|
+
(row[0], row[1])
|
|
302
|
+
for row in connection.execute("SELECT app, name FROM django_migrations")
|
|
303
|
+
}
|
|
304
|
+
tables = {
|
|
305
|
+
row[0]
|
|
306
|
+
for row in connection.execute("SELECT name FROM sqlite_master WHERE type='table'")
|
|
307
|
+
}
|
|
308
|
+
ticket = connection.execute(
|
|
309
|
+
"SELECT ticket_id, symbol, side, payload_hash FROM orders_orderticket WHERE ticket_id = ?",
|
|
310
|
+
("legacy-ticket-1",),
|
|
311
|
+
).fetchone()
|
|
312
|
+
|
|
313
|
+
assert ("orders", "0004_remove_order_intent_compat_fields") in applied
|
|
314
|
+
assert ("integrations", "0002_brokerconnection_brokeraccount_instrumentmap") in applied
|
|
315
|
+
assert "orders_orderintent" not in tables
|
|
316
|
+
assert ticket is not None
|
|
317
|
+
assert ticket[:3] == ("legacy-ticket-1", "NVDA", "buy")
|
|
318
|
+
assert ticket[3]
|
|
319
|
+
|
|
320
|
+
|
|
233
321
|
def test_service_runserver_uses_fixed_port_and_skips_duplicate(monkeypatch, tmp_path: Path, capsys) -> None:
|
|
234
322
|
from django.core import management
|
|
235
323
|
from tradingcodex_cli import __main__ as cli_main
|
|
@@ -351,6 +439,49 @@ def test_startup_status_preserves_service_mismatch_details(monkeypatch, tmp_path
|
|
|
351
439
|
assert status["allowed_next_actions"][0] == service_detail["next_action"]
|
|
352
440
|
|
|
353
441
|
|
|
442
|
+
def test_startup_status_uses_same_db_newer_service_as_update_hint(monkeypatch, tmp_path: Path) -> None:
|
|
443
|
+
from tradingcodex_cli import startup_status
|
|
444
|
+
|
|
445
|
+
workspace = make_workspace(tmp_path)
|
|
446
|
+
module_lock_path = workspace / ".tradingcodex" / "generated" / "module-lock.json"
|
|
447
|
+
module_lock = json.loads(module_lock_path.read_text(encoding="utf-8"))
|
|
448
|
+
module_lock["tradingcodex_version"] = "0.3.1"
|
|
449
|
+
module_lock_path.write_text(json.dumps(module_lock, indent=2) + "\n", encoding="utf-8")
|
|
450
|
+
db_path = "/tmp/current.sqlite3"
|
|
451
|
+
monkeypatch.setattr(startup_status, "TRADINGCODEX_VERSION", "0.3.1")
|
|
452
|
+
monkeypatch.setattr(
|
|
453
|
+
startup_status,
|
|
454
|
+
"latest_release_info",
|
|
455
|
+
lambda: (_ for _ in ()).throw(AssertionError("latest release check should use service hint")),
|
|
456
|
+
)
|
|
457
|
+
monkeypatch.setattr(
|
|
458
|
+
startup_status,
|
|
459
|
+
"inspect_service_status",
|
|
460
|
+
lambda addr: {
|
|
461
|
+
"addr": addr,
|
|
462
|
+
"url": f"http://{addr}/",
|
|
463
|
+
"reachable": True,
|
|
464
|
+
"compatible": False,
|
|
465
|
+
"service": "tradingcodex",
|
|
466
|
+
"version": "0.3.2",
|
|
467
|
+
"package_version": "0.3.1",
|
|
468
|
+
"db_path": db_path,
|
|
469
|
+
"expected_db_path": db_path,
|
|
470
|
+
"issue": "version_mismatch",
|
|
471
|
+
"next_action": "Run package refresh.",
|
|
472
|
+
},
|
|
473
|
+
)
|
|
474
|
+
monkeypatch.setattr(startup_status, "_read_health", lambda url: {"service": "tradingcodex", "version": "0.3.2", "db_path": db_path})
|
|
475
|
+
|
|
476
|
+
status = startup_status.build_server_status(workspace)
|
|
477
|
+
|
|
478
|
+
update_status = status["update_status"]
|
|
479
|
+
assert update_status["versions_match"] is True
|
|
480
|
+
assert update_status["latest_release_source"] == "service_status"
|
|
481
|
+
assert update_status["package_update_required"] is True
|
|
482
|
+
assert update_status["command"] == "uvx --refresh --from tradingcodex tcx update ."
|
|
483
|
+
|
|
484
|
+
|
|
354
485
|
def test_manage_runserver_uses_fixed_port_and_skips_duplicate(monkeypatch, capsys) -> None:
|
|
355
486
|
from tradingcodex_cli import service_autostart
|
|
356
487
|
|
|
@@ -898,6 +1029,55 @@ def test_session_start_update_recommendation_respects_home_preference(tmp_path:
|
|
|
898
1029
|
assert run_user_prompt_hook(workspace, "Create a quality income strategy for dividend stocks") is None
|
|
899
1030
|
|
|
900
1031
|
|
|
1032
|
+
def test_update_status_detects_stale_package_when_workspace_matches_installed(monkeypatch, tmp_path: Path) -> None:
|
|
1033
|
+
from tradingcodex_cli import startup_status
|
|
1034
|
+
|
|
1035
|
+
workspace = make_workspace(tmp_path)
|
|
1036
|
+
module_lock_path = workspace / ".tradingcodex" / "generated" / "module-lock.json"
|
|
1037
|
+
module_lock = json.loads(module_lock_path.read_text(encoding="utf-8"))
|
|
1038
|
+
module_lock["tradingcodex_version"] = "0.3.1"
|
|
1039
|
+
module_lock_path.write_text(json.dumps(module_lock, indent=2) + "\n", encoding="utf-8")
|
|
1040
|
+
monkeypatch.setattr(startup_status, "TRADINGCODEX_VERSION", "0.3.1")
|
|
1041
|
+
monkeypatch.setattr(
|
|
1042
|
+
startup_status,
|
|
1043
|
+
"latest_release_info",
|
|
1044
|
+
lambda: {"latest_release_version": "0.3.2", "latest_release_status": "ok", "latest_release_source": "test"},
|
|
1045
|
+
)
|
|
1046
|
+
|
|
1047
|
+
update_status = startup_status.build_update_status(workspace, check_latest_release=True)
|
|
1048
|
+
|
|
1049
|
+
assert update_status["versions_match"] is True
|
|
1050
|
+
assert update_status["workspace_update_available"] is False
|
|
1051
|
+
assert update_status["package_update_required"] is True
|
|
1052
|
+
assert update_status["package_update_required_first"] is True
|
|
1053
|
+
assert update_status["update_available"] is True
|
|
1054
|
+
assert update_status["command"] == "uvx --refresh --from tradingcodex tcx update ."
|
|
1055
|
+
|
|
1056
|
+
|
|
1057
|
+
def test_update_status_uses_service_hint_when_latest_check_unavailable(monkeypatch, tmp_path: Path) -> None:
|
|
1058
|
+
from tradingcodex_cli import startup_status
|
|
1059
|
+
|
|
1060
|
+
workspace = make_workspace(tmp_path)
|
|
1061
|
+
module_lock_path = workspace / ".tradingcodex" / "generated" / "module-lock.json"
|
|
1062
|
+
module_lock = json.loads(module_lock_path.read_text(encoding="utf-8"))
|
|
1063
|
+
module_lock["tradingcodex_version"] = "0.3.0"
|
|
1064
|
+
module_lock_path.write_text(json.dumps(module_lock, indent=2) + "\n", encoding="utf-8")
|
|
1065
|
+
monkeypatch.setattr(startup_status, "TRADINGCODEX_VERSION", "0.3.1")
|
|
1066
|
+
monkeypatch.setattr(
|
|
1067
|
+
startup_status,
|
|
1068
|
+
"latest_release_info",
|
|
1069
|
+
lambda: {"latest_release_version": "unknown", "latest_release_status": "unavailable", "latest_release_source": "test"},
|
|
1070
|
+
)
|
|
1071
|
+
|
|
1072
|
+
update_status = startup_status.build_update_status(workspace, latest_version_hint="0.3.2")
|
|
1073
|
+
|
|
1074
|
+
assert update_status["workspace_update_available"] is True
|
|
1075
|
+
assert update_status["latest_release_source"] == "service_status"
|
|
1076
|
+
assert update_status["package_update_required"] is True
|
|
1077
|
+
assert update_status["workspace_update_allowed"] is False
|
|
1078
|
+
assert update_status["command"] == "uvx --refresh --from tradingcodex tcx update ."
|
|
1079
|
+
|
|
1080
|
+
|
|
901
1081
|
def test_repo_skill_templates_keep_instruction_boundary() -> None:
|
|
902
1082
|
skill_root = ROOT / "workspace_templates" / "modules" / "repo-skills" / "files" / ".agents" / "skills"
|
|
903
1083
|
subagent_skill_root = ROOT / "workspace_templates" / "modules" / "repo-skills" / "files" / ".tradingcodex" / "subagents" / "skills"
|
|
@@ -1393,7 +1573,7 @@ def test_runtime_mode_update_and_connector_build_cli(tmp_path: Path) -> None:
|
|
|
1393
1573
|
module_lock_path.write_text(json.dumps(module_lock, indent=2) + "\n", encoding="utf-8")
|
|
1394
1574
|
update_status = json.loads(
|
|
1395
1575
|
run(
|
|
1396
|
-
["./tcx", "update", "status", "--json"],
|
|
1576
|
+
["./tcx", "update", "status", "--json", "--skip-refresh"],
|
|
1397
1577
|
workspace,
|
|
1398
1578
|
env_extra={"TRADINGCODEX_CODEX_PERMISSION": "danger-full-access", "TRADINGCODEX_LATEST_RELEASE_VERSION": TRADINGCODEX_VERSION},
|
|
1399
1579
|
).stdout
|
|
@@ -1693,6 +1873,7 @@ def test_update_refreshes_workspace_contract_and_preserves_identity(tmp_path: Pa
|
|
|
1693
1873
|
assert module_lock["tradingcodex_version"] == TRADINGCODEX_VERSION
|
|
1694
1874
|
assert module_lock["tradingcodex_package_spec"] == "tradingcodex"
|
|
1695
1875
|
assert 'TRADINGCODEX_UPDATE_SKIP_REFRESH="${TRADINGCODEX_UPDATE_SKIP_REFRESH:-0}"' in wrapper
|
|
1876
|
+
assert 'if [ "${1:-}" = "update" ] && [ "${2:-}" = "status" ]; then' not in wrapper
|
|
1696
1877
|
assert 'if [ "${1:-}" = "update" ] && [ "$TRADINGCODEX_UPDATE_SKIP_REFRESH" != "1" ] && command -v uvx >/dev/null 2>&1; then' in wrapper
|
|
1697
1878
|
assert '"--skip-refresh"' in wrapper
|
|
1698
1879
|
assert " ./tcx doctor" in updated.stdout
|
|
@@ -4601,7 +4782,7 @@ def test_product_web_does_not_create_approvals_or_executions(monkeypatch) -> Non
|
|
|
4601
4782
|
assert "Idea translated" in decision_body
|
|
4602
4783
|
assert "candidate thesis" in decision_body
|
|
4603
4784
|
assert "Portfolio fit" in decision_body
|
|
4604
|
-
assert "Reviews the business, financial drivers" in decision_body
|
|
4785
|
+
assert "Reviews the business, financial drivers" not in decision_body
|
|
4605
4786
|
assert "workflow reaches portfolio/order readiness" in decision_body
|
|
4606
4787
|
assert "Next allowed actions" in decision_body
|
|
4607
4788
|
assert "Answer missing profile questions" in decision_body
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tradingcodex
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.3
|
|
4
4
|
Summary: Agentic investment workflow harness for Codex-native research and service-gated execution checks.
|
|
5
5
|
Author: TradingCodex Authors
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -229,7 +229,7 @@ provide investment recommendations or guarantee returns.
|
|
|
229
229
|
| Status | Milestone |
|
|
230
230
|
| --- | --- |
|
|
231
231
|
| Shipped | Generated Codex workspace, fixed role roster, project MCP config, Django service plane, local web dashboard, Admin, Ninja API, file-native research memory, component registry, policy/audit primitives. |
|
|
232
|
-
| Current `0.3.
|
|
232
|
+
| Current `0.3.3` | Flexible package/workspace update status, skipped-version Django migration smoke coverage, brief research chat replies with saved head-manager synthesis reports, Codex-native Decision Packages, independent judgment-review gate, staged workflow planning, artifact-supervisor loop closure state, Evidence Run/Validation Cards, provider capability profiles, and Python `>=3.11,<3.15` support. |
|
|
233
233
|
| Next | Deeper validation scenarios, richer provider capability profiles, stronger generated-workspace smoke coverage, and improved artifact quality tooling. |
|
|
234
234
|
| Future | Separately governed verified adapters, hosted/managed services, enterprise policy/compliance packs, and broker-specific live providers only after explicit product, policy, adapter, and validation work. |
|
|
235
235
|
|
|
@@ -115,7 +115,7 @@ def update_status(argv: list[str]) -> None:
|
|
|
115
115
|
parser.add_argument("project_dir", nargs="?", default=".")
|
|
116
116
|
args = parser.parse_args(argv)
|
|
117
117
|
root = configure_workspace_env(Path(args.project_dir).resolve(), force=True)
|
|
118
|
-
status = build_update_status(root)
|
|
118
|
+
status = build_update_status(root, check_latest_release=True)
|
|
119
119
|
if args.json:
|
|
120
120
|
print_json(status)
|
|
121
121
|
return
|
|
@@ -3,6 +3,8 @@ from __future__ import annotations
|
|
|
3
3
|
import os
|
|
4
4
|
import json
|
|
5
5
|
import signal
|
|
6
|
+
import re
|
|
7
|
+
import shlex
|
|
6
8
|
import socket
|
|
7
9
|
import subprocess
|
|
8
10
|
import sys
|
|
@@ -111,7 +113,7 @@ def service_status(addr: str = DEFAULT_SERVICE_ADDR) -> dict:
|
|
|
111
113
|
})
|
|
112
114
|
if status["version"] != TRADINGCODEX_VERSION:
|
|
113
115
|
status["issue"] = "version_mismatch"
|
|
114
|
-
status["next_action"] =
|
|
116
|
+
status["next_action"] = _version_mismatch_next_action(status["version"], normalized_addr)
|
|
115
117
|
return status
|
|
116
118
|
if status["db_path"] and status["db_path"] != current_db:
|
|
117
119
|
status["issue"] = "db_mismatch"
|
|
@@ -179,7 +181,7 @@ def _replace_stale_tradingcodex_service_or_raise(host: str, port: int, *, timeou
|
|
|
179
181
|
service_db = str(health.get("db_path") or "")
|
|
180
182
|
if (
|
|
181
183
|
health.get("service") == "tradingcodex"
|
|
182
|
-
and health.get("version")
|
|
184
|
+
and _version_less_than(str(health.get("version") or ""), TRADINGCODEX_VERSION)
|
|
183
185
|
and (not service_db or service_db == str(tradingcodex_db_path()))
|
|
184
186
|
):
|
|
185
187
|
stop_service(f"{host}:{port}", timeout=max(1.0, min(timeout, 5.0)))
|
|
@@ -198,8 +200,7 @@ def _assert_compatible_service(host: str, port: int) -> None:
|
|
|
198
200
|
if health.get("version") != TRADINGCODEX_VERSION:
|
|
199
201
|
raise RuntimeError(
|
|
200
202
|
f"TradingCodex service version mismatch: service={health.get('version')} package={TRADINGCODEX_VERSION}. "
|
|
201
|
-
f"
|
|
202
|
-
"then fully restart Codex if project MCP uses the default address."
|
|
203
|
+
f"{_version_mismatch_next_action(str(health.get('version') or ''), addr)}"
|
|
203
204
|
)
|
|
204
205
|
service_db = str(health.get("db_path") or "")
|
|
205
206
|
current_db = str(tradingcodex_db_path())
|
|
@@ -237,3 +238,26 @@ def _service_pids(host: str, port: int, health: dict) -> list[int]:
|
|
|
237
238
|
except Exception:
|
|
238
239
|
pass
|
|
239
240
|
return sorted(pids)
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
def _version_mismatch_next_action(service_version: str, addr: str) -> str:
|
|
244
|
+
if _version_less_than(TRADINGCODEX_VERSION, service_version):
|
|
245
|
+
package_spec = shlex.quote(os.environ.get("TRADINGCODEX_MCP_PACKAGE_SPEC", "tradingcodex"))
|
|
246
|
+
return f"Run `uvx --refresh --from {package_spec} tcx update .`, then fully restart Codex so MCP reloads the refreshed package."
|
|
247
|
+
return f"Run `tcx service stop {addr}` and then restart Codex if MCP uses the default address."
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
def _version_less_than(left: str, right: str) -> bool:
|
|
251
|
+
left_key = _release_version_key(left)
|
|
252
|
+
right_key = _release_version_key(right)
|
|
253
|
+
if not left_key or not right_key:
|
|
254
|
+
return False
|
|
255
|
+
length = max(len(left_key), len(right_key))
|
|
256
|
+
return left_key + (0,) * (length - len(left_key)) < right_key + (0,) * (length - len(right_key))
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
def _release_version_key(version: str) -> tuple[int, ...]:
|
|
260
|
+
match = re.match(r"^\s*(\d+(?:\.\d+)*)", version)
|
|
261
|
+
if not match:
|
|
262
|
+
return ()
|
|
263
|
+
return tuple(int(part) for part in match.group(1).split("."))
|
|
@@ -28,8 +28,14 @@ def build_server_status(workspace_root: Path | str, addr: str | None = None) ->
|
|
|
28
28
|
health_url = f"{dashboard_url.rstrip('/')}/api/health"
|
|
29
29
|
permission_status = detect_codex_permission_status(root)
|
|
30
30
|
mode_status = get_runtime_mode_status(root, full_access_detected=permission_status["full_access_detected"])
|
|
31
|
-
update_status = build_update_status(root, permission_status=permission_status, mode_status=mode_status)
|
|
32
31
|
service_detail = inspect_service_status(service_addr)
|
|
32
|
+
latest_version_hint = _latest_version_hint_from_service(service_detail)
|
|
33
|
+
update_status = build_update_status(
|
|
34
|
+
root,
|
|
35
|
+
permission_status=permission_status,
|
|
36
|
+
mode_status=mode_status,
|
|
37
|
+
latest_version_hint=latest_version_hint,
|
|
38
|
+
)
|
|
33
39
|
health = _read_health(health_url) if service_detail.get("reachable") else {}
|
|
34
40
|
service_state = _service_state_from_detail(service_detail)
|
|
35
41
|
mcp_config_present = _is_project_mcp_config_present(root)
|
|
@@ -121,6 +127,8 @@ def build_update_status(
|
|
|
121
127
|
*,
|
|
122
128
|
permission_status: dict[str, Any] | None = None,
|
|
123
129
|
mode_status: dict[str, Any] | None = None,
|
|
130
|
+
check_latest_release: bool = False,
|
|
131
|
+
latest_version_hint: str = "",
|
|
124
132
|
) -> dict[str, Any]:
|
|
125
133
|
root = Path(workspace_root).expanduser().resolve()
|
|
126
134
|
permission_status = permission_status or detect_codex_permission_status(root)
|
|
@@ -134,8 +142,21 @@ def build_update_status(
|
|
|
134
142
|
suppressed = bool(preferences.get("suppress_update_recommendation"))
|
|
135
143
|
versions_match = workspace_version == installed_version
|
|
136
144
|
workspace_update_available = workspace_version not in {"", "unknown"} and not versions_match
|
|
137
|
-
|
|
145
|
+
latest_version_hint = latest_version_hint.strip()
|
|
146
|
+
if workspace_update_available or check_latest_release:
|
|
138
147
|
latest = latest_release_info()
|
|
148
|
+
if latest["latest_release_status"] != "ok" and latest_version_hint and version_less_than(installed_version, latest_version_hint):
|
|
149
|
+
latest = {
|
|
150
|
+
"latest_release_version": latest_version_hint,
|
|
151
|
+
"latest_release_status": "ok",
|
|
152
|
+
"latest_release_source": "service_status",
|
|
153
|
+
}
|
|
154
|
+
elif latest_version_hint and version_less_than(installed_version, latest_version_hint):
|
|
155
|
+
latest = {
|
|
156
|
+
"latest_release_version": latest_version_hint,
|
|
157
|
+
"latest_release_status": "ok",
|
|
158
|
+
"latest_release_source": "service_status",
|
|
159
|
+
}
|
|
139
160
|
else:
|
|
140
161
|
latest = {
|
|
141
162
|
"latest_release_version": "not_checked",
|
|
@@ -145,14 +166,15 @@ def build_update_status(
|
|
|
145
166
|
latest_version = latest["latest_release_version"]
|
|
146
167
|
latest_status = latest["latest_release_status"]
|
|
147
168
|
installed_release_is_stale = latest_status == "ok" and version_less_than(installed_version, latest_version)
|
|
148
|
-
|
|
169
|
+
package_update_required = installed_release_is_stale
|
|
170
|
+
package_update_required_first = package_update_required
|
|
149
171
|
workspace_update_allowed = workspace_update_available and not package_update_required_first
|
|
150
172
|
workspace_update_recommended = workspace_update_allowed and not suppressed
|
|
151
|
-
blocked_reason = "installed tcx is older than the latest release; update the package before refreshing this workspace" if
|
|
173
|
+
blocked_reason = "installed tcx is older than the latest release; update the package before refreshing this workspace" if package_update_required else ""
|
|
152
174
|
workspace_update_command = "./tcx update --skip-refresh"
|
|
153
175
|
update_available = workspace_update_available or installed_release_is_stale
|
|
154
176
|
user_update_command = f"uvx --refresh --from {shlex.quote(package_spec)} tcx update ."
|
|
155
|
-
self_update_command = user_update_command if
|
|
177
|
+
self_update_command = user_update_command if package_update_required else workspace_update_command
|
|
156
178
|
can_self_update = bool(update_available and mode_status.get("build_enabled"))
|
|
157
179
|
head_manager_update_allowed = can_self_update
|
|
158
180
|
head_manager_update_command = self_update_command if can_self_update else ""
|
|
@@ -162,7 +184,7 @@ def build_update_status(
|
|
|
162
184
|
head_manager_update_blocked_reason = "package refresh must run outside restricted Codex permissions or inside build mode with full access"
|
|
163
185
|
else:
|
|
164
186
|
head_manager_update_blocked_reason = ""
|
|
165
|
-
if
|
|
187
|
+
if package_update_required:
|
|
166
188
|
recommended_action = f"Use build mode with full access for self-update, or ask the user to run from a terminal: {user_update_command}"
|
|
167
189
|
elif workspace_update_recommended:
|
|
168
190
|
recommended_action = f"Use build mode with full access for self-update, or ask the user to run from a terminal: {workspace_update_command}"
|
|
@@ -183,7 +205,7 @@ def build_update_status(
|
|
|
183
205
|
"workspace_update_required": workspace_update_available,
|
|
184
206
|
"workspace_update_allowed": workspace_update_allowed,
|
|
185
207
|
"workspace_update_recommended": workspace_update_recommended,
|
|
186
|
-
"package_update_required":
|
|
208
|
+
"package_update_required": package_update_required,
|
|
187
209
|
"package_update_required_first": package_update_required_first,
|
|
188
210
|
"workspace_update_command": workspace_update_command,
|
|
189
211
|
"command": self_update_command,
|
|
@@ -320,6 +342,16 @@ def build_startup_notice(*, service_detail: dict[str, Any], service_status: str)
|
|
|
320
342
|
return next_action
|
|
321
343
|
|
|
322
344
|
|
|
345
|
+
def _latest_version_hint_from_service(service_detail: dict[str, Any]) -> str:
|
|
346
|
+
if service_detail.get("service") != "tradingcodex":
|
|
347
|
+
return ""
|
|
348
|
+
service_db = str(service_detail.get("db_path") or "")
|
|
349
|
+
expected_db = str(service_detail.get("expected_db_path") or tradingcodex_db_path())
|
|
350
|
+
if service_db and service_db != expected_db:
|
|
351
|
+
return ""
|
|
352
|
+
return str(service_detail.get("version") or "")
|
|
353
|
+
|
|
354
|
+
|
|
323
355
|
def latest_release_info() -> dict[str, str]:
|
|
324
356
|
override = os.environ.get("TRADINGCODEX_LATEST_RELEASE_VERSION", "").strip()
|
|
325
357
|
if override:
|
|
@@ -914,7 +914,7 @@ def raw_call_tool(workspace_root: Path | str, tool: McpToolSpec, args: dict[str,
|
|
|
914
914
|
def get_update_status() -> dict[str, Any]:
|
|
915
915
|
from tradingcodex_cli.startup_status import build_update_status
|
|
916
916
|
|
|
917
|
-
return build_update_status(workspace_root)
|
|
917
|
+
return build_update_status(workspace_root, check_latest_release=True)
|
|
918
918
|
|
|
919
919
|
with_principal = {**args, "principal_id": principal_id}
|
|
920
920
|
handlers: dict[str, Callable[[], dict[str, Any]]] = {
|