raise-cli 3.0.0a6__tar.gz → 3.1.0a3__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 (514) hide show
  1. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/.gitignore +20 -2
  2. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/PKG-INFO +7 -3
  3. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/README.md +1 -1
  4. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/pyproject.toml +10 -3
  5. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/_agent_session.py +33 -9
  6. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/adapters/composite_docs.py +110 -23
  7. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/adapters/composite_pm.py +123 -19
  8. raise_cli-3.1.0a3/src/raise_cli/adapters/confluence_adapter.py +262 -0
  9. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/adapters/confluence_client.py +1 -0
  10. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/adapters/confluence_config.py +101 -4
  11. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/adapters/confluence_config_gen.py +86 -10
  12. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/adapters/confluence_markdown.py +16 -5
  13. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/adapters/declarative/adapter.py +2 -1
  14. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/adapters/filesystem.py +37 -1
  15. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/adapters/jira_adapter.py +169 -23
  16. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/adapters/jira_adf.py +8 -4
  17. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/adapters/jira_client.py +192 -5
  18. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/adapters/ledger_aware.py +47 -2
  19. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/adapters/models/__init__.py +4 -0
  20. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/adapters/models/pm.py +38 -0
  21. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/adapters/protocols.py +31 -2
  22. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/adapters/resolve.py +53 -24
  23. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/adapters/sync.py +41 -2
  24. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/agents/claude.yaml +1 -2
  25. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/agents/codex_plugin.py +20 -3
  26. raise_cli-3.1.0a3/src/raise_cli/cartridges/__init__.py +8 -0
  27. raise_cli-3.1.0a3/src/raise_cli/cartridges/cli.py +1082 -0
  28. raise_cli-3.1.0a3/src/raise_cli/cartridges/formatter.py +223 -0
  29. raise_cli-3.1.0a3/src/raise_cli/cartridges/server_client.py +138 -0
  30. raise_cli-3.1.0a3/src/raise_cli/cartridges/server_install.py +47 -0
  31. raise_cli-3.1.0a3/src/raise_cli/cartridges/server_models.py +92 -0
  32. raise_cli-3.1.0a3/src/raise_cli/cli/commands/adapter_route.py +181 -0
  33. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/cli/commands/adapter_setup.py +314 -41
  34. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/cli/commands/adapters.py +2 -0
  35. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/cli/commands/backlog.py +535 -49
  36. raise_cli-3.1.0a3/src/raise_cli/cli/commands/connect.py +196 -0
  37. raise_cli-3.1.0a3/src/raise_cli/cli/commands/db.py +302 -0
  38. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/cli/commands/discover.py +22 -4
  39. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/cli/commands/docs.py +83 -30
  40. raise_cli-3.1.0a3/src/raise_cli/cli/commands/docs_type.py +192 -0
  41. raise_cli-3.1.0a3/src/raise_cli/cli/commands/governance.py +194 -0
  42. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/cli/commands/graph.py +722 -41
  43. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/cli/commands/init.py +235 -20
  44. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/cli/commands/learn.py +12 -11
  45. raise_cli-3.1.0a3/src/raise_cli/cli/commands/manifest.py +122 -0
  46. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/cli/commands/mission.py +99 -13
  47. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/cli/commands/pattern.py +170 -11
  48. raise_cli-3.1.0a3/src/raise_cli/cli/commands/project.py +486 -0
  49. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/cli/commands/release.py +11 -16
  50. raise_cli-3.1.0a3/src/raise_cli/cli/commands/repo.py +150 -0
  51. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/cli/commands/session.py +340 -53
  52. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/cli/commands/signal.py +14 -7
  53. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/cli/commands/skill.py +93 -5
  54. raise_cli-3.1.0a3/src/raise_cli/cli/commands/telemetry.py +455 -0
  55. raise_cli-3.1.0a3/src/raise_cli/cli/commands/whoami.py +75 -0
  56. raise_cli-3.1.0a3/src/raise_cli/cli/commands/worktree.py +291 -0
  57. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/cli/extensions.py +3 -2
  58. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/cli/main.py +25 -3
  59. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/config/agents.py +2 -2
  60. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/config/paths.py +26 -0
  61. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/context/builder.py +127 -24
  62. raise_cli-3.1.0a3/src/raise_cli/context/extractors/relationships.py +381 -0
  63. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/context/extractors/structure.py +13 -2
  64. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/context/loaders/architecture.py +7 -2
  65. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/context/loaders/memory.py +8 -2
  66. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/context/loaders/symbols.py +134 -48
  67. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/discovery/scanner.py +22 -0
  68. raise_cli-3.1.0a3/src/raise_cli/doctor/checks/adapters.py +375 -0
  69. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/doctor/checks/developer.py +98 -42
  70. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/doctor/checks/environment.py +12 -15
  71. raise_cli-3.1.0a3/src/raise_cli/doctor/checks/project.py +527 -0
  72. raise_cli-3.1.0a3/src/raise_cli/doctor/checks/runtimes.py +81 -0
  73. raise_cli-3.1.0a3/src/raise_cli/doctor/checks/skills.py +133 -0
  74. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/doctor/protocol.py +28 -3
  75. raise_cli-3.1.0a3/src/raise_cli/eval/__init__.py +46 -0
  76. raise_cli-3.1.0a3/src/raise_cli/eval/_models.py +24 -0
  77. raise_cli-3.1.0a3/src/raise_cli/eval/_paths.py +7 -0
  78. raise_cli-3.1.0a3/src/raise_cli/eval/cli.py +157 -0
  79. raise_cli-3.1.0a3/src/raise_cli/eval/datasets.py +78 -0
  80. raise_cli-3.1.0a3/src/raise_cli/eval/gate.py +98 -0
  81. raise_cli-3.1.0a3/src/raise_cli/eval/harness.py +101 -0
  82. raise_cli-3.1.0a3/src/raise_cli/eval/metrics.py +64 -0
  83. raise_cli-3.1.0a3/src/raise_cli/eval/reporters/__init__.py +1 -0
  84. raise_cli-3.1.0a3/src/raise_cli/eval/reporters/json_report.py +27 -0
  85. raise_cli-3.1.0a3/src/raise_cli/eval/reporters/latex.py +44 -0
  86. raise_cli-3.1.0a3/src/raise_cli/eval/reporters/markdown.py +37 -0
  87. raise_cli-3.1.0a3/src/raise_cli/eval/stats.py +35 -0
  88. raise_cli-3.1.0a3/src/raise_cli/eval/tuning.py +49 -0
  89. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/governance/extractor.py +2 -2
  90. raise_cli-3.1.0a3/src/raise_cli/governance/sync.py +203 -0
  91. raise_cli-3.1.0a3/src/raise_cli/graph/api_graph_read_backend.py +46 -0
  92. raise_cli-3.1.0a3/src/raise_cli/graph/backends/__init__.py +124 -0
  93. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/graph/backends/api.py +87 -18
  94. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/graph/backends/dual.py +104 -10
  95. raise_cli-3.1.0a3/src/raise_cli/graph/backends/kuzu.py +647 -0
  96. raise_cli-3.1.0a3/src/raise_cli/graph/backends/sqlite.py +495 -0
  97. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/graph/query_backend.py +26 -18
  98. raise_cli-3.1.0a3/src/raise_cli/hooks/builtin/graph_update.py +113 -0
  99. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/hud/panels/_insights_utils.py +10 -4
  100. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/hud/panels/insights.py +4 -4
  101. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/hud/panels/missions.py +2 -2
  102. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/hud/panels/session.py +2 -2
  103. raise_cli-3.1.0a3/src/raise_cli/memory/api_patterns_backend.py +74 -0
  104. raise_cli-3.1.0a3/src/raise_cli/memory/content_hash.py +28 -0
  105. raise_cli-3.1.0a3/src/raise_cli/memory/pattern_evaluator.py +238 -0
  106. raise_cli-3.1.0a3/src/raise_cli/memory/patterns_backend.py +525 -0
  107. raise_cli-3.1.0a3/src/raise_cli/memory/sync.py +630 -0
  108. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/memory/writer.py +8 -3
  109. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/onboarding/bootstrap.py +97 -0
  110. raise_cli-3.1.0a3/src/raise_cli/onboarding/cli_commands.yaml +87 -0
  111. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/onboarding/detection.py +18 -0
  112. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/onboarding/instructions.py +41 -181
  113. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/onboarding/manifest.py +63 -3
  114. raise_cli-3.1.0a3/src/raise_cli/onboarding/manifest_validate.py +102 -0
  115. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/onboarding/memory_md.py +3 -3
  116. raise_cli-3.1.0a3/src/raise_cli/onboarding/merge_conventions.py +54 -0
  117. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/onboarding/skill_manifest.py +1 -1
  118. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/onboarding/skills.py +24 -2
  119. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/output/console.py +2 -2
  120. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/output/formatters/graph.py +2 -1
  121. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/output/formatters/skill.py +2 -2
  122. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/output/symbols.py +24 -5
  123. raise_cli-3.1.0a3/src/raise_cli/pipeline/_mcp_decorators.py +16 -0
  124. raise_cli-3.1.0a3/src/raise_cli/pipeline/api_run_store.py +57 -0
  125. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/pipeline/mcp_server.py +4 -0
  126. raise_cli-3.1.0a3/src/raise_cli/pipeline/mcp_tools_backlog.py +218 -0
  127. raise_cli-3.1.0a3/src/raise_cli/pipeline/mcp_tools_docs.py +105 -0
  128. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/pipeline/mcp_tools_gate.py +2 -2
  129. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/pipeline/mcp_tools_pattern.py +6 -1
  130. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/pipeline/mcp_tools_pipeline.py +31 -29
  131. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/pipeline/mcp_tools_session.py +46 -3
  132. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/pipeline/pipelines_base/bugfix.yaml +44 -1
  133. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/pipeline/run_store.py +43 -41
  134. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/project.py +4 -1
  135. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/rai_base/framework/methodology.yaml +69 -5
  136. raise_cli-3.1.0a3/src/raise_cli/rai_base/governance/architecture/domain-model.md +34 -0
  137. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/rai_base/governance/architecture/system-context.md +19 -3
  138. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/rai_base/governance/architecture/system-design.md +9 -1
  139. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/rai_base/memory/patterns-base.jsonl +5 -0
  140. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/session/__init__.py +2 -0
  141. raise_cli-3.1.0a3/src/raise_cli/session/api_context_backend.py +37 -0
  142. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/session/bundle.py +119 -5
  143. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/session/bundle_data.py +202 -16
  144. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/session/bundle_formatters.py +90 -3
  145. raise_cli-3.1.0a3/src/raise_cli/session/bundle_governance.py +50 -0
  146. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/session/close.py +77 -1
  147. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/session/context_backend.py +31 -21
  148. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/session/derive.py +47 -1
  149. raise_cli-3.1.0a3/src/raise_cli/session/donor.py +225 -0
  150. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/session/index.py +24 -1
  151. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/session/mission_binding.py +9 -6
  152. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/session/state.py +9 -2
  153. raise_cli-3.1.0a3/src/raise_cli/skills/sync.py +220 -0
  154. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/__init__.py +16 -7
  155. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-architecture-review/SKILL.md +25 -3
  156. raise_cli-3.1.0a3/src/raise_cli/skills_base/rai-backlog-setup/SKILL.md +242 -0
  157. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-bugfix-analyse/SKILL.md +6 -0
  158. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-bugfix-close/SKILL.md +7 -1
  159. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-bugfix-fix/SKILL.md +25 -1
  160. raise_cli-3.1.0a3/src/raise_cli/skills_base/rai-bugfix-pir/SKILL.md +302 -0
  161. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-bugfix-plan/SKILL.md +22 -1
  162. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-bugfix-review/SKILL.md +10 -0
  163. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-bugfix-start/SKILL.md +4 -0
  164. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-bugfix-triage/SKILL.md +4 -0
  165. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-debug/SKILL.md +8 -2
  166. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-discover/SKILL.md +11 -2
  167. raise_cli-3.1.0a3/src/raise_cli/skills_base/rai-docs-setup/SKILL.md +393 -0
  168. raise_cli-3.1.0a3/src/raise_cli/skills_base/rai-docs-setup-advanced/SKILL.md +386 -0
  169. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-docs-update/SKILL.md +3 -1
  170. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-doctor/SKILL.md +14 -2
  171. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-epic-close/SKILL.md +16 -6
  172. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-epic-design/SKILL.md +30 -7
  173. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-epic-docs/SKILL.md +3 -1
  174. raise_cli-3.1.0a3/src/raise_cli/skills_base/rai-epic-journal/SKILL.md +192 -0
  175. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-epic-plan/SKILL.md +16 -7
  176. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-epic-start/SKILL.md +32 -10
  177. raise_cli-3.1.0a3/src/raise_cli/skills_base/rai-epic-ux-design/SKILL.md +138 -0
  178. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-mcp-add/SKILL.md +1 -1
  179. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-mcp-remove/SKILL.md +2 -2
  180. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-mcp-status/SKILL.md +6 -2
  181. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-mission-close/SKILL.md +84 -1
  182. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-mr-create/SKILL.md +8 -2
  183. raise_cli-3.1.0a3/src/raise_cli/skills_base/rai-onboard-repo/SKILL.md +398 -0
  184. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-problem-shape/SKILL.md +2 -0
  185. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-project-create/SKILL.md +14 -6
  186. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-project-onboard/SKILL.md +8 -0
  187. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-quality-review/SKILL.md +14 -3
  188. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-research/SKILL.md +2 -0
  189. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-session-close/SKILL.md +104 -1
  190. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-session-diary/SKILL.md +8 -3
  191. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-session-start/SKILL.md +113 -37
  192. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-skill-create/SKILL.md +3 -1
  193. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-skillset-manage/SKILL.md +3 -3
  194. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-story-close/SKILL.md +57 -4
  195. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-story-design/SKILL.md +25 -9
  196. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-story-implement/SKILL.md +69 -7
  197. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-story-plan/SKILL.md +18 -7
  198. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-story-review/SKILL.md +15 -1
  199. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-story-start/SKILL.md +60 -2
  200. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-welcome/SKILL.md +26 -3
  201. raise_cli-3.1.0a3/src/raise_cli/skills_base/rai-worktree-close/SKILL.md +288 -0
  202. raise_cli-3.1.0a3/src/raise_cli/skills_base/rai-worktree-open/SKILL.md +325 -0
  203. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/storage/connection.py +48 -4
  204. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/storage/migrate.py +107 -9
  205. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/storage/missions.py +62 -15
  206. raise_cli-3.1.0a3/src/raise_cli/storage/schema.py +1062 -0
  207. raise_cli-3.1.0a3/src/raise_cli/storage/worktrees.py +190 -0
  208. raise_cli-3.1.0a3/src/raise_cli/telemetry/attribution.py +209 -0
  209. raise_cli-3.1.0a3/src/raise_cli/telemetry/backfill.py +170 -0
  210. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/telemetry/emitter.py +6 -0
  211. raise_cli-3.1.0a3/src/raise_cli/telemetry/session_tokens.py +249 -0
  212. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/viz/generator.py +86 -22
  213. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/work_events/schemas.py +1 -0
  214. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/work_events/translator.py +54 -24
  215. raise_cli-3.0.0a6/src/raise_cli/adapters/confluence_adapter.py +0 -175
  216. raise_cli-3.0.0a6/src/raise_cli/cli/commands/db.py +0 -144
  217. raise_cli-3.0.0a6/src/raise_cli/cli/commands/telemetry.py +0 -228
  218. raise_cli-3.0.0a6/src/raise_cli/context/extractors/relationships.py +0 -258
  219. raise_cli-3.0.0a6/src/raise_cli/doctor/checks/adapters.py +0 -406
  220. raise_cli-3.0.0a6/src/raise_cli/doctor/checks/project.py +0 -279
  221. raise_cli-3.0.0a6/src/raise_cli/doctor/checks/runtimes.py +0 -69
  222. raise_cli-3.0.0a6/src/raise_cli/graph/backends/__init__.py +0 -69
  223. raise_cli-3.0.0a6/src/raise_cli/graph/backends/sqlite.py +0 -162
  224. raise_cli-3.0.0a6/src/raise_cli/memory/patterns_backend.py +0 -316
  225. raise_cli-3.0.0a6/src/raise_cli/pipeline/mcp_tools_backlog.py +0 -118
  226. raise_cli-3.0.0a6/src/raise_cli/rai_base/governance/architecture/domain-model.md +0 -20
  227. raise_cli-3.0.0a6/src/raise_cli/skills_base/rai-adapter-setup/SKILL.md +0 -125
  228. raise_cli-3.0.0a6/src/raise_cli/skills_base/rai-backlog-setup/SKILL.md +0 -169
  229. raise_cli-3.0.0a6/src/raise_cli/storage/schema.py +0 -439
  230. raise_cli-3.0.0a6/src/raise_cli/telemetry/session_tokens.py +0 -112
  231. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/__init__.py +0 -0
  232. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/__main__.py +0 -0
  233. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/_cc_session.py +0 -0
  234. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/adapters/__init__.py +0 -0
  235. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/adapters/backlog_config.py +0 -0
  236. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/adapters/confluence_discovery.py +0 -0
  237. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/adapters/confluence_exceptions.py +0 -0
  238. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/adapters/declarative/__init__.py +0 -0
  239. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/adapters/declarative/discovery.py +0 -0
  240. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/adapters/declarative/expressions.py +0 -0
  241. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/adapters/declarative/reference/__init__.py +0 -0
  242. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/adapters/declarative/reference/github.yaml +0 -0
  243. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/adapters/declarative/schema.py +0 -0
  244. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/adapters/filesystem_adapter.py +0 -0
  245. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/adapters/filesystem_docs.py +0 -0
  246. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/adapters/filesystem_models.py +0 -0
  247. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/adapters/jira_config.py +0 -0
  248. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/adapters/jira_config_gen.py +0 -0
  249. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/adapters/jira_discovery.py +0 -0
  250. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/adapters/jira_exceptions.py +0 -0
  251. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/adapters/mcp_bridge.py +0 -0
  252. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/adapters/models/docs.py +0 -0
  253. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/adapters/models/governance.py +0 -0
  254. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/adapters/models/health.py +0 -0
  255. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/adapters/pending_ops.py +0 -0
  256. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/adapters/registry.py +0 -0
  257. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/adapters/sync_ledger.py +0 -0
  258. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/agents/__init__.py +0 -0
  259. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/agents/antigravity.yaml +0 -0
  260. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/agents/codex.yaml +0 -0
  261. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/agents/copilot.yaml +0 -0
  262. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/agents/copilot_plugin.py +0 -0
  263. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/agents/cursor.yaml +0 -0
  264. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/agents/hermes.yaml +0 -0
  265. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/agents/roo.yaml +0 -0
  266. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/agents/windsurf.yaml +0 -0
  267. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/artifacts/__init__.py +0 -0
  268. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/artifacts/models.py +0 -0
  269. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/artifacts/render.py +0 -0
  270. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/artifacts/store.py +0 -0
  271. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/backlog/__init__.py +0 -0
  272. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/backlog/ledger.py +0 -0
  273. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/backlog/reconcile.py +0 -0
  274. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/backlog/scanner.py +0 -0
  275. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/backlog/sync.py +0 -0
  276. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/cli/__init__.py +0 -0
  277. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/cli/commands/__init__.py +0 -0
  278. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/cli/commands/_resolve.py +0 -0
  279. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/cli/commands/base.py +0 -0
  280. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/cli/commands/doctor.py +0 -0
  281. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/cli/commands/drift.py +0 -0
  282. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/cli/commands/gate.py +0 -0
  283. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/cli/commands/hud.py +0 -0
  284. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/cli/commands/info.py +0 -0
  285. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/cli/commands/journal.py +0 -0
  286. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/cli/commands/mcp.py +0 -0
  287. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/cli/commands/memory.py +0 -0
  288. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/cli/commands/profile.py +0 -0
  289. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/cli/commands/schema.py +0 -0
  290. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/cli/commands/skill_set.py +0 -0
  291. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/cli/error_handler.py +0 -0
  292. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/compat.py +0 -0
  293. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/compliance/__init__.py +0 -0
  294. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/compliance/controls.yaml +0 -0
  295. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/compliance/evidence.py +0 -0
  296. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/compliance/extractors/__init__.py +0 -0
  297. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/compliance/extractors/git.py +0 -0
  298. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/compliance/loader.py +0 -0
  299. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/compliance/models.py +0 -0
  300. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/config/__init__.py +0 -0
  301. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/config/agent_plugin.py +0 -0
  302. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/config/agent_registry.py +0 -0
  303. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/config/ide.py +0 -0
  304. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/config/settings.py +0 -0
  305. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/context/__init__.py +0 -0
  306. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/context/analyzers/__init__.py +0 -0
  307. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/context/analyzers/models.py +0 -0
  308. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/context/analyzers/protocol.py +0 -0
  309. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/context/analyzers/python.py +0 -0
  310. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/context/analyzers/signals.py +0 -0
  311. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/context/analyzers/typescript.py +0 -0
  312. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/context/diff.py +0 -0
  313. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/context/extractors/__init__.py +0 -0
  314. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/context/extractors/skills.py +0 -0
  315. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/context/loaders/__init__.py +0 -0
  316. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/context/loaders/components.py +0 -0
  317. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/context/loaders/documents.py +0 -0
  318. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/context/loaders/identity.py +0 -0
  319. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/context/loaders/missions.py +0 -0
  320. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/core/__init__.py +0 -0
  321. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/core/files.py +0 -0
  322. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/core/text.py +0 -0
  323. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/core/tools.py +0 -0
  324. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/discovery/__init__.py +0 -0
  325. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/discovery/analyzer.py +0 -0
  326. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/discovery/check.py +0 -0
  327. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/discovery/clone.py +0 -0
  328. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/discovery/corpus.py +0 -0
  329. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/discovery/drift.py +0 -0
  330. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/discovery/metric.py +0 -0
  331. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/discovery/sast.py +0 -0
  332. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/discovery/temporal.py +0 -0
  333. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/discovery/thresholds.py +0 -0
  334. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/docs/__init__.py +0 -0
  335. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/docs/migrate.py +0 -0
  336. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/doctor/__init__.py +0 -0
  337. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/doctor/checks/__init__.py +0 -0
  338. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/doctor/fix.py +0 -0
  339. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/doctor/models.py +0 -0
  340. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/doctor/registry.py +0 -0
  341. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/doctor/report.py +0 -0
  342. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/doctor/runner.py +0 -0
  343. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/engines/__init__.py +0 -0
  344. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/exceptions.py +0 -0
  345. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/gates/__init__.py +0 -0
  346. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/gates/ar/__init__.py +0 -0
  347. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/gates/ar/bugfix_gate.py +0 -0
  348. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/gates/ar/story_gate.py +0 -0
  349. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/gates/builtin/__init__.py +0 -0
  350. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/gates/builtin/_runner.py +0 -0
  351. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/gates/builtin/coverage.py +0 -0
  352. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/gates/builtin/format.py +0 -0
  353. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/gates/builtin/lint.py +0 -0
  354. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/gates/builtin/tests.py +0 -0
  355. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/gates/builtin/types.py +0 -0
  356. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/gates/drift/__init__.py +0 -0
  357. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/gates/drift/_base.py +0 -0
  358. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/gates/drift/auth_fan_out.py +0 -0
  359. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/gates/drift/dead_public_api.py +0 -0
  360. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/gates/drift/epic_close.py +0 -0
  361. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/gates/drift/import_fan_in.py +0 -0
  362. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/gates/drift/linter_suppression.py +0 -0
  363. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/gates/drift/parallel_siblings.py +0 -0
  364. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/gates/drift/post_refactor_orphan.py +0 -0
  365. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/gates/drift/story_accretion.py +0 -0
  366. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/gates/hook.py +0 -0
  367. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/gates/models.py +0 -0
  368. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/gates/protocol.py +0 -0
  369. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/gates/registry.py +0 -0
  370. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/governance/__init__.py +0 -0
  371. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/governance/models.py +0 -0
  372. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/governance/parsers/__init__.py +0 -0
  373. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/governance/parsers/_convert.py +0 -0
  374. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/governance/parsers/adr.py +0 -0
  375. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/governance/parsers/backlog.py +0 -0
  376. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/governance/parsers/constitution.py +0 -0
  377. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/governance/parsers/epic.py +0 -0
  378. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/governance/parsers/glossary.py +0 -0
  379. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/governance/parsers/guardrails.py +0 -0
  380. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/governance/parsers/prd.py +0 -0
  381. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/governance/parsers/roadmap.py +0 -0
  382. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/governance/parsers/vision.py +0 -0
  383. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/graph/__init__.py +0 -0
  384. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/graph/backends/pending.py +0 -0
  385. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/handlers/__init__.py +0 -0
  386. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/hooks/__init__.py +0 -0
  387. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/hooks/builtin/__init__.py +0 -0
  388. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/hooks/builtin/gate_bridge.py +0 -0
  389. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/hooks/builtin/memory.py +0 -0
  390. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/hooks/builtin/telemetry.py +0 -0
  391. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/hooks/emitter.py +0 -0
  392. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/hooks/events.py +0 -0
  393. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/hooks/protocol.py +0 -0
  394. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/hooks/registry.py +0 -0
  395. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/hud/__init__.py +0 -0
  396. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/hud/app.py +0 -0
  397. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/hud/data.py +0 -0
  398. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/hud/hud.tcss +0 -0
  399. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/hud/panels/__init__.py +0 -0
  400. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/hud/panels/_events_utils.py +0 -0
  401. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/hud/panels/_missions_utils.py +0 -0
  402. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/hud/panels/events.py +0 -0
  403. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/hud/panels/pipeline.py +0 -0
  404. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/mcp/__init__.py +0 -0
  405. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/mcp/bridge.py +0 -0
  406. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/mcp/models.py +0 -0
  407. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/mcp/registry.py +0 -0
  408. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/mcp/schema.py +0 -0
  409. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/memory/__init__.py +0 -0
  410. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/memory/learning.py +0 -0
  411. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/memory/loader.py +0 -0
  412. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/memory/memory_index.py +0 -0
  413. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/memory/migrate_claude.py +0 -0
  414. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/memory/migration.py +0 -0
  415. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/memory/models.py +0 -0
  416. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/memory/push.py +0 -0
  417. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/onboarding/__init__.py +0 -0
  418. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/onboarding/claudemd.py +0 -0
  419. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/onboarding/conventions.py +0 -0
  420. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/onboarding/governance.py +0 -0
  421. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/onboarding/migration.py +0 -0
  422. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/onboarding/profile.py +0 -0
  423. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/onboarding/profile_portability.py +0 -0
  424. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/onboarding/skill_conflict.py +0 -0
  425. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/onboarding/workflows.py +0 -0
  426. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/output/__init__.py +0 -0
  427. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/output/formatters/__init__.py +0 -0
  428. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/output/formatters/adapters.py +0 -0
  429. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/output/formatters/discover.py +0 -0
  430. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/pipeline/__init__.py +0 -0
  431. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/pipeline/_mcp_instance.py +0 -0
  432. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/pipeline/_telemetry.py +0 -0
  433. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/pipeline/dispatch.py +0 -0
  434. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/pipeline/engine.py +0 -0
  435. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/pipeline/executor.py +0 -0
  436. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/pipeline/gates.py +0 -0
  437. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/pipeline/loader.py +0 -0
  438. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/pipeline/mcp_tools_artifact.py +0 -0
  439. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/pipeline/mcp_tools_graph.py +0 -0
  440. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/pipeline/pipelines_base/epic.yaml +0 -0
  441. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/pipeline/pipelines_base/hotfix.yaml +0 -0
  442. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/pipeline/pipelines_base/story.yaml +0 -0
  443. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/pipeline/prompt.py +0 -0
  444. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/pipeline/templates/adversarial-ar.md +0 -0
  445. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/pipeline/templates/adversarial-qr.md +0 -0
  446. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/pipeline/worktree.py +0 -0
  447. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/publish/__init__.py +0 -0
  448. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/publish/changelog.py +0 -0
  449. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/publish/check.py +0 -0
  450. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/publish/version.py +0 -0
  451. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/rai_base/__init__.py +0 -0
  452. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/rai_base/framework/__init__.py +0 -0
  453. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/rai_base/governance/__init__.py +0 -0
  454. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/rai_base/governance/architecture/__init__.py +0 -0
  455. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/rai_base/governance/architecture/domain-model.yaml +0 -0
  456. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/rai_base/governance/architecture/system-context.yaml +0 -0
  457. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/rai_base/governance/architecture/system-design.yaml +0 -0
  458. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/rai_base/governance/backlog.md +0 -0
  459. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/rai_base/governance/guardrails.md +0 -0
  460. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/rai_base/governance/prd.md +0 -0
  461. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/rai_base/governance/vision.md +0 -0
  462. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/rai_base/identity/__init__.py +0 -0
  463. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/rai_base/identity/core.md +0 -0
  464. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/rai_base/identity/core.yaml +0 -0
  465. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/rai_base/identity/perspective.md +0 -0
  466. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/rai_base/memory/__init__.py +0 -0
  467. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/schemas/__init__.py +0 -0
  468. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/schemas/journal.py +0 -0
  469. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/schemas/session_state.py +0 -0
  470. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/session/context_env.py +0 -0
  471. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/session/doctor.py +0 -0
  472. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/session/identity.py +0 -0
  473. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/session/journal.py +0 -0
  474. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/session/measure.py +0 -0
  475. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/session/mission.py +0 -0
  476. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/session/monitor.py +0 -0
  477. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/session/prefix.py +0 -0
  478. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/session/protocols.py +0 -0
  479. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/session/registry.py +0 -0
  480. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/session/resolver.py +0 -0
  481. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/session/terminal.py +0 -0
  482. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills/__init__.py +0 -0
  483. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills/locator.py +0 -0
  484. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills/name_checker.py +0 -0
  485. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills/parser.py +0 -0
  486. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills/scaffold.py +0 -0
  487. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills/schema.py +0 -0
  488. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills/skillsets.py +0 -0
  489. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills/validator.py +0 -0
  490. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/contract-template.md +0 -0
  491. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/preamble.md +0 -0
  492. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-epic-close/templates/retrospective.md +0 -0
  493. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-epic-design/templates/design.md +0 -0
  494. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-epic-design/templates/scope.md +0 -0
  495. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-epic-plan/_references/sequencing-strategies.md +0 -0
  496. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-epic-plan/templates/plan-section.md +0 -0
  497. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-epic-start/templates/brief.md +0 -0
  498. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-research/references/research-prompt-template.md +0 -0
  499. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-story-design/references/tech-design-story-v2.md +0 -0
  500. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/skills_base/rai-story-start/templates/story.md +0 -0
  501. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/storage/__init__.py +0 -0
  502. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/storage/consolidate.py +0 -0
  503. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/storage/counter.py +0 -0
  504. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/storage/schema_sum.py +0 -0
  505. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/telemetry/__init__.py +0 -0
  506. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/telemetry/phase_map.py +0 -0
  507. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/telemetry/schemas.py +0 -0
  508. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/tier/__init__.py +0 -0
  509. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/tier/context.py +0 -0
  510. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/viz/__init__.py +0 -0
  511. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/work_events/__init__.py +0 -0
  512. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/work_events/backfill.py +0 -0
  513. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/work_events/ref_resolver.py +0 -0
  514. {raise_cli-3.0.0a6 → raise_cli-3.1.0a3}/src/raise_cli/work_events/retry_queue.py +0 -0
@@ -1,3 +1,6 @@
1
+ # Node.js
2
+ node_modules/
3
+
1
4
  # IDE / editor directories
2
5
  .specstory/
3
6
  .cursor/
@@ -62,6 +65,7 @@ dev/output/
62
65
 
63
66
  # RaiSE global SQLite DB (per-machine, not shared)
64
67
  .raise/rai/raise.db
68
+ .raise/raise.db
65
69
 
66
70
  # RaiSE mission migration artifacts
67
71
  .raise/rai/missions/*.migrated
@@ -99,8 +103,8 @@ dist/
99
103
  downloads/
100
104
  eggs/
101
105
  .eggs/
102
- lib/
103
- lib64/
106
+ /lib/
107
+ /lib64/
104
108
  parts/
105
109
  sdist/
106
110
  var/
@@ -149,6 +153,7 @@ dmypy.json
149
153
  .env
150
154
  .env.*
151
155
  !.env.example
156
+ !.env.production
152
157
  *.pem
153
158
  *.key
154
159
  .pypirc
@@ -194,3 +199,16 @@ dev/transcripts/
194
199
  .worktrees/
195
200
  .venv
196
201
  .venv
202
+ work/debug/
203
+
204
+ # Playwright E2E auth state (contains session cookies)
205
+ packages/raise-admin/e2e/.auth/
206
+ # Playwright test results
207
+ packages/raise-admin/test-results/
208
+ packages/raise-admin/playwright-report/
209
+
210
+ # Forge raise-jira app — generated files
211
+ forge/raise-jira/static/raise-app/package-lock.json
212
+ forge/raise-jira/static/raise-app/pnpm-workspace.yaml
213
+ packages/raise-cli/.raise/sync/backlog-dead-letter.jsonl
214
+ package-lock.json
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: raise-cli
3
- Version: 3.0.0a6
3
+ Version: 3.1.0a3
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
@@ -20,6 +20,7 @@ Classifier: Topic :: Software Development :: Quality Assurance
20
20
  Requires-Python: >=3.12
21
21
  Requires-Dist: atlassian-python-api>=3.41.0
22
22
  Requires-Dist: httpx<1.0,>=0.27.0
23
+ Requires-Dist: kuzu>=0.11.0
23
24
  Requires-Dist: logfire-api>=4.0
24
25
  Requires-Dist: markdown>=3.6
25
26
  Requires-Dist: mcp<2,>=1.26
@@ -28,7 +29,7 @@ Requires-Dist: pydantic-settings>=2.2.0
28
29
  Requires-Dist: pydantic>=2.6.0
29
30
  Requires-Dist: python-dotenv>=1.0.0
30
31
  Requires-Dist: pyyaml>=6.0.1
31
- Requires-Dist: raise-core>=3.0.0a3
32
+ Requires-Dist: raise-core>=3.0.0
32
33
  Requires-Dist: rich>=13.7.0
33
34
  Requires-Dist: tree-sitter-javascript>=0.25.0
34
35
  Requires-Dist: tree-sitter-language-pack>=0.13.0
@@ -41,6 +42,9 @@ Provides-Extra: atlassian
41
42
  Provides-Extra: confluence
42
43
  Provides-Extra: csharp
43
44
  Requires-Dist: tree-sitter-c-sharp>=0.23.1; extra == 'csharp'
45
+ Provides-Extra: eval
46
+ Requires-Dist: ranx<0.4,>=0.3.20; extra == 'eval'
47
+ Requires-Dist: scipy>=1.10; extra == 'eval'
44
48
  Provides-Extra: go
45
49
  Requires-Dist: tree-sitter-go>=0.25.0; extra == 'go'
46
50
  Provides-Extra: hud
@@ -99,7 +103,7 @@ Windows (PowerShell):
99
103
 
100
104
  ```powershell
101
105
  cd your-project
102
- irm https://docs.raiseframework.ai/install.ps1 | iex
106
+ powershell -ExecutionPolicy ByPass -c "irm https://docs.raiseframework.ai/install.ps1 | iex"
103
107
  ```
104
108
 
105
109
  ### Manual install
@@ -43,7 +43,7 @@ Windows (PowerShell):
43
43
 
44
44
  ```powershell
45
45
  cd your-project
46
- irm https://docs.raiseframework.ai/install.ps1 | iex
46
+ powershell -ExecutionPolicy ByPass -c "irm https://docs.raiseframework.ai/install.ps1 | iex"
47
47
  ```
48
48
 
49
49
  ### Manual install
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "raise-cli"
3
- version = "3.0.0a6"
3
+ version = "3.1.0a3"
4
4
  description = "RaiSE CLI - Reliable AI Software Engineering governance framework"
5
5
  authors = [
6
6
  {name = "Emilio Osorio", email = "emilio@humansys.ai"}
@@ -21,7 +21,7 @@ classifiers = [
21
21
  ]
22
22
 
23
23
  dependencies = [
24
- "raise-core>=3.0.0a3",
24
+ "raise-core>=3.0.0",
25
25
  "typer>=0.12.0",
26
26
  "rich>=13.7.0",
27
27
  "pydantic>=2.6.0",
@@ -40,6 +40,7 @@ dependencies = [
40
40
  "mcp>=1.26,<2",
41
41
  "markdown>=3.6",
42
42
  "atlassian-python-api>=3.41.0",
43
+ "kuzu>=0.11.0",
43
44
  ]
44
45
 
45
46
  [project.optional-dependencies]
@@ -60,6 +61,10 @@ go = [
60
61
  hud = [
61
62
  "textual>=0.86,<1.0",
62
63
  ]
64
+ eval = [
65
+ "ranx>=0.3.20,<0.4",
66
+ "scipy>=1.10",
67
+ ]
63
68
  # Backwards-compat aliases — atlassian-python-api is now installed by default (RAISE-1912).
64
69
  atlassian = []
65
70
  confluence = []
@@ -89,7 +94,7 @@ glossary = "raise_cli.governance.parsers.glossary:GlossaryParser"
89
94
  [project.entry-points."rai.hooks"]
90
95
  telemetry = "raise_cli.hooks.builtin.telemetry:TelemetryHook"
91
96
  gate-bridge = "raise_cli.hooks.builtin.gate_bridge:GateBridgeHook"
92
- work-events = "raise_cli.work_events.emitter:ServerEmitHook"
97
+ graph-auto-update = "raise_cli.hooks.builtin.graph_update:GraphAutoUpdateHook"
93
98
 
94
99
  [project.entry-points."rai.gates"]
95
100
  tests = "raise_cli.gates.builtin.tests:TestGate"
@@ -107,6 +112,7 @@ drift-auth-fan-out = "raise_cli.gates.drift.auth_fan_out:AuthorizationFanOutGate
107
112
  ar-story = "raise_cli.gates.ar.story_gate:ArchitectureReviewGate"
108
113
  ar-bugfix = "raise_cli.gates.ar.bugfix_gate:BugfixArchitectureReviewGate"
109
114
  epic-close-drift = "raise_cli.gates.drift.epic_close:EpicCloseGate"
115
+ eval = "raise_cli.eval.gate:EvalGate"
110
116
 
111
117
  [project.entry-points."rai.doctor.checks"]
112
118
  environment = "raise_cli.doctor.checks.environment:EnvironmentCheck"
@@ -114,6 +120,7 @@ project = "raise_cli.doctor.checks.project:ProjectCheck"
114
120
  developer = "raise_cli.doctor.checks.developer:DeveloperCheck"
115
121
  adapters = "raise_cli.doctor.checks.adapters:AdapterDoctorCheck"
116
122
  runtimes = "raise_cli.doctor.checks.runtimes:RuntimesCheck"
123
+ skills = "raise_cli.doctor.checks.skills:SkillCommandReferenceCheck"
117
124
 
118
125
  [project.entry-points."rai.adapters.pm"]
119
126
  filesystem = "raise_cli.adapters.filesystem:FilesystemPMAdapter"
@@ -3,6 +3,7 @@
3
3
  Resolution order:
4
4
  1. RAISE_AGENT_SESSION_ID (explicit, set by any runtime adapter)
5
5
  2. RAISE_CC_SESSION_ID (Claude Code backward compat)
6
+ 2.5. CLAUDE_CODE_SESSION_ID (CC-native; always injected into Bash tool env)
6
7
  3. CC port discovery (CLAUDE_CODE_SSE_PORT → cc.port, unambiguous match only)
7
8
  4. Terminal bindings (PPID ancestry → _terminal_bindings.json)
8
9
  """
@@ -14,6 +15,7 @@ import os
14
15
  from pathlib import Path
15
16
 
16
17
  _SESSIONS_DIR = Path(".raise") / "rai" / "sessions"
18
+ _CLAUDE_WORKTREES_DIR = Path(".claude") / "worktrees"
17
19
 
18
20
 
19
21
  def discover_agent_session_id() -> str | None:
@@ -30,6 +32,10 @@ def discover_agent_session_id() -> str | None:
30
32
  if cc_sid:
31
33
  return cc_sid
32
34
 
35
+ native_sid = os.environ.get("CLAUDE_CODE_SESSION_ID", "").strip()
36
+ if native_sid:
37
+ return native_sid
38
+
33
39
  port_sid = _discover_via_cc_port()
34
40
  if port_sid:
35
41
  return port_sid
@@ -65,6 +71,9 @@ def discover_agent_runtime() -> str:
65
71
  if os.environ.get("RAISE_CC_SESSION_ID", "").strip():
66
72
  return "claude_code"
67
73
 
74
+ if os.environ.get("CLAUDE_CODE_SESSION_ID", "").strip():
75
+ return "claude_code"
76
+
68
77
  if _discover_via_cc_port():
69
78
  return "claude_code"
70
79
 
@@ -86,19 +95,34 @@ def _discover_via_cc_port() -> str | None:
86
95
  port = os.environ.get("CLAUDE_CODE_SSE_PORT", "").strip()
87
96
  if not port:
88
97
  return None
89
- sessions_dir = Path.cwd() / _SESSIONS_DIR
90
- if not sessions_dir.exists():
91
- return None
92
98
  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
+ for sessions_dir in _candidate_session_dirs(Path.cwd()):
100
+ for sess_dir in sessions_dir.iterdir():
101
+ if not sess_dir.is_dir():
102
+ continue
103
+ port_file = sess_dir / "cc.port"
104
+ if port_file.exists() and port_file.read_text().strip() == port:
105
+ matches.append(sess_dir.name)
99
106
  return matches[0] if len(matches) == 1 else None
100
107
 
101
108
 
109
+ def _candidate_session_dirs(root: Path) -> list[Path]:
110
+ """Return session directories relevant from an MCP server CWD."""
111
+ candidates: list[Path] = []
112
+ local_sessions = root / _SESSIONS_DIR
113
+ if local_sessions.exists():
114
+ candidates.append(local_sessions)
115
+
116
+ worktrees_root = root / _CLAUDE_WORKTREES_DIR
117
+ if worktrees_root.exists():
118
+ for worktree in sorted(worktrees_root.iterdir()):
119
+ sessions_dir = worktree / _SESSIONS_DIR
120
+ if sessions_dir.exists():
121
+ candidates.append(sessions_dir)
122
+
123
+ return candidates
124
+
125
+
102
126
  def _get_parent_pid(pid: int) -> int | None:
103
127
  """Return the parent PID of *pid* via /proc (Linux only)."""
104
128
  try:
@@ -12,9 +12,10 @@ S1700.6 — Retrofit with PendingOpsLog:
12
12
  - Before each publish, attempt best-effort flush of existing pending ops.
13
13
  - `pending_ops=None` preserves pre-S1700.6 behavior (backward compat).
14
14
 
15
- S20.2Sync manifest:
16
- - After each successful remote publish, update .raise/sync/docs-manifest.yaml.
17
- - `project_root=None` skips manifest write (backward compat).
15
+ RAISE-5618Docs sync state in SQLite:
16
+ - After each successful remote publish, persist local_path → remote_id/url/updated_at in SQLite.
17
+ - Lazy migration imports existing .raise/sync/docs-manifest.yaml entries on first write.
18
+ - `project_root=None` skips sync state write (backward compat).
18
19
 
19
20
  RAISE-1051 (S1051.7) | RAISE-1795 (S1700.6) | RAISE-3414 (S20.2)
20
21
  """
@@ -40,6 +41,54 @@ from raise_cli.adapters.pending_ops import PendingOpsLog
40
41
  logger = logging.getLogger(__name__)
41
42
 
42
43
 
44
+ def migrate_docs_yaml_to_sqlite(project_root: Path) -> None:
45
+ """Lazy one-time migration: import valid YAML entries to SQLite, skip stale paths.
46
+
47
+ No-op when the YAML manifest does not exist or SQLite already has entries.
48
+ """
49
+ manifest_path = project_root / ".raise" / "sync" / "docs-manifest.yaml"
50
+ if not manifest_path.exists():
51
+ return
52
+ from raise_cli.storage.connection import get_project_db, get_project_id
53
+ from raise_cli.storage.schema import create_all
54
+
55
+ db = get_project_db(project_root)
56
+ create_all(db)
57
+ pid = get_project_id(project_root)
58
+ count = db.execute(
59
+ "SELECT COUNT(*) FROM docs_sync WHERE project_id = ?", (pid,)
60
+ ).fetchone()[0]
61
+ if count > 0:
62
+ db.close()
63
+ return
64
+ try:
65
+ data: dict[str, Any] = (
66
+ yaml.safe_load(manifest_path.read_text(encoding="utf-8")) or {}
67
+ )
68
+ except Exception:
69
+ db.close()
70
+ return
71
+ for key, meta in data.items():
72
+ if not isinstance(meta, dict):
73
+ continue
74
+ if not Path(key).exists():
75
+ continue
76
+ db.execute(
77
+ "INSERT OR IGNORE INTO docs_sync"
78
+ " (local_path, remote_id, url, updated_at, project_id)"
79
+ " VALUES (?, ?, ?, ?, ?)",
80
+ (
81
+ key,
82
+ str(meta.get("remote_id", "")),
83
+ str(meta.get("url", "")),
84
+ str(meta.get("updated_at", "")),
85
+ pid,
86
+ ),
87
+ )
88
+ db.commit()
89
+ db.close()
90
+
91
+
43
92
  class CompositeDocTarget:
44
93
  """Delegates to multiple DocumentationTargets.
45
94
 
@@ -82,19 +131,26 @@ class CompositeDocTarget:
82
131
  # S1700.6: best-effort flush of pending ops (non-blocking)
83
132
  self._flush_pending()
84
133
 
134
+ # RAISE-5894: inject remote_id from docs_sync so remote adapter can PUT by ID
135
+ local_path = metadata.get("path")
136
+ if local_path:
137
+ stored_id = self._load_remote_id(str(local_path))
138
+ if stored_id:
139
+ metadata = {**metadata, "remote_id": stored_id}
140
+
85
141
  results, failures, fs_result, remote_failed = self._publish_to_targets(
86
142
  doc_type, content, metadata
87
143
  )
88
144
 
89
- # S20.2: update sync manifest when remote publish succeeded
145
+ # RAISE-5618: persist sync state to SQLite when remote publish succeeded
90
146
  if not remote_failed and results:
91
147
  remote_result = results[-1]
92
148
  local_path = metadata.get("path")
93
149
  if remote_result.success and local_path:
94
150
  try:
95
- self._update_sync_manifest(str(local_path), remote_result)
151
+ self._save_docs_sync(str(local_path), remote_result)
96
152
  except Exception:
97
- logger.warning("Failed to update sync manifest", exc_info=True)
153
+ logger.warning("Failed to save docs sync state", exc_info=True)
98
154
 
99
155
  # S1700.6: queue pending op when filesystem (canonical) succeeded but remote failed
100
156
  if (
@@ -169,25 +225,56 @@ class CompositeDocTarget:
169
225
  )
170
226
  return best
171
227
 
172
- def _update_sync_manifest(
173
- self, local_path: str, remote_result: PublishResult
174
- ) -> None:
175
- """Write .raise/sync/docs-manifest.yaml after a successful remote publish."""
228
+ def _load_remote_id(self, local_path: str) -> str | None:
229
+ """Return remote_id from docs_sync for local_path, or None if not found."""
230
+ if self._project_root is None:
231
+ return None
232
+ from raise_cli.storage.connection import get_project_db, get_project_id
233
+ from raise_cli.storage.schema import create_all
234
+
235
+ db = get_project_db(self._project_root)
236
+ create_all(db)
237
+ pid = get_project_id(self._project_root)
238
+ row = db.execute(
239
+ "SELECT remote_id FROM docs_sync WHERE local_path = ? AND project_id = ?",
240
+ (local_path, pid),
241
+ ).fetchone()
242
+ db.close()
243
+ return row[0] if row and row[0] else None
244
+
245
+ def _save_docs_sync(self, local_path: str, remote_result: PublishResult) -> None:
246
+ """Persist docs sync state to SQLite after a successful remote publish."""
176
247
  if self._project_root is None:
177
248
  return
178
- manifest_path = self._project_root / ".raise" / "sync" / "docs-manifest.yaml"
179
- manifest_path.parent.mkdir(parents=True, exist_ok=True)
180
- data: dict[str, Any] = {}
181
- if manifest_path.exists():
182
- data = yaml.safe_load(manifest_path.read_text(encoding="utf-8")) or {}
183
- data[local_path] = {
184
- "remote_id": remote_result.remote_id,
185
- "url": remote_result.url,
186
- "updated_at": datetime.now(UTC).replace(microsecond=0).isoformat(),
187
- }
188
- with open(manifest_path, "w", encoding="utf-8") as f:
189
- f.write("# Auto-managed by rai docs — do not edit manually\n")
190
- yaml.dump(data, f, default_flow_style=False, sort_keys=True)
249
+ from raise_cli.storage.connection import get_project_db, get_project_id
250
+ from raise_cli.storage.schema import create_all
251
+
252
+ self._migrate_yaml_to_sqlite()
253
+ db = get_project_db(self._project_root)
254
+ create_all(db)
255
+ pid = get_project_id(self._project_root)
256
+ db.execute(
257
+ "INSERT INTO docs_sync (local_path, remote_id, url, updated_at, project_id)"
258
+ " VALUES (?, ?, ?, ?, ?)"
259
+ " ON CONFLICT(local_path, project_id) DO UPDATE SET"
260
+ " remote_id = excluded.remote_id,"
261
+ " url = excluded.url,"
262
+ " updated_at = excluded.updated_at",
263
+ (
264
+ local_path,
265
+ remote_result.remote_id or "",
266
+ remote_result.url or "",
267
+ datetime.now(UTC).replace(microsecond=0).isoformat(),
268
+ pid,
269
+ ),
270
+ )
271
+ db.commit()
272
+ db.close()
273
+
274
+ def _migrate_yaml_to_sqlite(self) -> None:
275
+ """Lazy one-time migration: import valid YAML entries to SQLite, skip stale paths."""
276
+ if self._project_root is not None:
277
+ migrate_docs_yaml_to_sqlite(self._project_root)
191
278
 
192
279
  def _flush_pending(self) -> None:
193
280
  """Attempt to replay pending ops against remote. Best-effort, never raises."""
@@ -12,18 +12,23 @@ Design decision D1: read-local (inverse of CompositeDocTarget which reads remote
12
12
 
13
13
  from __future__ import annotations
14
14
 
15
+ import contextlib
15
16
  import logging
16
17
  from collections.abc import Callable
17
18
  from datetime import UTC, datetime
19
+ from pathlib import Path
18
20
  from typing import Any
19
21
  from uuid import uuid4
20
22
 
21
23
  from raise_cli.adapters.filesystem_models import BacklogItem
22
24
  from raise_cli.adapters.models import (
23
25
  AdapterHealth,
26
+ AttachmentDetail,
27
+ AttachmentRef,
24
28
  BatchResult,
25
29
  Comment,
26
30
  CommentRef,
31
+ FailureDetail,
27
32
  FieldDefinition,
28
33
  IssueDetail,
29
34
  IssueRef,
@@ -64,6 +69,11 @@ class CompositeBacklogAdapter:
64
69
  self._ledger = ledger
65
70
  self._pending = pending
66
71
 
72
+ @property
73
+ def remotes(self) -> list[Any]:
74
+ """Remote adapters in write order."""
75
+ return list(self._remotes)
76
+
67
77
  # -------------------------------------------------------------------
68
78
  # Locality probe (RAISE-1877)
69
79
  # -------------------------------------------------------------------
@@ -232,20 +242,44 @@ class CompositeBacklogAdapter:
232
242
  return local_ref
233
243
 
234
244
  def transition_issue(self, key: str, status: str) -> IssueRef:
235
- """Transition locally (when local-canonical), then best-effort on remotes."""
245
+ """Transition locally (when local-canonical), then propagate on remotes.
246
+
247
+ Remote-native keys (no local artifact, e.g. RAISE-xxx) call the remote
248
+ directly and propagate errors — queuing a failed transition for replay
249
+ makes no sense because transitions are context-dependent (RAISE-4140).
250
+
251
+ Local-canonical keys also propagate remote errors (RAISE-4186): if Jira
252
+ rejects the transition, the local state is rolled back (best-effort) and
253
+ the exception is re-raised so the caller sees a real failure instead of
254
+ a false-positive success.
255
+ """
236
256
  self._flush_pending()
237
257
  if self._local_has_key(key):
258
+ prev_status = self._local.get_issue(key).status
238
259
  local_ref: IssueRef = self._local.transition_issue(key, status)
239
- else:
240
- local_ref = IssueRef(key=key) # remote-native
241
260
 
242
- def _do_transition(remote: Any, rk: str) -> None:
243
- remote.transition_issue(rk, status)
261
+ def _do_transition(remote: Any, rk: str) -> None:
262
+ remote.transition_issue(rk, status)
244
263
 
245
- self._write_to_remotes_keyed(
246
- "transition_issue", key, {"status": status}, _do_transition
247
- )
248
- return local_ref
264
+ try:
265
+ self._write_to_remotes_keyed(
266
+ "transition_issue",
267
+ key,
268
+ {"status": status},
269
+ _do_transition,
270
+ propagate_errors=True,
271
+ )
272
+ except Exception:
273
+ with contextlib.suppress(Exception):
274
+ self._local.transition_issue(key, prev_status)
275
+ raise
276
+ return local_ref
277
+
278
+ # Remote-native: call directly so errors propagate to the caller.
279
+ remote_key = self._ledger.get(key) or key
280
+ for remote in self._remotes:
281
+ remote.transition_issue(remote_key, status)
282
+ return IssueRef(key=key)
249
283
 
250
284
  def batch_transition(self, keys: list[str], status: str) -> BatchResult:
251
285
  """Batch transition: local-canonical via filesystem, remote-native direct to remote."""
@@ -292,6 +326,24 @@ class CompositeBacklogAdapter:
292
326
  logger.warning("Remote batch_transition failed: %s", exc)
293
327
  return merged
294
328
 
329
+ def batch_create(self, issues: list[IssueSpec]) -> BatchResult:
330
+ """Create multiple issues with per-item fault isolation."""
331
+ succeeded: list[IssueRef] = []
332
+ failed: list[FailureDetail] = []
333
+ for spec in issues:
334
+ try:
335
+ ref = self.create_issue(spec.project, spec)
336
+ succeeded.append(ref)
337
+ except Exception as exc:
338
+ logger.warning("batch_create failed for %r: %s", spec.summary, exc)
339
+ failed.append(FailureDetail(key=spec.summary, error=str(exc)))
340
+ return BatchResult(succeeded=succeeded, failed=failed)
341
+
342
+ def remove_link(self, link_id: str) -> None:
343
+ """Remove an issue link by ID — delegates to remote only (IDs are remote-native)."""
344
+ for remote in self._remotes:
345
+ remote.remove_link(link_id)
346
+
295
347
  def link_to_parent(self, child_key: str, parent_key: str) -> None:
296
348
  """Link locally (when local-canonical), then best-effort on remotes."""
297
349
  self._flush_pending()
@@ -322,8 +374,12 @@ class CompositeBacklogAdapter:
322
374
  "link_to_parent", child_key, {"parent_key": parent_key}
323
375
  )
324
376
 
325
- def link_issues(self, source: str, target: str, link_type: str) -> None:
326
- """Link locally (when local-canonical), then best-effort on remotes."""
377
+ def link_issues(self, source: str, target: str, link_type: str) -> bool:
378
+ """Link locally (when local-canonical), then best-effort on remotes.
379
+
380
+ Returns True if the link was created on all remotes, False if any
381
+ remote failed and the operation was queued for later replay.
382
+ """
327
383
  self._flush_pending()
328
384
  if self._local_has_key(source) and self._local_has_key(target):
329
385
  self._local.link_issues(source, target, link_type)
@@ -334,6 +390,7 @@ class CompositeBacklogAdapter:
334
390
  target if not self._local_has_key(target) else None
335
391
  )
336
392
  if remote_source and remote_target:
393
+ queued = False
337
394
  for remote in self._remotes:
338
395
  try:
339
396
  remote.link_issues(remote_source, remote_target, link_type)
@@ -344,12 +401,14 @@ class CompositeBacklogAdapter:
344
401
  {"target": target, "link_type": link_type},
345
402
  )
346
403
  logger.warning("Remote link_issues failed: %s", exc)
347
- else:
348
- self._pending.append(
349
- "link_issues",
350
- source,
351
- {"target": target, "link_type": link_type},
352
- )
404
+ queued = True
405
+ return not queued
406
+ self._pending.append(
407
+ "link_issues",
408
+ source,
409
+ {"target": target, "link_type": link_type},
410
+ )
411
+ return False
353
412
 
354
413
  def add_comment(self, key: str, body: str) -> CommentRef:
355
414
  """Comment locally (when local-canonical), then best-effort on remotes."""
@@ -372,7 +431,7 @@ class CompositeBacklogAdapter:
372
431
  def get_issue(self, key: str) -> IssueDetail:
373
432
  """Read from local; fallback to remote for remote-native keys."""
374
433
  try:
375
- return self._local.get_issue(key) # type: ignore[no-any-return]
434
+ detail: IssueDetail = self._local.get_issue(key)
376
435
  except (KeyError, FileNotFoundError):
377
436
  if self._remotes:
378
437
  logger.debug(
@@ -380,6 +439,11 @@ class CompositeBacklogAdapter:
380
439
  )
381
440
  return self._remotes[0].get_issue(key) # type: ignore[no-any-return]
382
441
  raise
442
+ if detail.status == "pending" and self._remotes:
443
+ with contextlib.suppress(Exception):
444
+ remote: IssueDetail = self._remotes[0].get_issue(key)
445
+ return detail.model_copy(update={"status": remote.status})
446
+ return detail
383
447
 
384
448
  def get_comments(
385
449
  self, key: str, limit: int = 10, offset: int = 0, fetch_all: bool = False
@@ -452,6 +516,42 @@ class CompositeBacklogAdapter:
452
516
  names=names, issue_type=issue_type
453
517
  ) # type: ignore[no-any-return]
454
518
 
519
+ # ── Attachments (S2503.7) ────────────────────────────────────────
520
+
521
+ def attach(
522
+ self, key: str, path: Path, mime_type: str | None = None
523
+ ) -> AttachmentRef:
524
+ """Delegate to primary remote; raise if no remotes."""
525
+ if not self._remotes:
526
+ raise RuntimeError("No remote adapters available for attach()")
527
+ return self._remotes[0].attach(key, path, mime_type) # type: ignore[no-any-return]
528
+
529
+ def get_attachments(self, key: str) -> list[AttachmentDetail]:
530
+ """Delegate to primary remote; return [] if no remotes."""
531
+ if not self._remotes:
532
+ return []
533
+ return self._remotes[0].get_attachments(key) # type: ignore[no-any-return]
534
+
535
+ # ── Sprint (Jira-specific) — delegate to primary remote ──────────
536
+
537
+ def get_sprints(self, project_key: str, state: str | None = None) -> list[Any]:
538
+ """Delegate to primary remote; raise if no remotes."""
539
+ if not self._remotes:
540
+ raise RuntimeError("No remote adapters available for get_sprints()")
541
+ return self._remotes[0].get_sprints(project_key, state=state) # type: ignore[no-any-return]
542
+
543
+ def assign_to_sprint(self, issue_key: str, sprint_id: int) -> None:
544
+ """Delegate to primary remote; raise if no remotes."""
545
+ if not self._remotes:
546
+ raise RuntimeError("No remote adapters available for assign_to_sprint()")
547
+ self._remotes[0].assign_to_sprint(issue_key, sprint_id) # type: ignore[no-any-return]
548
+
549
+ def download_attachment(self, attachment_id: str) -> bytes:
550
+ """Delegate to primary remote; raise if no remotes."""
551
+ if not self._remotes:
552
+ raise RuntimeError("No remote adapters available for download_attachment()")
553
+ return self._remotes[0].download_attachment(attachment_id) # type: ignore[no-any-return]
554
+
455
555
  # -------------------------------------------------------------------
456
556
  # Drain — replay queued pending ops (S1700.7.1)
457
557
  # -------------------------------------------------------------------
@@ -723,6 +823,8 @@ class CompositeBacklogAdapter:
723
823
  local_key: str,
724
824
  args: dict[str, Any],
725
825
  action: _RemoteAction,
826
+ *,
827
+ propagate_errors: bool = False,
726
828
  ) -> None:
727
829
  """Execute a keyed write op on all remotes using ledger for key translation.
728
830
 
@@ -762,11 +864,13 @@ class CompositeBacklogAdapter:
762
864
  action(remote, remote_key)
763
865
  completed.append(i)
764
866
  except Exception as exc:
867
+ logger.warning("Remote %s failed: %s", op_name, exc)
868
+ if propagate_errors:
869
+ raise
765
870
  self._pending.append(
766
871
  op_name,
767
872
  local_key,
768
873
  args,
769
874
  completed_remotes=completed,
770
875
  )
771
- logger.warning("Remote %s failed: %s", op_name, exc)
772
876
  break