multi-forge 0.7.1__tar.gz → 0.8.1__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 (421) hide show
  1. {multi_forge-0.7.1 → multi_forge-0.8.1}/PKG-INFO +23 -8
  2. {multi_forge-0.7.1 → multi_forge-0.8.1}/README.md +22 -7
  3. {multi_forge-0.7.1 → multi_forge-0.8.1}/pyproject.toml +1 -1
  4. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/__init__.py +5 -0
  5. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/activity.py +1 -1
  6. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/claude.py +6 -6
  7. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/codex.py +25 -16
  8. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/extensions.py +428 -26
  9. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/gc.py +46 -5
  10. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/guards.py +20 -0
  11. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/hooks/__init__.py +0 -8
  12. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/hooks/_group.py +3 -3
  13. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/hooks/codex_transfer.py +5 -0
  14. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/hooks/commands.py +128 -18
  15. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/hooks/direct_commands.py +42 -3
  16. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/hooks/policy.py +2 -2
  17. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/main.py +36 -3
  18. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/memory.py +189 -51
  19. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/memory_writer.py +19 -0
  20. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/policy.py +35 -7
  21. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/search.py +51 -3
  22. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/session.py +8 -0
  23. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/session_fork.py +34 -4
  24. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/session_lane.py +35 -7
  25. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/session_lifecycle.py +30 -18
  26. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/session_manage.py +111 -12
  27. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/session_memory.py +10 -8
  28. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/status_line.py +65 -30
  29. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/statusline/names.py +1 -0
  30. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/statusline/registry.py +15 -0
  31. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/workflow.py +11 -2
  32. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/auth/template_secrets.py +2 -2
  33. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/llm/__init__.py +3 -2
  34. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/llm/clients/__init__.py +1 -0
  35. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/llm/detection.py +4 -1
  36. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/ops/claude_session.py +47 -7
  37. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/ops/codex_enrollment.py +6 -5
  38. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/ops/context.py +3 -19
  39. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/ops/gc.py +249 -10
  40. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/ops/session.py +21 -2
  41. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/ops/session_context.py +1 -1
  42. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/ops/transfer.py +15 -0
  43. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/paths.py +17 -0
  44. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/reactive/env.py +3 -0
  45. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/state/io.py +28 -3
  46. multi_forge-0.8.1/src/forge/core/tiers.py +18 -0
  47. multi_forge-0.8.1/src/forge/core/transcript.py +169 -0
  48. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/install/codex_hooks.py +155 -48
  49. multi_forge-0.8.1/src/forge/install/doctor.py +270 -0
  50. multi_forge-0.8.1/src/forge/install/hook_dispatcher.py +780 -0
  51. multi_forge-0.8.1/src/forge/install/hook_migration.py +982 -0
  52. multi_forge-0.8.1/src/forge/install/hooks.py +431 -0
  53. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/install/installer.py +128 -33
  54. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/install/models.py +4 -1
  55. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/install/preset.py +46 -19
  56. multi_forge-0.8.1/src/forge/install/project_compat.py +363 -0
  57. multi_forge-0.8.1/src/forge/install/project_registry.py +329 -0
  58. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/install/settings_merge.py +3 -1
  59. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/policy/semantic/supervisor.py +11 -12
  60. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/proxy/client_factory.py +2 -12
  61. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/proxy/data_models.py +8 -34
  62. multi_forge-0.8.1/src/forge/proxy/ports.py +27 -0
  63. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/proxy/proxy_orchestrator.py +14 -13
  64. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/proxy/server.py +78 -131
  65. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/review/engine.py +1 -1
  66. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/review/routing.py +28 -9
  67. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/cleanup.py +33 -4
  68. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/consumer_lanes.py +11 -8
  69. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/hooks/session_start.py +8 -0
  70. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/launch.py +11 -2
  71. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/manager.py +60 -3
  72. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/memory_writer.py +16 -16
  73. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/model_pin.py +1 -1
  74. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/overrides.py +3 -2
  75. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/passport.py +232 -16
  76. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/project_memory.py +15 -2
  77. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/rewind.py +10 -8
  78. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/store.py +2 -1
  79. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/transfer.py +11 -94
  80. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/worktree/__init__.py +4 -0
  81. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/worktree/create.py +92 -2
  82. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/sidecar/__init__.py +1 -1
  83. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/qa/resources/checklist/16-memory.md +81 -2
  84. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/qa/resources/checklist/18-disable.md +0 -3
  85. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/qa/resources/checklist/2-extension.md +43 -9
  86. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/qa/resources/checklist/6-hook.md +7 -11
  87. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/qa/resources/checklist.md +16 -10
  88. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/walkthrough/resources/checklist.md +134 -11
  89. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/walkthrough/scripts/run-in-repo.sh +22 -2
  90. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/walkthrough/scripts/setup-test-repo.sh +14 -7
  91. multi_forge-0.7.1/src/forge/cli/hooks/install.py +0 -236
  92. multi_forge-0.7.1/src/forge/core/transcript.py +0 -78
  93. multi_forge-0.7.1/src/forge/install/hooks.py +0 -109
  94. multi_forge-0.7.1/src/forge/sidecar/secrets.py +0 -19
  95. {multi_forge-0.7.1 → multi_forge-0.8.1}/.gitignore +0 -0
  96. {multi_forge-0.7.1 → multi_forge-0.8.1}/LICENSE +0 -0
  97. {multi_forge-0.7.1 → multi_forge-0.8.1}/NOTICE +0 -0
  98. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/agents/.gitkeep +0 -0
  99. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/commands/.gitkeep +0 -0
  100. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/backend/__init__.py +0 -0
  101. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/backend/adapters/__init__.py +0 -0
  102. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/backend/adapters/litellm.py +0 -0
  103. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/backend/creation.py +0 -0
  104. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/backend/registry.py +0 -0
  105. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/backend/remote/__init__.py +0 -0
  106. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/backend/remote/base.py +0 -0
  107. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/backend/remote/openrouter.py +0 -0
  108. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/backend/sources.py +0 -0
  109. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/__init__.py +0 -0
  110. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/auth.py +0 -0
  111. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/backend.py +0 -0
  112. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/config_cmd.py +0 -0
  113. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/consumer_lane_freeze.py +0 -0
  114. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/editor.py +0 -0
  115. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/hooks/_helpers.py +0 -0
  116. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/hooks/codex_patch.py +0 -0
  117. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/hooks/codex_policy.py +0 -0
  118. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/hooks/protocols.py +0 -0
  119. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/hooks/read_hygiene.py +0 -0
  120. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/hooks/verification.py +0 -0
  121. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/logs.py +0 -0
  122. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/memory_report.py +0 -0
  123. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/model.py +0 -0
  124. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/output.py +0 -0
  125. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/proxy.py +0 -0
  126. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/proxy_audit.py +0 -0
  127. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/proxy_costs.py +0 -0
  128. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/runtime.py +0 -0
  129. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/session_codex.py +0 -0
  130. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/session_model_pin.py +0 -0
  131. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/session_resume_modes.py +0 -0
  132. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/session_rewind.py +0 -0
  133. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/session_routing.py +0 -0
  134. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/session_supervisor_options.py +0 -0
  135. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/statusline/__init__.py +0 -0
  136. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/statusline/context.py +0 -0
  137. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/statusline/palette.py +0 -0
  138. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/statusline/throttle.py +0 -0
  139. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/telemetry.py +0 -0
  140. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/trace.py +0 -0
  141. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/cli/transfer.py +0 -0
  142. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/config/__init__.py +0 -0
  143. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/config/dataclass_utils.py +0 -0
  144. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/config/defaults/__init__.py +0 -0
  145. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/config/defaults/backends/__init__.py +0 -0
  146. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/config/defaults/backends/litellm.yaml +0 -0
  147. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/config/defaults/templates/__init__.py +0 -0
  148. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/config/defaults/templates/anthropic-passthrough.yaml +0 -0
  149. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/config/defaults/templates/codex-responses-local.yaml +0 -0
  150. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/config/defaults/templates/litellm-anthropic-local.yaml +0 -0
  151. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/config/defaults/templates/litellm-anthropic.yaml +0 -0
  152. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/config/defaults/templates/litellm-gemini-flash-local.yaml +0 -0
  153. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/config/defaults/templates/litellm-gemini-local.yaml +0 -0
  154. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/config/defaults/templates/litellm-gemini-test.yaml +0 -0
  155. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/config/defaults/templates/litellm-gemini.yaml +0 -0
  156. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/config/defaults/templates/litellm-openai-codex-local.yaml +0 -0
  157. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/config/defaults/templates/litellm-openai-local.yaml +0 -0
  158. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/config/defaults/templates/litellm-openai.yaml +0 -0
  159. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/config/defaults/templates/openrouter-anthropic.yaml +0 -0
  160. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/config/defaults/templates/openrouter-deepseek.yaml +0 -0
  161. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/config/defaults/templates/openrouter-gemini-flash.yaml +0 -0
  162. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/config/defaults/templates/openrouter-gemini.yaml +0 -0
  163. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/config/defaults/templates/openrouter-glm.yaml +0 -0
  164. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/config/defaults/templates/openrouter-kimi.yaml +0 -0
  165. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/config/defaults/templates/openrouter-minimax.yaml +0 -0
  166. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/config/defaults/templates/openrouter-openai-codex.yaml +0 -0
  167. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/config/defaults/templates/openrouter-openai.yaml +0 -0
  168. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/config/defaults/templates/openrouter-qwen.yaml +0 -0
  169. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/config/loader.py +0 -0
  170. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/config/schema.py +0 -0
  171. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/__init__.py +0 -0
  172. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/auth/__init__.py +0 -0
  173. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/auth/capabilities.py +0 -0
  174. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/auth/credentials_file.py +0 -0
  175. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/auth/protocols.py +0 -0
  176. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/auth/secrets.py +0 -0
  177. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/backend_dependency.py +0 -0
  178. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/credential_registry.py +0 -0
  179. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/data/__init__.py +0 -0
  180. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/data/model_catalog.yaml +0 -0
  181. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/data/system_prompt_addendums/__init__.py +0 -0
  182. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/data/system_prompt_addendums/gemini.md +0 -0
  183. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/data/system_prompt_addendums/openai.md +0 -0
  184. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/effort.py +0 -0
  185. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/invoker/__init__.py +0 -0
  186. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/invoker/_lifecycle.py +0 -0
  187. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/invoker/claude.py +0 -0
  188. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/invoker/codex.py +0 -0
  189. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/invoker/codex_stream.py +0 -0
  190. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/invoker/types.py +0 -0
  191. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/lanes.py +0 -0
  192. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/llm/clients/base.py +0 -0
  193. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/llm/clients/litellm.py +0 -0
  194. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/llm/clients/openai_compat.py +0 -0
  195. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/llm/clients/openrouter.py +0 -0
  196. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/llm/credentials.py +0 -0
  197. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/llm/errors.py +0 -0
  198. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/llm/protocols.py +0 -0
  199. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/llm/types.py +0 -0
  200. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/logging.py +0 -0
  201. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/models/__init__.py +0 -0
  202. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/models/catalog.py +0 -0
  203. {multi_forge-0.7.1/src/forge/session → multi_forge-0.8.1/src/forge/core/models}/direct_model.py +0 -0
  204. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/models/types.py +0 -0
  205. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/naming.py +0 -0
  206. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/ops/__init__.py +0 -0
  207. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/ops/backend_reconcile.py +0 -0
  208. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/ops/codex_bridge.py +0 -0
  209. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/ops/codex_interactive.py +0 -0
  210. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/ops/codex_session.py +0 -0
  211. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/ops/policy.py +0 -0
  212. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/ops/provider_trace.py +0 -0
  213. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/ops/proxy.py +0 -0
  214. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/ops/resolution.py +0 -0
  215. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/ops/usage_summary.py +0 -0
  216. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/process.py +0 -0
  217. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/provider_types.py +0 -0
  218. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/reactive/__init__.py +0 -0
  219. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/reactive/cost_tracking.py +0 -0
  220. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/reactive/headless_json.py +0 -0
  221. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/reactive/proxy.py +0 -0
  222. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/reactive/routing.py +0 -0
  223. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/reactive/session_runner.py +0 -0
  224. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/reactive/structured_output.py +0 -0
  225. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/reactive/tagger.py +0 -0
  226. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/reactive/throttle.py +0 -0
  227. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/run_id.py +0 -0
  228. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/runtime/__init__.py +0 -0
  229. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/runtime/codex_preflight.py +0 -0
  230. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/runtime/codex_preflight_cache.py +0 -0
  231. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/runtime/codex_rollouts.py +0 -0
  232. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/runtime/registry.py +0 -0
  233. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/runtime_vocab.py +0 -0
  234. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/state/__init__.py +0 -0
  235. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/state/exceptions.py +0 -0
  236. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/state/lock.py +0 -0
  237. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/state/retention.py +0 -0
  238. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/state/timestamps.py +0 -0
  239. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/state/versioned_store.py +0 -0
  240. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/telemetry/__init__.py +0 -0
  241. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/telemetry/caps.py +0 -0
  242. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/telemetry/downstream.py +0 -0
  243. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/telemetry/jsonl_io.py +0 -0
  244. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/telemetry/upstream.py +0 -0
  245. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/telemetry/vocabulary.py +0 -0
  246. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/typing_helpers.py +0 -0
  247. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/usage/__init__.py +0 -0
  248. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/usage/billing.py +0 -0
  249. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/usage/correlation.py +0 -0
  250. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/usage/emit.py +0 -0
  251. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/usage/ledger.py +0 -0
  252. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/usage/measurement.py +0 -0
  253. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/usage/vocabulary.py +0 -0
  254. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/workqueue/__init__.py +0 -0
  255. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/workqueue/queue.py +0 -0
  256. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/core/workqueue/types.py +0 -0
  257. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/install/__init__.py +0 -0
  258. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/install/cli.py +0 -0
  259. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/install/exceptions.py +0 -0
  260. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/install/tracking.py +0 -0
  261. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/install/version.py +0 -0
  262. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/policy/__init__.py +0 -0
  263. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/policy/deterministic/__init__.py +0 -0
  264. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/policy/deterministic/base.py +0 -0
  265. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/policy/deterministic/coding_standards.py +0 -0
  266. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/policy/deterministic/registry.py +0 -0
  267. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/policy/deterministic/tdd.py +0 -0
  268. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/policy/engine.py +0 -0
  269. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/policy/protocols.py +0 -0
  270. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/policy/queries.py +0 -0
  271. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/policy/semantic/__init__.py +0 -0
  272. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/policy/semantic/plan_check.py +0 -0
  273. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/policy/semantic/shadow.py +0 -0
  274. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/policy/semantic/shadow_runner.py +0 -0
  275. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/policy/semantic/verdict.py +0 -0
  276. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/policy/store.py +0 -0
  277. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/policy/supervisor_lane_degrade.py +0 -0
  278. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/policy/team/__init__.py +0 -0
  279. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/policy/team/config.py +0 -0
  280. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/policy/team/handlers.py +0 -0
  281. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/policy/team/prompts.py +0 -0
  282. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/policy/types.py +0 -0
  283. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/policy/workflow/__init__.py +0 -0
  284. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/policy/workflow/branches.py +0 -0
  285. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/policy/workflow/config.py +0 -0
  286. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/policy/workflow/divergence.py +0 -0
  287. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/policy/workflow/policy.py +0 -0
  288. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/policy/workflow/stages.py +0 -0
  289. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/proxy/__init__.py +0 -0
  290. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/proxy/audit_logger.py +0 -0
  291. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/proxy/base_client.py +0 -0
  292. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/proxy/client_adapter.py +0 -0
  293. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/proxy/converters.py +0 -0
  294. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/proxy/cost_logger.py +0 -0
  295. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/proxy/cost_tracker.py +0 -0
  296. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/proxy/error_hints.py +0 -0
  297. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/proxy/intercept.py +0 -0
  298. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/proxy/metrics.py +0 -0
  299. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/proxy/model_spec.py +0 -0
  300. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/proxy/passthrough.py +0 -0
  301. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/proxy/provider_trace_logger.py +0 -0
  302. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/proxy/proxies.py +0 -0
  303. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/proxy/proxy_identity.py +0 -0
  304. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/proxy/proxy_startup.py +0 -0
  305. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/proxy/responses_ingress.py +0 -0
  306. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/proxy/responses_passthrough.py +0 -0
  307. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/proxy/stream_relay.py +0 -0
  308. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/proxy/utils.py +0 -0
  309. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/review/__init__.py +0 -0
  310. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/review/adversarial.py +0 -0
  311. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/review/consensus.py +0 -0
  312. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/review/models.py +0 -0
  313. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/review/resources/__init__.py +0 -0
  314. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/review/resources/code_consensus_evaluation.md +0 -0
  315. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/review/resources/code_debate_evaluation.md +0 -0
  316. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/review/resources/codereview-performance.md +0 -0
  317. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/review/resources/codereview-quick.md +0 -0
  318. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/review/resources/codereview-security.md +0 -0
  319. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/review/resources/codereview.md +0 -0
  320. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/review/resources/consensus_evaluation.md +0 -0
  321. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/review/resources/debate_evaluation.md +0 -0
  322. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/review/resources/docreview-quick.md +0 -0
  323. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/review/resources/docreview.md +0 -0
  324. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/review/resources/thinkdeep.md +0 -0
  325. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/review/synthesis.py +0 -0
  326. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/runtime_config.py +0 -0
  327. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/search/__init__.py +0 -0
  328. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/search/bm25_store.py +0 -0
  329. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/search/content_store.py +0 -0
  330. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/search/engine.py +0 -0
  331. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/search/exceptions.py +0 -0
  332. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/search/extractor.py +0 -0
  333. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/search/index_state.py +0 -0
  334. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/search/store.py +0 -0
  335. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/search/tokenizer.py +0 -0
  336. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/__init__.py +0 -0
  337. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/active.py +0 -0
  338. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/addendum.py +0 -0
  339. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/artifacts.py +0 -0
  340. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/claude/__init__.py +0 -0
  341. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/claude/cleanup.py +0 -0
  342. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/claude/invoke.py +0 -0
  343. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/claude/paths.py +0 -0
  344. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/claude/relocate.py +0 -0
  345. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/codex_handoff.py +0 -0
  346. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/codex_invoke.py +0 -0
  347. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/config.py +0 -0
  348. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/context_limit.py +0 -0
  349. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/effective.py +0 -0
  350. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/exceptions.py +0 -0
  351. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/hooks/__init__.py +0 -0
  352. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/hooks/models.py +0 -0
  353. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/identity.py +0 -0
  354. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/index.py +0 -0
  355. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/launch_confirmation.py +0 -0
  356. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/memory_inheritance.py +0 -0
  357. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/models.py +0 -0
  358. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/plan_resolution.py +0 -0
  359. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/prev_sessions.py +0 -0
  360. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/shadow_curation.py +0 -0
  361. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/validation.py +0 -0
  362. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/worktree/cleanup.py +0 -0
  363. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/session/worktree/config_copy.py +0 -0
  364. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/sidecar/container.py +0 -0
  365. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/forge/sidecar/docker.py +0 -0
  366. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/analyze/SKILL.md +0 -0
  367. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/challenge/SKILL.md +0 -0
  368. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/consensus/SKILL.md +0 -0
  369. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/consensus/resources/synthesis.md +0 -0
  370. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/debate/SKILL.md +0 -0
  371. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/panel/SKILL.md +0 -0
  372. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/panel/resources/synthesis.md +0 -0
  373. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/qa/SKILL.md +0 -0
  374. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/qa/resources/checklist/0-enable.md +0 -0
  375. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/qa/resources/checklist/1-preflight.md +0 -0
  376. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/qa/resources/checklist/10-resume.md +0 -0
  377. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/qa/resources/checklist/11-config.md +0 -0
  378. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/qa/resources/checklist/12-search.md +0 -0
  379. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/qa/resources/checklist/13-policy.md +0 -0
  380. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/qa/resources/checklist/14-workflow.md +0 -0
  381. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/qa/resources/checklist/15-skills.md +0 -0
  382. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/qa/resources/checklist/17-info.md +0 -0
  383. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/qa/resources/checklist/19-uninstall.md +0 -0
  384. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/qa/resources/checklist/20-cleanup.md +0 -0
  385. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/qa/resources/checklist/3-authentication.md +0 -0
  386. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/qa/resources/checklist/4-proxy.md +0 -0
  387. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/qa/resources/checklist/5-session.md +0 -0
  388. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/qa/resources/checklist/7-costs.md +0 -0
  389. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/qa/resources/checklist/8-status-line.md +0 -0
  390. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/qa/resources/checklist/9-direct-commands.md +0 -0
  391. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/qa/resources/report-template.md +0 -0
  392. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/qa/scripts/start-container.sh +0 -0
  393. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/qa/scripts/walkthrough-state.py +0 -0
  394. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/review/SKILL.md +0 -0
  395. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/review/references/claude-4.6.md +0 -0
  396. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/review/references/claude-4.8.md +0 -0
  397. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/review/references/gemini-3.1.md +0 -0
  398. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/review/references/gpt-5.5.md +0 -0
  399. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/review/references/skills-writing-guide.md +0 -0
  400. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/review/resources/code-anthropic.md +0 -0
  401. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/review/resources/code-gemini.md +0 -0
  402. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/review/resources/code-openai.md +0 -0
  403. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/review/resources/code.md +0 -0
  404. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/review-docs/SKILL.md +0 -0
  405. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/review-docs/resources/docs-anthropic.md +0 -0
  406. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/review-docs/resources/docs-gemini.md +0 -0
  407. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/review-docs/resources/docs-openai.md +0 -0
  408. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/review-docs/resources/docs.md +0 -0
  409. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/smoke-test/SKILL.md +0 -0
  410. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/smoke-test/scripts/smoke-test.sh +0 -0
  411. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/understand/SKILL.md +0 -0
  412. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/understand/resources/code-anthropic.md +0 -0
  413. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/understand/resources/code-gemini.md +0 -0
  414. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/understand/resources/code-openai.md +0 -0
  415. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/understand/resources/code.md +0 -0
  416. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/understand/resources/docs-anthropic.md +0 -0
  417. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/understand/resources/docs-gemini.md +0 -0
  418. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/understand/resources/docs-openai.md +0 -0
  419. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/understand/resources/docs.md +0 -0
  420. {multi_forge-0.7.1 → multi_forge-0.8.1}/src/skills/walkthrough/SKILL.md +0 -0
  421. {multi_forge-0.7.1 → multi_forge-0.8.1}/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.1
3
+ Version: 0.8.1
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
@@ -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
@@ -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.1"
3
+ version = "0.8.1"
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"
@@ -1,7 +1,12 @@
1
1
  """Multi-Forge - Multi-runtime agent toolkit."""
2
2
 
3
+ import logging
3
4
  from importlib.metadata import PackageNotFoundError, version
4
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
+
5
10
  try:
6
11
  # Single source of truth is pyproject.toml; reading installed metadata keeps
7
12
  # ``__version__`` from drifting (a hardcoded literal once shipped 0.5.0 while
@@ -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(