devflow-engine 1.0.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 (393) hide show
  1. devflow_engine/__init__.py +3 -0
  2. devflow_engine/agentic_prompts.py +100 -0
  3. devflow_engine/agentic_runtime.py +398 -0
  4. devflow_engine/api_key_flow_harness.py +539 -0
  5. devflow_engine/api_keys.py +357 -0
  6. devflow_engine/bootstrap/__init__.py +2 -0
  7. devflow_engine/bootstrap/provision_from_template.py +84 -0
  8. devflow_engine/cli/__init__.py +0 -0
  9. devflow_engine/cli/app.py +7270 -0
  10. devflow_engine/core/__init__.py +0 -0
  11. devflow_engine/core/config.py +86 -0
  12. devflow_engine/core/logging.py +29 -0
  13. devflow_engine/core/paths.py +45 -0
  14. devflow_engine/core/toml_kv.py +33 -0
  15. devflow_engine/devflow_event_worker.py +1292 -0
  16. devflow_engine/devflow_state.py +201 -0
  17. devflow_engine/devin2/__init__.py +9 -0
  18. devflow_engine/devin2/agent_definition.py +120 -0
  19. devflow_engine/devin2/pi_runner.py +204 -0
  20. devflow_engine/devin_orchestration.py +69 -0
  21. devflow_engine/docs/prompts/anti-patterns.md +42 -0
  22. devflow_engine/docs/prompts/devin-agent-prompt.md +55 -0
  23. devflow_engine/docs/prompts/devin2-agent-prompt.md +81 -0
  24. devflow_engine/docs/prompts/examples/devin-vapi-clone-reference-exchange.json +85 -0
  25. devflow_engine/doctor/__init__.py +2 -0
  26. devflow_engine/doctor/triage.py +140 -0
  27. devflow_engine/error/__init__.py +0 -0
  28. devflow_engine/error/remediation.py +21 -0
  29. devflow_engine/errors/error_solver_dag.py +522 -0
  30. devflow_engine/errors/runtime_observability.py +67 -0
  31. devflow_engine/idea/__init__.py +4 -0
  32. devflow_engine/idea/actors.py +481 -0
  33. devflow_engine/idea/agentic.py +465 -0
  34. devflow_engine/idea/analyze.py +93 -0
  35. devflow_engine/idea/devin_chat_dag.py +1 -0
  36. devflow_engine/idea/diff.py +99 -0
  37. devflow_engine/idea/drafts.py +446 -0
  38. devflow_engine/idea/idea_creation_dag.py +643 -0
  39. devflow_engine/idea/ideation_enrichment.py +355 -0
  40. devflow_engine/idea/ideation_enrichment_worker.py +19 -0
  41. devflow_engine/idea/paths.py +28 -0
  42. devflow_engine/idea/promote.py +53 -0
  43. devflow_engine/idea/redaction.py +27 -0
  44. devflow_engine/idea/repo_tools.py +1277 -0
  45. devflow_engine/idea/response_mode.py +30 -0
  46. devflow_engine/idea/story_pipeline.py +1585 -0
  47. devflow_engine/idea/sufficiency.py +376 -0
  48. devflow_engine/idea/traditional_stories.py +1257 -0
  49. devflow_engine/implementation/__init__.py +0 -0
  50. devflow_engine/implementation/alembic_preflight.py +700 -0
  51. devflow_engine/implementation/dag.py +8450 -0
  52. devflow_engine/implementation/green_gate.py +93 -0
  53. devflow_engine/implementation/prompts.py +108 -0
  54. devflow_engine/implementation/test_runtime.py +623 -0
  55. devflow_engine/integration/__init__.py +19 -0
  56. devflow_engine/integration/agentic.py +66 -0
  57. devflow_engine/integration/dag.py +3539 -0
  58. devflow_engine/integration/prompts.py +114 -0
  59. devflow_engine/integration/supabase_schema.sql +31 -0
  60. devflow_engine/integration/supabase_sync.py +177 -0
  61. devflow_engine/llm/__init__.py +1 -0
  62. devflow_engine/llm/cli_one_shot.py +84 -0
  63. devflow_engine/llm/cli_stream.py +371 -0
  64. devflow_engine/llm/execution_context.py +26 -0
  65. devflow_engine/llm/invoke.py +1322 -0
  66. devflow_engine/llm/provider_api.py +304 -0
  67. devflow_engine/llm/repo_knowledge.py +588 -0
  68. devflow_engine/llm_primitives.py +315 -0
  69. devflow_engine/orchestration.py +62 -0
  70. devflow_engine/planning/__init__.py +0 -0
  71. devflow_engine/planning/analyze_repo.py +92 -0
  72. devflow_engine/planning/render_drafts.py +133 -0
  73. devflow_engine/playground/__init__.py +0 -0
  74. devflow_engine/playground/hooks.py +26 -0
  75. devflow_engine/playwright_workflow/__init__.py +5 -0
  76. devflow_engine/playwright_workflow/dag.py +1317 -0
  77. devflow_engine/process/__init__.py +5 -0
  78. devflow_engine/process/dag.py +59 -0
  79. devflow_engine/project_registration/__init__.py +3 -0
  80. devflow_engine/project_registration/dag.py +1581 -0
  81. devflow_engine/project_registry.py +109 -0
  82. devflow_engine/prompts/devin/generic/prompt.md +6 -0
  83. devflow_engine/prompts/devin/ideation/prompt.md +263 -0
  84. devflow_engine/prompts/devin/ideation/scenarios.md +5 -0
  85. devflow_engine/prompts/devin/ideation_loop/prompt.md +6 -0
  86. devflow_engine/prompts/devin/insight/prompt.md +11 -0
  87. devflow_engine/prompts/devin/insight/scenarios.md +5 -0
  88. devflow_engine/prompts/devin/intake/prompt.md +15 -0
  89. devflow_engine/prompts/devin/iterate/prompt.md +12 -0
  90. devflow_engine/prompts/devin/shared/eval_doctrine.md +9 -0
  91. devflow_engine/prompts/devin/shared/principles.md +246 -0
  92. devflow_engine/prompts/devin_eval/assessment/prompt.md +18 -0
  93. devflow_engine/prompts/idea/api_ideation_agent/prompt.md +8 -0
  94. devflow_engine/prompts/idea/api_insight_agent/prompt.md +8 -0
  95. devflow_engine/prompts/idea/response_doctrine/prompt.md +18 -0
  96. devflow_engine/prompts/implementation/dependency_assessment/prompt.md +12 -0
  97. devflow_engine/prompts/implementation/green/green/prompt.md +11 -0
  98. devflow_engine/prompts/implementation/green/node_config/prompt.md +3 -0
  99. devflow_engine/prompts/implementation/green_review/outcome_review/prompt.md +5 -0
  100. devflow_engine/prompts/implementation/green_review/prior_run_review/prompt.md +5 -0
  101. devflow_engine/prompts/implementation/red/prompt.md +27 -0
  102. devflow_engine/prompts/implementation/redreview/prompt.md +23 -0
  103. devflow_engine/prompts/implementation/redreview_repair/prompt.md +16 -0
  104. devflow_engine/prompts/implementation/setupdoc/prompt.md +10 -0
  105. devflow_engine/prompts/implementation/story_planning/prompt.md +13 -0
  106. devflow_engine/prompts/implementation/test_design/prompt.md +27 -0
  107. devflow_engine/prompts/integration/README.md +185 -0
  108. devflow_engine/prompts/integration/green/example.md +67 -0
  109. devflow_engine/prompts/integration/green/green/prompt.md +10 -0
  110. devflow_engine/prompts/integration/green/node_config/prompt.md +42 -0
  111. devflow_engine/prompts/integration/green/past_prompts/20260417T212300/green/prompt.md +15 -0
  112. devflow_engine/prompts/integration/green/past_prompts/20260417T212300/node_config/prompt.md +42 -0
  113. devflow_engine/prompts/integration/green_enrich/example.md +79 -0
  114. devflow_engine/prompts/integration/green_enrich/green_enrich/prompt.md +9 -0
  115. devflow_engine/prompts/integration/green_enrich/node_config/prompt.md +41 -0
  116. devflow_engine/prompts/integration/green_enrich/past_prompts/20260417T212300/green_enrich/prompt.md +14 -0
  117. devflow_engine/prompts/integration/green_enrich/past_prompts/20260417T212300/node_config/prompt.md +41 -0
  118. devflow_engine/prompts/integration/red/code_repair/prompt.md +12 -0
  119. devflow_engine/prompts/integration/red/example.md +152 -0
  120. devflow_engine/prompts/integration/red/node_config/prompt.md +86 -0
  121. devflow_engine/prompts/integration/red/past_prompts/20260417T212300/code_repair/prompt.md +19 -0
  122. devflow_engine/prompts/integration/red/past_prompts/20260417T212300/node_config/prompt.md +84 -0
  123. devflow_engine/prompts/integration/red/past_prompts/20260417T212300/red/prompt.md +16 -0
  124. devflow_engine/prompts/integration/red/past_prompts/20260417T212300/red_repair/prompt.md +15 -0
  125. devflow_engine/prompts/integration/red/past_prompts/20260417T215032/code_repair/prompt.md +10 -0
  126. devflow_engine/prompts/integration/red/past_prompts/20260417T215032/node_config/prompt.md +84 -0
  127. devflow_engine/prompts/integration/red/past_prompts/20260417T215032/red_repair/prompt.md +11 -0
  128. devflow_engine/prompts/integration/red/red/prompt.md +11 -0
  129. devflow_engine/prompts/integration/red/red_repair/prompt.md +12 -0
  130. devflow_engine/prompts/integration/red_review/example.md +71 -0
  131. devflow_engine/prompts/integration/red_review/node_config/prompt.md +41 -0
  132. devflow_engine/prompts/integration/red_review/past_prompts/20260417T212300/node_config/prompt.md +41 -0
  133. devflow_engine/prompts/integration/red_review/past_prompts/20260417T212300/red_review/prompt.md +15 -0
  134. devflow_engine/prompts/integration/red_review/red_review/prompt.md +9 -0
  135. devflow_engine/prompts/integration/resolve/example.md +111 -0
  136. devflow_engine/prompts/integration/resolve/node_config/prompt.md +64 -0
  137. devflow_engine/prompts/integration/resolve/past_prompts/20260417T212300/node_config/prompt.md +64 -0
  138. devflow_engine/prompts/integration/resolve/past_prompts/20260417T212300/resolve_implicated_users/prompt.md +15 -0
  139. devflow_engine/prompts/integration/resolve/past_prompts/20260417T212300/resolve_side_effects/prompt.md +15 -0
  140. devflow_engine/prompts/integration/resolve/resolve_implicated_users/prompt.md +10 -0
  141. devflow_engine/prompts/integration/resolve/resolve_side_effects/prompt.md +10 -0
  142. devflow_engine/prompts/integration/validate/build_idea_acceptance_coverage/prompt.md +12 -0
  143. devflow_engine/prompts/integration/validate/code_repair/prompt.md +13 -0
  144. devflow_engine/prompts/integration/validate/example.md +143 -0
  145. devflow_engine/prompts/integration/validate/node_config/prompt.md +87 -0
  146. devflow_engine/prompts/integration/validate/past_prompts/20260417T212300/code_repair/prompt.md +19 -0
  147. devflow_engine/prompts/integration/validate/past_prompts/20260417T212300/node_config/prompt.md +67 -0
  148. devflow_engine/prompts/integration/validate/past_prompts/20260417T212300/validate_enrich_gate/prompt.md +17 -0
  149. devflow_engine/prompts/integration/validate/past_prompts/20260417T212300/validate_repair/prompt.md +16 -0
  150. devflow_engine/prompts/integration/validate/past_prompts/20260417T215032/code_repair/prompt.md +10 -0
  151. devflow_engine/prompts/integration/validate/past_prompts/20260417T215032/node_config/prompt.md +67 -0
  152. devflow_engine/prompts/integration/validate/past_prompts/20260417T215032/validate_repair/prompt.md +9 -0
  153. devflow_engine/prompts/integration/validate/validate_enrich_gate/prompt.md +10 -0
  154. devflow_engine/prompts/integration/validate/validate_repair/prompt.md +20 -0
  155. devflow_engine/prompts/integration/write_workflows/example.md +100 -0
  156. devflow_engine/prompts/integration/write_workflows/node_config/prompt.md +44 -0
  157. devflow_engine/prompts/integration/write_workflows/past_prompts/20260417T212300/node_config/prompt.md +44 -0
  158. devflow_engine/prompts/integration/write_workflows/past_prompts/20260417T212300/write_workflows/prompt.md +17 -0
  159. devflow_engine/prompts/integration/write_workflows/write_workflows/prompt.md +11 -0
  160. devflow_engine/prompts/iterate/README.md +7 -0
  161. devflow_engine/prompts/iterate/coder/prompt.md +11 -0
  162. devflow_engine/prompts/iterate/framer/prompt.md +11 -0
  163. devflow_engine/prompts/iterate/iterator/prompt.md +13 -0
  164. devflow_engine/prompts/iterate/observer/prompt.md +11 -0
  165. devflow_engine/prompts/recovery/diagnosis/prompt.md +7 -0
  166. devflow_engine/prompts/recovery/execution/prompt.md +8 -0
  167. devflow_engine/prompts/recovery/execution_verification/prompt.md +7 -0
  168. devflow_engine/prompts/recovery/failure_investigation/prompt.md +10 -0
  169. devflow_engine/prompts/recovery/preflight_health_repo_repair/prompt.md +8 -0
  170. devflow_engine/prompts/recovery/remediation_execution/prompt.md +11 -0
  171. devflow_engine/prompts/recovery/root_cause_investigation/prompt.md +12 -0
  172. devflow_engine/prompts/scope_idea/doctrine/prompt.md +7 -0
  173. devflow_engine/prompts/source_doc_eval/document/prompt.md +6 -0
  174. devflow_engine/prompts/source_doc_eval/targeted_mutation/prompt.md +9 -0
  175. devflow_engine/prompts/source_doc_mutation/domain_entities/prompt.md +6 -0
  176. devflow_engine/prompts/source_doc_mutation/product_brief/prompt.md +6 -0
  177. devflow_engine/prompts/source_doc_mutation/project_doc_coherence/prompt.md +7 -0
  178. devflow_engine/prompts/source_doc_mutation/project_doc_render/prompt.md +9 -0
  179. devflow_engine/prompts/source_doc_mutation/source_doc_coherence/prompt.md +5 -0
  180. devflow_engine/prompts/source_doc_mutation/source_doc_enrichment_coherence/prompt.md +6 -0
  181. devflow_engine/prompts/source_doc_mutation/user_workflows/prompt.md +6 -0
  182. devflow_engine/prompts/source_scope/doctrine/prompt.md +10 -0
  183. devflow_engine/prompts/ui_grounding/doctrine/prompt.md +7 -0
  184. devflow_engine/recovery/__init__.py +3 -0
  185. devflow_engine/recovery/dag.py +2609 -0
  186. devflow_engine/recovery/models.py +220 -0
  187. devflow_engine/refactor.py +93 -0
  188. devflow_engine/registry/__init__.py +1 -0
  189. devflow_engine/registry/cards.py +238 -0
  190. devflow_engine/registry/domain_normalize.py +60 -0
  191. devflow_engine/registry/effects.py +65 -0
  192. devflow_engine/registry/enforce_report.py +150 -0
  193. devflow_engine/registry/module_cards_classify.py +164 -0
  194. devflow_engine/registry/module_cards_draft.py +184 -0
  195. devflow_engine/registry/module_cards_gate.py +59 -0
  196. devflow_engine/registry/packages.py +347 -0
  197. devflow_engine/registry/pathways.py +323 -0
  198. devflow_engine/review/__init__.py +11 -0
  199. devflow_engine/review/dag.py +588 -0
  200. devflow_engine/review/review_story.py +67 -0
  201. devflow_engine/scope_idea/__init__.py +3 -0
  202. devflow_engine/scope_idea/agentic.py +39 -0
  203. devflow_engine/scope_idea/dag.py +1069 -0
  204. devflow_engine/scope_idea/models.py +175 -0
  205. devflow_engine/skills/builtins/devflow/queue_failure_investigation/SKILL.md +112 -0
  206. devflow_engine/skills/builtins/devflow/queue_idea_to_story/SKILL.md +120 -0
  207. devflow_engine/skills/builtins/devflow/queue_integration/SKILL.md +105 -0
  208. devflow_engine/skills/builtins/devflow/queue_recovery/SKILL.md +108 -0
  209. devflow_engine/skills/builtins/devflow/queue_runtime_core/SKILL.md +155 -0
  210. devflow_engine/skills/builtins/devflow/queue_story_implementation/SKILL.md +122 -0
  211. devflow_engine/skills/builtins/devin/idea_to_story_handoff/SKILL.md +120 -0
  212. devflow_engine/skills/builtins/devin/ideation/SKILL.md +168 -0
  213. devflow_engine/skills/builtins/devin/ideation/state-and-phrasing-reference.md +18 -0
  214. devflow_engine/skills/builtins/devin/insight/SKILL.md +22 -0
  215. devflow_engine/skills/registry.example.yaml +42 -0
  216. devflow_engine/source_doc_assumptions.py +291 -0
  217. devflow_engine/source_doc_mutation_dag.py +1606 -0
  218. devflow_engine/source_doc_mutation_eval.py +417 -0
  219. devflow_engine/source_doc_mutation_worker.py +25 -0
  220. devflow_engine/source_docs_schema.py +207 -0
  221. devflow_engine/source_docs_updater.py +309 -0
  222. devflow_engine/source_scope/__init__.py +15 -0
  223. devflow_engine/source_scope/agentic.py +45 -0
  224. devflow_engine/source_scope/dag.py +1626 -0
  225. devflow_engine/source_scope/models.py +177 -0
  226. devflow_engine/stores/__init__.py +0 -0
  227. devflow_engine/stores/execution_store.py +3534 -0
  228. devflow_engine/story/__init__.py +0 -0
  229. devflow_engine/story/contracts.py +160 -0
  230. devflow_engine/story/discovery.py +47 -0
  231. devflow_engine/story/evidence.py +118 -0
  232. devflow_engine/story/hashing.py +27 -0
  233. devflow_engine/story/implemented_queue_purge.py +148 -0
  234. devflow_engine/story/indexer.py +105 -0
  235. devflow_engine/story/io.py +20 -0
  236. devflow_engine/story/markdown_contracts.py +298 -0
  237. devflow_engine/story/reconciliation.py +408 -0
  238. devflow_engine/story/validate_stories.py +149 -0
  239. devflow_engine/story/validate_tests_story.py +512 -0
  240. devflow_engine/story/validation.py +133 -0
  241. devflow_engine/ui_grounding/__init__.py +11 -0
  242. devflow_engine/ui_grounding/agentic.py +31 -0
  243. devflow_engine/ui_grounding/dag.py +874 -0
  244. devflow_engine/ui_grounding/models.py +224 -0
  245. devflow_engine/ui_grounding/pencil_bridge.py +247 -0
  246. devflow_engine/vendor/__init__.py +0 -0
  247. devflow_engine/vendor/datalumina_genai/__init__.py +11 -0
  248. devflow_engine/vendor/datalumina_genai/core/__init__.py +0 -0
  249. devflow_engine/vendor/datalumina_genai/core/exceptions.py +9 -0
  250. devflow_engine/vendor/datalumina_genai/core/nodes/__init__.py +0 -0
  251. devflow_engine/vendor/datalumina_genai/core/nodes/agent.py +48 -0
  252. devflow_engine/vendor/datalumina_genai/core/nodes/agent_streaming_node.py +26 -0
  253. devflow_engine/vendor/datalumina_genai/core/nodes/base.py +89 -0
  254. devflow_engine/vendor/datalumina_genai/core/nodes/concurrent.py +30 -0
  255. devflow_engine/vendor/datalumina_genai/core/nodes/router.py +69 -0
  256. devflow_engine/vendor/datalumina_genai/core/schema.py +72 -0
  257. devflow_engine/vendor/datalumina_genai/core/task.py +52 -0
  258. devflow_engine/vendor/datalumina_genai/core/validate.py +139 -0
  259. devflow_engine/vendor/datalumina_genai/core/workflow.py +200 -0
  260. devflow_engine/worker.py +1086 -0
  261. devflow_engine/worker_guard.py +233 -0
  262. devflow_engine-1.0.0.dist-info/METADATA +235 -0
  263. devflow_engine-1.0.0.dist-info/RECORD +393 -0
  264. devflow_engine-1.0.0.dist-info/WHEEL +4 -0
  265. devflow_engine-1.0.0.dist-info/entry_points.txt +3 -0
  266. devin/__init__.py +6 -0
  267. devin/dag.py +58 -0
  268. devin/dag_two_arm.py +138 -0
  269. devin/devin_chat_scenario_catalog.json +588 -0
  270. devin/devin_eval.py +677 -0
  271. devin/nodes/__init__.py +0 -0
  272. devin/nodes/ideation/__init__.py +0 -0
  273. devin/nodes/ideation/node.py +195 -0
  274. devin/nodes/ideation/playground.py +267 -0
  275. devin/nodes/ideation/prompt.md +65 -0
  276. devin/nodes/ideation/scenarios/continue_refinement.py +13 -0
  277. devin/nodes/ideation/scenarios/continue_refinement_evals.py +18 -0
  278. devin/nodes/ideation/scenarios/idea_fits_existing_patterns.py +17 -0
  279. devin/nodes/ideation/scenarios/idea_fits_existing_patterns_evals.py +16 -0
  280. devin/nodes/ideation/scenarios/large_idea_split.py +4 -0
  281. devin/nodes/ideation/scenarios/large_idea_split_evals.py +17 -0
  282. devin/nodes/ideation/scenarios/source_documentation_added.py +4 -0
  283. devin/nodes/ideation/scenarios/source_documentation_added_evals.py +16 -0
  284. devin/nodes/ideation/scenarios/user_says_create_it.py +30 -0
  285. devin/nodes/ideation/scenarios/user_says_create_it_evals.py +23 -0
  286. devin/nodes/ideation/scenarios/vague_idea.py +16 -0
  287. devin/nodes/ideation/scenarios/vague_idea_evals.py +47 -0
  288. devin/nodes/ideation/tools.json +312 -0
  289. devin/nodes/insight/__init__.py +0 -0
  290. devin/nodes/insight/node.py +49 -0
  291. devin/nodes/insight/playground.py +154 -0
  292. devin/nodes/insight/prompt.md +61 -0
  293. devin/nodes/insight/scenarios/architecture_pattern_query.py +15 -0
  294. devin/nodes/insight/scenarios/architecture_pattern_query_evals.py +25 -0
  295. devin/nodes/insight/scenarios/codebase_exploration.py +15 -0
  296. devin/nodes/insight/scenarios/codebase_exploration_evals.py +23 -0
  297. devin/nodes/insight/scenarios/devin_ideation_routing.py +19 -0
  298. devin/nodes/insight/scenarios/devin_ideation_routing_evals.py +39 -0
  299. devin/nodes/insight/scenarios/devin_insight_routing.py +20 -0
  300. devin/nodes/insight/scenarios/devin_insight_routing_evals.py +40 -0
  301. devin/nodes/insight/scenarios/operational_debugging.py +15 -0
  302. devin/nodes/insight/scenarios/operational_debugging_evals.py +23 -0
  303. devin/nodes/insight/scenarios/operational_question.py +9 -0
  304. devin/nodes/insight/scenarios/operational_question_evals.py +8 -0
  305. devin/nodes/insight/scenarios/queue_status.py +15 -0
  306. devin/nodes/insight/scenarios/queue_status_evals.py +23 -0
  307. devin/nodes/insight/scenarios/source_doc_explanation.py +14 -0
  308. devin/nodes/insight/scenarios/source_doc_explanation_evals.py +21 -0
  309. devin/nodes/insight/scenarios/worker_state_check.py +15 -0
  310. devin/nodes/insight/scenarios/worker_state_check_evals.py +22 -0
  311. devin/nodes/insight/tools.json +126 -0
  312. devin/nodes/intake/__init__.py +0 -0
  313. devin/nodes/intake/node.py +27 -0
  314. devin/nodes/intake/playground.py +47 -0
  315. devin/nodes/intake/prompt.md +12 -0
  316. devin/nodes/intake/scenarios/ideation_routing.py +4 -0
  317. devin/nodes/intake/scenarios/ideation_routing_evals.py +5 -0
  318. devin/nodes/intake/scenarios/insight_routing.py +4 -0
  319. devin/nodes/intake/scenarios/insight_routing_evals.py +5 -0
  320. devin/nodes/iterate/README.md +44 -0
  321. devin/nodes/iterate/__init__.py +1 -0
  322. devin/nodes/iterate/_archived_design_stages/01-objectives-requirements.md +112 -0
  323. devin/nodes/iterate/_archived_design_stages/02-evals.md +131 -0
  324. devin/nodes/iterate/_archived_design_stages/03-tools-and-boundaries.md +110 -0
  325. devin/nodes/iterate/_archived_design_stages/04-harness-and-playground.md +32 -0
  326. devin/nodes/iterate/_archived_design_stages/05-prompt-deferred.md +11 -0
  327. devin/nodes/iterate/_archived_design_stages/coder_agent_design/01-objectives-requirements.md +20 -0
  328. devin/nodes/iterate/_archived_design_stages/coder_agent_design/02-evals.md +8 -0
  329. devin/nodes/iterate/_archived_design_stages/coder_agent_design/03-tools-and-boundaries.md +14 -0
  330. devin/nodes/iterate/_archived_design_stages/coder_agent_design/04-harness-and-playground.md +12 -0
  331. devin/nodes/iterate/_archived_design_stages/framer_agent_design/01-objectives-requirements.md +20 -0
  332. devin/nodes/iterate/_archived_design_stages/framer_agent_design/02-evals.md +8 -0
  333. devin/nodes/iterate/_archived_design_stages/framer_agent_design/03-tools-and-boundaries.md +13 -0
  334. devin/nodes/iterate/_archived_design_stages/framer_agent_design/04-harness-and-playground.md +12 -0
  335. devin/nodes/iterate/_archived_design_stages/iterator_agent_design/01-objectives-requirements.md +25 -0
  336. devin/nodes/iterate/_archived_design_stages/iterator_agent_design/02-evals.md +9 -0
  337. devin/nodes/iterate/_archived_design_stages/iterator_agent_design/03-tools-and-boundaries.md +14 -0
  338. devin/nodes/iterate/_archived_design_stages/iterator_agent_design/04-harness-and-playground.md +12 -0
  339. devin/nodes/iterate/_archived_design_stages/observer_agent_design/01-objectives-requirements.md +20 -0
  340. devin/nodes/iterate/_archived_design_stages/observer_agent_design/02-evals.md +8 -0
  341. devin/nodes/iterate/_archived_design_stages/observer_agent_design/03-tools-and-boundaries.md +14 -0
  342. devin/nodes/iterate/_archived_design_stages/observer_agent_design/04-harness-and-playground.md +13 -0
  343. devin/nodes/iterate/agent-roles.md +89 -0
  344. devin/nodes/iterate/agents/README.md +10 -0
  345. devin/nodes/iterate/artifacts.md +504 -0
  346. devin/nodes/iterate/contract.md +100 -0
  347. devin/nodes/iterate/eval-plan.md +74 -0
  348. devin/nodes/iterate/node.py +100 -0
  349. devin/nodes/iterate/pipeline/README.md +13 -0
  350. devin/nodes/iterate/playground-contract.md +76 -0
  351. devin/nodes/iterate/prompt.md +11 -0
  352. devin/nodes/iterate/scenarios/README.md +38 -0
  353. devin/nodes/iterate/scenarios/artifact-and-loop-scenarios.md +101 -0
  354. devin/nodes/iterate/scenarios/coder_artifact_alignment.py +32 -0
  355. devin/nodes/iterate/scenarios/coder_artifact_alignment_evals.py +45 -0
  356. devin/nodes/iterate/scenarios/coder_bounded_fix.py +27 -0
  357. devin/nodes/iterate/scenarios/coder_bounded_fix_evals.py +45 -0
  358. devin/nodes/iterate/scenarios/devin_iterate_routing.py +21 -0
  359. devin/nodes/iterate/scenarios/devin_iterate_routing_evals.py +36 -0
  360. devin/nodes/iterate/scenarios/framer_scope_boundary.py +25 -0
  361. devin/nodes/iterate/scenarios/framer_scope_boundary_evals.py +57 -0
  362. devin/nodes/iterate/scenarios/framer_task_framing.py +25 -0
  363. devin/nodes/iterate/scenarios/framer_task_framing_evals.py +58 -0
  364. devin/nodes/iterate/scenarios/iterate_error_fix.py +21 -0
  365. devin/nodes/iterate/scenarios/iterate_error_fix_evals.py +39 -0
  366. devin/nodes/iterate/scenarios/iterate_quick_change.py +21 -0
  367. devin/nodes/iterate/scenarios/iterate_quick_change_evals.py +35 -0
  368. devin/nodes/iterate/scenarios/iterate_to_idea_promotion.py +23 -0
  369. devin/nodes/iterate/scenarios/iterate_to_idea_promotion_evals.py +53 -0
  370. devin/nodes/iterate/scenarios/iterate_to_insight_reroute.py +23 -0
  371. devin/nodes/iterate/scenarios/iterate_to_insight_reroute_evals.py +53 -0
  372. devin/nodes/iterate/scenarios/observer_evidence_seam.py +28 -0
  373. devin/nodes/iterate/scenarios/observer_evidence_seam_evals.py +55 -0
  374. devin/nodes/iterate/scenarios/observer_repro_creation.py +28 -0
  375. devin/nodes/iterate/scenarios/observer_repro_creation_evals.py +45 -0
  376. devin/nodes/iterate/scenarios/routing-matrix.md +45 -0
  377. devin/nodes/shared/__init__.py +0 -0
  378. devin/nodes/shared/filemaker_expert.md +80 -0
  379. devin/nodes/shared/filemaker_expert.py +354 -0
  380. devin/nodes/shared/filemaker_expert_eval/runner.py +176 -0
  381. devin/nodes/shared/filemaker_expert_eval/scenarios.json +65 -0
  382. devin/nodes/shared/goldilocks_advisor_eval/runner.py +214 -0
  383. devin/nodes/shared/goldilocks_advisor_eval/scenarios.json +58 -0
  384. devin/nodes/shared/helpers.py +156 -0
  385. devin/nodes/shared/idea_compliance_advisor_eval/runner.py +252 -0
  386. devin/nodes/shared/idea_compliance_advisor_eval/scenarios.json +75 -0
  387. devin/nodes/shared/models.py +44 -0
  388. devin/nodes/shared/post.py +40 -0
  389. devin/nodes/shared/router.py +107 -0
  390. devin/nodes/shared/tools.py +191 -0
  391. devin/shared/devin-chat-rubric.md +237 -0
  392. devin/shared/devin-chat-scenario-suite.md +90 -0
  393. devin/shared/eval_doctrine.md +9 -0
@@ -0,0 +1,371 @@
1
+ from __future__ import annotations
2
+
3
+ import json
4
+ import os
5
+ import shlex
6
+ import sqlite3
7
+ import subprocess
8
+ import threading
9
+ import time
10
+ from dataclasses import dataclass
11
+ from datetime import datetime, timedelta, timezone
12
+ from pathlib import Path
13
+ from typing import Any, Literal
14
+
15
+ from ..api_keys import bootstrap_provider_api_keys
16
+ from .execution_context import get_execution_context
17
+
18
+ StreamName = Literal["stdout", "stderr"]
19
+
20
+
21
+ def utc_now_iso() -> str:
22
+ return datetime.now(timezone.utc).replace(microsecond=0).isoformat()
23
+
24
+
25
+ def _split_base(cmd: str) -> list[str]:
26
+ parts = shlex.split(cmd)
27
+ return [p for p in parts if p]
28
+
29
+
30
+ def _random_token(n: int = 6) -> str:
31
+ import secrets
32
+ import string
33
+
34
+ alphabet = string.ascii_lowercase + string.digits
35
+ return "".join(secrets.choice(alphabet) for _ in range(n))
36
+
37
+
38
+ def _global_devflow_dir() -> Path:
39
+ base = os.environ.get("DEVFLOW_HOME") or os.environ.get("HOME")
40
+ if base:
41
+ return Path(base).expanduser().resolve() / ".devflow"
42
+ return Path.home().resolve() / ".devflow"
43
+
44
+
45
+ def llm_logs_dir() -> Path:
46
+ return _global_devflow_dir() / "llm_logs"
47
+
48
+
49
+ def llm_sessions_db() -> Path:
50
+ return _global_devflow_dir() / "llm_sessions.sqlite"
51
+
52
+
53
+ def llm_journal_dir() -> Path:
54
+ return _global_devflow_dir() / "journal"
55
+
56
+
57
+ def _ensure_sessions_schema(conn: sqlite3.Connection) -> None:
58
+ conn.executescript(
59
+ """
60
+ create table if not exists llm_sessions (
61
+ session_id text primary key,
62
+ provider text not null,
63
+ base_cmd text not null,
64
+ delivery text not null,
65
+ cwd text not null,
66
+ started_at text not null,
67
+ ended_at text,
68
+ returncode integer,
69
+ status text not null,
70
+ log_path text not null,
71
+ summary text
72
+ );
73
+
74
+ create table if not exists dev_journal_entries (
75
+ journal_entry_id text primary key,
76
+ session_id text not null,
77
+ provider text not null,
78
+ base_cmd text not null,
79
+ delivery text not null,
80
+ cwd text not null,
81
+ repo_root text,
82
+ run_id text,
83
+ node_exec_id text,
84
+ story_id text,
85
+ story_uuid text,
86
+ dag_id text,
87
+ started_at text not null,
88
+ ended_at text,
89
+ returncode integer,
90
+ status text not null,
91
+ summary text,
92
+ log_path text not null,
93
+ metadata_json text not null default '{}',
94
+ foreign key(session_id) references llm_sessions(session_id)
95
+ );
96
+
97
+ create index if not exists idx_dev_journal_entries_run_id_started_at on dev_journal_entries(run_id, started_at);
98
+ create index if not exists idx_dev_journal_entries_story_id_started_at on dev_journal_entries(story_id, started_at);
99
+ create index if not exists idx_dev_journal_entries_story_uuid_started_at on dev_journal_entries(story_uuid, started_at);
100
+ create index if not exists idx_dev_journal_entries_node_exec_id_started_at on dev_journal_entries(node_exec_id, started_at);
101
+ """
102
+ )
103
+
104
+
105
+ @dataclass(frozen=True)
106
+ class StreamResult:
107
+ ok: bool
108
+ stdout: str
109
+ stderr: str
110
+ returncode: int
111
+ session_id: str
112
+ log_path: Path
113
+
114
+
115
+ def purge_llm_logs(*, days: int = 7) -> int:
116
+ """Purge log files older than N days."""
117
+
118
+ cutoff = datetime.now(timezone.utc) - timedelta(days=days)
119
+ root = llm_logs_dir()
120
+ if not root.exists():
121
+ return 0
122
+
123
+ removed = 0
124
+ for p in root.glob("*.jsonl"):
125
+ try:
126
+ mtime = datetime.fromtimestamp(p.stat().st_mtime, tz=timezone.utc)
127
+ if mtime < cutoff:
128
+ p.unlink(missing_ok=True)
129
+ removed += 1
130
+ except Exception:
131
+ continue
132
+
133
+ return removed
134
+
135
+
136
+ def _resolve_journal_context(*, cwd: Path) -> dict[str, Any]:
137
+ ctx = get_execution_context() or {}
138
+ env_map = {
139
+ "run_id": os.environ.get("DEVFLOW_RUN_ID"),
140
+ "node_exec_id": os.environ.get("DEVFLOW_NODE_EXEC_ID"),
141
+ "story_id": os.environ.get("DEVFLOW_STORY_ID"),
142
+ "story_uuid": os.environ.get("DEVFLOW_STORY_UUID"),
143
+ "dag_id": os.environ.get("DEVFLOW_DAG_ID"),
144
+ "repo_root": os.environ.get("DEVFLOW_REPO_ROOT"),
145
+ "story_title": os.environ.get("DEVFLOW_STORY_TITLE"),
146
+ }
147
+ for key, value in env_map.items():
148
+ if key not in ctx and value:
149
+ ctx[key] = value
150
+ if "repo_root" not in ctx:
151
+ ctx["repo_root"] = str(cwd)
152
+ return ctx
153
+
154
+
155
+
156
+ def _append_markdown_journal(*, session_id: str, provider: str, cwd: Path, base_cmd: str, status: str, summary: str, log_path: Path) -> Path:
157
+ """Append a short markdown entry to the daily journal."""
158
+
159
+ d = llm_journal_dir()
160
+ d.mkdir(parents=True, exist_ok=True)
161
+ day = datetime.now(timezone.utc).strftime("%Y-%m-%d")
162
+ md = d / f"{day}.md"
163
+
164
+ lines = [
165
+ f"## LLM session {session_id}",
166
+ f"- time (UTC): {utc_now_iso()}",
167
+ f"- provider: `{provider}`",
168
+ f"- status: `{status}`",
169
+ f"- cwd: `{cwd}`",
170
+ f"- cmd: `{base_cmd}`",
171
+ f"- log: `{log_path}`",
172
+ "",
173
+ "Summary:",
174
+ "```",
175
+ summary,
176
+ "```",
177
+ "",
178
+ ]
179
+
180
+ if md.exists():
181
+ existing = md.read_text(encoding="utf-8")
182
+ if not existing.endswith("\n"):
183
+ existing += "\n"
184
+ md.write_text(existing + "\n".join(lines), encoding="utf-8")
185
+ else:
186
+ md.write_text("# LLM Journal\n\n" + "\n".join(lines), encoding="utf-8")
187
+
188
+ return md
189
+
190
+
191
+ def run_streaming(
192
+ *,
193
+ provider: str,
194
+ base_cmd: str,
195
+ delivery: str,
196
+ prompt: str,
197
+ cwd: Path,
198
+ purge_days: int = 7,
199
+ timeout_s: int | None = None,
200
+ ) -> StreamResult:
201
+ """Run a CLI prompt in the background while streaming stdout/stderr to JSONL.
202
+
203
+ - Captures full stdout/stderr in-memory (bounded by process output).
204
+ - Writes JSONL log lines to $DEVFLOW_HOME/.devflow/llm_logs/<session_id>.jsonl
205
+ - Records a session row into $DEVFLOW_HOME/.devflow/llm_sessions.sqlite
206
+
207
+ delivery:
208
+ - argument: append prompt as final argv element
209
+ - stdin: pass prompt via stdin
210
+ """
211
+
212
+ purge_llm_logs(days=purge_days)
213
+
214
+ argv = _split_base(base_cmd)
215
+ if not argv:
216
+ raise RuntimeError("llm cli base command is empty")
217
+
218
+ session_id = f"llm_{int(time.time())}_{_random_token()}"
219
+ log_dir = llm_logs_dir()
220
+ log_dir.mkdir(parents=True, exist_ok=True)
221
+ log_path = log_dir / f"{session_id}.jsonl"
222
+
223
+ started_at = utc_now_iso()
224
+ journal_ctx = _resolve_journal_context(cwd=cwd)
225
+
226
+ child_env = os.environ.copy()
227
+ if provider:
228
+ bootstrap_provider_api_keys(env=child_env)
229
+
230
+ # Prepare process
231
+ if delivery == "argument":
232
+ argv = argv + [prompt]
233
+ p = subprocess.Popen(argv, cwd=str(cwd), text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=child_env)
234
+ stdin_text = None
235
+ elif delivery == "stdin":
236
+ p = subprocess.Popen(argv, cwd=str(cwd), text=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=child_env)
237
+ stdin_text = prompt
238
+ else:
239
+ raise RuntimeError(f"unsupported delivery: {delivery}")
240
+
241
+ stdout_buf: list[str] = []
242
+ stderr_buf: list[str] = []
243
+ lock = threading.Lock()
244
+
245
+ def log_line(stream: StreamName, line: str) -> None:
246
+ rec = {"ts": utc_now_iso(), "stream": stream, "line": line.rstrip("\n")}
247
+ with log_path.open("a", encoding="utf-8") as f:
248
+ f.write(json.dumps(rec, sort_keys=True) + "\n")
249
+
250
+ def reader(stream: StreamName, fh) -> None:
251
+ try:
252
+ for line in iter(fh.readline, ""):
253
+ with lock:
254
+ if stream == "stdout":
255
+ stdout_buf.append(line)
256
+ else:
257
+ stderr_buf.append(line)
258
+ log_line(stream, line)
259
+ finally:
260
+ try:
261
+ fh.close()
262
+ except Exception:
263
+ pass
264
+
265
+ t_out = threading.Thread(target=reader, args=("stdout", p.stdout), daemon=True) # type: ignore[arg-type]
266
+ t_err = threading.Thread(target=reader, args=("stderr", p.stderr), daemon=True) # type: ignore[arg-type]
267
+ t_out.start()
268
+ t_err.start()
269
+
270
+ # Write initial session row + deterministic journal row at stream start.
271
+ db_path = llm_sessions_db()
272
+ db_path.parent.mkdir(parents=True, exist_ok=True)
273
+ journal_entry_id = f"journal_{session_id}"
274
+ conn = sqlite3.connect(str(db_path))
275
+ try:
276
+ _ensure_sessions_schema(conn)
277
+ conn.execute(
278
+ "insert or replace into llm_sessions(session_id,provider,base_cmd,delivery,cwd,started_at,status,log_path) values (?,?,?,?,?,?,?,?)",
279
+ (session_id, provider, base_cmd, delivery, str(cwd), started_at, "running", str(log_path)),
280
+ )
281
+ conn.execute(
282
+ "insert or replace into dev_journal_entries(journal_entry_id,session_id,provider,base_cmd,delivery,cwd,repo_root,run_id,node_exec_id,story_id,story_uuid,dag_id,started_at,status,log_path,metadata_json) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",
283
+ (
284
+ journal_entry_id,
285
+ session_id,
286
+ provider,
287
+ base_cmd,
288
+ delivery,
289
+ str(cwd),
290
+ str(journal_ctx.get("repo_root") or str(cwd)),
291
+ journal_ctx.get("run_id"),
292
+ journal_ctx.get("node_exec_id"),
293
+ journal_ctx.get("story_id"),
294
+ journal_ctx.get("story_uuid"),
295
+ journal_ctx.get("dag_id"),
296
+ started_at,
297
+ "running",
298
+ str(log_path),
299
+ json.dumps(journal_ctx, sort_keys=True),
300
+ ),
301
+ )
302
+ conn.commit()
303
+ finally:
304
+ conn.close()
305
+
306
+ if stdin_text is not None and p.stdin is not None:
307
+ try:
308
+ p.stdin.write(stdin_text)
309
+ p.stdin.close()
310
+ except Exception:
311
+ pass
312
+
313
+ # Wait for completion (with optional timeout)
314
+ try:
315
+ rc = p.wait(timeout=timeout_s)
316
+ except subprocess.TimeoutExpired:
317
+ try:
318
+ p.kill()
319
+ except Exception:
320
+ pass
321
+ rc = -1
322
+
323
+ # Ensure threads drained
324
+ t_out.join(timeout=1)
325
+ t_err.join(timeout=1)
326
+
327
+ ended_at = utc_now_iso()
328
+
329
+ stdout_text = "".join(stdout_buf)
330
+ stderr_text = "".join(stderr_buf)
331
+
332
+ ok = rc == 0
333
+ status = "ok" if ok else "error"
334
+
335
+ # Small deterministic summary (no LLM)
336
+ summary = f"returncode={rc}; stdout_lines={stdout_text.count(chr(10))}; stderr_lines={stderr_text.count(chr(10))}"
337
+
338
+ conn = sqlite3.connect(str(db_path))
339
+ try:
340
+ _ensure_sessions_schema(conn)
341
+ conn.execute(
342
+ "update llm_sessions set ended_at=?, returncode=?, status=?, summary=? where session_id=?",
343
+ (ended_at, int(rc), status, summary, session_id),
344
+ )
345
+ conn.execute(
346
+ "update dev_journal_entries set ended_at=?, returncode=?, status=?, summary=? where journal_entry_id=?",
347
+ (ended_at, int(rc), status, summary, journal_entry_id),
348
+ )
349
+ conn.commit()
350
+ finally:
351
+ conn.close()
352
+
353
+ # Append to markdown developer journal
354
+ _append_markdown_journal(
355
+ session_id=session_id,
356
+ provider=provider,
357
+ cwd=cwd,
358
+ base_cmd=base_cmd,
359
+ status=status,
360
+ summary=summary,
361
+ log_path=log_path,
362
+ )
363
+
364
+ return StreamResult(
365
+ ok=ok,
366
+ stdout=stdout_text,
367
+ stderr=stderr_text,
368
+ returncode=int(rc),
369
+ session_id=session_id,
370
+ log_path=log_path,
371
+ )
@@ -0,0 +1,26 @@
1
+ from __future__ import annotations
2
+
3
+ from contextlib import contextmanager
4
+ from contextvars import ContextVar
5
+ from pathlib import Path
6
+ from typing import Any, Iterator
7
+
8
+
9
+ _CURRENT_EXECUTION_CONTEXT: ContextVar[dict[str, Any] | None] = ContextVar("devflow_execution_context", default=None)
10
+
11
+
12
+ def get_execution_context() -> dict[str, Any] | None:
13
+ ctx = _CURRENT_EXECUTION_CONTEXT.get()
14
+ return dict(ctx) if isinstance(ctx, dict) else None
15
+
16
+
17
+ @contextmanager
18
+ def execution_context(**kwargs: Any) -> Iterator[None]:
19
+ ctx = {k: v for k, v in kwargs.items() if v is not None}
20
+ if "repo_root" in ctx and isinstance(ctx["repo_root"], Path):
21
+ ctx["repo_root"] = str(ctx["repo_root"])
22
+ token = _CURRENT_EXECUTION_CONTEXT.set(ctx)
23
+ try:
24
+ yield
25
+ finally:
26
+ _CURRENT_EXECUTION_CONTEXT.reset(token)