orbi-cli 0.6.1__tar.gz → 0.6.2__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 (154) hide show
  1. {orbi_cli-0.6.1/src/orbi_cli.egg-info → orbi_cli-0.6.2}/PKG-INFO +1 -1
  2. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/pyproject.toml +1 -1
  3. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/__init__.py +1 -1
  4. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/pi_session.py +1 -1
  5. {orbi_cli-0.6.1 → orbi_cli-0.6.2/src/orbi_cli.egg-info}/PKG-INFO +1 -1
  6. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_pi_command.py +5 -4
  7. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_pi_extensions.py +22 -3
  8. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/LICENSE +0 -0
  9. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/README.md +0 -0
  10. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/docs/licenses/sustainable-use-license.md +0 -0
  11. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/setup.cfg +0 -0
  12. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/branch_reclaim.py +0 -0
  13. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/checks.py +0 -0
  14. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/claim.py +0 -0
  15. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/clarify.py +0 -0
  16. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/cli.py +0 -0
  17. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/cli_source.py +0 -0
  18. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/config.py +0 -0
  19. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/delivery_labels.py +0 -0
  20. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/delivery_scene.py +0 -0
  21. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/engine_source.py +0 -0
  22. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/example_config.toml +0 -0
  23. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/failure.py +0 -0
  24. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/failure_report.py +0 -0
  25. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/git_identity.py +0 -0
  26. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/git_transport.py +0 -0
  27. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/github.py +0 -0
  28. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/gitops.py +0 -0
  29. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/human_review.py +0 -0
  30. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/journal.py +0 -0
  31. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/launchd_deploy.py +0 -0
  32. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/merge_gate.py +0 -0
  33. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/merge_handoff.py +0 -0
  34. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/milestone.py +0 -0
  35. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/milestone_command.py +0 -0
  36. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/pi_activity.py +0 -0
  37. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/pi_command.py +0 -0
  38. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/pi_process.py +0 -0
  39. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/pi_recovery.py +0 -0
  40. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/pilot_setup.py +0 -0
  41. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/pilot_slots.py +0 -0
  42. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/progress.py +0 -0
  43. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/release.py +0 -0
  44. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/release_git.py +0 -0
  45. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/release_notes.py +0 -0
  46. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/repo_config.py +0 -0
  47. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/runner.py +0 -0
  48. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/runner_health.py +0 -0
  49. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/scene.py +0 -0
  50. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/scheduler.py +0 -0
  51. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/scheduler_units.py +0 -0
  52. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/source_pool.py +0 -0
  53. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/systemd_deploy.py +0 -0
  54. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi/ticket_command.py +0 -0
  55. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi_cli.egg-info/SOURCES.txt +0 -0
  56. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi_cli.egg-info/dependency_links.txt +0 -0
  57. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi_cli.egg-info/entry_points.txt +0 -0
  58. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/src/orbi_cli.egg-info/top_level.txt +0 -0
  59. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_agents_md.py +0 -0
  60. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_apply_label_patch.py +0 -0
  61. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_bootstrap_runner.py +0 -0
  62. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_branch_reclaim.py +0 -0
  63. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_ci_failure_issue_workflow.py +0 -0
  64. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_ci_failure_triage.py +0 -0
  65. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_ci_macos_workflow.py +0 -0
  66. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_ci_workflow.py +0 -0
  67. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_clarify.py +0 -0
  68. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_claude_plugin.py +0 -0
  69. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_cli_install.py +0 -0
  70. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_cli_milestone.py +0 -0
  71. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_cli_packaging.py +0 -0
  72. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_cli_source.py +0 -0
  73. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_comment_readers_contract.py +0 -0
  74. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_concurrency_e2e.py +0 -0
  75. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_constitution.py +0 -0
  76. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_coverage_gate.py +0 -0
  77. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_deliver_pr_fakes.py +0 -0
  78. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_delivery_branch_delete.py +0 -0
  79. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_delivery_labels.py +0 -0
  80. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_delivery_scene.py +0 -0
  81. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_docker_docs.py +0 -0
  82. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_docker_entrypoint.py +0 -0
  83. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_docker_image_workflow.py +0 -0
  84. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_docs_i18n.py +0 -0
  85. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_docs_issue_shapes.py +0 -0
  86. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_docs_labels.py +0 -0
  87. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_docs_mermaid.py +0 -0
  88. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_docs_releases.py +0 -0
  89. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_docs_single_source.py +0 -0
  90. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_docs_site.py +0 -0
  91. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_engine_source.py +0 -0
  92. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_failure.py +0 -0
  93. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_failure_report.py +0 -0
  94. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_fix_needed_loop.py +0 -0
  95. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_gh_read_retry.py +0 -0
  96. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_git_base_smoke.py +0 -0
  97. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_git_merge_smoke.py +0 -0
  98. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_git_network_retry.py +0 -0
  99. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_git_transport.py +0 -0
  100. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_github.py +0 -0
  101. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_github_fakes.py +0 -0
  102. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_gitops.py +0 -0
  103. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_gitops_fakes.py +0 -0
  104. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_human_review.py +0 -0
  105. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_import_graph.py +0 -0
  106. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_install_sh.py +0 -0
  107. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_issue_1367.py +0 -0
  108. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_issue_461.py +0 -0
  109. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_issue_template_config.py +0 -0
  110. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_journal.py +0 -0
  111. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_journal_events.py +0 -0
  112. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_launchd_deploy.py +0 -0
  113. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_license.py +0 -0
  114. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_milestone_command.py +0 -0
  115. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_ops_e2e.py +0 -0
  116. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_orbi.py +0 -0
  117. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_orbi_dashboard.py +0 -0
  118. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_orbi_exporter.py +0 -0
  119. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_patch_ratchet.py +0 -0
  120. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_pi_activity.py +0 -0
  121. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_pi_provider_templates.py +0 -0
  122. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_pi_recovery.py +0 -0
  123. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_pi_session.py +0 -0
  124. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_pilot_setup.py +0 -0
  125. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_pilot_slots.py +0 -0
  126. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_pr_issue_link_workflow.py +0 -0
  127. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_prerequisite_check.py +0 -0
  128. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_progress.py +0 -0
  129. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_progress_wiring.py +0 -0
  130. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_prompt_contract.py +0 -0
  131. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_publish_workflow.py +0 -0
  132. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_release_docs_workflow.py +0 -0
  133. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_release_ticket_templates.py +0 -0
  134. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_repo_config.py +0 -0
  135. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_resume_continue_e2e.py +0 -0
  136. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_resume_e2e.py +0 -0
  137. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_resume_pr.py +0 -0
  138. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_review_merge.py +0 -0
  139. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_run_artifacts.py +0 -0
  140. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_run_id_e2e.py +0 -0
  141. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_runner_config.py +0 -0
  142. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_runner_health.py +0 -0
  143. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_runner_source_freshness.py +0 -0
  144. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_scene.py +0 -0
  145. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_scheduler.py +0 -0
  146. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_size_ratchet.py +0 -0
  147. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_src_layout.py +0 -0
  148. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_steering_review.py +0 -0
  149. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_suite_hygiene.py +0 -0
  150. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_systemd_deploy.py +0 -0
  151. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_systemd_timer.py +0 -0
  152. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_ticket_command.py +0 -0
  153. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_user_acceptance_contract.py +0 -0
  154. {orbi_cli-0.6.1 → orbi_cli-0.6.2}/tests/test_worktree_reclaim.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: orbi-cli
3
- Version: 0.6.1
3
+ Version: 0.6.2
4
4
  Summary: Orbi — local AI development worker: claims GitHub Issues, runs Pi in isolated worktrees, and delivers PRs (GitHub Issues + labels are the only state store).
5
5
  Author: xqliu
6
6
  License-Expression: AGPL-3.0-only OR LicenseRef-Sustainable-Use-1.0
@@ -44,7 +44,7 @@ build-backend = "setuptools.build_meta"
44
44
 
45
45
  [project]
46
46
  name = "orbi-cli"
47
- version = "0.6.1"
47
+ version = "0.6.2"
48
48
  description = "Orbi — local AI development worker: claims GitHub Issues, runs Pi in isolated worktrees, and delivers PRs (GitHub Issues + labels are the only state store)."
49
49
  readme = "README.md"
50
50
  requires-python = ">=3.14"
@@ -18,4 +18,4 @@ the package would shadow the installed package for every process with
18
18
  the checkout root on sys.path. The direct-execution compatibility entry
19
19
  is `python3 -m orbi.cli` (development path only).
20
20
  """
21
- __version__ = "0.6.1"
21
+ __version__ = "0.6.2"
@@ -857,7 +857,7 @@ def run_ticket_agent(
857
857
  config, ROLE_TICKET, IMPLEMENT_EXCLUDED_SKILLS, session_dir,
858
858
  system_prompt, context,
859
859
  context_placeholder="<issue-context-redacted>",
860
- tools=False, extensions=False,
860
+ tools=False, extensions=True,
861
861
  )
862
862
  # Startup phase: the provider config is loaded and resolved
863
863
  # before the spawn; a configured provider file is materialized
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: orbi-cli
3
- Version: 0.6.1
3
+ Version: 0.6.2
4
4
  Summary: Orbi — local AI development worker: claims GitHub Issues, runs Pi in isolated worktrees, and delivers PRs (GitHub Issues + labels are the only state store).
5
5
  Author: xqliu
6
6
  License-Expression: AGPL-3.0-only OR LicenseRef-Sustainable-Use-1.0
@@ -63,17 +63,18 @@ def test_ticket_command_and_log_with_everything_configured():
63
63
  pi_command.IMPLEMENT_EXCLUDED_SKILLS, SESSION_DIR,
64
64
  SYSTEM_PROMPT, CONTEXT,
65
65
  context_placeholder="<issue-context-redacted>",
66
- tools=False, extensions=False,
66
+ tools=False, extensions=True,
67
67
  )
68
68
  assert command == [
69
- "pi", "--no-tools", *IMPLEMENT_SKILL_ARGS,
69
+ "pi", "--no-tools", *EXTENSION_ARGS, *IMPLEMENT_SKILL_ARGS,
70
70
  "--provider", "openai", "--model", "gpt-5.6-sol",
71
71
  "--thinking", "medium",
72
72
  "--print", "--session-dir", str(SESSION_DIR),
73
73
  "--system-prompt", SYSTEM_PROMPT, CONTEXT,
74
74
  ]
75
75
  assert log_command == [
76
- "pi", "--provider", "openai", "--model", "gpt-5.6-sol",
76
+ "pi", *EXTENSION_ARGS,
77
+ "--provider", "openai", "--model", "gpt-5.6-sol",
77
78
  "--thinking", "medium",
78
79
  "--print", "--session-dir", str(SESSION_DIR),
79
80
  "--system-prompt", "<redacted>", "<issue-context-redacted>",
@@ -131,7 +132,7 @@ def test_review_command_and_log_with_everything_configured():
131
132
  "placeholder", "expect_no_tools"),
132
133
  [
133
134
  (pi_command.ROLE_TICKET, pi_command.IMPLEMENT_EXCLUDED_SKILLS,
134
- False, False, "<issue-context-redacted>", True),
135
+ False, True, "<issue-context-redacted>", True),
135
136
  (ROLE_IMPLEMENT, pi_command.IMPLEMENT_EXCLUDED_SKILLS,
136
137
  True, True, "<issue-context-redacted>", False),
137
138
  (pi_command.ROLE_REVIEW, pi_command.REVIEW_EXCLUDED_SKILLS,
@@ -76,16 +76,35 @@ def test_pi_extension_args_and_env_isolate_disabled_and_secrets():
76
76
  assert "secret" not in " ".join(args)
77
77
 
78
78
 
79
- def test_run_pi_and_review_share_extension_contract(monkeypatch, tmp_path):
79
+ def test_run_pi_review_and_ticket_share_extension_contract(monkeypatch, tmp_path):
80
80
  (tmp_path / "prompt.md").write_text("system", encoding="utf-8")
81
81
  (tmp_path / "prompt_review.md").write_text("review", encoding="utf-8")
82
+ disabled = tmp_path / "disabled.mjs"
83
+ disabled.write_text("export default () => {}", encoding="utf-8")
82
84
  calls = []
83
85
  monkeypatch.setattr(pi_session, "stream_pi", lambda command, **kw: calls.append((command, kw)) or "ok")
84
- config = config_domain.RunnerConfig(prompt=tmp_path / "prompt.md", prompt_review=tmp_path / "prompt_review.md", repo_dir=tmp_path, source_repos=("owner/repo",), workspace_root=tmp_path, context_files=(), skills=(), base_branch="main", base_sha="abc", run_id="deadbeef", pi_extensions=({"source": "npm:fixture@1.2.3", "enabled": True, "env": {"FIXTURE_TOKEN": "secret"}},))
86
+ config = config_domain.RunnerConfig(prompt=tmp_path / "prompt.md", prompt_review=tmp_path / "prompt_review.md", repo_dir=tmp_path, source_repos=("owner/repo",), workspace_root=tmp_path, context_files=(), skills=(), base_branch="main", base_sha="abc", run_id="deadbeef", pi_extensions=({"source": "npm:fixture@1.2.3", "enabled": True, "env": {"FIXTURE_TOKEN": "secret"}}, {"source": str(disabled), "enabled": False, "env": {}}))
87
+ extension_args = pi_command._pi_extension_args(config)
88
+ assert extension_args == ["--no-extensions", "--extension", "npm:fixture@1.2.3"]
85
89
  pi_session.run_pi({"number": 1, "title": "t", "body": ""}, RunContext(run_id=config.run_id, issue={"number": 1, "title": "t", "body": ""}["number"], branch="b", worktree=tmp_path, source_repo="owner/repo"), config)
86
90
  pi_session.run_review(RunContext(run_id=config.run_id, issue=1, branch="b", worktree=tmp_path, source_repo="owner/repo"), {"number": 1, "url": "u", "base_oid": "b", "head_oid": "h", "head_ref": "r"}, config, 1)
87
91
  for command, kwargs in calls:
88
- assert command[1:4] == ["--no-extensions", "--extension", "npm:fixture@1.2.3"]
92
+ assert command[1:4] == extension_args
89
93
  assert kwargs["pi_env"] == {"FIXTURE_TOKEN": "secret"}
90
94
  assert "secret" not in " ".join(kwargs["log_command"])
91
95
  assert kwargs["log_command"][1:4] == command[1:4]
96
+ assert len(calls) == 2
97
+ # The ticket role (#1558) keeps the --no-tools boundary and passes the
98
+ # SAME isolated extension flags implement/review use.
99
+ pi_session.run_ticket_agent(
100
+ {"number": 1558, "title": "t", "body": ""}, config, "owner/repo",
101
+ )
102
+ command, kwargs = calls[2]
103
+ assert command[:2 + len(extension_args)] == [
104
+ "pi", "--no-tools", *extension_args,
105
+ ]
106
+ assert kwargs["log_command"][:1 + len(extension_args)] == [
107
+ "pi", *extension_args,
108
+ ]
109
+ assert kwargs["pi_env"] == {"FIXTURE_TOKEN": "secret"}
110
+ assert "secret" not in " ".join(kwargs["log_command"])
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes