swarph-cli 0.53.0__tar.gz → 0.53.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.
- {swarph_cli-0.53.0/src/swarph_cli.egg-info → swarph_cli-0.53.2}/PKG-INFO +1 -1
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/pyproject.toml +2 -1
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/__init__.py +1 -1
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/_content.py +4 -3
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/board.py +33 -4
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/mesh.py +8 -1
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/monitor.py +767 -8
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/guide/GUIDE.md +30 -14
- swarph_cli-0.53.2/src/swarph_cli/scripts/install_monitor_task_windows.ps1 +222 -0
- swarph_cli-0.53.2/src/swarph_cli/systemd/swarph-monitor-reexec.path +31 -0
- swarph_cli-0.53.2/src/swarph_cli/systemd/swarph-monitor-reexec.service +50 -0
- swarph_cli-0.53.2/src/swarph_cli/systemd/swarph-monitor@.service +70 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2/src/swarph_cli.egg-info}/PKG-INFO +1 -1
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli.egg-info/SOURCES.txt +8 -0
- swarph_cli-0.53.2/tests/test_644_monitor_supervision.py +327 -0
- swarph_cli-0.53.2/tests/test_648_install_unit.py +131 -0
- swarph_cli-0.53.2/tests/test_654_reexec.py +370 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_content_composition.py +102 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_guide_commands_parse.py +30 -0
- swarph_cli-0.53.2/tests/test_guide_selfcheck.py +78 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_packaged_artifacts_exist.py +8 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_postcompact_recall.py +11 -2
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/LICENSE +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/README.md +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/setup.cfg +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/__main__.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/bench/__init__.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/bench/backends.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/bench/pack.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/bench/prices.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/bench/quality.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/bench/refresh_prices.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/bench/runner.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/bench/validate.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/caller.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/capture/__init__.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/capture/harden.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/capture/lineage.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/capture/liveness.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/capture/manifest.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/capture/paths.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/capture/verify.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/cell.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/chain_token.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/__init__.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/_display.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/_gateway_client.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/add.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/bench.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/board_merge_check.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/brain.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/brain_ask.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/cell.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/cell_selfcheck.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/channel.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/chat.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/codegraph.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/codegraph_hook.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/codex_hook_output.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/codex_waker.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/compress.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/daemon.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/event.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/gateway.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/gh_route.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/group.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/guide.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/highlight.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/hook_output.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/hooks.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/import_session.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/init.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/install_codex_hooks.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/install_hook.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/install_multiplexer.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/install_postcompact_hook.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/install_wake_hook.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/lane.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/mcp_server.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/memory.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/memory_emit_hook.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/memory_sync.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/okf_links.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/onboard.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/peer_reply_drain.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/postcompact_hook_output.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/protocol_handler.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/ratify.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/schedule.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/security.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/service.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/spawn.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/timeline.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/version.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/wake_hook_output.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/commands/watchdog.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/compress/__init__.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/compress/levers.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/compress/marker.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/compress/verify.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/console_safe.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/delivery_queue.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/gateway/__init__.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/gateway/feature_registry.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/gateway/lanes_control.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/gateway/schema.sql +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/gateway/server.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/gateway/services_control.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/gateway_default.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/gh_identity.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/main.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/multiplexer.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/parsers/__init__.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/parsers/claude.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/payloads/postcompact/_shim.cmd +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/payloads/postcompact/postcompact-recall-grok.sh +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/payloads/postcompact/postcompact-recall.sh +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/payloads/postcompact/posttooluse-emit-antigravity.sh +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/payloads/postcompact/posttooluse-emit-claude.sh +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/payloads/postcompact/posttooluse-emit-grok.sh +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/payloads/postcompact/posttooluse-emit.sh +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/payloads/postcompact/posttooluse-recall.sh +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/payloads/postcompact/precompact-flag.sh +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/payloads/postcompact/preinvocation-recall-antigravity.sh +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/payloads/postcompact/sessionstart-recall.sh +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/peer_executor.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/peer_executor_windows.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/peer_reconciliation.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/peer_reply_outbox.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/peer_service_host.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/peer_service_payload.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/peer_service_reply.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/peer_staging.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/scripts/__init__.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/scripts/dm_notify_filter.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/scripts/ensure_monitor.sh +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/scripts/install_codex_waker_windows.ps1 +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/service/__init__.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/service/app.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/service/providers.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/session_bridge.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/skills/i-have-adhd/LICENSE +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/skills/i-have-adhd/SKILL.md +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/stall_alert.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/systemd/codex-waker.default +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/systemd/peer-reply-drain.default +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/systemd/swarph-codex-outbox@.service +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/systemd/swarph-codex-outbox@.timer +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/systemd/swarph-codex-waker@.service +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/systemd/swarph-codex-waker@.timer +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/systemd/swarph-peer-reply-drain@.service +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/systemd/swarph-peer-reply-drain@.timer +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/systemd/swarph-watchdog.default +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/systemd/swarph-watchdog.service +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/systemd/swarph-watchdog.timer +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli/tokens.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli.egg-info/dependency_links.txt +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli.egg-info/entry_points.txt +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli.egg-info/requires.txt +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/src/swarph_cli.egg-info/top_level.txt +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_124_register_merge.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_132_ensure_monitor_state_dir.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_201_win32_bash_refusal.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_243_onboard_per_peer_token.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_307_task4_ask_reply.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_312_codegraph_fuzzy_verb.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_319_refusal_exit_codes.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_323_mistral_backend.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_397_gh_identity_router.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_397_router_preflight.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_467b_onboard_operator_credential.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_523_guide.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_524_conftest_hermeticity.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_532_accept_flag.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_535_version_capability.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_546_default_gateway.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_548_gateway_remainder.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_552_codegraph_gateway.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_555_relay_row_shape.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_556_relay_freshness.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_578_no_machine_specific_host_defaults.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_579_register_bootstrap_message.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_84_cli_labels.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_add_security_gate.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_artifact_add.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_artifact_hash.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_artifact_lib.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_artifact_mcp.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_artifact_skill.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_artifact_tool.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_artifact_uri.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_bench_backends.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_bench_command.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_bench_pack.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_bench_prices.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_bench_quality.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_bench_runner.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_bench_validate.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_board_card_thread.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_board_command.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_board_merge_check.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_board_obligation_close.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_brain_ask_command.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_brain_ask_env_diagnosis.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_brain_ask_identity_explicitness.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_brain_command.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_caller_meta_guard.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_capture_lineage.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_capture_liveness.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_capture_manifest.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_capture_paths.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_capture_security.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_cell_command_dispatch.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_cell_harden.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_cell_loader.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_cell_selfcheck.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_cell_verify.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_chain_token.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_channel_command.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_channel_poll_never_breaks_dms.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_channel_post.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_channel_wake_policy_filter.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_chat_command.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_claude_parser.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_claude_tmux_template.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_codegraph_caller_scope.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_codegraph_command.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_codegraph_hook.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_codegraph_mcp.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_codex_waker.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_compress_caller_convention.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_compress_command.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_compress_levers.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_compress_marker.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_compress_verify.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_console_encoding_e2e.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_cursor_membrane.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_daemon_command.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_daemon_console_encoding.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_daemon_delivery.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_delivery_queue.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_display_sanitize.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_ensure_monitor_no_peer_default.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_event_emit.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_feature_to_uri.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_gateway_brain.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_gateway_client.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_gateway_command.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_gateway_message_idempotency.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_gh_route_doctor_mesh_name.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_group_command.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_heartbeat_check.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_highlight_command.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_hook_output.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_hooks_activity_marker.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_hooks_add.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_hooks_bundle.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_hooks_init.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_hooks_legacy_generation_removal.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_hooks_lifecycle.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_hooks_merge.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_hooks_verify.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_hooks_win32_bash_wrapper.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_hooks_win32_command_path.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_import_command.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_inbox_identity_provenance.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_init_command.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_init_provider_menu.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_install_codex_hooks.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_install_hook.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_install_multiplexer_command.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_install_postcompact_hook.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_install_wake_hook.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_lane_command.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_main.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_main_unknown_verb_guard.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_mcp_server.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_memory_command.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_memory_gateway.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_memory_sync.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_memory_sync_membrane.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_mesh_command.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_mesh_inbox_mark_read.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_mesh_inbox_sanitize.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_mesh_send_unknown_peer.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_mesh_sidecar.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_mesh_sidecar_cursor_decoupled.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_mesh_sidecar_wake_survives_read.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_meta_edge_identity.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_monitor_channel_poll.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_monitor_cli.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_monitor_daemon_collision.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_monitor_self_name_verification.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_monitor_state_split.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_multiplexer.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_muse_membrane.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_muse_own_cli.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_obligation_close_is_surfaced.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_okf_links.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_onboard_command.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_packaged_skills.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_peer_executor.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_peer_executor_windows.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_peer_reply_drain_command.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_peer_reply_drain_supervisor.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_peer_reply_outbox.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_peer_reply_transport.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_peer_service_e2e.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_peer_service_host.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_peer_service_payload.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_peer_service_reply.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_process_liveness.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_protocol_handler.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_providers_isolation.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_ratify_command.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_readme_claims_no_gateway_default.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_repl_caller_convention.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_schedule_command.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_schedule_create_contract.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_security.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_service_app.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_service_command.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_service_providers.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_session_bridge_inject.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_session_bridge_probe.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_session_bridge_resolve.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_session_path_role_gate.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_shipped_units_match_the_cli.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_smoke_chat.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_smoke_one_shot.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_smoke_phase_5_5.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_spawn_base_hoist.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_spawn_command.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_spawn_identity_stamp.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_spawn_live_pin.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_spawn_mitosis_lineage.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_spawn_tmux_session.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_spawn_windows_relaunch.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_stall_alert.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_subprocess_decode_encoding.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_timeline_command.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_tmux_wake_runstate_defer.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_tmux_wake_session_reanchor.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_tmux_wake_stale.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_tmux_wake_submit_verify.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_token_file_one_parser.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_token_precedence_explicit_first.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_unified_token_resolver.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_version_command.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_version_consistency.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_vibe_membrane.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_watchdog.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_watchdog_dm_wake.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_watchdog_dm_wake_cooldown.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_watchdog_dm_wake_wiring.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_watchdog_emit_health.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_watchdog_install_flags.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_watchdog_model_rung.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/tests/test_watchdog_stale_peers.py +0 -0
- {swarph_cli-0.53.0 → swarph_cli-0.53.2}/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.53.
|
|
3
|
+
Version: 0.53.2
|
|
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.53.
|
|
7
|
+
version = "0.53.2"
|
|
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" }
|
|
@@ -122,6 +122,7 @@ where = ["src"]
|
|
|
122
122
|
# importlib.resources, so an undeclared GUIDE.md passes every test in the
|
|
123
123
|
# tree and fails on every installed wheel -- the 0.39.3 bug above, again.
|
|
124
124
|
swarph_cli = ["systemd/*.service", "systemd/*.timer", "systemd/*.default",
|
|
125
|
+
"systemd/*.path",
|
|
125
126
|
"scripts/*.sh", "scripts/*.ps1", "guide/*.md",
|
|
126
127
|
"payloads/postcompact/*.sh", "payloads/postcompact/*.cmd",
|
|
127
128
|
"skills/*/SKILL.md", "skills/*/LICENSE"]
|
|
@@ -53,7 +53,8 @@ class ContentError(ValueError):
|
|
|
53
53
|
# instead of trying to detect what it already did.
|
|
54
54
|
|
|
55
55
|
|
|
56
|
-
def add_content_args(parser, flag: str = "--content", *, required: bool = True
|
|
56
|
+
def add_content_args(parser, flag: str = "--content", *, required: bool = True,
|
|
57
|
+
noun: str = "message body", noun_plural: str = "bodies") -> None:
|
|
57
58
|
"""Add ``FLAG`` and ``FLAG-file`` as a mutually exclusive pair."""
|
|
58
59
|
dest = flag.lstrip("-").replace("-", "_")
|
|
59
60
|
group = parser.add_mutually_exclusive_group(required=required)
|
|
@@ -61,7 +62,7 @@ def add_content_args(parser, flag: str = "--content", *, required: bool = True)
|
|
|
61
62
|
flag,
|
|
62
63
|
dest=dest,
|
|
63
64
|
default=None,
|
|
64
|
-
help=f"
|
|
65
|
+
help=f"{noun}; '-' reads stdin. For {noun_plural} containing backticks, "
|
|
65
66
|
f"quotes or $(...), prefer {flag}-file — a shell can alter them "
|
|
66
67
|
f"before the CLI ever sees them (board #458).",
|
|
67
68
|
)
|
|
@@ -70,7 +71,7 @@ def add_content_args(parser, flag: str = "--content", *, required: bool = True)
|
|
|
70
71
|
dest=f"{dest}_file",
|
|
71
72
|
default=None,
|
|
72
73
|
metavar="PATH",
|
|
73
|
-
help="read the
|
|
74
|
+
help=f"read the {noun} verbatim from PATH (no shell involved)",
|
|
74
75
|
)
|
|
75
76
|
|
|
76
77
|
|
|
@@ -393,7 +393,12 @@ def _build_parser() -> argparse.ArgumentParser:
|
|
|
393
393
|
cs = cards.add_parser("show", help="show one card"); cs.add_argument("id", type=int)
|
|
394
394
|
cs.add_argument("--json", action="store_true"); _add_common(cs)
|
|
395
395
|
ca = cards.add_parser("add", help="create a card")
|
|
396
|
-
ca.add_argument("--project", required=True, help="project id or slug")
|
|
396
|
+
ca.add_argument("--project", required=True, help="project id or slug")
|
|
397
|
+
# #650: a TITLE is the field most likely to carry a command name or code
|
|
398
|
+
# identifier — the exact strings with backticks — so #458's file escape
|
|
399
|
+
# hatch applies here too, not only on --body.
|
|
400
|
+
add_content_args(ca, "--title", required=True,
|
|
401
|
+
noun="card title", noun_plural="titles")
|
|
397
402
|
add_content_args(ca, "--body", required=False); ca.add_argument("--ai2", action="store_true")
|
|
398
403
|
ca.add_argument("--priority", type=int, default=0)
|
|
399
404
|
ca.add_argument("--label", action="append", dest="labels", metavar="LABEL",
|
|
@@ -446,7 +451,8 @@ def _build_parser() -> argparse.ArgumentParser:
|
|
|
446
451
|
"edit", help="edit a card's title and/or body (#191: a correction "
|
|
447
452
|
"belongs ON the card, not only in its thread)")
|
|
448
453
|
ce.add_argument("id", type=int)
|
|
449
|
-
ce
|
|
454
|
+
add_content_args(ce, "--title", required=False,
|
|
455
|
+
noun="card title", noun_plural="titles")
|
|
450
456
|
add_content_args(ce, "--body", required=False)
|
|
451
457
|
ce.add_argument("--json", action="store_true"); _add_common(ce)
|
|
452
458
|
|
|
@@ -576,17 +582,30 @@ def run_board(argv: list[str]) -> int:
|
|
|
576
582
|
st, d = _http_get_json(f"{gw}/board/cards/{args.id}", token)
|
|
577
583
|
return _out(st, d, _format_card, aj)
|
|
578
584
|
if args.command == "add":
|
|
585
|
+
if args.title == "-" and args.body == "-":
|
|
586
|
+
# Two stdin readers, one stdin: the second read gets "", and ""
|
|
587
|
+
# is a REAL value (it clears) — refuse rather than post a
|
|
588
|
+
# titleless card that reports success (#256's class).
|
|
589
|
+
print("swarph board cards add: only one field can read stdin — "
|
|
590
|
+
"pass the other as --title-file/--body-file", file=sys.stderr)
|
|
591
|
+
return 1
|
|
579
592
|
try:
|
|
580
593
|
body = resolve_content(args.body, getattr(args, "body_file", None), "--body")
|
|
594
|
+
title = resolve_content(args.title, getattr(args, "title_file", None), "--title")
|
|
581
595
|
except ContentError as exc:
|
|
582
596
|
print(f"swarph board cards add: {exc}", file=sys.stderr)
|
|
583
597
|
return 1
|
|
598
|
+
if title is not None:
|
|
599
|
+
# A title is a one-line field; a body is not. Strip the single
|
|
600
|
+
# trailing newline an editor or `echo` appends to a title file —
|
|
601
|
+
# byte-identical is --body's contract, not --title's.
|
|
602
|
+
title = title.removesuffix("\n")
|
|
584
603
|
pid, err = _resolve_project(gw, token, args.project)
|
|
585
604
|
if err or pid is None:
|
|
586
605
|
print(f"swarph board: {err or 'project required'}", file=sys.stderr)
|
|
587
606
|
return 1
|
|
588
607
|
st, d = _post_json(f"{gw}/board/cards", _card_add_payload(
|
|
589
|
-
self_name, pid,
|
|
608
|
+
self_name, pid, title, body=body, ai2=args.ai2,
|
|
590
609
|
priority=args.priority, labels=getattr(args, "labels", None)), token)
|
|
591
610
|
return _out(st, d, lambda x: f"created card #{x.get('id')} [{x.get('stage')}] (stage defaults to proposed — use `cards move` to advance)", aj)
|
|
592
611
|
if args.command == "label":
|
|
@@ -612,13 +631,23 @@ def run_board(argv: list[str]) -> int:
|
|
|
612
631
|
st, d = _patch_json(f"{gw}/board/cards/{args.id}", {"actor": self_name, "assignee": args.assignee}, token)
|
|
613
632
|
return _out(st, d, lambda x: f"card #{x.get('id')} assignee -> {x.get('assignee')}", aj)
|
|
614
633
|
if args.command == "edit":
|
|
634
|
+
if args.title == "-" and args.body == "-":
|
|
635
|
+
# As in `add`: two stdin readers, one stdin — and on edit the
|
|
636
|
+
# drained second read is "", which CLEARS the stored title
|
|
637
|
+
# while the CLI prints success.
|
|
638
|
+
print("swarph board cards edit: only one field can read stdin — "
|
|
639
|
+
"pass the other as --title-file/--body-file", file=sys.stderr)
|
|
640
|
+
return 1
|
|
615
641
|
try:
|
|
616
642
|
body_text = resolve_content(args.body, getattr(args, "body_file", None), "--body")
|
|
643
|
+
title_text = resolve_content(args.title, getattr(args, "title_file", None), "--title")
|
|
617
644
|
except ContentError as exc:
|
|
618
645
|
print(f"swarph board cards edit: {exc}", file=sys.stderr)
|
|
619
646
|
return 1
|
|
647
|
+
if title_text is not None:
|
|
648
|
+
title_text = title_text.removesuffix("\n") # one-line field; see add
|
|
620
649
|
try:
|
|
621
|
-
patch = _card_edit_payload(self_name,
|
|
650
|
+
patch = _card_edit_payload(self_name, title_text, body_text)
|
|
622
651
|
except ValueError as exc:
|
|
623
652
|
print(f"swarph board cards edit: {exc}", file=sys.stderr)
|
|
624
653
|
return 2
|
|
@@ -2481,7 +2481,8 @@ def pidfile_status(path: Path) -> tuple[str, Optional[dict]]:
|
|
|
2481
2481
|
return "foreign", rec
|
|
2482
2482
|
|
|
2483
2483
|
|
|
2484
|
-
def write_pidfile(path: Path, *, self_name: str, sinks: list, poll_s: int
|
|
2484
|
+
def write_pidfile(path: Path, *, self_name: str, sinks: list, poll_s: int,
|
|
2485
|
+
supervisor: "str | None" = None) -> None:
|
|
2485
2486
|
path.parent.mkdir(parents=True, exist_ok=True)
|
|
2486
2487
|
rec = {
|
|
2487
2488
|
"pid": os.getpid(),
|
|
@@ -2499,6 +2500,12 @@ def write_pidfile(path: Path, *, self_name: str, sinks: list, poll_s: int) -> No
|
|
|
2499
2500
|
# that can and has stopped -- and the two must never share a cause.
|
|
2500
2501
|
"emits_heartbeat": True,
|
|
2501
2502
|
}
|
|
2503
|
+
if supervisor:
|
|
2504
|
+
# WHO SUPERVISES THIS PROCESS (#644). Windows has no pid->task reverse
|
|
2505
|
+
# map, so ownership is a CONVENTION: the supervisor names itself here
|
|
2506
|
+
# and `monitor status` reads it back. Absent => hand-started or
|
|
2507
|
+
# predates the feature — an ORPHAN, which is a fact, not an error.
|
|
2508
|
+
rec["supervisor"] = supervisor
|
|
2502
2509
|
tmp = path.with_suffix(path.suffix + f".tmp.{os.getpid()}")
|
|
2503
2510
|
tmp.write_text(json.dumps(rec, indent=2, sort_keys=True), encoding="utf-8")
|
|
2504
2511
|
os.replace(tmp, path)
|