multi-forge 0.7.0__tar.gz → 0.8.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (422) hide show
  1. {multi_forge-0.7.0 → multi_forge-0.8.0}/PKG-INFO +27 -12
  2. {multi_forge-0.7.0 → multi_forge-0.8.0}/README.md +26 -11
  3. {multi_forge-0.7.0 → multi_forge-0.8.0}/pyproject.toml +1 -1
  4. multi_forge-0.8.0/src/forge/__init__.py +16 -0
  5. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/backend/registry.py +20 -22
  6. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/activity.py +1 -1
  7. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/claude.py +6 -6
  8. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/codex.py +25 -16
  9. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/extensions.py +428 -26
  10. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/gc.py +46 -5
  11. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/guards.py +20 -0
  12. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/hooks/__init__.py +0 -8
  13. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/hooks/_group.py +3 -3
  14. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/hooks/codex_policy.py +2 -10
  15. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/hooks/codex_transfer.py +5 -0
  16. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/hooks/commands.py +280 -210
  17. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/hooks/direct_commands.py +122 -247
  18. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/logs.py +5 -3
  19. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/main.py +36 -3
  20. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/memory.py +71 -14
  21. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/memory_writer.py +19 -0
  22. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/policy.py +151 -302
  23. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/runtime.py +3 -3
  24. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/search.py +149 -36
  25. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/session.py +13 -100
  26. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/session_fork.py +52 -80
  27. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/session_lane.py +31 -5
  28. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/session_lifecycle.py +51 -90
  29. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/session_manage.py +125 -23
  30. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/session_memory.py +10 -8
  31. multi_forge-0.8.0/src/forge/cli/session_supervisor_options.py +102 -0
  32. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/status_line.py +65 -30
  33. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/statusline/names.py +1 -0
  34. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/statusline/registry.py +15 -0
  35. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/statusline/throttle.py +2 -13
  36. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/workflow.py +11 -2
  37. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/config/loader.py +8 -27
  38. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/auth/credentials_file.py +6 -18
  39. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/auth/template_secrets.py +2 -2
  40. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/llm/detection.py +4 -1
  41. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/ops/claude_session.py +71 -30
  42. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/ops/codex_enrollment.py +6 -5
  43. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/ops/codex_session.py +6 -7
  44. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/ops/context.py +3 -19
  45. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/ops/gc.py +250 -11
  46. multi_forge-0.8.0/src/forge/core/ops/policy.py +429 -0
  47. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/ops/session.py +122 -4
  48. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/ops/session_context.py +3 -8
  49. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/ops/transfer.py +15 -0
  50. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/paths.py +17 -0
  51. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/reactive/env.py +3 -0
  52. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/runtime/registry.py +13 -32
  53. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/runtime_vocab.py +1 -1
  54. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/state/__init__.py +14 -1
  55. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/state/io.py +31 -2
  56. {multi_forge-0.7.0/src/forge/proxy → multi_forge-0.8.0/src/forge/core/state}/retention.py +1 -1
  57. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/state/timestamps.py +5 -0
  58. multi_forge-0.8.0/src/forge/core/state/versioned_store.py +59 -0
  59. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/telemetry/downstream.py +14 -24
  60. multi_forge-0.8.0/src/forge/core/telemetry/jsonl_io.py +37 -0
  61. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/telemetry/upstream.py +13 -23
  62. multi_forge-0.8.0/src/forge/core/tiers.py +18 -0
  63. multi_forge-0.8.0/src/forge/core/transcript.py +169 -0
  64. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/usage/__init__.py +0 -2
  65. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/usage/ledger.py +16 -68
  66. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/usage/vocabulary.py +3 -5
  67. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/install/codex_hooks.py +153 -46
  68. multi_forge-0.8.0/src/forge/install/doctor.py +270 -0
  69. multi_forge-0.8.0/src/forge/install/hook_dispatcher.py +780 -0
  70. multi_forge-0.8.0/src/forge/install/hook_migration.py +982 -0
  71. multi_forge-0.8.0/src/forge/install/hooks.py +431 -0
  72. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/install/installer.py +130 -34
  73. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/install/models.py +4 -10
  74. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/install/preset.py +46 -19
  75. multi_forge-0.8.0/src/forge/install/project_compat.py +363 -0
  76. multi_forge-0.8.0/src/forge/install/project_registry.py +329 -0
  77. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/install/settings_merge.py +3 -1
  78. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/install/tracking.py +24 -19
  79. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/policy/deterministic/base.py +9 -0
  80. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/policy/semantic/shadow.py +1 -1
  81. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/policy/semantic/shadow_runner.py +1 -1
  82. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/policy/semantic/supervisor.py +3 -10
  83. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/proxy/audit_logger.py +4 -7
  84. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/proxy/client_factory.py +2 -12
  85. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/proxy/data_models.py +8 -34
  86. multi_forge-0.8.0/src/forge/proxy/ports.py +27 -0
  87. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/proxy/proxies.py +31 -19
  88. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/proxy/proxy_orchestrator.py +14 -13
  89. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/proxy/server.py +78 -131
  90. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/proxy/utils.py +1 -1
  91. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/review/engine.py +1 -1
  92. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/review/routing.py +28 -9
  93. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/runtime_config.py +4 -18
  94. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/search/__init__.py +8 -0
  95. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/search/bm25_store.py +16 -22
  96. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/search/content_store.py +16 -22
  97. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/search/exceptions.py +25 -1
  98. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/search/index_state.py +17 -22
  99. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/search/store.py +19 -19
  100. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/active.py +4 -0
  101. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/claude/relocate.py +5 -15
  102. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/cleanup.py +33 -4
  103. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/consumer_lanes.py +3 -3
  104. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/hooks/session_start.py +15 -10
  105. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/index.py +8 -19
  106. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/launch.py +11 -2
  107. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/manager.py +75 -30
  108. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/memory_writer.py +19 -27
  109. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/model_pin.py +1 -1
  110. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/models.py +6 -0
  111. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/rewind.py +10 -8
  112. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/shadow_curation.py +2 -7
  113. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/transfer.py +12 -95
  114. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/worktree/__init__.py +4 -0
  115. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/worktree/create.py +92 -2
  116. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/sidecar/__init__.py +1 -1
  117. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/qa/resources/checklist/17-info.md +1 -1
  118. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/qa/resources/checklist/18-disable.md +0 -3
  119. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/qa/resources/checklist/2-extension.md +43 -9
  120. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/qa/resources/checklist/6-hook.md +7 -11
  121. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/qa/resources/checklist.md +14 -10
  122. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/walkthrough/resources/checklist.md +37 -9
  123. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/walkthrough/scripts/run-in-repo.sh +22 -2
  124. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/walkthrough/scripts/setup-test-repo.sh +14 -7
  125. multi_forge-0.7.0/src/forge/__init__.py +0 -3
  126. multi_forge-0.7.0/src/forge/cli/hooks/install.py +0 -236
  127. multi_forge-0.7.0/src/forge/core/transcript.py +0 -78
  128. multi_forge-0.7.0/src/forge/install/hooks.py +0 -109
  129. multi_forge-0.7.0/src/forge/sidecar/secrets.py +0 -19
  130. {multi_forge-0.7.0 → multi_forge-0.8.0}/.gitignore +0 -0
  131. {multi_forge-0.7.0 → multi_forge-0.8.0}/LICENSE +0 -0
  132. {multi_forge-0.7.0 → multi_forge-0.8.0}/NOTICE +0 -0
  133. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/agents/.gitkeep +0 -0
  134. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/commands/.gitkeep +0 -0
  135. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/backend/__init__.py +0 -0
  136. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/backend/adapters/__init__.py +0 -0
  137. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/backend/adapters/litellm.py +0 -0
  138. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/backend/creation.py +0 -0
  139. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/backend/remote/__init__.py +0 -0
  140. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/backend/remote/base.py +0 -0
  141. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/backend/remote/openrouter.py +0 -0
  142. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/backend/sources.py +0 -0
  143. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/__init__.py +0 -0
  144. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/auth.py +0 -0
  145. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/backend.py +0 -0
  146. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/config_cmd.py +0 -0
  147. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/consumer_lane_freeze.py +0 -0
  148. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/editor.py +0 -0
  149. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/hooks/_helpers.py +0 -0
  150. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/hooks/codex_patch.py +0 -0
  151. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/hooks/policy.py +0 -0
  152. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/hooks/protocols.py +0 -0
  153. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/hooks/read_hygiene.py +0 -0
  154. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/hooks/verification.py +0 -0
  155. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/memory_report.py +0 -0
  156. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/model.py +0 -0
  157. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/output.py +0 -0
  158. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/proxy.py +0 -0
  159. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/proxy_audit.py +0 -0
  160. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/proxy_costs.py +0 -0
  161. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/session_codex.py +0 -0
  162. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/session_model_pin.py +0 -0
  163. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/session_resume_modes.py +0 -0
  164. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/session_rewind.py +0 -0
  165. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/session_routing.py +0 -0
  166. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/statusline/__init__.py +0 -0
  167. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/statusline/context.py +0 -0
  168. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/statusline/palette.py +0 -0
  169. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/telemetry.py +0 -0
  170. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/trace.py +0 -0
  171. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/cli/transfer.py +0 -0
  172. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/config/__init__.py +0 -0
  173. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/config/dataclass_utils.py +0 -0
  174. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/config/defaults/__init__.py +0 -0
  175. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/config/defaults/backends/__init__.py +0 -0
  176. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/config/defaults/backends/litellm.yaml +0 -0
  177. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/config/defaults/templates/__init__.py +0 -0
  178. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/config/defaults/templates/anthropic-passthrough.yaml +0 -0
  179. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/config/defaults/templates/codex-responses-local.yaml +0 -0
  180. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/config/defaults/templates/litellm-anthropic-local.yaml +0 -0
  181. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/config/defaults/templates/litellm-anthropic.yaml +0 -0
  182. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/config/defaults/templates/litellm-gemini-flash-local.yaml +0 -0
  183. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/config/defaults/templates/litellm-gemini-local.yaml +0 -0
  184. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/config/defaults/templates/litellm-gemini-test.yaml +0 -0
  185. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/config/defaults/templates/litellm-gemini.yaml +0 -0
  186. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/config/defaults/templates/litellm-openai-codex-local.yaml +0 -0
  187. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/config/defaults/templates/litellm-openai-local.yaml +0 -0
  188. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/config/defaults/templates/litellm-openai.yaml +0 -0
  189. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/config/defaults/templates/openrouter-anthropic.yaml +0 -0
  190. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/config/defaults/templates/openrouter-deepseek.yaml +0 -0
  191. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/config/defaults/templates/openrouter-gemini-flash.yaml +0 -0
  192. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/config/defaults/templates/openrouter-gemini.yaml +0 -0
  193. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/config/defaults/templates/openrouter-glm.yaml +0 -0
  194. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/config/defaults/templates/openrouter-kimi.yaml +0 -0
  195. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/config/defaults/templates/openrouter-minimax.yaml +0 -0
  196. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/config/defaults/templates/openrouter-openai-codex.yaml +0 -0
  197. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/config/defaults/templates/openrouter-openai.yaml +0 -0
  198. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/config/defaults/templates/openrouter-qwen.yaml +0 -0
  199. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/config/schema.py +0 -0
  200. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/__init__.py +0 -0
  201. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/auth/__init__.py +0 -0
  202. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/auth/capabilities.py +0 -0
  203. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/auth/protocols.py +0 -0
  204. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/auth/secrets.py +0 -0
  205. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/backend_dependency.py +0 -0
  206. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/credential_registry.py +0 -0
  207. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/data/__init__.py +0 -0
  208. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/data/model_catalog.yaml +0 -0
  209. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/data/system_prompt_addendums/__init__.py +0 -0
  210. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/data/system_prompt_addendums/gemini.md +0 -0
  211. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/data/system_prompt_addendums/openai.md +0 -0
  212. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/effort.py +0 -0
  213. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/invoker/__init__.py +0 -0
  214. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/invoker/_lifecycle.py +0 -0
  215. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/invoker/claude.py +0 -0
  216. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/invoker/codex.py +0 -0
  217. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/invoker/codex_stream.py +0 -0
  218. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/invoker/types.py +0 -0
  219. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/lanes.py +0 -0
  220. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/llm/__init__.py +0 -0
  221. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/llm/clients/__init__.py +0 -0
  222. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/llm/clients/base.py +0 -0
  223. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/llm/clients/litellm.py +0 -0
  224. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/llm/clients/openai_compat.py +0 -0
  225. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/llm/clients/openrouter.py +0 -0
  226. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/llm/credentials.py +0 -0
  227. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/llm/errors.py +0 -0
  228. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/llm/protocols.py +0 -0
  229. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/llm/types.py +0 -0
  230. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/logging.py +0 -0
  231. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/models/__init__.py +0 -0
  232. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/models/catalog.py +0 -0
  233. {multi_forge-0.7.0/src/forge/session → multi_forge-0.8.0/src/forge/core/models}/direct_model.py +0 -0
  234. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/models/types.py +0 -0
  235. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/naming.py +0 -0
  236. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/ops/__init__.py +0 -0
  237. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/ops/backend_reconcile.py +0 -0
  238. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/ops/codex_bridge.py +0 -0
  239. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/ops/codex_interactive.py +0 -0
  240. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/ops/provider_trace.py +0 -0
  241. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/ops/proxy.py +0 -0
  242. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/ops/resolution.py +0 -0
  243. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/ops/usage_summary.py +0 -0
  244. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/process.py +0 -0
  245. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/provider_types.py +0 -0
  246. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/reactive/__init__.py +0 -0
  247. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/reactive/cost_tracking.py +0 -0
  248. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/reactive/headless_json.py +0 -0
  249. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/reactive/proxy.py +0 -0
  250. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/reactive/routing.py +0 -0
  251. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/reactive/session_runner.py +0 -0
  252. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/reactive/structured_output.py +0 -0
  253. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/reactive/tagger.py +0 -0
  254. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/reactive/throttle.py +0 -0
  255. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/run_id.py +0 -0
  256. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/runtime/__init__.py +0 -0
  257. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/runtime/codex_preflight.py +0 -0
  258. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/runtime/codex_preflight_cache.py +0 -0
  259. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/runtime/codex_rollouts.py +0 -0
  260. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/state/exceptions.py +0 -0
  261. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/state/lock.py +0 -0
  262. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/telemetry/__init__.py +0 -0
  263. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/telemetry/caps.py +0 -0
  264. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/telemetry/vocabulary.py +0 -0
  265. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/typing_helpers.py +0 -0
  266. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/usage/billing.py +0 -0
  267. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/usage/correlation.py +0 -0
  268. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/usage/emit.py +0 -0
  269. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/usage/measurement.py +0 -0
  270. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/workqueue/__init__.py +0 -0
  271. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/workqueue/queue.py +0 -0
  272. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/core/workqueue/types.py +0 -0
  273. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/install/__init__.py +0 -0
  274. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/install/cli.py +0 -0
  275. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/install/exceptions.py +0 -0
  276. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/install/version.py +0 -0
  277. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/policy/__init__.py +0 -0
  278. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/policy/deterministic/__init__.py +0 -0
  279. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/policy/deterministic/coding_standards.py +0 -0
  280. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/policy/deterministic/registry.py +0 -0
  281. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/policy/deterministic/tdd.py +0 -0
  282. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/policy/engine.py +0 -0
  283. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/policy/protocols.py +0 -0
  284. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/policy/queries.py +0 -0
  285. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/policy/semantic/__init__.py +0 -0
  286. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/policy/semantic/plan_check.py +0 -0
  287. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/policy/semantic/verdict.py +0 -0
  288. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/policy/store.py +0 -0
  289. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/policy/supervisor_lane_degrade.py +0 -0
  290. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/policy/team/__init__.py +0 -0
  291. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/policy/team/config.py +0 -0
  292. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/policy/team/handlers.py +0 -0
  293. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/policy/team/prompts.py +0 -0
  294. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/policy/types.py +0 -0
  295. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/policy/workflow/__init__.py +0 -0
  296. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/policy/workflow/branches.py +0 -0
  297. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/policy/workflow/config.py +0 -0
  298. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/policy/workflow/divergence.py +0 -0
  299. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/policy/workflow/policy.py +0 -0
  300. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/policy/workflow/stages.py +0 -0
  301. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/proxy/__init__.py +0 -0
  302. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/proxy/base_client.py +0 -0
  303. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/proxy/client_adapter.py +0 -0
  304. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/proxy/converters.py +0 -0
  305. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/proxy/cost_logger.py +0 -0
  306. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/proxy/cost_tracker.py +0 -0
  307. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/proxy/error_hints.py +0 -0
  308. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/proxy/intercept.py +0 -0
  309. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/proxy/metrics.py +0 -0
  310. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/proxy/model_spec.py +0 -0
  311. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/proxy/passthrough.py +0 -0
  312. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/proxy/provider_trace_logger.py +0 -0
  313. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/proxy/proxy_identity.py +0 -0
  314. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/proxy/proxy_startup.py +0 -0
  315. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/proxy/responses_ingress.py +0 -0
  316. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/proxy/responses_passthrough.py +0 -0
  317. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/proxy/stream_relay.py +0 -0
  318. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/review/__init__.py +0 -0
  319. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/review/adversarial.py +0 -0
  320. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/review/consensus.py +0 -0
  321. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/review/models.py +0 -0
  322. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/review/resources/__init__.py +0 -0
  323. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/review/resources/code_consensus_evaluation.md +0 -0
  324. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/review/resources/code_debate_evaluation.md +0 -0
  325. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/review/resources/codereview-performance.md +0 -0
  326. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/review/resources/codereview-quick.md +0 -0
  327. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/review/resources/codereview-security.md +0 -0
  328. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/review/resources/codereview.md +0 -0
  329. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/review/resources/consensus_evaluation.md +0 -0
  330. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/review/resources/debate_evaluation.md +0 -0
  331. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/review/resources/docreview-quick.md +0 -0
  332. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/review/resources/docreview.md +0 -0
  333. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/review/resources/thinkdeep.md +0 -0
  334. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/review/synthesis.py +0 -0
  335. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/search/engine.py +0 -0
  336. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/search/extractor.py +0 -0
  337. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/search/tokenizer.py +0 -0
  338. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/__init__.py +0 -0
  339. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/addendum.py +0 -0
  340. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/artifacts.py +0 -0
  341. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/claude/__init__.py +0 -0
  342. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/claude/cleanup.py +0 -0
  343. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/claude/invoke.py +0 -0
  344. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/claude/paths.py +0 -0
  345. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/codex_handoff.py +0 -0
  346. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/codex_invoke.py +0 -0
  347. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/config.py +0 -0
  348. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/context_limit.py +0 -0
  349. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/effective.py +0 -0
  350. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/exceptions.py +0 -0
  351. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/hooks/__init__.py +0 -0
  352. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/hooks/models.py +0 -0
  353. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/identity.py +0 -0
  354. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/launch_confirmation.py +0 -0
  355. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/memory_inheritance.py +0 -0
  356. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/overrides.py +0 -0
  357. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/passport.py +0 -0
  358. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/plan_resolution.py +0 -0
  359. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/prev_sessions.py +0 -0
  360. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/project_memory.py +0 -0
  361. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/store.py +0 -0
  362. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/validation.py +0 -0
  363. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/worktree/cleanup.py +0 -0
  364. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/session/worktree/config_copy.py +0 -0
  365. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/sidecar/container.py +0 -0
  366. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/forge/sidecar/docker.py +0 -0
  367. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/analyze/SKILL.md +0 -0
  368. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/challenge/SKILL.md +0 -0
  369. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/consensus/SKILL.md +0 -0
  370. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/consensus/resources/synthesis.md +0 -0
  371. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/debate/SKILL.md +0 -0
  372. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/panel/SKILL.md +0 -0
  373. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/panel/resources/synthesis.md +0 -0
  374. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/qa/SKILL.md +0 -0
  375. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/qa/resources/checklist/0-enable.md +0 -0
  376. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/qa/resources/checklist/1-preflight.md +0 -0
  377. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/qa/resources/checklist/10-resume.md +0 -0
  378. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/qa/resources/checklist/11-config.md +0 -0
  379. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/qa/resources/checklist/12-search.md +0 -0
  380. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/qa/resources/checklist/13-policy.md +0 -0
  381. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/qa/resources/checklist/14-workflow.md +0 -0
  382. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/qa/resources/checklist/15-skills.md +0 -0
  383. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/qa/resources/checklist/16-memory.md +0 -0
  384. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/qa/resources/checklist/19-uninstall.md +0 -0
  385. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/qa/resources/checklist/20-cleanup.md +0 -0
  386. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/qa/resources/checklist/3-authentication.md +0 -0
  387. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/qa/resources/checklist/4-proxy.md +0 -0
  388. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/qa/resources/checklist/5-session.md +0 -0
  389. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/qa/resources/checklist/7-costs.md +0 -0
  390. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/qa/resources/checklist/8-status-line.md +0 -0
  391. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/qa/resources/checklist/9-direct-commands.md +0 -0
  392. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/qa/resources/report-template.md +0 -0
  393. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/qa/scripts/start-container.sh +0 -0
  394. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/qa/scripts/walkthrough-state.py +0 -0
  395. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/review/SKILL.md +0 -0
  396. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/review/references/claude-4.6.md +0 -0
  397. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/review/references/claude-4.8.md +0 -0
  398. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/review/references/gemini-3.1.md +0 -0
  399. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/review/references/gpt-5.5.md +0 -0
  400. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/review/references/skills-writing-guide.md +0 -0
  401. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/review/resources/code-anthropic.md +0 -0
  402. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/review/resources/code-gemini.md +0 -0
  403. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/review/resources/code-openai.md +0 -0
  404. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/review/resources/code.md +0 -0
  405. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/review-docs/SKILL.md +0 -0
  406. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/review-docs/resources/docs-anthropic.md +0 -0
  407. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/review-docs/resources/docs-gemini.md +0 -0
  408. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/review-docs/resources/docs-openai.md +0 -0
  409. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/review-docs/resources/docs.md +0 -0
  410. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/smoke-test/SKILL.md +0 -0
  411. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/smoke-test/scripts/smoke-test.sh +0 -0
  412. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/understand/SKILL.md +0 -0
  413. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/understand/resources/code-anthropic.md +0 -0
  414. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/understand/resources/code-gemini.md +0 -0
  415. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/understand/resources/code-openai.md +0 -0
  416. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/understand/resources/code.md +0 -0
  417. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/understand/resources/docs-anthropic.md +0 -0
  418. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/understand/resources/docs-gemini.md +0 -0
  419. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/understand/resources/docs-openai.md +0 -0
  420. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/understand/resources/docs.md +0 -0
  421. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/walkthrough/SKILL.md +0 -0
  422. {multi_forge-0.7.0 → multi_forge-0.8.0}/src/skills/walkthrough/scripts/walkthrough-state.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: multi-forge
3
- Version: 0.7.0
3
+ Version: 0.8.0
4
4
  Summary: Multi-runtime agent toolkit: proxy routing, cost control, session management, policy enforcement, and workflow orchestration
5
5
  Project-URL: Homepage, https://github.com/hapa1i/multi-forge
6
6
  Project-URL: Repository, https://github.com/hapa1i/multi-forge
@@ -56,10 +56,10 @@ Description-Content-Type: text/markdown
56
56
  **Multi-runtime agent toolkit: proxy routing, cost control, session management, and policy enforcement for coding
57
57
  agents.**
58
58
 
59
- Forge sits between you and your coding agent (Claude Code by default, with Codex as an alternate runtime and Gemini
60
- next), adding persistent sessions, multi-provider model routing, cost visibility with spend caps, and autonomous
61
- verification. You run `forge session start` instead of `claude`; Forge then routes to your chosen model provider, tracks
62
- state across sessions, and enforces configured policies.
59
+ Forge sits between you and your coding agent (Claude Code by default, with Codex as an alternate runtime), adding
60
+ persistent sessions, multi-provider model routing, cost visibility with spend caps, and autonomous verification. You run
61
+ `forge session start` instead of `claude`; Forge then routes to your chosen model provider, tracks state across
62
+ sessions, and enforces configured policies.
63
63
 
64
64
  ```bash
65
65
  # Use Claude with session tracking (no proxy needed)
@@ -128,6 +128,8 @@ tracking, hooks, and all Forge features except multi-model routing. Use `--proxy
128
128
 
129
129
  - **Platform**: macOS or Linux
130
130
  - **Python**: 3.11–3.13 (3.14 blocked on upstream `uvloop` wheels — see #1)
131
+ - **Installer**: [`uv`](https://docs.astral.sh/uv/) or [`pipx`](https://pipx.pypa.io/) for the recommended global
132
+ install
131
133
  - **Claude Code**: installed and on PATH
132
134
  - **Provider auth**: Claude Code login is enough for direct interactive sessions. Proxies and headless workflows need a
133
135
  supported API or gateway credential such as `OPENROUTER_API_KEY`, `ANTHROPIC_API_KEY`, `GEMINI_API_KEY`,
@@ -136,14 +138,27 @@ tracking, hooks, and all Forge features except multi-model routing. Use `--proxy
136
138
  ## Quick Start
137
139
 
138
140
  ```bash
139
- # Install Forge
140
- pip install multi-forge
141
+ # Install Forge as a global tool (recommended -- puts `forge` on your PATH)
142
+ uv tool install multi-forge
143
+ # or: pipx install multi-forge
141
144
 
142
- # Or for development (editable install from local clone):
143
- git clone https://github.com/hapa1i/multi-forge.git
144
- cd multi-forge && pip install -e .
145
+ # Confirm how forge is installed and whether it is globally reachable
146
+ forge extension doctor
145
147
 
146
- # Install extensions (hooks, skills, status line) into Claude Code
148
+ # For development on Forge itself (editable install from a local clone):
149
+ git clone https://github.com/hapa1i/multi-forge.git
150
+ cd multi-forge && uv sync
151
+ # When FORGE_DEV is unset, eligible host hooks use an executable recorded or
152
+ # known-location launcher. Install the persistent editable launcher too:
153
+ ./scripts/setup.sh --local
154
+ # Make uv's tool bin available in this shell and future shells:
155
+ uv tool update-shell
156
+ export PATH="$(uv tool dir --bin):$PATH"
157
+
158
+ # Register only runtime hooks at user scope
159
+ forge extension enable --scope user --profile minimal --with hooks,codex-hooks --without commands
160
+
161
+ # Then, inside a project: install project-owned assets and settings
147
162
  forge extension enable
148
163
 
149
164
  # Launch Claude with session tracking (no proxy needed)
@@ -249,7 +264,7 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup and PR guidelines.
249
264
 
250
265
  ```bash
251
266
  forge extension disable
252
- pip uninstall multi-forge
267
+ uv tool uninstall multi-forge # or: pipx uninstall multi-forge
253
268
  ```
254
269
 
255
270
  ## License
@@ -15,10 +15,10 @@
15
15
  **Multi-runtime agent toolkit: proxy routing, cost control, session management, and policy enforcement for coding
16
16
  agents.**
17
17
 
18
- Forge sits between you and your coding agent (Claude Code by default, with Codex as an alternate runtime and Gemini
19
- next), adding persistent sessions, multi-provider model routing, cost visibility with spend caps, and autonomous
20
- verification. You run `forge session start` instead of `claude`; Forge then routes to your chosen model provider, tracks
21
- state across sessions, and enforces configured policies.
18
+ Forge sits between you and your coding agent (Claude Code by default, with Codex as an alternate runtime), adding
19
+ persistent sessions, multi-provider model routing, cost visibility with spend caps, and autonomous verification. You run
20
+ `forge session start` instead of `claude`; Forge then routes to your chosen model provider, tracks state across
21
+ sessions, and enforces configured policies.
22
22
 
23
23
  ```bash
24
24
  # Use Claude with session tracking (no proxy needed)
@@ -87,6 +87,8 @@ tracking, hooks, and all Forge features except multi-model routing. Use `--proxy
87
87
 
88
88
  - **Platform**: macOS or Linux
89
89
  - **Python**: 3.11–3.13 (3.14 blocked on upstream `uvloop` wheels — see #1)
90
+ - **Installer**: [`uv`](https://docs.astral.sh/uv/) or [`pipx`](https://pipx.pypa.io/) for the recommended global
91
+ install
90
92
  - **Claude Code**: installed and on PATH
91
93
  - **Provider auth**: Claude Code login is enough for direct interactive sessions. Proxies and headless workflows need a
92
94
  supported API or gateway credential such as `OPENROUTER_API_KEY`, `ANTHROPIC_API_KEY`, `GEMINI_API_KEY`,
@@ -95,14 +97,27 @@ tracking, hooks, and all Forge features except multi-model routing. Use `--proxy
95
97
  ## Quick Start
96
98
 
97
99
  ```bash
98
- # Install Forge
99
- pip install multi-forge
100
+ # Install Forge as a global tool (recommended -- puts `forge` on your PATH)
101
+ uv tool install multi-forge
102
+ # or: pipx install multi-forge
100
103
 
101
- # Or for development (editable install from local clone):
102
- git clone https://github.com/hapa1i/multi-forge.git
103
- cd multi-forge && pip install -e .
104
+ # Confirm how forge is installed and whether it is globally reachable
105
+ forge extension doctor
104
106
 
105
- # Install extensions (hooks, skills, status line) into Claude Code
107
+ # For development on Forge itself (editable install from a local clone):
108
+ git clone https://github.com/hapa1i/multi-forge.git
109
+ cd multi-forge && uv sync
110
+ # When FORGE_DEV is unset, eligible host hooks use an executable recorded or
111
+ # known-location launcher. Install the persistent editable launcher too:
112
+ ./scripts/setup.sh --local
113
+ # Make uv's tool bin available in this shell and future shells:
114
+ uv tool update-shell
115
+ export PATH="$(uv tool dir --bin):$PATH"
116
+
117
+ # Register only runtime hooks at user scope
118
+ forge extension enable --scope user --profile minimal --with hooks,codex-hooks --without commands
119
+
120
+ # Then, inside a project: install project-owned assets and settings
106
121
  forge extension enable
107
122
 
108
123
  # Launch Claude with session tracking (no proxy needed)
@@ -208,7 +223,7 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup and PR guidelines.
208
223
 
209
224
  ```bash
210
225
  forge extension disable
211
- pip uninstall multi-forge
226
+ uv tool uninstall multi-forge # or: pipx uninstall multi-forge
212
227
  ```
213
228
 
214
229
  ## License
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "multi-forge"
3
- version = "0.7.0"
3
+ version = "0.8.0"
4
4
  description = "Multi-runtime agent toolkit: proxy routing, cost control, session management, policy enforcement, and workflow orchestration"
5
5
  readme = "README.md"
6
6
  license = "Apache-2.0"
@@ -0,0 +1,16 @@
1
+ """Multi-Forge - Multi-runtime agent toolkit."""
2
+
3
+ import logging
4
+ from importlib.metadata import PackageNotFoundError, version
5
+
6
+ # Forge is both a library and a CLI. Keep library warnings from falling through
7
+ # Python's lastResort stderr handler when CLI file logging is disabled.
8
+ logging.getLogger(__name__).addHandler(logging.NullHandler())
9
+
10
+ try:
11
+ # Single source of truth is pyproject.toml; reading installed metadata keeps
12
+ # ``__version__`` from drifting (a hardcoded literal once shipped 0.5.0 while
13
+ # the package was 0.6.0, poisoning forge_version in manifests and work items).
14
+ __version__ = version("multi-forge")
15
+ except PackageNotFoundError: # source tree without an installed dist
16
+ __version__ = "0.0.0+unknown"
@@ -12,11 +12,10 @@ Ownership: Forge Backend Manager (`forge model backend` CLI).
12
12
 
13
13
  from __future__ import annotations
14
14
 
15
- import json
16
15
  import logging
17
16
  from dataclasses import asdict, dataclass, field
18
17
  from pathlib import Path
19
- from typing import Callable, Literal
18
+ from typing import Any, Callable, Literal, NoReturn
20
19
 
21
20
  import dacite
22
21
 
@@ -26,6 +25,7 @@ from forge.core.state import (
26
25
  StateUnreadableError,
27
26
  atomic_write_json,
28
27
  file_lock_for_target,
28
+ read_versioned_json_object,
29
29
  )
30
30
 
31
31
  logger = logging.getLogger(__name__)
@@ -99,6 +99,16 @@ def _uses_old_backend_id_process_records(data: object) -> bool:
99
99
  return any(isinstance(entry, dict) and "backend_id" in entry for entry in entries.values())
100
100
 
101
101
 
102
+ def _handle_registry_version_mismatch(path: Path, data: dict[str, Any], version: Any) -> NoReturn:
103
+ if version == 1 and _uses_old_backend_id_process_records(data):
104
+ raise BackendRegistryCorruptedError(str(path), OLD_BACKEND_ID_PROCESS_FIELD_TIP)
105
+ raise BackendRegistryCorruptedError(
106
+ str(path),
107
+ f"incompatible version {version} (this Forge expects {BACKEND_REGISTRY_VERSION}). "
108
+ f"Delete this file and retry.",
109
+ )
110
+
111
+
102
112
  class BackendRegistryStore:
103
113
  """Manage the backend registry at ~/.forge/backends/index.json.
104
114
 
@@ -121,26 +131,14 @@ class BackendRegistryStore:
121
131
  if not self.exists():
122
132
  return BackendRegistry()
123
133
 
124
- try:
125
- with open(self._registry_path, encoding="utf-8") as f:
126
- data = json.load(f)
127
- except json.JSONDecodeError as e:
128
- raise BackendRegistryCorruptedError(str(self._registry_path), f"invalid JSON: {e}")
129
- except OSError as e:
130
- # A failed read is environmental, not corruption -- forge clean must not delete it.
131
- raise BackendRegistryUnreadableError(str(self._registry_path), f"read error: {e}")
132
-
133
- version = data.get("version")
134
- if version is None:
135
- raise BackendRegistryCorruptedError(str(self._registry_path), "missing version field")
136
- if version != BACKEND_REGISTRY_VERSION:
137
- if version == 1 and _uses_old_backend_id_process_records(data):
138
- raise BackendRegistryCorruptedError(str(self._registry_path), OLD_BACKEND_ID_PROCESS_FIELD_TIP)
139
- raise BackendRegistryCorruptedError(
140
- str(self._registry_path),
141
- f"incompatible version {version} (this Forge expects {BACKEND_REGISTRY_VERSION}). "
142
- f"Delete this file and retry.",
143
- )
134
+ data = read_versioned_json_object(
135
+ self._registry_path,
136
+ version_key="version",
137
+ expected_version=BACKEND_REGISTRY_VERSION,
138
+ corrupted_error=BackendRegistryCorruptedError,
139
+ unreadable_error=BackendRegistryUnreadableError,
140
+ on_version_mismatch=_handle_registry_version_mismatch,
141
+ )
144
142
 
145
143
  try:
146
144
  return dacite.from_dict(
@@ -54,7 +54,7 @@ def activity_cmd(session: str | None, as_json: bool, period: str) -> None:
54
54
 
55
55
  \b
56
56
  Examples:
57
- forge telemetry activity # current session ($FORGE_SESSION)
57
+ forge telemetry activity # current session
58
58
  forge telemetry activity planner # a named session (or Claude UUID)
59
59
  forge telemetry activity --period week # this week
60
60
  forge telemetry activity --period all --json
@@ -18,6 +18,10 @@ import httpx
18
18
  from rich.console import Console
19
19
 
20
20
  from forge.cli.output import err_console, print_error, print_error_with_tip
21
+ from forge.core.models.direct_model import (
22
+ apply_direct_model_env,
23
+ apply_proxy_context_model_defaults,
24
+ )
21
25
  from forge.core.paths import display_path
22
26
  from forge.core.reactive.env import FORGE_PROXY_WIRE_SHAPE_VAR, resolve_proxy_wire_shape
23
27
  from forge.proxy.proxies import (
@@ -25,10 +29,6 @@ from forge.proxy.proxies import (
25
29
  ProxyResolutionError,
26
30
  )
27
31
  from forge.session.context_limit import _get_context_limit_for_proxy
28
- from forge.session.direct_model import (
29
- apply_direct_model_env,
30
- apply_proxy_context_model_defaults,
31
- )
32
32
 
33
33
  console = Console()
34
34
 
@@ -151,7 +151,7 @@ def start_cmd(
151
151
  ) -> None:
152
152
  """Start Claude Code with proxy routing or direct to Anthropic.
153
153
 
154
- Bare launcher: no session state, no FORGE_SESSION. Use
154
+ Bare launcher: no session state (not a managed session). Use
155
155
  ``forge session start`` for managed sessions with lifecycle tracking.
156
156
 
157
157
  \b
@@ -308,7 +308,7 @@ def preset_show(raw: bool = False, as_json: bool = False) -> None:
308
308
  return
309
309
 
310
310
  if raw:
311
- console.print(content, end="")
311
+ click.echo(content, nl=False)
312
312
  else:
313
313
  console.print("[bold]Claude Code Settings Preset[/bold]")
314
314
  console.print(f"[bold]Path:[/bold] {display_path(preset_path)}")
@@ -29,6 +29,10 @@ from forge.core.paths import display_path
29
29
  from forge.core.runtime import get_runtime
30
30
  from forge.core.runtime.codex_preflight import codex_proxy_contract_blocker
31
31
  from forge.install.codex_hooks import (
32
+ CodexRegistrationKey,
33
+ codex_expected_registration_keys,
34
+ codex_registration_key,
35
+ codex_registration_keys,
32
36
  codex_registration_pairs,
33
37
  get_builtin_codex_entries,
34
38
  get_codex_config_path,
@@ -108,23 +112,24 @@ def _runtime_info() -> _RuntimeInfo:
108
112
 
109
113
 
110
114
  def _enrollment_posture(
111
- expected: set[tuple[str, str]],
112
- actual: set[tuple[str, str]],
113
- commands_registered: tuple[str, ...],
115
+ expected: set[CodexRegistrationKey],
116
+ actual: set[CodexRegistrationKey],
114
117
  ) -> str:
115
118
  """Classify static registration as yes/no/partial/wrong-event (no probe).
116
119
 
117
- `expected` is the builtin (event, command) set; `actual` is the event-aware
118
- set really in the config; `commands_registered` is the event-agnostic set of
119
- our commands found anywhere. A command present by name but not under its
120
- expected event is `wrong-event` (not merely missing).
120
+ `expected` is the builtin logical (event, command identity) set; `actual`
121
+ is the event-aware logical set really in the config. A command identity
122
+ present under the wrong event is `wrong-event` (not merely missing).
121
123
  """
122
124
  if expected <= actual:
123
125
  return "yes"
124
- present_cmds = set(commands_registered)
125
- if not present_cmds:
126
+ expected_event_by_identity = {(kind, value): event for event, kind, value in expected}
127
+ matching_actual = [
128
+ (event, kind, value) for event, kind, value in actual if (kind, value) in expected_event_by_identity
129
+ ]
130
+ if not matching_actual:
126
131
  return "no"
127
- wrong_event = any((ev, cmd) not in actual and cmd in present_cmds for ev, cmd in expected)
132
+ wrong_event = any(event != expected_event_by_identity[(kind, value)] for event, kind, value in matching_actual)
128
133
  return "wrong-event" if wrong_event else "partial"
129
134
 
130
135
 
@@ -177,9 +182,9 @@ def _scope_status(scope: InstallScope, project_root: Path | None, tracking: Trac
177
182
  config_path = get_codex_config_path(scope, project_root)
178
183
  entries = get_builtin_codex_entries()
179
184
  registration = read_codex_registration(config_path, entries)
180
- actual = codex_registration_pairs(config_path)
181
- expected = {(e.event, e.command) for e in entries}
182
- forge_commands = {e.command for e in entries}
185
+ actual_pairs = codex_registration_pairs(config_path)
186
+ actual_keys = codex_registration_keys(config_path)
187
+ expected_keys = codex_expected_registration_keys(entries)
183
188
 
184
189
  tracked_path: str | None = None
185
190
  tracked_commands: list[str] = []
@@ -195,9 +200,11 @@ def _scope_status(scope: InstallScope, project_root: Path | None, tracking: Trac
195
200
  config_path=display_path(config_path),
196
201
  config_exists=config_path.exists(),
197
202
  block_present=registration.block_present,
198
- registered=_enrollment_posture(expected, actual, registration.commands_registered),
203
+ registered=_enrollment_posture(expected_keys, actual_keys),
199
204
  # Forge footprint only: unrelated user hooks in the same config are not ours to report.
200
- registered_pairs=sorted(f"{ev} -> {cmd}" for ev, cmd in actual if cmd in forge_commands),
205
+ registered_pairs=sorted(
206
+ f"{ev} -> {cmd}" for ev, cmd in actual_pairs if codex_registration_key(ev, cmd) in expected_keys
207
+ ),
201
208
  commands_registered=list(registration.commands_registered),
202
209
  tracked_config_path=display_path(tracked_path) if tracked_path else None,
203
210
  tracked_commands=tracked_commands,
@@ -376,7 +383,9 @@ def start_cmd(proxy: str, sandbox: str, codex_args: tuple[str, ...]) -> None:
376
383
  # wire_shape is "openai_responses_passthrough" on success (uninformative); the
377
384
  # failure path names the actual shape via the exception instead.
378
385
  default_model, _ = assert_proxy_responses_capable(
379
- entry.base_url, expected_proxy_id=entry.proxy_id, expected_template=entry.template
386
+ entry.base_url,
387
+ expected_proxy_id=entry.proxy_id,
388
+ expected_template=entry.template,
380
389
  )
381
390
  except ProxyUnreachableError as e:
382
391
  print_error_with_tip(