tradingcodex 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (254) hide show
  1. apps/__init__.py +1 -0
  2. apps/audit/__init__.py +1 -0
  3. apps/audit/admin.py +6 -0
  4. apps/audit/apps.py +8 -0
  5. apps/audit/migrations/0001_initial.py +35 -0
  6. apps/audit/migrations/__init__.py +0 -0
  7. apps/audit/models.py +22 -0
  8. apps/harness/__init__.py +1 -0
  9. apps/harness/admin.py +6 -0
  10. apps/harness/apps.py +8 -0
  11. apps/harness/migrations/0001_initial.py +35 -0
  12. apps/harness/migrations/__init__.py +0 -0
  13. apps/harness/models.py +22 -0
  14. apps/harness/templatetags/__init__.py +1 -0
  15. apps/integrations/__init__.py +1 -0
  16. apps/integrations/admin.py +6 -0
  17. apps/integrations/apps.py +8 -0
  18. apps/integrations/migrations/0001_initial.py +29 -0
  19. apps/integrations/migrations/__init__.py +0 -0
  20. apps/integrations/models.py +16 -0
  21. apps/integrations/services.py +31 -0
  22. apps/mcp/__init__.py +1 -0
  23. apps/mcp/admin.py +20 -0
  24. apps/mcp/apps.py +8 -0
  25. apps/mcp/migrations/0001_initial.py +168 -0
  26. apps/mcp/migrations/__init__.py +0 -0
  27. apps/mcp/models.py +154 -0
  28. apps/mcp/services.py +327 -0
  29. apps/orders/__init__.py +1 -0
  30. apps/orders/admin.py +6 -0
  31. apps/orders/apps.py +8 -0
  32. apps/orders/migrations/0001_initial.py +79 -0
  33. apps/orders/migrations/__init__.py +0 -0
  34. apps/orders/models.py +66 -0
  35. apps/orders/services.py +107 -0
  36. apps/policy/__init__.py +1 -0
  37. apps/policy/admin.py +6 -0
  38. apps/policy/apps.py +8 -0
  39. apps/policy/migrations/0001_initial.py +75 -0
  40. apps/policy/migrations/__init__.py +0 -0
  41. apps/policy/models.py +61 -0
  42. apps/policy/services.py +110 -0
  43. apps/portfolio/__init__.py +1 -0
  44. apps/portfolio/admin.py +6 -0
  45. apps/portfolio/apps.py +8 -0
  46. apps/portfolio/migrations/0001_initial.py +67 -0
  47. apps/portfolio/migrations/__init__.py +0 -0
  48. apps/portfolio/models.py +53 -0
  49. apps/research/__init__.py +1 -0
  50. apps/research/admin.py +1 -0
  51. apps/research/apps.py +8 -0
  52. apps/research/migrations/__init__.py +0 -0
  53. apps/research/models.py +1 -0
  54. apps/workflows/__init__.py +1 -0
  55. apps/workflows/admin.py +6 -0
  56. apps/workflows/apps.py +8 -0
  57. apps/workflows/migrations/0001_initial.py +51 -0
  58. apps/workflows/migrations/__init__.py +0 -0
  59. apps/workflows/models.py +44 -0
  60. tradingcodex-0.1.0.dist-info/METADATA +337 -0
  61. tradingcodex-0.1.0.dist-info/RECORD +254 -0
  62. tradingcodex-0.1.0.dist-info/WHEEL +5 -0
  63. tradingcodex-0.1.0.dist-info/entry_points.txt +2 -0
  64. tradingcodex-0.1.0.dist-info/licenses/LICENSE +202 -0
  65. tradingcodex-0.1.0.dist-info/licenses/NOTICE +24 -0
  66. tradingcodex-0.1.0.dist-info/top_level.txt +4 -0
  67. tradingcodex_cli/__init__.py +1 -0
  68. tradingcodex_cli/__main__.py +124 -0
  69. tradingcodex_cli/commands/__init__.py +2 -0
  70. tradingcodex_cli/commands/bootstrap.py +157 -0
  71. tradingcodex_cli/commands/db.py +36 -0
  72. tradingcodex_cli/commands/doctor.py +230 -0
  73. tradingcodex_cli/commands/mcp.py +186 -0
  74. tradingcodex_cli/commands/orders.py +89 -0
  75. tradingcodex_cli/commands/policy.py +21 -0
  76. tradingcodex_cli/commands/profile.py +110 -0
  77. tradingcodex_cli/commands/research.py +76 -0
  78. tradingcodex_cli/commands/skills.py +93 -0
  79. tradingcodex_cli/commands/strategies.py +67 -0
  80. tradingcodex_cli/commands/subagents.py +106 -0
  81. tradingcodex_cli/commands/utils.py +134 -0
  82. tradingcodex_cli/commands/workspaces.py +53 -0
  83. tradingcodex_cli/generator.py +234 -0
  84. tradingcodex_cli/mcp_stdio.py +26 -0
  85. tradingcodex_cli/service_autostart.py +127 -0
  86. tradingcodex_service/__init__.py +5 -0
  87. tradingcodex_service/admin.py +1 -0
  88. tradingcodex_service/api.py +486 -0
  89. tradingcodex_service/application/__init__.py +2 -0
  90. tradingcodex_service/application/agents.py +1470 -0
  91. tradingcodex_service/application/audit.py +71 -0
  92. tradingcodex_service/application/common.py +88 -0
  93. tradingcodex_service/application/components.py +299 -0
  94. tradingcodex_service/application/harness.py +747 -0
  95. tradingcodex_service/application/markdown_preview.py +179 -0
  96. tradingcodex_service/application/orders.py +404 -0
  97. tradingcodex_service/application/policy.py +150 -0
  98. tradingcodex_service/application/portfolio.py +166 -0
  99. tradingcodex_service/application/research.py +356 -0
  100. tradingcodex_service/application/runtime.py +321 -0
  101. tradingcodex_service/asgi.py +6 -0
  102. tradingcodex_service/mcp_http.py +59 -0
  103. tradingcodex_service/mcp_runtime.py +565 -0
  104. tradingcodex_service/settings.py +91 -0
  105. tradingcodex_service/templates/web/activity.html +24 -0
  106. tradingcodex_service/templates/web/agent_skills.html +111 -0
  107. tradingcodex_service/templates/web/agents.html +121 -0
  108. tradingcodex_service/templates/web/base.html +150 -0
  109. tradingcodex_service/templates/web/dashboard.html +109 -0
  110. tradingcodex_service/templates/web/fragments/role_inspector.html +81 -0
  111. tradingcodex_service/templates/web/fragments/starter_prompt.html +24 -0
  112. tradingcodex_service/templates/web/fragments/topology_canvas.html +85 -0
  113. tradingcodex_service/templates/web/harness.html +87 -0
  114. tradingcodex_service/templates/web/mcp_router.html +250 -0
  115. tradingcodex_service/templates/web/orders.html +68 -0
  116. tradingcodex_service/templates/web/policy.html +81 -0
  117. tradingcodex_service/templates/web/portfolio.html +52 -0
  118. tradingcodex_service/templates/web/research.html +73 -0
  119. tradingcodex_service/templates/web/starter_prompt.html +40 -0
  120. tradingcodex_service/templates/web/strategies.html +74 -0
  121. tradingcodex_service/urls.py +42 -0
  122. tradingcodex_service/version.py +1 -0
  123. tradingcodex_service/web.py +885 -0
  124. tradingcodex_service/wsgi.py +6 -0
  125. workspace_templates/__init__.py +1 -0
  126. workspace_templates/modules/audit/files/.tradingcodex/audit/README.md +5 -0
  127. workspace_templates/modules/audit/files/trading/audit/.gitkeep +1 -0
  128. workspace_templates/modules/audit/module.json +16 -0
  129. workspace_templates/modules/codex-base/files/.codex/config.toml +272 -0
  130. workspace_templates/modules/codex-base/files/.codex/hooks/tradingcodex_hook.py +173 -0
  131. workspace_templates/modules/codex-base/files/.codex/hooks.json +105 -0
  132. workspace_templates/modules/codex-base/files/.codex/prompts/base_instructions/head-manager.md +129 -0
  133. workspace_templates/modules/codex-base/files/.codex/rules/tradingcodex.rules +50 -0
  134. workspace_templates/modules/codex-base/files/.tradingcodex/capabilities.yaml +56 -0
  135. workspace_templates/modules/codex-base/files/.tradingcodex/cli.py +16 -0
  136. workspace_templates/modules/codex-base/files/.tradingcodex/config.yaml +53 -0
  137. workspace_templates/modules/codex-base/files/.tradingcodex/policies/policy-bindings.yaml +16 -0
  138. workspace_templates/modules/codex-base/files/.tradingcodex/policies/principals.yaml +17 -0
  139. workspace_templates/modules/codex-base/files/.tradingcodex/policies/roles.yaml +27 -0
  140. workspace_templates/modules/codex-base/files/AGENTS.md +56 -0
  141. workspace_templates/modules/codex-base/files/pyproject.toml +13 -0
  142. workspace_templates/modules/codex-base/files/tcx +35 -0
  143. workspace_templates/modules/codex-base/module.json +17 -0
  144. workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/policies/access-policies.yaml +39 -0
  145. workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/policies/restricted-list.yaml +6 -0
  146. workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/approval_receipt.schema.json +14 -0
  147. workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/audit_event.schema.json +11 -0
  148. workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/evidence_pack.schema.json +16 -0
  149. workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/execution_result.schema.json +12 -0
  150. workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/fundamental_report.schema.json +15 -0
  151. workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/news_report.schema.json +15 -0
  152. workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/order_intent.schema.json +30 -0
  153. workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/portfolio_review.schema.json +15 -0
  154. workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/postmortem_report.schema.json +14 -0
  155. workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/risk_report.schema.json +15 -0
  156. workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/technical_report.schema.json +15 -0
  157. workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/thesis.schema.json +15 -0
  158. workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/schemas/valuation.schema.json +15 -0
  159. workspace_templates/modules/enforcement-guardrails/files/.tradingcodex/scripts/validate-order-intent.py +15 -0
  160. workspace_templates/modules/enforcement-guardrails/module.json +19 -0
  161. workspace_templates/modules/fixed-subagents/files/.codex/agents/execution-operator.toml +71 -0
  162. workspace_templates/modules/fixed-subagents/files/.codex/agents/fundamental-analyst.toml +62 -0
  163. workspace_templates/modules/fixed-subagents/files/.codex/agents/instrument-analyst.toml +64 -0
  164. workspace_templates/modules/fixed-subagents/files/.codex/agents/macro-analyst.toml +64 -0
  165. workspace_templates/modules/fixed-subagents/files/.codex/agents/news-analyst.toml +63 -0
  166. workspace_templates/modules/fixed-subagents/files/.codex/agents/portfolio-manager.toml +62 -0
  167. workspace_templates/modules/fixed-subagents/files/.codex/agents/risk-manager.toml +65 -0
  168. workspace_templates/modules/fixed-subagents/files/.codex/agents/technical-analyst.toml +63 -0
  169. workspace_templates/modules/fixed-subagents/files/.codex/agents/valuation-analyst.toml +59 -0
  170. workspace_templates/modules/fixed-subagents/files/.tradingcodex/mainagent/head-manager.yaml +66 -0
  171. workspace_templates/modules/fixed-subagents/files/.tradingcodex/mainagent/skill-change-proposals/.gitkeep +1 -0
  172. workspace_templates/modules/fixed-subagents/files/.tradingcodex/mainagent/subagent-registry.yaml +56 -0
  173. workspace_templates/modules/fixed-subagents/module.json +23 -0
  174. workspace_templates/modules/guidance-guardrails/files/.tradingcodex/guidance/guardrails.md +17 -0
  175. workspace_templates/modules/guidance-guardrails/files/.tradingcodex/guidance/task-quality-checklist.md +37 -0
  176. workspace_templates/modules/guidance-guardrails/module.json +18 -0
  177. workspace_templates/modules/information-barriers/files/.tradingcodex/policies/information-barriers.yaml +211 -0
  178. workspace_templates/modules/information-barriers/files/.tradingcodex/secrets.md +9 -0
  179. workspace_templates/modules/information-barriers/files/trading/approvals/.gitkeep +1 -0
  180. workspace_templates/modules/information-barriers/files/trading/market-data/.gitkeep +1 -0
  181. workspace_templates/modules/information-barriers/files/trading/orders/approved/.gitkeep +1 -0
  182. workspace_templates/modules/information-barriers/files/trading/orders/draft/.gitkeep +1 -0
  183. workspace_templates/modules/information-barriers/files/trading/orders/executed/.gitkeep +1 -0
  184. workspace_templates/modules/information-barriers/files/trading/orders/rejected/.gitkeep +1 -0
  185. workspace_templates/modules/information-barriers/files/trading/portfolio/.gitkeep +1 -0
  186. workspace_templates/modules/information-barriers/files/trading/reports/fundamental/.gitkeep +1 -0
  187. workspace_templates/modules/information-barriers/files/trading/reports/instrument/.gitkeep +1 -0
  188. workspace_templates/modules/information-barriers/files/trading/reports/macro/.gitkeep +1 -0
  189. workspace_templates/modules/information-barriers/files/trading/reports/news/.gitkeep +1 -0
  190. workspace_templates/modules/information-barriers/files/trading/reports/policy/.gitkeep +1 -0
  191. workspace_templates/modules/information-barriers/files/trading/reports/portfolio/.gitkeep +1 -0
  192. workspace_templates/modules/information-barriers/files/trading/reports/postmortem/.gitkeep +1 -0
  193. workspace_templates/modules/information-barriers/files/trading/reports/risk/.gitkeep +1 -0
  194. workspace_templates/modules/information-barriers/files/trading/reports/technical/.gitkeep +1 -0
  195. workspace_templates/modules/information-barriers/files/trading/reports/valuation/.gitkeep +1 -0
  196. workspace_templates/modules/information-barriers/files/trading/research/.gitkeep +1 -0
  197. workspace_templates/modules/information-barriers/module.json +19 -0
  198. workspace_templates/modules/paper-trading/files/.tradingcodex/mcp/adapters/paper-trading.py +4 -0
  199. workspace_templates/modules/paper-trading/module.json +16 -0
  200. workspace_templates/modules/postmortem/files/.tradingcodex/workflows/postmortem.yaml +12 -0
  201. workspace_templates/modules/postmortem/module.json +16 -0
  202. workspace_templates/modules/repo-skills/files/.agents/skills/investment-workflow-map/SKILL.md +106 -0
  203. workspace_templates/modules/repo-skills/files/.agents/skills/investment-workflow-map/agents/openai.yaml +6 -0
  204. workspace_templates/modules/repo-skills/files/.agents/skills/manage-optional-skills/SKILL.md +101 -0
  205. workspace_templates/modules/repo-skills/files/.agents/skills/manage-optional-skills/agents/openai.yaml +6 -0
  206. workspace_templates/modules/repo-skills/files/.agents/skills/manage-subagents/SKILL.md +140 -0
  207. workspace_templates/modules/repo-skills/files/.agents/skills/manage-subagents/agents/openai.yaml +6 -0
  208. workspace_templates/modules/repo-skills/files/.agents/skills/orchestrate-workflow/SKILL.md +140 -0
  209. workspace_templates/modules/repo-skills/files/.agents/skills/orchestrate-workflow/agents/openai.yaml +6 -0
  210. workspace_templates/modules/repo-skills/files/.agents/skills/postmortem/SKILL.md +31 -0
  211. workspace_templates/modules/repo-skills/files/.agents/skills/postmortem/agents/openai.yaml +6 -0
  212. workspace_templates/modules/repo-skills/files/.agents/skills/scenario-quality-gates/SKILL.md +138 -0
  213. workspace_templates/modules/repo-skills/files/.agents/skills/scenario-quality-gates/agents/openai.yaml +6 -0
  214. workspace_templates/modules/repo-skills/files/.agents/skills/strategy-creator/SKILL.md +109 -0
  215. workspace_templates/modules/repo-skills/files/.agents/skills/strategy-creator/agents/openai.yaml +6 -0
  216. workspace_templates/modules/repo-skills/files/.agents/skills/synthesize-decision/SKILL.md +54 -0
  217. workspace_templates/modules/repo-skills/files/.agents/skills/synthesize-decision/agents/openai.yaml +6 -0
  218. workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/execution-operator/execute-paper-order/SKILL.md +35 -0
  219. workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/execution-operator/execute-paper-order/agents/openai.yaml +6 -0
  220. workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/fundamental-analyst/fundamental-analysis/SKILL.md +46 -0
  221. workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/fundamental-analyst/fundamental-analysis/agents/openai.yaml +6 -0
  222. workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/instrument-analyst/instrument-analysis/SKILL.md +40 -0
  223. workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/instrument-analyst/instrument-analysis/agents/openai.yaml +6 -0
  224. workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/macro-analyst/macro-analysis/SKILL.md +40 -0
  225. workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/macro-analyst/macro-analysis/agents/openai.yaml +6 -0
  226. workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/news-analyst/news-analysis/SKILL.md +43 -0
  227. workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/news-analyst/news-analysis/agents/openai.yaml +6 -0
  228. workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/portfolio-manager/create-order-intent/SKILL.md +46 -0
  229. workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/portfolio-manager/create-order-intent/agents/openai.yaml +6 -0
  230. workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/portfolio-manager/portfolio-review/SKILL.md +44 -0
  231. workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/portfolio-manager/portfolio-review/agents/openai.yaml +6 -0
  232. workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/approve-order/SKILL.md +38 -0
  233. workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/approve-order/agents/openai.yaml +6 -0
  234. workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/policy-review/SKILL.md +43 -0
  235. workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/policy-review/agents/openai.yaml +6 -0
  236. workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/review-risk/SKILL.md +45 -0
  237. workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/risk-manager/review-risk/agents/openai.yaml +6 -0
  238. workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/collect-evidence/SKILL.md +46 -0
  239. workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/collect-evidence/agents/openai.yaml +6 -0
  240. workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/external-data-source-gate/SKILL.md +66 -0
  241. workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/shared/external-data-source-gate/agents/openai.yaml +6 -0
  242. workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/technical-analyst/technical-analysis/SKILL.md +43 -0
  243. workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/technical-analyst/technical-analysis/agents/openai.yaml +6 -0
  244. workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/valuation-analyst/valuation-review/SKILL.md +47 -0
  245. workspace_templates/modules/repo-skills/files/.tradingcodex/subagents/skills/valuation-analyst/valuation-review/agents/openai.yaml +6 -0
  246. workspace_templates/modules/repo-skills/module.json +37 -0
  247. workspace_templates/modules/stub-execution/files/.tradingcodex/mcp/adapters/stub-execution.py +4 -0
  248. workspace_templates/modules/stub-execution/module.json +15 -0
  249. workspace_templates/modules/tradingcodex-mcp/files/.tradingcodex/mcp/adapters/live-adapter.contract.md +25 -0
  250. workspace_templates/modules/tradingcodex-mcp/files/.tradingcodex/mcp/enforcer/README.md +5 -0
  251. workspace_templates/modules/tradingcodex-mcp/files/.tradingcodex/mcp/gateway/README.md +8 -0
  252. workspace_templates/modules/tradingcodex-mcp/files/.tradingcodex/mcp/server.py +27 -0
  253. workspace_templates/modules/tradingcodex-mcp/files/.tradingcodex/mcp/smoke-call.py +18 -0
  254. workspace_templates/modules/tradingcodex-mcp/module.json +24 -0
@@ -0,0 +1,111 @@
1
+ {% extends "web/base.html" %}
2
+
3
+ {% block title %}{{ agent.role }} Skills | tcx{% endblock %}
4
+ {% block page_label %}Agent Skills{% endblock %}
5
+
6
+ {% block content %}
7
+ <div class="tc-page-toolbar">
8
+ <a class="tc-button" href="/harness/agents/">All agents</a>
9
+ </div>
10
+
11
+ <section class="tc-summary-grid">
12
+ <article class="tc-summary-card">
13
+ <span>Status</span>
14
+ <strong>{% if agent.validation_errors %}blocked{% else %}valid{% endif %}</strong>
15
+ </article>
16
+ <article class="tc-summary-card">
17
+ <span>Core skills</span>
18
+ <strong>{{ agent.builtin_skills|length }}</strong>
19
+ </article>
20
+ <article class="tc-summary-card">
21
+ <span>Optional active</span>
22
+ <strong>{{ agent.optional_skill_count }}</strong>
23
+ </article>
24
+ <article class="tc-summary-card">
25
+ <span>Issues</span>
26
+ <strong>{{ agent.validation_errors|length }}</strong>
27
+ </article>
28
+ </section>
29
+
30
+ <section class="tc-section-grid">
31
+ <article class="tc-panel">
32
+ <div class="tc-panel-head">
33
+ <span class="tc-eyebrow">Core</span>
34
+ <h2>Locked skill set</h2>
35
+ </div>
36
+ <div class="tc-chip-list">
37
+ {% for skill in agent.builtin_skills %}
38
+ <span class="tc-chip">{{ skill }}</span>
39
+ {% endfor %}
40
+ </div>
41
+ </article>
42
+
43
+ <aside class="tc-panel">
44
+ <div class="tc-panel-head">
45
+ <span class="tc-eyebrow">Boundary</span>
46
+ <h2>Skill surface</h2>
47
+ </div>
48
+ <div class="tc-alert">
49
+ <strong>Optional skills are editable</strong>
50
+ <span>Django can create, activate, archive, delete, and project optional skills through the shared service layer.</span>
51
+ </div>
52
+ <div class="tc-chip-list">
53
+ <span class="tc-chip">{{ agent.permission_profile }}</span>
54
+ {% for tag in agent.forbidden_skill_tags %}
55
+ <span class="tc-chip tc-chip-danger">{{ tag }}</span>
56
+ {% endfor %}
57
+ </div>
58
+ </aside>
59
+ </section>
60
+
61
+ <section class="tc-panel">
62
+ <div class="tc-panel-head">
63
+ <span class="tc-eyebrow">Optional</span>
64
+ <h2>Role-local optional skills</h2>
65
+ </div>
66
+ <form class="tc-form" method="post" action="{% url 'web-optional-skill-create' agent.role %}">
67
+ {% csrf_token %}
68
+ <input type="hidden" name="next" value="{{ request.get_full_path }}">
69
+ <label>Name <input name="name" placeholder="evidence-checklist"></label>
70
+ <label>Description <input name="description" placeholder="Add a role-local evidence checklist"></label>
71
+ <label>Status
72
+ <select name="status">
73
+ <option value="draft">draft</option>
74
+ <option value="active">active</option>
75
+ <option value="archived">archived</option>
76
+ </select>
77
+ </label>
78
+ <label>Body <textarea name="body" rows="6"></textarea></label>
79
+ <button class="tc-button" type="submit">Save optional skill</button>
80
+ </form>
81
+ <div class="tc-record-list">
82
+ {% for skill in agent.optional_skills %}
83
+ <article class="tc-record-row">
84
+ <div class="tc-chip-list">
85
+ <span class="tc-pill tc-pill--{% if skill.validation_status == 'valid' and skill.status == 'active' %}good{% elif skill.status == 'archived' %}neutral{% else %}bad{% endif %}">{{ skill.status }}</span>
86
+ <span class="tc-chip">{{ skill.validation_status }}</span>
87
+ {% for tag in skill.risk_tags %}
88
+ <span class="tc-chip tc-chip-danger">{{ tag }}</span>
89
+ {% endfor %}
90
+ </div>
91
+ <strong>{{ skill.name }}</strong>
92
+ <small>{{ skill.description }}</small>
93
+ {% if skill.validation_errors %}
94
+ <small>{{ skill.validation_errors|join:"; " }}</small>
95
+ {% endif %}
96
+ <div class="tc-inline-actions">
97
+ <form method="post" action="{% url 'web-optional-skill-activate' agent.role skill.name %}">{% csrf_token %}<input type="hidden" name="next" value="{{ request.get_full_path }}"><button class="tc-mini-button" type="submit">Activate</button></form>
98
+ <form method="post" action="{% url 'web-optional-skill-archive' agent.role skill.name %}">{% csrf_token %}<input type="hidden" name="next" value="{{ request.get_full_path }}"><button class="tc-mini-button" type="submit">Archive</button></form>
99
+ <form method="post" action="{% url 'web-optional-skill-delete' agent.role skill.name %}">{% csrf_token %}<input type="hidden" name="next" value="{{ request.get_full_path }}"><button class="tc-mini-button tc-mini-button-danger" type="submit">Delete</button></form>
100
+ </div>
101
+ </article>
102
+ {% empty %}
103
+ <article class="tc-record-row">
104
+ <strong>No optional skills</strong>
105
+ <small>This role is using only its core TradingCodex skill set.</small>
106
+ </article>
107
+ {% endfor %}
108
+ </div>
109
+ </section>
110
+
111
+ {% endblock %}
@@ -0,0 +1,121 @@
1
+ {% extends "web/base.html" %}
2
+
3
+ {% block title %}Agents | tcx{% endblock %}
4
+ {% block page_label %}Agents{% endblock %}
5
+
6
+ {% block content %}
7
+ <section class="tc-agent-roster">
8
+ <a class="tc-role-card tc-role-card--head {% if head_manager.role == selected_agent.role %}is-selected{% endif %}" href="/harness/agents/?role={{ head_manager.role }}">
9
+ <span class="tc-eyebrow">Head Manager</span>
10
+ <strong>{{ head_manager.role }}</strong>
11
+ <small>{{ head_manager.builtin_skills|length }} required skills</small>
12
+ </a>
13
+
14
+ <div class="tc-role-grid">
15
+ {% for role in agents %}
16
+ <a class="tc-role-card {% if role.role == selected_agent.role %}is-selected{% endif %}" href="/harness/agents/?role={{ role.role }}">
17
+ <span>{{ role.group }}</span>
18
+ <strong>{{ role.role }}</strong>
19
+ <small>{{ role.builtin_skills|length }} required · {{ role.optional_skill_count }} optional</small>
20
+ </a>
21
+ {% endfor %}
22
+ </div>
23
+ </section>
24
+
25
+ <section class="tc-panel tc-instruction-editor">
26
+ <div class="tc-panel-head">
27
+ <div>
28
+ <span class="tc-eyebrow">Project-local instructions</span>
29
+ <h2>Additional instructions</h2>
30
+ </div>
31
+ <span class="tc-chip">{{ additional_instructions.line_count }} lines</span>
32
+ </div>
33
+ <div class="tc-alert">
34
+ <strong>Appended after the default role instructions</strong>
35
+ <span>Use this for project-specific preferences. TradingCodex saves this text as-is and does not block it; avoid using it to change role identity, MCP permissions, approval authority, execution authority, or secret access.</span>
36
+ </div>
37
+ <form class="tc-form" method="post" action="{% url 'web-agent-instruction-update' selected_agent.role %}">
38
+ {% csrf_token %}
39
+ <input type="hidden" name="next" value="{{ request.get_full_path }}">
40
+ <label>Instruction text <textarea name="body" rows="8" placeholder="Example: Prefer concise Korean summaries for this project. Keep source-as-of warnings explicit.">{{ additional_instructions.body }}</textarea></label>
41
+ <button class="tc-button" type="submit">Save and project</button>
42
+ </form>
43
+ </section>
44
+
45
+ <section class="tc-skill-browser">
46
+ <aside class="tc-panel tc-skill-sidebar">
47
+ <div class="tc-panel-head">
48
+ <div>
49
+ <span class="tc-eyebrow">{{ selected_agent.group }}</span>
50
+ <h2>{{ selected_agent.role }}</h2>
51
+ </div>
52
+ <span class="tc-pill tc-pill--{% if selected_agent.validation_errors %}bad{% else %}good{% endif %}">
53
+ {% if selected_agent.validation_errors %}blocked{% else %}valid{% endif %}
54
+ </span>
55
+ </div>
56
+
57
+ <section class="tc-skill-section">
58
+ <div class="tc-skill-section-head">
59
+ <strong>Required skills</strong>
60
+ <span>{{ required_skills|length }}</span>
61
+ </div>
62
+ <div class="tc-skill-list">
63
+ {% for skill in required_skills %}
64
+ <a class="tc-skill-link {% if skill.selected %}is-selected{% endif %}" href="/harness/agents/?role={{ selected_agent.role }}&amp;skill={{ skill.id }}">
65
+ <span>{{ skill.label }}</span>
66
+ <small>{{ skill.id }}</small>
67
+ </a>
68
+ {% endfor %}
69
+ </div>
70
+ </section>
71
+
72
+ <section class="tc-skill-section">
73
+ <div class="tc-skill-section-head">
74
+ <strong>Optional skills</strong>
75
+ <span>{{ optional_skills|length }}</span>
76
+ </div>
77
+ <div class="tc-skill-list">
78
+ {% for skill in optional_skills %}
79
+ <a class="tc-skill-link {% if skill.selected %}is-selected{% endif %}" href="/harness/agents/?role={{ selected_agent.role }}&amp;skill={{ skill.id }}">
80
+ <span>{{ skill.label }}</span>
81
+ <small>{{ skill.id }} · {{ skill.validation_status }}</small>
82
+ </a>
83
+ {% empty %}
84
+ <div class="tc-empty-state">
85
+ <strong>No optional skills</strong>
86
+ <span>This role is using only required skills.</span>
87
+ </div>
88
+ {% endfor %}
89
+ </div>
90
+ </section>
91
+ </aside>
92
+
93
+ <article class="tc-panel tc-preview-panel">
94
+ <div class="tc-panel-head">
95
+ <div>
96
+ <span class="tc-eyebrow">Markdown preview</span>
97
+ <h2>{{ selected_skill_id|default:"No skill selected" }}</h2>
98
+ </div>
99
+ <span class="tc-chip">{{ skill_preview.source_label }}</span>
100
+ </div>
101
+ {% if skill_preview.metadata_items %}
102
+ <div class="tc-frontmatter-card">
103
+ <div class="tc-frontmatter-head">
104
+ <span class="tc-eyebrow">Frontmatter</span>
105
+ </div>
106
+ <dl class="tc-frontmatter-grid">
107
+ {% for item in skill_preview.metadata_items %}
108
+ <div class="tc-frontmatter-item">
109
+ <dt>{{ item.label }}</dt>
110
+ <dd>{{ item.value }}</dd>
111
+ </div>
112
+ {% endfor %}
113
+ </dl>
114
+ </div>
115
+ {% endif %}
116
+ <div class="tc-markdown-preview">
117
+ {{ skill_preview.html|safe }}
118
+ </div>
119
+ </article>
120
+ </section>
121
+ {% endblock %}
@@ -0,0 +1,150 @@
1
+ {% load static %}
2
+ <!doctype html>
3
+ <html lang="en" class="dark">
4
+ <head>
5
+ <meta charset="utf-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1">
7
+ <title>{% block title %}tcx{% endblock %}</title>
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-shadcn-11">
10
+ <script src="{% static 'vendor/htmx/htmx.min.js' %}" defer></script>
11
+ <script src="{% static 'vendor/alpine/alpine.min.js' %}" defer></script>
12
+ </head>
13
+ <body class="tc-web-body">
14
+ <a class="tc-skip-link" href="#main-content">Skip to content</a>
15
+ <div
16
+ class="tc-app-shell"
17
+ x-data="{
18
+ navOpen: false,
19
+ sidebarWidth: Number(localStorage.getItem('tcxSidebarWidth') || 320),
20
+ startSidebarResize(event) {
21
+ const startX = event.clientX;
22
+ const startWidth = this.sidebarWidth;
23
+ const onMove = (moveEvent) => {
24
+ this.sidebarWidth = Math.min(520, Math.max(260, startWidth + moveEvent.clientX - startX));
25
+ localStorage.setItem('tcxSidebarWidth', this.sidebarWidth);
26
+ };
27
+ const onUp = () => {
28
+ window.removeEventListener('mousemove', onMove);
29
+ window.removeEventListener('mouseup', onUp);
30
+ document.body.classList.remove('tc-resizing-sidebar');
31
+ };
32
+ document.body.classList.add('tc-resizing-sidebar');
33
+ window.addEventListener('mousemove', onMove);
34
+ window.addEventListener('mouseup', onUp);
35
+ }
36
+ }"
37
+ :style="{ '--tc-sidebar-width': sidebarWidth + 'px' }"
38
+ @keydown.escape.window="navOpen = false"
39
+ >
40
+ <header class="tc-topbar">
41
+ <div class="tc-topbar-base">
42
+ <button class="tc-menu-button" type="button" @click="navOpen = !navOpen" :aria-expanded="navOpen.toString()" aria-label="Toggle navigation">
43
+ <span aria-hidden="true"></span>
44
+ </button>
45
+ <a class="tc-web-brand" href="/harness/agents/">
46
+ <strong>TradingCodex</strong>
47
+ </a>
48
+ </div>
49
+
50
+ <nav class="tc-mode-nav" aria-label="tcx navigation">
51
+ {% for item in nav_items %}
52
+ <a href="{{ item.href }}" class="{% if active == item.key %}is-active{% endif %}">{{ item.label }}</a>
53
+ {% endfor %}
54
+ </nav>
55
+
56
+ <nav class="tc-service-links" aria-label="Service links">
57
+ <a href="/admin/">Admin</a>
58
+ </nav>
59
+ </header>
60
+
61
+ <div class="tc-shell-body">
62
+ <aside class="tc-sidebar" :class="{ 'is-open': navOpen }">
63
+ <a class="tc-web-brand" href="/harness/agents/">
64
+ <strong>TradingCodex</strong>
65
+ </a>
66
+
67
+ <section class="tc-sidebar-panel tc-workspace-panel">
68
+ <div class="tc-sidebar-panel-head">
69
+ <div class="tc-sidebar-title-actions">
70
+ <span class="tc-section-title">Workspaces</span>
71
+ <form class="tc-workspace-add-form" method="post" action="{% url 'web-workspace-browse' %}">
72
+ {% csrf_token %}
73
+ <input type="hidden" name="next" value="{{ request.get_full_path }}">
74
+ <button class="tc-icon-button" type="submit" aria-label="Open workspace folder" title="Open workspace folder">+</button>
75
+ </form>
76
+ </div>
77
+ <div class="tc-sidebar-tools">
78
+ <span class="tc-count">{{ workspace_options|length }}</span>
79
+ </div>
80
+ </div>
81
+
82
+ {% if workspace_notice %}
83
+ <div class="tc-sidebar-notice">{{ workspace_notice }}</div>
84
+ {% endif %}
85
+ {% if workspace_error %}
86
+ <div class="tc-sidebar-notice tc-sidebar-notice-error">{{ workspace_error }}</div>
87
+ {% endif %}
88
+
89
+ <div class="tc-workspace-list">
90
+ {% for option in workspace_options %}
91
+ <article class="tc-workspace-card{% if option.selected %} is-selected{% endif %}{% if not option.exists %} is-missing{% endif %}">
92
+ {% if option.exists and option.bootstrapped %}
93
+ <a class="tc-workspace-card-main" href="{{ request.path }}?workspace={{ option.workspace_id }}" @click="navOpen = false">
94
+ <strong>{{ option.project_name }}</strong>
95
+ <span>{{ option.status_label }}{% if option.git_branch %} / {{ option.git_branch }}{% endif %}</span>
96
+ <code>{{ option.path }}</code>
97
+ </a>
98
+ {% else %}
99
+ <div class="tc-workspace-card-main">
100
+ <strong>{{ option.project_name }}</strong>
101
+ <span>{{ option.status_label }}</span>
102
+ <code>{{ option.path }}</code>
103
+ </div>
104
+ {% endif %}
105
+ <div class="tc-workspace-actions">
106
+ {% if option.exists and option.bootstrapped %}
107
+ <a class="tc-mini-button" href="{{ request.path }}?workspace={{ option.workspace_id }}" @click="navOpen = false">Open</a>
108
+ {% elif option.exists %}
109
+ <form method="post" action="{% url 'web-workspace-open' %}">
110
+ {% csrf_token %}
111
+ <input type="hidden" name="next" value="{{ request.get_full_path }}">
112
+ <input type="hidden" name="workspace_path" value="{{ option.path }}">
113
+ <button class="tc-mini-button" type="submit">Open</button>
114
+ </form>
115
+ {% endif %}
116
+ <form method="post" action="{% url 'web-workspace-remove' option.workspace_id %}">
117
+ {% csrf_token %}
118
+ <input type="hidden" name="next" value="{{ request.get_full_path }}">
119
+ <button class="tc-mini-button tc-mini-button-danger" type="submit">close</button>
120
+ </form>
121
+ </div>
122
+ </article>
123
+ {% empty %}
124
+ <div class="tc-empty-inline">No workspaces yet.</div>
125
+ {% endfor %}
126
+ </div>
127
+
128
+ </section>
129
+
130
+ <nav class="tc-web-nav" aria-label="Mobile navigation">
131
+ {% for item in nav_items %}
132
+ <a href="{{ item.href }}" class="{% if active == item.key %}is-active{% endif %}" @click="navOpen = false">{{ item.label }}</a>
133
+ {% endfor %}
134
+ </nav>
135
+
136
+ <button class="tc-sidebar-resizer" type="button" aria-label="Resize sidebar" @mousedown.prevent="startSidebarResize($event)"></button>
137
+ </aside>
138
+
139
+ <div class="tc-main-shell">
140
+ <main id="main-content" class="tc-content">
141
+ <div class="tc-page-ribbon">
142
+ <strong>{% block page_label %}tcx{% endblock %}</strong>
143
+ </div>
144
+ {% block content %}{% endblock %}
145
+ </main>
146
+ </div>
147
+ </div>
148
+ </div>
149
+ </body>
150
+ </html>
@@ -0,0 +1,109 @@
1
+ {% extends "web/base.html" %}
2
+
3
+ {% block title %}tcx Dashboard{% endblock %}
4
+ {% block page_label %}Dashboard{% endblock %}
5
+
6
+ {% block content %}
7
+ <section class="tc-hero-band">
8
+ <div>
9
+ <span class="tc-eyebrow">Harness-first dashboard</span>
10
+ <h1>TradingCodex harness</h1>
11
+ <p>Workspace, agent topology, policy posture, and recent runtime state.</p>
12
+ </div>
13
+ <div class="tc-hero-actions">
14
+ <a class="tc-button tc-button-primary" href="/workflow/starter-prompt/">Starter prompt</a>
15
+ <a class="tc-button" href="/admin/">Open Admin</a>
16
+ </div>
17
+ </section>
18
+
19
+ <section class="tc-section-grid tc-section-grid--three">
20
+ <article class="tc-panel">
21
+ <div class="tc-panel-head">
22
+ <span class="tc-eyebrow">Health</span>
23
+ <h2>Service status</h2>
24
+ </div>
25
+ <div class="tc-metric-grid">
26
+ <div><strong>{{ health.counts.roster }}</strong><span>subagents</span></div>
27
+ <div><strong>{{ health.counts.skills }}</strong><span>skills</span></div>
28
+ <div><strong>{{ health.counts.mcp_tools }}</strong><span>MCP tools</span></div>
29
+ <div><strong>{{ health.counts.workspace_contexts }}</strong><span>workspaces</span></div>
30
+ </div>
31
+ </article>
32
+
33
+ <article class="tc-panel">
34
+ <div class="tc-panel-head">
35
+ <span class="tc-eyebrow">Next action</span>
36
+ <h2>Start in Codex</h2>
37
+ </div>
38
+ <ol class="tc-flow-list">
39
+ <li>Prompt</li>
40
+ <li>Dispatch</li>
41
+ <li>Review</li>
42
+ <li>Policy gate</li>
43
+ <li>MCP boundary</li>
44
+ </ol>
45
+ </article>
46
+
47
+ <article class="tc-panel">
48
+ <div class="tc-panel-head">
49
+ <span class="tc-eyebrow">Runtime</span>
50
+ <h2>Central ledger</h2>
51
+ </div>
52
+ <div class="tc-metric-grid">
53
+ <div><strong>{{ health.counts.research_artifacts }}</strong><span>artifacts</span></div>
54
+ <div><strong>{{ health.counts.policy_blocks }}</strong><span>policy blocks</span></div>
55
+ <div><strong>{{ portfolio.positions_count }}</strong><span>positions</span></div>
56
+ <div><strong>{{ health.counts.mcp_calls }}</strong><span>MCP calls</span></div>
57
+ </div>
58
+ </article>
59
+ </section>
60
+
61
+ <section class="tc-section-grid">
62
+ <article class="tc-panel">
63
+ <div class="tc-panel-head">
64
+ <span class="tc-eyebrow">Topology</span>
65
+ <h2>Harness map</h2>
66
+ </div>
67
+ {% include "web/fragments/topology_canvas.html" %}
68
+ </article>
69
+
70
+ <aside class="tc-panel">
71
+ <div class="tc-panel-head">
72
+ <span class="tc-eyebrow">Recent activity</span>
73
+ <h2>Ledger pulse</h2>
74
+ </div>
75
+ <div class="tc-activity-list">
76
+ {% for item in activity %}
77
+ <div class="tc-activity-row">
78
+ <span class="tc-pill tc-pill--{{ item.status_class }}">{{ item.kind }}</span>
79
+ <strong>{{ item.title }}</strong>
80
+ <small>{{ item.subtitle }} · {{ item.created_at|date:"Y-m-d H:i" }}</small>
81
+ </div>
82
+ {% empty %}
83
+ <p class="tc-empty">No activity has been recorded yet.</p>
84
+ {% endfor %}
85
+ </div>
86
+ </aside>
87
+ </section>
88
+
89
+ <details class="tc-details tc-diagnostics">
90
+ <summary>Harness systems</summary>
91
+ <div class="tc-details-body">
92
+ <div class="tc-harness-system-grid">
93
+ {% for system in topology.systems %}
94
+ <section class="tc-harness-system tc-harness-system--{{ system.key }}">
95
+ <div>
96
+ <strong>{{ system.label }}</strong>
97
+ <span>{{ system.summary }}</span>
98
+ </div>
99
+ <div class="tc-harness-list">
100
+ {% for item in system.items %}
101
+ <div><strong>{{ item.label }}</strong><span>{{ item.summary }}</span></div>
102
+ {% endfor %}
103
+ </div>
104
+ </section>
105
+ {% endfor %}
106
+ </div>
107
+ </div>
108
+ </details>
109
+ {% endblock %}
@@ -0,0 +1,81 @@
1
+ <div class="tc-inspector-header">
2
+ <span class="tc-eyebrow">{{ selected_role.group }}</span>
3
+ <h2>{{ selected_role.label }}</h2>
4
+ <p>{{ selected_role.purpose }}</p>
5
+ </div>
6
+
7
+ <section class="tc-inspector-section">
8
+ <h3>Handoff Contract</h3>
9
+ <ul class="tc-plain-list">
10
+ <li><strong>Receives:</strong> {{ selected_role.handoff_contract.receives }}</li>
11
+ <li><strong>Returns:</strong> {{ selected_role.handoff_contract.returns }}</li>
12
+ <li><strong>Quality gate:</strong> {{ selected_role.handoff_contract.quality_gate }}</li>
13
+ <li><strong>No-overlap:</strong> {{ selected_role.handoff_contract.overlap_rule }}</li>
14
+ </ul>
15
+ <div class="tc-chip-list">
16
+ {% for state in selected_role.handoff_states %}
17
+ <span class="tc-chip">{{ state }}</span>
18
+ {% endfor %}
19
+ </div>
20
+ </section>
21
+
22
+ <section class="tc-inspector-section">
23
+ <h3>Owned Skills</h3>
24
+ <div class="tc-chip-list">
25
+ {% for skill in selected_role.skills %}
26
+ <span class="tc-chip">{{ skill }}</span>
27
+ {% endfor %}
28
+ </div>
29
+ </section>
30
+
31
+ <section class="tc-inspector-section">
32
+ <h3>Allowed MCP Tools</h3>
33
+ <div class="tc-tool-list">
34
+ {% for tool in selected_role.allowed_tools %}
35
+ <div class="tc-tool-row">
36
+ <span class="tc-pill tc-pill--{{ tool.status_class }}">{{ tool.risk_level }}</span>
37
+ <strong>{{ tool.name }}</strong>
38
+ {% if tool.requires_approval %}<small>approval required</small>{% endif %}
39
+ </div>
40
+ {% empty %}
41
+ <p class="tc-empty">No MCP tools are exposed to this role.</p>
42
+ {% endfor %}
43
+ </div>
44
+ </section>
45
+
46
+ <section class="tc-inspector-section">
47
+ <h3>Forbidden Actions</h3>
48
+ <ul class="tc-plain-list">
49
+ {% for action in selected_role.forbidden_actions %}
50
+ <li>{{ action }}</li>
51
+ {% endfor %}
52
+ </ul>
53
+ </section>
54
+
55
+ <section class="tc-inspector-section">
56
+ <h3>Latest Artifacts</h3>
57
+ <div class="tc-mini-feed">
58
+ {% for artifact in selected_role.latest_artifacts %}
59
+ <div>
60
+ <strong>{{ artifact.title }}</strong>
61
+ <span>{{ artifact.artifact_type }} · {{ artifact.universe }} · {{ artifact.readiness_label }}</span>
62
+ </div>
63
+ {% empty %}
64
+ <p class="tc-empty">No artifacts recorded for this role yet.</p>
65
+ {% endfor %}
66
+ </div>
67
+ </section>
68
+
69
+ <section class="tc-inspector-section">
70
+ <h3>Latest Activity</h3>
71
+ <div class="tc-mini-feed">
72
+ {% for item in selected_role.latest_activity %}
73
+ <div>
74
+ <strong>{{ item.title }}</strong>
75
+ <span>{{ item.status }} · {{ item.created_at|date:"Y-m-d H:i" }}</span>
76
+ </div>
77
+ {% empty %}
78
+ <p class="tc-empty">No role-specific MCP calls yet.</p>
79
+ {% endfor %}
80
+ </div>
81
+ </section>
@@ -0,0 +1,24 @@
1
+ {% if starter_prompt %}
2
+ <div class="tc-copy-block">
3
+ <div class="tc-copy-block-header">
4
+ <strong>Starter prompt</strong>
5
+ <span>Generated locally without changing DB state</span>
6
+ </div>
7
+ <pre>{{ starter_prompt }}</pre>
8
+ </div>
9
+ <div class="tc-command-list">
10
+ <div>
11
+ <span>CLI</span>
12
+ <code>./tcx subagents prompt "{{ query }}"</code>
13
+ </div>
14
+ <div>
15
+ <span>Codex entrypoint</span>
16
+ <code>$orchestrate-workflow {{ query }}</code>
17
+ </div>
18
+ </div>
19
+ {% else %}
20
+ <div class="tc-empty-state">
21
+ <strong>Enter a request to generate a Codex starter prompt.</strong>
22
+ <span>The prompt is prepared for Codex-native orchestration and does not run agents from Django.</span>
23
+ </div>
24
+ {% endif %}