swarph-cli 0.72.39__tar.gz → 0.72.41__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.
- {swarph_cli-0.72.39/src/swarph_cli.egg-info → swarph_cli-0.72.41}/PKG-INFO +1 -1
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/pyproject.toml +1 -1
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/__init__.py +1 -1
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/board.py +272 -38
- swarph_cli-0.72.41/src/swarph_cli/commands/dev_extract.py +829 -0
- swarph_cli-0.72.41/src/swarph_cli/commands/skunkworks.py +280 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/guide/GUIDE.md +3 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/main.py +2 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41/src/swarph_cli.egg-info}/PKG-INFO +1 -1
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli.egg-info/SOURCES.txt +6 -0
- swarph_cli-0.72.41/tests/test_1396_dev_extract.py +2175 -0
- swarph_cli-0.72.41/tests/test_1405_skunkworks_basic.py +86 -0
- swarph_cli-0.72.41/tests/test_1405_skunkworks_cli.py +245 -0
- swarph_cli-0.72.41/tests/test_1427_membrane_workflow.py +240 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/LICENSE +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/README.md +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/setup.cfg +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/__main__.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/bench/__init__.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/bench/backends.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/bench/claude_cli.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/bench/codex_cli.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/bench/pack.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/bench/prices.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/bench/providers.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/bench/quality.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/bench/refresh_prices.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/bench/rules.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/bench/runner.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/bench/signal_score.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/bench/validate.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/caller.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/capture/__init__.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/capture/harden.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/capture/lineage.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/capture/liveness.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/capture/manifest.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/capture/paths.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/capture/verify.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/cell.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/chain_token.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/channel.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/__init__.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/_content.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/_display.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/_gateway_client.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/add.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/bench.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/board_cost.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/board_merge_check.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/board_usage.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/brain.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/brain_ask.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/cell.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/cell_probe.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/cell_selfcheck.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/channel.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/chat.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/codegraph.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/codegraph_hook.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/codex_hook_output.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/codex_waker.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/commander.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/committee.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/compress.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/daemon.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/dreaming.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/event.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/gateway.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/gh_route.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/group.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/guide.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/highlight.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/hook_interpreter.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/hook_output.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/hooks.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/import_session.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/init.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/install_codex_hooks.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/install_hook.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/install_multiplexer.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/install_opencode_plugin.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/install_postcompact_hook.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/install_wake_hook.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/lane.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/mcp_server.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/memory.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/memory_emit_hook.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/memory_sync.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/mesh.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/monitor.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/okf_links.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/onboard.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/peer_reply_drain.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/postcompact_hook_output.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/protocol_handler.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/ratify.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/roster.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/rowclear_hook.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/schedule.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/security.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/service.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/spawn.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/sweep.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/timeline.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/triage.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/version.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/wake_hook_output.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/watchdog.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commit_trailers.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/compress/__init__.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/compress/levers.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/compress/marker.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/compress/verify.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/console_safe.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/delivery_queue.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/dm_frame.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/dreaming/__init__.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/dreaming/candidates.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/dreaming/clone.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/dreaming/enrich.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/dreaming/index_check.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/dreaming/notify.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/dreaming/organize.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/dreaming/probes.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/dreaming/report.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/dreaming/run.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/dreaming/slm.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/dreaming/transcripts.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/dreaming/verify.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/duplicate_session.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/gateway/__init__.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/gateway/feature_registry.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/gateway/lanes_control.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/gateway/schema.sql +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/gateway/server.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/gateway/services_control.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/gateway_default.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/gh_identity.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/identity.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/launchd/swarph-codex-outbox.plist +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/launchd/swarph-codex-outbox.timer.plist +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/launchd/swarph-monitor.plist +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/launchd/swarph-watchdog.plist +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/launchd/swarph-watchdog.timer.plist +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/launchd_render.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/multiplexer.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/operator/__init__.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/operator/__main__.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/operator/api.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/operator/cli.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/operator/config.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/operator/fmt.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/orphan_daemons.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/pane_probe.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/parsers/__init__.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/parsers/claude.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/payloads/opencode/plugin.js +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/payloads/postcompact/_shim.cmd +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/payloads/postcompact/postcompact-recall-grok.sh +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/payloads/postcompact/postcompact-recall.sh +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/payloads/postcompact/posttooluse-emit-antigravity.sh +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/payloads/postcompact/posttooluse-emit-claude.sh +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/payloads/postcompact/posttooluse-emit-grok.sh +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/payloads/postcompact/posttooluse-emit.sh +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/payloads/postcompact/posttooluse-recall.sh +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/payloads/postcompact/precompact-flag.sh +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/payloads/postcompact/preinvocation-recall-antigravity.sh +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/payloads/postcompact/sessionstart-recall.sh +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/peer_executor.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/peer_executor_windows.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/peer_reconciliation.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/peer_reply_outbox.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/peer_service_host.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/peer_service_payload.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/peer_service_reply.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/peer_staging.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/query_filters.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/quota_sync.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/redact.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/rowclear.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/scripts/__init__.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/scripts/dm_notify_filter.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/scripts/ensure_monitor.sh +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/scripts/install_codex_waker_windows.ps1 +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/scripts/install_monitor_task_windows.ps1 +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/scripts/wake_watchdog.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/scrub.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/service/__init__.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/service/app.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/service/providers.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/session_bridge.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/skills/i-have-adhd/LICENSE +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/skills/i-have-adhd/SKILL.md +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/source_text.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/stall_alert.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/systemd/codex-waker.default +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/systemd/peer-reply-drain.default +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/systemd/swarph-codex-outbox@.service +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/systemd/swarph-codex-outbox@.timer +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/systemd/swarph-codex-waker@.service +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/systemd/swarph-codex-waker@.timer +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/systemd/swarph-monitor-reexec.path +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/systemd/swarph-monitor-reexec.service +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/systemd/swarph-monitor@.service +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/systemd/swarph-peer-reply-drain@.service +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/systemd/swarph-peer-reply-drain@.timer +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/systemd/swarph-stuck-sweep.service +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/systemd/swarph-stuck-sweep.timer +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/systemd/swarph-triage.service +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/systemd/swarph-triage.timer +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/systemd/swarph-watchdog.default +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/systemd/swarph-watchdog.service +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/systemd/swarph-watchdog.timer +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/the_ten.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/timeline_paths.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/tokens.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/triage/__init__.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/triage/backend.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/triage/job.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/triage/owners.json +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/triage/router.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/triage/rows.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/triage/sensor.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli.egg-info/dependency_links.txt +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli.egg-info/entry_points.txt +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli.egg-info/requires.txt +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli.egg-info/top_level.txt +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1006_board_publisher.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1006_session_board.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1010_strand_only.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1013_spawn_channel.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1017_muse_tui.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1034_copy_mode.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1050_surrogate_wake.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1052_opencode_deaf.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1059_watchdog_unread_env.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1061_roster_cli.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1064_stuck_sweep.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1065_release.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1066_quiet_wakes.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1068_structured_accept_cli.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1071_quota_sync.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1073_triage.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1073_triage_board.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1073_wheel_install.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1075_task_cli.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1083_openai_decisions.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1144_cell_yaml_github.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1197_commander_taps.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1203_swarph_me_refusal.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1206_offer_question.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1214_egress.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1219_egress_probe.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1221_quota_windows.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1222_maybe_start_cap.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1228_quota_reach.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1243_the_ten.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1248_ship_price_table.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_124_register_merge.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1250_price_cache.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1256_commander_wake.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1261_mcp_install.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1262_wake_followups.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1265_wake_note.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1269_triage_label.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_126_pending_from_complete.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1277_close_usage.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1278_dreaming_reach.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1286_dm_unread_cursor.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1297_commander.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1300_authorization_check.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1301_restart_skew.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1320_commit_trailers.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1321_layered_redaction.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_132_ensure_monitor_state_dir.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1340_router_rollout.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1346_shell_string_gh.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1347_shell_depth_cap.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1353_obligation_release_cli.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1385_duplicate_session_argv.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_138_memory_navigate.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_139_tool_probe.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_183_card_anchor.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_184_notify_honesty.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_201_win32_bash_refusal.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_243_onboard_per_peer_token.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_307_task4_ask_reply.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_312_codegraph_fuzzy_verb.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_3130_sender.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_3150_identity_router_install.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_319_refusal_exit_codes.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_323_mistral_backend.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_332_report_organize_findings.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_356_query_filters.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_397_gh_identity_router.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_397_router_preflight.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_402_one_identity_resolver.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_432_rowclear.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_467b_onboard_operator_credential.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_472_register_caller_binding.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_484_codex_queue_sink.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_513_duplicate_session.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_523_guide.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_524_conftest_hermeticity.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_532_accept_flag.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_535_version_capability.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_538_signal_bench.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_546_default_gateway.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_547_verbs_from_registry.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_548_gateway_remainder.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_552_codegraph_gateway.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_555_relay_row_shape.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_556_relay_freshness.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_559_edges_truncated.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_564_bootstrap_first_peer.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_578_no_machine_specific_host_defaults.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_579_register_bootstrap_message.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_591_cli_step_graph.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_644_monitor_supervision.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_648_install_unit.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_654_reexec.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_656_owned_slm.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_684_dreaming_verb.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_689_pkg_version_order.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_715_grok_wake.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_716_timeline_one_path.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_723_grok_0251.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_724_ps1_ascii_or_bom.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_725_stdio_reconfigure.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_726_grok_limit_screen.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_729_arm_check_delivery_gap.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_729_dm_once.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_729_wake_watchdog.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_734_dreaming_enrich_degrade.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_735_dm_mcp_tools.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_739_wake_writer.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_740_edit_project.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_762_cards_edit_priority.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_764_enrich_collapse.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_801_confirm_flow_cli.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_802_stage_history.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_825_codegraph_hook_noise.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_825_install_posttooluse_only.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_825_remaining_cap_shred_bind.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_829_counterfactual_column.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_830_hook_binding_version.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_84_cli_labels.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_866_doctrine_guide.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_872_identity_refuses_not_warns.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_874_source_text.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_888_opencode_data_dir_can_fail.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_931_board_search.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_935_deadline_clock.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_937_dreaming_notify.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_938_organize_line_limit.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_941_bench_backends.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_941_harness_342.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_945_same_line_pairing.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_955_prompt_audit.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_957_auth_http.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_959_venv_interpreter.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_960_channel.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_960_ensure_monitor_heartbeat.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_961_cursor_grok_footer.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_961_loud_stop.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_963_plugin_manifest.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_964_channel_cell.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_965_mesh_wait.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_975_channel_hop.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_add_security_gate.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_artifact_add.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_artifact_hash.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_artifact_lib.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_artifact_mcp.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_artifact_skill.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_artifact_tool.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_artifact_uri.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_bench_backends.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_bench_claude_cli.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_bench_codex_cli.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_bench_command.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_bench_pack.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_bench_prices.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_bench_quality.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_bench_runner.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_bench_validate.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_board_card_thread.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_board_command.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_board_merge_check.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_board_obligation_close.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_brain_ask_command.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_brain_ask_env_diagnosis.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_brain_ask_identity_explicitness.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_brain_command.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_caller_meta_guard.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_capture_lineage.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_capture_liveness.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_capture_manifest.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_capture_paths.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_capture_security.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_cell_command_dispatch.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_cell_harden.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_cell_loader.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_cell_selfcheck.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_cell_verify.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_chain_token.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_channel_command.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_channel_poll_never_breaks_dms.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_channel_post.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_channel_wake_policy_filter.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_chat_command.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_claude_parser.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_claude_tmux_template.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_codegraph_caller_scope.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_codegraph_command.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_codegraph_hook.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_codegraph_mcp.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_codex_waker.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_committee_command.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_compress_caller_convention.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_compress_command.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_compress_levers.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_compress_marker.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_compress_verify.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_console_encoding_e2e.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_content_composition.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_copilot_membrane.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_copilot_pane_reader.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_cursor_membrane.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_daemon_command.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_daemon_console_encoding.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_daemon_delivery.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_delivery_queue.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_display_sanitize.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_ensure_monitor_no_peer_default.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_event_emit.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_feature_to_uri.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_gateway_brain.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_gateway_client.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_gateway_command.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_gateway_message_idempotency.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_gh_route_doctor_mesh_name.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_group_command.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_guide_commands_parse.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_guide_selfcheck.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_heartbeat_check.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_highlight_command.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_hook_output.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_hooks_activity_marker.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_hooks_add.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_hooks_bundle.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_hooks_init.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_hooks_legacy_generation_removal.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_hooks_lifecycle.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_hooks_merge.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_hooks_verify.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_hooks_win32_bash_wrapper.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_hooks_win32_command_path.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_import_command.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_inbox_identity_provenance.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_init_command.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_init_provider_menu.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_install_codex_hooks.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_install_hook.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_install_multiplexer_command.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_install_postcompact_hook.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_install_wake_hook.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_lane_command.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_launchd_units.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_main.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_main_unknown_verb_guard.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_mcp_missing_hint.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_mcp_server.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_memory_command.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_memory_emit_snippet.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_memory_gateway.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_memory_sync.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_memory_sync_membrane.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_mesh_command.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_mesh_inbox_mark_read.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_mesh_inbox_sanitize.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_mesh_originate_thread_623.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_mesh_send_unknown_peer.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_mesh_sidecar.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_mesh_sidecar_cursor_decoupled.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_mesh_sidecar_muse_sink.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_mesh_sidecar_wake_survives_read.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_meta_edge_identity.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_monitor_channel_poll.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_monitor_cli.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_monitor_daemon_collision.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_monitor_self_name_verification.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_monitor_state_split.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_multiplexer.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_muse_membrane.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_muse_own_cli.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_obligation_close_is_surfaced.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_okf_links.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_onboard_command.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_opencode_membrane.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_opencode_plugin.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_operator_me.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_orphan_daemons.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_packaged_artifacts_exist.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_packaged_skills.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_peer_executor.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_peer_executor_windows.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_peer_reply_drain_command.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_peer_reply_drain_supervisor.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_peer_reply_outbox.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_peer_reply_transport.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_peer_service_e2e.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_peer_service_host.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_peer_service_payload.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_peer_service_reply.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_postcompact_recall.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_process_liveness.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_protocol_handler.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_providers_isolation.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_ratify_command.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_readme_claims_no_gateway_default.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_repl_caller_convention.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_schedule_command.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_schedule_create_contract.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_scrub.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_security.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_service_app.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_service_command.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_service_providers.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_session_bridge_inject.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_session_bridge_probe.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_session_bridge_resolve.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_session_path_role_gate.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_shipped_units_match_the_cli.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_smoke_chat.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_smoke_one_shot.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_smoke_phase_5_5.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_spawn_base_hoist.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_spawn_command.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_spawn_identity_stamp.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_spawn_live_pin.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_spawn_mitosis_lineage.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_spawn_tmux_session.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_spawn_windows_relaunch.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_stall_alert.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_subprocess_decode_encoding.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_timeline_command.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_tmux_wake_runstate_defer.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_tmux_wake_session_reanchor.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_tmux_wake_stale.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_tmux_wake_submit_verify.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_token_file_one_parser.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_token_precedence_explicit_first.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_unified_token_resolver.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_version_command.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_version_consistency.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_vibe_membrane.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_watchdog.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_watchdog_dm_wake.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_watchdog_dm_wake_cooldown.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_watchdog_dm_wake_wiring.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_watchdog_emit_health.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_watchdog_install_flags.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_watchdog_model_rung.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_watchdog_stale_peers.py +0 -0
- {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_windows_waker_installer.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: swarph-cli
|
|
3
|
-
Version: 0.72.
|
|
3
|
+
Version: 0.72.41
|
|
4
4
|
Summary: The `swarph` binary — a multi-LLM CLI and mesh-gateway client + bundled server (`swarph gateway`): one-shot prompts across providers, interactive `chat`, multi-provider `spawn` (claude/codex/antigravity via a ProviderMembrane with subprocess billing-scrub), `mesh` send/inbox/register, `brain-ask` over the swarph-brain (gbrain) semantic memory, git-backed `assisted_memory`, per-invocation `gh` identity routing, a silent DM-wake hook, session `import`, and a stranded-session `watchdog`.
|
|
5
5
|
Author: Pierre Samson, Claude Opus
|
|
6
6
|
License: MIT
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "swarph-cli"
|
|
7
|
-
version = "0.72.
|
|
7
|
+
version = "0.72.41"
|
|
8
8
|
description = "The `swarph` binary — a multi-LLM CLI and mesh-gateway client + bundled server (`swarph gateway`): one-shot prompts across providers, interactive `chat`, multi-provider `spawn` (claude/codex/antigravity via a ProviderMembrane with subprocess billing-scrub), `mesh` send/inbox/register, `brain-ask` over the swarph-brain (gbrain) semantic memory, git-backed `assisted_memory`, per-invocation `gh` identity routing, a silent DM-wake hook, session `import`, and a stranded-session `watchdog`."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = { text = "MIT" }
|
|
@@ -41,6 +41,7 @@ from swarph_cli.commands.mesh import (
|
|
|
41
41
|
_http_get_json,
|
|
42
42
|
_post_json,
|
|
43
43
|
_resolve_self_name,
|
|
44
|
+
_resolve_self_with_source,
|
|
44
45
|
_resolve_token,
|
|
45
46
|
)
|
|
46
47
|
from swarph_cli.redact import redact_text, redact_value, encode_outbound_json
|
|
@@ -509,6 +510,105 @@ def _thread_recipient(
|
|
|
509
510
|
)
|
|
510
511
|
|
|
511
512
|
|
|
513
|
+
def _peer_grants_url(gw: str, peer: str) -> str:
|
|
514
|
+
return (f"{gw.rstrip('/')}/peers/"
|
|
515
|
+
f"{urllib.parse.quote(peer, safe='')}/grants")
|
|
516
|
+
|
|
517
|
+
|
|
518
|
+
# Level rank shared with the gateway's RBAC union (server._GRANT_LEVEL_RANK):
|
|
519
|
+
# only used to pick the best matching grant for the why-line, never for
|
|
520
|
+
# the entitlement decision itself.
|
|
521
|
+
_DEV_EXTRACT_GRANT_RANK = {"member": 1, "read": 1, "propose": 2, "write": 2,
|
|
522
|
+
"execute": 3, "admin": 4}
|
|
523
|
+
|
|
524
|
+
|
|
525
|
+
def _dev_extract_entitlement(gw: str, token: str, self_name: str,
|
|
526
|
+
project_slug: str) -> tuple:
|
|
527
|
+
"""Runner entitlement for dev-extract private rows (card #1410 rework).
|
|
528
|
+
|
|
529
|
+
Exactly ONE ``GET /peers/{peer}/grants`` per run. Entitled only when a
|
|
530
|
+
row with ``grant_type == "board"``, ``target == project_slug``,
|
|
531
|
+
``level == "execute"`` AND ``direct is True`` is present — the runner's
|
|
532
|
+
OWN direct execute grant (exact grantee match). A ``'*'`` grantee row or
|
|
533
|
+
a group-inherited execute grant never counts, even though the live
|
|
534
|
+
gateway's ``POST /authz/check`` effective verdict reports both with
|
|
535
|
+
``via_group None`` (``'*'`` row) or ``via_group ALL`` over direct
|
|
536
|
+
(best-level tie) — reading that verdict was the F1/F2 defect.
|
|
537
|
+
Returns ``(entitled, best_level, best_via, state)`` with ``state`` one of
|
|
538
|
+
``"ok"`` / ``"unavailable"`` (bad status/body) / ``"unreachable"``
|
|
539
|
+
(transport failure); anything but ``"ok"`` fails closed, never open.
|
|
540
|
+
"""
|
|
541
|
+
try:
|
|
542
|
+
st, data = _http_get_json(_peer_grants_url(gw, self_name), token)
|
|
543
|
+
except Exception:
|
|
544
|
+
return False, None, None, "unreachable"
|
|
545
|
+
if st == 0:
|
|
546
|
+
return False, None, None, "unreachable"
|
|
547
|
+
if not (st and 200 <= st < 300) or not isinstance(data, dict):
|
|
548
|
+
return False, None, None, "unavailable"
|
|
549
|
+
grants = data.get("grants")
|
|
550
|
+
if not isinstance(grants, list):
|
|
551
|
+
return False, None, None, "unavailable"
|
|
552
|
+
rows = [g for g in grants
|
|
553
|
+
if isinstance(g, dict)
|
|
554
|
+
and g.get("grant_type") == "board"
|
|
555
|
+
and g.get("target") == project_slug]
|
|
556
|
+
entitled = any(g.get("level") == "execute" and g.get("direct") is True
|
|
557
|
+
for g in rows)
|
|
558
|
+
best = None
|
|
559
|
+
for g in rows:
|
|
560
|
+
if (best is None or _DEV_EXTRACT_GRANT_RANK.get(g.get("level"), 0)
|
|
561
|
+
> _DEV_EXTRACT_GRANT_RANK.get(best.get("level"), 0)):
|
|
562
|
+
best = g
|
|
563
|
+
if best is None:
|
|
564
|
+
return entitled, None, None, "ok"
|
|
565
|
+
via = best.get("via_group")
|
|
566
|
+
if not (isinstance(via, str) and via):
|
|
567
|
+
via = "direct" if best.get("direct") is True else "wide"
|
|
568
|
+
return entitled, best.get("level"), via, "ok"
|
|
569
|
+
|
|
570
|
+
|
|
571
|
+
def _dev_extract_privacy_line(card, project_slug, entitled: bool,
|
|
572
|
+
level, via, state: str,
|
|
573
|
+
runner: str = "?", source: str = "?",
|
|
574
|
+
gw_unreachable: bool = False) -> str:
|
|
575
|
+
"""The one plain private-rows line for a dev-extract run (card #1410).
|
|
576
|
+
|
|
577
|
+
Names the runner (name + where the identity came from) and the actual
|
|
578
|
+
reason: shown on the runner's own direct execute grant, else the
|
|
579
|
+
missing direct grant with the best matching board grant beside it (a
|
|
580
|
+
best ``level=execute`` there is group/wide, never the runner's own —
|
|
581
|
+
the line never claims otherwise), an unreachable or unavailable grant
|
|
582
|
+
check, an unresolvable project, or no card at all. Carries no repo
|
|
583
|
+
names, so it is safe on every path (print, post, --json stderr).
|
|
584
|
+
"""
|
|
585
|
+
who = f"runner {runner} via {source}"
|
|
586
|
+
if card is None:
|
|
587
|
+
if gw_unreachable:
|
|
588
|
+
return ("private rows: withheld "
|
|
589
|
+
"(gateway unreachable, so no project grant to check)")
|
|
590
|
+
return "private rows: withheld (no card, so no project grant to check)"
|
|
591
|
+
if not project_slug:
|
|
592
|
+
return ("private rows: withheld (project unresolvable, "
|
|
593
|
+
"so no project grant to check)")
|
|
594
|
+
if entitled:
|
|
595
|
+
return (f"private rows: shown for project {project_slug} "
|
|
596
|
+
f"({who}: direct execute grant; repos from card-allowlist)")
|
|
597
|
+
if state == "unreachable":
|
|
598
|
+
return (f"private rows: withheld for project {project_slug} "
|
|
599
|
+
f"({who}: gateway unreachable, so no grant to check)")
|
|
600
|
+
if state != "ok":
|
|
601
|
+
return (f"private rows: withheld for project {project_slug} "
|
|
602
|
+
f"({who}: grant check unavailable)")
|
|
603
|
+
if level is None:
|
|
604
|
+
return (f"private rows: withheld for project {project_slug} "
|
|
605
|
+
f"({who}: no direct execute grant; no board grant at all)")
|
|
606
|
+
lvl = level if isinstance(level, str) and level else "none"
|
|
607
|
+
return (f"private rows: withheld for project {project_slug} "
|
|
608
|
+
f"({who}: no direct execute grant; "
|
|
609
|
+
f"best board grant: level={lvl}, via={via})")
|
|
610
|
+
|
|
611
|
+
|
|
512
612
|
def _say_line(resp: dict, card_id, to_node: str, *, reason: Optional[str] = None) -> str:
|
|
513
613
|
"""The post confirmation — AND any obligation the post just DISCHARGED.
|
|
514
614
|
|
|
@@ -560,6 +660,57 @@ def _card_say_payload(from_node: str, to_node: str, kind: str, content: str,
|
|
|
560
660
|
}
|
|
561
661
|
|
|
562
662
|
|
|
663
|
+
def _run_cards_say(gw: str, token: str, self_name: str, card_id: int,
|
|
664
|
+
content: str, kind: str, to_node: Optional[str], aj: bool, *,
|
|
665
|
+
opt_out: bool = False, verb: str = "say") -> int:
|
|
666
|
+
"""Post `content` onto a card's thread (shared by `say` + `dev-extract`).
|
|
667
|
+
|
|
668
|
+
Factored out of the `say` block without behavior change: fetch the card,
|
|
669
|
+
refuse a threadless card by name, default the recipient
|
|
670
|
+
(--to > assignee > project owner_orchestrator), POST /messages, render the
|
|
671
|
+
confirmation (including any discharged obligation, #562). `dev-extract`
|
|
672
|
+
posts through this so both verbs keep ONE recipient/redaction path.
|
|
673
|
+
"""
|
|
674
|
+
st, card = _http_get_json(f"{gw}/board/cards/{card_id}", token)
|
|
675
|
+
if st != 200:
|
|
676
|
+
print(f"swarph board cards {verb}: cannot read card #{card_id}: "
|
|
677
|
+
f"{card.get('detail', card)}", file=sys.stderr)
|
|
678
|
+
return 1
|
|
679
|
+
thread_uuid = card.get("thread_uuid")
|
|
680
|
+
if not thread_uuid:
|
|
681
|
+
# Named refusal, not a silent no-op. Same reason the gateway 409s.
|
|
682
|
+
print(f"swarph board cards {verb}: card #{card_id} has no bound thread "
|
|
683
|
+
f"(it predates #181a). Run scripts/migrate_card_threads.py on "
|
|
684
|
+
f"the gateway host.", file=sys.stderr)
|
|
685
|
+
return 1
|
|
686
|
+
# #864: card GET has no owner field — only fetch projects when the
|
|
687
|
+
# cheaper defaults (explicit --to, card assignee) are absent.
|
|
688
|
+
owner = None
|
|
689
|
+
if not to_node and not card.get("assignee"):
|
|
690
|
+
owner = _project_owner_orchestrator(gw, token, card.get("project_id"))
|
|
691
|
+
try:
|
|
692
|
+
to_node, reason = _thread_recipient(
|
|
693
|
+
card, to_node, owner_orchestrator=owner,
|
|
694
|
+
)
|
|
695
|
+
except RuntimeError as exc:
|
|
696
|
+
print(f"swarph board cards {verb}: {exc}", file=sys.stderr)
|
|
697
|
+
return 1
|
|
698
|
+
st, d = _post_json(
|
|
699
|
+
f"{gw}/messages",
|
|
700
|
+
_card_say_payload(self_name, to_node, kind, content, thread_uuid,
|
|
701
|
+
opt_out=opt_out),
|
|
702
|
+
token,
|
|
703
|
+
)
|
|
704
|
+
# A 403 here carries the gateway's explanation that attaching PUBLISHES
|
|
705
|
+
# to everyone who can read the card, now and in future, so it needs an
|
|
706
|
+
# explicit `propose` grant. `_out` passes `detail` through whole; it does
|
|
707
|
+
# not need help, and a second copy of that logic is a second thing to
|
|
708
|
+
# keep in sync.
|
|
709
|
+
return _out(
|
|
710
|
+
st, d, lambda x: _say_line(x, card_id, to_node, reason=reason), aj,
|
|
711
|
+
)
|
|
712
|
+
|
|
713
|
+
|
|
563
714
|
_NO_TIMEOUT = "NO TIMEOUT — this never goes red on its own; pass --timeout-hours if it should"
|
|
564
715
|
|
|
565
716
|
|
|
@@ -1114,6 +1265,20 @@ def _build_parser() -> argparse.ArgumentParser:
|
|
|
1114
1265
|
"owner_orchestrator; refused if neither resolves)")
|
|
1115
1266
|
_add_common(cy)
|
|
1116
1267
|
|
|
1268
|
+
# card #1396 (#559 phase 2): the pinned dev extract. Posts through the
|
|
1269
|
+
# SAME thread machinery as `say` (shared `_run_cards_say` below), so the
|
|
1270
|
+
# recipient rules, redaction, and post-confirmation stay in one place.
|
|
1271
|
+
from swarph_cli.commands.dev_extract import build_parser as _de_build_parser
|
|
1272
|
+
_de = _de_build_parser()
|
|
1273
|
+
de = cards.add_parser(
|
|
1274
|
+
"dev-extract", help="build (+ post) a pinned codegraph+federation "
|
|
1275
|
+
"dev extract for a card (#1396)",
|
|
1276
|
+
parents=[_de], add_help=False,
|
|
1277
|
+
description=_de.description)
|
|
1278
|
+
de.add_argument("--to", dest="to_node", default=None,
|
|
1279
|
+
help="recipient peer (same defaulting as `say`)")
|
|
1280
|
+
_add_common(de)
|
|
1281
|
+
|
|
1117
1282
|
ck = cards.add_parser(
|
|
1118
1283
|
"ask", intermixed=True,
|
|
1119
1284
|
help="MINT an obligation on this card: name who owes what, as a ROW")
|
|
@@ -1680,44 +1845,113 @@ def run_board(argv: list[str]) -> int:
|
|
|
1680
1845
|
except ContentError as exc:
|
|
1681
1846
|
print(f"swarph board cards say: {exc}", file=sys.stderr)
|
|
1682
1847
|
return 1
|
|
1683
|
-
|
|
1684
|
-
|
|
1685
|
-
|
|
1686
|
-
|
|
1687
|
-
|
|
1688
|
-
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
|
|
1700
|
-
|
|
1701
|
-
|
|
1702
|
-
|
|
1703
|
-
|
|
1704
|
-
|
|
1705
|
-
|
|
1706
|
-
|
|
1707
|
-
|
|
1708
|
-
|
|
1709
|
-
|
|
1710
|
-
|
|
1711
|
-
|
|
1712
|
-
)
|
|
1713
|
-
|
|
1714
|
-
|
|
1715
|
-
|
|
1716
|
-
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
|
|
1848
|
+
return _run_cards_say(
|
|
1849
|
+
gw, token, self_name, args.id, content, args.kind,
|
|
1850
|
+
args.to_node, aj, opt_out=getattr(args, "no_redact", False))
|
|
1851
|
+
if args.command == "dev-extract":
|
|
1852
|
+
# card #1396 (#559 phase 2). Name-token source: --symbol, else
|
|
1853
|
+
# the card's own title+body; --path selects by file path.
|
|
1854
|
+
# Post target: --card (via the shared `say` path) unless
|
|
1855
|
+
# --print-only (print nothing-posted) or no --card (print only).
|
|
1856
|
+
from swarph_cli.commands import dev_extract as _de_mod
|
|
1857
|
+
card = None
|
|
1858
|
+
gw_unreachable = False
|
|
1859
|
+
if args.card is not None:
|
|
1860
|
+
try:
|
|
1861
|
+
st, card = _http_get_json(
|
|
1862
|
+
f"{gw}/board/cards/{args.card}", token)
|
|
1863
|
+
except Exception as exc:
|
|
1864
|
+
st, card = 0, {"detail": str(exc)}
|
|
1865
|
+
if st == 0:
|
|
1866
|
+
gw_unreachable = True
|
|
1867
|
+
if st != 200:
|
|
1868
|
+
if not args.symbol and not args.path:
|
|
1869
|
+
_why = ("gateway unreachable"
|
|
1870
|
+
if gw_unreachable else
|
|
1871
|
+
f"cannot read card #{args.card}: "
|
|
1872
|
+
f"{card.get('detail', card)}")
|
|
1873
|
+
print(f"swarph board cards dev-extract: {_why}",
|
|
1874
|
+
file=sys.stderr)
|
|
1875
|
+
return 1
|
|
1876
|
+
card = None
|
|
1877
|
+
explicit = list(args.symbol or [])
|
|
1878
|
+
mined = _de_mod.extract_card_tokens(card) if card else []
|
|
1879
|
+
tokens = explicit + [t for t in mined if t not in explicit]
|
|
1880
|
+
paths = list(args.path or [])
|
|
1881
|
+
no_tokens_note = None
|
|
1882
|
+
if not tokens and not paths:
|
|
1883
|
+
if card is None:
|
|
1884
|
+
print("swarph board cards dev-extract: no --symbol/--path "
|
|
1885
|
+
"and no readable --card to mine tokens from",
|
|
1886
|
+
file=sys.stderr)
|
|
1887
|
+
return 2
|
|
1888
|
+
# card #1410: a READABLE card with no minable tokens is a
|
|
1889
|
+
# normal (empty) extract, not an error — exit 0 with its own
|
|
1890
|
+
# plain line. A truly UNREADABLE card keeps the error path
|
|
1891
|
+
# above (exit 1, cannot read card).
|
|
1892
|
+
no_tokens_note = f"card #{args.card}: no symbols to look up"
|
|
1893
|
+
# card #1410: the card's board project slug resolves the same
|
|
1894
|
+
# way as every other card-artifact project read (card row
|
|
1895
|
+
# carries project_id; the slug lives on GET /board/projects,
|
|
1896
|
+
# matched by id). Unresolvable -> None -> public only.
|
|
1897
|
+
proj_slug = None
|
|
1898
|
+
if card:
|
|
1899
|
+
try:
|
|
1900
|
+
_pst, _pdata = _http_get_json(
|
|
1901
|
+
f"{gw.rstrip('/')}/board/projects", token)
|
|
1902
|
+
_rows = (_pdata if isinstance(_pdata, list)
|
|
1903
|
+
else (_pdata or {}).get("projects", []))
|
|
1904
|
+
if _pst and 200 <= _pst < 300:
|
|
1905
|
+
proj_slug = _de_mod.card_project_slug(card, _rows)
|
|
1906
|
+
except Exception:
|
|
1907
|
+
proj_slug = None
|
|
1908
|
+
# card #1410 rework: entitlement resolves ONCE per run — the
|
|
1909
|
+
# runner's OWN direct execute grant on the card's project
|
|
1910
|
+
# (GET /peers/{peer}/grants, direct row only), or public only.
|
|
1911
|
+
# Anything POSTED carries public rows only, whoever runs it.
|
|
1912
|
+
runner_name, runner_source = _resolve_self_with_source(
|
|
1913
|
+
args.self_name)
|
|
1914
|
+
entitled, _lvl, _via, _state = (False, None, None, "unavailable")
|
|
1915
|
+
if card is not None and proj_slug:
|
|
1916
|
+
entitled, _lvl, _via, _state = _dev_extract_entitlement(
|
|
1917
|
+
gw, token, runner_name, proj_slug)
|
|
1918
|
+
privacy_line = _dev_extract_privacy_line(
|
|
1919
|
+
card, proj_slug, entitled, _lvl, _via, _state,
|
|
1920
|
+
runner=runner_name, source=runner_source,
|
|
1921
|
+
gw_unreachable=gw_unreachable)
|
|
1922
|
+
posting = args.card is not None and not args.print_only
|
|
1923
|
+
post_safe = posting
|
|
1924
|
+
ex = _de_mod.build_extract(
|
|
1925
|
+
tokens=tokens, index_path=args.index,
|
|
1926
|
+
fed_report=args.fed_report, structurizr_ws=args.structurizr_ws,
|
|
1927
|
+
card=card, paths=paths, project_slug=proj_slug,
|
|
1928
|
+
entitled=(entitled and not post_safe))
|
|
1929
|
+
if getattr(args, "json", False):
|
|
1930
|
+
# card #1396: redact WITHHELD registry entries (no private
|
|
1931
|
+
# paths/index times in machine-readable output). The
|
|
1932
|
+
# no-tokens notice goes to stderr so stdout stays parseable —
|
|
1933
|
+
# and so does the privacy line. A posting-shaped run
|
|
1934
|
+
# (--card without --print-only) builds post-safe: the
|
|
1935
|
+
# withheld set is count-only even in --json.
|
|
1936
|
+
if no_tokens_note:
|
|
1937
|
+
print(no_tokens_note, file=sys.stderr)
|
|
1938
|
+
print(privacy_line, file=sys.stderr)
|
|
1939
|
+
print(json.dumps(_de_mod.redact_for_json(ex, post_safe=post_safe),
|
|
1940
|
+
indent=2, default=str))
|
|
1941
|
+
return 0
|
|
1942
|
+
body = _de_mod.render(ex, max_lines=args.max_lines,
|
|
1943
|
+
post_safe=post_safe)
|
|
1944
|
+
if args.print_only or args.card is None:
|
|
1945
|
+
if no_tokens_note:
|
|
1946
|
+
print(no_tokens_note)
|
|
1947
|
+
print(privacy_line)
|
|
1948
|
+
print(body, end="")
|
|
1949
|
+
return 0
|
|
1950
|
+
print(privacy_line)
|
|
1951
|
+
return _run_cards_say(
|
|
1952
|
+
gw, token, self_name, args.card, body, "fyi",
|
|
1953
|
+
args.to_node, aj, opt_out=getattr(args, "no_redact", False),
|
|
1954
|
+
verb="dev-extract")
|
|
1721
1955
|
if args.command == "ready":
|
|
1722
1956
|
st, d = _patch_json(f"{gw}/board/cards/{args.id}", {"actor": self_name, "move_ready": not args.clear}, token)
|
|
1723
1957
|
return _out(st, d, lambda x: f"card #{x.get('id')} move_ready -> {x.get('move_ready')}", aj)
|