raise-cli 3.0.0a4__tar.gz → 3.0.0a5__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 (455) hide show
  1. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/.gitignore +13 -0
  2. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/PKG-INFO +4 -4
  3. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/pyproject.toml +20 -9
  4. raise_cli-3.0.0a5/src/raise_cli/_agent_session.py +139 -0
  5. raise_cli-3.0.0a5/src/raise_cli/_cc_session.py +8 -0
  6. raise_cli-3.0.0a5/src/raise_cli/adapters/backlog_config.py +190 -0
  7. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/adapters/composite_docs.py +30 -1
  8. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/adapters/composite_pm.py +148 -23
  9. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/adapters/confluence_adapter.py +30 -1
  10. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/adapters/confluence_client.py +43 -1
  11. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/adapters/declarative/adapter.py +64 -4
  12. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/adapters/filesystem.py +94 -27
  13. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/adapters/filesystem_docs.py +32 -1
  14. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/adapters/filesystem_models.py +1 -0
  15. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/adapters/jira_adapter.py +207 -92
  16. raise_cli-3.0.0a5/src/raise_cli/adapters/jira_adf.py +397 -0
  17. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/adapters/jira_client.py +162 -15
  18. raise_cli-3.0.0a5/src/raise_cli/adapters/jira_config.py +13 -0
  19. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/adapters/jira_config_gen.py +18 -21
  20. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/adapters/ledger_aware.py +41 -4
  21. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/adapters/models/__init__.py +12 -0
  22. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/adapters/models/docs.py +7 -0
  23. raise_cli-3.0.0a5/src/raise_cli/adapters/models/pm.py +316 -0
  24. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/adapters/pending_ops.py +19 -1
  25. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/adapters/protocols.py +88 -7
  26. raise_cli-3.0.0a5/src/raise_cli/adapters/resolve.py +215 -0
  27. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/adapters/sync.py +66 -4
  28. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/agents/claude.yaml +2 -1
  29. raise_cli-3.0.0a5/src/raise_cli/agents/codex.yaml +10 -0
  30. raise_cli-3.0.0a5/src/raise_cli/agents/codex_plugin.py +207 -0
  31. raise_cli-3.0.0a5/src/raise_cli/agents/hermes.yaml +8 -0
  32. raise_cli-3.0.0a5/src/raise_cli/backlog/ledger.py +294 -0
  33. raise_cli-3.0.0a5/src/raise_cli/cli/commands/_resolve.py +228 -0
  34. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/cli/commands/adapter_setup.py +2 -2
  35. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/cli/commands/backlog.py +421 -5
  36. raise_cli-3.0.0a5/src/raise_cli/cli/commands/db.py +144 -0
  37. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/cli/commands/discover.py +250 -0
  38. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/cli/commands/docs.py +54 -0
  39. raise_cli-3.0.0a5/src/raise_cli/cli/commands/drift.py +424 -0
  40. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/cli/commands/gate.py +49 -14
  41. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/cli/commands/graph.py +183 -5
  42. raise_cli-3.0.0a5/src/raise_cli/cli/commands/hud.py +21 -0
  43. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/cli/commands/init.py +79 -4
  44. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/cli/commands/journal.py +12 -18
  45. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/cli/commands/memory.py +84 -0
  46. raise_cli-3.0.0a5/src/raise_cli/cli/commands/mission.py +345 -0
  47. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/cli/commands/pattern.py +20 -0
  48. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/cli/commands/session.py +244 -11
  49. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/cli/commands/signal.py +270 -42
  50. raise_cli-3.0.0a5/src/raise_cli/cli/commands/telemetry.py +120 -0
  51. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/cli/extensions.py +0 -1
  52. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/cli/main.py +10 -4
  53. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/config/agent_registry.py +12 -9
  54. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/config/agents.py +25 -3
  55. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/config/paths.py +84 -0
  56. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/config/settings.py +16 -8
  57. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/context/builder.py +35 -9
  58. raise_cli-3.0.0a5/src/raise_cli/context/loaders/missions.py +71 -0
  59. raise_cli-3.0.0a5/src/raise_cli/context/loaders/symbols.py +467 -0
  60. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/discovery/__init__.py +48 -0
  61. raise_cli-3.0.0a5/src/raise_cli/discovery/check.py +340 -0
  62. raise_cli-3.0.0a5/src/raise_cli/discovery/clone.py +280 -0
  63. raise_cli-3.0.0a5/src/raise_cli/discovery/corpus.py +198 -0
  64. raise_cli-3.0.0a5/src/raise_cli/discovery/metric.py +304 -0
  65. raise_cli-3.0.0a5/src/raise_cli/discovery/sast.py +306 -0
  66. raise_cli-3.0.0a5/src/raise_cli/discovery/temporal.py +391 -0
  67. raise_cli-3.0.0a5/src/raise_cli/discovery/thresholds.py +272 -0
  68. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/doctor/checks/adapters.py +7 -7
  69. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/doctor/checks/project.py +43 -0
  70. raise_cli-3.0.0a5/src/raise_cli/doctor/checks/runtimes.py +69 -0
  71. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/doctor/runner.py +1 -0
  72. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/exceptions.py +16 -0
  73. raise_cli-3.0.0a5/src/raise_cli/gates/ar/__init__.py +6 -0
  74. raise_cli-3.0.0a5/src/raise_cli/gates/ar/bugfix_gate.py +21 -0
  75. raise_cli-3.0.0a5/src/raise_cli/gates/ar/story_gate.py +88 -0
  76. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/gates/builtin/_runner.py +22 -3
  77. raise_cli-3.0.0a5/src/raise_cli/gates/drift/__init__.py +38 -0
  78. raise_cli-3.0.0a5/src/raise_cli/gates/drift/_base.py +101 -0
  79. raise_cli-3.0.0a5/src/raise_cli/gates/drift/auth_fan_out.py +87 -0
  80. raise_cli-3.0.0a5/src/raise_cli/gates/drift/dead_public_api.py +127 -0
  81. raise_cli-3.0.0a5/src/raise_cli/gates/drift/epic_close.py +113 -0
  82. raise_cli-3.0.0a5/src/raise_cli/gates/drift/import_fan_in.py +73 -0
  83. raise_cli-3.0.0a5/src/raise_cli/gates/drift/linter_suppression.py +49 -0
  84. raise_cli-3.0.0a5/src/raise_cli/gates/drift/parallel_siblings.py +70 -0
  85. raise_cli-3.0.0a5/src/raise_cli/gates/drift/post_refactor_orphan.py +65 -0
  86. raise_cli-3.0.0a5/src/raise_cli/gates/drift/story_accretion.py +50 -0
  87. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/gates/models.py +4 -0
  88. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/governance/models.py +1 -1
  89. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/graph/backends/__init__.py +4 -2
  90. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/hooks/builtin/memory.py +1 -1
  91. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/hooks/events.py +5 -0
  92. raise_cli-3.0.0a5/src/raise_cli/hud/__init__.py +0 -0
  93. raise_cli-3.0.0a5/src/raise_cli/hud/app.py +176 -0
  94. raise_cli-3.0.0a5/src/raise_cli/hud/data.py +221 -0
  95. raise_cli-3.0.0a5/src/raise_cli/hud/hud.tcss +38 -0
  96. raise_cli-3.0.0a5/src/raise_cli/hud/panels/__init__.py +0 -0
  97. raise_cli-3.0.0a5/src/raise_cli/hud/panels/_events_utils.py +124 -0
  98. raise_cli-3.0.0a5/src/raise_cli/hud/panels/_insights_utils.py +246 -0
  99. raise_cli-3.0.0a5/src/raise_cli/hud/panels/_missions_utils.py +156 -0
  100. raise_cli-3.0.0a5/src/raise_cli/hud/panels/events.py +203 -0
  101. raise_cli-3.0.0a5/src/raise_cli/hud/panels/insights.py +129 -0
  102. raise_cli-3.0.0a5/src/raise_cli/hud/panels/missions.py +147 -0
  103. raise_cli-3.0.0a5/src/raise_cli/hud/panels/pipeline.py +189 -0
  104. raise_cli-3.0.0a5/src/raise_cli/hud/panels/session.py +226 -0
  105. raise_cli-3.0.0a5/src/raise_cli/memory/memory_index.py +184 -0
  106. raise_cli-3.0.0a5/src/raise_cli/memory/migrate_claude.py +168 -0
  107. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/memory/patterns_backend.py +1 -2
  108. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/memory/writer.py +89 -57
  109. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/onboarding/bootstrap.py +54 -0
  110. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/onboarding/instructions.py +7 -7
  111. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/onboarding/skill_conflict.py +19 -2
  112. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/onboarding/skills.py +24 -1
  113. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/pipeline/__init__.py +12 -2
  114. raise_cli-3.0.0a5/src/raise_cli/pipeline/_mcp_instance.py +11 -0
  115. raise_cli-3.0.0a5/src/raise_cli/pipeline/_telemetry.py +123 -0
  116. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/pipeline/dispatch.py +1 -1
  117. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/pipeline/engine.py +26 -18
  118. raise_cli-3.0.0a5/src/raise_cli/pipeline/mcp_server.py +73 -0
  119. raise_cli-3.0.0a5/src/raise_cli/pipeline/mcp_tools_backlog.py +118 -0
  120. raise_cli-3.0.0a5/src/raise_cli/pipeline/mcp_tools_gate.py +56 -0
  121. raise_cli-3.0.0a5/src/raise_cli/pipeline/mcp_tools_graph.py +39 -0
  122. raise_cli-3.0.0a5/src/raise_cli/pipeline/mcp_tools_pattern.py +87 -0
  123. raise_cli-3.0.0a4/src/raise_cli/pipeline/mcp_server.py → raise_cli-3.0.0a5/src/raise_cli/pipeline/mcp_tools_pipeline.py +218 -555
  124. raise_cli-3.0.0a5/src/raise_cli/pipeline/mcp_tools_session.py +346 -0
  125. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/pipeline/pipelines_base/bugfix.yaml +11 -0
  126. raise_cli-3.0.0a5/src/raise_cli/pipeline/pipelines_base/epic.yaml +61 -0
  127. raise_cli-3.0.0a5/src/raise_cli/pipeline/run_store.py +336 -0
  128. raise_cli-3.0.0a5/src/raise_cli/project.py +57 -0
  129. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/publish/check.py +66 -0
  130. raise_cli-3.0.0a5/src/raise_cli/session/__init__.py +131 -0
  131. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/session/bundle.py +77 -1
  132. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/session/bundle_data.py +118 -8
  133. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/session/bundle_formatters.py +167 -0
  134. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/session/close.py +67 -49
  135. raise_cli-3.0.0a5/src/raise_cli/session/context_env.py +64 -0
  136. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/session/derive.py +22 -17
  137. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/session/doctor.py +3 -103
  138. raise_cli-3.0.0a5/src/raise_cli/session/index.py +305 -0
  139. raise_cli-3.0.0a5/src/raise_cli/session/journal.py +152 -0
  140. raise_cli-3.0.0a5/src/raise_cli/session/measure.py +74 -0
  141. raise_cli-3.0.0a5/src/raise_cli/session/mission.py +109 -0
  142. raise_cli-3.0.0a5/src/raise_cli/session/mission_binding.py +42 -0
  143. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/session/protocols.py +40 -1
  144. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/session/registry.py +1 -61
  145. raise_cli-3.0.0a5/src/raise_cli/session/state.py +250 -0
  146. raise_cli-3.0.0a5/src/raise_cli/session/terminal.py +145 -0
  147. raise_cli-3.0.0a5/src/raise_cli/skills_base/rai-adapter-setup/SKILL.md +169 -0
  148. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-bugfix-analyse/SKILL.md +10 -0
  149. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-bugfix-close/SKILL.md +11 -1
  150. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-bugfix-fix/SKILL.md +12 -4
  151. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-bugfix-plan/SKILL.md +10 -0
  152. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-bugfix-review/SKILL.md +10 -0
  153. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-bugfix-start/SKILL.md +11 -1
  154. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-bugfix-triage/SKILL.md +47 -6
  155. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-epic-close/SKILL.md +48 -0
  156. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-epic-design/SKILL.md +10 -0
  157. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-epic-plan/SKILL.md +10 -0
  158. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-epic-start/SKILL.md +34 -3
  159. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-session-close/SKILL.md +55 -5
  160. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-story-close/SKILL.md +130 -23
  161. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-story-design/SKILL.md +74 -54
  162. raise_cli-3.0.0a5/src/raise_cli/skills_base/rai-story-implement/SKILL.md +215 -0
  163. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-story-plan/SKILL.md +27 -13
  164. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-story-review/SKILL.md +9 -0
  165. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-story-run/SKILL.md +1 -1
  166. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-story-start/SKILL.md +17 -2
  167. raise_cli-3.0.0a5/src/raise_cli/storage/__init__.py +10 -0
  168. raise_cli-3.0.0a5/src/raise_cli/storage/connection.py +128 -0
  169. raise_cli-3.0.0a5/src/raise_cli/storage/counter.py +58 -0
  170. raise_cli-3.0.0a5/src/raise_cli/storage/migrate.py +596 -0
  171. raise_cli-3.0.0a5/src/raise_cli/storage/missions.py +259 -0
  172. raise_cli-3.0.0a5/src/raise_cli/storage/schema.py +224 -0
  173. raise_cli-3.0.0a5/src/raise_cli/telemetry/phase_map.py +48 -0
  174. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/telemetry/schemas.py +73 -9
  175. raise_cli-3.0.0a5/src/raise_cli/telemetry/session_tokens.py +112 -0
  176. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/telemetry/writer.py +64 -76
  177. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/work_events/emitter.py +5 -5
  178. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/work_events/schemas.py +2 -0
  179. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/work_events/translator.py +12 -14
  180. raise_cli-3.0.0a4/src/raise_cli/_cc_session.py +0 -30
  181. raise_cli-3.0.0a4/src/raise_cli/adapters/jira_config.py +0 -123
  182. raise_cli-3.0.0a4/src/raise_cli/adapters/models/pm.py +0 -147
  183. raise_cli-3.0.0a4/src/raise_cli/artifacts/__init__.py +0 -30
  184. raise_cli-3.0.0a4/src/raise_cli/artifacts/models.py +0 -43
  185. raise_cli-3.0.0a4/src/raise_cli/artifacts/reader.py +0 -55
  186. raise_cli-3.0.0a4/src/raise_cli/artifacts/renderer.py +0 -102
  187. raise_cli-3.0.0a4/src/raise_cli/artifacts/story_design.py +0 -69
  188. raise_cli-3.0.0a4/src/raise_cli/artifacts/writer.py +0 -45
  189. raise_cli-3.0.0a4/src/raise_cli/cli/commands/_resolve.py +0 -342
  190. raise_cli-3.0.0a4/src/raise_cli/cli/commands/artifact.py +0 -144
  191. raise_cli-3.0.0a4/src/raise_cli/context/loaders/artifacts.py +0 -72
  192. raise_cli-3.0.0a4/src/raise_cli/pipeline/_telemetry.py +0 -100
  193. raise_cli-3.0.0a4/src/raise_cli/pipeline/cli.py +0 -370
  194. raise_cli-3.0.0a4/src/raise_cli/pipeline/pipelines_base/epic.yaml +0 -42
  195. raise_cli-3.0.0a4/src/raise_cli/pipeline/run_store.py +0 -154
  196. raise_cli-3.0.0a4/src/raise_cli/pipeline/state.py +0 -131
  197. raise_cli-3.0.0a4/src/raise_cli/session/__init__.py +0 -5
  198. raise_cli-3.0.0a4/src/raise_cli/session/index.py +0 -225
  199. raise_cli-3.0.0a4/src/raise_cli/session/journal.py +0 -119
  200. raise_cli-3.0.0a4/src/raise_cli/session/state.py +0 -248
  201. raise_cli-3.0.0a4/src/raise_cli/skills_base/rai-adapter-setup/SKILL.md +0 -135
  202. raise_cli-3.0.0a4/src/raise_cli/skills_base/rai-story-implement/SKILL.md +0 -162
  203. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/README.md +0 -0
  204. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/__init__.py +0 -0
  205. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/__main__.py +0 -0
  206. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/adapters/__init__.py +0 -0
  207. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/adapters/confluence_config.py +0 -0
  208. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/adapters/confluence_config_gen.py +0 -0
  209. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/adapters/confluence_discovery.py +0 -0
  210. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/adapters/confluence_exceptions.py +0 -0
  211. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/adapters/confluence_markdown.py +0 -0
  212. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/adapters/declarative/__init__.py +0 -0
  213. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/adapters/declarative/discovery.py +0 -0
  214. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/adapters/declarative/expressions.py +0 -0
  215. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/adapters/declarative/reference/__init__.py +0 -0
  216. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/adapters/declarative/reference/github.yaml +0 -0
  217. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/adapters/declarative/schema.py +0 -0
  218. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/adapters/filesystem_adapter.py +0 -0
  219. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/adapters/jira_discovery.py +0 -0
  220. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/adapters/jira_exceptions.py +0 -0
  221. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/adapters/mcp_bridge.py +0 -0
  222. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/adapters/models/governance.py +0 -0
  223. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/adapters/models/health.py +0 -0
  224. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/adapters/registry.py +0 -0
  225. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/adapters/sync_ledger.py +0 -0
  226. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/agents/__init__.py +0 -0
  227. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/agents/antigravity.yaml +0 -0
  228. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/agents/copilot.yaml +0 -0
  229. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/agents/copilot_plugin.py +0 -0
  230. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/agents/cursor.yaml +0 -0
  231. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/agents/roo.yaml +0 -0
  232. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/agents/windsurf.yaml +0 -0
  233. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/backlog/__init__.py +0 -0
  234. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/backlog/reconcile.py +0 -0
  235. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/backlog/scanner.py +0 -0
  236. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/backlog/sync.py +0 -0
  237. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/cli/__init__.py +0 -0
  238. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/cli/commands/__init__.py +0 -0
  239. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/cli/commands/adapters.py +0 -0
  240. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/cli/commands/base.py +0 -0
  241. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/cli/commands/doctor.py +0 -0
  242. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/cli/commands/info.py +0 -0
  243. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/cli/commands/learn.py +0 -0
  244. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/cli/commands/mcp.py +0 -0
  245. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/cli/commands/profile.py +0 -0
  246. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/cli/commands/release.py +0 -0
  247. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/cli/commands/skill.py +0 -0
  248. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/cli/commands/skill_set.py +0 -0
  249. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/cli/error_handler.py +0 -0
  250. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/compat.py +0 -0
  251. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/compliance/__init__.py +0 -0
  252. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/compliance/controls.yaml +0 -0
  253. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/compliance/evidence.py +0 -0
  254. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/compliance/extractors/__init__.py +0 -0
  255. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/compliance/extractors/git.py +0 -0
  256. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/compliance/loader.py +0 -0
  257. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/compliance/models.py +0 -0
  258. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/config/__init__.py +0 -0
  259. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/config/agent_plugin.py +0 -0
  260. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/config/ide.py +0 -0
  261. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/context/__init__.py +0 -0
  262. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/context/analyzers/__init__.py +0 -0
  263. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/context/analyzers/models.py +0 -0
  264. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/context/analyzers/protocol.py +0 -0
  265. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/context/analyzers/python.py +0 -0
  266. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/context/analyzers/signals.py +0 -0
  267. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/context/analyzers/typescript.py +0 -0
  268. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/context/diff.py +0 -0
  269. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/context/extractors/__init__.py +0 -0
  270. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/context/extractors/relationships.py +0 -0
  271. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/context/extractors/skills.py +0 -0
  272. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/context/extractors/structure.py +0 -0
  273. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/context/loaders/__init__.py +0 -0
  274. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/context/loaders/architecture.py +0 -0
  275. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/context/loaders/components.py +0 -0
  276. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/context/loaders/documents.py +0 -0
  277. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/context/loaders/identity.py +0 -0
  278. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/context/loaders/memory.py +0 -0
  279. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/core/__init__.py +0 -0
  280. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/core/files.py +0 -0
  281. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/core/text.py +0 -0
  282. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/core/tools.py +0 -0
  283. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/discovery/analyzer.py +0 -0
  284. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/discovery/drift.py +0 -0
  285. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/discovery/scanner.py +0 -0
  286. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/docs/__init__.py +0 -0
  287. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/docs/migrate.py +0 -0
  288. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/doctor/__init__.py +0 -0
  289. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/doctor/checks/__init__.py +0 -0
  290. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/doctor/checks/developer.py +0 -0
  291. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/doctor/checks/environment.py +0 -0
  292. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/doctor/fix.py +0 -0
  293. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/doctor/models.py +0 -0
  294. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/doctor/protocol.py +0 -0
  295. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/doctor/registry.py +0 -0
  296. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/doctor/report.py +0 -0
  297. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/engines/__init__.py +0 -0
  298. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/gates/__init__.py +0 -0
  299. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/gates/builtin/__init__.py +0 -0
  300. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/gates/builtin/coverage.py +0 -0
  301. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/gates/builtin/format.py +0 -0
  302. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/gates/builtin/lint.py +0 -0
  303. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/gates/builtin/tests.py +0 -0
  304. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/gates/builtin/types.py +0 -0
  305. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/gates/hook.py +0 -0
  306. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/gates/protocol.py +0 -0
  307. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/gates/registry.py +0 -0
  308. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/governance/__init__.py +0 -0
  309. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/governance/extractor.py +0 -0
  310. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/governance/parsers/__init__.py +0 -0
  311. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/governance/parsers/_convert.py +0 -0
  312. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/governance/parsers/adr.py +0 -0
  313. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/governance/parsers/backlog.py +0 -0
  314. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/governance/parsers/constitution.py +0 -0
  315. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/governance/parsers/epic.py +0 -0
  316. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/governance/parsers/glossary.py +0 -0
  317. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/governance/parsers/guardrails.py +0 -0
  318. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/governance/parsers/prd.py +0 -0
  319. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/governance/parsers/roadmap.py +0 -0
  320. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/governance/parsers/vision.py +0 -0
  321. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/graph/__init__.py +0 -0
  322. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/graph/backends/api.py +0 -0
  323. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/graph/backends/dual.py +0 -0
  324. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/graph/backends/pending.py +0 -0
  325. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/graph/query_backend.py +0 -0
  326. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/handlers/__init__.py +0 -0
  327. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/hooks/__init__.py +0 -0
  328. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/hooks/builtin/__init__.py +0 -0
  329. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/hooks/builtin/gate_bridge.py +0 -0
  330. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/hooks/builtin/telemetry.py +0 -0
  331. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/hooks/emitter.py +0 -0
  332. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/hooks/protocol.py +0 -0
  333. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/hooks/registry.py +0 -0
  334. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/mcp/__init__.py +0 -0
  335. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/mcp/bridge.py +0 -0
  336. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/mcp/models.py +0 -0
  337. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/mcp/registry.py +0 -0
  338. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/mcp/schema.py +0 -0
  339. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/memory/__init__.py +0 -0
  340. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/memory/learning.py +0 -0
  341. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/memory/loader.py +0 -0
  342. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/memory/migration.py +0 -0
  343. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/memory/models.py +0 -0
  344. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/memory/push.py +0 -0
  345. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/onboarding/__init__.py +0 -0
  346. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/onboarding/claudemd.py +0 -0
  347. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/onboarding/conventions.py +0 -0
  348. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/onboarding/detection.py +0 -0
  349. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/onboarding/governance.py +0 -0
  350. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/onboarding/manifest.py +0 -0
  351. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/onboarding/memory_md.py +0 -0
  352. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/onboarding/migration.py +0 -0
  353. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/onboarding/profile.py +0 -0
  354. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/onboarding/profile_portability.py +0 -0
  355. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/onboarding/skill_manifest.py +0 -0
  356. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/onboarding/workflows.py +0 -0
  357. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/output/__init__.py +0 -0
  358. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/output/console.py +0 -0
  359. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/output/formatters/__init__.py +0 -0
  360. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/output/formatters/adapters.py +0 -0
  361. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/output/formatters/discover.py +0 -0
  362. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/output/formatters/graph.py +0 -0
  363. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/output/formatters/skill.py +0 -0
  364. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/output/symbols.py +0 -0
  365. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/pipeline/executor.py +0 -0
  366. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/pipeline/gates.py +0 -0
  367. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/pipeline/loader.py +0 -0
  368. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/pipeline/pipelines_base/hotfix.yaml +0 -0
  369. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/pipeline/pipelines_base/story.yaml +0 -0
  370. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/pipeline/prompt.py +0 -0
  371. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/pipeline/templates/adversarial-ar.md +0 -0
  372. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/pipeline/templates/adversarial-qr.md +0 -0
  373. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/pipeline/worktree.py +0 -0
  374. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/publish/__init__.py +0 -0
  375. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/publish/changelog.py +0 -0
  376. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/publish/version.py +0 -0
  377. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/rai_base/__init__.py +0 -0
  378. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/rai_base/framework/__init__.py +0 -0
  379. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/rai_base/framework/methodology.yaml +0 -0
  380. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/rai_base/governance/__init__.py +0 -0
  381. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/rai_base/governance/architecture/__init__.py +0 -0
  382. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/rai_base/governance/architecture/domain-model.md +0 -0
  383. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/rai_base/governance/architecture/domain-model.yaml +0 -0
  384. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/rai_base/governance/architecture/system-context.md +0 -0
  385. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/rai_base/governance/architecture/system-context.yaml +0 -0
  386. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/rai_base/governance/architecture/system-design.md +0 -0
  387. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/rai_base/governance/architecture/system-design.yaml +0 -0
  388. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/rai_base/governance/backlog.md +0 -0
  389. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/rai_base/governance/guardrails.md +0 -0
  390. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/rai_base/governance/prd.md +0 -0
  391. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/rai_base/governance/vision.md +0 -0
  392. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/rai_base/identity/__init__.py +0 -0
  393. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/rai_base/identity/core.md +0 -0
  394. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/rai_base/identity/core.yaml +0 -0
  395. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/rai_base/identity/perspective.md +0 -0
  396. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/rai_base/memory/__init__.py +0 -0
  397. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/rai_base/memory/patterns-base.jsonl +0 -0
  398. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/schemas/__init__.py +0 -0
  399. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/schemas/journal.py +0 -0
  400. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/schemas/session_state.py +0 -0
  401. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/session/context_backend.py +0 -0
  402. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/session/identity.py +0 -0
  403. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/session/monitor.py +0 -0
  404. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/session/prefix.py +0 -0
  405. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/session/resolver.py +0 -0
  406. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills/__init__.py +0 -0
  407. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills/locator.py +0 -0
  408. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills/name_checker.py +0 -0
  409. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills/parser.py +0 -0
  410. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills/scaffold.py +0 -0
  411. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills/schema.py +0 -0
  412. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills/skillsets.py +0 -0
  413. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills/validator.py +0 -0
  414. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/__init__.py +0 -0
  415. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/contract-template.md +0 -0
  416. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/preamble.md +0 -0
  417. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-architecture-review/SKILL.md +0 -0
  418. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-bugfix-run/SKILL.md +0 -0
  419. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-debug/SKILL.md +0 -0
  420. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-discover/SKILL.md +0 -0
  421. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-docs-update/SKILL.md +0 -0
  422. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-doctor/SKILL.md +0 -0
  423. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-epic-close/templates/retrospective.md +0 -0
  424. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-epic-design/templates/design.md +0 -0
  425. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-epic-design/templates/scope.md +0 -0
  426. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-epic-docs/SKILL.md +0 -0
  427. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-epic-plan/_references/sequencing-strategies.md +0 -0
  428. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-epic-plan/templates/plan-section.md +0 -0
  429. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-epic-run/SKILL.md +0 -0
  430. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-epic-start/templates/brief.md +0 -0
  431. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-mcp-add/SKILL.md +0 -0
  432. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-mcp-remove/SKILL.md +0 -0
  433. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-mcp-status/SKILL.md +0 -0
  434. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-problem-shape/SKILL.md +0 -0
  435. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-project-create/SKILL.md +0 -0
  436. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-project-onboard/SKILL.md +0 -0
  437. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-quality-review/SKILL.md +0 -0
  438. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-research/SKILL.md +0 -0
  439. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-research/references/research-prompt-template.md +0 -0
  440. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-session-diary/SKILL.md +0 -0
  441. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-session-start/SKILL.md +0 -0
  442. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-skill-create/SKILL.md +0 -0
  443. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-skillset-manage/SKILL.md +0 -0
  444. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-story-design/references/tech-design-story-v2.md +0 -0
  445. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-story-start/templates/story.md +0 -0
  446. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/skills_base/rai-welcome/SKILL.md +0 -0
  447. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/telemetry/__init__.py +0 -0
  448. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/tier/__init__.py +0 -0
  449. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/tier/context.py +0 -0
  450. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/viz/__init__.py +0 -0
  451. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/viz/generator.py +0 -0
  452. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/work_events/__init__.py +0 -0
  453. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/work_events/backfill.py +0 -0
  454. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/work_events/ref_resolver.py +0 -0
  455. {raise_cli-3.0.0a4 → raise_cli-3.0.0a5}/src/raise_cli/work_events/retry_queue.py +0 -0
@@ -9,6 +9,9 @@
9
9
  .claude/worktrees/
10
10
  .claude/projects/
11
11
 
12
+ # Hermes Agent worktrees (auto-created by hermes -w)
13
+ .worktrees/
14
+
12
15
  # Claude Code legacy files (superseded, prevent re-addition)
13
16
  .claude/RAI.md
14
17
  .claude/RAI-naming.md
@@ -25,6 +28,13 @@ daemon.yaml
25
28
  .raise/backlog/
26
29
  # .raise/artifacts/ — tracked (story-design YAMLs are versioned artifacts)
27
30
 
31
+ # Drift detection pipeline outputs (computed, machine-specific paths, high churn)
32
+ .raise/drift/
33
+ packages/*/.raise/drift/
34
+ packages/*/.raise/pending_sync.json
35
+ packages/*/.raise/rai/personal/
36
+ packages/*/.raise/rai/sessions/
37
+
28
38
  # Pipeline state (environment-specific, PAT-E-594)
29
39
  .rai-state/
30
40
 
@@ -161,3 +171,6 @@ work/research/
161
171
  # See dev/sops/raise-server-local.md § Running e2e tests locally.
162
172
  /docker-compose.override.yaml
163
173
  /docker-compose.override.yml
174
+ .worktrees/
175
+ .venv
176
+ .venv
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: raise-cli
3
- Version: 3.0.0a4
3
+ Version: 3.0.0a5
4
4
  Summary: RaiSE CLI - Reliable AI Software Engineering governance framework
5
5
  Project-URL: Homepage, https://raiseframework.ai
6
6
  Project-URL: Documentation, https://docs.raiseframework.ai
@@ -18,6 +18,7 @@ Classifier: Programming Language :: Python :: 3.13
18
18
  Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
19
19
  Classifier: Topic :: Software Development :: Quality Assurance
20
20
  Requires-Python: >=3.12
21
+ Requires-Dist: atlassian-python-api>=3.41.0
21
22
  Requires-Dist: httpx<1.0,>=0.27.0
22
23
  Requires-Dist: logfire-api>=4.0
23
24
  Requires-Dist: markdown>=3.6
@@ -37,13 +38,12 @@ Requires-Dist: tree-sitter-typescript>=0.23.2
37
38
  Requires-Dist: tree-sitter>=0.25.2
38
39
  Requires-Dist: typer>=0.12.0
39
40
  Provides-Extra: atlassian
40
- Requires-Dist: atlassian-python-api>=3.41.0; extra == 'atlassian'
41
41
  Provides-Extra: confluence
42
- Requires-Dist: atlassian-python-api>=3.41.0; extra == 'confluence'
43
42
  Provides-Extra: csharp
44
43
  Requires-Dist: tree-sitter-c-sharp>=0.23.1; extra == 'csharp'
44
+ Provides-Extra: hud
45
+ Requires-Dist: textual<1.0,>=0.86; extra == 'hud'
45
46
  Provides-Extra: jira
46
- Requires-Dist: atlassian-python-api>=3.41.0; extra == 'jira'
47
47
  Provides-Extra: observability
48
48
  Requires-Dist: logfire>=4.0; extra == 'observability'
49
49
  Requires-Dist: opentelemetry-api>=1.20; extra == 'observability'
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "raise-cli"
3
- version = "3.0.0a4"
3
+ version = "3.0.0a5"
4
4
  description = "RaiSE CLI - Reliable AI Software Engineering governance framework"
5
5
  authors = [
6
6
  {name = "Emilio Osorio", email = "emilio@humansys.ai"}
@@ -39,6 +39,7 @@ dependencies = [
39
39
  "httpx>=0.27.0,<1.0",
40
40
  "mcp>=1.26,<2",
41
41
  "markdown>=3.6",
42
+ "atlassian-python-api>=3.41.0",
42
43
  ]
43
44
 
44
45
  [project.optional-dependencies]
@@ -50,15 +51,13 @@ observability = [
50
51
  csharp = [
51
52
  "tree-sitter-c-sharp>=0.23.1",
52
53
  ]
53
- atlassian = [
54
- "atlassian-python-api>=3.41.0",
55
- ]
56
- confluence = [
57
- "atlassian-python-api>=3.41.0",
58
- ]
59
- jira = [
60
- "atlassian-python-api>=3.41.0",
54
+ hud = [
55
+ "textual>=0.86,<1.0",
61
56
  ]
57
+ # Backwards-compat aliases — atlassian-python-api is now installed by default (RAISE-1912).
58
+ atlassian = []
59
+ confluence = []
60
+ jira = []
62
61
 
63
62
  [project.urls]
64
63
  Homepage = "https://raiseframework.ai"
@@ -68,6 +67,7 @@ Changelog = "https://github.com/humansys/raise/blob/main/CHANGELOG.md"
68
67
 
69
68
  [project.scripts]
70
69
  rai = "raise_cli.cli.main:app"
70
+ rai-mcp-pipeline = "raise_cli.pipeline.mcp_server:main"
71
71
 
72
72
  [project.entry-points."rai.governance.parsers"]
73
73
  prd = "raise_cli.governance.parsers.prd:PrdParser"
@@ -91,12 +91,23 @@ types = "raise_cli.gates.builtin.types:TypeGate"
91
91
  lint = "raise_cli.gates.builtin.lint:LintGate"
92
92
  coverage = "raise_cli.gates.builtin.coverage:CoverageGate"
93
93
  format = "raise_cli.gates.builtin.format:FormatGate"
94
+ drift-post-refactor-orphan = "raise_cli.gates.drift.post_refactor_orphan:PostRefactorOrphanGate"
95
+ drift-dead-public-api = "raise_cli.gates.drift.dead_public_api:DeadPublicApiGate"
96
+ drift-linter-suppression = "raise_cli.gates.drift.linter_suppression:LinterSuppressionGate"
97
+ drift-story-accretion = "raise_cli.gates.drift.story_accretion:StoryAccretionGate"
98
+ drift-import-fan-in = "raise_cli.gates.drift.import_fan_in:ImportFanInGate"
99
+ drift-parallel-siblings = "raise_cli.gates.drift.parallel_siblings:ParallelSiblingGate"
100
+ drift-auth-fan-out = "raise_cli.gates.drift.auth_fan_out:AuthorizationFanOutGate"
101
+ ar-story = "raise_cli.gates.ar.story_gate:ArchitectureReviewGate"
102
+ ar-bugfix = "raise_cli.gates.ar.bugfix_gate:BugfixArchitectureReviewGate"
103
+ epic-close-drift = "raise_cli.gates.drift.epic_close:EpicCloseGate"
94
104
 
95
105
  [project.entry-points."rai.doctor.checks"]
96
106
  environment = "raise_cli.doctor.checks.environment:EnvironmentCheck"
97
107
  project = "raise_cli.doctor.checks.project:ProjectCheck"
98
108
  developer = "raise_cli.doctor.checks.developer:DeveloperCheck"
99
109
  adapters = "raise_cli.doctor.checks.adapters:AdapterDoctorCheck"
110
+ runtimes = "raise_cli.doctor.checks.runtimes:RuntimesCheck"
100
111
 
101
112
  [project.entry-points."rai.adapters.pm"]
102
113
  filesystem = "raise_cli.adapters.filesystem:FilesystemPMAdapter"
@@ -0,0 +1,139 @@
1
+ """Discover agent session_id via runtime-agnostic priority chain.
2
+
3
+ Resolution order:
4
+ 1. RAISE_AGENT_SESSION_ID (explicit, set by any runtime adapter)
5
+ 2. RAISE_CC_SESSION_ID (Claude Code backward compat)
6
+ 3. CC port discovery (CLAUDE_CODE_SSE_PORT → cc.port, unambiguous match only)
7
+ 4. Terminal bindings (PPID ancestry → _terminal_bindings.json)
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import json
13
+ import os
14
+ from pathlib import Path
15
+
16
+ _SESSIONS_DIR = Path(".raise") / "rai" / "sessions"
17
+
18
+
19
+ def discover_agent_session_id() -> str | None:
20
+ """Resolve session ID from any supported runtime.
21
+
22
+ Priority chain ensures backward compatibility while enabling
23
+ new runtimes (Hermes, Codex) to participate in session correlation.
24
+ """
25
+ agent_sid = os.environ.get("RAISE_AGENT_SESSION_ID", "").strip()
26
+ if agent_sid:
27
+ return agent_sid
28
+
29
+ cc_sid = os.environ.get("RAISE_CC_SESSION_ID", "").strip()
30
+ if cc_sid:
31
+ return cc_sid
32
+
33
+ port_sid = _discover_via_cc_port()
34
+ if port_sid:
35
+ return port_sid
36
+
37
+ return _discover_via_terminal_bindings()
38
+
39
+
40
+ def discover_mission_for_session(cc_session_id: str) -> str | None:
41
+ """Return the mission bound to *cc_session_id* in SQLite, or None.
42
+
43
+ Uses the shared raise.db so the lookup works across worktrees and
44
+ concurrent CC sessions without PID navigation.
45
+ """
46
+ try:
47
+ from pathlib import Path as _Path
48
+
49
+ from raise_cli.session.mission_binding import get_mission_for_session
50
+
51
+ return get_mission_for_session(_Path.cwd(), cc_session_id)
52
+ except Exception:
53
+ return None
54
+
55
+
56
+ def discover_agent_runtime() -> str:
57
+ """Resolve the active agent runtime identifier.
58
+
59
+ Resolution: $RAISE_AGENT_RUNTIME > CC-specific env detection > "unknown".
60
+ """
61
+ explicit = os.environ.get("RAISE_AGENT_RUNTIME", "").strip()
62
+ if explicit:
63
+ return explicit
64
+
65
+ if os.environ.get("RAISE_CC_SESSION_ID", "").strip():
66
+ return "claude_code"
67
+
68
+ if _discover_via_cc_port():
69
+ return "claude_code"
70
+
71
+ if _discover_via_terminal_bindings():
72
+ return "claude_code"
73
+
74
+ return "unknown"
75
+
76
+
77
+ def _discover_via_cc_port() -> str | None:
78
+ """CC-specific: match CLAUDE_CODE_SSE_PORT to session dir's cc.port file.
79
+
80
+ Returns the matching session ID only when exactly one session matches the
81
+ port. Returns None when the match is ambiguous (multiple sessions share the
82
+ same port, which happens during multi-agent runs where each subagent session
83
+ also writes cc.port). Ambiguous cases are resolved by the terminal-bindings
84
+ fallback instead.
85
+ """
86
+ port = os.environ.get("CLAUDE_CODE_SSE_PORT", "").strip()
87
+ if not port:
88
+ return None
89
+ sessions_dir = Path.cwd() / _SESSIONS_DIR
90
+ if not sessions_dir.exists():
91
+ return None
92
+ matches: list[str] = []
93
+ for sess_dir in sessions_dir.iterdir():
94
+ if not sess_dir.is_dir():
95
+ continue
96
+ port_file = sess_dir / "cc.port"
97
+ if port_file.exists() and port_file.read_text().strip() == port:
98
+ matches.append(sess_dir.name)
99
+ return matches[0] if len(matches) == 1 else None
100
+
101
+
102
+ def _get_parent_pid(pid: int) -> int | None:
103
+ """Return the parent PID of *pid* via /proc (Linux only)."""
104
+ try:
105
+ status = Path(f"/proc/{pid}/status").read_text()
106
+ for line in status.splitlines():
107
+ if line.startswith("PPid:"):
108
+ return int(line.split()[1])
109
+ return None
110
+ except (FileNotFoundError, ValueError, PermissionError, OSError):
111
+ return None
112
+
113
+
114
+ def _discover_via_terminal_bindings() -> str | None:
115
+ """Resolve session ID by walking the PID ancestry to the CC process.
116
+
117
+ The SessionStart hook writes ``{cc_pid: {session_id: ...}}`` to
118
+ ``_terminal_bindings.json``. From within a Bash tool call the CC process is
119
+ the grandparent: ``rai`` → ``bash`` → ``CC``. Reading the grandparent PID
120
+ and looking it up in the bindings gives the correct session even when
121
+ multiple sessions share the same SSE port.
122
+ """
123
+ try:
124
+ bash_pid = os.getppid()
125
+ cc_pid = _get_parent_pid(bash_pid)
126
+ if cc_pid is None:
127
+ return None
128
+ bindings_file = Path.cwd() / _SESSIONS_DIR / "_terminal_bindings.json"
129
+ if not bindings_file.exists():
130
+ return None
131
+ bindings: dict[str, dict[str, object]] = json.loads(bindings_file.read_text())
132
+ entry = bindings.get(str(cc_pid))
133
+ if entry:
134
+ sid = entry.get("session_id")
135
+ if sid:
136
+ return str(sid)
137
+ return None
138
+ except Exception:
139
+ return None
@@ -0,0 +1,8 @@
1
+ """Backward compat stub — use _agent_session instead (RAISE-2779)."""
2
+
3
+ from raise_cli._agent_session import discover_agent_session_id
4
+
5
+
6
+ def discover_cc_session_id() -> str | None:
7
+ """Deprecated: use discover_agent_session_id() instead."""
8
+ return discover_agent_session_id()
@@ -0,0 +1,190 @@
1
+ """Generic backlog adapter config I/O — reads/writes .raise/backlog.yaml.
2
+
3
+ Replaces jira_config.save_jira_config and load_jira_config for CLI use.
4
+ The CLI never imports from jira_config directly (PAT-F-167).
5
+
6
+ S2503.12 (RAISE-2723)
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import re
12
+ from pathlib import Path
13
+ from typing import Any
14
+
15
+ import yaml
16
+
17
+ from raise_cli.adapters.models.pm import BacklogAdapterConfig
18
+
19
+ _BACKLOG_YAML_PATH = Path(".raise") / "backlog.yaml"
20
+ _JIRA_YAML_PATH = Path(".raise") / "jira.yaml"
21
+
22
+
23
+ def save_backlog_config(
24
+ project_root: Path,
25
+ adapter_name: str,
26
+ updates: dict[str, Any],
27
+ ) -> None:
28
+ """Merge updates into .raise/backlog.yaml under adapter_name section.
29
+
30
+ For each top-level key in updates:
31
+ - If the key already exists as a dict, shallow-merges so sibling sub-keys
32
+ (e.g. custom_fields.bug vs .story) survive.
33
+ - Replaces only the matching block in the raw file; other sections untouched.
34
+ - Appends if section doesn't exist yet.
35
+ """
36
+ config_path = project_root / _BACKLOG_YAML_PATH
37
+ config_path.parent.mkdir(parents=True, exist_ok=True)
38
+
39
+ content = ""
40
+ root_data: dict[str, Any] = {}
41
+ if config_path.exists():
42
+ content = config_path.read_text(encoding="utf-8")
43
+ root_data = yaml.safe_load(content) or {}
44
+
45
+ adapter_data: dict[str, Any] = root_data.get(adapter_name) or {}
46
+
47
+ # Merge each update key into the adapter section
48
+ for key, value in updates.items():
49
+ existing = adapter_data.get(key)
50
+ if isinstance(existing, dict) and isinstance(value, dict):
51
+ adapter_data[key] = {**existing, **value}
52
+ else:
53
+ adapter_data[key] = value
54
+
55
+ # Serialize full adapter section as YAML
56
+ section_yaml = yaml.dump(
57
+ {adapter_name: adapter_data},
58
+ default_flow_style=False,
59
+ allow_unicode=True,
60
+ sort_keys=False,
61
+ )
62
+
63
+ # Surgically replace the adapter_name block (key + all indented/blank lines)
64
+ pattern = re.compile(
65
+ rf"^{re.escape(adapter_name)}:\n(?:[ \t][^\n]*\n|[ \t]*\n)*",
66
+ re.MULTILINE,
67
+ )
68
+ if pattern.search(content):
69
+ content = pattern.sub(section_yaml, content)
70
+ else:
71
+ if content and not content.endswith("\n"):
72
+ content += "\n"
73
+ content += "\n" + section_yaml if content else section_yaml
74
+
75
+ config_path.write_text(content, encoding="utf-8")
76
+
77
+
78
+ def load_backlog_config(
79
+ project_root: Path,
80
+ adapter_name: str,
81
+ ) -> BacklogAdapterConfig:
82
+ """Load and validate backlog.yaml section for adapter_name.
83
+
84
+ Runs migrate_jira_yaml_if_needed() first so projects with only jira.yaml
85
+ continue working without manual migration.
86
+
87
+ Raises:
88
+ FileNotFoundError: If neither backlog.yaml nor jira.yaml exists.
89
+ KeyError: If adapter_name section is missing.
90
+ pydantic.ValidationError: If section doesn't match BacklogAdapterConfig.
91
+ """
92
+ migrate_jira_yaml_if_needed(project_root)
93
+ config_path = project_root / _BACKLOG_YAML_PATH
94
+ if not config_path.exists():
95
+ msg = f"Backlog config not found: {config_path}"
96
+ raise FileNotFoundError(msg)
97
+
98
+ root_data: dict[str, Any] = (
99
+ yaml.safe_load(config_path.read_text(encoding="utf-8")) or {}
100
+ )
101
+ if adapter_name not in root_data:
102
+ msg = f"Adapter '{adapter_name}' not configured in {config_path}"
103
+ raise KeyError(msg)
104
+
105
+ return BacklogAdapterConfig.model_validate(root_data[adapter_name])
106
+
107
+
108
+ def migrate_jira_yaml_if_needed(project_root: Path) -> bool:
109
+ """Migrate .raise/jira.yaml → .raise/backlog.yaml[jira] with generic field names.
110
+
111
+ Applies renames:
112
+ instances → organizations
113
+ instance.site → organization.url
114
+ default_instance → default_org
115
+ project.instance → project.org
116
+ link_types → relation_types
117
+
118
+ Returns True if migration ran, False if no-op.
119
+ Idempotent: no-op if backlog.yaml already exists.
120
+ Preserves jira.yaml (does not delete it).
121
+ """
122
+ backlog_path = project_root / _BACKLOG_YAML_PATH
123
+ jira_path = project_root / _JIRA_YAML_PATH
124
+
125
+ if backlog_path.exists():
126
+ return False
127
+ if not jira_path.exists():
128
+ return False
129
+
130
+ raw: dict[str, Any] = yaml.safe_load(jira_path.read_text(encoding="utf-8")) or {}
131
+ migrated = _rename_jira_to_generic(raw)
132
+
133
+ backlog_path.parent.mkdir(parents=True, exist_ok=True)
134
+ content = yaml.dump(
135
+ {"jira": migrated},
136
+ default_flow_style=False,
137
+ allow_unicode=True,
138
+ sort_keys=False,
139
+ )
140
+ backlog_path.write_text(content, encoding="utf-8")
141
+ return True
142
+
143
+
144
+ def _rename_jira_to_generic(raw: dict[str, Any]) -> dict[str, Any]:
145
+ """Apply field renames from jira.yaml format to backlog.yaml[jira] format."""
146
+ result: dict[str, Any] = {}
147
+
148
+ for key, value in raw.items():
149
+ if key == "default_instance":
150
+ result["default_org"] = value
151
+ elif key == "instances":
152
+ organizations: dict[str, Any] = {}
153
+ instances_raw: dict[str, Any] = value or {}
154
+ for org_name, inst in instances_raw.items():
155
+ org: dict[str, Any] = {}
156
+ inst_dict: dict[str, Any] = inst or {}
157
+ for ikey, ival in inst_dict.items():
158
+ org["url" if ikey == "site" else ikey] = ival
159
+ organizations[org_name] = org
160
+ result["organizations"] = organizations
161
+ elif key == "projects":
162
+ projects: dict[str, Any] = {}
163
+ projects_raw: dict[str, Any] = value or {}
164
+ for pkey, proj in projects_raw.items():
165
+ p: dict[str, Any] = {}
166
+ proj_dict: dict[str, Any] = proj or {}
167
+ for pk, pv in proj_dict.items():
168
+ p["org" if pk == "instance" else pk] = pv
169
+ projects[pkey] = p
170
+ result["projects"] = projects
171
+ elif key == "link_types":
172
+ result["relation_types"] = value
173
+ else:
174
+ result[key] = value
175
+
176
+ return result
177
+
178
+
179
+ def get_configured_adapters(project_root: Path) -> set[str]:
180
+ """Return set of adapter names with a section in backlog.yaml.
181
+
182
+ Returns empty set if backlog.yaml doesn't exist.
183
+ """
184
+ config_path = project_root / _BACKLOG_YAML_PATH
185
+ if not config_path.exists():
186
+ return set()
187
+ root_data: dict[str, Any] = (
188
+ yaml.safe_load(config_path.read_text(encoding="utf-8")) or {}
189
+ )
190
+ return {k for k in root_data if isinstance(root_data[k], dict)}
@@ -20,7 +20,12 @@ from __future__ import annotations
20
20
  import logging
21
21
  from typing import Any
22
22
 
23
- from raise_cli.adapters.models.docs import PageContent, PageSummary, PublishResult
23
+ from raise_cli.adapters.models.docs import (
24
+ CommentSummary,
25
+ PageContent,
26
+ PageSummary,
27
+ PublishResult,
28
+ )
24
29
  from raise_cli.adapters.models.health import AdapterHealth
25
30
  from raise_cli.adapters.pending_ops import PendingOpsLog
26
31
 
@@ -178,3 +183,27 @@ class CompositeDocTarget:
178
183
  def health(self) -> AdapterHealth:
179
184
  """Delegate to remote (last) target."""
180
185
  return self._remote.health()
186
+
187
+ def add_label(self, page_id: str, name: str) -> None:
188
+ """Delegate to remote (last) target."""
189
+ self._remote.add_label(page_id, name)
190
+
191
+ def get_labels(self, page_id: str) -> list[str]:
192
+ """Delegate to remote (last) target."""
193
+ return self._remote.get_labels(page_id)
194
+
195
+ def get_page_children(self, page_id: str) -> list[PageSummary]:
196
+ """Delegate to remote (last) target."""
197
+ return self._remote.get_page_children(page_id)
198
+
199
+ def delete_page(self, page_id: str) -> None:
200
+ """Delegate to remote (last) target."""
201
+ self._remote.delete_page(page_id)
202
+
203
+ def add_comment(self, page_id: str, body: str) -> None:
204
+ """Delegate to remote (last) target."""
205
+ self._remote.add_comment(page_id, body)
206
+
207
+ def get_comments(self, page_id: str) -> list[CommentSummary]:
208
+ """Delegate to remote (last) target."""
209
+ return self._remote.get_comments(page_id)